")
+}
diff --git a/modules/markup/markdown/meta_test.go b/modules/markup/markdown/meta_test.go
index 6949966328..d341ae43e4 100644
--- a/modules/markup/markdown/meta_test.go
+++ b/modules/markup/markdown/meta_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
/*
@@ -31,7 +32,7 @@ func TestExtractMetadata(t *testing.T) {
t.Run("ValidFrontAndBody", func(t *testing.T) {
var meta IssueTemplate
body, err := ExtractMetadata(fmt.Sprintf("%s\n%s\n%s\n%s", sepTest, frontTest, sepTest, bodyTest), &meta)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, bodyTest, body)
assert.Equal(t, metaTest, meta)
assert.True(t, meta.Valid())
@@ -40,19 +41,19 @@ func TestExtractMetadata(t *testing.T) {
t.Run("NoFirstSeparator", func(t *testing.T) {
var meta IssueTemplate
_, err := ExtractMetadata(fmt.Sprintf("%s\n%s\n%s", frontTest, sepTest, bodyTest), &meta)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("NoLastSeparator", func(t *testing.T) {
var meta IssueTemplate
_, err := ExtractMetadata(fmt.Sprintf("%s\n%s\n%s", sepTest, frontTest, bodyTest), &meta)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("NoBody", func(t *testing.T) {
var meta IssueTemplate
body, err := ExtractMetadata(fmt.Sprintf("%s\n%s\n%s", sepTest, frontTest, sepTest), &meta)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "", body)
assert.Equal(t, metaTest, meta)
assert.True(t, meta.Valid())
@@ -63,7 +64,7 @@ func TestExtractMetadataBytes(t *testing.T) {
t.Run("ValidFrontAndBody", func(t *testing.T) {
var meta IssueTemplate
body, err := ExtractMetadataBytes([]byte(fmt.Sprintf("%s\n%s\n%s\n%s", sepTest, frontTest, sepTest, bodyTest)), &meta)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, bodyTest, string(body))
assert.Equal(t, metaTest, meta)
assert.True(t, meta.Valid())
@@ -72,19 +73,19 @@ func TestExtractMetadataBytes(t *testing.T) {
t.Run("NoFirstSeparator", func(t *testing.T) {
var meta IssueTemplate
_, err := ExtractMetadataBytes([]byte(fmt.Sprintf("%s\n%s\n%s", frontTest, sepTest, bodyTest)), &meta)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("NoLastSeparator", func(t *testing.T) {
var meta IssueTemplate
_, err := ExtractMetadataBytes([]byte(fmt.Sprintf("%s\n%s\n%s", sepTest, frontTest, bodyTest)), &meta)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("NoBody", func(t *testing.T) {
var meta IssueTemplate
body, err := ExtractMetadataBytes([]byte(fmt.Sprintf("%s\n%s\n%s", sepTest, frontTest, sepTest)), &meta)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "", string(body))
assert.Equal(t, metaTest, meta)
assert.True(t, meta.Valid())
diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go
index 5ced819984..f41d86a8a8 100644
--- a/modules/markup/orgmode/orgmode_test.go
+++ b/modules/markup/orgmode/orgmode_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/util"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -32,7 +33,7 @@ func TestRender_StandardLinks(t *testing.T) {
Base: setting.AppSubURL,
},
}, input)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
}
@@ -60,7 +61,7 @@ func TestRender_BaseLinks(t *testing.T) {
BranchPath: "branch/main",
},
}, input)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
}
@@ -73,7 +74,7 @@ func TestRender_BaseLinks(t *testing.T) {
TreePath: "deep/nested/folder",
},
}, input)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
}
@@ -99,7 +100,7 @@ func TestRender_Media(t *testing.T) {
Base: setting.AppSubURL,
},
}, input)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
}
@@ -140,7 +141,7 @@ func TestRender_Source(t *testing.T) {
buffer, err := RenderString(&markup.RenderContext{
Ctx: git.DefaultContext,
}, input)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
}
diff --git a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go
index c0b449ea5b..d07bba3004 100644
--- a/modules/markup/sanitizer.go
+++ b/modules/markup/sanitizer.go
@@ -179,6 +179,7 @@ func createDefaultPolicy() *bluemonday.Policy {
// repository descriptions.
func createRepoDescriptionPolicy() *bluemonday.Policy {
policy := bluemonday.NewPolicy()
+ policy.AllowStandardURLs()
// Allow italics and bold.
policy.AllowElements("i", "b", "em", "strong")
diff --git a/modules/markup/sanitizer_test.go b/modules/markup/sanitizer_test.go
index b7b8792bd7..163620c2ec 100644
--- a/modules/markup/sanitizer_test.go
+++ b/modules/markup/sanitizer_test.go
@@ -82,12 +82,15 @@ func TestDescriptionSanitizer(t *testing.T) {
`THUMBS UP`, `THUMBS UP`,
`Hello World`, `Hello World`,
` `, ``,
- `https://example.com`, `https://example.com`,
+ `https://example.com`, `https://example.com`,
`Important!`, `Important!`,
`Click me! Nothing to see here.`, `Click me! Nothing to see here.`,
``, ``,
`I have a strongopinion about this.`, `I have a strongopinion about this.`,
`Provides alternative wg(8) tool`, `Provides alternative wg(8) tool`,
+ `Click me.`, `Click me.`,
+ `Click me.`, `Click me.`,
+ `Click me.`, `Click me.`,
}
for i := 0; i < len(testCases); i += 2 {
diff --git a/modules/migration/file_format_test.go b/modules/migration/file_format_test.go
index da997f645b..9638d82462 100644
--- a/modules/migration/file_format_test.go
+++ b/modules/migration/file_format_test.go
@@ -9,14 +9,15 @@ import (
"github.com/santhosh-tekuri/jsonschema/v5"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMigrationJSON_IssueOK(t *testing.T) {
issues := make([]*Issue, 0, 10)
err := Load("file_format_testdata/issue_a.json", &issues, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = Load("file_format_testdata/issue_a.yml", &issues, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
func TestMigrationJSON_IssueFail(t *testing.T) {
@@ -34,5 +35,5 @@ func TestMigrationJSON_IssueFail(t *testing.T) {
func TestMigrationJSON_MilestoneOK(t *testing.T) {
milestones := make([]*Milestone, 0, 10)
err := Load("file_format_testdata/milestones.json", &milestones, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
diff --git a/modules/optional/serialization_test.go b/modules/optional/serialization_test.go
index 09a4bddea0..c852b8a70f 100644
--- a/modules/optional/serialization_test.go
+++ b/modules/optional/serialization_test.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/optional"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
"gopkg.in/yaml.v3"
)
@@ -50,11 +51,11 @@ func TestOptionalToJson(t *testing.T) {
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
b, err := json.Marshal(tc.obj)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, tc.want, string(b), "gitea json module returned unexpected")
b, err = std_json.Marshal(tc.obj)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, tc.want, string(b), "std json module returned unexpected")
})
}
@@ -88,12 +89,12 @@ func TestOptionalFromJson(t *testing.T) {
t.Run(tc.name, func(t *testing.T) {
var obj1 testSerializationStruct
err := json.Unmarshal([]byte(tc.data), &obj1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, tc.want, obj1, "gitea json module returned unexpected")
var obj2 testSerializationStruct
err = std_json.Unmarshal([]byte(tc.data), &obj2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, tc.want, obj2, "std json module returned unexpected")
})
}
@@ -134,7 +135,7 @@ optional_two_string: null
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
b, err := yaml.Marshal(tc.obj)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, tc.want, string(b), "yaml module returned unexpected")
})
}
@@ -183,7 +184,7 @@ optional_twostring: null
t.Run(tc.name, func(t *testing.T) {
var obj testSerializationStruct
err := yaml.Unmarshal([]byte(tc.data), &obj)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, tc.want, obj, "yaml module returned unexpected")
})
}
diff --git a/modules/packages/alpine/metadata_test.go b/modules/packages/alpine/metadata_test.go
index 2a3c48ffb9..8167b4902a 100644
--- a/modules/packages/alpine/metadata_test.go
+++ b/modules/packages/alpine/metadata_test.go
@@ -11,6 +11,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -77,7 +78,7 @@ func TestParsePackage(t *testing.T) {
pp, err := ParsePackage(data)
assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrMissingPKGINFOFile)
+ require.ErrorIs(t, err, ErrMissingPKGINFOFile)
})
t.Run("InvalidPKGINFOFile", func(t *testing.T) {
@@ -85,14 +86,14 @@ func TestParsePackage(t *testing.T) {
pp, err := ParsePackage(data)
assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
})
t.Run("Valid", func(t *testing.T) {
data := createPackage(".PKGINFO", createPKGINFOContent(packageName, packageVersion))
p, err := ParsePackage(data)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, p)
assert.Equal(t, "Q1SRYURM5+uQDqfHSwTnNIOIuuDVQ=", p.FileMetadata.Checksum)
@@ -105,7 +106,7 @@ func TestParsePackageInfo(t *testing.T) {
p, err := ParsePackageInfo(bytes.NewReader(data))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
})
t.Run("InvalidVersion", func(t *testing.T) {
@@ -113,14 +114,14 @@ func TestParsePackageInfo(t *testing.T) {
p, err := ParsePackageInfo(bytes.NewReader(data))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
})
t.Run("Valid", func(t *testing.T) {
data := createPKGINFOContent(packageName, packageVersion)
p, err := ParsePackageInfo(bytes.NewReader(data))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, p)
assert.Equal(t, packageName, p.Name)
diff --git a/modules/packages/cargo/parser_test.go b/modules/packages/cargo/parser_test.go
index 2230a5b499..4b357cb869 100644
--- a/modules/packages/cargo/parser_test.go
+++ b/modules/packages/cargo/parser_test.go
@@ -11,6 +11,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -51,7 +52,7 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(data)
assert.Nil(t, cp)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
}
})
@@ -61,7 +62,7 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(data)
assert.Nil(t, cp)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
}
})
@@ -70,7 +71,7 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(data)
assert.NotNil(t, cp)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "test", cp.Name)
assert.Equal(t, "1.0.0", cp.Version)
diff --git a/modules/packages/chef/metadata_test.go b/modules/packages/chef/metadata_test.go
index 6def4162a9..8784c629e6 100644
--- a/modules/packages/chef/metadata_test.go
+++ b/modules/packages/chef/metadata_test.go
@@ -11,6 +11,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -31,7 +32,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(&buf)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrMissingMetadataFile)
+ require.ErrorIs(t, err, ErrMissingMetadataFile)
})
t.Run("Valid", func(t *testing.T) {
@@ -53,7 +54,7 @@ func TestParsePackage(t *testing.T) {
zw.Close()
p, err := ParsePackage(&buf)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, p)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
@@ -66,7 +67,7 @@ func TestParseChefMetadata(t *testing.T) {
for _, name := range []string{" test", "test "} {
p, err := ParseChefMetadata(strings.NewReader(`{"name":"` + name + `","version":"1.0.0"}`))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
}
})
@@ -74,14 +75,14 @@ func TestParseChefMetadata(t *testing.T) {
for _, version := range []string{"1", "1.2.3.4", "1.0.0 "} {
p, err := ParseChefMetadata(strings.NewReader(`{"name":"test","version":"` + version + `"}`))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
}
})
t.Run("Valid", func(t *testing.T) {
p, err := ParseChefMetadata(strings.NewReader(`{"name":"` + packageName + `","version":"` + packageVersion + `","description":"` + packageDescription + `","maintainer":"` + packageAuthor + `","source_url":"` + packageRepositoryURL + `"}`))
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
diff --git a/modules/packages/composer/metadata_test.go b/modules/packages/composer/metadata_test.go
index a5e317daf1..2bdb23965b 100644
--- a/modules/packages/composer/metadata_test.go
+++ b/modules/packages/composer/metadata_test.go
@@ -12,6 +12,7 @@ import (
"code.gitea.io/gitea/modules/json"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -49,20 +50,20 @@ const composerContent = `{
func TestLicenseUnmarshal(t *testing.T) {
var l Licenses
- assert.NoError(t, json.NewDecoder(strings.NewReader(`["MIT"]`)).Decode(&l))
+ require.NoError(t, json.NewDecoder(strings.NewReader(`["MIT"]`)).Decode(&l))
assert.Len(t, l, 1)
assert.Equal(t, "MIT", l[0])
- assert.NoError(t, json.NewDecoder(strings.NewReader(`"MIT"`)).Decode(&l))
+ require.NoError(t, json.NewDecoder(strings.NewReader(`"MIT"`)).Decode(&l))
assert.Len(t, l, 1)
assert.Equal(t, "MIT", l[0])
}
func TestCommentsUnmarshal(t *testing.T) {
var c Comments
- assert.NoError(t, json.NewDecoder(strings.NewReader(`["comment"]`)).Decode(&c))
+ require.NoError(t, json.NewDecoder(strings.NewReader(`["comment"]`)).Decode(&c))
assert.Len(t, c, 1)
assert.Equal(t, "comment", c[0])
- assert.NoError(t, json.NewDecoder(strings.NewReader(`"comment"`)).Decode(&c))
+ require.NoError(t, json.NewDecoder(strings.NewReader(`"comment"`)).Decode(&c))
assert.Len(t, c, 1)
assert.Equal(t, "comment", c[0])
}
@@ -84,7 +85,7 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp)
- assert.ErrorIs(t, err, ErrMissingComposerFile)
+ require.ErrorIs(t, err, ErrMissingComposerFile)
})
t.Run("MissingComposerFileInRoot", func(t *testing.T) {
@@ -92,7 +93,7 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp)
- assert.ErrorIs(t, err, ErrMissingComposerFile)
+ require.ErrorIs(t, err, ErrMissingComposerFile)
})
t.Run("InvalidComposerFile", func(t *testing.T) {
@@ -100,7 +101,7 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("InvalidPackageName", func(t *testing.T) {
@@ -108,7 +109,7 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
})
t.Run("InvalidPackageVersion", func(t *testing.T) {
@@ -116,14 +117,14 @@ func TestParsePackage(t *testing.T) {
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
})
t.Run("InvalidReadmePath", func(t *testing.T) {
data := createArchive(map[string]string{"composer.json": `{"name": "gitea/composer-package", "readme": "sub/README.md"}`})
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, cp)
assert.Empty(t, cp.Metadata.Readme)
@@ -133,7 +134,7 @@ func TestParsePackage(t *testing.T) {
data := createArchive(map[string]string{"composer.json": composerContent, "README.md": readme})
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, cp)
assert.Equal(t, name, cp.Name)
diff --git a/modules/packages/conan/conanfile_parser_test.go b/modules/packages/conan/conanfile_parser_test.go
index 5801570184..fe867fbe76 100644
--- a/modules/packages/conan/conanfile_parser_test.go
+++ b/modules/packages/conan/conanfile_parser_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -40,7 +41,7 @@ class ConanPackageConan(ConanFile):
func TestParseConanfile(t *testing.T) {
metadata, err := ParseConanfile(strings.NewReader(contentConanfile))
- assert.Nil(t, err)
+ require.NoError(t, err)
assert.Equal(t, license, metadata.License)
assert.Equal(t, author, metadata.Author)
assert.Equal(t, homepage, metadata.ProjectURL)
diff --git a/modules/packages/conan/conaninfo_parser_test.go b/modules/packages/conan/conaninfo_parser_test.go
index 556a4b939e..dfb1836474 100644
--- a/modules/packages/conan/conaninfo_parser_test.go
+++ b/modules/packages/conan/conaninfo_parser_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -50,7 +51,7 @@ const (
func TestParseConaninfo(t *testing.T) {
info, err := ParseConaninfo(strings.NewReader(contentConaninfo))
assert.NotNil(t, info)
- assert.Nil(t, err)
+ require.NoError(t, err)
assert.Equal(
t,
map[string]string{
diff --git a/modules/packages/conan/reference_test.go b/modules/packages/conan/reference_test.go
index 6ea86eb0dd..7d39bd8238 100644
--- a/modules/packages/conan/reference_test.go
+++ b/modules/packages/conan/reference_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestNewRecipeReference(t *testing.T) {
@@ -40,53 +41,53 @@ func TestNewRecipeReference(t *testing.T) {
for i, c := range cases {
rref, err := NewRecipeReference(c.Name, c.Version, c.User, c.Channel, c.Revision)
if c.IsValid {
- assert.NoError(t, err, "case %d, should be invalid", i)
+ require.NoError(t, err, "case %d, should be invalid", i)
assert.NotNil(t, rref, "case %d, should not be nil", i)
} else {
- assert.Error(t, err, "case %d, should be valid", i)
+ require.Error(t, err, "case %d, should be valid", i)
}
}
}
func TestRecipeReferenceRevisionOrDefault(t *testing.T) {
rref, err := NewRecipeReference("name", "1.0", "", "", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, DefaultRevision, rref.RevisionOrDefault())
rref, err = NewRecipeReference("name", "1.0", "", "", DefaultRevision)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, DefaultRevision, rref.RevisionOrDefault())
rref, err = NewRecipeReference("name", "1.0", "", "", "Az09")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "Az09", rref.RevisionOrDefault())
}
func TestRecipeReferenceString(t *testing.T) {
rref, err := NewRecipeReference("name", "1.0", "", "", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "name/1.0", rref.String())
rref, err = NewRecipeReference("name", "1.0", "user", "channel", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "name/1.0@user/channel", rref.String())
rref, err = NewRecipeReference("name", "1.0", "user", "channel", "Az09")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "name/1.0@user/channel#Az09", rref.String())
}
func TestRecipeReferenceLinkName(t *testing.T) {
rref, err := NewRecipeReference("name", "1.0", "", "", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "name/1.0/_/_/0", rref.LinkName())
rref, err = NewRecipeReference("name", "1.0", "user", "channel", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "name/1.0/user/channel/0", rref.LinkName())
rref, err = NewRecipeReference("name", "1.0", "user", "channel", "Az09")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "name/1.0/user/channel/Az09", rref.LinkName())
}
@@ -110,10 +111,10 @@ func TestNewPackageReference(t *testing.T) {
for i, c := range cases {
pref, err := NewPackageReference(c.Recipe, c.Reference, c.Revision)
if c.IsValid {
- assert.NoError(t, err, "case %d, should be invalid", i)
+ require.NoError(t, err, "case %d, should be invalid", i)
assert.NotNil(t, pref, "case %d, should not be nil", i)
} else {
- assert.Error(t, err, "case %d, should be valid", i)
+ require.Error(t, err, "case %d, should be valid", i)
}
}
}
@@ -122,15 +123,15 @@ func TestPackageReferenceRevisionOrDefault(t *testing.T) {
rref, _ := NewRecipeReference("name", "1.0", "", "", "")
pref, err := NewPackageReference(rref, "ref", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, DefaultRevision, pref.RevisionOrDefault())
pref, err = NewPackageReference(rref, "ref", DefaultRevision)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, DefaultRevision, pref.RevisionOrDefault())
pref, err = NewPackageReference(rref, "ref", "Az09")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "Az09", pref.RevisionOrDefault())
}
@@ -138,10 +139,10 @@ func TestPackageReferenceLinkName(t *testing.T) {
rref, _ := NewRecipeReference("name", "1.0", "", "", "")
pref, err := NewPackageReference(rref, "ref", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "ref/0", pref.LinkName())
pref, err = NewPackageReference(rref, "ref", "Az09")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "ref/Az09", pref.LinkName())
}
diff --git a/modules/packages/conda/metadata_test.go b/modules/packages/conda/metadata_test.go
index 2bb114f030..1bc4695b56 100644
--- a/modules/packages/conda/metadata_test.go
+++ b/modules/packages/conda/metadata_test.go
@@ -13,6 +13,7 @@ import (
"github.com/dsnet/compress/bzip2"
"github.com/klauspost/compress/zstd"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -46,7 +47,7 @@ func TestParsePackage(t *testing.T) {
p, err := parsePackageTar(buf)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidStructure)
+ require.ErrorIs(t, err, ErrInvalidStructure)
})
t.Run("MissingAboutFile", func(t *testing.T) {
@@ -54,7 +55,7 @@ func TestParsePackage(t *testing.T) {
p, err := parsePackageTar(buf)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "name", p.Name)
assert.Equal(t, "1.0", p.Version)
@@ -67,7 +68,7 @@ func TestParsePackage(t *testing.T) {
p, err := parsePackageTar(buf)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
}
})
@@ -77,7 +78,7 @@ func TestParsePackage(t *testing.T) {
p, err := parsePackageTar(buf)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
}
})
@@ -89,7 +90,7 @@ func TestParsePackage(t *testing.T) {
p, err := parsePackageTar(buf)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
@@ -114,7 +115,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackageBZ2(br)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
@@ -141,7 +142,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackageConda(br, int64(br.Len()))
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
diff --git a/modules/packages/container/metadata_test.go b/modules/packages/container/metadata_test.go
index 665499b2e6..930cf48f68 100644
--- a/modules/packages/container/metadata_test.go
+++ b/modules/packages/container/metadata_test.go
@@ -11,6 +11,7 @@ import (
oci "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestParseImageConfig(t *testing.T) {
@@ -24,7 +25,7 @@ func TestParseImageConfig(t *testing.T) {
configOCI := `{"config": {"labels": {"` + labelAuthors + `": "` + author + `", "` + labelLicenses + `": "` + license + `", "` + labelURL + `": "` + projectURL + `", "` + labelSource + `": "` + repositoryURL + `", "` + labelDocumentation + `": "` + documentationURL + `", "` + labelDescription + `": "` + description + `"}}, "history": [{"created_by": "do it 1"}, {"created_by": "dummy #(nop) do it 2"}]}`
metadata, err := ParseImageConfig(oci.MediaTypeImageManifest, strings.NewReader(configOCI))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, TypeOCI, metadata.Type)
assert.Equal(t, description, metadata.Description)
@@ -51,7 +52,7 @@ func TestParseImageConfig(t *testing.T) {
configHelm := `{"description":"` + description + `", "home": "` + projectURL + `", "sources": ["` + repositoryURL + `"], "maintainers":[{"name":"` + author + `"}]}`
metadata, err = ParseImageConfig(helm.ConfigMediaType, strings.NewReader(configHelm))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, TypeHelm, metadata.Type)
assert.Equal(t, description, metadata.Description)
diff --git a/modules/packages/cran/metadata_test.go b/modules/packages/cran/metadata_test.go
index ff68c34c51..3287380cf0 100644
--- a/modules/packages/cran/metadata_test.go
+++ b/modules/packages/cran/metadata_test.go
@@ -12,6 +12,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -62,7 +63,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(buf, buf.Size())
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrMissingDescriptionFile)
+ require.ErrorIs(t, err, ErrMissingDescriptionFile)
})
t.Run("Valid", func(t *testing.T) {
@@ -74,7 +75,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(buf, buf.Size())
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
@@ -99,7 +100,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(buf, buf.Size())
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrMissingDescriptionFile)
+ require.ErrorIs(t, err, ErrMissingDescriptionFile)
})
t.Run("Valid", func(t *testing.T) {
@@ -110,7 +111,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(buf, buf.Size())
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
@@ -123,7 +124,7 @@ func TestParseDescription(t *testing.T) {
for _, name := range []string{"123abc", "ab-cd", "ab cd", "ab/cd"} {
p, err := ParseDescription(createDescription(name, packageVersion))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
}
})
@@ -131,13 +132,13 @@ func TestParseDescription(t *testing.T) {
for _, version := range []string{"1", "1 0", "1.2.3.4.5", "1-2-3-4-5", "1.", "1.0.", "1-", "1-0-"} {
p, err := ParseDescription(createDescription(packageName, version))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
}
})
t.Run("Valid", func(t *testing.T) {
p, err := ParseDescription(createDescription(packageName, packageVersion))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, p)
assert.Equal(t, packageName, p.Name)
diff --git a/modules/packages/debian/metadata_test.go b/modules/packages/debian/metadata_test.go
index 26c2a6fc68..94a9805639 100644
--- a/modules/packages/debian/metadata_test.go
+++ b/modules/packages/debian/metadata_test.go
@@ -13,6 +13,7 @@ import (
"github.com/blakesmith/ar"
"github.com/klauspost/compress/zstd"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
"github.com/ulikunitz/xz"
)
@@ -47,7 +48,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrMissingControlFile)
+ require.ErrorIs(t, err, ErrMissingControlFile)
})
t.Run("Compression", func(t *testing.T) {
@@ -56,7 +57,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrUnsupportedCompression)
+ require.ErrorIs(t, err, ErrUnsupportedCompression)
})
var buf bytes.Buffer
@@ -112,7 +113,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "gitea", p.Name)
t.Run("TrailingSlash", func(t *testing.T) {
@@ -120,7 +121,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "gitea", p.Name)
})
})
@@ -147,7 +148,7 @@ func TestParseControlFile(t *testing.T) {
for _, name := range []string{"", "-cd"} {
p, err := ParseControlFile(buildContent(name, packageVersion, packageArchitecture))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
}
})
@@ -155,14 +156,14 @@ func TestParseControlFile(t *testing.T) {
for _, version := range []string{"", "1-", ":1.0", "1_0"} {
p, err := ParseControlFile(buildContent(packageName, version, packageArchitecture))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
}
})
t.Run("InvalidArchitecture", func(t *testing.T) {
p, err := ParseControlFile(buildContent(packageName, packageVersion, ""))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidArchitecture)
+ require.ErrorIs(t, err, ErrInvalidArchitecture)
})
t.Run("Valid", func(t *testing.T) {
@@ -170,7 +171,7 @@ func TestParseControlFile(t *testing.T) {
full := content.String()
p, err := ParseControlFile(content)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, p)
assert.Equal(t, packageName, p.Name)
diff --git a/modules/packages/goproxy/metadata_test.go b/modules/packages/goproxy/metadata_test.go
index 4e7f394f8b..3a47f10269 100644
--- a/modules/packages/goproxy/metadata_test.go
+++ b/modules/packages/goproxy/metadata_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -33,7 +34,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data, int64(data.Len()))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidStructure)
+ require.ErrorIs(t, err, ErrInvalidStructure)
})
t.Run("InvalidNameOrVersionStructure", func(t *testing.T) {
@@ -43,7 +44,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data, int64(data.Len()))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidStructure)
+ require.ErrorIs(t, err, ErrInvalidStructure)
})
t.Run("GoModFileInWrongDirectory", func(t *testing.T) {
@@ -53,7 +54,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data, int64(data.Len()))
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
assert.Equal(t, "module gitea.com/go-gitea/gitea", p.GoMod)
@@ -67,7 +68,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data, int64(data.Len()))
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageName, p.Name)
assert.Equal(t, packageVersion, p.Version)
assert.Equal(t, "valid", p.GoMod)
diff --git a/modules/packages/hashed_buffer_test.go b/modules/packages/hashed_buffer_test.go
index 564e782f18..ed5267cd6f 100644
--- a/modules/packages/hashed_buffer_test.go
+++ b/modules/packages/hashed_buffer_test.go
@@ -10,6 +10,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestHashedBuffer(t *testing.T) {
@@ -27,12 +28,12 @@ func TestHashedBuffer(t *testing.T) {
for _, c := range cases {
buf, err := CreateHashedBufferFromReaderWithSize(strings.NewReader(c.Data), c.MaxMemorySize)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, len(c.Data), buf.Size())
data, err := io.ReadAll(buf)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, c.Data, string(data))
hashMD5, hashSHA1, hashSHA256, hashSHA512 := buf.Sums()
@@ -41,6 +42,6 @@ func TestHashedBuffer(t *testing.T) {
assert.Equal(t, c.HashSHA256, hex.EncodeToString(hashSHA256))
assert.Equal(t, c.HashSHA512, hex.EncodeToString(hashSHA512))
- assert.NoError(t, buf.Close())
+ require.NoError(t, buf.Close())
}
}
diff --git a/modules/packages/maven/metadata_test.go b/modules/packages/maven/metadata_test.go
index e675467730..d0093013f9 100644
--- a/modules/packages/maven/metadata_test.go
+++ b/modules/packages/maven/metadata_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
"golang.org/x/text/encoding/charmap"
)
@@ -50,12 +51,12 @@ func TestParsePackageMetaData(t *testing.T) {
t.Run("InvalidFile", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader(""))
assert.Nil(t, m)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("Valid", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader(pomContent))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, m)
assert.Equal(t, groupID, m.GroupID)
@@ -80,10 +81,10 @@ func TestParsePackageMetaData(t *testing.T) {
``,
),
)
- assert.NoError(t, err)
+ require.NoError(t, err)
m, err := ParsePackageMetaData(strings.NewReader(pomContent8859_1))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, m)
})
}
diff --git a/modules/packages/multi_hasher_test.go b/modules/packages/multi_hasher_test.go
index a37debbc95..ca333cb0a4 100644
--- a/modules/packages/multi_hasher_test.go
+++ b/modules/packages/multi_hasher_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -35,11 +36,11 @@ func TestMultiHasherSums(t *testing.T) {
h.Write([]byte("git"))
state, err := h.MarshalBinary()
- assert.NoError(t, err)
+ require.NoError(t, err)
h2 := NewMultiHasher()
err = h2.UnmarshalBinary(state)
- assert.NoError(t, err)
+ require.NoError(t, err)
h2.Write([]byte("ea"))
diff --git a/modules/packages/npm/creator_test.go b/modules/packages/npm/creator_test.go
index 806377a52b..b2cf1aae0e 100644
--- a/modules/packages/npm/creator_test.go
+++ b/modules/packages/npm/creator_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/json"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestParsePackage(t *testing.T) {
@@ -34,14 +35,14 @@ func TestParsePackage(t *testing.T) {
t.Run("InvalidUpload", func(t *testing.T) {
p, err := ParsePackage(bytes.NewReader([]byte{0}))
assert.Nil(t, p)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("InvalidUploadNoData", func(t *testing.T) {
b, _ := json.Marshal(packageUpload{})
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidPackage)
+ require.ErrorIs(t, err, ErrInvalidPackage)
})
t.Run("InvalidPackageName", func(t *testing.T) {
@@ -60,7 +61,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidPackageName)
+ require.ErrorIs(t, err, ErrInvalidPackageName)
}
test(t, " test ")
@@ -99,7 +100,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidPackageVersion)
+ require.ErrorIs(t, err, ErrInvalidPackageVersion)
}
test(t, "test")
@@ -131,7 +132,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidPackageVersion)
+ require.ErrorIs(t, err, ErrInvalidPackageVersion)
})
t.Run("InvalidAttachment", func(t *testing.T) {
@@ -153,7 +154,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidAttachment)
+ require.ErrorIs(t, err, ErrInvalidAttachment)
})
t.Run("InvalidData", func(t *testing.T) {
@@ -178,7 +179,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidAttachment)
+ require.ErrorIs(t, err, ErrInvalidAttachment)
})
t.Run("InvalidIntegrity", func(t *testing.T) {
@@ -206,7 +207,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidIntegrity)
+ require.ErrorIs(t, err, ErrInvalidIntegrity)
})
t.Run("InvalidIntegrity2", func(t *testing.T) {
@@ -234,7 +235,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidIntegrity)
+ require.ErrorIs(t, err, ErrInvalidIntegrity)
})
t.Run("Valid", func(t *testing.T) {
@@ -277,7 +278,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(bytes.NewReader(b))
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, packageFullName, p.Name)
assert.Equal(t, packageVersion, p.Version)
diff --git a/modules/packages/nuget/metadata_test.go b/modules/packages/nuget/metadata_test.go
index f466492f8a..ecce052be4 100644
--- a/modules/packages/nuget/metadata_test.go
+++ b/modules/packages/nuget/metadata_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -77,7 +78,7 @@ func TestParsePackageMetaData(t *testing.T) {
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, np)
- assert.ErrorIs(t, err, ErrMissingNuspecFile)
+ require.ErrorIs(t, err, ErrMissingNuspecFile)
})
t.Run("MissingNuspecFileInRoot", func(t *testing.T) {
@@ -85,7 +86,7 @@ func TestParsePackageMetaData(t *testing.T) {
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, np)
- assert.ErrorIs(t, err, ErrMissingNuspecFile)
+ require.ErrorIs(t, err, ErrMissingNuspecFile)
})
t.Run("InvalidNuspecFile", func(t *testing.T) {
@@ -93,7 +94,7 @@ func TestParsePackageMetaData(t *testing.T) {
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, np)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("InvalidPackageId", func(t *testing.T) {
@@ -104,7 +105,7 @@ func TestParsePackageMetaData(t *testing.T) {
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, np)
- assert.ErrorIs(t, err, ErrNuspecInvalidID)
+ require.ErrorIs(t, err, ErrNuspecInvalidID)
})
t.Run("InvalidPackageVersion", func(t *testing.T) {
@@ -117,14 +118,14 @@ func TestParsePackageMetaData(t *testing.T) {
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, np)
- assert.ErrorIs(t, err, ErrNuspecInvalidVersion)
+ require.ErrorIs(t, err, ErrNuspecInvalidVersion)
})
t.Run("MissingReadme", func(t *testing.T) {
data := createArchive(map[string]string{"package.nuspec": nuspecContent})
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, np)
assert.Empty(t, np.Metadata.Readme)
})
@@ -136,7 +137,7 @@ func TestParsePackageMetaData(t *testing.T) {
})
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, np)
assert.Equal(t, DependencyPackage, np.PackageType)
@@ -165,7 +166,7 @@ func TestParsePackageMetaData(t *testing.T) {
`})
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, np)
assert.Equal(t, "1.4.5.2-rc.1", np.Version)
})
@@ -175,7 +176,7 @@ func TestParsePackageMetaData(t *testing.T) {
data := createArchive(map[string]string{"package.nuspec": symbolsNuspecContent})
np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, np)
assert.Equal(t, SymbolsPackage, np.PackageType)
diff --git a/modules/packages/nuget/symbol_extractor_test.go b/modules/packages/nuget/symbol_extractor_test.go
index fa1b80ee82..b767ed0387 100644
--- a/modules/packages/nuget/symbol_extractor_test.go
+++ b/modules/packages/nuget/symbol_extractor_test.go
@@ -10,6 +10,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const pdbContent = `QlNKQgEAAQAAAAAADAAAAFBEQiB2MS4wAAAAAAAABgB8AAAAWAAAACNQZGIAAAAA1AAAAAgBAAAj
@@ -31,7 +32,7 @@ func TestExtractPortablePdb(t *testing.T) {
zip.NewWriter(&buf).Close()
pdbs, err := ExtractPortablePdb(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
- assert.ErrorIs(t, err, ErrMissingPdbFiles)
+ require.ErrorIs(t, err, ErrMissingPdbFiles)
assert.Empty(t, pdbs)
})
@@ -39,7 +40,7 @@ func TestExtractPortablePdb(t *testing.T) {
data := createArchive("sub/test.bin", []byte{})
pdbs, err := ExtractPortablePdb(bytes.NewReader(data), int64(len(data)))
- assert.ErrorIs(t, err, ErrInvalidFiles)
+ require.ErrorIs(t, err, ErrInvalidFiles)
assert.Empty(t, pdbs)
})
@@ -48,7 +49,7 @@ func TestExtractPortablePdb(t *testing.T) {
data := createArchive("test.pdb", b)
pdbs, err := ExtractPortablePdb(bytes.NewReader(data), int64(len(data)))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, pdbs, 1)
assert.Equal(t, "test.pdb", pdbs[0].Name)
assert.Equal(t, "d910bb6948bd4c6cb40155bcf52c3c94", pdbs[0].ID)
@@ -59,7 +60,7 @@ func TestExtractPortablePdb(t *testing.T) {
func TestParseDebugHeaderID(t *testing.T) {
t.Run("InvalidPdbMagicNumber", func(t *testing.T) {
id, err := ParseDebugHeaderID(bytes.NewReader([]byte{0, 0, 0, 0}))
- assert.ErrorIs(t, err, ErrInvalidPdbMagicNumber)
+ require.ErrorIs(t, err, ErrInvalidPdbMagicNumber)
assert.Empty(t, id)
})
@@ -67,7 +68,7 @@ func TestParseDebugHeaderID(t *testing.T) {
b, _ := base64.StdEncoding.DecodeString(`QlNKQgEAAQAAAAAADAAAAFBEQiB2MS4wAAAAAAAAAQB8AAAAWAAAACNVUwA=`)
id, err := ParseDebugHeaderID(bytes.NewReader(b))
- assert.ErrorIs(t, err, ErrMissingPdbStream)
+ require.ErrorIs(t, err, ErrMissingPdbStream)
assert.Empty(t, id)
})
@@ -75,7 +76,7 @@ func TestParseDebugHeaderID(t *testing.T) {
b, _ := base64.StdEncoding.DecodeString(pdbContent)
id, err := ParseDebugHeaderID(bytes.NewReader(b))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "d910bb6948bd4c6cb40155bcf52c3c94", id)
})
}
diff --git a/modules/packages/pub/metadata_test.go b/modules/packages/pub/metadata_test.go
index 8f9126e0c9..5ed083b952 100644
--- a/modules/packages/pub/metadata_test.go
+++ b/modules/packages/pub/metadata_test.go
@@ -12,6 +12,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -65,7 +66,7 @@ func TestParsePackage(t *testing.T) {
pp, err := ParsePackage(data)
assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrMissingPubspecFile)
+ require.ErrorIs(t, err, ErrMissingPubspecFile)
})
t.Run("PubspecFileTooLarge", func(t *testing.T) {
@@ -73,7 +74,7 @@ func TestParsePackage(t *testing.T) {
pp, err := ParsePackage(data)
assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrPubspecFileTooLarge)
+ require.ErrorIs(t, err, ErrPubspecFileTooLarge)
})
t.Run("InvalidPubspecFile", func(t *testing.T) {
@@ -81,14 +82,14 @@ func TestParsePackage(t *testing.T) {
pp, err := ParsePackage(data)
assert.Nil(t, pp)
- assert.Error(t, err)
+ require.Error(t, err)
})
t.Run("Valid", func(t *testing.T) {
data := createArchive(map[string][]byte{"pubspec.yaml": []byte(pubspecContent)})
pp, err := ParsePackage(data)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, pp)
assert.Empty(t, pp.Metadata.Readme)
})
@@ -97,7 +98,7 @@ func TestParsePackage(t *testing.T) {
data := createArchive(map[string][]byte{"pubspec.yaml": []byte(pubspecContent), "README.md": []byte("readme")})
pp, err := ParsePackage(data)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, pp)
assert.Equal(t, "readme", pp.Metadata.Readme)
})
@@ -108,7 +109,7 @@ func TestParsePubspecMetadata(t *testing.T) {
for _, name := range []string{"123abc", "ab-cd"} {
pp, err := ParsePubspecMetadata(strings.NewReader(`name: ` + name))
assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrInvalidName)
+ require.ErrorIs(t, err, ErrInvalidName)
}
})
@@ -116,12 +117,12 @@ func TestParsePubspecMetadata(t *testing.T) {
pp, err := ParsePubspecMetadata(strings.NewReader(`name: dummy
version: invalid`))
assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrInvalidVersion)
+ require.ErrorIs(t, err, ErrInvalidVersion)
})
t.Run("Valid", func(t *testing.T) {
pp, err := ParsePubspecMetadata(strings.NewReader(pubspecContent))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, pp)
assert.Equal(t, packageName, pp.Name)
diff --git a/modules/packages/rpm/metadata_test.go b/modules/packages/rpm/metadata_test.go
index bb538ef9d0..dc9b480723 100644
--- a/modules/packages/rpm/metadata_test.go
+++ b/modules/packages/rpm/metadata_test.go
@@ -10,6 +10,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestParsePackage(t *testing.T) {
@@ -42,14 +43,14 @@ Mu0UFYgZ/bYnuvn/vz4wtCz8qMwsHUvP0PX3tbYFUctAPdrY6tiiDtcCddDECahx7SuVNP5dpmb5
7tpp/pEjDS7cGPZ6BY430+7danDq6f42Nw49b9F7zp6BiKpJb9s5P0AYN2+L159cnrur636rx+v1
7ae1K28QbMMcqI8CqwIrgwg9nTOp8Oj9q81plUY7ZuwXN8Vvs8wbAAA=`
rpmPackageContent, err := base64.StdEncoding.DecodeString(base64RpmPackageContent)
- assert.NoError(t, err)
+ require.NoError(t, err)
zr, err := gzip.NewReader(bytes.NewReader(rpmPackageContent))
- assert.NoError(t, err)
+ require.NoError(t, err)
p, err := ParsePackage(zr)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "gitea-test", p.Name)
assert.Equal(t, "1.0.2-1", p.Version)
diff --git a/modules/packages/rubygems/marshal_test.go b/modules/packages/rubygems/marshal_test.go
index 6d2354cd87..8aa9160e20 100644
--- a/modules/packages/rubygems/marshal_test.go
+++ b/modules/packages/rubygems/marshal_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMinimalEncoder(t *testing.T) {
@@ -92,7 +93,7 @@ func TestMinimalEncoder(t *testing.T) {
for i, c := range cases {
var b bytes.Buffer
err := NewMarshalEncoder(&b).Encode(c.Value)
- assert.ErrorIs(t, err, c.Error)
+ require.ErrorIs(t, err, c.Error)
assert.Equal(t, c.Expected, b.Bytes(), "case %d", i)
}
}
diff --git a/modules/packages/rubygems/metadata_test.go b/modules/packages/rubygems/metadata_test.go
index ec2fa08b6b..cd3a5bbd10 100644
--- a/modules/packages/rubygems/metadata_test.go
+++ b/modules/packages/rubygems/metadata_test.go
@@ -11,6 +11,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestParsePackageMetaData(t *testing.T) {
@@ -32,7 +33,7 @@ func TestParsePackageMetaData(t *testing.T) {
data := createArchive("dummy.txt", []byte{0})
rp, err := ParsePackageMetaData(data)
- assert.ErrorIs(t, err, ErrMissingMetadataFile)
+ require.ErrorIs(t, err, ErrMissingMetadataFile)
assert.Nil(t, rp)
})
@@ -41,7 +42,7 @@ func TestParsePackageMetaData(t *testing.T) {
data := createArchive("metadata.gz", content)
rp, err := ParsePackageMetaData(data)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, rp)
})
}
@@ -58,7 +59,7 @@ dVoR6hj07u0HZgAl3SRS8G/fmXcRK20jyq6rDMSYQFgidamqkXbbuspLXE/0k7GphtKqe67GuRC/
yjAbmt9LsOMp8xMamFkSQ38fP5EFjdz8LA4do2C69VvqWXAJgrPbKZb58/xZXrKoW6ttW13Bhvzi
4ftn7/yUxd4YGcglvTmmY8aGY3ZwRn4CqcWcidUGAAA=`)
rp, err := parseMetadataFile(bytes.NewReader(content))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, rp)
assert.Equal(t, "gitea", rp.Name)
diff --git a/modules/packages/swift/metadata_test.go b/modules/packages/swift/metadata_test.go
index 3913c2355b..b223d8c15f 100644
--- a/modules/packages/swift/metadata_test.go
+++ b/modules/packages/swift/metadata_test.go
@@ -11,6 +11,7 @@ import (
"github.com/hashicorp/go-version"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -39,7 +40,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data, data.Size(), nil)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrMissingManifestFile)
+ require.ErrorIs(t, err, ErrMissingManifestFile)
})
t.Run("ManifestFileTooLarge", func(t *testing.T) {
@@ -49,7 +50,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data, data.Size(), nil)
assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrManifestFileTooLarge)
+ require.ErrorIs(t, err, ErrManifestFileTooLarge)
})
t.Run("WithoutMetadata", func(t *testing.T) {
@@ -63,7 +64,7 @@ func TestParsePackage(t *testing.T) {
p, err := ParsePackage(data, data.Size(), nil)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, p.Metadata)
assert.Empty(t, p.RepositoryURLs)
@@ -87,7 +88,7 @@ func TestParsePackage(t *testing.T) {
strings.NewReader(`{"name":"`+packageName+`","version":"`+packageVersion+`","description":"`+packageDescription+`","keywords":["swift","package"],"license":"`+packageLicense+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`),
)
assert.NotNil(t, p)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, p.Metadata)
assert.Len(t, p.Metadata.Manifests, 1)
diff --git a/modules/packages/vagrant/metadata_test.go b/modules/packages/vagrant/metadata_test.go
index d616ffe3d3..f467781a08 100644
--- a/modules/packages/vagrant/metadata_test.go
+++ b/modules/packages/vagrant/metadata_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/json"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -46,7 +47,7 @@ func TestParseMetadataFromBox(t *testing.T) {
metadata, err := ParseMetadataFromBox(data)
assert.NotNil(t, metadata)
- assert.NoError(t, err)
+ require.NoError(t, err)
})
t.Run("Valid", func(t *testing.T) {
@@ -56,13 +57,13 @@ func TestParseMetadataFromBox(t *testing.T) {
"website": projectURL,
"repository": repositoryURL,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
data := createArchive(map[string][]byte{"info.json": content})
metadata, err := ParseMetadataFromBox(data)
assert.NotNil(t, metadata)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, author, metadata.Author)
assert.Equal(t, description, metadata.Description)
@@ -77,11 +78,11 @@ func TestParseInfoFile(t *testing.T) {
"package": "",
"dummy": "",
})
- assert.NoError(t, err)
+ require.NoError(t, err)
metadata, err := ParseInfoFile(bytes.NewReader(content))
assert.NotNil(t, metadata)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, metadata.Author)
assert.Empty(t, metadata.Description)
@@ -96,11 +97,11 @@ func TestParseInfoFile(t *testing.T) {
"website": projectURL,
"repository": repositoryURL,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
metadata, err := ParseInfoFile(bytes.NewReader(content))
assert.NotNil(t, metadata)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, author, metadata.Author)
assert.Equal(t, description, metadata.Description)
diff --git a/modules/private/hook.go b/modules/private/hook.go
index 1d0ef4e3a9..93cbcd469d 100644
--- a/modules/private/hook.go
+++ b/modules/private/hook.go
@@ -7,10 +7,10 @@ import (
"context"
"fmt"
"net/url"
- "strconv"
"time"
"code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/git/pushoptions"
"code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
)
@@ -20,28 +20,8 @@ const (
GitAlternativeObjectDirectories = "GIT_ALTERNATE_OBJECT_DIRECTORIES"
GitObjectDirectory = "GIT_OBJECT_DIRECTORY"
GitQuarantinePath = "GIT_QUARANTINE_PATH"
- GitPushOptionCount = "GIT_PUSH_OPTION_COUNT"
)
-// GitPushOptions is a wrapper around a map[string]string
-type GitPushOptions map[string]string
-
-// GitPushOptions keys
-const (
- GitPushOptionRepoPrivate = "repo.private"
- GitPushOptionRepoTemplate = "repo.template"
-)
-
-// Bool checks for a key in the map and parses as a boolean
-func (g GitPushOptions) Bool(key string, def bool) bool {
- if val, ok := g[key]; ok {
- if b, err := strconv.ParseBool(val); err == nil {
- return b
- }
- }
- return def
-}
-
// HookOptions represents the options for the Hook calls
type HookOptions struct {
OldCommitIDs []string
@@ -52,7 +32,7 @@ type HookOptions struct {
GitObjectDirectory string
GitAlternativeObjectDirectories string
GitQuarantinePath string
- GitPushOptions GitPushOptions
+ GitPushOptions map[string]string
PullRequestID int64
PushTrigger repository.PushTrigger
DeployKeyID int64 // if the pusher is a DeployKey, then UserID is the repo's org user.
@@ -60,6 +40,10 @@ type HookOptions struct {
ActionPerm int
}
+func (o *HookOptions) GetGitPushOptions() pushoptions.Interface {
+ return pushoptions.NewFromMap(&o.GitPushOptions)
+}
+
// SSHLogOption ssh log options
type SSHLogOption struct {
IsError bool
diff --git a/modules/private/serv.go b/modules/private/serv.go
index 480a446954..6c7c753cf0 100644
--- a/modules/private/serv.go
+++ b/modules/private/serv.go
@@ -40,6 +40,7 @@ type ServCommandResults struct {
UserName string
UserEmail string
UserID int64
+ UserMode perm.AccessMode
OwnerName string
RepoName string
RepoID int64
diff --git a/modules/queue/base_levelqueue_test.go b/modules/queue/base_levelqueue_test.go
index b881802ca2..b65b570c4b 100644
--- a/modules/queue/base_levelqueue_test.go
+++ b/modules/queue/base_levelqueue_test.go
@@ -11,15 +11,16 @@ import (
"gitea.com/lunny/levelqueue"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
"github.com/syndtr/goleveldb/leveldb"
)
func TestBaseLevelDB(t *testing.T) {
_, err := newBaseLevelQueueGeneric(&BaseConfig{ConnStr: "redis://"}, false)
- assert.ErrorContains(t, err, "invalid leveldb connection string")
+ require.ErrorContains(t, err, "invalid leveldb connection string")
_, err = newBaseLevelQueueGeneric(&BaseConfig{DataFullDir: "relative"}, false)
- assert.ErrorContains(t, err, "invalid leveldb data dir")
+ require.ErrorContains(t, err, "invalid leveldb data dir")
testQueueBasic(t, newBaseLevelQueueSimple, toBaseConfig("baseLevelQueue", setting.QueueSettings{Datadir: t.TempDir() + "/queue-test", Length: 10}), false)
testQueueBasic(t, newBaseLevelQueueUnique, toBaseConfig("baseLevelQueueUnique", setting.QueueSettings{ConnStr: "leveldb://" + t.TempDir() + "/queue-test", Length: 10}), true)
@@ -29,22 +30,21 @@ func TestCorruptedLevelQueue(t *testing.T) {
// sometimes the levelqueue could be in a corrupted state, this test is to make sure it can recover from it
dbDir := t.TempDir() + "/levelqueue-test"
db, err := leveldb.OpenFile(dbDir, nil)
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
+
defer db.Close()
- assert.NoError(t, db.Put([]byte("other-key"), []byte("other-value"), nil))
+ require.NoError(t, db.Put([]byte("other-key"), []byte("other-value"), nil))
nameQueuePrefix := []byte("queue_name")
nameSetPrefix := []byte("set_name")
lq, err := levelqueue.NewUniqueQueue(db, nameQueuePrefix, nameSetPrefix, false)
- assert.NoError(t, err)
- assert.NoError(t, lq.RPush([]byte("item-1")))
+ require.NoError(t, err)
+ require.NoError(t, lq.RPush([]byte("item-1")))
itemKey := lqinternal.QueueItemKeyBytes(nameQueuePrefix, 1)
itemValue, err := db.Get(itemKey, nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("item-1"), itemValue)
// there should be 5 keys in db: queue low, queue high, 1 queue item, 1 set item, and "other-key"
@@ -52,11 +52,11 @@ func TestCorruptedLevelQueue(t *testing.T) {
assert.Len(t, keys, 5)
// delete the queue item key, to corrupt the queue
- assert.NoError(t, db.Delete(itemKey, nil))
+ require.NoError(t, db.Delete(itemKey, nil))
// now the queue is corrupted, it never works again
_, err = lq.LPop()
- assert.ErrorIs(t, err, levelqueue.ErrNotFound)
- assert.NoError(t, lq.Close())
+ require.ErrorIs(t, err, levelqueue.ErrNotFound)
+ require.NoError(t, lq.Close())
// remove all the queue related keys to reset the queue
lqinternal.RemoveLevelQueueKeys(db, nameQueuePrefix)
@@ -68,11 +68,11 @@ func TestCorruptedLevelQueue(t *testing.T) {
// re-create a queue from db
lq, err = levelqueue.NewUniqueQueue(db, nameQueuePrefix, nameSetPrefix, false)
- assert.NoError(t, err)
- assert.NoError(t, lq.RPush([]byte("item-new-1")))
+ require.NoError(t, err)
+ require.NoError(t, lq.RPush([]byte("item-new-1")))
// now the queue works again
itemValue, err = lq.LPop()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("item-new-1"), itemValue)
- assert.NoError(t, lq.Close())
+ require.NoError(t, lq.Close())
}
diff --git a/modules/queue/base_test.go b/modules/queue/base_test.go
index c5bf526ae6..a5600fea63 100644
--- a/modules/queue/base_test.go
+++ b/modules/queue/base_test.go
@@ -10,89 +10,90 @@ import (
"time"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func testQueueBasic(t *testing.T, newFn func(cfg *BaseConfig) (baseQueue, error), cfg *BaseConfig, isUnique bool) {
t.Run(fmt.Sprintf("testQueueBasic-%s-unique:%v", cfg.ManagedName, isUnique), func(t *testing.T) {
q, err := newFn(cfg)
- assert.NoError(t, err)
+ require.NoError(t, err)
ctx := context.Background()
_ = q.RemoveAll(ctx)
cnt, err := q.Len(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, 0, cnt)
// push the first item
err = q.PushItem(ctx, []byte("foo"))
- assert.NoError(t, err)
+ require.NoError(t, err)
cnt, err = q.Len(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, 1, cnt)
// push a duplicate item
err = q.PushItem(ctx, []byte("foo"))
if !isUnique {
- assert.NoError(t, err)
+ require.NoError(t, err)
} else {
- assert.ErrorIs(t, err, ErrAlreadyInQueue)
+ require.ErrorIs(t, err, ErrAlreadyInQueue)
}
// check the duplicate item
cnt, err = q.Len(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
has, err := q.HasItem(ctx, []byte("foo"))
- assert.NoError(t, err)
+ require.NoError(t, err)
if !isUnique {
assert.EqualValues(t, 2, cnt)
- assert.EqualValues(t, false, has) // non-unique queues don't check for duplicates
+ assert.False(t, has) // non-unique queues don't check for duplicates
} else {
assert.EqualValues(t, 1, cnt)
- assert.EqualValues(t, true, has)
+ assert.True(t, has)
}
// push another item
err = q.PushItem(ctx, []byte("bar"))
- assert.NoError(t, err)
+ require.NoError(t, err)
// pop the first item (and the duplicate if non-unique)
it, err := q.PopItem(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, "foo", string(it))
if !isUnique {
it, err = q.PopItem(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, "foo", string(it))
}
// pop another item
it, err = q.PopItem(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, "bar", string(it))
// pop an empty queue (timeout, cancel)
ctxTimed, cancel := context.WithTimeout(ctx, 10*time.Millisecond)
it, err = q.PopItem(ctxTimed)
- assert.ErrorIs(t, err, context.DeadlineExceeded)
+ require.ErrorIs(t, err, context.DeadlineExceeded)
assert.Nil(t, it)
cancel()
ctxTimed, cancel = context.WithTimeout(ctx, 10*time.Millisecond)
cancel()
it, err = q.PopItem(ctxTimed)
- assert.ErrorIs(t, err, context.Canceled)
+ require.ErrorIs(t, err, context.Canceled)
assert.Nil(t, it)
// test blocking push if queue is full
for i := 0; i < cfg.Length; i++ {
err = q.PushItem(ctx, []byte(fmt.Sprintf("item-%d", i)))
- assert.NoError(t, err)
+ require.NoError(t, err)
}
ctxTimed, cancel = context.WithTimeout(ctx, 10*time.Millisecond)
err = q.PushItem(ctxTimed, []byte("item-full"))
- assert.ErrorIs(t, err, context.DeadlineExceeded)
+ require.ErrorIs(t, err, context.DeadlineExceeded)
cancel()
// test blocking push if queue is full (with custom pushBlockTime)
@@ -100,41 +101,41 @@ func testQueueBasic(t *testing.T, newFn func(cfg *BaseConfig) (baseQueue, error)
timeStart := time.Now()
pushBlockTime = 30 * time.Millisecond
err = q.PushItem(ctx, []byte("item-full"))
- assert.ErrorIs(t, err, context.DeadlineExceeded)
- assert.True(t, time.Since(timeStart) >= pushBlockTime*2/3)
+ require.ErrorIs(t, err, context.DeadlineExceeded)
+ assert.GreaterOrEqual(t, time.Since(timeStart), pushBlockTime*2/3)
pushBlockTime = oldPushBlockTime
// remove all
cnt, err = q.Len(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, cfg.Length, cnt)
_ = q.RemoveAll(ctx)
cnt, err = q.Len(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, 0, cnt)
})
}
func TestBaseDummy(t *testing.T) {
q, err := newBaseDummy(&BaseConfig{}, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
ctx := context.Background()
- assert.NoError(t, q.PushItem(ctx, []byte("foo")))
+ require.NoError(t, q.PushItem(ctx, []byte("foo")))
cnt, err := q.Len(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, 0, cnt)
has, err := q.HasItem(ctx, []byte("foo"))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, has)
it, err := q.PopItem(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Nil(t, it)
- assert.NoError(t, q.RemoveAll(ctx))
+ require.NoError(t, q.RemoveAll(ctx))
}
diff --git a/modules/queue/manager_test.go b/modules/queue/manager_test.go
index 15dd1b4f2f..a76c238752 100644
--- a/modules/queue/manager_test.go
+++ b/modules/queue/manager_test.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestManager(t *testing.T) {
@@ -38,11 +39,11 @@ func TestManager(t *testing.T) {
DATADIR = temp-dir
CONN_STR = redis://
`)
- assert.ErrorContains(t, err, "invalid leveldb connection string")
+ require.ErrorContains(t, err, "invalid leveldb connection string")
// test default config
q, err := newQueueFromConfig("default", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "default", q.GetName())
assert.Equal(t, "level", q.GetType())
assert.Equal(t, filepath.Join(setting.AppDataPath, "queues/common"), q.baseConfig.DataFullDir)
@@ -78,7 +79,7 @@ SET_NAME = _u2
MAX_WORKERS = 123
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
q1 := createWorkerPoolQueue[string](context.Background(), "no-such", cfgProvider, nil, false)
assert.Equal(t, "no-such", q1.GetName())
@@ -118,7 +119,7 @@ MAX_WORKERS = 123
assert.Equal(t, 120, q1.workerMaxNum)
stop := runWorkerPoolQueue(q2)
- assert.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(context.Background(), 0))
- assert.NoError(t, GetManager().FlushAll(context.Background(), 0))
+ require.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(context.Background(), 0))
+ require.NoError(t, GetManager().FlushAll(context.Background(), 0))
stop()
}
diff --git a/modules/queue/workerqueue_test.go b/modules/queue/workerqueue_test.go
index 9898ceb873..112a16c8e3 100644
--- a/modules/queue/workerqueue_test.go
+++ b/modules/queue/workerqueue_test.go
@@ -57,9 +57,9 @@ func TestWorkerPoolQueueUnhandled(t *testing.T) {
stop := runWorkerPoolQueue(q)
for i := 0; i < queueSetting.Length; i++ {
testRecorder.Record("push:%v", i)
- assert.NoError(t, q.Push(i))
+ require.NoError(t, q.Push(i))
}
- assert.NoError(t, q.FlushWithContext(context.Background(), 0))
+ require.NoError(t, q.FlushWithContext(context.Background(), 0))
stop()
ok := true
@@ -167,7 +167,7 @@ func testWorkerPoolQueuePersistence(t *testing.T, queueSetting setting.QueueSett
q, _ := newWorkerPoolQueueForTest("pr_patch_checker_test", queueSetting, testHandler, true)
stop := runWorkerPoolQueue(q)
- assert.NoError(t, q.FlushWithContext(context.Background(), 0))
+ require.NoError(t, q.FlushWithContext(context.Background(), 0))
stop()
}
@@ -189,7 +189,7 @@ func TestWorkerPoolQueueActiveWorkers(t *testing.T) {
q, _ := newWorkerPoolQueueForTest("test-workpoolqueue", setting.QueueSettings{Type: "channel", BatchLength: 1, MaxWorkers: 1, Length: 100}, handler, false)
stop := runWorkerPoolQueue(q)
for i := 0; i < 5; i++ {
- assert.NoError(t, q.Push(i))
+ require.NoError(t, q.Push(i))
}
time.Sleep(50 * time.Millisecond)
@@ -205,7 +205,7 @@ func TestWorkerPoolQueueActiveWorkers(t *testing.T) {
q, _ = newWorkerPoolQueueForTest("test-workpoolqueue", setting.QueueSettings{Type: "channel", BatchLength: 1, MaxWorkers: 3, Length: 100}, handler, false)
stop = runWorkerPoolQueue(q)
for i := 0; i < 15; i++ {
- assert.NoError(t, q.Push(i))
+ require.NoError(t, q.Push(i))
}
time.Sleep(50 * time.Millisecond)
@@ -238,7 +238,7 @@ func TestWorkerPoolQueueShutdown(t *testing.T) {
q, _ := newWorkerPoolQueueForTest("test-workpoolqueue", qs, handler, false)
stop := runWorkerPoolQueue(q)
for i := 0; i < qs.Length; i++ {
- assert.NoError(t, q.Push(i))
+ require.NoError(t, q.Push(i))
}
<-handlerCalled
time.Sleep(200 * time.Millisecond) // wait for a while to make sure all workers are active
@@ -266,7 +266,7 @@ func TestWorkerPoolQueueWorkerIdleReset(t *testing.T) {
const workloadSize = 12
for i := 0; i < workloadSize; i++ {
- assert.NoError(t, q.Push(i))
+ require.NoError(t, q.Push(i))
}
workerIDs := make(map[string]struct{})
diff --git a/modules/references/references_test.go b/modules/references/references_test.go
index 498374b2a7..ffa7f993e3 100644
--- a/modules/references/references_test.go
+++ b/modules/references/references_test.go
@@ -529,7 +529,7 @@ func TestCustomizeCloseKeywords(t *testing.T) {
func TestParseCloseKeywords(t *testing.T) {
// Test parsing of CloseKeywords and ReopenKeywords
- assert.Len(t, parseKeywords([]string{""}), 0)
+ assert.Empty(t, parseKeywords([]string{""}))
assert.Len(t, parseKeywords([]string{" aa ", " bb ", "99", "#", "", "this is", "cc"}), 3)
for _, test := range []struct {
diff --git a/modules/regexplru/regexplru_test.go b/modules/regexplru/regexplru_test.go
index 9c24b23fa9..8c0c722336 100644
--- a/modules/regexplru/regexplru_test.go
+++ b/modules/regexplru/regexplru_test.go
@@ -7,20 +7,21 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRegexpLru(t *testing.T) {
r, err := GetCompiled("a")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, r.MatchString("a"))
r, err = GetCompiled("a")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, r.MatchString("a"))
assert.EqualValues(t, 1, lruCache.Len())
_, err = GetCompiled("(")
- assert.Error(t, err)
+ require.Error(t, err)
assert.EqualValues(t, 2, lruCache.Len())
}
diff --git a/modules/repository/branch_test.go b/modules/repository/branch_test.go
index acf75a1ac0..b98618a16b 100644
--- a/modules/repository/branch_test.go
+++ b/modules/repository/branch_test.go
@@ -12,20 +12,21 @@ import (
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestSyncRepoBranches(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
_, err := db.GetEngine(db.DefaultContext).ID(1).Update(&repo_model.Repository{ObjectFormatName: "bad-fmt"})
- assert.NoError(t, db.TruncateBeans(db.DefaultContext, &git_model.Branch{}))
- assert.NoError(t, err)
+ require.NoError(t, db.TruncateBeans(db.DefaultContext, &git_model.Branch{}))
+ require.NoError(t, err)
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
assert.Equal(t, "bad-fmt", repo.ObjectFormatName)
_, err = SyncRepoBranches(db.DefaultContext, 1, 0)
- assert.NoError(t, err)
+ require.NoError(t, err)
repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
assert.Equal(t, "sha1", repo.ObjectFormatName)
branch, err := git_model.GetBranch(db.DefaultContext, 1, "master")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, "master", branch.Name)
}
diff --git a/modules/repository/collaborator_test.go b/modules/repository/collaborator_test.go
index e623dbdaa4..3844197bf1 100644
--- a/modules/repository/collaborator_test.go
+++ b/modules/repository/collaborator_test.go
@@ -16,16 +16,17 @@ import (
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRepository_AddCollaborator(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
testSuccess := func(repoID, userID int64) {
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID})
- assert.NoError(t, repo.LoadOwner(db.DefaultContext))
+ require.NoError(t, repo.LoadOwner(db.DefaultContext))
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
- assert.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
+ require.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID}, &user_model.User{ID: userID})
}
testSuccess(1, 4)
@@ -34,23 +35,23 @@ func TestRepository_AddCollaborator(t *testing.T) {
}
func TestRepository_AddCollaborator_IsBlocked(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
testSuccess := func(repoID, userID int64) {
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID})
- assert.NoError(t, repo.LoadOwner(db.DefaultContext))
+ require.NoError(t, repo.LoadOwner(db.DefaultContext))
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
// Owner blocked user.
unittest.AssertSuccessfulInsert(t, &user_model.BlockedUser{UserID: repo.OwnerID, BlockID: userID})
- assert.ErrorIs(t, AddCollaborator(db.DefaultContext, repo, user), user_model.ErrBlockedByUser)
+ require.ErrorIs(t, AddCollaborator(db.DefaultContext, repo, user), user_model.ErrBlockedByUser)
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID}, &user_model.User{ID: userID})
_, err := db.DeleteByBean(db.DefaultContext, &user_model.BlockedUser{UserID: repo.OwnerID, BlockID: userID})
- assert.NoError(t, err)
+ require.NoError(t, err)
// User has owner blocked.
unittest.AssertSuccessfulInsert(t, &user_model.BlockedUser{UserID: userID, BlockID: repo.OwnerID})
- assert.ErrorIs(t, AddCollaborator(db.DefaultContext, repo, user), user_model.ErrBlockedByUser)
+ require.ErrorIs(t, AddCollaborator(db.DefaultContext, repo, user), user_model.ErrBlockedByUser)
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID}, &user_model.User{ID: userID})
}
// Ensure idempotency (public repository).
@@ -61,25 +62,25 @@ func TestRepository_AddCollaborator_IsBlocked(t *testing.T) {
}
func TestRepoPermissionPublicNonOrgRepo(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// public non-organization repo
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
- assert.NoError(t, repo.LoadUnits(db.DefaultContext))
+ require.NoError(t, repo.LoadUnits(db.DefaultContext))
// plain user
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.False(t, perm.CanWrite(unit.Type))
}
// change to collaborator
- assert.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
+ require.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -88,7 +89,7 @@ func TestRepoPermissionPublicNonOrgRepo(t *testing.T) {
// collaborator
collaborator := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, collaborator)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -97,7 +98,7 @@ func TestRepoPermissionPublicNonOrgRepo(t *testing.T) {
// owner
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -106,7 +107,7 @@ func TestRepoPermissionPublicNonOrgRepo(t *testing.T) {
// admin
admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -114,33 +115,33 @@ func TestRepoPermissionPublicNonOrgRepo(t *testing.T) {
}
func TestRepoPermissionPrivateNonOrgRepo(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// private non-organization repo
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
- assert.NoError(t, repo.LoadUnits(db.DefaultContext))
+ require.NoError(t, repo.LoadUnits(db.DefaultContext))
// plain user
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.False(t, perm.CanRead(unit.Type))
assert.False(t, perm.CanWrite(unit.Type))
}
// change to collaborator to default write access
- assert.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
+ require.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
}
- assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, user.ID, perm_model.AccessModeRead))
+ require.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, user.ID, perm_model.AccessModeRead))
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.False(t, perm.CanWrite(unit.Type))
@@ -149,7 +150,7 @@ func TestRepoPermissionPrivateNonOrgRepo(t *testing.T) {
// owner
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -158,7 +159,7 @@ func TestRepoPermissionPrivateNonOrgRepo(t *testing.T) {
// admin
admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -166,33 +167,33 @@ func TestRepoPermissionPrivateNonOrgRepo(t *testing.T) {
}
func TestRepoPermissionPublicOrgRepo(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// public organization repo
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 32})
- assert.NoError(t, repo.LoadUnits(db.DefaultContext))
+ require.NoError(t, repo.LoadUnits(db.DefaultContext))
// plain user
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.False(t, perm.CanWrite(unit.Type))
}
// change to collaborator to default write access
- assert.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
+ require.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
}
- assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, user.ID, perm_model.AccessModeRead))
+ require.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, user.ID, perm_model.AccessModeRead))
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.False(t, perm.CanWrite(unit.Type))
@@ -201,7 +202,7 @@ func TestRepoPermissionPublicOrgRepo(t *testing.T) {
// org member team owner
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -210,7 +211,7 @@ func TestRepoPermissionPublicOrgRepo(t *testing.T) {
// org member team tester
member := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, member)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
}
@@ -220,7 +221,7 @@ func TestRepoPermissionPublicOrgRepo(t *testing.T) {
// admin
admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -228,33 +229,33 @@ func TestRepoPermissionPublicOrgRepo(t *testing.T) {
}
func TestRepoPermissionPrivateOrgRepo(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// private organization repo
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24})
- assert.NoError(t, repo.LoadUnits(db.DefaultContext))
+ require.NoError(t, repo.LoadUnits(db.DefaultContext))
// plain user
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.False(t, perm.CanRead(unit.Type))
assert.False(t, perm.CanWrite(unit.Type))
}
// change to collaborator to default write access
- assert.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
+ require.NoError(t, AddCollaborator(db.DefaultContext, repo, user))
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
}
- assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, user.ID, perm_model.AccessModeRead))
+ require.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, user.ID, perm_model.AccessModeRead))
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.False(t, perm.CanWrite(unit.Type))
@@ -263,7 +264,7 @@ func TestRepoPermissionPrivateOrgRepo(t *testing.T) {
// org member team owner
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -272,9 +273,9 @@ func TestRepoPermissionPrivateOrgRepo(t *testing.T) {
// update team information and then check permission
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 5})
err = organization.UpdateTeamUnits(db.DefaultContext, team, nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
@@ -283,7 +284,7 @@ func TestRepoPermissionPrivateOrgRepo(t *testing.T) {
// org member team tester
tester := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, tester)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, perm.CanWrite(unit.TypeIssues))
assert.False(t, perm.CanWrite(unit.TypeCode))
assert.False(t, perm.CanRead(unit.TypeCode))
@@ -291,7 +292,7 @@ func TestRepoPermissionPrivateOrgRepo(t *testing.T) {
// org member team reviewer
reviewer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 20})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, reviewer)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, perm.CanRead(unit.TypeIssues))
assert.False(t, perm.CanWrite(unit.TypeCode))
assert.True(t, perm.CanRead(unit.TypeCode))
@@ -299,7 +300,7 @@ func TestRepoPermissionPrivateOrgRepo(t *testing.T) {
// admin
admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin)
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, unit := range repo.Units {
assert.True(t, perm.CanRead(unit.Type))
assert.True(t, perm.CanWrite(unit.Type))
diff --git a/modules/repository/commits_test.go b/modules/repository/commits_test.go
index 248673a907..82841b3268 100644
--- a/modules/repository/commits_test.go
+++ b/modules/repository/commits_test.go
@@ -17,10 +17,11 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestPushCommits_ToAPIPayloadCommits(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
pushCommits := NewPushCommits()
pushCommits.Commits = []*PushCommit{
@@ -53,7 +54,7 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) {
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16})
payloadCommits, headCommit, err := pushCommits.ToAPIPayloadCommits(git.DefaultContext, repo.RepoPath(), "/user2/repo16")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, payloadCommits, 3)
assert.NotNil(t, headCommit)
@@ -103,7 +104,7 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) {
}
func TestPushCommits_AvatarLink(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
pushCommits := NewPushCommits()
pushCommits.Commits = []*PushCommit{
@@ -146,7 +147,7 @@ func TestCommitToPushCommit(t *testing.T) {
}
const hexString = "0123456789abcdef0123456789abcdef01234567"
sha1, err := git.NewIDFromString(hexString)
- assert.NoError(t, err)
+ require.NoError(t, err)
pushCommit := CommitToPushCommit(&git.Commit{
ID: sha1,
Author: sig,
@@ -172,10 +173,10 @@ func TestListToPushCommits(t *testing.T) {
const hexString1 = "0123456789abcdef0123456789abcdef01234567"
hash1, err := git.NewIDFromString(hexString1)
- assert.NoError(t, err)
+ require.NoError(t, err)
const hexString2 = "fedcba9876543210fedcba9876543210fedcba98"
hash2, err := git.NewIDFromString(hexString2)
- assert.NoError(t, err)
+ require.NoError(t, err)
l := []*git.Commit{
{
diff --git a/modules/repository/create_test.go b/modules/repository/create_test.go
index 6a2f4deaff..c743271c26 100644
--- a/modules/repository/create_test.go
+++ b/modules/repository/create_test.go
@@ -12,34 +12,35 @@ import (
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestUpdateRepositoryVisibilityChanged(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// Get sample repo and change visibility
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 9)
- assert.NoError(t, err)
+ require.NoError(t, err)
repo.IsPrivate = true
// Update it
err = UpdateRepository(db.DefaultContext, repo, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
// Check visibility of action has become private
act := activities_model.Action{}
_, err = db.GetEngine(db.DefaultContext).ID(3).Get(&act)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, act.IsPrivate)
}
func TestGetDirectorySize(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
size, err := getDirectorySize(repo.RepoPath())
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, size, repo.Size)
}
diff --git a/modules/repository/license_test.go b/modules/repository/license_test.go
index 3b0cfa1eed..a7d77743ac 100644
--- a/modules/repository/license_test.go
+++ b/modules/repository/license_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_getLicense(t *testing.T) {
@@ -19,7 +20,7 @@ func Test_getLicense(t *testing.T) {
name string
args args
want string
- wantErr assert.ErrorAssertionFunc
+ wantErr require.ErrorAssertionFunc
}{
{
name: "regular",
@@ -37,22 +38,21 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
`,
- wantErr: assert.NoError,
+ wantErr: require.NoError,
},
{
name: "license not found",
args: args{
name: "notfound",
},
- wantErr: assert.Error,
+ wantErr: require.Error,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := GetLicense(tt.args.name, tt.args.values)
- if !tt.wantErr(t, err, fmt.Sprintf("GetLicense(%v, %v)", tt.args.name, tt.args.values)) {
- return
- }
+ tt.wantErr(t, err, fmt.Sprintf("GetLicense(%v, %v)", tt.args.name, tt.args.values))
+
assert.Equalf(t, tt.want, string(got), "GetLicense(%v, %v)", tt.args.name, tt.args.values)
})
}
diff --git a/modules/repository/repo_test.go b/modules/repository/repo_test.go
index 68980f92f9..f3e7be6d7d 100644
--- a/modules/repository/repo_test.go
+++ b/modules/repository/repo_test.go
@@ -62,15 +62,15 @@ func Test_calcSync(t *testing.T) {
}
inserts, deletes, updates := calcSync(gitTags, dbReleases)
- if assert.EqualValues(t, 1, len(inserts), "inserts") {
+ if assert.Len(t, inserts, 1, "inserts") {
assert.EqualValues(t, *gitTags[2], *inserts[0], "inserts equal")
}
- if assert.EqualValues(t, 1, len(deletes), "deletes") {
+ if assert.Len(t, deletes, 1, "deletes") {
assert.EqualValues(t, 1, deletes[0], "deletes equal")
}
- if assert.EqualValues(t, 1, len(updates), "updates") {
+ if assert.Len(t, updates, 1, "updates") {
assert.EqualValues(t, *gitTags[1], *updates[0], "updates equal")
}
}
diff --git a/modules/secret/secret_test.go b/modules/secret/secret_test.go
index d4fb46955b..ba23718fd0 100644
--- a/modules/secret/secret_test.go
+++ b/modules/secret/secret_test.go
@@ -7,25 +7,26 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestEncryptDecrypt(t *testing.T) {
hex, err := EncryptSecret("foo", "baz")
- assert.NoError(t, err)
+ require.NoError(t, err)
str, _ := DecryptSecret("foo", hex)
assert.Equal(t, "baz", str)
hex, err = EncryptSecret("bar", "baz")
- assert.NoError(t, err)
+ require.NoError(t, err)
str, _ = DecryptSecret("foo", hex)
assert.NotEqual(t, "baz", str)
_, err = DecryptSecret("a", "b")
- assert.ErrorContains(t, err, "invalid hex string")
+ require.ErrorContains(t, err, "invalid hex string")
_, err = DecryptSecret("a", "bb")
- assert.ErrorContains(t, err, "the key (maybe SECRET_KEY?) might be incorrect: AesDecrypt ciphertext too short")
+ require.ErrorContains(t, err, "the key (maybe SECRET_KEY?) might be incorrect: AesDecrypt ciphertext too short")
_, err = DecryptSecret("a", "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
- assert.ErrorContains(t, err, "the key (maybe SECRET_KEY?) might be incorrect: AesDecrypt invalid decrypted base64 string")
+ require.ErrorContains(t, err, "the key (maybe SECRET_KEY?) might be incorrect: AesDecrypt invalid decrypted base64 string")
}
diff --git a/modules/setting/actions_test.go b/modules/setting/actions_test.go
index 01f5bf74a5..afd76d3bee 100644
--- a/modules/setting/actions_test.go
+++ b/modules/setting/actions_test.go
@@ -17,8 +17,8 @@ func Test_getStorageInheritNameSectionTypeForActions(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadActionsFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadActionsFrom(cfg))
assert.EqualValues(t, "minio", Actions.LogStorage.Type)
assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath)
@@ -30,8 +30,8 @@ func Test_getStorageInheritNameSectionTypeForActions(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadActionsFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadActionsFrom(cfg))
assert.EqualValues(t, "minio", Actions.LogStorage.Type)
assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath)
@@ -46,8 +46,8 @@ STORAGE_TYPE = my_storage
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadActionsFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadActionsFrom(cfg))
assert.EqualValues(t, "minio", Actions.LogStorage.Type)
assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath)
@@ -62,8 +62,8 @@ STORAGE_TYPE = my_storage
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadActionsFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadActionsFrom(cfg))
assert.EqualValues(t, "local", Actions.LogStorage.Type)
assert.EqualValues(t, "actions_log", filepath.Base(Actions.LogStorage.Path))
@@ -78,8 +78,8 @@ STORAGE_TYPE = my_storage
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadActionsFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadActionsFrom(cfg))
assert.EqualValues(t, "local", Actions.LogStorage.Type)
assert.EqualValues(t, "actions_log", filepath.Base(Actions.LogStorage.Path))
@@ -88,8 +88,8 @@ STORAGE_TYPE = minio
iniStr = ``
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadActionsFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadActionsFrom(cfg))
assert.EqualValues(t, "local", Actions.LogStorage.Type)
assert.EqualValues(t, "actions_log", filepath.Base(Actions.LogStorage.Path))
@@ -149,9 +149,8 @@ DEFAULT_ACTIONS_URL = https://example.com
t.Run(tt.name, func(t *testing.T) {
cfg, err := NewConfigProviderFromData(tt.iniStr)
require.NoError(t, err)
- if !assert.NoError(t, loadActionsFrom(cfg)) {
- return
- }
+ require.NoError(t, loadActionsFrom(cfg))
+
assert.EqualValues(t, tt.wantURL, Actions.DefaultActionsURL.URL())
})
}
diff --git a/modules/setting/admin_test.go b/modules/setting/admin_test.go
index c0b4dfff69..0c6c24b038 100644
--- a/modules/setting/admin_test.go
+++ b/modules/setting/admin_test.go
@@ -9,6 +9,7 @@ import (
"code.gitea.io/gitea/modules/container"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_loadAdminFrom(t *testing.T) {
@@ -21,12 +22,12 @@ func Test_loadAdminFrom(t *testing.T) {
EXTERNAL_USER_DISABLE_FEATURES = x,y
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
loadAdminFrom(cfg)
- assert.EqualValues(t, true, Admin.DisableRegularOrgCreation)
+ assert.True(t, Admin.DisableRegularOrgCreation)
assert.EqualValues(t, "z", Admin.DefaultEmailNotification)
- assert.EqualValues(t, true, Admin.SendNotificationEmailOnNewUser)
+ assert.True(t, Admin.SendNotificationEmailOnNewUser)
assert.EqualValues(t, container.SetOf("a", "b"), Admin.UserDisabledFeatures)
assert.EqualValues(t, container.SetOf("x", "y"), Admin.ExternalUserDisableFeatures)
}
diff --git a/modules/setting/annex.go b/modules/setting/annex.go
new file mode 100644
index 0000000000..a0eeac9bb8
--- /dev/null
+++ b/modules/setting/annex.go
@@ -0,0 +1,20 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package setting
+
+import (
+ "code.gitea.io/gitea/modules/log"
+)
+
+// Annex represents the configuration for git-annex
+var Annex = struct {
+ Enabled bool `ini:"ENABLED"`
+}{}
+
+func loadAnnexFrom(rootCfg ConfigProvider) {
+ sec := rootCfg.Section("annex")
+ if err := sec.MapTo(&Annex); err != nil {
+ log.Fatal("Failed to map Annex settings: %v", err)
+ }
+}
diff --git a/modules/setting/attachment_test.go b/modules/setting/attachment_test.go
index 3e8d2da4d9..f8085c1657 100644
--- a/modules/setting/attachment_test.go
+++ b/modules/setting/attachment_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_getStorageCustomType(t *testing.T) {
@@ -20,9 +21,9 @@ STORAGE_TYPE = minio
MINIO_ENDPOINT = my_minio:9000
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
assert.EqualValues(t, "minio", Attachment.Storage.Type)
assert.EqualValues(t, "my_minio:9000", Attachment.Storage.MinioConfig.Endpoint)
@@ -42,9 +43,9 @@ MINIO_BUCKET = gitea-minio
MINIO_BUCKET = gitea
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
assert.EqualValues(t, "minio", Attachment.Storage.Type)
assert.EqualValues(t, "gitea-minio", Attachment.Storage.MinioConfig.Bucket)
@@ -64,9 +65,9 @@ MINIO_BUCKET = gitea
STORAGE_TYPE = local
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
assert.EqualValues(t, "minio", Attachment.Storage.Type)
assert.EqualValues(t, "gitea-attachment", Attachment.Storage.MinioConfig.Bucket)
@@ -75,9 +76,9 @@ STORAGE_TYPE = local
func Test_getStorageGetDefaults(t *testing.T) {
cfg, err := NewConfigProviderFromData("")
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
// default storage is local, so bucket is empty
assert.EqualValues(t, "", Attachment.Storage.MinioConfig.Bucket)
@@ -89,9 +90,9 @@ func Test_getStorageInheritNameSectionType(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
assert.EqualValues(t, "minio", Attachment.Storage.Type)
}
@@ -109,9 +110,9 @@ MINIO_ACCESS_KEY_ID = correct_key
MINIO_SECRET_ACCESS_KEY = correct_key
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
storage := Attachment.Storage
assert.EqualValues(t, "minio", storage.Type)
@@ -124,9 +125,9 @@ func Test_AttachmentStorage1(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
assert.EqualValues(t, "minio", Attachment.Storage.Type)
assert.EqualValues(t, "gitea", Attachment.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath)
diff --git a/modules/setting/config_env_test.go b/modules/setting/config_env_test.go
index 572486aec2..bec3e584ef 100644
--- a/modules/setting/config_env_test.go
+++ b/modules/setting/config_env_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDecodeEnvSectionKey(t *testing.T) {
@@ -92,7 +93,7 @@ func TestEnvironmentToConfig(t *testing.T) {
[sec]
key = old
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key=new"})
assert.True(t, changed)
@@ -130,7 +131,7 @@ func TestEnvironmentToConfigSubSecKey(t *testing.T) {
[sec]
key = some
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
changed := EnvironmentToConfig(cfg, []string{"GITEA__sec_0X2E_sub__key=some"})
assert.True(t, changed)
@@ -138,9 +139,9 @@ key = some
tmpFile := t.TempDir() + "/test-sub-sec-key.ini"
defer os.Remove(tmpFile)
err = cfg.SaveTo(tmpFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
bs, err := os.ReadFile(tmpFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, `[sec]
key = some
diff --git a/modules/setting/config_provider_test.go b/modules/setting/config_provider_test.go
index a666d124c7..702be80861 100644
--- a/modules/setting/config_provider_test.go
+++ b/modules/setting/config_provider_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestConfigProviderBehaviors(t *testing.T) {
@@ -78,38 +79,38 @@ key = 123
func TestNewConfigProviderFromFile(t *testing.T) {
cfg, err := NewConfigProviderFromFile("no-such.ini")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, cfg.IsLoadedFromEmpty())
// load non-existing file and save
testFile := t.TempDir() + "/test.ini"
testFile1 := t.TempDir() + "/test1.ini"
cfg, err = NewConfigProviderFromFile(testFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
sec, _ := cfg.NewSection("foo")
_, _ = sec.NewKey("k1", "a")
- assert.NoError(t, cfg.Save())
+ require.NoError(t, cfg.Save())
_, _ = sec.NewKey("k2", "b")
- assert.NoError(t, cfg.SaveTo(testFile1))
+ require.NoError(t, cfg.SaveTo(testFile1))
bs, err := os.ReadFile(testFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[foo]\nk1 = a\n", string(bs))
bs, err = os.ReadFile(testFile1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[foo]\nk1 = a\nk2 = b\n", string(bs))
// load existing file and save
cfg, err = NewConfigProviderFromFile(testFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "a", cfg.Section("foo").Key("k1").String())
sec, _ = cfg.NewSection("bar")
_, _ = sec.NewKey("k1", "b")
- assert.NoError(t, cfg.Save())
+ require.NoError(t, cfg.Save())
bs, err = os.ReadFile(testFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[foo]\nk1 = a\n\n[bar]\nk1 = b\n", string(bs))
}
@@ -118,15 +119,15 @@ func TestNewConfigProviderForLocale(t *testing.T) {
localeFile := t.TempDir() + "/locale.ini"
_ = os.WriteFile(localeFile, []byte(`k1=a`), 0o644)
cfg, err := NewConfigProviderForLocale(localeFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "a", cfg.Section("").Key("k1").String())
// load locale from bytes
cfg, err = NewConfigProviderForLocale([]byte("k1=foo\nk2=bar"))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "foo", cfg.Section("").Key("k1").String())
cfg, err = NewConfigProviderForLocale([]byte("k1=foo\nk2=bar"), []byte("k2=xxx"))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "foo", cfg.Section("").Key("k1").String())
assert.Equal(t, "xxx", cfg.Section("").Key("k2").String())
}
@@ -135,22 +136,22 @@ func TestDisableSaving(t *testing.T) {
testFile := t.TempDir() + "/test.ini"
_ = os.WriteFile(testFile, []byte("k1=a\nk2=b"), 0o644)
cfg, err := NewConfigProviderFromFile(testFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
cfg.DisableSaving()
err = cfg.Save()
- assert.ErrorIs(t, err, errDisableSaving)
+ require.ErrorIs(t, err, errDisableSaving)
saveCfg, err := cfg.PrepareSaving()
- assert.NoError(t, err)
+ require.NoError(t, err)
saveCfg.Section("").Key("k1").MustString("x")
saveCfg.Section("").Key("k2").SetValue("y")
saveCfg.Section("").Key("k3").SetValue("z")
err = saveCfg.Save()
- assert.NoError(t, err)
+ require.NoError(t, err)
bs, err := os.ReadFile(testFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "k1 = a\nk2 = y\nk3 = z\n", string(bs))
}
diff --git a/modules/setting/cron_test.go b/modules/setting/cron_test.go
index 3187ab18a2..32f8ecffd2 100644
--- a/modules/setting/cron_test.go
+++ b/modules/setting/cron_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_getCronSettings(t *testing.T) {
@@ -27,7 +28,7 @@ SECOND = white rabbit
EXTEND = true
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
extended := &Extended{
BaseStruct: BaseStruct{
@@ -36,8 +37,8 @@ EXTEND = true
}
_, err = getCronSettings(cfg, "test", extended)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, extended.Base)
- assert.EqualValues(t, extended.Second, "white rabbit")
+ assert.EqualValues(t, "white rabbit", extended.Second)
assert.True(t, extended.Extend)
}
diff --git a/modules/setting/forgejo_storage_test.go b/modules/setting/forgejo_storage_test.go
index 9071067cde..d91bff59e9 100644
--- a/modules/setting/forgejo_storage_test.go
+++ b/modules/setting/forgejo_storage_test.go
@@ -14,6 +14,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestForgejoDocs_StorageTypes(t *testing.T) {
@@ -256,8 +257,8 @@ STORAGE_TYPE = %s
func testStoragePathMatch(t *testing.T, iniStr string, storageType StorageType, testSectionToPath testSectionToPathFun, section string, storage **Storage) {
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err, iniStr)
- assert.NoError(t, loadCommonSettingsFrom(cfg), iniStr)
+ require.NoError(t, err, iniStr)
+ require.NoError(t, loadCommonSettingsFrom(cfg), iniStr)
assert.EqualValues(t, testSectionToPath(storageType, section), testStorageGetPath(*storage), iniStr)
assert.EqualValues(t, storageType, (*storage).Type, iniStr)
}
diff --git a/modules/setting/git_test.go b/modules/setting/git_test.go
index 441c514d8c..34427f908f 100644
--- a/modules/setting/git_test.go
+++ b/modules/setting/git_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGitConfig(t *testing.T) {
@@ -21,7 +22,7 @@ func TestGitConfig(t *testing.T) {
[git.config]
a.b = 1
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
loadGitFrom(cfg)
assert.EqualValues(t, "1", GitConfig.Options["a.b"])
assert.EqualValues(t, "histogram", GitConfig.Options["diff.algorithm"])
@@ -30,7 +31,7 @@ a.b = 1
[git.config]
diff.algorithm = other
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
loadGitFrom(cfg)
assert.EqualValues(t, "other", GitConfig.Options["diff.algorithm"])
}
@@ -45,7 +46,7 @@ func TestGitReflog(t *testing.T) {
// default reflog config without legacy options
cfg, err := NewConfigProviderFromData(``)
- assert.NoError(t, err)
+ require.NoError(t, err)
loadGitFrom(cfg)
assert.EqualValues(t, "true", GitConfig.GetOption("core.logAllRefUpdates"))
@@ -57,7 +58,7 @@ func TestGitReflog(t *testing.T) {
ENABLED = false
EXPIRATION = 123
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
loadGitFrom(cfg)
assert.EqualValues(t, "false", GitConfig.GetOption("core.logAllRefUpdates"))
diff --git a/modules/setting/i18n.go b/modules/setting/i18n.go
index 1639f3ae5b..889e52beb6 100644
--- a/modules/setting/i18n.go
+++ b/modules/setting/i18n.go
@@ -34,7 +34,6 @@ var defaultI18nLangNames = []string{
"fa-IR", "فارسی",
"hu-HU", "Magyar nyelv",
"id-ID", "Bahasa Indonesia",
- "ml-IN", "മലയാളം",
}
func defaultI18nLangs() (res []string) {
diff --git a/modules/setting/lfs_test.go b/modules/setting/lfs_test.go
index 10c54fec0a..c7f16379b2 100644
--- a/modules/setting/lfs_test.go
+++ b/modules/setting/lfs_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_getStorageInheritNameSectionTypeForLFS(t *testing.T) {
@@ -15,8 +16,8 @@ func Test_getStorageInheritNameSectionTypeForLFS(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "minio", LFS.Storage.Type)
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
@@ -28,8 +29,8 @@ LFS_CONTENT_PATH = path_ignored
PATH = path_used
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "local", LFS.Storage.Type)
assert.Contains(t, LFS.Storage.Path, "path_used")
@@ -39,8 +40,8 @@ PATH = path_used
LFS_CONTENT_PATH = deprecatedpath
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "local", LFS.Storage.Type)
assert.Contains(t, LFS.Storage.Path, "deprecatedpath")
@@ -50,8 +51,8 @@ LFS_CONTENT_PATH = deprecatedpath
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "minio", LFS.Storage.Type)
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
@@ -64,8 +65,8 @@ STORAGE_TYPE = my_minio
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "minio", LFS.Storage.Type)
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
@@ -79,8 +80,8 @@ MINIO_BASE_PATH = my_lfs/
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "minio", LFS.Storage.Type)
assert.EqualValues(t, "my_lfs/", LFS.Storage.MinioConfig.BasePath)
@@ -92,9 +93,9 @@ func Test_LFSStorage1(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "minio", LFS.Storage.Type)
assert.EqualValues(t, "gitea", LFS.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
diff --git a/modules/setting/log_test.go b/modules/setting/log_test.go
index 87b14f0b1d..3134d3e75c 100644
--- a/modules/setting/log_test.go
+++ b/modules/setting/log_test.go
@@ -11,7 +11,6 @@ import (
"code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log"
- "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -23,7 +22,7 @@ func initLoggersByConfig(t *testing.T, config string) (*log.LoggerManager, func(
}()
cfg, err := NewConfigProviderFromData(config)
- assert.NoError(t, err)
+ require.NoError(t, err)
manager := log.NewManager()
initManagedLoggers(manager, cfg)
diff --git a/modules/setting/oauth2_test.go b/modules/setting/oauth2_test.go
index 1951c4c0a2..18252b2447 100644
--- a/modules/setting/oauth2_test.go
+++ b/modules/setting/oauth2_test.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGetGeneralSigningSecret(t *testing.T) {
@@ -55,6 +56,6 @@ func TestGetGeneralSigningSecretSave(t *testing.T) {
assert.Equal(t, generated, again)
iniContent, err := os.ReadFile(tmpFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Contains(t, string(iniContent), "JWT_SECRET = ")
}
diff --git a/modules/setting/packages_test.go b/modules/setting/packages_test.go
index 87de276041..78eb4b4bbc 100644
--- a/modules/setting/packages_test.go
+++ b/modules/setting/packages_test.go
@@ -7,12 +7,13 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMustBytes(t *testing.T) {
test := func(value string) int64 {
cfg, err := NewConfigProviderFromData("[test]")
- assert.NoError(t, err)
+ require.NoError(t, err)
sec := cfg.Section("test")
sec.NewKey("VALUE", value)
@@ -37,8 +38,8 @@ func Test_getStorageInheritNameSectionTypeForPackages(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadPackagesFrom(cfg))
assert.EqualValues(t, "minio", Packages.Storage.Type)
assert.EqualValues(t, "packages/", Packages.Storage.MinioConfig.BasePath)
@@ -49,8 +50,8 @@ STORAGE_TYPE = minio
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadPackagesFrom(cfg))
assert.EqualValues(t, "minio", Packages.Storage.Type)
assert.EqualValues(t, "packages/", Packages.Storage.MinioConfig.BasePath)
@@ -64,8 +65,8 @@ STORAGE_TYPE = my_minio
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadPackagesFrom(cfg))
assert.EqualValues(t, "minio", Packages.Storage.Type)
assert.EqualValues(t, "packages/", Packages.Storage.MinioConfig.BasePath)
@@ -80,8 +81,8 @@ MINIO_BASE_PATH = my_packages/
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadPackagesFrom(cfg))
assert.EqualValues(t, "minio", Packages.Storage.Type)
assert.EqualValues(t, "my_packages/", Packages.Storage.MinioConfig.BasePath)
@@ -103,9 +104,9 @@ MINIO_ACCESS_KEY_ID = correct_key
MINIO_SECRET_ACCESS_KEY = correct_key
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, loadPackagesFrom(cfg))
storage := Packages.Storage
assert.EqualValues(t, "minio", storage.Type)
@@ -130,9 +131,9 @@ MINIO_ACCESS_KEY_ID = correct_key
MINIO_SECRET_ACCESS_KEY = correct_key
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, loadPackagesFrom(cfg))
storage := Packages.Storage
assert.EqualValues(t, "minio", storage.Type)
@@ -158,9 +159,9 @@ MINIO_ACCESS_KEY_ID = correct_key
MINIO_SECRET_ACCESS_KEY = correct_key
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, loadPackagesFrom(cfg))
storage := Packages.Storage
assert.EqualValues(t, "minio", storage.Type)
@@ -186,9 +187,9 @@ MINIO_ACCESS_KEY_ID = correct_key
MINIO_SECRET_ACCESS_KEY = correct_key
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, loadPackagesFrom(cfg))
storage := Packages.Storage
assert.EqualValues(t, "minio", storage.Type)
diff --git a/modules/setting/repository_archive_test.go b/modules/setting/repository_archive_test.go
index a0f91f0da1..d3901b6e47 100644
--- a/modules/setting/repository_archive_test.go
+++ b/modules/setting/repository_archive_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_getStorageInheritNameSectionTypeForRepoArchive(t *testing.T) {
@@ -16,8 +17,8 @@ func Test_getStorageInheritNameSectionTypeForRepoArchive(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadRepoArchiveFrom(cfg))
assert.EqualValues(t, "minio", RepoArchive.Storage.Type)
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
@@ -28,8 +29,8 @@ STORAGE_TYPE = minio
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadRepoArchiveFrom(cfg))
assert.EqualValues(t, "minio", RepoArchive.Storage.Type)
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
@@ -43,8 +44,8 @@ STORAGE_TYPE = my_minio
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadRepoArchiveFrom(cfg))
assert.EqualValues(t, "minio", RepoArchive.Storage.Type)
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
@@ -59,8 +60,8 @@ MINIO_BASE_PATH = my_archive/
STORAGE_TYPE = minio
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadRepoArchiveFrom(cfg))
assert.EqualValues(t, "minio", RepoArchive.Storage.Type)
assert.EqualValues(t, "my_archive/", RepoArchive.Storage.MinioConfig.BasePath)
@@ -79,9 +80,9 @@ MINIO_ACCESS_KEY_ID = correct_key
MINIO_SECRET_ACCESS_KEY = correct_key
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, loadRepoArchiveFrom(cfg))
storage := RepoArchive.Storage
assert.EqualValues(t, "minio", storage.Type)
@@ -101,9 +102,9 @@ MINIO_ACCESS_KEY_ID = correct_key
MINIO_SECRET_ACCESS_KEY = correct_key
`
cfg, err = NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, loadRepoArchiveFrom(cfg))
storage = RepoArchive.Storage
assert.EqualValues(t, "minio", storage.Type)
diff --git a/modules/setting/service_test.go b/modules/setting/service_test.go
index 1647bcec16..7a13e39238 100644
--- a/modules/setting/service_test.go
+++ b/modules/setting/service_test.go
@@ -10,6 +10,7 @@ import (
"github.com/gobwas/glob"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestLoadServices(t *testing.T) {
@@ -24,7 +25,7 @@ EMAIL_DOMAIN_WHITELIST = d1, *.w
EMAIL_DOMAIN_ALLOWLIST = d2, *.a
EMAIL_DOMAIN_BLOCKLIST = d3, *.b
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
loadServiceFrom(cfg)
match := func(globs []glob.Glob, s string) bool {
@@ -119,7 +120,7 @@ ALLOWED_USER_VISIBILITY_MODES = public, limit, privated
for kase, fun := range kases {
t.Run(kase, func(t *testing.T) {
cfg, err := NewConfigProviderFromData(kase)
- assert.NoError(t, err)
+ require.NoError(t, err)
loadServiceFrom(cfg)
fun()
// reset
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index a873b92cdf..97fb05403f 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -153,6 +153,7 @@ func loadCommonSettingsFrom(cfg ConfigProvider) error {
loadCamoFrom(cfg)
loadI18nFrom(cfg)
loadGitFrom(cfg)
+ loadAnnexFrom(cfg)
loadMirrorFrom(cfg)
loadMarkupFrom(cfg)
loadOtherFrom(cfg)
diff --git a/modules/setting/storage_test.go b/modules/setting/storage_test.go
index 6f38bf1d55..271607914c 100644
--- a/modules/setting/storage_test.go
+++ b/modules/setting/storage_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_getStorageMultipleName(t *testing.T) {
@@ -23,17 +24,17 @@ STORAGE_TYPE = minio
MINIO_BUCKET = gitea-storage
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
assert.EqualValues(t, "gitea-attachment", Attachment.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "gitea-lfs", LFS.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
- assert.NoError(t, loadAvatarsFrom(cfg))
+ require.NoError(t, loadAvatarsFrom(cfg))
assert.EqualValues(t, "gitea-storage", Avatar.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "avatars/", Avatar.Storage.MinioConfig.BasePath)
}
@@ -48,13 +49,13 @@ STORAGE_TYPE = minio
MINIO_BUCKET = gitea-storage
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadAttachmentFrom(cfg))
+ require.NoError(t, loadAttachmentFrom(cfg))
assert.EqualValues(t, "gitea-storage", Attachment.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "gitea-storage", LFS.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
}
@@ -65,19 +66,19 @@ func Test_getStorageInheritStorageType(t *testing.T) {
STORAGE_TYPE = minio
`
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, loadPackagesFrom(cfg))
+ require.NoError(t, loadPackagesFrom(cfg))
assert.EqualValues(t, "minio", Packages.Storage.Type)
assert.EqualValues(t, "gitea", Packages.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "packages/", Packages.Storage.MinioConfig.BasePath)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, loadRepoArchiveFrom(cfg))
assert.EqualValues(t, "minio", RepoArchive.Storage.Type)
assert.EqualValues(t, "gitea", RepoArchive.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
- assert.NoError(t, loadActionsFrom(cfg))
+ require.NoError(t, loadActionsFrom(cfg))
assert.EqualValues(t, "minio", Actions.LogStorage.Type)
assert.EqualValues(t, "gitea", Actions.LogStorage.MinioConfig.Bucket)
assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath)
@@ -86,12 +87,12 @@ STORAGE_TYPE = minio
assert.EqualValues(t, "gitea", Actions.ArtifactStorage.MinioConfig.Bucket)
assert.EqualValues(t, "actions_artifacts/", Actions.ArtifactStorage.MinioConfig.BasePath)
- assert.NoError(t, loadAvatarsFrom(cfg))
+ require.NoError(t, loadAvatarsFrom(cfg))
assert.EqualValues(t, "minio", Avatar.Storage.Type)
assert.EqualValues(t, "gitea", Avatar.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "avatars/", Avatar.Storage.MinioConfig.BasePath)
- assert.NoError(t, loadRepoAvatarFrom(cfg))
+ require.NoError(t, loadRepoAvatarFrom(cfg))
assert.EqualValues(t, "minio", RepoAvatar.Storage.Type)
assert.EqualValues(t, "gitea", RepoAvatar.Storage.MinioConfig.Bucket)
assert.EqualValues(t, "repo-avatars/", RepoAvatar.Storage.MinioConfig.BasePath)
@@ -105,10 +106,10 @@ type testLocalStoragePathCase struct {
func testLocalStoragePath(t *testing.T, appDataPath, iniStr string, cases []testLocalStoragePathCase) {
cfg, err := NewConfigProviderFromData(iniStr)
- assert.NoError(t, err)
+ require.NoError(t, err)
AppDataPath = appDataPath
for _, c := range cases {
- assert.NoError(t, c.loader(cfg))
+ require.NoError(t, c.loader(cfg))
storage := *c.storagePtr
assert.EqualValues(t, "local", storage.Type)
@@ -315,9 +316,9 @@ func Test_getStorageConfiguration20(t *testing.T) {
STORAGE_TYPE = my_storage
PATH = archives
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.Error(t, loadRepoArchiveFrom(cfg))
+ require.Error(t, loadRepoArchiveFrom(cfg))
}
func Test_getStorageConfiguration21(t *testing.T) {
@@ -344,12 +345,12 @@ STORAGE_TYPE = minio
MINIO_ACCESS_KEY_ID = my_access_key
MINIO_SECRET_ACCESS_KEY = my_secret_key
`)
- assert.NoError(t, err)
+ require.NoError(t, err)
_, err = getStorage(cfg, "", "", nil)
- assert.Error(t, err)
+ require.Error(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, loadRepoArchiveFrom(cfg))
cp := RepoArchive.Storage.ToShadowCopy()
assert.EqualValues(t, "******", cp.MinioConfig.AccessKeyID)
assert.EqualValues(t, "******", cp.MinioConfig.SecretAccessKey)
@@ -364,8 +365,8 @@ STORAGE_TYPE = my_archive
; unsupported, storage type should be defined explicitly
PATH = archives
`)
- assert.NoError(t, err)
- assert.Error(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.Error(t, loadRepoArchiveFrom(cfg))
}
func Test_getStorageConfiguration25(t *testing.T) {
@@ -378,8 +379,8 @@ STORAGE_TYPE = my_archive
STORAGE_TYPE = unknown // should be local or minio
PATH = archives
`)
- assert.NoError(t, err)
- assert.Error(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.Error(t, loadRepoArchiveFrom(cfg))
}
func Test_getStorageConfiguration26(t *testing.T) {
@@ -391,10 +392,10 @@ MINIO_SECRET_ACCESS_KEY = my_secret_key
; wrong configuration
MINIO_USE_SSL = abc
`)
- assert.NoError(t, err)
- // assert.Error(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ // require.Error(t, loadRepoArchiveFrom(cfg))
// FIXME: this should return error but now ini package's MapTo() doesn't check type
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, loadRepoArchiveFrom(cfg))
}
func Test_getStorageConfiguration27(t *testing.T) {
@@ -405,11 +406,11 @@ MINIO_ACCESS_KEY_ID = my_access_key
MINIO_SECRET_ACCESS_KEY = my_secret_key
MINIO_USE_SSL = true
`)
- assert.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadRepoArchiveFrom(cfg))
assert.EqualValues(t, "my_access_key", RepoArchive.Storage.MinioConfig.AccessKeyID)
assert.EqualValues(t, "my_secret_key", RepoArchive.Storage.MinioConfig.SecretAccessKey)
- assert.EqualValues(t, true, RepoArchive.Storage.MinioConfig.UseSSL)
+ assert.True(t, RepoArchive.Storage.MinioConfig.UseSSL)
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
}
@@ -422,11 +423,11 @@ MINIO_SECRET_ACCESS_KEY = my_secret_key
MINIO_USE_SSL = true
MINIO_BASE_PATH = /prefix
`)
- assert.NoError(t, err)
- assert.NoError(t, loadRepoArchiveFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadRepoArchiveFrom(cfg))
assert.EqualValues(t, "my_access_key", RepoArchive.Storage.MinioConfig.AccessKeyID)
assert.EqualValues(t, "my_secret_key", RepoArchive.Storage.MinioConfig.SecretAccessKey)
- assert.EqualValues(t, true, RepoArchive.Storage.MinioConfig.UseSSL)
+ assert.True(t, RepoArchive.Storage.MinioConfig.UseSSL)
assert.EqualValues(t, "/prefix/repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
cfg, err = NewConfigProviderFromData(`
@@ -440,11 +441,11 @@ MINIO_BASE_PATH = /prefix
[lfs]
MINIO_BASE_PATH = /lfs
`)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "my_access_key", LFS.Storage.MinioConfig.AccessKeyID)
assert.EqualValues(t, "my_secret_key", LFS.Storage.MinioConfig.SecretAccessKey)
- assert.EqualValues(t, true, LFS.Storage.MinioConfig.UseSSL)
+ assert.True(t, true, LFS.Storage.MinioConfig.UseSSL)
assert.EqualValues(t, "/lfs", LFS.Storage.MinioConfig.BasePath)
cfg, err = NewConfigProviderFromData(`
@@ -458,10 +459,10 @@ MINIO_BASE_PATH = /prefix
[storage.lfs]
MINIO_BASE_PATH = /lfs
`)
- assert.NoError(t, err)
- assert.NoError(t, loadLFSFrom(cfg))
+ require.NoError(t, err)
+ require.NoError(t, loadLFSFrom(cfg))
assert.EqualValues(t, "my_access_key", LFS.Storage.MinioConfig.AccessKeyID)
assert.EqualValues(t, "my_secret_key", LFS.Storage.MinioConfig.SecretAccessKey)
- assert.EqualValues(t, true, LFS.Storage.MinioConfig.UseSSL)
+ assert.True(t, LFS.Storage.MinioConfig.UseSSL)
assert.EqualValues(t, "/lfs", LFS.Storage.MinioConfig.BasePath)
}
diff --git a/modules/sitemap/sitemap_test.go b/modules/sitemap/sitemap_test.go
index 1180463cd7..39a2178c09 100644
--- a/modules/sitemap/sitemap_test.go
+++ b/modules/sitemap/sitemap_test.go
@@ -11,6 +11,7 @@ import (
"time"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestNewSitemap(t *testing.T) {
@@ -82,7 +83,7 @@ func TestNewSitemap(t *testing.T) {
if tt.wantErr != "" {
assert.EqualError(t, err, tt.wantErr)
} else {
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equalf(t, tt.want, buf.String(), "NewSitemap()")
}
})
@@ -158,7 +159,7 @@ func TestNewSitemapIndex(t *testing.T) {
if tt.wantErr != "" {
assert.EqualError(t, err, tt.wantErr)
} else {
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equalf(t, tt.want, buf.String(), "NewSitemapIndex()")
}
})
diff --git a/modules/storage/helper_test.go b/modules/storage/helper_test.go
index f1f9791044..60a7c61289 100644
--- a/modules/storage/helper_test.go
+++ b/modules/storage/helper_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_discardStorage(t *testing.T) {
@@ -20,30 +21,30 @@ func Test_discardStorage(t *testing.T) {
{
got, err := tt.Open("path")
assert.Nil(t, got)
- assert.Error(t, err, string(tt))
+ require.Error(t, err, string(tt))
}
{
got, err := tt.Save("path", bytes.NewReader([]byte{0}), 1)
assert.Equal(t, int64(0), got)
- assert.Error(t, err, string(tt))
+ require.Error(t, err, string(tt))
}
{
got, err := tt.Stat("path")
assert.Nil(t, got)
- assert.Error(t, err, string(tt))
+ require.Error(t, err, string(tt))
}
{
err := tt.Delete("path")
- assert.Error(t, err, string(tt))
+ require.Error(t, err, string(tt))
}
{
got, err := tt.URL("path", "name")
assert.Nil(t, got)
- assert.Errorf(t, err, string(tt))
+ require.Errorf(t, err, string(tt))
}
{
err := tt.IterateObjects("", func(_ string, _ Object) error { return nil })
- assert.Error(t, err, string(tt))
+ require.Error(t, err, string(tt))
}
})
}
diff --git a/modules/storage/minio_test.go b/modules/storage/minio_test.go
index 3fe01825e9..9ce1dbc7b4 100644
--- a/modules/storage/minio_test.go
+++ b/modules/storage/minio_test.go
@@ -14,6 +14,7 @@ import (
"github.com/minio/minio-go/v7"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMinioStorageIterator(t *testing.T) {
@@ -108,7 +109,7 @@ func TestS3StorageBadRequest(t *testing.T) {
}
}
_, err := NewStorage(setting.MinioStorageType, cfg)
- assert.ErrorContains(t, err, message)
+ require.ErrorContains(t, err, message)
}
func TestMinioCredentials(t *testing.T) {
@@ -128,7 +129,7 @@ func TestMinioCredentials(t *testing.T) {
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, ExpectedAccessKey, v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey, v.SecretAccessKey)
})
@@ -143,7 +144,7 @@ func TestMinioCredentials(t *testing.T) {
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"Minio", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"Minio", v.SecretAccessKey)
})
@@ -155,7 +156,7 @@ func TestMinioCredentials(t *testing.T) {
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"AWS", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"AWS", v.SecretAccessKey)
})
@@ -168,7 +169,7 @@ func TestMinioCredentials(t *testing.T) {
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"MinioFile", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"MinioFile", v.SecretAccessKey)
})
@@ -181,7 +182,7 @@ func TestMinioCredentials(t *testing.T) {
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"AWSFile", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"AWSFile", v.SecretAccessKey)
})
@@ -207,7 +208,7 @@ func TestMinioCredentials(t *testing.T) {
creds := buildMinioCredentials(cfg, server.URL)
v, err := creds.Get()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"IAM", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"IAM", v.SecretAccessKey)
})
diff --git a/modules/storage/storage_test.go b/modules/storage/storage_test.go
index 5e3e9c7dba..70bcd3155a 100644
--- a/modules/storage/storage_test.go
+++ b/modules/storage/storage_test.go
@@ -10,11 +10,12 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func testStorageIterator(t *testing.T, typStr Type, cfg *setting.Storage) {
l, err := NewStorage(typStr, cfg)
- assert.NoError(t, err)
+ require.NoError(t, err)
testFiles := [][]string{
{"a/1.txt", "a1"},
@@ -27,7 +28,7 @@ func testStorageIterator(t *testing.T, typStr Type, cfg *setting.Storage) {
}
for _, f := range testFiles {
_, err = l.Save(f[0], bytes.NewBufferString(f[1]), -1)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
expectedList := map[string][]string{
@@ -45,7 +46,7 @@ func testStorageIterator(t *testing.T, typStr Type, cfg *setting.Storage) {
count++
return nil
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, expected, count)
}
}
diff --git a/modules/structs/issue_test.go b/modules/structs/issue_test.go
index fa7a20db8b..2003e22e0a 100644
--- a/modules/structs/issue_test.go
+++ b/modules/structs/issue_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
"gopkg.in/yaml.v3"
)
@@ -97,7 +98,7 @@ labels:
if tt.wantErr != "" {
assert.EqualError(t, err, tt.wantErr)
} else {
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, tt.want, tt.tmpl)
}
})
diff --git a/modules/system/appstate_test.go b/modules/system/appstate_test.go
index d4b9e167c2..2f44c7b845 100644
--- a/modules/system/appstate_test.go
+++ b/modules/system/appstate_test.go
@@ -10,6 +10,7 @@ import (
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -36,30 +37,30 @@ func (*testItem2) Name() string {
}
func TestAppStateDB(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
as := &DBStore{}
item1 := new(testItem1)
- assert.NoError(t, as.Get(db.DefaultContext, item1))
+ require.NoError(t, as.Get(db.DefaultContext, item1))
assert.Equal(t, "", item1.Val1)
assert.EqualValues(t, 0, item1.Val2)
item1 = new(testItem1)
item1.Val1 = "a"
item1.Val2 = 2
- assert.NoError(t, as.Set(db.DefaultContext, item1))
+ require.NoError(t, as.Set(db.DefaultContext, item1))
item2 := new(testItem2)
item2.K = "V"
- assert.NoError(t, as.Set(db.DefaultContext, item2))
+ require.NoError(t, as.Set(db.DefaultContext, item2))
item1 = new(testItem1)
- assert.NoError(t, as.Get(db.DefaultContext, item1))
+ require.NoError(t, as.Get(db.DefaultContext, item1))
assert.Equal(t, "a", item1.Val1)
assert.EqualValues(t, 2, item1.Val2)
item2 = new(testItem2)
- assert.NoError(t, as.Get(db.DefaultContext, item2))
+ require.NoError(t, as.Get(db.DefaultContext, item2))
assert.Equal(t, "V", item2.K)
}
diff --git a/modules/templates/eval/eval_test.go b/modules/templates/eval/eval_test.go
index c9e514b5eb..3e68203638 100644
--- a/modules/templates/eval/eval_test.go
+++ b/modules/templates/eval/eval_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func tokens(s string) (a []any) {
@@ -20,15 +21,15 @@ func tokens(s string) (a []any) {
func TestEval(t *testing.T) {
n, err := Expr(0, "/", 0.0)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, math.IsNaN(n.Value.(float64)))
_, err = Expr(nil)
- assert.ErrorContains(t, err, "unsupported token type")
+ require.ErrorContains(t, err, "unsupported token type")
_, err = Expr([]string{})
- assert.ErrorContains(t, err, "unsupported token type")
+ require.ErrorContains(t, err, "unsupported token type")
_, err = Expr(struct{}{})
- assert.ErrorContains(t, err, "unsupported token type")
+ require.ErrorContains(t, err, "unsupported token type")
cases := []struct {
expr string
@@ -69,9 +70,8 @@ func TestEval(t *testing.T) {
for _, c := range cases {
n, err := Expr(tokens(c.expr)...)
- if assert.NoError(t, err, "expr: %s", c.expr) {
- assert.Equal(t, c.want, n.Value)
- }
+ require.NoError(t, err, "expr: %s", c.expr)
+ assert.Equal(t, c.want, n.Value)
}
bads := []struct {
@@ -89,6 +89,6 @@ func TestEval(t *testing.T) {
}
for _, c := range bads {
_, err = Expr(tokens(c.expr)...)
- assert.ErrorContains(t, err, c.errMsg, "expr: %s", c.expr)
+ require.ErrorContains(t, err, c.errMsg, "expr: %s", c.expr)
}
}
diff --git a/modules/templates/htmlrenderer_test.go b/modules/templates/htmlrenderer_test.go
index 2a74b74c23..a1d3783a75 100644
--- a/modules/templates/htmlrenderer_test.go
+++ b/modules/templates/htmlrenderer_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/assetfs"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestExtractErrorLine(t *testing.T) {
@@ -60,10 +61,10 @@ func TestHandleError(t *testing.T) {
test := func(s string, h func(error) string, expect string) {
err := os.WriteFile(dir+"/test.tmpl", []byte(s), 0o644)
- assert.NoError(t, err)
+ require.NoError(t, err)
tmpl := template.New("test")
_, err = tmpl.Parse(s)
- assert.Error(t, err)
+ require.Error(t, err)
msg := h(err)
assert.EqualValues(t, strings.TrimSpace(expect), strings.TrimSpace(msg))
}
@@ -93,7 +94,7 @@ template error: tmp:test:1 : unexpected "3" in operand
// no idea about how to trigger such strange error, so mock an error to test it
err := os.WriteFile(dir+"/test.tmpl", []byte("god knows XXX"), 0o644)
- assert.NoError(t, err)
+ require.NoError(t, err)
expectedMsg := `
template error: tmp:test:1 : expected end; found XXX
----------------------------------------------------------------------
diff --git a/modules/templates/scopedtmpl/scopedtmpl_test.go b/modules/templates/scopedtmpl/scopedtmpl_test.go
index 774b8c7d42..9bbd0c7c70 100644
--- a/modules/templates/scopedtmpl/scopedtmpl_test.go
+++ b/modules/templates/scopedtmpl/scopedtmpl_test.go
@@ -12,6 +12,7 @@ import (
"time"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestScopedTemplateSetFuncMap(t *testing.T) {
@@ -22,7 +23,7 @@ func TestScopedTemplateSetFuncMap(t *testing.T) {
}})
_, err := all.New("base").Parse(`{{CtxFunc "base"}}`)
- assert.NoError(t, err)
+ require.NoError(t, err)
_, err = all.New("test").Parse(strings.TrimSpace(`
{{template "base"}}
@@ -30,10 +31,10 @@ func TestScopedTemplateSetFuncMap(t *testing.T) {
{{template "base"}}
{{CtxFunc "test"}}
`))
- assert.NoError(t, err)
+ require.NoError(t, err)
ts, err := newScopedTemplateSet(all, "test")
- assert.NoError(t, err)
+ require.NoError(t, err)
// try to use different CtxFunc to render concurrently
@@ -57,12 +58,12 @@ func TestScopedTemplateSetFuncMap(t *testing.T) {
wg.Add(2)
go func() {
err := ts.newExecutor(funcMap1).Execute(&out1, nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
wg.Done()
}()
go func() {
err := ts.newExecutor(funcMap2).Execute(&out2, nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
wg.Done()
}()
wg.Wait()
@@ -73,17 +74,17 @@ func TestScopedTemplateSetFuncMap(t *testing.T) {
func TestScopedTemplateSetEscape(t *testing.T) {
all := template.New("")
_, err := all.New("base").Parse(`{{.text}}`)
- assert.NoError(t, err)
+ require.NoError(t, err)
_, err = all.New("test").Parse(`{{template "base" .}}`)
- assert.NoError(t, err)
+ require.NoError(t, err)
ts, err := newScopedTemplateSet(all, "test")
- assert.NoError(t, err)
+ require.NoError(t, err)
out := bytes.Buffer{}
err = ts.newExecutor(nil).Execute(&out, map[string]string{"param": "/", "text": "<"})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, `<`, out.String())
}
@@ -91,8 +92,8 @@ func TestScopedTemplateSetEscape(t *testing.T) {
func TestScopedTemplateSetUnsafe(t *testing.T) {
all := template.New("")
_, err := all.New("test").Parse(``)
- assert.NoError(t, err)
+ require.NoError(t, err)
_, err = newScopedTemplateSet(all, "test")
- assert.ErrorContains(t, err, "appears in an ambiguous context within a URL")
+ require.ErrorContains(t, err, "appears in an ambiguous context within a URL")
}
diff --git a/modules/templates/util_test.go b/modules/templates/util_test.go
index febaf7fa88..79aaba4a0e 100644
--- a/modules/templates/util_test.go
+++ b/modules/templates/util_test.go
@@ -10,6 +10,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDict(t *testing.T) {
@@ -27,9 +28,8 @@ func TestDict(t *testing.T) {
for _, c := range cases {
got, err := dict(c.args...)
- if assert.NoError(t, err) {
- assert.EqualValues(t, c.want, got)
- }
+ require.NoError(t, err)
+ assert.EqualValues(t, c.want, got)
}
bads := []struct {
@@ -41,7 +41,7 @@ func TestDict(t *testing.T) {
}
for _, c := range bads {
_, err := dict(c.args...)
- assert.Error(t, err)
+ require.Error(t, err)
}
}
@@ -51,7 +51,7 @@ func TestUtils(t *testing.T) {
tmpl.Funcs(template.FuncMap{"SliceUtils": NewSliceUtils, "StringUtils": NewStringUtils})
template.Must(tmpl.Parse(code))
w := &strings.Builder{}
- assert.NoError(t, tmpl.Execute(w, data))
+ require.NoError(t, tmpl.Execute(w, data))
return w.String()
}
@@ -75,5 +75,5 @@ func TestUtils(t *testing.T) {
template.Must(tmpl.Parse("{{SliceUtils.Contains .Slice .Value}}"))
// error is like this: `template: test:1:12: executing "test" at : error calling Contains: ...`
err := tmpl.Execute(io.Discard, map[string]any{"Slice": struct{}{}})
- assert.ErrorContains(t, err, "invalid type, expected slice or array")
+ require.ErrorContains(t, err, "invalid type, expected slice or array")
}
diff --git a/modules/templates/vars/vars_test.go b/modules/templates/vars/vars_test.go
index 8f421d9e4b..c54342204d 100644
--- a/modules/templates/vars/vars_test.go
+++ b/modules/templates/vars/vars_test.go
@@ -7,6 +7,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestExpandVars(t *testing.T) {
@@ -62,9 +63,9 @@ func TestExpandVars(t *testing.T) {
res, err := Expand(kase.tmpl, kase.data)
assert.EqualValues(t, kase.out, res)
if kase.error {
- assert.Error(t, err)
+ require.Error(t, err)
} else {
- assert.NoError(t, err)
+ require.NoError(t, err)
}
})
}
diff --git a/modules/translation/i18n/i18n_test.go b/modules/translation/i18n/i18n_test.go
index b364992dfe..244f6ffbb3 100644
--- a/modules/translation/i18n/i18n_test.go
+++ b/modules/translation/i18n/i18n_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestLocaleStore(t *testing.T) {
@@ -29,8 +30,8 @@ sub = Changed Sub String
`)
ls := NewLocaleStore()
- assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil))
- assert.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil))
+ require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil))
+ require.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil))
ls.SetDefaultLang("lang1")
lang1, _ := ls.Locale("lang1")
@@ -61,7 +62,7 @@ sub = Changed Sub String
found := lang1.HasKey("no-such")
assert.False(t, found)
- assert.NoError(t, ls.Close())
+ require.NoError(t, ls.Close())
}
func TestLocaleStoreMoreSource(t *testing.T) {
@@ -76,7 +77,7 @@ c=22
`)
ls := NewLocaleStore()
- assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, testData2))
+ require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, testData2))
lang1, _ := ls.Locale("lang1")
assert.Equal(t, "11", lang1.TrString("a"))
assert.Equal(t, "21", lang1.TrString("b"))
@@ -117,7 +118,7 @@ func (e *errorPointerReceiver) Error() string {
func TestLocaleWithTemplate(t *testing.T) {
ls := NewLocaleStore()
- assert.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", []byte(`key=%s`), nil))
+ require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", []byte(`key=%s`), nil))
lang1, _ := ls.Locale("lang1")
tmpl := template.New("test").Funcs(template.FuncMap{"tr": lang1.TrHTML})
@@ -143,7 +144,7 @@ func TestLocaleWithTemplate(t *testing.T) {
buf := &strings.Builder{}
for _, c := range cases {
buf.Reset()
- assert.NoError(t, tmpl.Execute(buf, map[string]any{"var": c.in}))
+ require.NoError(t, tmpl.Execute(buf, map[string]any{"var": c.in}))
assert.Equal(t, c.want, buf.String())
}
}
@@ -182,9 +183,9 @@ func TestLocaleStoreQuirks(t *testing.T) {
ls := NewLocaleStore()
err := ls.AddLocaleByIni("lang1", "Lang1", []byte("a="+testData.in), nil)
lang1, _ := ls.Locale("lang1")
- assert.NoError(t, err, testData.hint)
+ require.NoError(t, err, testData.hint)
assert.Equal(t, testData.out, lang1.TrString("a"), testData.hint)
- assert.NoError(t, ls.Close())
+ require.NoError(t, ls.Close())
}
// TODO: Crowdin needs the strings to be quoted correctly and doesn't like incomplete quotes
diff --git a/modules/typesniffer/typesniffer_test.go b/modules/typesniffer/typesniffer_test.go
index da662ab99d..f6fa07ee7f 100644
--- a/modules/typesniffer/typesniffer_test.go
+++ b/modules/typesniffer/typesniffer_test.go
@@ -11,6 +11,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDetectContentTypeLongerThanSniffLen(t *testing.T) {
@@ -119,18 +120,18 @@ func TestIsAudio(t *testing.T) {
func TestDetectContentTypeFromReader(t *testing.T) {
mp3, _ := base64.StdEncoding.DecodeString("SUQzBAAAAAABAFRYWFgAAAASAAADbWFqb3JfYnJhbmQAbXA0MgBUWFhYAAAAEQAAA21pbm9yX3Zl")
st, err := DetectContentTypeFromReader(bytes.NewReader(mp3))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, st.IsAudio())
}
func TestDetectContentTypeOgg(t *testing.T) {
oggAudio, _ := hex.DecodeString("4f67675300020000000000000000352f0000000000007dc39163011e01766f72626973000000000244ac0000000000000071020000000000b8014f6767530000")
st, err := DetectContentTypeFromReader(bytes.NewReader(oggAudio))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, st.IsAudio())
oggVideo, _ := hex.DecodeString("4f676753000200000000000000007d9747ef000000009b59daf3012a807468656f7261030201001e00110001e000010e00020000001e00000001000001000001")
st, err = DetectContentTypeFromReader(bytes.NewReader(oggVideo))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, st.IsVideo())
}
diff --git a/modules/updatechecker/update_checker_test.go b/modules/updatechecker/update_checker_test.go
index 301afd95e4..5ac2603ca1 100644
--- a/modules/updatechecker/update_checker_test.go
+++ b/modules/updatechecker/update_checker_test.go
@@ -7,10 +7,11 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDNSUpdate(t *testing.T) {
version, err := getVersionDNS("release.forgejo.org")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEmpty(t, version)
}
diff --git a/modules/uri/uri_test.go b/modules/uri/uri_test.go
index 11b915c261..71a8985cd7 100644
--- a/modules/uri/uri_test.go
+++ b/modules/uri/uri_test.go
@@ -7,13 +7,13 @@ import (
"path/filepath"
"testing"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestReadURI(t *testing.T) {
p, err := filepath.Abs("./uri.go")
- assert.NoError(t, err)
+ require.NoError(t, err)
f, err := Open("file://" + p)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer f.Close()
}
diff --git a/modules/user/user_test.go b/modules/user/user_test.go
index 9129ae79a1..372a675d34 100644
--- a/modules/user/user_test.go
+++ b/modules/user/user_test.go
@@ -4,7 +4,6 @@
package user
import (
- "os"
"os/exec"
"runtime"
"strings"
@@ -36,7 +35,7 @@ func TestCurrentUsername(t *testing.T) {
if user != whoami {
t.Errorf("expected %s as user, got: %s", whoami, user)
}
- os.Setenv("USER", "spoofed")
+ t.Setenv("USER", "spoofed")
user = CurrentUsername()
if user != whoami {
t.Errorf("expected %s as user, got: %s", whoami, user)
diff --git a/modules/util/color_test.go b/modules/util/color_test.go
index be6e6b122a..abd5551218 100644
--- a/modules/util/color_test.go
+++ b/modules/util/color_test.go
@@ -27,9 +27,9 @@ func Test_HexToRBGColor(t *testing.T) {
}
for n, c := range cases {
r, g, b := HexToRBGColor(c.colorString)
- assert.Equal(t, c.expectedR, r, "case %d: error R should match: expected %f, but get %f", n, c.expectedR, r)
- assert.Equal(t, c.expectedG, g, "case %d: error G should match: expected %f, but get %f", n, c.expectedG, g)
- assert.Equal(t, c.expectedB, b, "case %d: error B should match: expected %f, but get %f", n, c.expectedB, b)
+ assert.InDelta(t, c.expectedR, r, 0, "case %d: error R should match: expected %f, but get %f", n, c.expectedR, r)
+ assert.InDelta(t, c.expectedG, g, 0, "case %d: error G should match: expected %f, but get %f", n, c.expectedG, g)
+ assert.InDelta(t, c.expectedB, b, 0, "case %d: error B should match: expected %f, but get %f", n, c.expectedB, b)
}
}
diff --git a/modules/util/file_unix_test.go b/modules/util/file_unix_test.go
index 87d6c2f09a..d60082a034 100644
--- a/modules/util/file_unix_test.go
+++ b/modules/util/file_unix_test.go
@@ -10,16 +10,17 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestApplyUmask(t *testing.T) {
f, err := os.CreateTemp(t.TempDir(), "test-filemode-")
- assert.NoError(t, err)
+ require.NoError(t, err)
err = os.Chmod(f.Name(), 0o777)
- assert.NoError(t, err)
+ require.NoError(t, err)
st, err := os.Stat(f.Name())
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, 0o777, st.Mode().Perm()&0o777)
oldDefaultUmask := defaultUmask
@@ -28,8 +29,8 @@ func TestApplyUmask(t *testing.T) {
defaultUmask = oldDefaultUmask
}()
err = ApplyUmask(f.Name(), os.ModePerm)
- assert.NoError(t, err)
+ require.NoError(t, err)
st, err = os.Stat(f.Name())
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, 0o740, st.Mode().Perm()&0o777)
}
diff --git a/modules/util/filebuffer/file_backed_buffer_test.go b/modules/util/filebuffer/file_backed_buffer_test.go
index 16d5a1965f..c56c1c64e9 100644
--- a/modules/util/filebuffer/file_backed_buffer_test.go
+++ b/modules/util/filebuffer/file_backed_buffer_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestFileBackedBuffer(t *testing.T) {
@@ -22,14 +23,14 @@ func TestFileBackedBuffer(t *testing.T) {
for _, c := range cases {
buf, err := CreateFromReader(strings.NewReader(c.Data), c.MaxMemorySize)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, len(c.Data), buf.Size())
data, err := io.ReadAll(buf)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, c.Data, string(data))
- assert.NoError(t, buf.Close())
+ require.NoError(t, buf.Close())
}
}
diff --git a/modules/util/io_test.go b/modules/util/io_test.go
index 275575463a..870e713646 100644
--- a/modules/util/io_test.go
+++ b/modules/util/io_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
type readerWithError struct {
@@ -27,40 +28,40 @@ func TestReadWithLimit(t *testing.T) {
// normal test
buf, err := readWithLimit(bytes.NewBuffer(bs), 5, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("01"), buf)
buf, err = readWithLimit(bytes.NewBuffer(bs), 5, 5)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("01234"), buf)
buf, err = readWithLimit(bytes.NewBuffer(bs), 5, 6)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("012345"), buf)
buf, err = readWithLimit(bytes.NewBuffer(bs), 5, len(bs))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("0123456789abcdef"), buf)
buf, err = readWithLimit(bytes.NewBuffer(bs), 5, 100)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("0123456789abcdef"), buf)
// test with error
buf, err = readWithLimit(&readerWithError{bytes.NewBuffer(bs)}, 5, 10)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("0123456789"), buf)
buf, err = readWithLimit(&readerWithError{bytes.NewBuffer(bs)}, 5, 100)
- assert.ErrorContains(t, err, "test error")
+ require.ErrorContains(t, err, "test error")
assert.Empty(t, buf)
// test public function
buf, err = ReadWithLimit(bytes.NewBuffer(bs), 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("01"), buf)
buf, err = ReadWithLimit(bytes.NewBuffer(bs), 9999999)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []byte("0123456789abcdef"), buf)
}
diff --git a/modules/util/keypair_test.go b/modules/util/keypair_test.go
index c6f68c845a..ec9bca7efa 100644
--- a/modules/util/keypair_test.go
+++ b/modules/util/keypair_test.go
@@ -14,11 +14,12 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestKeygen(t *testing.T) {
priv, pub, err := GenerateKeyPair(2048)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEmpty(t, priv)
assert.NotEmpty(t, pub)
@@ -29,7 +30,7 @@ func TestKeygen(t *testing.T) {
func TestSignUsingKeys(t *testing.T) {
priv, pub, err := GenerateKeyPair(2048)
- assert.NoError(t, err)
+ require.NoError(t, err)
privPem, _ := pem.Decode([]byte(priv))
if privPem == nil || privPem.Type != "RSA PRIVATE KEY" {
@@ -37,7 +38,7 @@ func TestSignUsingKeys(t *testing.T) {
}
privParsed, err := x509.ParsePKCS1PrivateKey(privPem.Bytes)
- assert.NoError(t, err)
+ require.NoError(t, err)
pubPem, _ := pem.Decode([]byte(pub))
if pubPem == nil || pubPem.Type != "PUBLIC KEY" {
@@ -45,7 +46,7 @@ func TestSignUsingKeys(t *testing.T) {
}
pubParsed, err := x509.ParsePKIXPublicKey(pubPem.Bytes)
- assert.NoError(t, err)
+ require.NoError(t, err)
// Sign
msg := "activity pub is great!"
@@ -53,9 +54,9 @@ func TestSignUsingKeys(t *testing.T) {
h.Write([]byte(msg))
d := h.Sum(nil)
sig, err := rsa.SignPKCS1v15(rand.Reader, privParsed, crypto.SHA256, d)
- assert.NoError(t, err)
+ require.NoError(t, err)
// Verify
err = rsa.VerifyPKCS1v15(pubParsed.(*rsa.PublicKey), crypto.SHA256, d, sig)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
diff --git a/modules/util/legacy_test.go b/modules/util/legacy_test.go
index b7991bd365..62c2f8af16 100644
--- a/modules/util/legacy_test.go
+++ b/modules/util/legacy_test.go
@@ -10,6 +10,7 @@ import (
"time"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestCopyFile(t *testing.T) {
@@ -28,10 +29,10 @@ func TestCopyFile(t *testing.T) {
}()
err := os.WriteFile(srcFile, testContent, 0o777)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = CopyFile(srcFile, dstFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
dstContent, err := os.ReadFile(dstFile)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, testContent, dstContent)
}
diff --git a/modules/util/pack_test.go b/modules/util/pack_test.go
index 592c69cd0a..42ada89b81 100644
--- a/modules/util/pack_test.go
+++ b/modules/util/pack_test.go
@@ -6,7 +6,7 @@ package util
import (
"testing"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestPackAndUnpackData(t *testing.T) {
@@ -19,10 +19,10 @@ func TestPackAndUnpackData(t *testing.T) {
var f2 float32
data, err := PackData(s, i, f)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, UnpackData(data, &s2, &i2, &f2))
- assert.NoError(t, UnpackData(data, &s2))
- assert.Error(t, UnpackData(data, &i2))
- assert.Error(t, UnpackData(data, &s2, &f2))
+ require.NoError(t, UnpackData(data, &s2, &i2, &f2))
+ require.NoError(t, UnpackData(data, &s2))
+ require.Error(t, UnpackData(data, &i2))
+ require.Error(t, UnpackData(data, &s2, &f2))
}
diff --git a/modules/util/path_test.go b/modules/util/path_test.go
index 6a38bf4ace..3699f052d1 100644
--- a/modules/util/path_test.go
+++ b/modules/util/path_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestFileURLToPath(t *testing.T) {
@@ -48,9 +49,9 @@ func TestFileURLToPath(t *testing.T) {
u, _ := url.Parse(c.url)
p, err := FileURLToPath(u)
if c.haserror {
- assert.Error(t, err, "case %d: should return error", n)
+ require.Error(t, err, "case %d: should return error", n)
} else {
- assert.NoError(t, err, "case %d: should not return error", n)
+ require.NoError(t, err, "case %d: should not return error", n)
assert.Equal(t, c.expected, p, "case %d: should be equal", n)
}
}
diff --git a/modules/util/remove.go b/modules/util/remove.go
index d1e38faf5f..265891b307 100644
--- a/modules/util/remove.go
+++ b/modules/util/remove.go
@@ -4,7 +4,9 @@
package util
import (
+ "io/fs"
"os"
+ "path/filepath"
"runtime"
"syscall"
"time"
@@ -41,10 +43,43 @@ func Remove(name string) error {
return err
}
-// RemoveAll removes the named file or (empty) directory with at most 5 attempts.
+// RemoveAll removes the named file or directory with at most 5 attempts.
func RemoveAll(name string) error {
var err error
+
for i := 0; i < 5; i++ {
+ // Do chmod -R +w to help ensure the removal succeeds.
+ // In particular, in the git-annex case, this handles
+ // https://git-annex.branchable.com/internals/lockdown/ :
+ //
+ // > (The only bad consequence of this is that rm -rf .git
+ // > doesn't work unless you first run chmod -R +w .git)
+
+ err = filepath.WalkDir(name, func(path string, d fs.DirEntry, err error) error {
+ // NB: this is called WalkDir but it works on a single file too
+ if err == nil {
+ info, err := d.Info()
+ if err != nil {
+ return err
+ }
+
+ // Don't try chmod'ing symlinks (will fail with broken symlinks)
+ if info.Mode()&os.ModeSymlink != os.ModeSymlink {
+ // 0200 == u+w, in octal unix permission notation
+ err = os.Chmod(path, info.Mode()|0o200)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+ })
+ if err != nil {
+ // try again
+ <-time.After(100 * time.Millisecond)
+ continue
+ }
+
err = os.RemoveAll(name)
if err == nil {
break
diff --git a/modules/util/rotatingfilewriter/writer_test.go b/modules/util/rotatingfilewriter/writer_test.go
index 88392797b3..5b3b351667 100644
--- a/modules/util/rotatingfilewriter/writer_test.go
+++ b/modules/util/rotatingfilewriter/writer_test.go
@@ -11,6 +11,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestCompressOldFile(t *testing.T) {
@@ -19,9 +20,9 @@ func TestCompressOldFile(t *testing.T) {
nonGzip := filepath.Join(tmpDir, "test-nonGzip")
f, err := os.OpenFile(fname, os.O_CREATE|os.O_WRONLY, 0o660)
- assert.NoError(t, err)
+ require.NoError(t, err)
ng, err := os.OpenFile(nonGzip, os.O_CREATE|os.O_WRONLY, 0o660)
- assert.NoError(t, err)
+ require.NoError(t, err)
for i := 0; i < 999; i++ {
f.WriteString("This is a test file\n")
@@ -31,18 +32,18 @@ func TestCompressOldFile(t *testing.T) {
ng.Close()
err = compressOldFile(fname, gzip.DefaultCompression)
- assert.NoError(t, err)
+ require.NoError(t, err)
_, err = os.Lstat(fname + ".gz")
- assert.NoError(t, err)
+ require.NoError(t, err)
f, err = os.Open(fname + ".gz")
- assert.NoError(t, err)
+ require.NoError(t, err)
zr, err := gzip.NewReader(f)
- assert.NoError(t, err)
+ require.NoError(t, err)
data, err := io.ReadAll(zr)
- assert.NoError(t, err)
+ require.NoError(t, err)
original, err := os.ReadFile(nonGzip)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, original, data)
}
diff --git a/modules/util/util_test.go b/modules/util/util_test.go
index de8f065cad..8ed1e32078 100644
--- a/modules/util/util_test.go
+++ b/modules/util/util_test.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/optional"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestURLJoin(t *testing.T) {
@@ -122,36 +123,36 @@ func Test_NormalizeEOL(t *testing.T) {
func Test_RandomInt(t *testing.T) {
randInt, err := CryptoRandomInt(255)
- assert.True(t, randInt >= 0)
- assert.True(t, randInt <= 255)
- assert.NoError(t, err)
+ assert.GreaterOrEqual(t, randInt, int64(0))
+ assert.LessOrEqual(t, randInt, int64(255))
+ require.NoError(t, err)
}
func Test_RandomString(t *testing.T) {
str1, err := CryptoRandomString(32)
- assert.NoError(t, err)
+ require.NoError(t, err)
matches, err := regexp.MatchString(`^[a-zA-Z0-9]{32}$`, str1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, matches)
str2, err := CryptoRandomString(32)
- assert.NoError(t, err)
+ require.NoError(t, err)
matches, err = regexp.MatchString(`^[a-zA-Z0-9]{32}$`, str1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, matches)
assert.NotEqual(t, str1, str2)
str3, err := CryptoRandomString(256)
- assert.NoError(t, err)
+ require.NoError(t, err)
matches, err = regexp.MatchString(`^[a-zA-Z0-9]{256}$`, str3)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, matches)
str4, err := CryptoRandomString(256)
- assert.NoError(t, err)
+ require.NoError(t, err)
matches, err = regexp.MatchString(`^[a-zA-Z0-9]{256}$`, str4)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, matches)
assert.NotEqual(t, str3, str4)
@@ -159,18 +160,18 @@ func Test_RandomString(t *testing.T) {
func Test_RandomBytes(t *testing.T) {
bytes1, err := CryptoRandomBytes(32)
- assert.NoError(t, err)
+ require.NoError(t, err)
bytes2, err := CryptoRandomBytes(32)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEqual(t, bytes1, bytes2)
bytes3, err := CryptoRandomBytes(256)
- assert.NoError(t, err)
+ require.NoError(t, err)
bytes4, err := CryptoRandomBytes(256)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEqual(t, bytes3, bytes4)
}
@@ -223,20 +224,20 @@ func BenchmarkToUpper(b *testing.B) {
}
func TestToTitleCase(t *testing.T) {
- assert.Equal(t, ToTitleCase(`foo bar baz`), `Foo Bar Baz`)
- assert.Equal(t, ToTitleCase(`FOO BAR BAZ`), `Foo Bar Baz`)
+ assert.Equal(t, `Foo Bar Baz`, ToTitleCase(`foo bar baz`))
+ assert.Equal(t, `Foo Bar Baz`, ToTitleCase(`FOO BAR BAZ`))
}
func TestToPointer(t *testing.T) {
assert.Equal(t, "abc", *ToPointer("abc"))
assert.Equal(t, 123, *ToPointer(123))
abc := "abc"
- assert.False(t, &abc == ToPointer(abc))
+ assert.NotSame(t, &abc, ToPointer(abc))
val123 := 123
- assert.False(t, &val123 == ToPointer(val123))
+ assert.NotSame(t, &val123, ToPointer(val123))
}
func TestReserveLineBreakForTextarea(t *testing.T) {
- assert.Equal(t, ReserveLineBreakForTextarea("test\r\ndata"), "test\ndata")
- assert.Equal(t, ReserveLineBreakForTextarea("test\r\ndata\r\n"), "test\ndata\n")
+ assert.Equal(t, "test\ndata", ReserveLineBreakForTextarea("test\r\ndata"))
+ assert.Equal(t, "test\ndata\n", ReserveLineBreakForTextarea("test\r\ndata\r\n"))
}
diff --git a/modules/web/route_test.go b/modules/web/route_test.go
index cc0e26a12e..d8015d6e0d 100644
--- a/modules/web/route_test.go
+++ b/modules/web/route_test.go
@@ -12,6 +12,7 @@ import (
chi "github.com/go-chi/chi/v5"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRoute1(t *testing.T) {
@@ -30,7 +31,7 @@ func TestRoute1(t *testing.T) {
})
req, err := http.NewRequest("GET", "http://localhost:8000/gitea/gitea/issues", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
}
@@ -87,25 +88,25 @@ func TestRoute2(t *testing.T) {
})
req, err := http.NewRequest("GET", "http://localhost:8000/gitea/gitea/issues", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 0, hit)
req, err = http.NewRequest("GET", "http://localhost:8000/gitea/gitea/issues/1", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 1, hit)
req, err = http.NewRequest("GET", "http://localhost:8000/gitea/gitea/issues/1?stop=100", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 100, hit)
req, err = http.NewRequest("GET", "http://localhost:8000/gitea/gitea/issues/1/view", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 2, hit)
@@ -147,31 +148,31 @@ func TestRoute3(t *testing.T) {
})
req, err := http.NewRequest("GET", "http://localhost:8000/api/v1/repos/gitea/gitea/branch_protections", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 0, hit)
req, err = http.NewRequest("POST", "http://localhost:8000/api/v1/repos/gitea/gitea/branch_protections", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code, http.StatusOK)
assert.EqualValues(t, 1, hit)
req, err = http.NewRequest("GET", "http://localhost:8000/api/v1/repos/gitea/gitea/branch_protections/master", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 2, hit)
req, err = http.NewRequest("PATCH", "http://localhost:8000/api/v1/repos/gitea/gitea/branch_protections/master", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 3, hit)
req, err = http.NewRequest("DELETE", "http://localhost:8000/api/v1/repos/gitea/gitea/branch_protections/master", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.EqualValues(t, http.StatusOK, recorder.Code)
assert.EqualValues(t, 4, hit)
diff --git a/modules/web/routemock_test.go b/modules/web/routemock_test.go
index 04c6d1d82e..cd99b99323 100644
--- a/modules/web/routemock_test.go
+++ b/modules/web/routemock_test.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRouteMock(t *testing.T) {
@@ -31,7 +32,7 @@ func TestRouteMock(t *testing.T) {
// normal request
recorder := httptest.NewRecorder()
req, err := http.NewRequest("GET", "http://localhost:8000/foo", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.Len(t, recorder.Header(), 3)
assert.EqualValues(t, "m1", recorder.Header().Get("X-Test-Middleware1"))
@@ -46,7 +47,7 @@ func TestRouteMock(t *testing.T) {
})
recorder = httptest.NewRecorder()
req, err = http.NewRequest("GET", "http://localhost:8000/foo", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.Len(t, recorder.Header(), 2)
assert.EqualValues(t, "m1", recorder.Header().Get("X-Test-Middleware1"))
@@ -60,7 +61,7 @@ func TestRouteMock(t *testing.T) {
})
recorder = httptest.NewRecorder()
req, err = http.NewRequest("GET", "http://localhost:8000/foo", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
r.ServeHTTP(recorder, req)
assert.Len(t, recorder.Header(), 3)
assert.EqualValues(t, "m1", recorder.Header().Get("X-Test-Middleware1"))
diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini
index 7387bca2a4..3056bd5dd5 100644
--- a/options/locale/locale_ar.ini
+++ b/options/locale/locale_ar.ini
@@ -1165,7 +1165,7 @@ pulls.status_checks_failure = بعض الفحوص فشلت
pulls.status_checks_success = جميع الفحوص ناجحة
pulls.status_checks_warning = بعض الفحوص تعطي تحذيرات
pulls.commit_ref_at = `أشار إلى طلب الدمج من إيداع %[2]s`
-pulls.cmd_instruction_hint = `أظهر شرح استخدام سطر الأوامر.`
+pulls.cmd_instruction_hint = `أظهر شرح استخدام سطر الأوامر.`
pulls.cmd_instruction_checkout_title = اسحب
pulls.cmd_instruction_checkout_desc = من مستودع مشروعك، اسحب (check out) فرعا جديدا واختبر التغييرات.
pulls.cmd_instruction_merge_title = ادمج
@@ -1331,7 +1331,7 @@ admin.new_user.text = من فضلك اضغط هنا لإدار
admin.new_user.subject = مستخدم جديد: %s سجل حالاً
admin.new_user.user_info = معلومات المستخدم
activate_account.text_1 = أهلا يا %[1]s، شكرا لك للتسجيل في %[2]s!
-register_notify = أهلا بك في فورجيو
+register_notify_prev9 = أهلا بك في فورجيو
activate_account = نرجو تفعيل حسابك
activate_account.title = يا %s، نرجو منك تفعيل حسابك
issue.x_mentioned_you = ذكرك @%s:
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index 4e03808c38..4ee716c037 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -193,7 +193,7 @@ disabled = Изключено
licenses = Лицензи
sign_in = Вход
copy_content = Копиране на съдържанието
-user_profile_and_more = Профил и Настройки…
+user_profile_and_more = Профил и настройки…
view = Преглед
your_settings = Настройки
mirrors = Огледала
@@ -227,7 +227,7 @@ copy = Копиране
enabled = Включено
new_org = Нова организация
milestones = Етапи
-rss_feed = RSS Емисия
+rss_feed = RSS емисия
never = Никога
new_project = Нов проект
your_starred = Отбелязани
@@ -283,6 +283,8 @@ filter.not_mirror = Не огледала
copy_hash = Копиране на контролната сума
artifacts = Артефакти
show_log_seconds = Показване на секундите
+remove_all = Премахване на всичко
+test = Проба
[repo]
issues.context.edit = Редактиране
@@ -973,7 +975,7 @@ search.results = Резултати от търсенето на "%s" в инструкциите за командния ред.`
+pulls.cmd_instruction_hint = `Вижте инструкциите за командния ред.`
pulls.showing_only_single_commit = Показани са само промените в подаване %[1]s
issues.lock_no_reason = заключи и ограничи обсъждането до сътрудници %s
pulls.expand_files = Разгъване на всички файлове
@@ -1064,7 +1066,7 @@ diff.review.reject = Поискване на промени
diff.bin_not_shown = Двоичният файл не е показан.
settings.units.units = Елементи на хранилището
settings.delete_notices_fork_1 = - Разклоненията на това хранилище ще станат независими след изтриване.
-settings.actions_desc = Включване на интегрираните CI/CD pipelines с Forgejo Действия
+settings.actions_desc = Включване на интегрираните CI/CD pipelines с Forgejo Actions
settings.packages_desc = Включване на регистъра на пакетите за хранилището
settings.units.add_more = Добавяне...
settings.use_external_issue_tracker = Използване на външен тракер за задачи
@@ -1134,6 +1136,16 @@ pulls.status_checks_failure = Някои проверки са неуспешн
issues.review.add_review_request = поиска рецензия от %s %s
wiki.no_search_results = Няма резултати
wiki.search = Търсене в уикито
+issues.author.tooltip.pr = Този потребител е авторът на тази заявка за сливане.
+issues.author.tooltip.issue = Този потребител е авторът на тази задача.
+issues.review.option.hide_outdated_comments = Скриване на остарели коментари
+file.title = %s в %s
+issues.review.option.show_outdated_comments = Показване на остарели коментари
+issues.content_history.delete_from_history_confirm = Да се изтрие ли от историята?
+project = Проекти
+issues.content_history.delete_from_history = Изтриване от историята
+n_release_few = %s издания
+n_release_one = %s издание
[modal]
confirm = Потвърждаване
@@ -1259,7 +1271,7 @@ mailer_password = SMTP парола
disable_gravatar = Изключване на Gravatar
smtp_addr = SMTP хост
smtp_port = SMTP порт
-app_name_helper = Можете да въведете името на компанията си тук.
+app_name_helper = Въведете името на инстанцията си тук. Ще се показва на всяка страница.
admin_title = Настройки на администраторския акаунт
err_empty_admin_password = Администраторската парола не може да бъде празна.
docker_helper = Ако стартирате Forgejo в Docker, моля, прочетете документацията преди да промените настройки.
@@ -1285,7 +1297,7 @@ issue.in_tree_path = В %s:
release.note = Бележка:
hi_user_x = Здравейте %s,
admin.new_user.user_info = Информация за потребителя
-register_notify = Добре дошли във Forgejo
+register_notify_prev9 = Добре дошли във Forgejo
issue.action.new = @%[1]s създаде #%[2]d.
issue.action.review = @%[1]s коментира в тази заявка за сливане.
issue.action.reopen = @%[1]s отвори наново #%[2]d.
@@ -1318,13 +1330,17 @@ email_visibility.private = Вашият адрес на ел. поща е вид
show_on_map = Показване на това място на картата
followers_one = %d последовател
following_one = %d следван
+followers.title.few = Последователи
+followers.title.one = Последовател
+following.title.one = Следван
+following.title.few = Следвани
[home]
filter = Други филтри
show_archived = Архивирани
search_repos = Намиране на хранилище…
my_orgs = Организации
-uname_holder = Потреб. име или Адрес на ел. поща
+uname_holder = Потребителско име или ел. поща
my_repos = Хранилища
show_both_archived_unarchived = Показване на и архивирани и неархивирани
feed_of = Емисия на "%s"
@@ -1414,6 +1430,7 @@ orgs.teams = Екипи
orgs.members = Участници
config_settings = Настройки
users.details = Потребителски данни
+packages.total_size = Общ размер: %s
[error]
not_found = Целта не може да бъде намерена.
@@ -1509,7 +1526,7 @@ tab_signin = Влизане
tab_signup = Регистриране
[aria]
-footer.software = Относно софтуера
+footer.software = Относно този софтуер
footer.links = Връзки
footer = Долен колонтитул
@@ -1622,6 +1639,10 @@ project_kind = Търсене на проекти...
package_kind = Търсене на пакети...
search = Търсене...
branch_kind = Търсене на клонове...
+pull_kind = Търсене на заявки за сливане...
+issue_kind = Търсене на задачи...
+fuzzy = Приблизително
+exact = Прецизно
[markup]
filepreview.lines = Редове от %[1]d до %[2]d в %[3]s
diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini
index e917e214ac..c43db27cba 100644
--- a/options/locale/locale_ca.ini
+++ b/options/locale/locale_ca.ini
@@ -20,7 +20,7 @@ language = Idioma
notifications = Notificacions
active_stopwatch = Registre de Temps Actiu
create_new = Crear…
-user_profile_and_more = Perfil i configuració…
+user_profile_and_more = Perfil i Configuració…
signed_in_as = Entrat com
enable_javascript = Aquest lloc web requereix Javascript.
toc = Taula de Continguts
@@ -28,4 +28,360 @@ licenses = Llicències
sign_up = Registrar-se
link_account = Vincular un compte
tracked_time_summary = Resum del temps registrat basat en filtres del llistat de temes
-return_to_forgejo = Tornar a Forgejo
\ No newline at end of file
+return_to_forgejo = Tornar a Forgejo
+toggle_menu = Commuta el menú
+more_items = Més elements
+username = Nom d'usuari
+email = Direcció de correu
+password = Contrasenya
+access_token = Testimoni d'accés
+re_type = Confirmar contrasenya
+captcha = CAPTCHA
+twofa = Autenticació de doble factor
+twofa_scratch = Codi de rascar de doble-factor
+passcode = Codi de pas
+webauthn_insert_key = Inseriu la vostra clau de seguretat
+webauthn_sign_in = Premeu el botó a la vostra clau de seguretat. Si no en té, torneu-la a inserir.
+webauthn_press_button = Siusplau, premeu el botó a la vostra clau de seguretat…
+webauthn_use_twofa = Utilitza un codi de doble factor des del teu mòbil
+webauthn_error = No s'ha pogut llegir la clau de seguretat.
+webauthn_unsupported_browser = El teu navegador no suprta WebAuthn.
+webauthn_error_unknown = Hi ha hagut un error desconegut. Si us plau torneu-ho a intentar.
+webauthn_error_insecure = WebAuthn només suporta connexions segures. Per provar sobre HTTP, podeu utilitzar l'origen "localhost" o "127.0.0.1"
+webauthn_error_unable_to_process = El servidor no ha pogut processar la vostra petició.
+webauthn_error_duplicated = La clau de seguretat no és permesa per aquesta petició. Si us plau, assegureu-vos que la clau encara no ha estat registrada.
+webauthn_error_empty = S'ha d'anomenar aquesta clau.
+webauthn_reload = Recarrega
+repository = Repositori
+organization = Organització
+mirror = Mirall
+new_repo = Nou repositori
+new_migrate = Nova migració
+new_mirror = Nou mirall
+new_fork = Nou fork d'un repositori
+new_org = Nova organització
+new_project = Nou projecte
+new_project_column = Nova columna
+admin_panel = Administració del lloc
+settings = Configuració
+your_profile = Perfil
+your_starred = Preferits
+your_settings = Configuració
+all = Tots
+sources = Fonts
+mirrors = Miralls
+collaborative = Coŀlaboratiu
+forks = Forks
+activities = Activitats
+pull_requests = Pull requests
+issues = Problemes
+milestones = Fites
+ok = OK
+retry = Reintentar
+rerun = Torna a executar
+rerun_all = Torna a executar tots els treballs
+save = Guardar
+add = Afegir
+add_all = Afegeix-los tots
+remove = Esborrar
+remove_all = Esborral's tots
+edit = Editar
+view = Mirar
+enabled = Habilitat
+disabled = Deshabilitat
+filter.public = Públic
+filter.private = Privat
+show_full_screen = Mostra a pantalla completa
+webauthn_error_timeout = Temps d'espera finalitzar abans que la seva clau pogués ser llegida. Siusplau recarregueu la pàgina i torneu-ho a intentar.
+remove_label_str = Esborra l'element "%s"
+error413 = Ha exhaurit la quota.
+cancel = Canceŀlar
+download_logs = Baixa els registres
+never = Mai
+concept_user_individual = Individual
+concept_code_repository = Repositori
+concept_user_organization = Organització
+show_timestamps = Mostra les marques temporals
+show_log_seconds = Mostra els segons
+test = Test
+locked = Bloquejat
+copy = Copiar
+copy_generic = Copiar al porta-retalls
+copy_url = Copiar l'URL
+copy_hash = Copiar l'empremta
+copy_content = Copiar continguts
+copy_branch = Copiar el nom de la branca
+copy_success = Copiat!
+copy_error = Ha fallat el copiar
+copy_type_unsupported = Aquest tipus de fitxer no pot ser copiat
+write = Escriure
+preview = Previsualitzar
+loading = Carregant…
+error = Error
+error404 = La pàgina a la que estàs intentant arribar no existeix o no estàs autoritzat a veure-la.
+go_back = Tornar Enrere
+invalid_data = Dades invalides: %v
+unknown = Desconegut
+rss_feed = Agregador RSS
+pin = Fixar
+unpin = Desfixar
+artifacts = Artefactes
+confirm_delete_artifact = Està segur de voler esborrar l'artefacte "%s"?
+archived = Arxivat
+concept_system_global = Global
+confirm_delete_selected = Confirmar esborrar tots els elements seleccionats?
+name = Nom
+value = Valor
+filter.is_mirror = És mirall
+filter.not_mirror = No és mirall
+filter.is_template = És plantilla
+filter.not_template = No és plantilla
+filter = Filtre
+filter.clear = Netejar filtes
+filter.is_archived = Arxivats
+filter.not_archived = No arxivats
+filter.not_fork = No és fork
+filter.is_fork = Són forks
+
+[search]
+milestone_kind = Cerca fites...
+fuzzy = Difusa
+search = Cerca...
+type_tooltip = Tipus de cerca
+fuzzy_tooltip = Inclou resultats que s'assemblen al terme de la cerca
+repo_kind = Cerca repos...
+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_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...
+project_kind = Cerca projectes...
+branch_kind = Cerca branques...
+commit_kind = Cerca commits...
+runner_kind = Cerca executors...
+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.
+union = Paraules clau
+union_tooltip = Inclou resultats que encaixen amb qualsevol paraula clau separada per espais
+org_kind = Cerca organitzacions...
+team_kind = Cerca teams...
+code_kind = Cerca codi...
+pull_kind = Cerca "pulls"...
+exact = Exacte
+exact_tooltip = Inclou només resultats que són exactament el terme de cerca
+issue_kind = Cerca problemes...
+
+[heatmap]
+number_of_contributions_in_the_last_12_months = %s contribucions en els últims 12 mesos
+contributions_zero = Cap contribució
+contributions_format = {contribucions} a {day} de {month} de {year}
+contributions_one = contribució
+contributions_few = contribucions
+less = Menys
+more = Més
+
+[filter]
+string.asc = A - Z
+string.desc = Z - A
+
+[error]
+occurred = Hi ha hagut un error
+report_message = Si creus que això es un bug de Forgejo, si us plau cerca problemes a Codeberg i obre'n un de nou si cal.
+not_found = L'objectiu no s'ha pogut trobar.
+server_internal = Error intern del servidor
+missing_csrf = Petició Dolenta: falta el testimoni CSRF
+invalid_csrf = Petició Dolenta: testimoni CSRF invàlid
+network_error = Error de xarxa
+
+[install]
+title = Configuració inicial
+docker_helper = Si executes Forgejo a Docker, si us plau llegeis la documentació abans de canviar qualsevol configuració.
+require_db_desc = Forgejo requereix de MySQL, PostreSQL, SQLite3 o TiDB (protocol MySQL).
+db_title = Configuració de la base de dades
+path = Ruta
+sqlite_helper = Ruta al fitxer de la base de dades SQLite3. Introduex la ruta absoluta si executes Forgejo com a servei.
+user = Nom d'usuari
+db_schema = Esquema
+ssl_mode = SSL
+err_empty_admin_email = El correu de l'administrador no pot ser buit.
+reinstall_error = Estas intentant instaŀlar sobre una base de dades existent de Forgejo
+reinstall_confirm_message = Reinstaŀlar amb una base de dades existent de Forgejo pot causar diferents problemes. En la majoria de casos, s'hauria d'utilitzar l'"app.ini" existent per executar Forgejo. Si saps el que estàs fent, confirma el seguent:
+no_admin_and_disable_registration = No pot deshabilitar l'autoregistre d'usuaris sense crear un compte d'administrador.
+err_admin_name_is_reserved = El nom d'usuari "Administrador" no es vàlid: està reservat
+smtp_addr = Hoste SMPT
+smtp_port = Port SMPT
+smtp_from = Enviar correu com a
+mailer_user = Nom d'usuari SMTP
+err_admin_name_pattern_not_allowed = El nom d'usuari de l'administrador no es vàlid: coincideix amb un patró reservat
+err_admin_name_is_invalid = El nom d'usuari "Administrador" no és vàlid
+general_title = Configuració general
+app_name = Títol de la instància
+app_url = URL base
+email_title = Configuració del correu
+server_service_title = Configuracions del servidor i de serveis de tercers
+offline_mode = Habilitar el mode local
+mail_notify = Habilita les notificacions per correu
+federated_avatar_lookup = Habilitar avatars federats
+admin_title = Configuració del compte d'administrador
+invalid_admin_setting = Configuració del compte d'administrador invalida: %v
+invalid_log_root_path = La ruta dels registres es invalida: %v
+save_config_failed = Error al guardar la confifuració: %v
+enable_update_checker_helper_forgejo = Comprovarà periodicament si hi ha una nova versió de Forgejo comprovant un registre DNS TXT a release.forgejo.org.
+password_algorithm = Funció resum per a contrasenyes
+install = Instaŀlació
+db_schema_helper = Deixa en blanc per la base de dades per defecte ("public").
+domain = Domini del servidor
+mailer_password = Contrasenya SMTP
+admin_email = Direcció de correu
+invalid_db_setting = La configuració de la base de dades és invalida: %v
+run_user_not_match = El nom d'usuari a executar com no és l'actual: %s -> %s
+internal_token_failed = Error al generar testimoni intern: %v
+secret_key_failed = Error al generar clau secreta: %v
+test_git_failed = No s'ha pogut provar l'ordre "git": %v
+sqlite3_not_available = Aquesta versióó de Forgejo no suporta SQLite3. Si us plau baixeu el binari de la versió oficial de %s (no la versió "gobuild").
+invalid_db_table = La taula "%s" de la base de dades es invalida: %v
+invalid_repo_path = L'arrel del repositori es invalida: %v
+invalid_app_data_path = La ruta de dades de l'aplicació es invalida: %v
+env_config_keys_prompt = Les seguents variables d'entorns tambe s'aplicaràn al teu fitxer de configuració:
+offline_mode.description = Deshabilitar les CDNs de tercers i servir tot el contingut de forma local.
+disable_registration.description = Només els administradors de la instància podràn crear nous usuaris. És altament recomanat deixar el registre deshabilitat excepte si s'està hostatjant una instància pública per a tothom i està llesta per a assolir grans quantitats de comptes spam.
+admin_password = Contrasenya
+err_empty_admin_password = La contrasenya de l'administrador no por ser buida.
+ssh_port = Por del servidor SSH
+disable_gravatar = Deshabilitar Gravatar
+disable_registration = Deshabilitar l'auto-registre
+openid_signin = Habilita l'inici de sessió amb OpenID
+enable_captcha = Habilita el CAPTCHA al registre
+default_keep_email_private = Amaga les direccions de correu per defecte
+app_slogan = Eslogan de la instància
+app_slogan_helper = Escriu l'eslogan de la teva instància aquí. Deixa buit per deshabilitar.
+repo_path = Ruta de l'arrel del repositori
+log_root_path_helper = Els arxius dels registres es s'escriuran en aquest directori.
+optional_title = Configuracions opcionals
+host = Hoste
+lfs_path = Ruta arreal de Git LFS
+run_user = Executar com a usuari
+domain_helper = Domini o adreça de l'hosta per al servidor.
+http_port = Port d'escolta HTTP
+app_url_helper = Adreces base per a clonació HTTP(S) i notificacions per correu.
+log_root_path = Ruta dels registres
+smtp_from_invalid = L'adreça d'"Enviar correu com a" és invalida
+smtp_from_helper = L'adreça de correu que Forgejo utilitzarà. Entri el correu en pla o en format "Nom" .
+register_confirm = Requereix confirmació de correu per a registrar-se
+disable_gravatar.description = Deshabilitar l'ús de Gravatar o d'altres serveis d'avatars de tercers. S'utilitzaran imatges per defecte per als avatars dels uauris fins que pujin el seu propi a la instància.
+federated_avatar_lookup.description = Cerca d'avatars amb Libravatar.
+allow_only_external_registration = Permet el registre només amb serveis externs
+allow_only_external_registration.description = Els usuaris nomes podràn crear nous comptes utilitzant els serveis externs configurats.
+enable_captcha.description = Requereix als usuaris passar el CAPTCHA per a poder-se crear comptes.
+require_sign_in_view = Requereix inciar sessió per a veure el contingut de la instància
+default_keep_email_private.description = Habilita l'ocultament de les direccions de correu per a nous usuaris per defecte, amb tal que aquesta informació no sigui filtrada immediatament despres de registrar-se.
+default_allow_create_organization = Per defecte permet crear organitzacions
+default_enable_timetracking = Per defecta habilita el seguiment de temps
+default_enable_timetracking.description = Per defecte activa el de seguiment de temps als nous repositoris.
+admin_name = Nom d'usuari de l'administrador
+install_btn_confirm = Instaŀlar Forgejo
+allow_dots_in_usernames = Permet als usuaris utilitzar punts en els seus noms d'usuari. No afecta als comptes existents.
+no_reply_address = Domini del correu ocult
+no_reply_address_helper = Nom del domini per a usuaris amb l'adreça de correu oculta. Per exemple, el nom d'usuari "pep" tindrà la sessió inciada com a "pep@noreply.example.org" si el domini per a adreces ocultes es configurat a "noreply.example.org".
+password_algorithm_helper = Configura la funció resum per a contrasenyes. Els algorismes difereixen en requeriments i seguretat. L'algorisme "argon2" es bastant segur, però utilitza molta memòria i podría ser inapropiat per a sistemes petits.
+invalid_password_algorithm = Funció resum invalida per a contrasenyes
+enable_update_checker = Habilita la comprovació d'actualitzacions
+env_config_keys = configuració de l'entorn
+db_type = Tipus de base de dades
+lfs_path_helper = Els arxius seguits per Git LFS es desaran en aquest directory. Deixa buit per deshabilitar.
+http_port_helper = Numero de port que utilitzarà el servidor web de Forgejo.
+repo_path_helper = Els repositoris Git remotes es desaran en aquest diectori.
+run_user_helper = El nom d'usuari del sistema operatiu sota el que Forgejo s'executa. Notis que aquest usuari ha de tenir accés a la ruta arrel del repositori.
+ssh_port_helper = Numero del port que utilitzarà el servidor SSH. Deixa buit per deshablitar el servidor SSH.
+require_sign_in_view.description = Limita l'accès al contingut per als usuaris connectats. Els visitatnts només podran veure les pàgines d'autenticació.
+default_allow_create_organization.description = Per defecte permet als nous usuaris crear organitzacions. Quan aquesta opció està deshabilitada, un administrador haurà de concedir permisos per a crear organitzacions als nous usuaris.
+reinstall_confirm_check_3 = Confirma que està completament segur que Forgejo s'està executant amb l'app.ini correcte i que està segur que ha de tornar a instaŀlar. Confirma que coneix els riscos anteriors.
+err_empty_db_path = La ruta a la base de dades SQLite3 no por ser buida.
+reinstall_confirm_check_1 = Les dades xifrades per la SECRET_KEY a l'app.ini podrien perdre's: es posible que els usuaris no puguin iniciar sessió amb 2FA/OTP i que els miralls no funcionin correctament. Marcant aquesta casella confirmes que l'arxiu app.ini conté la SECRET_KEY correcta.
+reinstall_confirm_check_2 = És possibles que els repositoris i les configuracions hagin de tornar-se a sincronitzar. Marcant aquesta casella confirmes que resincronitzaras els ganxos dels respositoris i l'arxiu authorized_keys manualment. Confirma que comprovarà que les configuracions dels repositoris i els miralls són correctes.
+openid_signin.description = Permet als usuaris iniciar sessió amb OpenID.
+openid_signup = Habilita l'auto-registre amb OpenID
+openid_signup.description = Permet als usuaris crear-se comptes amb OpenID si l'auto-registre està habilitat.
+config_location_hint = Aquestes opcions de configuració es desaràn a:
+admin_setting.description = Crear un compte d'aministrador és opcional. El primer usuari registrat automàticament serà un adminstrador.
+confirm_password = Confirmar contrasenya
+password = Contrasenya
+db_name = Nom de la base de dades
+app_name_helper = Escriu el nom de la teva instància aquí. Es mostrarà a totes les pàgines.
+
+[startpage]
+license_desc = Aconsegueix Forgejo! Uneix-te contribuint per a millorar aquest projecte. No et fagi vergonya ser un contribuent!
+platform_desc = Està confirmat que Forgejo s'executa en sistemes operatius lliures com Linux o FreeBSD, així com diferentes arquitectures de CPU. Tria la que més t'agradi!
+lightweight_desc = Forgejo te uns requeriments minims baixos i pot executar-se en una Raspberry Pi. Estalvia energia a la teva màquina!
+license = Codi Obert
+app_desc = Un servei de Git autohostatjat i indolor
+install = Fàcil d'instaŀlar
+platform = Multiplataforma
+lightweight = Lleuger
+install_desc = Simplement executa el binari per a la teva plataforma, carrega'l amb Docker, o aconsegueix-lo empaquetat.
+
+[explore]
+code_last_indexed_at = Indexat oer últim cop a %s
+relevant_repositories_tooltip = Els repositoris que són forks o que no tenen tòpic, icona o descripció estàn amagats.
+relevant_repositories = Només és mostren repositoris rellevants, mostra resultats sense filtrar.
+repos = Repositoris
+organizations = Organitzacions
+code = Codi
+stars_few = %d estrelles
+forks_one = %d fork
+forks_few = %d forks
+go_to = Ves a
+users = Usuaris
+stars_one = %d estrella
+
+[auth]
+disable_register_prompt = El registre està deshabilitat. Si us plau contacti l'administrador del lloc.
+disable_register_mail = Registre amb confirmació per correu deshabilitat.
+manual_activation_only = Contacti amb l'administrador de lloc per a completar l'activació.
+remember_me = Recordar aquest dispositiu
+create_new_account = Registrar compte
+
+[editor]
+buttons.indent.tooltip = Aniua els elements un nivell
+buttons.unindent.tooltip = Desaniuna els elements un nivell
+buttons.ref.tooltip = Referenciar un problema o una "pull request"
+buttons.heading.tooltip = Afegir capçalera
+buttons.bold.tooltip = Afegir text ressaltat
+buttons.italic.tooltip = Afegir text en cursiva
+buttons.switch_to_legacy.tooltip = En el seu lloc, utilitzar l'editor de codi antic
+buttons.quote.tooltip = Citar text
+buttons.enable_monospace_font = Habilitar la font monoespai
+buttons.disable_monospace_font = Deshabilita la font monoespai
+buttons.code.tooltip = Afegir codi
+buttons.link.tooltip = Afegir un enllaç
+buttons.list.unordered.tooltip = Afegir un llista de punts
+buttons.list.ordered.tooltip = Afegir una llista enumerada
+buttons.list.task.tooltip = Afegir una llista de tasques
+buttons.mention.tooltip = Mencionar un usuari o equip
+
+[home]
+my_orgs = Organitzacions
+show_more_repos = Mostra més repositoris…
+show_both_archived_unarchived = Mostrant ambdós arxivats i no-arxivats
+show_only_public = Mostrant només publics
+issues.in_your_repos = En els teus repositoris
+show_only_unarchived = Mostrant només no-arxivats
+show_private = Privat
+show_both_private_public = Mostrant amdós publics i privats
+show_only_private = Mostrant només privats
+filter_by_team_repositories = Filtra per respostirois d'equip
+feed_of = Canal de "%s"
+collaborative_repos = Respositoris coŀlaboratius
+show_archived = Arxivat
+view_home = Veure %s
+password_holder = Contrasenya
+switch_dashboard_context = Commuta el contexte del tauler
+my_repos = Repositoris
+show_only_archived = Mostrant només arxivats
+uname_holder = Nom d'usuari o direcció de correu
+filter = Altres filtres
+
+[aria]
+footer.software = Sobre aquest software
+footer.links = Enllaços
+navbar = Barra de navegació
+footer = Peu de pàgina
\ No newline at end of file
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index fbfde28fcd..07705d17e8 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -160,6 +160,8 @@ filter.clear = Vymazat filtry
more_items = Další položky
invalid_data = Neplatná data: %v
copy_generic = Kopírovat do schránky
+test = Test
+error413 = Vyčerpali jste svou kvótu.
[aria]
navbar=Navigační lišta
@@ -191,6 +193,8 @@ buttons.ref.tooltip=Odkázat na problém nebo žádost o sloučení
buttons.switch_to_legacy.tooltip=Použít starší editor
buttons.enable_monospace_font=Zapnout neproporcionální písmo
buttons.disable_monospace_font=Vypnout neproporcionální písmo
+buttons.unindent.tooltip = Zrušit vnoření položek pod jednu úroveň
+buttons.indent.tooltip = Vnořit položky pod jednu úroveň
[filter]
string.asc=A – Z
@@ -210,7 +214,7 @@ app_desc=Bezproblémová samostatně hostovatelná služba Git
install=Jednoduché na instalaci
install_desc=Jednoduše spusťte binární soubor pro vaši platformu, nasaďte jej pomocí Dockeru nebo si jej stáhněte jako balíček.
platform=Multiplatformní
-platform_desc=Forgejo běží na všech platformách, na které dokáže kompilovat jazyk Go: Windows, macOS, Linux, ARM, atd. Výběr je opravdu velký!
+platform_desc=Forgejo běží na svobodných operačních systémech, jako je Linux a FreeBSD, stejně jako na různých architekturách CPU. Vyberte si takovou kombinaci, jakou máte rádi!
lightweight=Lehké
lightweight_desc=Forgejo má nízké minimální požadavky a dokáže běžet i na levném Raspberry Pi. Šetřete energii vašeho stroje!
license=Open Source
@@ -406,8 +410,8 @@ allow_password_change=Vyžádat od uživatele změnu hesla (doporučeno)
reset_password_mail_sent_prompt=Na adresu %s byl zaslán potvrzovací e-mail. Zkontrolujte prosím vaši doručenou poštu během následujících %s pro dokončení procesu obnovení účtu.
active_your_account=Aktivujte si váš účet
account_activated=Účet byl aktivován
-prohibit_login=Přihlašování je zakázáno
-prohibit_login_desc=Vašemu účtu je zakázáno se přihlásit, kontaktujte prosím správce webu.
+prohibit_login=Účet je pozastaven
+prohibit_login_desc=Váš účet byl pozastaven z interakcí s instancí. Pro opětovné získání přístupu kontaktujte správce instance.
resent_limit_prompt=Omlouváme se, ale nedávno jste již požádali o zaslání aktivačního e-mailu. Počkejte prosím 3 minuty a zkuste to znovu.
has_unconfirmed_mail=Zdravíme, %s, máte nepotvrzenou e-mailovou adresu (%s). Pokud jste nedostali e-mail pro potvrzení nebo potřebujete zaslat nový, klikněte prosím na tlačítko níže.
resend_mail=Klikněte sem pro opětovné odeslání aktivačního e-mailu
@@ -463,6 +467,11 @@ change_unconfirmed_email_summary = Změna e-mailové adresy, na kterou bude odes
last_admin=Nelze odstranit posledního správce. Musí existovat alespoň jeden správce.
tab_signup = Registrace
tab_signin = Přihlášení
+hint_login = Již máte účet? Přihlaste se!
+hint_register = Nemáte účet? Zaregistrujte se nyní.
+sign_up_button = Zaregistrujte se nyní.
+back_to_sign_in = Zpět na přihlášení
+sign_in_openid = Pokračovat s OpenID
[mail]
view_it_on=Zobrazit na %s
@@ -479,7 +488,7 @@ activate_email=Ověřte vaši e-mailovou adresu
activate_email.title=%s, prosím ověřte vaši e-mailovou adresu
activate_email.text=Pro aktivaci vašeho účtu do %s klikněte na následující odkaz:
-register_notify=Vítejte v Forgejo
+register_notify_prev9=Vítejte v Forgejo
register_notify.title=%[1]s vítejte v %[2]s
register_notify.text_1=toto je váš potvrzovací e-mail pro %s!
register_notify.text_2=Do svého účtu se můžete přihlásit svým uživatelským jménem: %s
@@ -532,6 +541,21 @@ team_invite.text_3=Poznámka: Tato pozvánka byla určena pro %[1]s. Pokud jste
admin.new_user.user_info = Informace o uživateli
admin.new_user.text = Klikněte sem pro správu tohoto uživatele z administrátorského panelu.
admin.new_user.subject = Právě se zaregistroval nový uživatel %s
+totp_disabled.subject = TOTP bylo zakázáno
+password_change.subject = Vaše heslo bylo změněno
+password_change.text_1 = Heslo vašeho účtu bylo právě změněno.
+primary_mail_change.subject = Váš primární e-mail byl změněn
+primary_mail_change.text_1 = Primární e-mail vašeho účtu byl právě změněn na %[1]s. To znamená, že tato e-mailová adresa již nebude získávat e-mailová oznámení z vašeho účtu.
+totp_disabled.text_1 = Časově založené jednorázové heslo (TOTP) u vašeho účtu bylo právě zakázáno.
+totp_disabled.no_2fa = Nemáte nastavené žádné další 2FA metody, takže se již nemusíte přihlašovat do svého účtu pomocí 2FA.
+removed_security_key.subject = Byl odstraněn bezpečnostní klíč
+removed_security_key.text_1 = Bezpečnostní klíč „%[1]s“ byl právě odstraněn z vašeho účtu.
+removed_security_key.no_2fa = Nemáte nastavené žádné další 2FA metody, takže se již nemusíte přihlašovat do svého účtu pomocí 2FA.
+account_security_caution.text_1 = Pokud jste to byli vy, můžete tento e-mail v klidu ignorovat.
+account_security_caution.text_2 = Pokud jste to nebyli vy, váš účet byl kompromitován. Kontaktujte prosím správce tohoto webu.
+totp_enrolled.subject = Aktivovali jste TOTP jako metodu 2FA
+totp_enrolled.text_1.no_webauthn = Právě jste povolili TOTP u vašeho účtu. To znamená, že pro všechna budoucí přihlášení do vašeho účtu budete muset použít TOTP jako metodu 2FA.
+totp_enrolled.text_1.has_webauthn = Právě jste povolili TOTP u vašeho účtu. To znamená, že pro všechna budoucí přihlášení do vašeho účtu můžete použít TOTP jako metodu 2FA nebo použít jakýkoli z vašich bezpečnostních klíčů.
[modal]
yes=Ano
@@ -802,7 +826,7 @@ add_email_success=Nová e-mailová adresa byla přidána.
email_preference_set_success=Nastavení e-mailu bylo úspěšně nastaveno.
add_openid_success=Nová OpenID adresa byla přidána.
keep_email_private=Skrýt e-mailovou adresu
-keep_email_private_popup=Toto skryje vaši e-mailovou adresu z vašeho profilu, stejně jako při vytvoření pull requestu nebo úpravě souboru pomocí webového rozhraní. Odeslané commity nebudou změněny. Použijte %s v commitech pro jejich přiřazení k vašemu účtu.
+keep_email_private_popup=Tímto skryjete svou e-mailovou adresu ze svého profilu. Nebude již výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání a úpravy souborů, a nebude použita pro slučovací commity. Místo toho můžete použít speciální adresu %s pro spojení commitů s vaším účtem. Změna této funkce nebude mít vliv na stávající commity.
openid_desc=OpenID vám umožní delegovat ověřování na externího poskytovatele.
manage_ssh_keys=Správa klíčů SSH
@@ -1015,6 +1039,9 @@ pronouns = Zájmena
pronouns_custom = Vlastní
pronouns_unspecified = Neurčená
language.title = Výchozí jazyk
+keep_activity_private.description = Vaše veřejná aktivita bude viditelná pouze vám a správcům instance.
+language.description = Tento jazyk bude uložen do vašeho účtu a po přihlášení bude použit jako výchozí.
+language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! Více informací.
[repo]
new_repo_helper=Repozitář obsahuje všechny projektové soubory, včetně historie revizí. Už jej hostujete jinde? Migrovat repozitář.
@@ -1024,7 +1051,7 @@ repo_name=Název repozitáře
repo_name_helper=Dobrý název repozitáře většinou používá krátká, zapamatovatelná a unikátní klíčová slova.
repo_size=Velikost repozitáře
template=Šablona
-template_select=Vyberte šablonu.
+template_select=Vyberte šablonu
template_helper=Z repozitáře vytvořit šablonu
template_description=Šablony repozitářů umožňují uživatelům generovat nové repositáře se stejnou strukturou, soubory a volitelnými nastaveními.
visibility=Viditelnost
@@ -1051,17 +1078,17 @@ generate_from=Generovat z
repo_desc=Popis
repo_desc_helper=Zadejte krátký popis (volitelné)
repo_lang=Jazyk
-repo_gitignore_helper=Vyberte šablony .gitignore.
+repo_gitignore_helper=Vyberte šablony .gitignore
repo_gitignore_helper_desc=Vyberte soubory, které nechcete sledovat ze seznamu šablon pro běžné jazyky. Typické artefakty generované nástroji pro sestavení každého jazyka jsou ve výchozím stavu součástí .gitignore.
-issue_labels=Štítky problémů
-issue_labels_helper=Vyberte sadu štítků problémů.
+issue_labels=Štítky
+issue_labels_helper=Vyberte sadu štítků
license=Licence
-license_helper=Vyberte licenční soubor.
+license_helper=Vyberte licenční soubor
license_helper_desc=Licence řídí, co ostatní mohou a nemohou dělat s vaším kódem. Nejste si jisti, která je pro váš projekt správná? Podívejte se na Zvolte licenci
object_format=Formát objektu
object_format_helper=Objektový formát repozitáře. Nelze později změnit. SHA1 je nejvíce kompatibilní.
readme=README
-readme_helper=Vyberte šablonu souboru README.
+readme_helper=Vyberte šablonu souboru README
readme_helper_desc=Toto je místo, kde můžete napsat úplný popis vašeho projektu.
auto_init=Inicializovat repozitář (přidá soubory .gitignore, License a README)
trust_model_helper=Vyberte model důvěry pro ověření podpisu. Možnosti jsou:
@@ -1275,6 +1302,7 @@ view_git_blame=Zobrazit git blame
video_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „video“.
audio_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „audio“.
stored_lfs=Uloženo pomocí Git LFS
+stored_annex=Uloženo pomocí Git Annex
symbolic_link=Symbolický odkaz
executable_file=Spustitelný soubor
vendored=Vendorováno
@@ -1300,6 +1328,7 @@ editor.upload_file=Nahrát soubor
editor.edit_file=Upravit soubor
editor.preview_changes=Náhled změn
editor.cannot_edit_lfs_files=LFS soubory nemohou být upravovány přes webové rozhraní.
+editor.cannot_edit_annex_files=Annex soubory nemohou být upravovány přes webové rozhraní.
editor.cannot_edit_non_text_files=Binární soubory nemohou být upravovány přes webové rozhraní.
editor.edit_this_file=Upravit soubor
editor.this_file_locked=Soubor je uzamčen
@@ -1584,8 +1613,8 @@ issues.reopened_at=`znovu otevřel/a tento problém
issues.commit_ref_at=`odkázal/a na tento problém z commitu %[2]s`
issues.ref_issue_from=`odkázal/a na tento problém %[4]s%[2]s`
issues.ref_pull_from=`odkázal/a na tuto žádost o sloučení %[4]s%[2]s`
-issues.ref_closing_from=`odkazoval/a na žádost o sloučení %[4]s, která uzavře tento problém%[2]s`
-issues.ref_reopening_from=`odkazoval/a na žádost o sloučení %[4]s, která znovu otevře tento problém%[2]s`
+issues.ref_closing_from=`odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej uzavře, %[2]s`
+issues.ref_reopening_from=`odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej znovu otevře, %[2]s`
issues.ref_closed_from=`uzavřel/a tento problém %[4]s%[2]s`
issues.ref_reopened_from=`znovu otevřel/a tento problém %[4]s%[2]s`
issues.ref_from=`z %[1]s`
@@ -1894,7 +1923,7 @@ pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní vět
pulls.close=Zavřít žádost o sloučení
pulls.closed_at=`uzavřel/a tento požadavek na natažení %[2]s`
pulls.reopened_at=`znovuotevřel/a tento požadavek na natažení %[2]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_merge_title=Sloučit
pulls.cmd_instruction_merge_desc=Slučte změny a aktualizujte je na Gitea.
@@ -2035,7 +2064,7 @@ activity.unresolved_conv_label=Otevřít
activity.title.releases_1=%d vydání
activity.title.releases_n=%d vydání
activity.title.releases_published_by=%s publikoval %s
-activity.published_release_label=Publikováno
+activity.published_release_label=Vydání
activity.no_git_activity=V tomto období nebyla žádná aktivita při odevzdání.
activity.git_stats_exclude_merges=Při vyloučení slučování,
activity.git_stats_author_1=%d autor
@@ -2643,7 +2672,7 @@ topic.done=Hotovo
topic.count_prompt=Nelze vybrat více než 25 témat
topic.format_prompt=Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a tečky („.“) a může být dlouhé až 35 znaků. Písmena musí být malá.
-find_file.go_to_file=Přejít na soubor
+find_file.go_to_file=Najít soubor
find_file.no_matching=Nebyl nalezen žádný odpovídající soubor
error.csv.too_large=Tento soubor nelze vykreslit, protože je příliš velký.
@@ -2783,6 +2812,20 @@ pulls.edit.already_changed = Nepodařilo se uložit změny v žádosti o slouče
comments.edit.already_changed = Nepodařilo se uložit změny v komentáři. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele
subscribe.issue.guest.tooltip = Přihlaste se pro odebírání tohoto problému.
subscribe.pull.guest.tooltip = Přihlaste se pro odebírání této žádosti o sloučení.
+issues.author.tooltip.pr = Tento uživatel je autorem této žádosti o sloučení.
+issues.author.tooltip.issue = Tento uživatel je autorem tohoto problému.
+activity.commit = Aktivita commitů
+milestones.filter_sort.name = Název
+release.type_attachment = Příloha
+release.type_external_asset = Externí příloha
+release.asset_external_url = Externí URL
+release.add_external_asset = Přidat externí přílohu
+activity.published_prerelease_label = Předběžné vydání
+activity.published_tag_label = Štítek
+settings.pull_mirror_sync_quota_exceeded = Kvóta překročena, nestahuji změny.
+settings.transfer_quota_exceeded = Nový majitel (%s) překročil kvótu. Repozitář nebyl převeden.
+release.asset_name = Název přílohy
+release.invalid_external_url = Neplatná externí URL: „%s“
[graphs]
component_loading_info = Tohle může chvíli trvat…
@@ -2861,13 +2904,13 @@ members.member=Člen
members.remove=Smazat
members.remove.detail=Odstranit %[1]s z %[2]s?
members.leave=Opustit
-members.leave.detail=Opustit %s?
+members.leave.detail=Opravdu chcete opustit organizaci „%s“?
members.invite_desc=Přidat nového člena do %s:
members.invite_now=Pozvat teď
teams.join=Připojit
teams.leave=Opustit
-teams.leave.detail=Opustit %s?
+teams.leave.detail=Opravdu chcete opustit tým „%s“?
teams.can_create_org_repo=Vytvořit repozitáře
teams.can_create_org_repo_helper=Členové mohou vytvářet nové repozitáře v organizaci. Tvůrce získá přístup správce do nového repozitáře.
teams.none_access=Bez přístupu
@@ -3047,10 +3090,10 @@ users.update_profile_success=Uživatelský účet byl aktualizován.
users.edit_account=Upravit uživatelský účet
users.max_repo_creation=Maximální počet repozitářů
users.max_repo_creation_desc=(Nastavte na -1 pro použití výchozího systémového limitu.)
-users.is_activated=Uživatelský účet je aktivován
-users.prohibit_login=Zakázat přihlášení
-users.is_admin=Je správce
-users.is_restricted=Je omezený
+users.is_activated=Aktivovaný účet
+users.prohibit_login=Pozastavený účet
+users.is_admin=Účet správce
+users.is_restricted=Omezený účet
users.allow_git_hook=Může vytvářet Git hooks
users.allow_git_hook_tooltip=Git hooks jsou spouštěny jako uživatel operačního systému, pod kterým je spuštěno Forgejo, a mají stejnou úroveň přístupu k hostiteli. Výsledkem je, že uživatelé s tímto speciálním oprávněním Git hooks mohou přistupovat ke všem repozitářům Forgejo a upravovat je, stejně jako databázi používanou systémem Forgejo. V důsledku toho mohou také získat oprávnění správce systému Forgejo.
users.allow_import_local=Může importovat lokální repozitáře
@@ -3100,7 +3143,7 @@ orgs.new_orga=Nová organizace
repos.repo_manage_panel=Správa repozitářů
repos.unadopted=Nepřijaté repozitáře
-repos.unadopted.no_more=Nebyly nalezeny žádné další nepřijaté repositáře
+repos.unadopted.no_more=Nebyly nalezeny žádné nepřijaté repositáře.
repos.owner=Vlastník
repos.name=Název
repos.private=Soukromý
@@ -3471,6 +3514,20 @@ config_settings = Nastavení
auths.tip.gitlab_new = Zaregistrujte si novou aplikaci na https://gitlab.com/-/profile/applications
auths.default_domain_name = Výchozí doménové jméno použité pro e-mailovou adresu
config.app_slogan = Slogan instance
+config.cache_test_succeeded = Test mezipaměti byl úspěšný, odpověď byla obdržena za %s.
+config.cache_test = Otestovat mezipaměť
+config.cache_test_failed = Nepodařilo se prověřit mezipaměť: %v.
+config.cache_test_slow = Test mezipaměti byl úspěšný, ale odpověď byla pomalá: %s.
+users.activated.description = Dokončení ověření e-mailu. Majitel neaktivovaného účtu se nebude moci přihlásit, dokud nedokončí ověření e-mailu.
+users.block.description = Zablokovat tomuto uživateli interakci s touto službou prostřednictvím jeho účtu a zakázat mu přihlášení.
+users.restricted.description = Povolit interakci pouze s repozitáři a organizacemi, kde je uživatel přidán jako spolupracovník. Toto zamezí přístup k veřejným repozitářům na této instanci.
+users.organization_creation.description = Povolit vytváření nových organizací.
+users.local_import.description = Povolit importování repozitářů z lokálního souborového systému serveru. Toto může být bezpečnostní problém.
+users.admin.description = Udělit tomuto uživateli plný přístup ke všem administrativním funkcem dostupným ve webovém rozhraní a v rozhraní API.
+emails.delete = Odstranit e-mail
+emails.delete_desc = Opravdu chcete odstranit tuto e-mailovou adresu?
+emails.deletion_success = E-mailová adresa byla odstraněna.
+emails.delete_primary_email_error = Nemůžete odstranit primární e-mail.
[action]
create_repo=vytvořil/a repozitář %s
@@ -3715,6 +3772,22 @@ rpm.repository.multiple_groups = Tento balíček je dostupný v několika skupin
owner.settings.cargo.rebuild.description = Opětovné sestavení může být užitečné, pokud není index synchronizován s uloženými balíčky Cargo.
owner.settings.cargo.rebuild.no_index = Opětovné vytvoření selhalo, nebyl inicializován žádný index.
npm.dependencies.bundle = Přidružené závislosti
+arch.pacman.helper.gpg = Přidat certifikát důvěryhodnosti do nástroje pacman:
+arch.pacman.repo.multi = %s má stejnou verzi v různých distribucích.
+arch.pacman.repo.multi.item = Nastavení pro %s
+arch.pacman.conf = Přidejte server s odpovídající distribucí a architekturou do /etc/pacman.conf :
+arch.pacman.sync = Synchronizace balíčku nástrojem pacman:
+arch.version.properties = Vlastnosti verze
+arch.version.description = Popis
+arch.version.provides = Poskytuje
+arch.version.groups = Skupina
+arch.version.depends = Závislosti
+arch.version.optdepends = Volitelné závislosti
+arch.version.makedepends = Závislosti Make
+arch.version.checkdepends = Závislosti Check
+arch.version.conflicts = Konflikty
+arch.version.replaces = Nahrazuje
+arch.version.backup = Záloha
[secrets]
secrets=Tajné klíče
@@ -3828,6 +3901,13 @@ need_approval_desc = Potřebovat schválení pro spouštění workflowů pro ž
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 = Workflow musí obsahovat alespoň jednu úlohu
+workflow.dispatch.use_from = Použít workflow z
+workflow.dispatch.run = Spustit workflow
+workflow.dispatch.input_required = Vyžadovaná hodnota pro vstup „%s“.
+workflow.dispatch.invalid_input_type = Neplatný typ vstupu „%s“.
+workflow.dispatch.warn_input_limit = Zobrazování prvních %d vstupů.
+workflow.dispatch.trigger_found = Tento workflow má spouštěč událostí workflow_dispatch.
+workflow.dispatch.success = Žádost o spuštění workflow byla úspěšně odeslána.
[projects]
type-1.display_name=Samostatný projekt
@@ -3870,6 +3950,9 @@ exact = Přesné
exact_tooltip = Zahrnout pouze výsledky, které přesně odpovídají hledanému výrazu
issue_kind = Hledat problémy...
pull_kind = Hledat pully...
+union = Sdružené
+union_tooltip = Zahrnout výsledky, které odpovídají jakýmkoli slovům odděleným mezerami
+milestone_kind = Hledat milníky...
[markup]
filepreview.lines = Řádky %[1]d až %[2]d v souboru %[3]s
@@ -3884,3 +3967,7 @@ gib = GiB
tib = TiB
pib = PiB
eib = EiB
+
+
+[translation_meta]
+test = ok
\ No newline at end of file
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 2fdca4f1f1..b44231ddd2 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -18,8 +18,8 @@ template=Vorlage
language=Sprache
notifications=Benachrichtigungen
active_stopwatch=Aktive Zeiterfassung
-create_new=Erstellen…
-user_profile_and_more=Profil und Einstellungen…
+create_new=Erstellen …
+user_profile_and_more=Profil und Einstellungen …
signed_in_as=Angemeldet als
enable_javascript=Diese Website benötigt JavaScript.
toc=Inhaltsverzeichnis
@@ -158,6 +158,8 @@ filter.private = Privat
more_items = Mehr Einträge
invalid_data = Ungültige Daten: %v
copy_generic = In die Zwischenablage kopieren
+test = Test
+error413 = Du hast deine Quota ausgereizt.
[aria]
navbar=Navigationsleiste
@@ -189,6 +191,8 @@ buttons.ref.tooltip=Issue oder Pull-Request referenzieren
buttons.switch_to_legacy.tooltip=Legacy-Editor verwenden
buttons.enable_monospace_font=Festbreitenschrift aktivieren
buttons.disable_monospace_font=Festbreitenschrift deaktivieren
+buttons.indent.tooltip = Einträge um eine Ebene verschachteln
+buttons.unindent.tooltip = Einträge um eine Ebene entschachteln
[filter]
string.asc=A–Z
@@ -208,11 +212,11 @@ app_desc=Ein einfacher, selbst gehosteter Git-Service
install=Einfach zu installieren
install_desc=Starte einfach die Anwendung für deine Plattform oder nutze Docker. Es existieren auch paketierte Versionen.
platform=Plattformübergreifend
-platform_desc=Forgejo läuft überall, wo Go kompiliert: Windows, macOS, Linux, ARM, etc. Wähle das System, das dir am meisten gefällt!
+platform_desc=Forgejo läuft auf freien Betriebssystemen wie Linux und FreeBSD, sowie auf verschiedenen CPU-Architekturen. Wähle das System, das du magst!
lightweight=Leichtgewichtig
lightweight_desc=Forgejo hat minimale Systemanforderungen und kann selbst auf einem günstigen und stromsparenden Raspberry Pi betrieben werden!
license=Quelloffen
-license_desc=Hole dir Forgejo! Tritt uns bei, indem du uns hilfst, dieses Projekt noch besser zu gestalten. Scheue dich nicht davor, bei uns mitzuwirken!
+license_desc=Hole dir Forgejo! Schließ dich uns an, indem du uns hilfst, dieses Projekt noch besser zu gestalten. Scheue dich nicht davor, bei uns mitzuwirken!
[install]
install=Installation
@@ -233,7 +237,7 @@ sqlite_helper=Dateipfad zur SQLite3-Datenbank. Gib einen absoluten Pfad an, w
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_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 Repositories 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.
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.
@@ -291,8 +295,8 @@ enable_captcha=Registrierungs-Captcha aktivieren
enable_captcha.description=Eine Captcha-Eingabe bei der Benutzerselbstregistrierung verlangen.
require_sign_in_view=Ansehen erfordert Anmeldung
require_sign_in_view.description=Seitenzugriff auf angemeldete Benutzer beschränken. Besucher sehen nur die Anmelde- und Registrierungsseite.
-admin_setting.description=Das Erstellen eines Administrator-Kontos ist optional. Der erste registrierte Benutzer wird automatisch Administrator.
-admin_title=Administratoreinstellungen
+admin_setting.description=Das Erstellen eines Administratorkontos ist optional. Der erste registrierte Benutzer wird automatisch Administrator.
+admin_title=Administratorkonto-Einstellungen
admin_name=Administrator-Benutzername
admin_password=Passwort
confirm_password=Passwort bestätigen
@@ -403,8 +407,8 @@ allow_password_change=Verlange vom Benutzer das Passwort zu ändern (empfohlen)
reset_password_mail_sent_prompt=Eine Bestätigungs-E-Mail wurde an %s gesendet. Bitte überprüfe dein Postfach innerhalb von %s, um den Wiederherstellungsprozess abzuschließen.
active_your_account=Aktiviere dein Konto
account_activated=Konto wurde aktiviert
-prohibit_login=Anmelden verboten
-prohibit_login_desc=Die Anmeldung mit diesem Konto ist nicht gestattet. Bitte kontaktiere den Administrator.
+prohibit_login=Der Account ist gesperrt
+prohibit_login_desc=Dein Account ist auf dieser Instanz gesperrt worden. Bitte kontaktiere den Instanz-Administrator.
resent_limit_prompt=Du hast bereits eine Aktivierungs-E-Mail angefordert. Bitte warte 3 Minuten und probiere es dann nochmal.
has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (%s). Wenn du keine Bestätigungs-E-Mail erhalten hast oder eine neue senden möchtest, klicke bitte auf den folgenden Button.
resend_mail=Aktivierungs-E-Mail erneut verschicken
@@ -461,6 +465,11 @@ change_unconfirmed_email = Wenn du bei der Anmeldung eine falsche E-Mail-Adresse
remember_me.compromised = Der Anmeldetoken ist nicht mehr gültig, dies könnte auf ein kompromittiertes Konto hindeuten. Bitte prüfe dein Konto auf ungewöhnliche Aktivitäten.
tab_signin = Anmelden
tab_signup = Registrieren
+sign_up_button = Jetzt registrieren.
+back_to_sign_in = Zurück zur Anmeldung
+sign_in_openid = Mit OpenID fortfahren
+hint_login = Hast du bereits ein Konto? Jetzt anmelden!
+hint_register = Brauchst du ein Konto? Jetzt registrieren.
[mail]
view_it_on=Auf %s ansehen
@@ -477,10 +486,10 @@ activate_email=Bestätige deine E-Mail-Adresse
activate_email.title=%s, bitte verifiziere deine E-Mail-Adresse
activate_email.text=Bitte klicke innerhalb von %s auf folgenden Link, um dein Konto zu aktivieren:
-register_notify=Willkommen bei Forgejo
+register_notify_prev9=Willkommen bei Forgejo
register_notify.title=%[1]s, willkommen bei %[2]s
register_notify.text_1=dies ist deine Bestätigungs-E-Mail für %s!
-register_notify.text_2=Du kannst dich mit dem Benutzernamen „%s“ anmelden.
+register_notify.text_2=Du kannst dich mit dem Benutzernamen „%s“ anmelden
register_notify.text_3=Wenn jemand anderes diesen Account für dich erstellt hat, musst du zuerst dein Passwort setzen.
reset_password=Stelle dein Konto wieder her
@@ -530,6 +539,22 @@ team_invite.text_3=Hinweis: Diese Einladung war für %[1]s gedacht. Wenn du dies
admin.new_user.subject = Neuer Benutzer %s hat sich gerade angemeldet
admin.new_user.user_info = Benutzerinformationen
admin.new_user.text = Bitte hier klicken, um den Benutzer aus dem Admin-Panel zu verwalten.
+password_change.subject = Dein Passwort wurde geändert
+password_change.text_1 = Das Passwort für deinen Account wurde soeben geändert.
+primary_mail_change.subject = Deine primäre E-Mail-Adresse wurde geändert
+totp_disabled.subject = TOTP wurde deaktiviert
+totp_disabled.text_1 = TOTP (Time-based one-time password [Zeitbasiertes Einmalpasswort]) wurde auf deinem Account soeben deaktiviert.
+totp_disabled.no_2fa = Es sind keine anderen 2FA-Methoden mehr konfiguriert, was bedeutet, dass es nicht mehr nötig ist, sich in deinen Account mit 2FA einzuloggen.
+removed_security_key.subject = Ein Sicherheitsschlüssel wurde entfernt
+removed_security_key.no_2fa = Es sind keine anderen 2FA-Methoden mehr konfiguriert, was bedeutet, dass es nicht mehr nötig ist, sich in deinen Account mit 2FA einzuloggen.
+account_security_caution.text_1 = Wenn du das warst, kannst du diese E-Mail bedenkenlos ignorieren.
+removed_security_key.text_1 = Sicherheitsschlüssel „%[1]s“ wurde soeben von deinem Account entfernt.
+reset_password.text_1 = Das Passwort für deinen Account wurde soeben geändert.
+primary_mail_change.text_1 = Die primäre E-Mail-Adresse deines Account wurde soeben zu %[1]s geändert. Das bedeutet, dass diese E-Mail-Adresse keine E-Mail-Benachrichtigungen für deinen Account erhalten wird.
+account_security_caution.text_2 = Wenn du das nicht warst, wurde dein Account kompromittiert. Bitte kontaktiere die Admins dieser Webseite.
+totp_enrolled.subject = Du hast TOTP als 2FA-Methode aktiviert
+totp_enrolled.text_1.has_webauthn = Du hast gerade eben TOTP für deinen Account aktiviert. Das bedeutet, dass du in Zukunft für alle Logins in deinen Account TOTP als 2FA-Methode benutzen könntest, oder einen deiner Sicherheitsschlüssel.
+totp_enrolled.text_1.no_webauthn = Du hast gerade eben TOTP für deinen Account aktiviert. Das bedeutet, dass du in Zukunft für alle Logins in deinen Account TOTP als 2FA-Methode benutzen musst.
[modal]
yes=Ja
@@ -668,12 +693,12 @@ form.name_reserved=Der Benutzername „%s“ ist reserviert.
form.name_pattern_not_allowed=Das Muster „%s“ ist nicht in einem Benutzernamen erlaubt.
form.name_chars_not_allowed=Benutzername „%s“ enthält ungültige Zeichen.
block_user = Benutzer blockieren
-block_user.detail = Bitte beachte, dass andere Maßnahmen ergriffen werden, wenn du diesen Benutzer blockierst, wie:
-block_user.detail_2 = Dieser Benutzer kann nicht mit deinem Repository, erstellten Issues und Kommentaren interagieren.
-block_user.detail_1 = Dieser Benutzer folgt dir nicht mehr.
+block_user.detail = Bitte beachte, dass die Blockierung eines Benutzers auch andere Auswirkungen hat, so wie:
+block_user.detail_2 = Dieser Benutzer wird nicht mehr nicht mit deinen Repositorys oder von dir erstellten Issues und Kommentaren interagieren können.
+block_user.detail_1 = Ihr werdet euch nicht mehr gegenseitig folgen und könnt euch auch nicht mehr gegenseitig folgen.
block = Blockieren
follow_blocked_user = Du kannst diesen Benutzer nicht folgen, weil du ihn blockiert hast, oder er dich blockiert hat.
-block_user.detail_3 = Dieser Benutzer kann dich nicht als einen Mitarbeiter hinzufügen, und du kannst ihn nicht als Mitarbeiter hinzufügen.
+block_user.detail_3 = Ihr werdet nicht mehr in der Lage sein, euch gegenseitig als Repository-Mitarbeiter hinzuzufügen.
unblock = Nicht mehr blockieren
followers_one = %d Follower
following_one = %d Folge ich
@@ -681,6 +706,10 @@ followers.title.few = Follower
following.title.one = Folgt
following.title.few = Folgt
followers.title.one = Follower
+public_activity.visibility_hint.self_public = Deine Aktivität ist sichtbar für alle, außer für Interaktionen in privaten Räumen. Konfigurieren.
+public_activity.visibility_hint.admin_public = Diese Aktivität ist sichtbar für alle, aber als Administrator kannst du außerdem Interaktionen in privaten Räumen sehen.
+public_activity.visibility_hint.self_private = Deine Aktivität ist nur sichtbar für dich und den Instanzadministratoren. Konfigurieren.
+public_activity.visibility_hint.admin_private = Diese Aktivität ist sichtbar für dich, weil du ein Administrator bist, aber der Benutzer will sie privat halten.
[settings]
profile=Profil
@@ -795,7 +824,7 @@ add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt.
email_preference_set_success=E-Mail-Einstellungen wurden erfolgreich aktualisiert.
add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt.
keep_email_private=E-Mail-Adresse verbergen
-keep_email_private_popup=Dies wird deine E-Mail-Adresse nicht nur in deinem Profil ausblenden, sondern auch, wenn du einen Pull Request erstellst oder eine Datei über das Web-Interface bearbeitest. Gepushte Commits werden nicht geändert. Benutze %s in Commits, um sie mit deinem Konto zu assoziieren.
+keep_email_private_popup=Dies wird deine E-Mail-Adresse in deinem Profil ausblenden. Sie wird nicht mehr der Standardwert für die Commits, die vom Web-Interface gemacht wurden, sein, z.B. Dateiuploads und -bearbeitungen, und sie wird nicht für Merge-Commits benutzt werden. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Konto zu assoziieren. Beachte, dass diese Option für existierende Commits keine Wirkung hat.
openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren.
manage_ssh_keys=SSH-Schlüssel verwalten
@@ -1008,6 +1037,9 @@ pronouns = Pronomen
pronouns_custom = Eigene
pronouns_unspecified = Nicht spezifiziert
language.title = Standardsprache
+keep_activity_private.description = Deine öffentliche Aktivität wird nur für dich selbst und die Instanzadminstratoren sichtbar sein.
+language.localization_project = Hilf uns, Forgejo in deine Sprache zu übersetzen! Mehr erfahren.
+language.description = Diese Sprache wird in deinem Konto gespeichert und standardmäßig nach dem Anmelden benutzt.
[repo]
owner=Besitzer
@@ -1016,7 +1048,7 @@ repo_name=Repository-Name
repo_name_helper=Ein guter Repository-Name besteht normalerweise aus kurzen, unvergesslichen und einzigartigen Schlagwörtern.
repo_size=Repository-Größe
template=Vorlage
-template_select=Vorlage auswählen.
+template_select=Wähle eine Vorlage
template_helper=Repository zu einer Vorlage machen
template_description=Vorlagenrepositorys erlauben es Benutzern, neue Repositorys mit den gleichen Verzeichnisstrukturen, Dateien und optionalen Einstellungen zu erstellen.
visibility=Sichtbarkeit
@@ -1043,15 +1075,15 @@ generate_from=Erstelle aus
repo_desc=Beschreibung
repo_desc_helper=Gib eine kurze Beschreibung an (optional)
repo_lang=Sprache
-repo_gitignore_helper=.gitignore-Vorlagen auswählen.
+repo_gitignore_helper=Wähle .gitignore-Vorlagen aus
repo_gitignore_helper_desc=Wähle aus einer Liste an Vorlagen für bekannte Sprachen, welche Dateien ignoriert werden sollen. Typische Artefakte, die durch die Build-Tools der gewählten Sprache generiert werden, sind standardmäßig Bestandteil der .gitignore.
-issue_labels=Issue-Labels
-issue_labels_helper=Wähle eine Issue-Label-Sammlung.
+issue_labels=Labels
+issue_labels_helper=Wähle eine Label-Sammlung
license=Lizenz
-license_helper=Wähle eine Lizenz aus.
-license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe Choose a license..
+license_helper=Wähle eine Lizenz
+license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe Choose a license.
readme=README
-readme_helper=Wähle eine README-Vorlage aus.
+readme_helper=Wähle eine README-Vorlage
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben.
auto_init=Repository initialisieren (Fügt .gitignore, License und README-Dateien hinzu)
trust_model_helper=Wähle das Vertrauensmodell für die Signaturvalidierung aus. Mögliche Modelle sind:
@@ -1126,7 +1158,7 @@ template.webhooks=Webhooks
template.topics=Themen
template.avatar=Profilbild
template.issue_labels=Issue-Labels
-template.one_item=Es muss mindestens eine Vorlage ausgewählt werden
+template.one_item=Es muss mindestens eine Vorlagenelement ausgewählt werden
template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden
archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber nicht pushen oder Issues/Pull-Requests öffnen.
@@ -1265,6 +1297,8 @@ view_git_blame=Git Blame ansehen
video_not_supported_in_browser=Dein Browser unterstützt das HTML5-„video“-Tag nicht.
audio_not_supported_in_browser=Dein Browser unterstützt das HTML5-„audio“-Tag nicht.
stored_lfs=Gespeichert mit Git LFS
+stored_annex=Gespeichert mit Git Annex
+stored_annex_not_present = hier nicht vorhanden, versuche git annex whereis
symbolic_link=Softlink
executable_file=Ausführbare Datei
commit_graph=Commit-Graph
@@ -1288,6 +1322,7 @@ editor.upload_file=Datei hochladen
editor.edit_file=Datei bearbeiten
editor.preview_changes=Vorschau der Änderungen
editor.cannot_edit_lfs_files=LFS-Dateien können im Webinterface nicht bearbeitet werden.
+editor.cannot_edit_annex_files=Annex-Dateien können im Webinterface nicht bearbeitet werden.
editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden.
editor.edit_this_file=Datei bearbeiten
editor.this_file_locked=Datei ist gesperrt
@@ -1489,8 +1524,8 @@ issues.remove_assignee_at=`wurde von %s von der Zuweisung %s befreit`
issues.remove_self_assignment=`hat die Selbstzuweisung %s entfernt`
issues.change_title_at=`hat den Titel von %s zu %s %s geändert`
issues.change_ref_at=`hat die Referenz von %s zu %s %s geändert`
-issues.remove_ref_at=`hat die Referenz %s entfernt %s`
-issues.add_ref_at=`hat die Referenz %s hinzugefügt %s`
+issues.remove_ref_at=`hat die Referenz %s %s entfernt`
+issues.add_ref_at=`hat die Referenz %s %s hinzugefügt`
issues.delete_branch_at=`löschte den Branch %s %s`
issues.filter_label=Label
issues.filter_label_exclude=`Alt + Klick/Enter verwenden, um Labels auszuschließen`
@@ -1572,8 +1607,8 @@ issues.reopened_at=`hat dieses Issue %[2]s wiede
issues.commit_ref_at=`hat dieses Issue %[2]s aus einem Commit referenziert`
issues.ref_issue_from=`hat%[2]sauf dieses Issue verwiesen %[4]s`
issues.ref_pull_from=`hat%[2]sauf diesen Pull-Request verwiesen %[4]s`
-issues.ref_closing_from=`hat%[2]sauf einen Pull-Request %[4]s verwiesen, welcher das Issue schließen wird`
-issues.ref_reopening_from=`hat auf einen Pull-Request %[4]s verwiesen, welcher das Issue%[2]s erneut öffnen wird`
+issues.ref_closing_from=`hat%[2]sin einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es schließen wird`
+issues.ref_reopening_from=`hat%[2]s in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es erneut öffnen wird`
issues.ref_closed_from=`hat dieses Issue %[4]s geschlossen%[2]s`
issues.ref_reopened_from=`hat dieses Issue %[4]s%[2]s wieder geöffnet`
issues.ref_from=`von %[1]s`
@@ -2019,7 +2054,7 @@ activity.unresolved_conv_label=Offen
activity.title.releases_1=%d Release
activity.title.releases_n=%d Releases
activity.title.releases_published_by=%s von %s veröffentlicht
-activity.published_release_label=Veröffentlicht
+activity.published_release_label=Release
activity.no_git_activity=In diesem Zeitraum hat es keine Commit-Aktivität gegeben.
activity.git_stats_exclude_merges=Von Merges abgesehen, gilt:
activity.git_stats_author_1=%d Autor
@@ -2371,8 +2406,8 @@ settings.protect_whitelist_users=Nutzer, die pushen dürfen:
settings.protect_whitelist_search_users=Benutzer suchen …
settings.protect_whitelist_teams=Teams, die pushen dürfen:
settings.protect_whitelist_search_teams=Teams suchen …
-settings.protect_merge_whitelist_committers=Merge-Whitelist aktivieren
-settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist, Pull-Requests in diesen Branch zusammenzuführen.
+settings.protect_merge_whitelist_committers=Merge-Positivliste aktivieren
+settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Positivliste, Pull-Requests in diesen Branch zusammenzuführen.
settings.protect_merge_whitelist_users=Nutzer, die zusammenführen dürfen:
settings.protect_merge_whitelist_teams=Teams, die zusammenführen dürfen:
settings.protect_check_status_contexts=Statusprüfung aktivieren
@@ -2385,10 +2420,10 @@ settings.protect_invalid_status_check_pattern=Ungültiges Statusprüfungspattern
settings.protect_no_valid_status_check_patterns=Keine gültigen Statuscheck-Muster.
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_approvals_whitelist_enabled=Genehmigungen auf Benutzer oder Teams auf der Whitelist beschränken
-settings.protect_approvals_whitelist_enabled_desc=Nur Reviews von Benutzern auf der Whitelist oder Teams zählen zu den erforderlichen Genehmigungen. Existiert keine Whitelist, so zählen Reviews von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen.
-settings.protect_approvals_whitelist_users=Reviewer auf der Whitelist:
-settings.protect_approvals_whitelist_teams=Für Reviews gewhitelistete Teams:
+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_users=Nutzer, die reviewen dürfen:
+settings.protect_approvals_whitelist_teams=Teams, die reviewen dürfen:
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.require_signed_commits=Signierte Commits erforderlich
@@ -2677,7 +2712,7 @@ commits.browse_further = Weiter browsen
pulls.nothing_to_compare_have_tag = Der gewählte Branch/Tag ist gleich.
pulls.status_checks_hide_all = Alle Prüfungen verbergen
pulls.status_checks_show_all = Alle Prüfungen anzeigen
-pulls.cmd_instruction_hint = `Anweisungen für die Kommandozeile betrachten.`
+pulls.cmd_instruction_hint = Anweisungen für die Kommandozeile betrachten
pulls.cmd_instruction_checkout_title = Auschecken
wiki.cancel = Abbrechen
settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten
@@ -2750,7 +2785,7 @@ settings.transfer.button = Besitz übertragen
settings.transfer.modal.title = Besitz übertragen
wiki.no_search_results = Keine Ergebnisse
wiki.search = Wiki durchsuchen
-n_release_one = %s freigegebn
+n_release_one = %s freigegeben
n_release_few = %s Veröffentlichungen
form.string_too_long = Die Zeichenkette ist länger als %d Zeichen.
settings.federation_settings = Föderationseinstellungen
@@ -2763,6 +2798,20 @@ issues.edit.already_changed = Die Änderungen an diesem Issue können nicht gesp
pulls.edit.already_changed = Die Änderungen an diesem Pull-Request können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben
subscribe.pull.guest.tooltip = Einloggen, um diesen Pull-Request zu abbonieren.
subscribe.issue.guest.tooltip = Einloggen, um dieses Issue zu abbonieren.
+issues.author.tooltip.pr = Dieser Benutzer ist der Autor dieses Pull-Requests.
+issues.author.tooltip.issue = Dieser Benutzer ist der Autor dieses Issues.
+activity.commit = Commit-Aktivität
+milestones.filter_sort.name = Name
+release.type_attachment = Anhang
+release.type_external_asset = Externes Asset
+release.asset_name = Asset-Name
+release.asset_external_url = Externe URL
+release.add_external_asset = Externes Asset hinzufügen
+release.invalid_external_url = Ungültige externe URL: „%s“
+activity.published_prerelease_label = Pre-Release
+activity.published_tag_label = Tag
+settings.pull_mirror_sync_quota_exceeded = Quota überschritten, Änderungen werden nicht gepullt.
+settings.transfer_quota_exceeded = Der neue Eigentümer (%s) hat die Quota überschritten. Das Repository wurde nicht übertragen.
[graphs]
@@ -2834,13 +2883,13 @@ members.member=Mitglied
members.remove=Entfernen
members.remove.detail=%[1]s aus %[2]s entfernen?
members.leave=Verlassen
-members.leave.detail=%s verlassen?
+members.leave.detail=Bist du dir sicher, dass du die Organisation „%s“ verlassen willst?
members.invite_desc=Neues Mitglied zu %s hinzufügen:
members.invite_now=Jetzt einladen
teams.join=Beitreten
teams.leave=Verlassen
-teams.leave.detail=%s verlassen?
+teams.leave.detail=Bist du dir sicher, dass du das Team „%s“ verlassen willst?
teams.can_create_org_repo=Repositorys erstellen
teams.can_create_org_repo_helper=Mitglieder können neue Repositorys in der Organisation erstellen. Der Ersteller erhält Administrator-Zugriff auf das neue Repository.
teams.none_access=Kein Zugriff
@@ -2948,7 +2997,7 @@ dashboard.update_migration_poster_id=Migration Poster-IDs updaten
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_sshprincipals=Aktualisiere die Datei „.ssh/authorized_principals“ mit Forgejo-SSH-Principals.
-dashboard.resync_all_hooks=Die „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut synchronisieren.
+dashboard.resync_all_hooks=Die „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut synchronisieren
dashboard.reinit_missing_repos=Alle Git-Repositorys neu einlesen, für die Einträge existieren
dashboard.sync_external_users=Externe Benutzerdaten synchronisieren
dashboard.cleanup_hook_task_table=Hook-Task-Tabelle bereinigen
@@ -3021,10 +3070,10 @@ users.update_profile_success=Das Benutzerkonto wurde aktualisiert.
users.edit_account=Benutzerkonto bearbeiten
users.max_repo_creation=Maximale Anzahl an Repositorys
users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwenden.)
-users.is_activated=Account ist aktiviert
-users.prohibit_login=Anmelden deaktivieren
-users.is_admin=Ist Administrator
-users.is_restricted=Ist eingeschränkt
+users.is_activated=Aktivierter Account
+users.prohibit_login=Gesperrter Account
+users.is_admin=Administrator-Account
+users.is_restricted=Eingeschränkter Account
users.allow_git_hook=Kann Git-Hooks erstellen
users.allow_git_hook_tooltip=Git-Hooks werden mit denselben Benutzer-Rechten ausgeführt, mit denen Forgejo läuft, und haben die gleiche Ebene von Host-Zugriff. Dadurch können Benutzer mit diesen speziellen Git-Hook-Rechten auf alle Forgejo-Repositorys sowie auf die von Forgejo verwendete Datenbank zugreifen und diese ändern. Auch das Erhalten von Administratorrechten für Forgejo ist möglich.
users.allow_import_local=Kann lokale Repositorys importieren
@@ -3073,7 +3122,7 @@ orgs.new_orga=Neue Organisation
repos.repo_manage_panel=Repositorys verwalten
repos.unadopted=Nicht übernommene Repositorys
-repos.unadopted.no_more=Keine weiteren nicht übernommenen Repositorys gefunden
+repos.unadopted.no_more=Keine nicht übernommenen Repositorys gefunden.
repos.owner=Besitzer
repos.name=Name
repos.private=Privat
@@ -3434,6 +3483,20 @@ config_summary = Zusammenfassung
auths.tip.gitlab_new = Registriere eine neue Anwendung auf https://gitlab.com/-/profile/applications
auths.default_domain_name = Standarddomainname, der für die E-Mail-Adresse benutzt wird
config.app_slogan = Instanz-Slogan
+config.cache_test_failed = Konnte den Cache nicht untersuchen: %v.
+config.cache_test_succeeded = Cache-Test erfolgreich, eine Antwort erhalten in %s.
+config.cache_test = Cache testen
+config.cache_test_slow = Cache-Test erfolgreich, aber die Antwort ist langsam: %s.
+users.block.description = Interaktionen mit diesen Dienst für diesen Benutzer mit seinem Account blockierten und Einloggen verhindern.
+users.restricted.description = Nur Interaktionen mit den Repositorys und Organisationen erlauben, wo der Benutzer als Mitarbeiter hinzugefügt wurde. Dies verhindert Zugriff auf öffentliche Repositorys in dieser Instanz.
+users.local_import.description = Import von Repositorys aus dem lokalen Dateisystem des Servers erlauben. Dies kann ein Sicherheitsproblem sein.
+users.organization_creation.description = Erstellung neuer Organisationen erlauben.
+users.activated.description = Abschluss der E-Mail-Verifizierung. Der Besitzer eines nicht aktivierten Accounts wird nicht in der Lage sein, sich einzuloggen, bis die E-Mail-Verifikation abgeschlossen wurde.
+users.admin.description = Diesen Benutzer vollständigen Zugriff zu allen administrativen Features gewähren mittels der Web-UI und der API.
+emails.delete = E-Mail löschen
+emails.deletion_success = Die E-Mail-Adresse wurde gelöscht.
+emails.delete_primary_email_error = Du kannst die primäre E-Mail nicht löschen.
+emails.delete_desc = Bist du dir sicher, dass du diese E-Mail-Adresse löschen willst?
[action]
@@ -3516,7 +3579,7 @@ error.generate_hash=Es konnte kein Hash vom Commit generiert werden
error.no_committer_account=Es ist kein Account mit der E-Mail-Adresse des Committers verbunden
error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
error.not_signed_commit=Kein signierter Commit
-error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Kontos
+error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Schlüssels des Committer-Kontos
error.probable_bad_signature=WARNHINWEIS! Obwohl ein Schlüssel mit dieser ID in der Datenbank existiert, verifiziert er nicht diesen Commit! Dieser Commit ist VERDÄCHTIG.
error.probable_bad_default_signature=WARNHINWEIS! Obwohl der Standardschlüssel diese ID hat, verifiziert er nicht diesen Commit! Dieser Commit ist VERDÄCHTIG.
@@ -3550,7 +3613,7 @@ details.project_site=Projektwebseite
details.repository_site=Repository-Webseite
details.documentation_site=Dokumentationswebseite
details.license=Lizenz
-assets=Dateien
+assets=Assets
versions=Versionen
versions.view_all=Alle anzeigen
dependency.id=ID
@@ -3680,6 +3743,22 @@ rpm.repository.multiple_groups = Dieses Paket ist in mehreren Gruppen verfügbar
rpm.repository.architectures = Architekturen
owner.settings.cargo.rebuild.no_index = Kann nicht erneut erzeugen, es wurde kein Index initialisiert.
npm.dependencies.bundle = Gebündelte Abhängigkeiten
+arch.pacman.helper.gpg = Trust-Zertifikat für pacman hinzufügen:
+arch.pacman.repo.multi = %s hat die gleiche Version in verschiedenen Distributionen.
+arch.pacman.repo.multi.item = Konfiguration für %s
+arch.pacman.conf = Server mit verwandter Distribution und Architektur zu /etc/pacman.conf hinzufügen:
+arch.pacman.sync = Paket mit pacman synchronisieren:
+arch.version.properties = Versionseigenschaften
+arch.version.description = Beschreibung
+arch.version.provides = Bietet
+arch.version.groups = Gruppe
+arch.version.depends = Hängt ab von
+arch.version.makedepends = Make-Abhängigkeit
+arch.version.checkdepends = Check-Abhängigkeit
+arch.version.conflicts = Konflikte
+arch.version.replaces = Ersetzt
+arch.version.backup = Backup
+arch.version.optdepends = Optionale Abhängigkeit
[secrets]
secrets=Secrets
@@ -3790,6 +3869,13 @@ variables.id_not_exist = Variable mit ID %d existiert nicht.
runs.workflow = Workflow
runs.no_job_without_needs = Der Workflow muss mindestens einen Job ohne Abhängigkeiten enthalten.
runs.no_job = Der Workflow muss mindestens einen Job enthalten
+workflow.dispatch.use_from = Workflow benutzen von
+workflow.dispatch.run = Workflow ausführen
+workflow.dispatch.input_required = Wert für Eingabe „%s“ erfordern.
+workflow.dispatch.invalid_input_type = Ungültiger Eingabetyp „%s“.
+workflow.dispatch.warn_input_limit = Es werden nur die ersten %d Eingaben angezeigt.
+workflow.dispatch.trigger_found = Dieser Workflow hat einen workflow_dispatch-Event-Trigger.
+workflow.dispatch.success = Ausführung des Workflows wurde erfolgreich angefragt.
[projects]
type-1.display_name=Individuelles Projekt
@@ -3836,12 +3922,15 @@ commit_kind = Commits suchen …
runner_kind = Runners suchen …
no_results = Keine passenden Ergebnisse gefunden.
code_search_unavailable = Die Code-Suche ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator.
-keyword_search_unavailable = Suche nach Schlüsselwörtern ist momentan nicht unterstüzt. Bitte kontaktiere den Webseitenadministrator.
+keyword_search_unavailable = Die Suche mittels Schlüsselwort ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator.
code_search_by_git_grep = Die derzeitigen Codesuchergebnisse werden durch „git grep“ bereitgestellt. Es könnten bessere Ergebnisse erzielt werden, wenn der Administrator die Repository-Indizierung aktiviert.
exact = Exakt
exact_tooltip = Nur Ergebnisse einbinden, die auf den exakten Suchbegriff passen
issue_kind = Issues durchsuchen …
pull_kind = Pulls durchsuchen …
+union = Vereinigungsmenge
+union_tooltip = Ergebnisse, die auf ein beliebiges von den Whitespace getrennten Schlüsselwörtern passen, einbinden
+milestone_kind = Meilensteine suchen …
[markup]
filepreview.line = Zeile %[1]d in %[2]s
@@ -3856,3 +3945,7 @@ tib = TiB
pib = PiB
mib = MiB
eib = EiB
+
+
+[translation_meta]
+test = ok
\ No newline at end of file
diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini
index fb15b5b453..4e685f3cf6 100644
--- a/options/locale/locale_el-GR.ini
+++ b/options/locale/locale_el-GR.ini
@@ -87,7 +87,7 @@ rerun=Επανεκτέλεση
rerun_all=Επανεκτέλεση όλων
save=Αποθήκευση
add=Προσθήκη
-add_all=Προσθήκη Όλων
+add_all=Προσθήκη όλων
remove=Αφαίρεση
remove_all=Αφαίρεση όλων
remove_label_str=Αφαίρεση αντικειμένου «%s»
@@ -154,12 +154,14 @@ filter.not_fork = Εξαίρεση fork
filter.is_mirror = Είδωλα
filter.not_mirror = Εξαίρεση ειδώλων
filter.not_template = Εξαίρεση προτύπων
-filter.is_fork = Forked
+filter.is_fork = Forks
more_items = Περισσότερα αντικείμενα
invalid_data = Τα δεδομένα δεν είναι έγκυρα: %v
+test = Τεστ
+copy_generic = Αντιγραφή στο πρόχειρο
[aria]
-navbar=Γραμμή Πλοήγησης
+navbar=Μπάρα πλοήγησης
footer=Υποσέλιδο
footer.software=Σχετικά με το Λογισμικό
footer.links=Συνδέσεις
@@ -244,7 +246,7 @@ err_admin_name_is_invalid=Το Όνομα Χρήστη του Διαχειρισ
general_title=Γενικές ρυθμίσεις
app_name=Τίτλος διακομιστή
-app_name_helper=Μπορείτε να εισάγετε το όνομα της εταιρείας σας εδώ.
+app_name_helper=Γράψτε το όνομα του διακομιστή σας εδώ. Θα εμφανίζεται σε κάθε σελίδα.
repo_path=Τοποθεσία αρχείων αποθετηρίων
repo_path_helper=Τα απομακρυσμένα αποθετήρια Git θα αποθηκεύονται σε αυτόν τον κατάλογο.
lfs_path=Τοποθεσία αρχείων Git LFS
@@ -274,22 +276,22 @@ register_confirm=Να απαιτείται η επιβεβαίωση της δι
mail_notify=Ενεργοποίηση ειδοποιήσεων email
server_service_title=Ρυθμίσεις διακομιστή και υπηρεσιών τρίτων
offline_mode=Ενεργοποίηση τοπικής λειτουργίας
-offline_mode.description=Απενεργοποιήση των δικτύων διανομής περιεχομένου τρίτων και σερβίρετε όλων των πόρων τοπικά.
+offline_mode.description=Τα CDN τρίτων θα απενεργοποιηθούν, και όλα τα αρχεία θα παρέχονται αποκλειστικά από τον διακομιστή.
disable_gravatar=Απενεργοποίηση Gravatar
disable_gravatar.description=Το Gravatar και άλλες εξωτερικές πηγές εικόνων προφίλ θα απενεργοποιηθούν. Θα χρησιμοποιηθεί μία προεπιλεγμένη εικόνα προφίλ, εκτός αν ο χρήστης ανεβάσει από μόνος του ένα avatar.
federated_avatar_lookup=Ενεργοποίηση αποκεντρωμένων εικόνων προφίλ
federated_avatar_lookup.description=Ενεργοποίηση αποκεντρωμένης αναζήτησης εικόνων προφίλ μέσω Libravatar.
disable_registration=Απενεργοποίηση αυτοεγγραφής
-disable_registration.description=Απενεργοποίηση αυτοεγγραφής χρήστη. Μόνο οι διαχειριστές θα μπορούν να δημιουργήσουν νέους λογαριασμούς χρηστών.
-allow_only_external_registration.description=Να επιτρέπεται η εγγραφή μόνο μέσω εξωτερικών υπηρεσιών
+disable_registration.description=Μόνο οι διαχειριστές θα μπορούν να δημιουργήσουν νέους λογαριασμούς χρηστών. Σας συνιστούμε να απενεργοποιήσετε τις εγγραφές, εκτός αν θέλετε να προσφέρετε τον διακομιστή σας σε ένα ευρύ κοινό και είστε έτοιμος να αφαιρέσετε λογαριασμούς που θα χρησιμοποιηθούν για spam.
+allow_only_external_registration.description=Οι χρήστες θα μπορούν να δημιουργήσουν λογαριασμούς μόνο μέσω εξωτερικών υπηρεσιών.
openid_signin=Ενεργοποίηση σύνδεσης μέσω OpenID
openid_signin.description=Ενεργοποίηση σύνδεσης χρήστη μέσω OpenID.
openid_signup=Ενεργοποίηση εγγραφών μέσω OpenID
openid_signup.description=Ενεργοποίηση ιδιοεγγραφής χρηστών με βάση το OpenID.
enable_captcha=Ενεργοποίηση CAPTCHA στην εγγραφή
-enable_captcha.description=Να απαιτείται CAPTCHA για την δημιουργία λογαριασμού.
+enable_captcha.description=Να απαιτείται CAPTCHA για την δημιουργία λογαριασμών.
require_sign_in_view=Να απαιτείται είσοδος για την προβολή περιεχομένων
-require_sign_in_view.description=Περιορισμός της πρόσβασης σε συνδεδεμένους χρήστες. Οι επισκέπτες θα μπορούν μόνο να δουν τις σελίδες εισόδου και εγγραφής.
+require_sign_in_view.description=Το περιεχόμενο του διακομιστή σας θα μπορούν να το βλέπουν μόνο συνδεδεμένοι χρήστες. Οι επισκέπτες θα μπορούν μόνο να δουν τις σελίδες εισόδου και εγγραφής.
admin_setting.description=Η δημιουργία ενός λογαριασμού διαχειριστή είναι προαιρετική. Ο πρώτος εγγεγραμμένος χρήστης θα γίνει αυτόματα διαχειριστής.
admin_title=Ρυθμίσεις λογαριασμού διαχειριστή
admin_name=Όνομα χρήστη διαχειριστή
@@ -312,9 +314,9 @@ invalid_log_root_path=Η τοποθεσία αρχείων καταγραφής
default_keep_email_private=Απόκρυψη διευθύνσεων email από προεπιλογή
default_keep_email_private.description=Απόκρυψη διευθύνσεων email των νέων λογαριασμών χρήστη σαν προεπιλογή.
default_allow_create_organization=Να επιτρέπεται η δημιουργία οργανισμών από προεπιλογή
-default_allow_create_organization.description=Επιτρέψτε σε νέους λογαριασμούς χρηστών να δημιουργούν οργανισμούς σαν προεπιλογή.
+default_allow_create_organization.description=Να επιτρέπεται στους χρήστες να δημιουργούν οργανισμούς από προεπιλογή. Αν απενεργοποιήσετε αυτήν την ρύθμιση, τότε ο χρήστης θα μπορεί να δημιουργήσει οργανισμούς μόνο με την έγκριση ενός διαχειριστή.
default_enable_timetracking=Ενεργοποίηση καταγραφής χρόνου από προεπιλογή
-default_enable_timetracking.description=Ενεργοποίηση καταγραφής χρόνου για νέα αποθετήρια σαν προεπιλογή.
+default_enable_timetracking.description=Να ενεργοποιείται η λειτουργία καταγραφής χρόνου σε νέα αποθετήρια από προεπιλογή.
no_reply_address=Domain κρυφών email
no_reply_address_helper=Όνομα τομέα (domain) για χρήστες με μια κρυφή διεύθυνση email. Για παράδειγμα, το όνομα χρήστη 'nikos' θα συνδεθεί στο Git ως 'nikos@noreply.example.org' αν ο κρυφός τομέας email έχει οριστεί ως 'noreply.example.org'.
password_algorithm=Αλγόριθμος hash για κωδικούς
@@ -327,19 +329,22 @@ allow_dots_in_usernames = Επιτρέπει την χρήση τελείων σ
enable_update_checker_helper_forgejo = Θα γίνεται τακτικά έλεγχος για νέες εκδόσεις του Forgejo ελέγχοντας μία εγγραφή DNS TXT στο release.forgejo.org.
smtp_from_invalid = Η διεύθυνση του πεδίου «Αποστολή email ως» δεν είναι έγκυρη
config_location_hint = Αυτές οι ρυθμίσεις θα αποθηκευτούν στην ακόλουθη τοποθεσία:
+allow_only_external_registration = Να επιτρέπονται οι εγγραφές μόνο μέσω εξωτερικών υπηρεσιών
+app_slogan = Slogan διακομιστή
+app_slogan_helper = Γράψτε το slogan του διακομιστή σας εδώ. Αφήστε κενό για να το απενεργοποιήσετε.
[home]
uname_holder=Όνομα χρήστη ή διεύθυνση email
password_holder=Κωδικός Πρόσβασης
-switch_dashboard_context=Εναλλαγή Περιεχομένων Αρχικού Πίνακα
+switch_dashboard_context=Εναλλαγή περιεχομένων αρχικού πίνακα
my_repos=Αποθετήρια
show_more_repos=Περισσότερα αποθετήρια…
-collaborative_repos=Συνεργατικά Αποθετήρια
+collaborative_repos=Συνεργατικά αποθετήρια
my_orgs=Οργανισμοί
my_mirrors=Τα Αντίγραφα Μου
view_home=Προβολή %s
search_repos=Βρείτε ένα αποθετήριο…
-filter=Άλλα Φίλτρα
+filter=Άλλα φίλτρα
filter_by_team_repositories=Φιλτράρισμα ανά αποθετήρια ομάδας
feed_of=Ροή (feed) του «%s»
@@ -382,7 +387,7 @@ forks_one = %d fork
forks_few = %d forks
[auth]
-create_new_account=Δημιουργία Λογαριασμού
+create_new_account=Δημιουργία λογαριασμού
register_helper_msg=Έχετε ήδη λογαριασμό; Συνδεθείτε τώρα!
social_register_helper_msg=Έχετε ήδη λογαριασμό; Συνδέστε το τώρα!
disable_register_prompt=Οι εγγραφές είναι απενεργοποιημένες. Παρακαλούμε να επικοινωνήσετε με το διαχειριστή του ιστοτόπου.
@@ -398,7 +403,7 @@ confirmation_mail_sent_prompt=Ένα νέο email επιβεβαίωσης έχ
must_change_password=Ενημερώστε τον κωδικό πρόσβασης σας
allow_password_change=Απαιτείται από το χρήστη να αλλάξει τον κωδικό πρόσβασης (συνιστόμενο)
reset_password_mail_sent_prompt=Ένα email επιβεβαίωσης έχει σταλεί στο %s. Για την ολοκλήρωση της διαδικασίας ανάκτησης του λογαριασμού σας, παρακαλώ ελέγξτε τα εισερχόμενα σας στις επόμενες %s.
-active_your_account=Ενεργοποιήστε Το Λογαριασμό Σας
+active_your_account=Ενεργοποίηση λογαριασμού
account_activated=Ο λογαριασμός έχει ενεργοποιηθεί
prohibit_login=Δεν επιτρέπεται η σύνδεση
prohibit_login_desc=Δεν επιτρέπεται η σύνδεση στον λογαριασμό σας, παρακαλούμε επικοινωνήστε με το διαχειριστή σας.
@@ -406,8 +411,8 @@ resent_limit_prompt=Έχετε ήδη ζητήσει ένα email ενεργοπ
has_unconfirmed_mail=Γειά %s, η διεύθυνση ηλεκτρονικού ταχυδρομείου σας (%s) δεν έχει επιβεβαιωθεί ακόμα. Εάν δεν έχετε λάβει κάποιο email επιβεβαίωσης ή αν χρειάζεστε ένα νέο email επιβεβαίωσης, παρακαλώ πατήστε το παρακάτω κουμπί.
resend_mail=Κάντε κλικ εδώ για να στείλετε ξανά το email ενεργοποίησης
email_not_associate=Η διεύθυνση ηλεκτρονικού ταχυδρομείου δεν είναι συσχετισμένη με κάποιο λογαριασμό.
-send_reset_mail=Αποστολή Email Ανάκτησης Λογαριασμού
-reset_password=Ανάκτηση Λογαριασμού
+send_reset_mail=Αποστολή email ανάκτησης λογαριασμού
+reset_password=Ανάκτηση λογαριασμού
invalid_code=Ο κωδικός επιβεβαίωσης δεν είναι έγκυρος ή έχει λήξει.
invalid_code_forgot_password=Ο κωδικός επιβεβαίωσης έχει λήξει ή δεν είναι έγκυρος. Πατήστε εδώ για να ξαναξεκινήσετε την διαδικασία.
invalid_password=Ο κωδικός πρόσβασης σας δεν ταιριάζει με τον κωδικό που χρησιμοποιήθηκε για τη δημιουργία του λογαριασμού.
@@ -424,11 +429,11 @@ twofa_scratch_token_incorrect=Ο κωδικός μιας χρήσης είναι
login_userpass=Είσοδος
tab_openid=OpenID
oauth_signup_tab=Δημιουργία νέου λογαριασμού
-oauth_signup_title=Ολοκλήρωση Νέου Λογαριασμού
-oauth_signup_submit=Ολοκληρωμένος Λογαριασμός
+oauth_signup_title=Ολοκλήρωση νέου λογαριασμού
+oauth_signup_submit=Ολοκλήρωση λογαριασμού
oauth_signin_tab=Σύνδεση με υπάρχων λογαριασμό
-oauth_signin_title=Συνδεθείτε για να εγκρίνετε τον Συνδεδεμένο Λογαριασμό
-oauth_signin_submit=Σύνδεση Λογαριασμού
+oauth_signin_title=Συνδεθείτε για να εγκρίνετε τον συνδεδεμένο λογαριασμό
+oauth_signin_submit=Σύνδεση λογαριασμού
oauth.signin.error=Παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματος εξουσιοδότησης. Εάν αυτό το σφάλμα επιμένει, παρακαλούμε επικοινωνήστε με το διαχειριστή του ιστοτόπου.
oauth.signin.error.access_denied=Η αίτηση εξουσιοδότησης απορρίφθηκε.
oauth.signin.error.temporarily_unavailable=Η εξουσιοδότηση απέτυχε επειδή ο διακομιστής ταυτοποίησης δεν είναι διαθέσιμος προσωρινά. Παρακαλώ προσπαθήστε ξανά αργότερα.
@@ -444,7 +449,7 @@ email_domain_blacklisted=Δεν μπορείτε να εγγραφείτε με
authorize_application=Εξουσιοδότηση Εφαρμογής
authorize_redirect_notice=Θα μεταφερθείτε στο %s εάν εξουσιοδοτήσετε αυτήν την εφαρμογή.
authorize_application_created_by=Αυτή η εφαρμογή δημιουργήθηκε από %s.
-authorize_application_description=Εάν παραχωρήσετε την πρόσβαση, θα μπορεί να έχει πρόσβαση και να γράφει σε όλες τις πληροφορίες του λογαριασμού σας, συμπεριλαμβανομένων των ιδιωτικών αποθετηρίων και οργανισμών.
+authorize_application_description=Αν παραχωρήσετε την πρόσβαση, θα μπορεί να διαβάσει και να επεξεργαστεί όλες τις πληροφορίες του λογαριασμού σας, συμπεριλαμβανομένων των ιδιωτικών αποθετηρίων και οργανισμών.
authorize_title=Είστε βέβαιοι πως θέλετε να δώσετε πρόσβαση στον λογαριασμό σας στην εφαρμογή «%s»;
authorization_failed=Αποτυχία εξουσιοδότησης
authorization_failed_desc=Η εξουσιοδότηση απέτυχε επειδή εντοπίστηκε μια μη έγκυρη αίτηση. Παρακαλούμε επικοινωνήστε με το συντηρητή της εφαρμογής που προσπαθήσατε να εξουσιοδοτήσετε.
@@ -473,7 +478,7 @@ activate_email=Επιβεβαιώστε τη διεύθυνση email σας
activate_email.title=%s, επαληθεύστε τη διεύθυνση email σας
activate_email.text=Για να επαληθεύσετε τη διεύθυνση email σας, παρακαλώ πατήστε τον ακόλουθο σύνδεσμο μέσα σε %s:
-register_notify=Καλώς ήλθατε στο Forgejo
+register_notify_prev9=Καλώς ήλθατε στο Forgejo
register_notify.title=%[1]s, καλώς ήλθατε στο %[2]s
register_notify.text_1=αυτό είναι το email επιβεβαίωσης εγγραφής σας για το %s!
register_notify.text_2=Μπορείτε να συνδεθείτε χρησιμοποιώντας το όνομα χρήστη σας: %s
@@ -555,7 +560,7 @@ TreeName=Διαδρομή αρχείου
Content=Περιεχόμενο
SSPISeparatorReplacement=Διαχωριστικό
-SSPIDefaultLanguage=Προεπιλεγμένη Γλώσσα
+SSPIDefaultLanguage=Προεπιλεγμένη γλώσσα
require_error=` δεν μπορεί να είναι κενό.`
alpha_dash_error=`: Πρέπει να περιέχει μόνο αλφαριθμητικά, παύλες ('-') και κάτω παύλες ('_').`
@@ -629,6 +634,14 @@ admin_cannot_delete_self = Δεν μπορείτε να διαγράψετε τ
unset_password = Ο χρήστης δεν έχει ορίσει κάποιον κωδικό.
unsupported_login_type = Η μέθοδος με την οποίο γίνεται η σύνδεση δεν υποστηρίζει την διαγραφή λογαριασμών.
required_prefix = Το εισαγώμενο κείμενο πρέπει να ξεκινά με «%s»
+To = Όνομα κλάδου
+AccessToken = Διακριτικό πρόσβασης (token)
+FullName = Πλήρες όνομα
+Description = Περιγραφή
+Pronouns = Αντωνυμίες
+Biography = Βιογραφία
+Website = Ιστοσελίδα
+Location = Τοποθεσία
[user]
@@ -659,12 +672,20 @@ follow_blocked_user = Δεν μπορείτε να ακολουθήσετε το
unblock = Άρση αποκλεισμού
block = Αποκλεισμός
block_user = Αποκλεισμός χρήστη
-block_user.detail_1 = Ο χρήστης δεν θα ακολουθεί πια τον λογαριασμό σας.
-block_user.detail_2 = Ο χρήστης δεν θα μπορεί να αλληλεπιδράσει με τα αποθετήριά σας, να δημιουργήσει ζητήματα ή να αφήσει σχόλια.
-block_user.detail_3 = Ο χρήστης δεν θα μπορέσει να σας προσθέσει στα αποθετήριά του ως συνεργάτη και αντίστοιχα δεν θα μπορείτε να τον προσθέσετε στα δικά σας αποθετήρια.
-block_user.detail = Επισημαίνεται πως αν αποκλείσετε αυτόν τον χρήστη, θα προκύψουν ταυτόχρονα και άλλες ενέργειες. Μερικές από αυτές:
+block_user.detail_1 = Ο χρήστης θα πάψει να ακολουθεί τον λογαριασμό σας.
+block_user.detail_2 = Ο χρήστης δεν θα μπορεί να αλληλεπιδράσει με τα αποθετήριά, τα ζητήματα και τα σχόλια σας.
+block_user.detail_3 = Δεν θα μπορείτε να προσθέσετε ο ένας τον άλλον στα αποθετήριά σας ως συνεργάτη.
+block_user.detail = Επισημαίνεται πως αν αποκλείσετε αυτόν τον χρήστη, θα προκύψουν ταυτόχρονα και άλλες ενέργειες, όπως:
followers_one = %d ακόλουθος
following_one = ακολουθεί %d
+public_activity.visibility_hint.admin_private = Αν και ο χρήστης προτιμά να κρατά την δραστηριότητά του ιδιωτική, είναι ορατή σε εσάς επειδή είστε ένας διαχειριστής.
+followers.title.one = ακόλουθος
+followers.title.few = ακόλουθοι
+following.title.few = ακολουθεί
+following.title.one = ακολουθεί
+public_activity.visibility_hint.admin_public = Η δραστηριότητα είναι ορατή σε όλους, αλλά ως διαχειριστής μπορείτε να δείτε και τις αλληλεπιδράσεις σε ιδιωτικούς χώρους.
+public_activity.visibility_hint.self_public = Η δραστηριότητά σου είναι ορατή σε όλους, πλην τις αλληλεπιδράσεις σας σε ιδιωτικούς χώρους. Αλλαγή ορατότητας.
+public_activity.visibility_hint.self_private = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και στους διαχειριστές. Αλλαγή ορατότητας.
[settings]
profile=Προφίλ
@@ -680,7 +701,7 @@ orgs=Διαχείριση οργανισμών
repos=Αποθετήρια
delete=Διαγραφή λογαριασμού
twofa=Πιστοποίηση δύο παραγόντων (TOTP)
-account_link=Συνδεδεμένοι Λογαριασμοί
+account_link=Συνδεδεμένοι λογαριασμοί
organization=Οργανισμοί
uid=UID
webauthn=Πιστοποίηση δύο παραγόντων (Κλειδιά Ασφαλείας)
@@ -750,19 +771,19 @@ password_change_disabled=Οι μη τοπικοί χρήστες δεν μπορ
emails=Διευθύνσεις Email
manage_emails=Διαχείριση διευθύνσεων email
-manage_themes=Επιλέξτε προεπιλεγμένο θέμα διεπαφής
-manage_openid=Διαχείριση διευθύνσεων OpenID
+manage_themes=Προεπιλεγμένο θέμα
+manage_openid=Διευθύνσεις OpenID
email_desc=Η κύρια διεύθυνση ηλεκτρονικού ταχυδρομείου σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση του κωδικού πρόσβασης και, εφόσον δεν είναι κρυμμένη, λειτουργίες Git στον ιστότοπο.
theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας σε όλη την ιστοσελίδα.
primary=Κύριο
activated=Ενεργό
requires_activation=Απαιτείται ενεργοποίηση
-primary_email=Αλλαγή κυριότητας
-activate_email=Αποστολή Ενεργοποίησης
-activations_pending=Εκκρεμούν Ενεργοποιήσεις
+primary_email=Προεπιλογή
+activate_email=Αποστολή ενεργοποίησης
+activations_pending=Εκκρεμεί ενεργοποίηση
can_not_add_email_activations_pending=Εκκρεμεί μια ενεργοποίηση, δοκιμάστε ξανά σε λίγα λεπτά αν θέλετε να προσθέσετε ένα νέο email.
delete_email=Αφαίρεση
-email_deletion=Αφαίρεση Διεύθυνσης Email
+email_deletion=Αφαίρεση διεύθυνσης email
email_deletion_desc=Η διεύθυνση ηλεκτρονικού ταχυδρομείου και οι σχετικές πληροφορίες θα αφαιρεθούν από τον λογαριασμό σας. Οι υποβολές Git από αυτή τη διεύθυνση email θα παραμείνουν αμετάβλητες. Συνέχεια;
email_deletion_success=Η διεύθυνση email σας έχει καταργηθεί.
theme_update_success=Το θέμα διεπαφής σας ενημερώθηκε.
@@ -771,7 +792,7 @@ openid_deletion=Αφαίρεση Διεύθυνσης OpenID
openid_deletion_desc=Η κατάργηση αυτής της διεύθυνσης OpenID από τον λογαριασμό σας θα σας εμποδίσει να συνδέεστε με αυτό. Συνέχεια;
openid_deletion_success=Η διεύθυνση OpenID αφαιρέθηκε.
add_new_email=Προσθήκη νέας διεύθυνσης email
-add_new_openid=Προσθήκη Νέου OpenID URI
+add_new_openid=Προσθήκη νέου OpenID URI
add_email=Προσθήκη διεύθυνσης email
add_openid=Προσθήκη OpenID URI
add_email_confirmation_sent=Ένα email επιβεβαίωσης έχει σταλεί στην διεύθυνση «%s». Για να επιβεβαιώσετε τη διεύθυνση email σας, παρακαλώ ελέγξτε τα εισερχόμενα σας μέσα σε %s.
@@ -795,7 +816,7 @@ add_new_key=Προσθήκη κλειδιού SSH
add_new_gpg_key=Προσθήκη κλειδιού GPG
key_content_ssh_placeholder=Αρχίζει με «ssh-ed25519», «ssh-rsa», «ecdsa-sha2-nistp256», «ecdsa-sha2-nistp384», «ecdsa-sha2-nistp521», «sk-ecdsa-sha2-nistp256@openssh.com», ή «sk-ssh-ed25519@openssh.com»
key_content_gpg_placeholder=Αρχίζει με «-----BEGIN PGP PUBLIC KEY BLOCK-----»
-add_new_principal=Προσθήκη Αρχής (Principal)
+add_new_principal=Προσθήκη αρχής (Principal)
ssh_key_been_used=Αυτό το κλειδί SSH έχει ήδη προστεθεί στο διακομιστή.
ssh_key_name_used=Υπάρχει ήδη ένα SSH κλειδί με το ίδιο όνομα στο λογαριασμό σας.
ssh_principal_been_used=Αυτή η αρχή πιστοποίησης (principal) έχει ήδη προστεθεί στο διακομιστή.
@@ -854,7 +875,7 @@ token_state_desc=Αυτό το διακριτικό έχει χρησιμοπο
principal_state_desc=Αυτή η αρχή πιστοποιητικού έχει χρησιμοποιηθεί τις τελευταίες 7 ημέρες
show_openid=Εμφάνιση στο προφίλ
hide_openid=Απόκρυψη από το προφίλ
-ssh_disabled=SSH Απενεργοποιημένο
+ssh_disabled=Το SSH είναι απενεργοποιημένο
ssh_signonly=Το SSH είναι απενεργοποιημένο αυτή τη στιγμή, έτσι αυτά τα κλειδιά είναι μόνο για την επαλήθευση υπογραφής των υποβολών.
ssh_externally_managed=Αυτό το κλειδί SSH διαχειρίζεται εξωτερικά για αυτόν το χρήστη
manage_social=Διαχείριση Συσχετιζόμενων Λογαριασμών Κοινωνικών Δικτύων
@@ -897,7 +918,7 @@ create_oauth2_application_button=Δημιουργία εφαρμογής
create_oauth2_application_success=Δημιουργήσατε επιτυχώς μια νέα εφαρμογή OAuth2.
update_oauth2_application_success=Ενημερώσατε την εφαρμογή OAuth2 επιτυχώς.
oauth2_application_name=Όνομα εφαρμογής
-oauth2_confidential_client=Εμπιστευτικός Πελάτης. Επιλέξτε το για εφαρμογές που διατηρούν το μυστικό κωδικό κρυφό, όπως πχ οι εφαρμογές ιστού. Μην επιλέγετε για εγγενείς εφαρμογές, συμπεριλαμβανομένων εφαρμογών επιφάνειας εργασίας και εφαρμογών για κινητά.
+oauth2_confidential_client=Εμπιστευτικός πελάτης (client). Επιλέξτε το για εφαρμογές που διατηρούν το μυστικό κωδικό κρυφό, όπως π.χ. εφαρμογές ιστού. Μην επιλέγετε για εγγενείς εφαρμογές, συμπεριλαμβανομένων εφαρμογών επιφάνειας εργασίας και εφαρμογών για κινητά.
oauth2_redirect_uris=URI Ανακατεύθυνσης. Χρησιμοποιήστε μια νέα γραμμή για κάθε URI.
save_application=Αποθήκευση
oauth2_client_id=Ταυτότητα Πελάτη
@@ -944,10 +965,10 @@ webauthn_delete_key_desc=Αν αφαιρέσετε ένα κλειδί ασφα
webauthn_key_loss_warning=Αν χάσετε τα κλειδιά ασφαλείας σας, θα χάσετε την πρόσβαση στο λογαριασμό σας.
webauthn_alternative_tip=Μπορεί να θέλετε να ρυθμίσετε μια πρόσθετη μέθοδο ταυτοποίησης.
-manage_account_links=Διαχείριση Συνδεδεμένων Λογαριασμών
+manage_account_links=Διαχείριση συνδεδεμένων λογαριασμών
manage_account_links_desc=Αυτοί οι εξωτερικοί λογαριασμοί είναι συνδεδεμένοι στον λογαριασμό Forgejo σας.
account_links_not_available=Προς το παρόν δεν υπάρχουν εξωτερικοί λογαριασμοί συνδεδεμένοι με τον λογαριασμό σας στο Forgejo.
-link_account=Σύνδεση Λογαριασμού
+link_account=Σύνδεση λογαριασμού
remove_account_link=Αφαίρεση συνδεδεμένου λογαριασμού
remove_account_link_desc=Η κατάργηση ενός συνδεδεμένου λογαριασμού θα ανακαλέσει την πρόσβασή του στο λογαριασμό σας στο Forgejo. Συνέχεια;
remove_account_link_success=Ο συνδεδεμένος λογαριασμός έχει αφαιρεθεί.
@@ -983,7 +1004,7 @@ user_unblock_success = Η άρση αποκλεισμού του χρήστη ή
change_password = Αλλαγή κωδικού
blocked_users = Αποκλεισμένοι χρήστες
user_block_success = Ο αποκλεισμός του χρήστη ήταν επιτυχής.
-additional_repo_units_hint = Να γίνεται ενθάρρυνση προσθήκης μονάδων σε αποθετήρια
+additional_repo_units_hint = Να συνιστάται η προσθήκη μονάδων αποθετηρίων
pronouns = Αντωνυμίες
pronouns_custom = κάτι άλλο
pronouns_unspecified = Απροσδιόριστες
@@ -991,6 +1012,7 @@ hints = Συμβουλές
additional_repo_units_hint_description = Εμφάνιση κουμπιού «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
update_hints = Ενημέρωση συμβουλών
update_hints_success = Οι συμβουλές ενημερώθηκαν.
+language.title = Προεπιλεγμένη γλώσσα
[repo]
new_repo_helper=Ένα αποθετήριο περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Ήδη φιλοξενείται αλλού; Μετεγκατάσταση αποθετηρίου.
@@ -1153,7 +1175,7 @@ migrate.failed=Η μεταφορά απέτυχε: %v
migrate.migrate_items_options=Το διακριτικό πρόσβασης (token) είναι απαραίτητο για τη μεταφορά πρόσθετων στοιχείων
migrated_from=Μεταφέρθηκε από %[2]s
migrated_from_fake=Μεταφέρθηκε από %[1]s
-migrate.migrate=Μεταφορά από το %s
+migrate.migrate=Μεταφορά από %s
migrate.migrating=Γίνεται μεταφορά από το %s...
migrate.migrating_failed=Η μεταφορά από το %s απέτυχε.
migrate.migrating_failed.error=Αποτυχία μεταφοράς: %s
@@ -1238,8 +1260,8 @@ invisible_runes_header=`Αυτό το αρχείο περιέχει αόρατο
invisible_runes_description=`Αυτό το αρχείο περιέχει αόρατους χαρακτήρες Unicode που δεν διακρίνονται από ανθρώπους, αλλά μπορεί να επεξεργάζονται διαφορετικά από έναν υπολογιστή. Αν νομίζετε ότι αυτό είναι σκόπιμο, μπορείτε να αγνοήσετε με ασφάλεια αυτή την προειδοποίηση. Χρησιμοποιήστε το κουμπί Escape για να τους αποκαλύψετε.`
ambiguous_runes_header=`Αυτό το αρχείο περιέχει ασαφείς χαρακτήρες Unicode `
ambiguous_runes_description=`Αυτό το αρχείο περιέχει χαρακτήρες Unicode που μπορεί να συγχέονται με άλλους χαρακτήρες. Αν νομίζετε ότι αυτό είναι σκόπιμο, μπορείτε να αγνοήσετε με ασφάλεια αυτή την προειδοποίηση. Χρησιμοποιήστε το κουμπί Escape για να τους αποκαλύψετε.`
-invisible_runes_line=`Αυτή η γραμμή έχει αόρατους χαρακτήρες unicode `
-ambiguous_runes_line=`Αυτή η γραμμή έχει ασαφείς χαρακτήρες unicode `
+invisible_runes_line=`Αυτή η γραμμή έχει αόρατους χαρακτήρες Unicode`
+ambiguous_runes_line=`Αυτή η γραμμή έχει ασαφείς χαρακτήρες Unicode`
ambiguous_character=`ο %[1]c [U+%04[1]X] μπορεί να μπερδευτεί με τον %[2]c [U+%04[2]X]`
escape_control_characters=Escape
@@ -1249,6 +1271,7 @@ view_git_blame=Προβολή git blame
video_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «video».
audio_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «audio».
stored_lfs=Αποθηκεύτηκε με το Git LFS
+stored_annex=Αποθηκεύτηκε με το Git Annex
symbolic_link=Symbolic link
executable_file=Εκτελέσιμο αρχείο
commit_graph=Γράφημα υποβολών
@@ -1272,6 +1295,7 @@ editor.upload_file=Ανέβασμα αρχείου
editor.edit_file=Επεξεργασία αρχείου
editor.preview_changes=Προεπισκόπηση αλλαγών
editor.cannot_edit_lfs_files=Τα αρχεία LFS δεν μπορούν να επεξεργαστούν στη διεπαφή web.
+editor.cannot_edit_annex_files=Τα αρχεία Annex δεν μπορούν να επεξεργαστούν στη διεπαφή web.
editor.cannot_edit_non_text_files=Τα δυαδικά αρχεία δεν μπορούν να επεξεργαστούν στη διεπαφή web.
editor.edit_this_file=Επεξεργασία αρχείου
editor.this_file_locked=Το αρχείο είναι κλειδωμένο
@@ -1290,10 +1314,10 @@ editor.add_tmpl=Προσθήκη «»
editor.add=Προσθήκη %s
editor.update=Ενημέρωση %s
editor.delete=Διαγραφή %s
-editor.patch=Εφαρμογή Διόρθωσης
+editor.patch=Εφαρμογή patch
editor.patching=Επιδιόρθωση:
editor.fail_to_apply_patch=`Αδυναμία εφαρμογής της επιδιόρθωσης "%s"`
-editor.new_patch=Νέα Διόρθωση
+editor.new_patch=Νέο patch
editor.commit_message_desc=Προσθήκη προαιρετικής εκτενούς περιγραφής…
editor.signoff_desc=Προσθέστε ένα πρόσθετο Signed-off-by στο τέλος του μηνύματος καταγραφής της υποβολής.
editor.commit_directly_to_this_branch=Υποβολή απευθείας στο κλάδο %s.
@@ -1318,10 +1342,10 @@ editor.commit_empty_file_header=Υποβολή ενός κενού αρχείο
editor.commit_empty_file_text=Το αρχείο που πρόκειται να υποβληθεί είναι κενό. Συνέχεια;
editor.no_changes_to_show=Δεν υπάρχουν αλλαγές για εμφάνιση.
editor.fail_to_update_file=Αποτυχία ενημέρωσης/δημιουργίας του αρχείου «%s».
-editor.fail_to_update_file_summary=Μήνυμα Σφάλματος:
+editor.fail_to_update_file_summary=Μήνυμα σφάλματος:
editor.push_rejected_no_message=Η αλλαγή απορρίφθηκε από τον διακομιστή και δεν γνωρίζουμε τον λόγο. Παρακαλώ ελέγξτε τα Git hooks σας.
editor.push_rejected=Η αλλαγή απορρίφθηκε από τον διακομιστή. Παρακαλώ ελέγξτε τα Git hook σας.
-editor.push_rejected_summary=Μήνυμα Πλήρους Απόρριψης:
+editor.push_rejected_summary=Μήνυμα πλήρους απόρριψης:
editor.add_subdir=Προσθήκη φακέλου…
editor.unable_to_upload_files=Αποτυχία αποστολής αρχείων στο «%s» με το σφάλμα: %v
editor.upload_file_is_locked=Το αρχείο «%s» είναι κλειδωμένο από %s.
@@ -1419,7 +1443,7 @@ issues.filter_reviewers=Φιλτράρισμα Εξεταστή
issues.new=Νέο ζήτημα
issues.new.title_empty=Ο τίτλος δεν μπορεί να είναι κενός
issues.new.labels=Σήματα
-issues.new.no_label=Χωρίς Σήμα
+issues.new.no_label=Χωρίς σήμανση
issues.new.clear_labels=Καθαρισμός σημάτων
issues.new.projects=Έργα
issues.new.clear_projects=Εκκαθάριση έργων
@@ -1449,8 +1473,8 @@ issues.new_label=Νέο σήμα
issues.new_label_placeholder=Όνομα σήματος
issues.new_label_desc_placeholder=Περιγραφή
issues.create_label=Δημιουργία σήματος
-issues.label_templates.title=Χρήση ενός προκαθορισμένου συνόλου σημάτων
-issues.label_templates.info=Δεν υπάρχουν σήματα ακόμα. Δημιουργήστε ένα σήμα με το κουμπί «Νέο Σήμα» ή χρησιμοποιήστε ένα σετ προκαθορισμένων σημάτων:
+issues.label_templates.title=Χρήση προκαθορισμένου συνόλου σημάνσεων
+issues.label_templates.info=Δεν υπάρχουν σημάνσεις ακόμα. Δημιουργήστε ένα σήμα με το κουμπί «Νέα σήμανση» ή χρησιμοποιήστε ένα σετ προκαθορισμένων σημάνσεων:
issues.label_templates.helper=Επιλέξτε ένα σύνολο προεπιλεγμένων σημάτων
issues.label_templates.use=Χρήση συνόλου προεπιλεγμένων σημάτων
issues.label_templates.fail_to_load_file=Αποτυχία φόρτωσης των προτύπων σημάτων από το αρχείο «%s»: %v
@@ -1572,7 +1596,7 @@ issues.role.collaborator_helper=Ο χρήστης έλαβε πρόσκληση
issues.role.first_time_contributor=Συντελεστής για πρώτη φορά
issues.role.first_time_contributor_helper=Αυτή είναι η πρώτη συνεισφορά αυτού του χρήστη στο αποθετήριο.
issues.role.contributor=Συντελεστής
-issues.role.contributor_helper=Αυτός ο χρήστης έχει προηγούμενές υποβολές στο αποθετήριο.
+issues.role.contributor_helper=Αυτός ο χρήστης έχει προηγούμενές υποβολές (commits) στο αποθετήριο.
issues.re_request_review=Επαναίτηση ανασκόπησης
issues.is_stale=Έχουν υπάρξει αλλαγές σε αυτό το PR από αυτή την αναθεώρηση
issues.remove_request_review=Αφαίρεση αιτήματος αναθεώρησης
@@ -1837,17 +1861,17 @@ pulls.merge_commit_id=Το ID της υποβολής συγχώνευσης
pulls.require_signed_wont_sign=Ο κλάδος απαιτεί υπογεγραμμένες υποβολές αλλά αυτή η συγχώνευση δεν θα υπογραφεί
pulls.invalid_merge_option=Δεν μπορείτε να χρησιμοποιήσετε αυτήν την επιλογή συγχώνευσης για αυτό το pull request.
-pulls.merge_conflict=Η Συγχώνευση Απέτυχε: Υπήρξε μια διένεξη κατά τη συγχώνευση. Υπόδειξη: Δοκιμάστε μια διαφορετική στρατηγική
-pulls.merge_conflict_summary=Μήνυμα Σφάλματος
-pulls.rebase_conflict=Η Συγχώνευση Απέτυχε: Υπήρξε μια σύγκρουση κατά την αλλαγή βάσης της υποβολής: %[1]s. Υπόδειξη: Δοκιμάστε μια διαφορετική στρατηγική
-pulls.rebase_conflict_summary=Μήνυμα Σφάλματος
-pulls.unrelated_histories=H Συγχώνευση Απέτυχε: Η κεφαλή και η βάση της συγχώνευσης δεν μοιράζονται μια κοινή ιστορία. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική
+pulls.merge_conflict=Η συγχώνευση απέτυχε: Υπήρξε μια σύγκρουση κατά τη συγχώνευση. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική
+pulls.merge_conflict_summary=Μήνυμα σφάλματος
+pulls.rebase_conflict=Η συγχώνευση απέτυχε: Υπήρξε μια σύγκρουση κατά την αλλαγή βάσης της υποβολής: %[1]s. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική
+pulls.rebase_conflict_summary=Μήνυμα σφάλματος
+pulls.unrelated_histories=H συγχώνευση απέτυχε: Η κεφαλή και η βάση της συγχώνευσης δεν έχουν κοινή ιστορία. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική
pulls.merge_out_of_date=Η συγχώνευση απέτυχε: Κατά τη δημιουργία της συγχώνευσης, η βάση ενημερώθηκε. Συμβουλή: Δοκιμάστε ξανά.
pulls.head_out_of_date=Η συγχώνευση απέτυχε: Κατά τη δημιουργία της συγχώνευσης, το HEAD ενημερώθηκε. Συμβουλή: Δοκιμάστε ξανά.
pulls.has_merged=Αποτυχία: Το pull request έχει συγχωνευθεί, δεν είναι δυνατή η συγχώνευση ξανά ή να αλλάξει ο κλάδος προορισμού.
-pulls.push_rejected=Αποτυχία ώθησης: Η ώθηση απορρίφθηκε. Ελέγξτε τα Git hooks του αποθετήριο.
-pulls.push_rejected_summary=Μήνυμα Πλήρους Απόρριψης
-pulls.push_rejected_no_message=Αποτυχία ώθησης: Η ώθηση απορρίφθηκε, αλλά δεν λάβαμε κάποιο μήνυμα. Ελέγξτε τα Git hooks του αποθετηρίου
+pulls.push_rejected=Η ώθηση απέτυχε: Η ώθηση απορρίφθηκε. Ελέγξτε τα Git hooks του αποθετηρίου.
+pulls.push_rejected_summary=Μήνυμα πλήρους απόρριψης
+pulls.push_rejected_no_message=Η ώθηση απέτυχε: Η ώθηση απορρίφθηκε, αλλά δεν λάβαμε κάποιο μήνυμα. Ελέγξτε τα Git hooks του αποθετηρίου
pulls.open_unmerged_pull_exists=`Δεν μπορείτε να ανοίξετε εκ νέου, επειδή υπάρχει ένα εκκρεμές pull request (#%d) με πανομοιότυπες ιδιότητες.`
pulls.status_checking=Μερικοί έλεγχοι εκκρεμούν
pulls.status_checks_success=Όλοι οι έλεγχοι ήταν επιτυχείς
@@ -1866,7 +1890,7 @@ pulls.outdated_with_base_branch=Αυτός ο κλάδος δεν είναι ε
pulls.close=Κλείσιμο pull request
pulls.closed_at=`έκλεισε αυτό το pull request %[2]s`
pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %[2]s`
-pulls.cmd_instruction_hint=`Δείτε τις οδηγίες γραμμής εντολών.`
+pulls.cmd_instruction_hint=`Δείτε τις οδηγίες γραμμής εντολών.`
pulls.cmd_instruction_checkout_title=Έλεγχος
pulls.cmd_instruction_checkout_desc=Από το αποθετήριο του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές.
pulls.cmd_instruction_merge_title=Συγχώνευση
@@ -1925,7 +1949,7 @@ milestones.filter_sort.least_issues=Λιγότερα ζητήματα
signing.will_sign=Αυτή η υποβολή θα υπογραφεί με το κλειδί «%s».
signing.wont_sign.error=Παρουσιάστηκε σφάλμα κατά τον έλεγχο για το αν η υποβολή μπορεί να υπογραφεί.
-signing.wont_sign.nokey=Δεν υπάρχει διαθέσιμο κλειδί για να υπογραφεί αυτή η υποβολή.
+signing.wont_sign.nokey=Ο διακομιστής δεν παρέχει κάποιο κλειδί για την υπογραφή αυτής της υποβολής (commit).
signing.wont_sign.never=Οι υποβολές δεν υπογράφονται ποτέ.
signing.wont_sign.always=Οι υποβολές υπογράφονται πάντα.
signing.wont_sign.pubkey=Η υποβολή δε θα υπογραφεί επειδή δεν υπάρχει δημόσιο κλειδί που να συνδέεται με το λογαριασμό σας.
@@ -1944,21 +1968,21 @@ wiki=Wiki
wiki.welcome=Καλώς ήρθατε στο Wiki.
wiki.welcome_desc=Το wiki σας επιτρέπει να γράψετε και να μοιραστείτε τεκμηριώσεις (documentation) με άλλους συνεργάτες.
wiki.desc=Γράψτε και μοιραστείτε τεκμηριώσεις με συνεργάτες.
-wiki.create_first_page=Δημιουργία πρώτης σελίδας
+wiki.create_first_page=Δημιουργία αρχικής σελίδας
wiki.page=Σελίδα
wiki.filter_page=Φιλτράρισμα σελίδας
wiki.new_page=Σελίδα
wiki.page_title=Τίτλος σελίδας
wiki.page_content=Περιεχόμενο σελίδας
wiki.default_commit_message=Γράψτε μια σημείωση σχετικά με αυτή την ενημέρωση σελίδας (προαιρετικό).
-wiki.save_page=Αποθήκευση Σελίδας
+wiki.save_page=Αποθήκευση σελίδας
wiki.last_commit_info=%s επεξεργάστηκε αυτή τη σελίδα %s
wiki.edit_page_button=Επεξεργασία
-wiki.new_page_button=Νέα Σελίδα
-wiki.file_revision=Αναθεώρηση Σελίδας
-wiki.wiki_page_revisions=Αναθεωρήσεις Σελίδας Wiki
+wiki.new_page_button=Νέα σελίδα
+wiki.file_revision=Έκδοση σελίδας
+wiki.wiki_page_revisions=Αναθεωρήσεις σελίδας wiki
wiki.back_to_wiki=Πίσω στη σελίδα wiki
-wiki.delete_page_button=Διαγραφή Σελίδας
+wiki.delete_page_button=Διαγραφή σελίδας
wiki.delete_page_notice_1=Η διαγραφή της σελίδας wiki «%s» δεν μπορεί να αναιρεθεί. Συνέχεια;
wiki.page_already_exists=Υπάρχει ήδη μια σελίδα wiki με το ίδιο όνομα.
wiki.reserved_page=Το όνομα σελίδας wiki «%s» είναι δεσμευμένο.
@@ -2081,11 +2105,11 @@ settings.mirror_settings.push_mirror.remote_url=URL απομακρυσμένου
settings.mirror_settings.push_mirror.add=Προσθήκη είδωλου ώθησης
settings.mirror_settings.push_mirror.edit_sync_time=Επεξεργασία διαστήματος συγχρονισμού ειδώλου
-settings.sync_mirror=Συγχρονισμός Τώρα
+settings.sync_mirror=Να γίνει συγχρονισμός τώρα
settings.pull_mirror_sync_in_progress=Έλκονται αλλαγές από την απομακρυσμένη τοποθεσία %s αυτή τη στιγμή.
settings.push_mirror_sync_in_progress=Ώθηση αλλαγών στο απομακρυσμένο %s αυτή τη στιγμή.
settings.site=Ιστοσελίδα
-settings.update_settings=Ενημέρωση ρυθμίσεων
+settings.update_settings=Αποθήκευση ρυθμίσεων
settings.update_mirror_settings=Ενημέρωση ρυθμίσεων ειδώλου
settings.branches.switch_default_branch=Αλλαγή προεπιλεγμένου κλάδου
settings.branches.update_default_branch=Ενημέρωση προεπιλεγμένου κλάδου
@@ -2126,9 +2150,9 @@ settings.projects_desc=Ενεργοποίηση έργων αποθετηρίο
settings.actions_desc=Ενεργοποίηση actions αποθετηρίου
settings.admin_settings=Ρυθμίσεις διαχειριστή
settings.admin_enable_health_check=Ενεργοποίηση ελέγχων υγείας αποθετηρίων (git fsck)
-settings.admin_code_indexer=Indexer Κώδικα
-settings.admin_stats_indexer=Indexer Στατιστικών Κώδικα
-settings.admin_indexer_commit_sha=Τελευταίο Indexed SHA
+settings.admin_code_indexer=Indexer κώδικα
+settings.admin_stats_indexer=Indexer στατιστικών κώδικα
+settings.admin_indexer_commit_sha=Τελευταίο indexed SHA
settings.admin_indexer_unindexed=Unindexed
settings.reindex_button=Προσθήκη στην ουρά Reindex
settings.reindex_requested=Αιτήθηκε reindex
@@ -2346,7 +2370,7 @@ settings.protected_branch.delete_rule=Διαγραφή κανόνα
settings.protected_branch_can_push=Επιτρέψτε ώθηση;
settings.protected_branch_can_push_yes=Μπορείτε να ωθήσετε
settings.protected_branch_can_push_no=Δεν μπορείτε να ωθήσετε
-settings.branch_protection=Κανόνες προστασίας για τον κλάδο «%s»
+settings.branch_protection=Κανόνες προστασίας του κλάδου «%s»
settings.protect_this_branch=Ενεργοποίηση προστασίας κλάδου
settings.protect_this_branch_desc=Αποτρέπει τη διαγραφή και περιορίζει το Git push και συγχώνευση στον κλάδο.
settings.protect_disable_push=Απενεργοποίηση ωθήσεων
@@ -2388,7 +2412,7 @@ settings.protect_branch_name_pattern=Μοτίβο προστατευμένου
settings.protect_branch_name_pattern_desc=Μοτίβα ονόματος προστατευμένων κλάδων. Συμβολευτείτε την τεκμηρίωση για την σύνταξη ενός μοτίβου. Παραδείγματα: main, release/**
settings.protect_patterns=Μοτίβα
settings.protect_protected_file_patterns=Μοτίβα προστατευμένων αρχείων (διαχωρισμός με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
-settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση github.com/gobwas/glob για τη σύνταξη του μοτίβου. Πχ: .drone.yml, /docs/**/*.txt.
+settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με semicolon («;») (ΟΧΙ ερωτηματικό). Για να συντάξετε μοτίβα, συμβουλευτείται την τεκμηρίωση github.com/gobwas/glob. Παράδειγμα: .drone.yml, /docs/**/*.txt.
settings.protect_unprotected_file_patterns=Μοτίβα μη προστατευμένων αρχείων (διαχωρισμένα με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
settings.protect_unprotected_file_patterns_desc=Μη προστατευμένα αρχεία που επιτρέπεται να αλλάξουν απευθείας εάν ο χρήστης έχει πρόσβαση εγγραφής, παρακάμπτοντας τον περιορισμό ώθησης. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση github.com/gobwas/glob για τη σύνταξη του μοτίβου. Πχ: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch=Ενεργοποίηση προστασίας
@@ -2458,15 +2482,15 @@ settings.lfs_invalid_lock_directory=Αδυναμία κλειδώματος φα
settings.lfs_lock_already_exists=Το κλείδωμα υπάρχει ήδη: %s
settings.lfs_lock=Κλείδωμα
settings.lfs_lock_path=Διαδρομή αρχείου για να κλειδωθεί...
-settings.lfs_locks_no_locks=Χωρίς Κλειδώματα
+settings.lfs_locks_no_locks=Χωρίς κλειδώματα
settings.lfs_lock_file_no_exist=Το κλειδωμένο αρχείο δεν υπάρχει στον προεπιλεγμένο κλάδο
-settings.lfs_force_unlock=Εξαναγκασμός Ξεκλειδώματος
+settings.lfs_force_unlock=Εξαγκαναστικό ξεκλείδωμα
settings.lfs_pointers.found=Βρέθηκαν %d δείκτης(ες) blob - %d συσχετίστηκαν, %d δεν συσχετίστηκαν (%d λείπουν από το χώρο αποθήκευσης)
-settings.lfs_pointers.sha=Blob SHA
+settings.lfs_pointers.sha=Blob hash
settings.lfs_pointers.oid=OID
-settings.lfs_pointers.inRepo=Στο Αποθετήριο
+settings.lfs_pointers.inRepo=Στο αποθετήριο
settings.lfs_pointers.exists=Υπάρχει στο χώρο αποθήκευσης
-settings.lfs_pointers.accessible=Προσβάσιμο στο Χρήστη
+settings.lfs_pointers.accessible=Προσβάσιμο στον χρήστη
settings.lfs_pointers.associateAccessible=Συσχετισμός προσιτών %d OID
settings.rename_branch_failed_exist=Αδυναμία μετονομασίας του κλάδου, επειδή ο κλάδος προορισμού %s υπάρχει ήδη.
settings.rename_branch_failed_not_exist=Αδυναμία μετονομασίας του κλάδου %s επειδή δεν υπάρχει.
@@ -2515,7 +2539,7 @@ diff.comment.add_single_comment=Προσθέστε ένα σχόλιο
diff.comment.add_review_comment=Προσθήκη σχολίου
diff.comment.start_review=Έναρξη αξιολόγησης
diff.comment.reply=Απάντηση
-diff.review=Αξιολόγηση
+diff.review=Ολοκλήρωση αξιολόγησης
diff.review.header=Υποβολή αξιολόγησης
diff.review.placeholder=Σχόλιο αξιολόγησης
diff.review.comment=Σχόλιο
@@ -2536,16 +2560,16 @@ releases.desc=Παρακολούθηση εκδόσεων έργου και λή
release.releases=Κυκλοφορίες
release.detail=Λεπτομέρειες κυκλοφορίας
release.tags=Ετικέτες
-release.new_release=Νέα Κυκλοφορία
+release.new_release=Νέα κυκλοφορία
release.draft=Προσχέδιο
-release.prerelease=Προ-Κυκλοφορία
+release.prerelease=Προδημοσίευση
release.stable=Σταθερή
release.compare=Σύγκριση
release.edit=επεξεργασία
release.ahead.commits=%d υποβολές
release.ahead.target=σε %s από αυτή την έκδοση
tag.ahead.target=μέχρι το %s από αυτή την ετικέτα
-release.source_code=Πηγαίος Κώδικας
+release.source_code=Πηγαίος κώδικας
release.new_subheader=Οι Κυκλοφορίες οργανώνουν εκδόσεις έργων.
release.edit_subheader=Οι Κυκλοφορίες οργανώνουν εκδόσεις έργων.
release.tag_name=Όνομα ετικέτας
@@ -2556,15 +2580,15 @@ release.tag_helper_existing=Υπάρχουσα ετικέτα.
release.title=Τίτλος κυκλοφορίας
release.title_empty=Ο τίτλος δεν μπορεί να είναι κενός.
release.message=Περιγράψτε αυτήν την κυκλοφορία
-release.prerelease_desc=Σήμανση ως Προ-Κυκλοφορία
+release.prerelease_desc=Σήμανση ως προδημοσίευση
release.prerelease_helper=Σημείωση αυτής της κυκλοφορίας ως ακατάλληλη για χρήση στη παραγωγή.
release.cancel=Ακύρωση
-release.publish=Δημοσίευση Κυκλοφορίας
-release.save_draft=Αποθήκευση Προχείρου
-release.edit_release=Ενημέρωση Κυκλοφορίας
-release.delete_release=Διαγραφή Κυκλοφορίας
-release.delete_tag=Διαγραφή Ετικέτας
-release.deletion=Διαγραφή Κυκλοφορίας
+release.publish=Δημοσίευση κυκλοφορίας
+release.save_draft=Αποθήκευση προχείρου
+release.edit_release=Ενημέρωση κυκλοφορίας
+release.delete_release=Διαγραφή κυκλοφορίας
+release.delete_tag=Διαγραφή ετικέτας
+release.deletion=Διαγραφή κυκλοφορίας
release.deletion_desc=Διαγράφοντας μια κυκλοφορία, αυτή αφαιρείται μόνο από το Gitea. Δε θα επηρεάσει την ετικέτα Git, τα περιεχόμενα του αποθετηρίου σας ή το ιστορικό της. Συνέχεια;
release.deletion_success=Η κυκλοφορία έχει διαγραφεί.
release.deletion_tag_desc=Θα διαγράψει αυτή την ετικέτα από το αποθετήριο. Τα περιεχόμενα του αποθετηρίου και το ιστορικό παραμένουν αμετάβλητα. Συνέχεια;
@@ -2576,7 +2600,7 @@ release.tag_already_exist=Αυτό το όνομα ετικέτας υπάρχε
release.downloads=Λήψεις
release.download_count=Λήψεις: %s
release.add_tag_msg=Χρησιμοποιήστε τον τίτλο και το περιεχόμενο της έκδοσης ως μήνυμα ετικέτας.
-release.add_tag=Δημιουργία Ετικέτας Μόνο
+release.add_tag=Δημιουργία ετικέτας
release.releases_for=Κυκλοφορίες για %s
release.tags_for=Ετικέτες για %s
@@ -2709,7 +2733,7 @@ release.system_generated = Αυτό το αρχείο παράγεται αυτ
pulls.ready_for_review = Έτοιμο για αξιολόγηση;
settings.rename_branch_failed_protected = Δεν είναι δυνατή η μετονομασία του κλάδου %s, επειδή είναι προστατευόμενος.
settings.event_pull_request_enforcement = Εξαναγκασμός
-editor.commit_id_not_matching = Το αναγνωριστικό της υποβολής δεν ταιριάζει με την υποβολή που επεξεργαστήκατε. Θα πρέπει να υποβάλετε τις αλλαγές σας σε έναν νέο κλάδο και μετά να τις συγχωνεύσετε.
+editor.commit_id_not_matching = Το αρχείο άλλαξε όσο το επεξεργαζόσασταν. Θα πρέπει να υποβάλετε τις αλλαγές σας σε έναν νέο κλάδο και μετά να τις συγχωνεύσετε.
settings.sourcehut_builds.visibility = Ορατότητα εργασιών
object_format = Μορφή αντικειμένων («object format»)
settings.ignore_stale_approvals_desc = Οι εγκρίσεις, οι οποίες αναφέρονται σε παλαιότερες υποβολές, δεν θα προσμετρούνται στο σύνολο των απαιτούμενων εγκρίσεων του pull request. Εφόσον αυτές οι εγκρίσεις έχουν ήδη ανακληθεί, τότε αυτή η ρύθμιση δεν θα παίξει κάποιον ρόλο.
@@ -2722,6 +2746,30 @@ file_follow = Ακολούθηση συνδέσμου (symlink)
settings.sourcehut_builds.secrets_helper = Παραχώρηση πρόσβασης του job στα μυστικά ενός build (απαιτείται η άδεια SECRETS:RO)
generated = Παραγμένο
editor.push_out_of_date = Η αλλαγή φαίνεται να είναι παρωχημένη.
+issues.author.tooltip.issue = Αυτό το ζήτημα δημιουργήθηκε από αυτόν τον χρήστη.
+issues.author.tooltip.pr = Αυτό το pull request δημιουργήθηκε από αυτόν τον χρήστη.
+settings.federation_settings = Ρυθμίσεις διαλειτουργικότητας
+settings.federation_apapiurl = Το Federation URL (URL διαλειτουργικότητας) του αποθετηρίου. Κάντε το copy-paste στις ρυθμίσεις διαλειτουργικότητας ενός άλλου αποθετηρίου ως το URL ενός ακολουθούμενου αποθετηρίου.
+form.string_too_long = Το κείμενο είναι μεγαλύτερο από %d χαρακτήρες.
+release.hide_archive_links = Απόκρυψη αυτόματα δημιουργημένων archive
+settings.graphql_url = URL του GraphQL
+issues.edit.already_changed = Δεν ήταν δυνατή η αποθήκευση των αλλαγών στο ζήτημα αυτό, επειδή το περιεχόμενο έχει ήδη αλλαχθεί από κάποιον άλλο χρήστη. Για να μην χαθούν οι αλλαγές του, παρακαλείσθε να ανανεώσετε την σελίδα και προσπαθήστε να το επεξεργαστείτε ξανά.
+project = Έργα
+settings.sourcehut_builds.access_token_helper = Διακριτικό πρόσβασης (token) που έχει άδεια JOBS:RW. Δημιουργήστε ένα διακριτκό πρόσβασης για το build.sr.ht ή ένα διακριτικό πρόσβασης build.sr.ht με πρόσβαση ιδιωτικών περιεχομένων στο meta.sr.ht.
+settings.federation_not_enabled = Οι λειτουργίες διαλειτουργικότητας δεν είναι ενεργοποιημένες στον διακομιστή σας.
+settings.federation_following_repos = URL ακουλουθούμενων αποθετηρίων. Διαχωρίζονται με «;», χωρίς κενά.
+subscribe.issue.guest.tooltip = Συνδεθείτε για να λάβετε ενημερώσεις για το ζήτημα αυτό.
+subscribe.pull.guest.tooltip = Συνδεθείτε για να λάβετε ενημερώσεις για το pull request αυτό.
+pulls.edit.already_changed = Δεν ήταν δυνατή η αποθήκευση των αλλαγών στο pull request αυτό, επειδή το περιεχόμενο έχει ήδη αλλαχθεί από κάποιον άλλο χρήστη. Για να μην χαθούν οι αλλαγές του, παρακαλείσθε να ανανεώσετε την σελίδα και προσπαθήστε να το επεξεργαστείτε ξανά.
+comments.edit.already_changed = Δεν ήταν δυνατή η αποθήκευση των αλλαγών σε αυτό το σχόλιο, επειδή το περιεχόμενο έχει ήδη αλλαχθεί από κάποιον άλλο χρήστη. Για να μην χαθούν οι αλλαγές του, παρακαλείσθε να ανανεώσετε την σελίδα και προσπαθήστε να το επεξεργαστείτε ξανά.
+settings.matrix.access_token_helper = Για τον σκοπό αυτό, σας συνιστούμε να δημιουργήσετε έναν ξεχωριστό λογαριασμό Matrix. Μπορείτε να αποκτήσετε το διακριτικό πρόσβασης μέσα στο Element.
+settings.transfer.modal.title = Παραχώρηση ιδιοκτησίας
+settings.transfer.button = Παραχώρηση ιδιοκτησίας
+settings.matrix.room_id_helper = Το ID δωματίου μπορείτε να το βρείτε στο πρόγραμμα Element > Room Settings > Advanced > Internal room ID. Παράδειγμα: %s.
+wiki.search = Αναζήτηση wiki
+wiki.no_search_results = Κανένα αποτέλεσμα
+n_release_one = %s κυκλοφορία
+n_release_few = %s κυκλοφορίες
[graphs]
component_loading_failed = Δεν ήταν δυνατή η φόρτωση του %s
@@ -2791,7 +2839,7 @@ settings.labels_desc=Προσθήκη σημάτων που μπορούν να
members.membership_visibility=Ορατότητα μέλους:
members.public=Ορατό
-members.public_helper=κάνε το κρυφό
+members.public_helper=κάνε κρυφό
members.private=Κρυφό
members.private_helper=κάνε ορατό
members.member_role=Ρόλος μέλους:
@@ -2855,7 +2903,8 @@ teams.all_repositories_admin_permission_desc=Αυτή η ομάδα παρέχε
teams.invite.title=Έχετε προσκληθεί να συμμετάσχετε στην ομάδα %s του οργανισμού %s.
teams.invite.by=Προσκλήθηκε από %s
teams.invite.description=Παρακαλώ κάντε κλικ στον παρακάτω σύνδεσμο για συμμετοχή στην ομάδα.
-follow_blocked_user = Δεν μπορείτε να ακολουθήσετε αυτόν τον οργανισμό, επειδή ο οργανισμός σας έχει αποκλείσει.
+follow_blocked_user = Δεν μπορείτε να ακολουθήσετε τον οργανισμό, επειδή σας έχει αποκλείσει.
+open_dashboard = Δημιουργία πίνακα δραστηριότητας
[admin]
dashboard=Πίνακας Ελέγχου
@@ -2999,7 +3048,7 @@ users.delete_account=Διαγραφή λογαριασμού χρήστη
users.cannot_delete_self=Δεν μπορείτε να διαγράψετε τον εαυτό σας
users.still_own_repo=Αυτός ο χρήστης εξακολουθεί να κατέχει ένα ή περισσότερα αποθετήρια. Διαγράψτε ή μεταφέρετε αυτά τα αποθετήρια πρώτα.
users.still_has_org=Αυτός ο χρήστης είναι μέλος ενός οργανισμού. Αφαιρέστε πρώτα τον χρήστη από οποιονδήποτε οργανισμό.
-users.purge=Εκκαθάριση Χρήστη
+users.purge=Διαγραφή χρήστη
users.purge_help=Εξαναγκαστική διαγραφή χρήστη καθώς και των αποθετηρίων, οργανισμών και πακέτων που του ανήκουν. Όλα τα σχόλια και τα ζητήματα του χρήστη θα διαγραφούν επίσης.
users.still_own_packages=Αυτός ο χρήστης εξακολουθεί να κατέχει ένα ή περισσότερα πακέτα, διαγράψτε αυτά τα πακέτα πρώτα.
users.deletion_success=Ο λογαριασμός χρήστη έχει διαγραφεί.
@@ -3009,14 +3058,14 @@ users.list_status_filter.reset=Επαναφορά
users.list_status_filter.is_active=Ενεργό
users.list_status_filter.not_active=Ανενεργό
users.list_status_filter.is_admin=Διαχειριστής
-users.list_status_filter.not_admin=Μη Διαχειριστής
+users.list_status_filter.not_admin=Χωρίς δικαιώματα διαχειριστή
users.list_status_filter.is_restricted=Περιορισμένος
-users.list_status_filter.not_restricted=Μη Περιορισμένος
-users.list_status_filter.is_prohibit_login=Απαγόρευση Σύνδεσης
-users.list_status_filter.not_prohibit_login=Επιτρέπεται η Σύνδεση
-users.list_status_filter.is_2fa_enabled=2FA Ενεργοποιημένο
-users.list_status_filter.not_2fa_enabled=2FA Απενεργοποιημένο
-users.details=Λεπτομέρειες Χρήστη
+users.list_status_filter.not_restricted=Χωρίς περιορισμούς
+users.list_status_filter.is_prohibit_login=Απαγορευμένη σύνδεση
+users.list_status_filter.not_prohibit_login=Επιτρέπεται η σύνδεση
+users.list_status_filter.is_2fa_enabled=Με ενεργοποιημένο 2FA
+users.list_status_filter.not_2fa_enabled=Χωρίς 2FA
+users.details=Λεπτομέρειες χρήστη
emails.email_manage_panel=Διαχείριση email χρηστών
emails.primary=Κύριο
@@ -3051,8 +3100,8 @@ repos.size=Μέγεθος
repos.lfs_size=Μέγεθος LFS
packages.package_manage_panel=Διαχείριση πακέτων
-packages.total_size=Συνολικό Μέγεθος: %s
-packages.unreferenced_size=Μέγεθος Χωρίς Αναφορά: %s
+packages.total_size=Συνολικό μέγεθος: %s
+packages.unreferenced_size=Μέγεθος χωρίς αναφορά: %s
packages.cleanup=Εκκαθάριση ληγμένων δεδομένων
packages.cleanup.success=Επιτυχής εκκαθάριση δεδομένων που έχουν λήξει
packages.owner=Ιδιοκτήτης
@@ -3122,7 +3171,7 @@ auths.allowed_domains_helper=Αφήστε κενό για να επιτρέψε
auths.skip_tls_verify=Παράλειψη επαλήθευσης TLS
auths.force_smtps=Αναγκαστικό SMTPS
auths.force_smtps_helper=Το SMTPS χρησιμοποιείται συνήθως στη θύρα 465. Ορίστε αυτό το πεδίο για χρήση του SMTPS σε άλλες θύρες. (Αλλιώς το STARTTLS θα χρησιμοποιηθεί σε άλλες θύρες αν υποστηρίζεται από τον διακομιστή.)
-auths.helo_hostname=Όνομα διακομιστή στο HELO
+auths.helo_hostname=Όνομα διακομιστή HELO
auths.helo_hostname_helper=Όνομα διακομιστή που αποστέλλεται με το HELO. Αφήστε κενό για να στείλετε το τρέχον όνομα του διακομιστή.
auths.disable_helo=Απενεργοποίηση HELO
auths.pam_service_name=Όνομα υπηρεσίας PAM
@@ -3162,7 +3211,7 @@ auths.sspi_separator_replacement_helper=Ο χαρακτήρας που θα χρ
auths.sspi_default_language=Προεπιλεγμένη γλώσσα χρήστη
auths.sspi_default_language_helper=Προεπιλεγμένη γλώσσα για τους χρήστες που δημιουργούνται αυτόματα με τη μέθοδο ταυτοποίησης SSPI. Αφήστε κενό αν προτιμάτε η γλώσσα να εντοπιστεί αυτόματα.
auths.tips=Συμβουλές
-auths.tips.oauth2.general=Ταυτοποίηση OAuth2
+auths.tips.oauth2.general=Ταυτοποίηση μέσω OAuth2
auths.tips.oauth2.general.tip=Κατά την εγγραφή μιας νέας ταυτοποίησης OAuth2, το URL κλήσης/ανακατεύθυνσης πρέπει να είναι:
auths.tip.oauth2_provider=Πάροχος OAuth2
auths.tip.bitbucket=Καταχωρήστε έναν νέο καταναλωτή OAuth στο https://bitbucket.org/account/user//oauth-consumers/new και προσθέστε το δικαίωμα 'Account' - 'Read'
@@ -3218,7 +3267,7 @@ config.ssh_start_builtin_server=Χρήση ενσωματωμένου διακο
config.ssh_domain=Domain διακομιστή SSH
config.ssh_port=Θύρα
config.ssh_listen_port=Θύρα ακρόασης (Listen port)
-config.ssh_root_path=Ριζική Διαδρομή
+config.ssh_root_path=Τοποθεσία root
config.ssh_key_test_path=Διαδρομή δοκιμής κλειδιού
config.ssh_keygen_path=Διαδρομή keygen («ssh-keygen»)
config.ssh_minimum_key_size_check=Έλεγχος ελάχιστου μεγέθους κλειδιού
@@ -3242,7 +3291,7 @@ config.service_config=Ρυθμίσεις υπηρεσίας
config.register_email_confirm=Να απαιτείται η επιβεβαίωση της διεύθυνσης email για την δημιουργία ενός λογαριασμού
config.disable_register=Απενεργοποίηση αυτο-εγγραφής
config.allow_only_internal_registration=Να επιτρέπονται εγγραφές μόνο μέσω του Forgejo
-config.allow_only_external_registration=Να επιτρέπονται εγγραφές μόνο με την χρήση εξωτερικών υπηρεσιών
+config.allow_only_external_registration=Να επιτρέπονται οι εγγραφές μόνο μέσω εξωτερικών υπηρεσιών
config.enable_openid_signup=Ενεργοποίηση αυτο-εγγραφής OpenID
config.enable_openid_signin=Ενεργοποίηση σύνδεσης μέσω OpenID
config.show_registration_button=Εμφάνιση κουμπιού εγγραφής
@@ -3397,6 +3446,12 @@ config.open_with_editor_app_help = Οι επεξεργαστές κειμένο
auths.tip.gitlab_new = Μπορείτε να δημιουργήσετε μία νέα εφαρμογή στο https://gitlab.com/-/profile/applications
self_check.database_collation_mismatch = Η βάση δεδομένων αναμένεται να χρησιμοποιεί το collation: %s
self_check.database_collation_case_insensitive = Η βάση δεδομένων χρησιμοποιεί το collation %s, το οποίο δεν ξεχωρίζει κεφαλαία και πεζά γράμματα. Αν και το Forgejo μπορεί να δουλέψει με αυτό, ίσως να προκύψουν κάποιες σπάνιες περιπτώσεις όπου κάτι δεν θα δουλέψει όπως αναμένεται.
+config.cache_test_failed = Η δοκιμή cache απέτυχε: %v.
+config.cache_test_succeeded = Η δοκιμή cache πέτυχε, λάβαμε απάντηση σε %s.
+config.cache_test = Δοκιμή cache
+config.cache_test_slow = Η δοκιμή cache πέτυχε, αλλά καθυστέρησε: %s.
+config.app_slogan = Slogan διακομιστή
+auths.default_domain_name = Προεπιλεγμένο domain name που χρησιμοποιείται για την διεύθυνση email
[action]
@@ -3749,6 +3804,7 @@ runs.no_workflows.documentation = Για περισσότερες πληροφο
runs.no_workflows.quick_start = Δεν ξέρετε από που να πρωτοξεκινήσετε με το Forgejo Actions; Για μια γρήγορη αρχή, συμβουλευτείτε τον οδηγό μας.
runs.workflow = Ροή εργασίας
runs.no_job_without_needs = Η ροή εργασίας πρέπει να περιέχει τουλάχιστον ένα έργο που δεν εξαρτάται από κάποιο άλλο έργο.
+runs.no_job = Η ροή εργασιών πρέπει να περιέχει τουλάχιστον μία εργασία (job)
[projects]
type-1.display_name=Ατομικό έργο
@@ -3787,6 +3843,10 @@ user_kind = Αναζήτηση χρηστών...
org_kind = Αναζήτηση οργανισμών...
team_kind = Αναζήτηση ομαδών...
code_kind = Αναζήτηση κώδικα...
+exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης
+issue_kind = Αναζήτηση ζητημάτων...
+pull_kind = Αναζήτηση pull...
+exact = Ακριβής
[munits.data]
mib = MiB
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index bac0e8515a..439617cead 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -180,6 +180,7 @@ commit_kind = Search commits...
runner_kind = Search runners...
no_results = No matching results found.
issue_kind = Search issues...
+milestone_kind = Search milestones...
pull_kind = Search pulls...
keyword_search_unavailable = Searching by keyword is currently not available. Please contact the site administrator.
@@ -491,7 +492,7 @@ admin.new_user.subject = New user %s just signed up
admin.new_user.user_info = User information
admin.new_user.text = Please click here to manage this user from the admin panel.
-register_notify = Welcome to Forgejo
+register_notify_prev9 = Welcome to Forgejo
register_notify.text_1 = this is your registration confirmation email for %s!
register_notify.text_2 = You can sign into your account using your username: %s
register_notify.text_3 = If someone else made this account for you, you will need to set your password first.
@@ -1075,7 +1076,7 @@ license = License
license_helper = Select a license file.
license_helper_desc = A license governs what others can and can't do with your code. Not sure which one is right for your project? See Choose a license.
object_format = Object format
-object_format_helper = Object format of the repository. Cannot be changed later. SHA1 is most compatible.
+object_format_helper = Object format of the repository. Cannot be changed later. SHA1 is the most compatible.
readme = README
readme_helper = Select a README file template.
readme_helper_desc = This is the place where you can write a complete description for your project.
@@ -1304,6 +1305,8 @@ view_git_blame = View git blame
video_not_supported_in_browser = Your browser does not support the HTML5 "video" tag.
audio_not_supported_in_browser = Your browser does not support the HTML5 "audio" tag.
stored_lfs = Stored with Git LFS
+stored_annex = Stored with Git Annex
+stored_annex_not_present = not present here, try using git annex whereis
symbolic_link = Symbolic link
executable_file = Executable file
vendored = Vendored
@@ -1322,6 +1325,8 @@ normal_view = Normal View
line = line
lines = lines
from_comment = (comment)
+no_eol.text = No EOL
+no_eol.tooltip = This file doesn't contain a trailing end of line character.
editor.add_file = Add file
editor.new_file = New file
@@ -1329,6 +1334,7 @@ editor.upload_file = Upload file
editor.edit_file = Edit file
editor.preview_changes = Preview changes
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
+editor.cannot_edit_annex_files = Annex files cannot be edited in the web interface.
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
editor.edit_this_file = Edit file
editor.this_file_locked = File is locked
@@ -1614,8 +1620,8 @@ issues.reopened_at = `reopened this issue %[2]s`
issues.commit_ref_at = `referenced this issue from a commit %[2]s`
issues.ref_issue_from = `referenced this issue %[4]s%[2]s`
issues.ref_pull_from = `referenced this pull request %[4]s%[2]s`
-issues.ref_closing_from = `referenced a pull request %[4]s that will close this issue%[2]s`
-issues.ref_reopening_from = `referenced a pull request %[4]s that will reopen this issue%[2]s`
+issues.ref_closing_from = `referenced this issue from a pull request %[4]s that will close it, %[2]s`
+issues.ref_reopening_from = `referenced this issue from a pull request %[4]s that will reopen it, %[2]s`
issues.ref_closed_from = `closed this issue %[4]s%[2]s`
issues.ref_reopened_from = `reopened this issue %[4]s%[2]s`
issues.ref_from = `from %[1]s`
@@ -1936,7 +1942,7 @@ pulls.close = Close pull request
pulls.closed_at = `closed this pull request %[2]s`
pulls.reopened_at = `reopened this pull request %[2]s`
pulls.commit_ref_at = `referenced this pull request from a commit %[2]s`
-pulls.cmd_instruction_hint = `View command line instructions.`
+pulls.cmd_instruction_hint = View command line instructions
pulls.cmd_instruction_checkout_title = Checkout
pulls.cmd_instruction_checkout_desc = From your project repository, check out a new branch and test the changes.
pulls.cmd_instruction_merge_title = Merge
@@ -2116,6 +2122,7 @@ activity.git_stats_addition_n = %d additions
activity.git_stats_and_deletions = and
activity.git_stats_deletion_1 = %d deletion
activity.git_stats_deletion_n = %d deletions
+activity.commit = Commit activity
contributors.contribution_type.filter_label = Contribution type:
contributors.contribution_type.commits = Commits
@@ -2265,7 +2272,7 @@ settings.trust_model.collaboratorcommitter = Collaborator+Committer
settings.trust_model.collaboratorcommitter.long = Collaborator+Committer: Trust signatures by collaborators which match the committer
settings.trust_model.collaboratorcommitter.desc = Valid signatures by collaborators of this repository will be marked "trusted" if they match the committer. Otherwise, valid signatures will be marked "untrusted" if the signature matches the committer and "unmatched" otherwise. This will force Forgejo to be marked as the committer on signed commits with the actual committer marked as Co-Authored-By: and Co-Committed-By: trailer in the commit. The default Forgejo key must match a User in the database.
settings.wiki_rename_branch_main = Normalize the Wiki branch name
-settings.wiki_rename_branch_main_desc = Rename the branch used internally by the Wiki to "%s". This is a permanent and cannot be undone.
+settings.wiki_rename_branch_main_desc = Rename the branch used internally by the Wiki to "%s". This change is permanent and cannot be undone.
settings.wiki_rename_branch_main_notices_1 = This operation CANNOT be undone.
settings.wiki_rename_branch_main_notices_2 = This will permanently rename the the internal branch of %s's repository wiki. Existing checkouts will need to be updated.
settings.wiki_branch_rename_success = The repository wiki's branch name has been successfully normalized.
@@ -2743,7 +2750,7 @@ topic.done = Done
topic.count_prompt = You cannot select more than 25 topics
topic.format_prompt = Topics must start with a letter or number, can include dashes ("-") and dots ("."), can be up to 35 characters long. Letters must be lowercase.
-find_file.go_to_file = Go to file
+find_file.go_to_file = Find a file
find_file.no_matching = No matching file found
error.csv.too_large = Can't render this file because it is too large.
@@ -3071,7 +3078,7 @@ orgs.new_orga = New organization
repos.repo_manage_panel = Manage repositories
repos.unadopted = Unadopted repositories
-repos.unadopted.no_more = No more unadopted repositories found
+repos.unadopted.no_more = No unadopted repositories found.
repos.owner = Owner
repos.name = Name
repos.private = Private
@@ -3815,3 +3822,6 @@ submodule = Submodule
filepreview.line = Line %[1]d in %[2]s
filepreview.lines = Lines %[1]d to %[2]d in %[3]s
filepreview.truncated = Preview has been truncated
+
+[translation_meta]
+test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to translate it as "ok" to hit the 100% completion :) and save some time
diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini
index 275fc069f5..13081571fa 100644
--- a/options/locale/locale_eo.ini
+++ b/options/locale/locale_eo.ini
@@ -135,6 +135,13 @@ toggle_menu = Baskuli menuon
access_token = Alira ĵetono
remove_all = Forigi ĉion
remove_label_str = Forigi «%s»
+test = Provo
+invalid_data = Nevalidaj datumoj: %v
+more_items = Pli da eroj
+copy_generic = Kopii al tondujo
+confirm_delete_artifact = Ĉu vi certas, ke vi volas forigi la artefakton "%s"?
+artifacts = Artefaktoj
+new_repo.title = Novan deponejon
[editor]
buttons.list.ordered.tooltip = Aldoni nombran liston
@@ -421,7 +428,7 @@ active_your_account = Aktivigi vian konton
[mail]
activate_account.text_1 = Saluton %[1]s, dankon pro via registriĝo ĉe %[2]s!
release.title = Nomo: %s
-register_notify = Bonvenon al Forgejo
+register_notify_prev9 = Bonvenon al Forgejo
reply = aŭ respondu tiun ĉi retleteron rekte
issue.action.close = @%[1]s fermis #%[2]d.
register_notify.text_1 = jen estas via registriĝa konfirmletero por %s!
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index 8545b93b0c..af1db67e4b 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -32,7 +32,7 @@ password=Contraseña
access_token=Token de acceso
re_type=Confirmar contraseña
captcha=CAPTCHA
-twofa=Autenticación de doble factor
+twofa=Autenticación de dos factores
twofa_scratch=Código de respaldo
passcode=Código de acceso
@@ -59,7 +59,7 @@ new_mirror=Nueva réplica
new_fork=Nuevo fork de repositorio
new_org=Nueva organización
new_project=Nuevo proyecto
-new_project_column=Columna nueva
+new_project_column=Nueva columna
manage_org=Administrar organizaciones
admin_panel=Administración del sitio
account_settings=Configuraciones de la cuenta
@@ -86,7 +86,7 @@ rerun=Re-ejecutar
rerun_all=Volver a ejecutar todos los trabajos
save=Guardar
add=Añadir
-add_all=Añadir todo
+add_all=Añadir todos
remove=Eliminar
remove_all=Eliminar todos
remove_label_str=`Eliminar elemento "%s"`
@@ -116,7 +116,7 @@ go_back=Volver
never=Nunca
unknown=Desconocido
-rss_feed=Fuentes RSS
+rss_feed=Fuente RSS
pin=Anclar
unpin=Desanclar
@@ -140,24 +140,30 @@ confirm_delete_selected=¿Borrar todos los elementos seleccionados?
name=Nombre
value=Valor
view = Vista
-tracked_time_summary = Resumen del tiempo de monitorización basado en filtros de la lista de incidencias
+tracked_time_summary = Resumen del tiempo rastreado en función de los filtros de la lista de incidencias
filter = Filtro
filter.clear = Limpiar filtros
filter.is_archived = Archivado
filter.not_archived = No archivado
-filter.is_mirror = Replicado
-filter.not_mirror = No replicado
-filter.is_template = Plantilla
-filter.not_template = No plantilla
+filter.is_mirror = Replicas
+filter.not_mirror = No replicas
+filter.is_template = Plantillas
+filter.not_template = No plantillas
filter.public = Público
filter.private = Privado
-toggle_menu = Alternar Menú
+toggle_menu = Alternar menú
invalid_data = Datos inválidos: %v
+confirm_delete_artifact = ¿Estás seguro de que deseas eliminar el artefacto "%s"?
+more_items = Mas cosas
+copy_generic = Copiar al portapapeles
+filter.not_fork = No forks
+filter.is_fork = Forks
+test = Test
[aria]
navbar=Barra de navegación
footer=Pie
-footer.software=Acerca del Software
+footer.software=Acerca de este software
footer.links=Enlaces
[heatmap]
@@ -165,6 +171,9 @@ number_of_contributions_in_the_last_12_months=%s contribuciones en los últimos
contributions_zero=No hay contribuciones
less=Menos
more=Más
+contributions_one = contribución
+contributions_few = contribuciones
+contributions_format = {contributions} el {day} {month} {year}
[editor]
buttons.heading.tooltip=Añadir encabezado
@@ -181,6 +190,8 @@ buttons.ref.tooltip=Referir a una incidencia o pull request
buttons.switch_to_legacy.tooltip=Utilizar el editor antiguo en su lugar
buttons.enable_monospace_font=Activar fuente monoespaciada
buttons.disable_monospace_font=Desactivar fuente monoespaciada
+buttons.unindent.tooltip = Desanidar elementos por un nivel
+buttons.indent.tooltip = Anidar elementos por un nivel
[filter]
string.asc=A - Z
@@ -200,7 +211,7 @@ app_desc=Un servicio de Git autoalojado y sin complicaciones
install=Fácil de instalar
install_desc=Simplemente ejecuta el binario para tu plataforma, lánzalo con Dockero consíguelo empaquetado.
platform=Multiplataforma
-platform_desc=Forgejo funciona en cualquier platforma Go puede compilarlo en: Windows, macOS, Linux, ARM, etc. ¡Elige tu favorita!
+platform_desc=Se ha confirmado que Forgejo funciona en sistemas operativos libres como Linux y FreeBSD, así como en diferentes arquitecturas de CPU. ¡Elige la que más te guste!
lightweight=Ligero
lightweight_desc=Forgejo tiene pocos requisitos y puede funcionar en una Raspberry Pi barata. ¡Ahorra energía!
license=Código abierto
@@ -237,7 +248,7 @@ err_admin_name_is_invalid=Nombre de usuario del administrador no es válido
general_title=Configuración general
app_name=Título del sitio
-app_name_helper=Puede colocar aquí el nombre de su empresa.
+app_name_helper=Introduzca aquí el nombre de su instancia. Aparecerá en todas las páginas.
repo_path=Ruta de la raíz del repositorio
repo_path_helper=Los repositorios Git se guardarán en este directorio.
lfs_path=Ruta raíz de Git LFS
@@ -247,16 +258,16 @@ run_user_helper=El nombre de usuario del sistema operativo que ejecuta Forgejo.
domain=Dominio del servidor
domain_helper=Dominio o dirección de host para el servidor.
ssh_port=Puerto de servidor SSH
-ssh_port_helper=Número de puerto en el que está escuchando su servidor SSH. Déjelo vacío para deshabilitarlo.
-http_port=Puerto de escucha HTTP de Forgejo
-http_port_helper=Número de puerto en el que escuchará el servidor web de Forgejo.
+ssh_port_helper=Número de puerto que será utilizado por el servidor SSH. Déjelo vacío para desactivar el servidor SSH.
+http_port=Puerto de escucha HTTP
+http_port_helper=Número de puerto que será utilizado por el servidor web de Forgejo.
app_url=URL base
app_url_helper=Dirección base para URLs de clonación HTTP(S) y notificaciones de correo electrónico.
log_root_path=Ruta del registro
log_root_path_helper=Archivos de registro se escribirán en este directorio.
optional_title=Configuración opcional
-email_title=Configuración de Correo
+email_title=Configuración de correo electrónico
smtp_addr=Servidor SMTP
smtp_port=Puerto SMTP
smtp_from=Enviar correos electrónicos como
@@ -266,67 +277,72 @@ mailer_password=Contraseña SMTP
register_confirm=Requerir confirmación de correo electrónico para registrarse
mail_notify=Habilitar las notificaciones por correo electrónico
server_service_title=Configuración del servidor y de servicios de terceros
-offline_mode=Habilitar autenticación Local
+offline_mode=Habilitar modo local
offline_mode.description=Deshabilitar redes de distribución de contenido de terceros y servir todos los recursos localmente.
disable_gravatar=Desactivar Gravatar
-disable_gravatar.description=Desactivar el Gravatar y fuentes de avatares de terceros. Se utilizará un avatar por defecto a menos que un usuario suba un avatar localmente.
+disable_gravatar.description=Desactivar el Gravatar y otros fuentes de avatares de terceros. Se utilizará un avatar por defecto a menos que un usuario suba un avatar localmente.
federated_avatar_lookup=Habilitar avatares federados
-federated_avatar_lookup.description=Habilitar búsqueda de avatares federador para usar el servicio federado de código abierto basado en libravatar.
+federated_avatar_lookup.description=Buscar de avatares con Libravatar.
disable_registration=Deshabilitar auto-registro
-disable_registration.description=Deshabilitar auto-registro de usuarios. Sólo los administradores podrán crear nuevas cuentas de usuario.
-allow_only_external_registration.description=Permitir el registro únicamente a través de servicios externos
+disable_registration.description=Sólo los administradores de la instancia podrán crear nuevas cuentas. Es muy recomendable mantener deshabilitado el registro a menos que pretenda alojar una instancia pública para todo el mundo y esté preparado para lidiar con grandes cantidades de cuentas de spam.
+allow_only_external_registration.description=Los usuarios sólo podrán crear nuevas cuentas utilizando servicios externos configurados.
openid_signin=Habilitar el inicio de sesión con OpenID
-openid_signin.description=Habilitar el inicio de sesión de usuarios con OpenID.
+openid_signin.description=Permitir a los usuarios iniciar sesión mediante OpenID.
openid_signup=Habilitar el auto-registro con OpenID
-openid_signup.description=Habilitar autorregistro de usuario basado en OpenID.
+openid_signup.description=Permitir a los usuarios crear cuentas mediante OpenID si el autorregistro está activado.
enable_captcha=Requerir CAPTCHA durante el registro
-enable_captcha.description=Requerir CAPTCHA para auto-registro de usuario.
-require_sign_in_view=Requerir inicio de sesión para ver páginas
+enable_captcha.description=Requerir que los usuarios pasen CAPTCHA para crear cuentas.
+require_sign_in_view=Requerir inicio de sesión para ver el contenido de la instancia
require_sign_in_view.description=Limitar el acceso a los usuarios conectados. Los visitantes sólo verán las páginas de inicio de sesión y de registro.
admin_setting.description=Crear una cuenta de administrador es opcional. El primer usuario registrado se convertirá automáticamente en administrador.
admin_title=Configuración de la cuenta de administrador
admin_name=Nombre de usuario del administrador
admin_password=Contraseña
-confirm_password=Confirmar Contraseña
+confirm_password=Confirmar contraseña
admin_email=Correo electrónico
install_btn_confirm=Instalar Forgejo
-test_git_failed=Fallo al probar el comando 'git': %v
-sqlite3_not_available=Esta versión de Forgejo no soporta SQLite3. Por favor, descarga la versión binaria oficial de %s (no la versión 'gobuild').
+test_git_failed=Fallo al probar el comando "git": %v
+sqlite3_not_available=Esta versión de Forgejo no soporta SQLite3. Por favor, descarga la versión binaria oficial de %s (no la versión "gobuild").
invalid_db_setting=La configuración de la base de datos no es válida: %v
invalid_db_table=La tabla "%s" de la base de datos no es válida: %v
invalid_repo_path=La ruta de la raíz del repositorio no es válida: %v
invalid_app_data_path=La ruta de datos de la aplicación (APP_DATA_PATH) no es válida: %v
-run_user_not_match=El nombre de usuario 'ejecutar como' no es el nombre actual de usuario: %s -> %s
+run_user_not_match=El nombre de usuario "ejecutar como" no es el nombre del usuario actual: %s -> %s
internal_token_failed=Fallo al generar el INTERNAL_TOKEN: %v
secret_key_failed=Fallo al generar el SECRET_KEY: %v
save_config_failed=Error al guardar la configuración: %v
invalid_admin_setting=La configuración de la cuenta de administración no es válida: %v
invalid_log_root_path=La ruta para los registros no es válida: %v
default_keep_email_private=Ocultar direcciones de correo electrónico por defecto
-default_keep_email_private.description=Ocultar direcciones de correo electrónico de nuevas cuentas de usuario por defecto.
+default_keep_email_private.description=Ocultar direcciones de correo electrónico de nuevas cuentas por defecto, de modo que esta información no se divulgue inmediatamente después de registrarse.
default_allow_create_organization=Permitir la creación de organizaciones por defecto
-default_allow_create_organization.description=Permitir que las nuevas cuentas de usuario creen organizaciones por defecto.
+default_allow_create_organization.description=Permitir a los nuevos usuarios crear organizaciones por defecto. Si esta opción está desactivada, un administrador tendrá que conceder el permiso para crear organizaciones a los nuevos usuarios.
default_enable_timetracking=Activar el seguimiento de tiempo por defecto
default_enable_timetracking.description=Activar el seguimiento de tiempo para nuevos repositorios por defecto.
no_reply_address=Dominio de correos electrónicos ocultos
-no_reply_address_helper=Nombre de dominio para usuarios con dirección de correo electrónico oculta. Por ejemplo, el usuario 'joe' quedará registrado en Git como 'joe@noreply.example.org' si el dominio de correo electrónico oculto se establece a 'noreply.example.org'.
-password_algorithm=Algoritmo Hash de Contraseña
+no_reply_address_helper=Nombre de dominio para usuarios con dirección de correo electrónico oculta. Por ejemplo, el usuario "joe" quedará registrado en Git como "joe@noreply.example.org" si el dominio de correo electrónico oculto está configurado como "noreply.example.org".
+password_algorithm=Algoritmo hash de contraseña
invalid_password_algorithm=Algoritmo hash de contraseña no válido
password_algorithm_helper=Establece el algoritmo de hashing de contraseña. Los algoritmos tienen diferentes requisitos y fuerza. El algoritmo argon2 es bastante seguro, pero usa mucha memoria y puede ser inapropiado para sistemas pequeños.
enable_update_checker=Activar comprobador de actualizaciones
env_config_keys=Configuración del entorno
env_config_keys_prompt=Las siguientes variables de entorno también se aplicarán a su archivo de configuración:
allow_dots_in_usernames = Permite utilizar puntos en los nombres de usuario. No tiene efecto sobre cuentas existentes.
-enable_update_checker_helper_forgejo = Comprobaciones periódicas de nuevas versiones de Forgejo mediante la comprobación del registro DNS TXT en release.forgejo.org.
+enable_update_checker_helper_forgejo = Buscará periódicamente nuevas versiones de Forgejo consultando un registro DNS TXT en release.forgejo.org.
+smtp_from_invalid = La dirección "Enviar correos electrónicos como" no es válida
+allow_only_external_registration = Permitir el registro sólo a través de servicios externos
+app_slogan = Eslogan de la instancia
+app_slogan_helper = Introduce aquí el eslogan de tu instancia. Déjalo vacío para desactivar.
+config_location_hint = Estas opciones de configuración se guardarán en:
[home]
uname_holder=Nombre de usuario o correo electrónico
password_holder=Contraseña
-switch_dashboard_context=Cambiar el contexto del Dashboard
+switch_dashboard_context=Cambiar el contexto del dashboard
my_repos=Repositorios
show_more_repos=Mostrar más repositorios…
collaborative_repos=Repositorios colaborativos
-my_orgs=Mis organizaciones
+my_orgs=Organizaciones
my_mirrors=Mis réplicas
view_home=Ver %s
search_repos=Buscar un repositorio…
@@ -369,16 +385,18 @@ relevant_repositories_tooltip=Repositorios que son bifurcaciones o que no tienen
relevant_repositories=Solo se muestran repositorios relevantes, mostrar resultados sin filtrar.
forks_few = %d forks
forks_one = %d fork
+stars_few = %d estrellas
+stars_one = %d estrella
[auth]
-create_new_account=Registrar una cuenta
+create_new_account=Registrar cuenta
register_helper_msg=¿Ya tienes una cuenta? ¡Inicia sesión!
social_register_helper_msg=¿Ya tienes una cuenta? ¡Enlázala!
disable_register_prompt=Registro deshabilitado. Por favor, póngase en contacto con el administrador del sitio.
disable_register_mail=Correo electrónico de confirmación de registro deshabilitado.
manual_activation_only=Póngase en contacto con el administrador del sitio para completar la activación.
-remember_me=Recordar este Dispositivo
-forgot_password_title=He olvidado mi contraseña
+remember_me=Recordar este dispositivo
+forgot_password_title=Contraseña olvidada
forgot_password=¿Has olvidado tu contraseña?
sign_up_now=¿Necesitas una cuenta? Regístrate ahora.
sign_up_successful=La cuenta se ha creado correctamente. ¡Bienvenido!
@@ -386,10 +404,10 @@ confirmation_mail_sent_prompt=Un nuevo correo de confirmación se ha enviado a <
must_change_password=Actualizar su contraseña
allow_password_change=Obligar al usuario a cambiar la contraseña (recomendado)
reset_password_mail_sent_prompt=Un correo de confirmación se ha enviado a %s. Compruebe su bandeja de entrada en las siguientes %s para completar el proceso de recuperación de la cuenta.
-active_your_account=Activa tu cuenta
+active_your_account=Activar tu cuenta
account_activated=La cuenta ha sido activada
-prohibit_login=Ingreso prohibido
-prohibit_login_desc=Su cuenta no puede iniciar sesión, póngase en contacto con el administrador de su sitio.
+prohibit_login=La cuenta está suspendida
+prohibit_login_desc=Se ha suspendido la interacción de su cuenta con la instancia. Póngase en contacto con el administrador para recuperar su acceso.
resent_limit_prompt=Ya ha solicitado recientemente un correo de activación. Por favor, espere 3 minutos y vuelva a intentarlo.
has_unconfirmed_mail=Hola %s, su correo electrónico (%s) no está confirmado. Si no ha recibido un correo de confirmación o necesita que lo enviemos de nuevo, por favor, haga click en el siguiente botón.
resend_mail=Haga click aquí para reenviar su correo electrónico de activación
@@ -412,11 +430,11 @@ twofa_scratch_token_incorrect=El código de respaldo es incorrecto.
login_userpass=Iniciar sesión
tab_openid=OpenID
oauth_signup_tab=Registrar nueva cuenta
-oauth_signup_title=Completar Cuenta Nueva
-oauth_signup_submit=Completar Cuenta
-oauth_signin_tab=Vincular a una Cuenta Existente
-oauth_signin_title=Regístrese para autorizar cuenta vinculada
-oauth_signin_submit=Vincular Cuenta
+oauth_signup_title=Completar cuenta nueva
+oauth_signup_submit=Completar cuenta
+oauth_signin_tab=Vincular a una cuenta existente
+oauth_signin_title=Iniciar sesión para autorizar cuenta vinculada
+oauth_signin_submit=Vincular cuenta
oauth.signin.error=Hubo un error al procesar la solicitud de autorización. Si este error persiste, póngase en contacto con el administrador del sitio.
oauth.signin.error.access_denied=La solicitud de autorización fue denegada.
oauth.signin.error.temporarily_unavailable=La autorización falló porque el servidor de autenticación no está disponible temporalmente. Inténtalo de nuevo más tarde.
@@ -432,7 +450,7 @@ email_domain_blacklisted=No puede registrarse con su correo electrónico.
authorize_application=Autorizar aplicación
authorize_redirect_notice=Será redirigido a %s si autoriza esta aplicación.
authorize_application_created_by=Esta aplicación fue creada por %s.
-authorize_application_description=Si concede el acceso, podrá acceder y escribir a toda la información de su cuenta, incluyendo repositorios privado y organizaciones.
+authorize_application_description=Si concede el acceso, podrá acceder y escribir a toda la información de su cuenta, incluyendo repositorios privados y organizaciones.
authorize_title=¿Autorizar a "%s" a acceder a su cuenta?
authorization_failed=Autorización fallida
authorization_failed_desc=La autorización ha fallado porque hemos detectado una solicitud no válida. Por favor, póngase en contacto con el responsable de la aplicación que ha intentado autorizar.
@@ -443,11 +461,17 @@ change_unconfirmed_email = Si has proporcionado una dirección de correo electr
change_unconfirmed_email_error = No es posible cambiar la dirección de correo electrónico: %v
change_unconfirmed_email_summary = Cambia la dirección de correo electrónico a quien se envía el correo de activación.
last_admin = No puedes eliminar al último admin (administrador). Debe haber, al menos, un admin.
+sign_up_button = Regístrate ahora.
+hint_login = ¿Ya tienes cuenta? ¡Ingresa ahora!
+hint_register = ¿Necesitas una cuenta? Regístrate ahora.
+back_to_sign_in = Volver a Iniciar sesión
+sign_in_openid = Proceder con OpenID
+remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas.
[mail]
view_it_on=Ver en %s
reply=o responde directamente a este correo electrónico
-link_not_working_do_paste=¿No funciona? Intenta copiarlo y pegarlo en tu navegador.
+link_not_working_do_paste=¿No funciona el enlace? Intenta copiarlo y pegarlo en tu navegador.
hi_user_x=Hola %s,
activate_account=Por favor, active su cuenta
@@ -459,11 +483,11 @@ activate_email=Verifique su correo electrónico
activate_email.title=%s, por favor verifique su dirección de correo electrónico
activate_email.text=Por favor, haga clic en el siguiente enlace para verificar su dirección de correo electrónico dentro de %s:
-register_notify=¡Bienvenido a Forgejo
+register_notify_prev9=Bienvenido a Forgejo
register_notify.title=%[1]s, bienvenido a %[2]s
register_notify.text_1=este es tu correo de confirmación de registro para %s!
-register_notify.text_2=Ahora puede iniciar sesión vía nombre de usuario: %s.
-register_notify.text_3=Si esta cuenta ha sido creada para usted, por favor establezca su contraseña primero.
+register_notify.text_2=Puede iniciar sesión con su nombre de usuario: %s
+register_notify.text_3=Si otra persona creó esta cuenta para usted, tendrá que establecer su contraseña primero.
reset_password=Recupere su cuenta
reset_password.title=%s, has solicitado recuperar tu cuenta
@@ -497,12 +521,12 @@ release.downloads=Descargas:
release.download.zip=Código fuente (ZIP)
release.download.targz=Código fuente (TAR.GZ)
-repo.transfer.subject_to=%s desea transferir "%s" a %s
-repo.transfer.subject_to_you=%s desea transferir "%s" a usted
+repo.transfer.subject_to=%s quiere transferir el repositorio "%s" a %s
+repo.transfer.subject_to_you=%s quiere transferir el repositorio "%s" a usted
repo.transfer.to_you=usted
repo.transfer.body=Para aceptarlo o rechazarlo, visita %s o simplemente ignórelo.
-repo.collaborator.added.subject=%s le añadió en %s
+repo.collaborator.added.subject=%s le añadió a %s como colaborador
repo.collaborator.added.text=Has sido añadido como colaborador del repositorio:
team_invite.subject=%[1]s le ha invitado a unirse a la organización de %[2]s
@@ -512,6 +536,21 @@ team_invite.text_3=Nota: Esta invitación estaba destinada a %[1]s. Si no espera
admin.new_user.subject = Se acaba de registrar el nuevo usuario %s
admin.new_user.user_info = Información del usuario
admin.new_user.text = Por favor, pulsa aquí para gestionar este usuario desde el panel de administración.
+account_security_caution.text_1 = Si fuiste tú, puedes ignorar este correo.
+removed_security_key.subject = Se ha eliminado una clave de seguridad
+removed_security_key.no_2fa = Ya no hay otros métodos 2FA configurados, lo que significa que ya no es necesario iniciar sesión en tu cuenta con 2FA.
+password_change.subject = Tu contraseña ha sido modificada
+password_change.text_1 = La contraseña de tu cuenta acaba de ser modificada.
+primary_mail_change.subject = Tu correo principal ha sido modificado
+totp_disabled.subject = Se ha desactivado el TOTP
+totp_disabled.text_1 = La contraseña de un solo uso basada en el tiempo (TOTP) de tu cuenta acaba de ser desactivada.
+totp_disabled.no_2fa = Ya no hay otros métodos 2FA configurados, lo que significa que ya no es necesario iniciar sesión en tu cuenta con 2FA.
+account_security_caution.text_2 = Si no fuiste tú, tu cuenta está comprometida. Ponte en contacto con los administradores de este sitio.
+totp_enrolled.subject = Has activado TOTP como método 2FA
+totp_enrolled.text_1.no_webauthn = Acabas de activar TOTP para tu cuenta. Esto significa que para todos los futuros inicios de sesión en tu cuenta, debes utilizar TOTP como método 2FA.
+removed_security_key.text_1 = La clave de seguridad "%[1]s" acaba de ser eliminada de tu cuenta.
+primary_mail_change.text_1 = El correo principal de tu cuenta acaba de ser cambiado a %[1]s. Esto significa que esta dirección de correo electrónico ya no recibirá notificaciones por correo electrónico relativas a tu cuenta.
+totp_enrolled.text_1.has_webauthn = Acabas de activar TOTP para tu cuenta. Esto significa que para todos los futuros inicios de sesión en tu cuenta, podrás utilizar TOTP como método 2FA o bien utilizar cualquiera de tus claves de seguridad.
[modal]
yes=Sí
@@ -525,7 +564,7 @@ UserName=Nombre de usuario
RepoName=Nombre del repositorio
Email=Dirección de correo electrónico
Password=Contraseña
-Retype=Confirmar Contraseña
+Retype=Confirmar contraseña
SSHTitle=Nombre de la Clave de SSH
HttpsUrl=URL HTTPS
PayloadUrl=URL de carga
@@ -541,11 +580,11 @@ TreeName=Ruta del archivo
Content=Contenido
SSPISeparatorReplacement=Separador
-SSPIDefaultLanguage=Idioma predeterminado
+SSPIDefaultLanguage=Idioma por defecto
require_error=` no puede estar vacío.`
-alpha_dash_error=` solo debe contener caracteres alfanuméricos, guiones medios ('-') y guiones bajos ('_').`
-alpha_dash_dot_error=` solo debe contener caracteres alfanuméricos, guiones, ('-'), subrayados ('_'), y puntos ('.').`
+alpha_dash_error=` solo debe contener caracteres alfanuméricos, guiones ("-"), y guiones bajos ("_").`
+alpha_dash_dot_error=` solo debe contener caracteres alfanuméricos, guiones ("-"), guiones bajos ("_"), y puntos (".").`
git_ref_name_error=` debe ser un nombre de referencia de Git bien formado.`
size_error=` debe ser de tamaño %s.`
min_size_error=` debe contener al menos %s caracteres.`
@@ -555,7 +594,7 @@ url_error=`"%s" no es una URL válida.`
include_error=` debe contener la subcadena "%s".`
glob_pattern_error=` el patrón globo no es válido: %s.`
regex_pattern_error=` el patrón de regex no es válido: %s.`
-username_error=` sólo puede contener caracteres alfanuméricos ('0-9','a-z','A-Z'), guión ('-'), guión bajo ('_') y punto ('.'). No puede comenzar o terminar con caracteres no alfanuméricos, y los caracteres no alfanuméricos consecutivos también están prohibidos.`
+username_error=` sólo puede contener caracteres alfanuméricos ("0-9","a-z","A-Z"), guión ("-"), guión bajo ("_") y punto ("."). No puede comenzar o terminar con caracteres no alfanuméricos, y los caracteres no alfanuméricos consecutivos también están prohibidos.`
invalid_group_team_map_error=` la asignación no es válida: %s`
unknown_error=Error desconocido:
captcha_incorrect=El código CAPTCHA no es correcto.
@@ -591,7 +630,7 @@ enterred_invalid_owner_name=El nuevo nombre de usuario no es válido.
enterred_invalid_password=La contraseña que ha introducido es incorrecta.
user_not_exist=Este usuario no existe.
team_not_exist=Este equipo no existe.
-last_org_owner=No puedes eliminar al último usuario del equipo de 'propietarios'. Todas las organizaciones deben tener al menos un propietario.
+last_org_owner=No puedes eliminar al último usuario del equipo de "propietarios". Todas las organizaciones deben tener al menos un propietario.
cannot_add_org_to_team=Una organización no puede ser añadida como miembro de un equipo.
duplicate_invite_to_team=El usuario ya fue invitado como miembro del equipo.
organization_leave_success=Ha abandonado correctamente la organización %s.
@@ -603,15 +642,26 @@ must_use_public_key=La clave que proporcionó es una clave privada. No cargue su
unable_verify_ssh_key=No se puede verificar la clave SSH, comprueba si hay errores.
auth_failed=Autenticación fallo: %v
-still_own_repo=Su cuenta posee uno o más repositorios, elimínalos o transfiérelos primero.
+still_own_repo=Tu cuenta posee uno o más repositorios, elimínalos o transfiérelos primero.
still_has_org=Tu cuenta es miembro de una o más organizaciones, déjalas primero.
-still_own_packages=Su cuenta posee uno o más paquetes, elimínalos primero.
+still_own_packages=Tu cuenta posee uno o más paquetes, elimínalos primero.
org_still_own_repo=Esta organización todavía posee uno o más repositorios, elimínalos o transfiérelos primero.
org_still_own_packages=Esta organización todavía posee uno o más paquetes, elimínalos primero.
target_branch_not_exist=La rama de destino no existe
admin_cannot_delete_self = No puedes eliminarte a ti mismo cuando eres un admin (administrador). Por favor, elimina primero tus privilegios de administrador.
-username_error_no_dots = ` solo puede contener carácteres alfanuméricos ('0-9','a-z','A-Z'), guiones ('-') y guiones bajos ('_'). No puede empezar o terminar con carácteres no alfanuméricos y también están prohibidos los carácteres no alfanuméricos consecutivos.`
+username_error_no_dots = ` solo puede contener carácteres alfanuméricos ("0-9","a-z","A-Z"), guiones ("-"), y guiones bajos ("_"). No puede empezar o terminar con carácteres no alfanuméricos y también están prohibidos los carácteres no alfanuméricos consecutivos.`
+unsupported_login_type = No se admite el tipo de inicio de sesión para eliminar la cuenta.
+required_prefix = La entrada debe empezar por "%s"
+unset_password = El usuario no ha establecido una contraseña.
+AccessToken = Token de acceso
+FullName = Nombre completo
+Description = Descripción
+Pronouns = Pronombres
+Biography = Biografía
+Location = Ubicación
+To = Nombre de rama
+Website = Sitio web
[user]
@@ -620,7 +670,7 @@ joined_on=Se unió el %s
repositories=Repositorios
activity=Actividad pública
followers_few=%d seguidores
-starred=Repositorios Favoritos
+starred=Repositorios favoritos
watched=Repositorios seguidos
code=Código
projects=Proyectos
@@ -640,12 +690,22 @@ form.name_pattern_not_allowed=El patrón "%s" no está permitido en un nombre de
form.name_chars_not_allowed=El nombre de usuario "%s" contiene caracteres no válidos.
block_user = Bloquear usuario
block_user.detail_1 = Este usuario te ha dejado de seguir.
-block_user.detail_2 = Este usuario no puede interactuar con tus repositorios, incidencias creadas y comentarios.
+block_user.detail_2 = Este usuario no podrá interactuar con tus repositorios ni con las incidencias y comentarios que hayas creado.
block_user.detail_3 = Este usuario no te puede añadir como colaborador ni tú le puedes añadir como colaborador.
follow_blocked_user = No puedes seguir a este usuario porque le tienes bloqueado o te tiene bloqueado.
block = Bloquear
unblock = Desbloquear
-block_user.detail = Por favor, comprende que si bloqueas a este usuario se llevarán a cabo otras acciones. Como:
+block_user.detail = Ten en cuenta que bloquear a un usuario tiene otros efectos, como:
+public_activity.visibility_hint.self_private = Tu actividad sólo es visible para ti y para los administradores de la instancia. Configurar.
+public_activity.visibility_hint.admin_private = Esta actividad es visible para ti porque eres administrador, pero el usuario quiere que se mantenga privada.
+following_one = %d siguiendo
+followers_one = %d seguidor
+public_activity.visibility_hint.self_public = Tu actividad es visible para todos, excepto las interacciones en espacios privados. Configurar.
+public_activity.visibility_hint.admin_public = Esta actividad es visible para todos, pero como administrador también puedes ver las interacciones en los espacios privados.
+following.title.one = Siguiendo
+following.title.few = Siguiendo
+followers.title.one = Seguidor
+followers.title.few = Seguidores
[settings]
profile=Perfil
@@ -654,17 +714,17 @@ appearance=Apariencia
password=Contraseña
security=Seguridad
avatar=Avatar
-ssh_gpg_keys=SSH / claves GPG
-social=Redes Sociales
+ssh_gpg_keys=Claves SSH / GPG
+social=Redes sociales
applications=Aplicaciones
orgs=Administrar organizaciones
repos=Repositorios
delete=Eliminar cuenta
-twofa=Autenticación de doble factor
+twofa=Autenticación de dos factores (TOTP)
account_link=Cuentas vinculadas
organization=Organizaciones
uid=UID
-webauthn=Llaves de Seguridad
+webauthn=Autenticación de dos factores (claves de seguridad)
public_profile=Perfil público
biography_placeholder=¡Cuéntanos un poco sobre ti mismo! (Puedes usar Markdown)
@@ -674,9 +734,9 @@ password_username_disabled=Usuarios no locales no tienen permitido cambiar su no
full_name=Nombre completo
website=Página web
location=Localización
-update_theme=Actualizar tema
+update_theme=Cambiar tema
update_profile=Actualizar perfil
-update_language=Actualizar idioma
+update_language=Cambiar idioma
update_language_not_found=Idioma "%s" no está disponible.
update_language_success=El idioma ha sido actualizado.
update_profile_success=Tu perfil ha sido actualizado.
@@ -697,7 +757,7 @@ comment_type_group_milestone=Hito
comment_type_group_assignee=Asignado
comment_type_group_title=Título
comment_type_group_branch=Rama
-comment_type_group_time_tracking=Seguimiento de Tiempo
+comment_type_group_time_tracking=Seguimiento de tiempo
comment_type_group_deadline=Fecha límite
comment_type_group_dependency=Dependencia
comment_type_group_lock=Estado de bloqueo
@@ -711,11 +771,11 @@ keep_activity_private=Ocultar actividad de la página de perfil
keep_activity_private_popup=Hace la actividad visible sólo para ti y los administradores
lookup_avatar_by_mail=Buscar avatar por dirección de correo electrónico
-federated_avatar_lookup=Búsqueda de Avatar Federado
-enable_custom_avatar=Activar avatar personalizado
+federated_avatar_lookup=Búsqueda de avatar federado
+enable_custom_avatar=Usar avatar personalizado
choose_new_avatar=Selecciona nuevo avatar
-update_avatar=Actualizar Avatar
-delete_current_avatar=Eliminar avatar
+update_avatar=Actualizar avatar
+delete_current_avatar=Eliminar avatar actual
uploaded_avatar_not_a_image=El archivo subido no es una imagen.
uploaded_avatar_is_too_big=El tamaño del archivo subido (%d KiB) excede el tamaño máximo (%d KiB).
update_avatar_success=Su avatar ha sido actualizado.
@@ -723,23 +783,23 @@ update_user_avatar_success=El avatar del usuario se ha actualizado.
update_password=Actualizar contraseña
old_password=Contraseña actual
-new_password=Nueva contraseña
-retype_new_password=Confirme la nueva contraseña
+new_password=Contraseña nueva
+retype_new_password=Confirmar contraseña nueva
password_incorrect=Contraseña actual incorrecta.
change_password_success=Su contraseña ha sido modificada. Utilice su nueva contraseña la próxima vez que acceda a la cuenta.
password_change_disabled=Los usuarios no locales no pueden actualizar su contraseña a través de la interfaz web de Forgejo.
emails=Direcciones de correo electrónico
manage_emails=Administrar direcciones de correo electrónico
-manage_themes=Selecciona el tema por defecto
-manage_openid=Administrar direcciones OpenID
+manage_themes=Tema por defecto
+manage_openid=Direcciones OpenID
email_desc=Su dirección de correo electrónico principal se utilizará para notificaciones, recuperación de contraseña y, siempre y cuando no esté oculto, operaciones de Git basadas en la web.
theme_desc=Este será su tema por defecto en todo el sitio.
primary=Principal
activated=Activado
requires_activation=Requiere activación
primary_email=Hacer primaria
-activate_email=Enviar email de activación
+activate_email=Enviar activación
activations_pending=Activaciones pendientes
can_not_add_email_activations_pending=Hay una activación pendiente, inténtelo de nuevo en unos minutos si desea agregar un nuevo correo electrónico.
delete_email=Eliminar
@@ -760,23 +820,23 @@ add_email_success=La nueva dirección de correo electrónico ha sido añadida.
email_preference_set_success=La preferencia de correo electrónico se ha establecido correctamente.
add_openid_success=La nueva dirección OpenID ha sido añadida.
keep_email_private=Ocultar dirección de correo electrónico
-keep_email_private_popup=Esto ocultará su dirección de correo electrónico de su perfil, así como cuando haga un pull request o edite un archivo usando la interfaz web. Los commits enviados no serán modificados.
+keep_email_private_popup=Esto ocultará tu dirección de correo electrónico de tu perfil. Ya no será la dirección predeterminada para los commits realizados a través de la interfaz web, como las subidas y ediciones de archivos, y no se utilizará para los commits de fusión. En su lugar, se utilizará una dirección especial %s para asociar los commits a tu cuenta. Ten en cuenta que cambiar esta opción no afectará a los commits existentes.
openid_desc=OpenID le permite delegar la autenticación a un proveedor externo.
-manage_ssh_keys=Gestionar Claves SSH
+manage_ssh_keys=Gestionar claves SSH
manage_ssh_principals=Administrar Principales de Certificado SSH
-manage_gpg_keys=Administrar claves GPG
-add_key=Añadir Clave
-ssh_desc=Estas claves públicas SSH están asociadas con su cuenta. Las correspondientes claves privadas permite acceso completo a sus repositorios.
+manage_gpg_keys=Gestionar claves GPG
+add_key=Añadir clave
+ssh_desc=Estas claves SSH públicas están asociadas a tu cuenta. Las correspondientes claves privadas permiten el acceso total a tus repositorios. Las claves SSH que han sido verificadas pueden utilizarse para verificar commits de Git firmados por SSH.
principal_desc=Estos principales de certificado SSH están asociados con su cuenta y permiten el acceso completo a sus repositorios.
-gpg_desc=Estas claves públicas GPG están asociadas con su cuenta. Mantenga sus claves privadas a salvo, ya que permiten verificar commits.
+gpg_desc=Estas claves GPG públicas están asociadas a tu cuenta y se utilizan para verificar tus commits. Mantén a salvo tus claves privadas, ya que permiten firmar commits con tu identidad.
ssh_helper=¿Necesitas ayuda? Echa un vistazo en la guía de GitHub para crear tus propias claves SSH o resolver problemas comunes que puede encontrar al usar SSH.
gpg_helper=¿Necesitas ayuda? Echa un vistazo en la guía de GitHub sobre GPG.
add_new_key=Añadir clave SSH
add_new_gpg_key=Añadir clave GPG
-key_content_ssh_placeholder=Comienza con 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', or 'sk-ssh-ed25519@openssh.com'
-key_content_gpg_placeholder=Comienza con '-----BEGIN PGP PUBLIC KEY BLOCK-----'
-add_new_principal=Añadir Principal
+key_content_ssh_placeholder=Comienza con "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", o "sk-ssh-ed25519@openssh.com"
+key_content_gpg_placeholder=Comienza con "-----BEGIN PGP PUBLIC KEY BLOCK-----"
+add_new_principal=Añadir principal
ssh_key_been_used=Esta clave SSH ya ha sido añadida al servidor.
ssh_key_name_used=Una clave SSH con el mismo nombre ya ha sido añadida a su cuenta.
ssh_principal_been_used=Este principal ya ha sido añadido al servidor.
@@ -793,7 +853,7 @@ gpg_token=Token
gpg_token_help=Puede generar una firma de la siguiente manera:
gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig
gpg_token_signature=Firma GPG armadura
-key_signature_gpg_placeholder=Comienza con '-----BEGIN PGP SIGNATURE-----'
+key_signature_gpg_placeholder=Comienza con "-----BEGIN PGP SIGNATURE-----"
verify_gpg_key_success=La clave GPG "%s" ha sido verificada.
ssh_key_verified=Clave verificada
ssh_key_verified_long=La clave ha sido verificada con un token y puede ser usada para verificar confirmaciones que coincidan con cualquier dirección de correo electrónico activada para este usuario.
@@ -803,11 +863,11 @@ ssh_token_required=Debe proporcionar una firma para el token de abajo
ssh_token=Token
ssh_token_help=Puede generar una firma de la siguiente manera:
ssh_token_signature=Firma SSH armadura
-key_signature_ssh_placeholder=Comienza con '-----BEGIN SSH SIGNATURE-----'
+key_signature_ssh_placeholder=Comienza con "-----BEGIN SSH SIGNATURE-----"
verify_ssh_key_success=La clave SSH "%s" ha sido verificada.
subkeys=Subclaves
key_id=ID de clave
-key_name=Nombre de la Clave
+key_name=Nombre de la clave
key_content=Contenido
principal_content=Contenido
add_key_success=La clave SSH "%s" ha sido añadida.
@@ -843,15 +903,15 @@ social_desc=Estas cuentas sociales se pueden utilizar para iniciar sesión en tu
unbind=Desvincular
unbind_success=La cuenta social se ha eliminado correctamente.
-manage_access_token=Administrar Tokens de Acceso
-generate_new_token=Generar nuevo Token
+manage_access_token=Tokens de acceso
+generate_new_token=Generar nuevo token
tokens_desc=Estos tokens otorgan acceso a su cuenta usando la API de Forgejo.
-token_name=Nombre del Token
-generate_token=Generar Token
+token_name=Nombre del token
+generate_token=Generar token
generate_token_success=Su nuevo token ha sido generado. Cópielo ahora, ya que no se volverá a mostrar.
generate_token_name_duplicate=%s ya se ha utilizado como nombre de la aplicación. Por favor, utilice una nueva.
delete_token=Eliminar
-access_token_deletion=Eliminar Token de Acceso
+access_token_deletion=Eliminar token de acceso
access_token_deletion_cancel_action=Cancelar
access_token_deletion_confirm_action=Eliminar
access_token_deletion_desc=Eliminar un token revocará el acceso a su cuenta para las aplicaciones que lo usen. Esto no se puede deshacer. ¿Continuar?
@@ -862,7 +922,7 @@ permissions_access_all=Todo (público, privado y limitado)
select_permissions=Seleccionar permisos
permission_no_access=Sin acceso
permission_read=Leídas
-permission_write=Lectura y Escritura
+permission_write=Lectura y escritura
access_token_desc=Los permisos de los tokens seleccionados limitan la autorización sólo a las rutas API correspondientes. Lea la documentación para más información.
at_least_one_permission=Debe seleccionar al menos un permiso para crear un token
permissions_list=Permisos:
@@ -874,10 +934,10 @@ remove_oauth2_application=Eliminar aplicación OAuth2
remove_oauth2_application_desc=Eliminar una aplicación OAuth2 revocará el acceso a todos los tokens de acceso firmados. ¿Continuar?
remove_oauth2_application_success=La aplicación ha sido eliminada.
create_oauth2_application=Crear una nueva aplicación OAuth2
-create_oauth2_application_button=Crear Aplicación
+create_oauth2_application_button=Crear aplicación
create_oauth2_application_success=Ha creado con éxito una nueva aplicación de OAuth2.
update_oauth2_application_success=Ha actualizado correctamente la aplicación de OAuth2.
-oauth2_application_name=Nombre de la Aplicación
+oauth2_application_name=Nombre de la aplicación
oauth2_confidential_client=Cliente confidencial. Seleccione para aplicaciones que mantengan el secreto confidencial, tales como aplicaciones web. No seleccione para aplicaciones nativas, incluyendo aplicaciones de escritorio y móviles.
oauth2_redirect_uris=Redirigir URIs. Por favor, usa una nueva línea para cada URI.
save_application=Guardar
@@ -892,7 +952,7 @@ oauth2_application_remove_description=Eliminar una aplicación de OAuth2 evitar
oauth2_application_locked=Forgejo pre-registra algunas aplicaciones de OAuth2 en el arranque si están habilitadas en la configuración. Para prevenir un comportamiento inesperado, estos no pueden ser editados ni removidos. Por favor, consulte la documentación de OAuth2 para más información.
authorized_oauth2_applications=Aplicaciones OAuth2 autorizadas
-authorized_oauth2_applications_description=Has concedido acceso a tu cuenta personal de Forgejo a estas aplicaciones de terceros. Por favor, revoca el acceso para las aplicaciones que ya no necesitas.
+authorized_oauth2_applications_description=Has concedido acceso a tu cuenta personal de Forgejo a estas aplicaciones de terceros. Por favor, revoca el acceso para las aplicaciones que ya no estén en uso.
revoke_key=Revocar
revoke_oauth2_grant=Revocar acceso
revoke_oauth2_grant_description=Revocar el acceso a esta aplicación impedirá que esta aplicación acceda a sus datos. ¿Está seguro?
@@ -901,7 +961,7 @@ revoke_oauth2_grant_success=Acceso revocado correctamente.
twofa_desc=La autenticación de doble factor mejora la seguridad de su cuenta.
twofa_is_enrolled=Su cuenta actualmente está registrada en la autenticación de doble factor.
twofa_not_enrolled=Tu cuenta no está actualmente inscrita en la autenticación de doble factor.
-twofa_disable=Deshabilitar autenticación de doble factor
+twofa_disable=Deshabilitar autenticación de dos factores
twofa_scratch_token_regenerate=Regenerar código de respaldo
twofa_scratch_token_regenerated=Tu token de scratch es ahora %s. Guárdelo en un lugar seguro, nunca se volverá a mostrar.
twofa_enroll=Inscribirse en la autenticación de doble factor
@@ -922,10 +982,10 @@ webauthn_nickname=Apodo
webauthn_delete_key=Eliminar clave de seguridad
webauthn_delete_key_desc=Si elimina una llave de seguridad ya no podrá utilizarla para iniciar sesión con ella. ¿Continuar?
-manage_account_links=Administrar cuentas vinculadas
+manage_account_links=Cuentas vinculadas
manage_account_links_desc=Estas cuentas externas están vinculadas a su cuenta de Forgejo.
account_links_not_available=Actualmente no hay cuentas externas vinculadas a su cuenta de Forgejo.
-link_account=Enlazar cuenta
+link_account=Vincular cuenta
remove_account_link=Eliminar cuenta vinculada
remove_account_link_desc=Eliminar una cuenta vinculada revocará su acceso a su cuenta de Forgejo. ¿Continuar?
remove_account_link_success=La cuenta vinculada ha sido eliminada.
@@ -938,14 +998,14 @@ repos_none=No posees ningún repositorio.
delete_account=Elimina tu cuenta
delete_prompt=Esta operación eliminará permanentemente su cuenta de usuario. NO podrá deshacerse.
delete_with_all_comments=Tu cuenta es menor de %s. Para evitar comentarios fantasma, todos los comentarios/PR serán eliminados con ella.
-confirm_delete_account=Confirmar Eliminación
+confirm_delete_account=Confirmar eliminación
delete_account_title=Eliminar cuenta de usuario
delete_account_desc=¿Está seguro que desea eliminar permanentemente esta cuenta de usuario?
email_notifications.enable=Habilitar notificaciones por correo electrónico
email_notifications.onmention=Enviar correo sólo al ser mencionado
email_notifications.disable=Deshabilitar las notificaciones por correo electrónico
-email_notifications.submit=Establecer preferencias de correo electrónico
+email_notifications.submit=Establecer preferencia de correo electrónico
email_notifications.andyourown=Y sus propias notificaciones
visibility=Visibilidad del usuario
@@ -962,7 +1022,20 @@ twofa_recovery_tip = Si pierdes tu dispositivo podrás usar una clave única de
webauthn_alternative_tip = Es posible que deseee configurar un método de autenticación adicional.
webauthn_key_loss_warning = Si pierdes tus claves de seguridad perderás acceso a tu cuenta.
blocked_users = Usuarios bloqueados
-blocked_users_none = No has bloqueado a ningún usuario.
+blocked_users_none = No hay usuarios bloqueados.
+update_hints = Actualizar sugerencias
+pronouns = Pronombres
+pronouns_custom = Personalizados
+additional_repo_units_hint = Sugerir la habilitación de unidades de repositorio adicionales
+additional_repo_units_hint_description = Mostrar un botón "Añadir más unidades..." para los repositorios que no tengan habilitadas todas las unidades disponibles.
+language.title = Idioma por defecto
+update_hints_success = Se han actualizado las sugerencias.
+pronouns_unspecified = No especificados
+hints = Sugerencias
+change_password = Cambiar contraseña
+keep_activity_private.description = Tu actividad pública solo será visible para ti y para los administradores de la instancia.
+language.description = Este idioma se guardará en tu cuenta y se utilizará como predeterminado cuando te conectes.
+language.localization_project = ¡Ayúdanos a traducir Forgejo a tu idioma! Más información.
[repo]
owner=Propietario
@@ -971,14 +1044,14 @@ repo_name=Nombre del repositorio
repo_name_helper=Un buen nombre de repositorio está compuesto por palabras clave cortas, memorables y únicas.
repo_size=Tamaño del repositorio
template=Plantilla
-template_select=Seleccionar una plantilla.
+template_select=Seleccionar una plantilla
template_helper=Hacer del repositorio una plantilla
template_description=Las plantillas de repositorio permiten a los usuarios generar nuevos repositorios con la misma estructura de directorios, archivos y configuraciones opcionales.
visibility=Visibilidad
visibility_description=Sólo el propietario o los miembros de la organización -si tienen derechos- podrán verlo.
visibility_helper=Hacer el repositorio privado
visibility_helper_forced=El administrador de su sitio obliga a nuevos repositorios a ser privados.
-visibility_fork_helper=(Cambiar esto afectará a todos los forks)
+visibility_fork_helper=(Cambiar esto afectará a la visibilidad de todos los forks.)
clone_helper=¿Necesita ayuda para clonar? Visite Ayuda.
fork_repo=Hacer fork del repositorio
fork_from=Crear un fork desde
@@ -998,15 +1071,15 @@ generate_from=Generar desde
repo_desc=Descripción
repo_desc_helper=Introduce una descripción corta (opcional)
repo_lang=Idioma
-repo_gitignore_helper=Seleccionar plantillas de .gitignore.
+repo_gitignore_helper=Seleccionar plantillas de .gitignore
repo_gitignore_helper_desc=Elija qué archivos no rastrear de una lista de plantillas para idiomas comunes. Los artefactos típicos generados por las herramientas de construcción de cada idioma se incluyen por defecto en .gitignore.
-issue_labels=Etiquetas de incidencia
-issue_labels_helper=Seleccione un conjunto de etiquetas de incidencia.
+issue_labels=Etiquetas
+issue_labels_helper=Selecciona un conjunto de etiquetas
license=Licencia
-license_helper=Seleccione un archivo de licencia.
+license_helper=Selecciona un archivo de licencia
license_helper_desc=Una licencia regula lo que otros pueden y no pueden hacer con tu código. ¿No está seguro de cuál es el adecuado para su proyecto? Vea Elija una licencia.
readme=LÉAME
-readme_helper=Seleccione una plantilla de archivo LÉAME.
+readme_helper=Selecciona una plantilla de archivo README
readme_helper_desc=Este es el lugar donde puedes escribir una descripción completa de su proyecto.
auto_init=Inicializar el repositorio (añade .gitignore, licencia y README)
trust_model_helper=Seleccionar modelo de confianza para la verificación de la firma. Las opciones posibles son:
@@ -1020,18 +1093,18 @@ default_branch_label=por defecto
default_branch_helper=La rama por defecto es la rama base para pull requests y commits de código.
mirror_prune=Purgar
mirror_prune_desc=Eliminar referencias de seguimiento de remotes obsoletas
-mirror_interval=Intervalo de réplica (Las unidades de tiempo válidas son 'h', 'm', 's'). 0 para deshabilitar la sincronización automática. (Intervalo mínimo: %s)
+mirror_interval=Intervalo de réplica (Las unidades de tiempo válidas son "h", "m", "s"). 0 para deshabilitar la sincronización automática. (Intervalo mínimo: %s)
mirror_interval_invalid=El intervalo de réplica no es válido.
mirror_sync_on_commit=Sincronizar cuando los commits sean subidos
mirror_address=Clonar desde URL
mirror_address_desc=Ponga cualquier credencial requerida en la sección de Autorización.
-mirror_address_url_invalid=La URL proporcionada no es válida. Debe escapar todos los componentes de la url correctamente.
+mirror_address_url_invalid=La URL proporcionada no es válida. Debe escapar correctamente todos los componentes de la URL.
mirror_address_protocol_invalid=La URL proporcionada no es válida. Sólo http(s):// o git:// se puede utilizar para ser replicadas.
mirror_lfs=Almacenamiento de archivos grande (LFS)
mirror_lfs_desc=Activar la reproducción de datos LFS.
-mirror_lfs_endpoint=Punto final de LFS
+mirror_lfs_endpoint=Destino LFS
mirror_lfs_endpoint_desc=Sync intentará usar la url del clon para determinar el servidor LFS. También puede especificar un punto final personalizado si los datos LFS del repositorio se almacenan en otro lugar.
-mirror_last_synced=Sincronizado por última vez
+mirror_last_synced=Última sincronización
mirror_password_placeholder=(Sin cambios)
mirror_password_blank_placeholder=(Indefinido)
mirror_password_help=Cambie el nombre de usario para eliminar una contraseña almacenada.
@@ -1075,8 +1148,8 @@ desc.archived=Archivado
template.items=Elementos de plantilla
template.git_content=Contenido Git (rama predeterminada)
-template.git_hooks=Git Hooks
-template.git_hooks_tooltip=Actualmente no puede modificar ni eliminar Git Hooks después de haberlos agregado. Seleccione esto solo si confía en el repositorio de plantillas.
+template.git_hooks=Hooks de Git
+template.git_hooks_tooltip=Actualmente no puedes modificar ni eliminar hooks de Git una vez añadidos. Selecciona esto solo si confías en el repositorio de plantillas.
template.webhooks=Webhooks
template.topics=Temas
template.avatar=Avatar
@@ -1220,6 +1293,7 @@ view_git_blame=Ver la culpa de Git
video_not_supported_in_browser=Su navegador no soporta el tag video de HTML5.
audio_not_supported_in_browser=Su navegador no soporta el tag audio de HTML5.
stored_lfs=Almacenados con Git LFS
+stored_annex=Almacenados con Git Annex
symbolic_link=Enlace simbólico
executable_file=Archivo Ejecutable
commit_graph=Gráfico de commits
@@ -1243,6 +1317,7 @@ editor.upload_file=Subir archivo
editor.edit_file=Editar Archivo
editor.preview_changes=Vista previa de los cambios
editor.cannot_edit_lfs_files=Los archivos LFS no se pueden editar en la interfaz web.
+editor.cannot_edit_annex_files=Los archivos Annex no se pueden editar en la interfaz web.
editor.cannot_edit_non_text_files=Los archivos binarios no se pueden editar en la interfaz web.
editor.edit_this_file=Editar Archivo
editor.this_file_locked=El archivo está bloqueado
@@ -1289,10 +1364,10 @@ editor.commit_empty_file_header=Commit un archivo vacío
editor.commit_empty_file_text=El archivo que estás tratando de commit está vacío. ¿Proceder?
editor.no_changes_to_show=No existen cambios para mostrar.
editor.fail_to_update_file=Error al actualizar/crear el archivo "%s".
-editor.fail_to_update_file_summary=Mensaje de error
+editor.fail_to_update_file_summary=Mensaje de error:
editor.push_rejected_no_message=El cambio fue rechazado por el servidor sin un mensaje. Por favor, compruebe Git Hooks.
editor.push_rejected=El cambio fue rechazado por el servidor. Por favor, comprueba los Git Hooks.
-editor.push_rejected_summary=Mensaje completo de rechazo
+editor.push_rejected_summary=Mensaje completo de rechazo:
editor.add_subdir=Añadir un directorio…
editor.unable_to_upload_files=Error al subir los archivos a "%s" con error: %v
editor.upload_file_is_locked=El archivo "%s" está bloqueado por %s.
@@ -1639,7 +1714,7 @@ issues.due_date_form=aaaa-mm-dd
issues.due_date_form_add=Añadir fecha de vencimiento
issues.due_date_form_edit=Editar
issues.due_date_form_remove=Eliminar
-issues.due_date_not_writer=Necesita acceso de escritura a este repositorio para actualizar la fecha límite de de una incidencia.
+issues.due_date_not_writer=Necesitas acceso de escritura a este repositorio para actualizar la fecha límite de una incidencia.
issues.due_date_not_set=Sin fecha de vencimiento.
issues.due_date_added=añadió la fecha de vencimiento %s %s
issues.due_date_modified=modificó la fecha de vencimiento de %[2]s a %[1]s %[3]s
@@ -2369,7 +2444,7 @@ settings.block_outdated_branch=Bloquear fusión si la pull request está desactu
settings.block_outdated_branch_desc=La fusión no será posible cuando la rama principal esté detrás de la rama base.
settings.default_branch_desc=Seleccione una rama de repositorio por defecto para los pull request y los commits:
settings.merge_style_desc=Estilos de fusión
-settings.default_merge_style_desc=Estilo de fusión por defecto para pull requests:
+settings.default_merge_style_desc=Estilo de fusión por defecto
settings.choose_branch=Elija una rama…
settings.no_protected_branch=No hay ramas protegidas.
settings.edit_protected_branch=Editar
@@ -2615,6 +2690,27 @@ generated = Generado
pulls.nothing_to_compare_have_tag = La rama/etiqueta seleccionada es igual.
commits.search_branch = Esta Rama
commits.renamed_from = Renombrado de %s
+form.string_too_long = El texto introducido tiene más de %d caracteres.
+object_format = Formato de objetos
+n_release_one = %s lanzamiento
+n_release_few = %s lanzamientos
+stars = Estrellas
+editor.invalid_commit_mail = Correo no válido para crear un commit.
+project = Proyectos
+mirror_sync = sincronizado
+editor.commit_id_not_matching = El archivo fue modificado mientras lo editabas. Haz commit en una nueva rama y luego fusiona.
+size_format = %[1]s: %[2]s, %[3]s: %[4]s
+admin.update_flags = Actualizar indicadores
+admin.flags_replaced = Indicadores del repositorio sustituidos
+admin.failed_to_replace_flags = Fallo al substituir los indicadores del repositorio
+new_repo_helper = Un repositorio contiene todos los archivos del proyecto, incluido el historial de revisiones. ¿Ya tienes uno en otro sitio? Migrar repositorio.
+object_format_helper = Formato de objeto del repositorio. No puede ser modificado más tarde. SHA1 es el más compatible.
+commits.browse_further = Seguir explorando
+subscribe.issue.guest.tooltip = Inicia sesión para suscribirte a esta incidencia.
+subscribe.pull.guest.tooltip = Inicia sesión para suscribirte a este pull request.
+admin.manage_flags = Gestionar indicadores
+admin.enabled_flags = Indicadores habilitados para el repositorio:
+editor.push_out_of_date = El empuje parece estar desactualizado.
[graphs]
@@ -2798,7 +2894,7 @@ dashboard.update_migration_poster_id=Actualizar ID de usuario en migraciones
dashboard.git_gc_repos=Ejecutar la recolección de basura en los repositorios
dashboard.resync_all_sshkeys=Actualizar el archivo '.ssh/authorized_keys' con claves SSH de Forgejo.
dashboard.resync_all_sshprincipals=Actualizar el archivo '.ssh/authorized_principals' con los principales de certificado SSH de Forgejo.
-dashboard.resync_all_hooks=Resincronizar los hooks de pre-recepción, actualización y post-recepción de todos los repositorios.
+dashboard.resync_all_hooks=Resincronizar los hooks de pre-recepción, actualización y post-recepción de todos los repositorios
dashboard.reinit_missing_repos=Reiniciar todos los repositorios Git faltantes de los que existen registros
dashboard.sync_external_users=Sincronizar datos de usuario externo
dashboard.cleanup_hook_task_table=Limpiar tabla hook_task
@@ -2923,7 +3019,7 @@ orgs.new_orga=Nueva organización
repos.repo_manage_panel=Gestión de repositorios
repos.unadopted=Repositorios no adoptados
-repos.unadopted.no_more=No se encontraron más repositorios no adoptados
+repos.unadopted.no_more=No se encontraron repositorios no adoptados.
repos.owner=Propietario
repos.name=Nombre
repos.private=Privado
@@ -3058,7 +3154,7 @@ auths.tip.google_plus=Obtener credenciales de cliente OAuth2 desde la consola AP
auths.tip.openid_connect=Use el OpenID Connect Discovery URL (/.well-known/openid-configuration) para especificar los puntos finales
auths.tip.twitter=Ir a https://dev.twitter.com/apps, crear una aplicación y asegurarse de que la opción "Permitir que esta aplicación sea usada para iniciar sesión con Twitter" está activada
auths.tip.discord=Registrar una nueva aplicación en https://discordapp.com/developers/applications/me
-auths.tip.gitea=Registrar una nueva aplicación OAuth2. Puede encontrar la guía en https://forgejo.org/docs/latest/user/oauth2-provider
+auths.tip.gitea=Registrar una nueva aplicación OAuth2. La guía se encuentra en https://forgejo.org/docs/latest/user/oauth2-provider
auths.tip.yandex=`Crear una nueva aplicación en https://oauth.yandex.com/client/new. Seleccione los siguientes permisos del "Yandex.Passport API": "Access to email address", "Access to user avatar" y "Access to username, first name and surname, gender"`
auths.tip.mastodon=Introduzca una URL de instancia personalizada para la instancia mastodon con la que desea autenticarse (o utilice la predeterminada)
auths.edit=Editar origen de autenticación
@@ -3638,4 +3734,18 @@ user_kind = Buscar usuarios...
org_kind = Buscar organizaciones...
team_kind = Buscar equipos...
code_kind = Buscar código...
-package_kind = Buscar paquetes...
\ No newline at end of file
+package_kind = Buscar paquetes...
+code_search_unavailable = La búsqueda de código no está disponible actualmente. Por favor contacta al administrador del sitio.
+code_search_by_git_grep = Los resultados actuales de la búsqueda de código son proporcionados por "git grep". Es posible que se obtengan mejores resultados si el administrador del sitio habilita el indexador de código.
+no_results = No se encontraron resultados coincidentes.
+keyword_search_unavailable = La búsqueda por palabra clave no está disponible actualmente. Por favor contacta al administrador del sitio.
+fuzzy_tooltip = Incluir resultados que también coincidan estrechamente con el término de búsqueda
+milestone_kind = Buscar hitos…
+pull_kind = Buscar pulls…
+union = Unión
+union_tooltip = Incluir resultados correspondientes a cualquiera de las palabras clave separadas por espacios en blanco
+exact = Exacto
+exact_tooltip = Incluir sólo los resultados que corresponden al término de búsqueda exacto
+issue_kind = Buscar incidencias…
+fuzzy = Difusa
+runner_kind = Buscar ejecutores…
\ No newline at end of file
diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini
index 9192116d06..6c6525c04e 100644
--- a/options/locale/locale_fa-IR.ini
+++ b/options/locale/locale_fa-IR.ini
@@ -355,7 +355,7 @@ activate_account.text_2=لطفاً روی پیوند زیر کلیک کنید ت
activate_email=نشانی ایمیل خود را تایید کنید
activate_email.text=لطفاً روی پیوند زیر کلیک کنید تا رایانامهی خود را در %s تأیید کنید:
-register_notify=به گیتی یا گیتگو خوش آمدید
+register_notify_prev9=به گیتی یا گیتگو خوش آمدید
register_notify.title=%[1]s، به %[2]s خوشآمدید
register_notify.text_1=این رایانامهی تأیید عضویت شما در %s است!
register_notify.text_2=حالا شما میتوانید با نام کاربری وارد شوید: %s.
@@ -938,6 +938,7 @@ file_copy_permalink=پرمالینک را کپی کنید
video_not_supported_in_browser=مرورگر شما از تگ video که در HTML5 تعریف شده است، پشتیبانی نمی کند.
audio_not_supported_in_browser=مرورگر شما از تگ audio که در HTML5 تعریف شده است، پشتیبانی نمی کند.
stored_lfs=ذخیره شده با GIT LFS
+stored_annex=ذخیره شده با GIT Annex
symbolic_link=پیوند نمادین
commit_graph=نمودار کامیت
commit_graph.select=انتخاب برنچها
@@ -955,6 +956,7 @@ editor.upload_file=بارگذاری پرونده
editor.edit_file=ویرایش پرونده
editor.preview_changes=پیش نمایش تغییرات
editor.cannot_edit_lfs_files=پرونده های LFS در صحفه وب قابل تغییر نیست.
+editor.cannot_edit_annex_files=پرونده های Annex در صحفه وب قابل تغییر نیست.
editor.cannot_edit_non_text_files=پروندههای دودویی در صفحه وب قابل تغییر نیست.
editor.edit_this_file=ویرایش پرونده
editor.this_file_locked=پرونده قفل شده است
diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini
index 6e39931848..3ad22556d2 100644
--- a/options/locale/locale_fi-FI.ini
+++ b/options/locale/locale_fi-FI.ini
@@ -365,7 +365,7 @@ activate_account=Ole hyvä ja aktivoi tilisi
activate_email=Vahvista sähköpostiosoitteesi
-register_notify=Tervetuloa Forgejoan
+register_notify_prev9=Tervetuloa Forgejoan
register_notify.text_2=Voit nyt kirjautua käyttäjätunnuksella: %s.
reset_password=Palauta käyttäjätili
diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini
index b9e6dd8f34..9c0c1ce8a8 100644
--- a/options/locale/locale_fil.ini
+++ b/options/locale/locale_fil.ini
@@ -38,7 +38,7 @@ powered_by = Pinapatakbo ng %s
explore = Tuklasin
help = Tulong
logo = Logo
-sign_in = Mag-Sign In
+sign_in = Mag-sign in
sign_in_with_provider = Mag-sign in gamit ang %s
sign_in_or = o
sign_out = Mag-Sign Out
@@ -141,6 +141,8 @@ dashboard = Dashboard
more_items = Higit pang mga item
invalid_data = Hindi wastong datos: %v
copy_generic = Kopyahin sa clipboard
+test = Subukan
+error413 = Naubos mo na ang iyong quota.
[home]
search_repos = Maghanap ng Repository…
@@ -187,8 +189,8 @@ relevant_repositories_tooltip = Mga repositoryo na isang fork o walang topic, ic
code_search_unavailable = Kasalukuyang hindi available ang code search. Mangyaring makipag-ugnayan sa site administrator.
code_no_results = Walang source code na tumutugma sa iyong search term na nahanap.
relevant_repositories = Ang mga kaugnay na repositoryo ay pinapakita, ipakita ang hindi naka-filter na resulta.
-stars_few = %d mga star
-forks_one = %d tinidor
+stars_few = %d mga bitwin
+forks_one = %d fork
forks_few = %d mga fork
stars_one = %d bituin
@@ -348,6 +350,8 @@ buttons.list.ordered.tooltip = Magdagdag ng nakanumerong listahan
buttons.ref.tooltip = Magsangguni ng isyu o pull request
buttons.switch_to_legacy.tooltip = Gamitin ang legacy editor sa halip
buttons.heading.tooltip = Magdagdag ng heading
+buttons.indent.tooltip = Isama ang mga item nang isang level
+buttons.unindent.tooltip = I-unnest ang mga item nang isang level
[filter]
string.asc = A - Z
@@ -357,7 +361,7 @@ string.desc = Z - A
app_desc = Isang hindi masakit, at naka self-host na Git service
install = Madaling i-install
platform = Cross-platform
-platform_desc = Tumatakbo kahit saan ang Forgejo na ang Go ay nakaka-compile para sa: Windows, macOS, Linux, ARM, atbp. Piliin ang isa na gusto mo!
+platform_desc = Kinumpirma na tumatakbo ang Forgejo sa mga libreng operating system tulad ng Linux at FreeBSD, at pati na rin sa mga iba't ibang CPU architechture. Pumili nang isa na gusto mo!
lightweight = Magaan
lightweight_desc = Mababa ang minimal requirements ng Forgejo at tatakbo sa isang murang Raspberry Pi. Tipirin ang enerhiya ng iyong machine!
license = Open Source
@@ -380,8 +384,8 @@ allow_password_change = Kailanganin ang user na palitan ang password (inirerekom
reset_password_mail_sent_prompt = Ang isang bagong email pang-kumpirma ay ipinadala sa %s. Pakisuri ang iyong inbox sa loob ng %s para tapusin ang proseso ng pag-recover ng account.
active_your_account = Aktibahin ang iyong account
account_activated = Naaktiba na ang account
-prohibit_login = Ipinagbawalan ang Pag-sign in
-prohibit_login_desc = Pinagbawalan ang iyong account sa pag-sign in, mangyaring makipag-ugnayan sa tagapangasiwa ng site.
+prohibit_login = Nasuspinde ang account
+prohibit_login_desc = Nasuspinde ang iyong account sa pakikipag-ugnayan sa instansya. Makipag-ugnayan sa tagapangasiwa ng instansya upang makakuha muli ng access.
resent_limit_prompt = Humiling ka na ng activation email kamakailan. Mangyaring maghintay ng 3 minuto at subukang muli.
change_unconfirmed_email_summary = Palitan ang email address kung saan ipapadala ang activation email.
change_unconfirmed_email = Kung nagbigay ka ng maling email address habang nagpaparehistro, pwede mong palitan sa ibaba, at ang isang kumpirmasyon ay ipapadala sa bagong address sa halip.
@@ -399,7 +403,7 @@ scratch_code = Scratch code
use_scratch_code = Gumamit ng scratch code
twofa_passcode_incorrect = Mali ang iyong passcode. Kung nawala mo ang iyong device, gamitin ang iyong scratch code para mag-sign in.
twofa_scratch_token_incorrect = Mali ang iyong scratch code.
-login_userpass = Mag-Sign In
+login_userpass = Mag-sign in
login_openid = OpenID
oauth_signup_tab = Mag-rehistro ng bagong account
oauth_signup_title = Kumpletuhin ang bagong account
@@ -435,12 +439,17 @@ authorize_title = Pahintulutan ang "%s" na i-access ang iyong account?
authorization_failed = Nabigo ang awtorisasyon
authorization_failed_desc = Nabigo ang awtorisasyon dahil may na-detect kami ng hindi angkop na hiling. Mangyaring makipag-ugnayan sa maintainer ng app na sinusubukan mong pahintulutan.
sspi_auth_failed = Nabigo ang SSPI authentication
-password_pwned = Ang pinili mong password ay nasa listahan ng mga ninakaw na password na kasalukuyang napakita sa mga publikong data breach. Mangyaring subukang muli gamit ng ibang password at isaalang-alang palitan din ang password sa ibang lugar.
+password_pwned = Ang pinili mong password ay nasa listahan ng mga ninakaw na password na dating napakita sa mga publikong data breach. Mangyaring subukang muli gamit ng ibang password at isaalang-alang palitan din ang password sa ibang lugar.
password_pwned_err = Hindi makumpleto ang request sa HaveIBeenPwned
last_admin = Hindi mo matatanggal ang pinakahuling admin. Kailangan may hindi bababa sa isang admin.
tab_signin = Mag-sign In
tab_signup = Mag-sign Up
tab_openid = OpenID
+hint_register = Kailangan ng account? Magrehistro ngayon.
+sign_up_button = Magrehistro ngayon.
+back_to_sign_in = Bumalik sa sign in
+sign_in_openid = Magpatuloy gamit ang OpenID
+hint_login = May account ka na? Mag-sign in ngayon!
[mail]
reply = o direktang tumugon sa email na ito
@@ -456,7 +465,7 @@ activate_email = I-verify ang iyong email address
admin.new_user.subject = Nag-sign up lang ngayon ang user na si %s
admin.new_user.user_info = Impormasyon ng user
admin.new_user.text = Mangyaring mag-click dito para ipamahala ang user na ito sa admin panel.
-register_notify = Maligayang Pagdating sa Forgejo
+register_notify_prev9 = Maligayang Pagdating sa Forgejo
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_2 = Maari kang mag-sign in sa iyong account gamit ng iyong username: %s
@@ -482,7 +491,7 @@ release.download.zip = Source Code (ZIP)
release.download.targz = Source Code (TAR.GZ)
repo.transfer.subject_to_you = Gusto ilipat ni %s ang repositoryo na "%s" sa iyo
repo.transfer.to_you = ikaw
-repo.transfer.body = Para tanggapin o tanggihan bisitahin ang %s o huwag na lang pansinin.
+repo.transfer.body = Para tanggapin o tanggihan bisitahin ang %s o huwag na lang ito pansinin.
repo.collaborator.added.subject = Idinagdag ka ni %s sa %s bilang tagaambag
team_invite.subject = Inimbitahan ka ni %[1]s para sumali sa organisasyong %[2]s
team_invite.text_1 = Inimbitahan ka ni %[1]s para sumali sa koponang %[2]s sa organisasyong %[3]s.
@@ -499,6 +508,22 @@ issue.action.ready_for_review = Minarkahan ni @%[1]s ang pull request na
release.new.text = Inilabas ni @%[1]s ang %[2]s sa %[3]s
repo.transfer.subject_to = Gusto ni %s na ilipat ang repositoryo na "%s" sa %s
team_invite.text_3 = Tandaan: Ang imbitasyong ito ay inilaan para sa %[1]s. Kung hindi mo inaasahan ang imbitasyong ito, maaari mong balewalain ang email na ito.
+removed_security_key.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.
+reset_password.text_1 = Ngayon lang napalitan ang password ng iyong account.
+password_change.subject = Napalitan ang iyong password
+primary_mail_change.text_1 = Ngayon lang napalitan ang iyong pangunahing mail sa %[1]s. Nangangahulugan ito na ang e-mail address na ito ay hindi na makakatanggap ng mga abiso sa e-mail para sa iyong account.
+password_change.text_1 = Ngayon lang napalitan ang password ng iyong account.
+primary_mail_change.subject = Napalitan ang iyong pangunahing mail
+totp_disabled.subject = Na-disable ang TOTP
+totp_disabled.text_1 = Ngayon lang na-disable ang Time-based one-time password (TOTP) sa iyong account.
+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.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_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.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.no_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.
[modal]
yes = Oo
@@ -640,6 +665,10 @@ following.title.few = Sinusundan
followers.title.few = Mga tagasunod
following.title.one = Sinusundan
followers.title.one = Tagasunod
+public_activity.visibility_hint.self_public = Nakikita ng lahat ang iyong aktibidad, maliban sa mga interaksyon sa pribadong espasyo. I-configure.
+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.self_private = Nakikita mo lang at mga tagapangasiwa ng instansya ang iyong aktibidad. I-configure.
+public_activity.visibility_hint.admin_private = Nakikita mo ang aktibidad na ito dahil isa kang tagapangasiwa, ngunit gusto ng user na panatilihin itong pribado.
[settings]
profile = Profile
@@ -724,7 +753,7 @@ ssh_key_deletion_desc = Ang pagtanggal ng SSH key ay matatanggihan ang pag-acces
no_activity = Walang kamakilang aktibidad
ssh_signonly = Kasalukuyang naka-disable ang SSH kaya magagamit lang ang mga key na ito para sa pagpapatunay ng commit signature.
gpg_desc = Ang mga pampublikong GPG key dito ay nauugnay sa iyong account at ginagamit para i-verify ang iyong mga commit. Panatilihing ligtas ang iyong mga pribadong key dahil pinapayagan nito ang pag-sign ng mga commit gamit ng iyong pagkakakilanlan.
-keep_email_private_popup = Itatago nito ang iyong email address sa iyong profile, at kung gumawa ka ng pull request o mag-edit ng file sa pamamagitan ng web interface. Hindi babaguhin ang mga naka-push na commit. Gamitin ang %s sa mga commit para i-associate sila sa iyong account.
+keep_email_private_popup = Itatago nito ang iyong email address sa iyong profile. Hindi na ito ang magiging default para sa mga commit na ginawa sa pamamagitan ng web interface, tulad ng pag-upload ng mga file at pagbabago. Sa halip gagamitin ang isang espeyal na address na %s para i-associate ang mga commit sa iyong account. Tandaan na ang pagbabago ng opsyon na ito ay hindi makakaapekto sa mga umiiral na commit.
gpg_key_id_used = Ang isang publikong GPG key na may katulad na ID ay umiiral na.
gpg_no_key_email_found = Ang GPG key na ito ay hindi tumutugma sa anumang email address na nauugnay sa iyong account. Madadagdag pa rin ito kapag i-sign mo ang ibinigay na token.
ssh_principal_deletion_success = Tinanggal na ang principal.
@@ -951,6 +980,9 @@ pronouns_custom = Pasadya
pronouns_unspecified = Hindi natakda
pronouns = Mga panghalip
language.title = Default na wika
+keep_activity_private.description = Makikita mo lang at mga tagapangasiwa ng instansya ang iyong pampublikong aktibidad.
+language.description = Mase-save ang wika sa iyong account at gagamitin bilang default pagkatapos mong mag-log in.
+language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! Matuto pa.
[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.
@@ -968,7 +1000,7 @@ repo_name = Pangalan ng repositoryo
repo_name_helper = Ang mga magandang pangalan ng repositoryo ay gumagamit ng maliit, makakaalala, at unique na mga keyword.
repo_size = Laki ng Repositoryo
template = Template
-template_select = Pumili ng template.
+template_select = Pumili ng template
template_helper = Gawing template ang repositoryo
visibility = Kakayahang pagpakita
visibility_description = Ang owner o ang mga miyembro ng organisasyon kung may karapatan sila, ay makakakita nito.
@@ -984,7 +1016,7 @@ open_with_editor = Buksan gamit ang %s
download_bundle = I-download ang BUNDLE
repo_gitignore_helper_desc = Piliin kung anong mga file na hindi susubaybayin sa listahan ng mga template para sa mga karaniwang wika. Ang mga tipikal na artifact na ginagawa ng mga build tool ng wika ay kasama sa .gitignore ng default.
adopt_preexisting = Mag-adopt ng mga umiiral na file
-repo_gitignore_helper = Pumili ng mga .gitignore template.
+repo_gitignore_helper = Pumili ng mga .gitignore template
readme_helper_desc = Ito ang lugar kung saan makakasulat ka ng kumpletong deskripsyon para sa iyong proyekto.
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)
@@ -992,7 +1024,7 @@ transfer.reject_desc = Kanselahin ang pag-transfer mula sa "%s"
mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang matukoy ang LFS server. Maari 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)
object_format = Format ng object
-readme_helper = Pumili ng README file template.
+readme_helper = Pumili ng README file template
default_branch_helper = Ang default branch ay ang base branch para sa mga pull request at mga commit ng code.
mirror_interval_invalid = Hindi wasto ang mirror interval.
mirror_sync = na-sync
@@ -1018,9 +1050,9 @@ issue_labels = Mga label ng isyu
generate_repo = I-generate ang repositoryo
repo_desc_helper = Maglagay ng maikling deskripsyon (opsyonal)
repo_lang = Wika
-issue_labels_helper = Pumili ng label set ng isyu.
+issue_labels_helper = Pumili ng label set ng isyu
license = Lisensya
-license_helper = Pumili ng file ng lisensya.
+license_helper = Pumili ng file ng lisensya
license_helper_desc = Ang lisensya ay namamahala kung ano ang pwede at hindi pwedeng gawin ng mga ibang tao sa iyong code. Hindi sigurado kung alin ang wasto para sa iyong proyekto? Tignan ang Pumili ng lisensya.
object_format_helper = Object format ng repositoryo. Hindi mababago mamaya. Ang SHA1 ang pinaka-compatible.
readme = README
@@ -1080,7 +1112,7 @@ delete_preexisting = Burahin ang mga dating umiiral na file
delete_preexisting_content = Burahin ang mga file sa %s
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
-migrate_items_pullrequests = Mga hiling sa pagtulak
+migrate_items_pullrequests = Mga hiling sa paghila
archive.pull.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga pull request.
archive.title = Naka-archive ang repo na ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
@@ -1287,7 +1319,7 @@ issues.cancel = Kanselahin
issues.save = IImbak
issues.label_title = Pangalan
issues.delete.title = Burahin ang isyung ito?
-settings.pulls_desc = Paganahin ang mga hiling sa paghatak para sa repositoryo
+settings.pulls_desc = Paganahin ang mga hiling sa paghila para sa repositoryo
editor.branch_does_not_exist = Walang natagpuang [branch] na "%s" sa [repository] na ito.
commits.nothing_to_compare = Magkapareho ang mga branch na ito.
commits.search_all = Lahat na mga branch
@@ -1301,7 +1333,7 @@ issues.re_request_review = Hilingin muli ang pagsusuri
issues.lock.reason = Dahilan sa pagkandado
issues.action_close = Isara
issues.label_description = Paglalarawan
-find_file.go_to_file = "Pumunta sa file"
+find_file.go_to_file = Hanapin ang isang file
projects.deletion = Burahin ang proyekto
issues.filter_project_all = Lahat ng mga proyekto
issues.filter_project_none = Walang proyekto
@@ -1331,7 +1363,7 @@ issues.filter_type.assigned_to_you = Itinalaga sa iyo
issues.filter_type.all_issues = Lahat ng mga isyu
issues.author_helper = May-akda ang tagagamit na ito.
issues.role.owner = May-ari
-activity.title.prs_n = %d mga kahilingan sa paghatak
+activity.title.prs_n = %d mga kahilingan sa paghila
issues.label_color = Kulay
pulls.nothing_to_compare = Magkapareho ang mga branch na ito. Hindi na kailangang gumawa ng hiling sa paghila.
projects.column.assigned_to = Itinalaga sa/kay
@@ -1395,7 +1427,7 @@ pulls.reopen_failed.base_branch = Hindi mabuksang muli ang hiling sa paghatak na
issues.reopened_at = `binuksang muli ang isyung ito %[2]s`
pulls.reopen_failed.head_branch = Hindi mabuksang muli ang [pull request] na ito dahil nabura ang punong [branch].
settings.event_pull_request_desc = Binuksan, sinara, muling binuksan, o binago ang hiling sa paghatak.
-activity.opened_prs_count_n = Mga inimungkahing hiling sa paghatak
+activity.opened_prs_count_n = Mga inimungkahing hiling sa paghila
editor.filename_is_invalid = Hindi wasto ang pangalan ng file: "%s".
activity.title.prs_opened_by = %s inimungkahi ni/ng %s
pulls.cant_reopen_deleted_branch = Hindi mabuksang muli ang hiling sa paghatak na ito dahil nabura ang branch.
@@ -1485,7 +1517,7 @@ settings.transfer_perform = Gawin ang paglipat
settings.transfer_abort = Ipagpaliban ang paglipat
settings.transfer_owner = Bagong may-ari
pulls.tab_conversation = Pag-uusap
-pulls.tab_files = Nabagong mga file
+pulls.tab_files = Mga nabagong file
settings.new_owner_blocked_doer = Hinarang ka ng bagong may-ari.
settings.transfer.rejected = Tinanggihan ang paglipat ng [repository].
settings.transfer.success = Matagumpay na inilipat ang [repository].
@@ -1708,7 +1740,7 @@ issues.lock.notice_1 = - Hindi makakadagdag ng mga bagong komento ang mga ibang
issues.lock.notice_3 = - Maari 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.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %[2]s`
-issues.ref_issue_from = `isinangguni ang isyu na ito %[4]s%[2]s`
+issues.ref_issue_from = `isinangguni ang isyu na ito sa %[4]s%[2]s`
issues.num_participants_one = %d kasali
issues.attachment.download = `I-click para i-download ang "%s" `
issues.num_participants_few = %d mga kasali
@@ -1743,19 +1775,19 @@ settings.add_collaborator_success = Naidagdag na ang tagaambag.
settings.federation_following_repos = Mga [URL] ng mga sinusundang mga repositoryo. Hinihiwalay ng ";", walang puting espasyo.
diff.comment.reply = Tumugon
pulls.create = Gumawa ng [pull request]
-issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa [pull request] na ito bago mo ito isama.
+issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa hiling sa paghila na ito bago mo ito isama.
pulls.delete.title = Burahin ang [pull request] na ito?
issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito
pulls.closed_at = `isinara ang [pull request] na ito%[2]s`
pulls.close = Isara ang [pull request]
-pulls.cmd_instruction_hint = `Tingnan ang mga panuto para sa linya ng utos.`
+pulls.cmd_instruction_hint = `Tingnan ang mga panuto para sa linya ng utos.`
project = Mga proyekto
issues.content_history.deleted = binura
-pulls.no_results = Walang nakitang mga resulta.
+pulls.no_results = Walang mga nahanap na resulta.
pulls.closed = Sarado ang [pull request]
pulls.is_closed = Naisara na ang [pull request].
-issues.ref_closing_from = `isinangguni ang hiling sa paghila %[4]s na magsasara sa isyung ito%[2]s`
-issues.ref_reopening_from = `isinangguni ang hiling sa paghila %[4]s na muling bubukas sa isyung ito%[2]s`
+issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[4]s na magsasara sa isyu, %[2]s`
+issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[4]s na muling bubukas, %[2]s`
issues.ref_closed_from = `isinara ang isyung ito %[4]s%[2]s`
issues.review.wait = hiniling sa pagsuri %s
issues.review.reject = hinihiling ang mga pagbago %s
@@ -1803,12 +1835,12 @@ issues.edit.already_changed = Hindi maimbak ang mga pagbabago sa isyu. Mukhang n
signing.wont_sign.not_signed_in = Hindi ka naka-sign in.
activity.new_issues_count_n = Bagong mga isyu
activity.git_stats_files_changed_n = mga nabago
-activity.git_stats_files_changed_1 = nabago
+activity.git_stats_files_changed_1 = ang nabago
issues.dependency.remove = Tanggalin
pulls.edit.already_changed = Hindi maimbak ang mga pagbabago sa [pull request]. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
milestones.filter_sort.most_complete = Pinakakumpleto
settings.collaboration.owner = May-ari
-pulls.showing_only_single_commit = Ipinapakita lamang ang mga pagbago ng [commit] %[1]s
+pulls.showing_only_single_commit = Ipinapakita lamang ang mga pagbago ng commit na %[1]s
comments.edit.already_changed = Hindi maimbak ang mga pagbabago sa komento. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
milestones.completeness = %d%% nakumpleto
wiki.welcome = Maligayang pagdating sa Wiki.
@@ -1826,9 +1858,9 @@ activity.git_stats_deletion_n = %d mga pagbura
activity.navbar.code_frequency = Dalas ng [code]
pulls.switch_head_and_base = Ilipat ang ulo at base
activity.git_stats_push_to_all_branches = sa lahat ng mga [branch].
-activity.git_stats_pushed_n = mga itinulak
+activity.git_stats_pushed_n = itinulak ang
issues.reference_link = Pagsangguni: %s
-activity.git_stats_pushed_1 = itinulak
+activity.git_stats_pushed_1 = ang itinulak
activity.git_stats_commit_n = %d mga [commit]
issues.dependency.add = Magdagdag ng dependency…
issues.dependency.cancel = Kanselahin
@@ -1860,6 +1892,47 @@ pulls.showing_specified_commit_range = Ipinapakita lamang ang mga pagbabago sa p
wiki.pages = Mga pahina
activity.unresolved_conv_label = Nakabukas
settings.pull_mirror_sync_in_progress = Inihatak ang mga pagbabago mula sa [malayuang] %s sa ngayon.
+issues.dependency.setting = Paganahin ang mga dependency para sa mga isyu at mga hiling sa paghila
+activity.navbar.pulse = Pulso
+settings.protect_enable_merge_desc = Pinapayagan ang sinumang may [access] sa pagsulat upang isama ang mga hiling sa paghila sa [branch] na ito.
+activity.git_stats_commit_1 = %d commit
+activity.git_stats_file_n = %d mga file
+activity.git_stats_file_1 = %d file
+pulls.desc = Paganahin ang mga hiling sa paghila at mga pagsuri sa [code].
+activity.git_stats_exclude_merges = Maliban sa mga pagsali,
+activity.active_prs_count_n = %d aktibong mga hiling sa paghila
+issues.author.tooltip.issue = May-akda ng iysung ito ang user.
+issues.author.tooltip.pr = May-akda ng hiling sa paghila na ito ang user na ito.
+issues.dependency.add_error_dep_exists = Umiiral na and dependency.
+issues.dependency.add_error_cannot_create_circular = Hindi ka maaring gumawa ng dependency na may dalawang isyu na humaharang ang isa't isa.
+issues.dependency.add_error_same_issue = Hindi mo magagwang dumepende ang isyu sa sarili.
+issues.dependency.add_error_dep_not_same_repo = Dapat nasa katulad na repositoryo ang mga isyu.
+issues.dependency.add_error_dep_issue_not_exist = Hindi umiiral ang dumedependeng isyu.
+issues.dependency.add_error_dep_not_exist = Hindi umiiral ang dependency.
+pulls.compare_changes = Bagong hiling sa paghila
+pulls.allow_edits_from_maintainers = Payagan ang mga pagbabago mula sa mga tagapagpanatili
+pulls.show_all_commits = Ipakita ang lahat ng mga commit
+pulls.show_changes_since_your_last_review = Ipakita ang mga pagbabago mula noong huli mong pagsusuri
+issues.dependency.blocked_by_short = Dumedepende sa
+issues.review.pending.tooltip = Kasalukuyang hindi visible ang komentong ito sa ibang mga user. Para i-submit ang iyong mga nakabinbin na komento, piliin ang "%s" -> "%s/%s/%s" sa itaas ng pahina.
+pulls.tab_commits = Mga Commit
+issues.dependency.issue_remove_text = Tatanggalin nito ang dependency sa isyu na ito. Magpatuloy?
+issues.dependency.remove_header = Tanggalin ang Dependency
+issues.dependency.pr_remove_text = Tatanggalin nito ang dependency sa hiling sa paghila na ito. Magpatuloy?
+issues.review.show_resolved = Ipakita ang naresolba
+issues.review.hide_resolved = Itago ang naresolba
+issues.review.resolve_conversation = Iresolba ang paguusap
+issues.review.un_resolve_conversation = I-unresolve ang paguusap
+issues.blocked_by_user = Hindi ka maaring gumawa ng isyu sa repositoryo na ito dahil na-block ka ng may-ari ng repositoryo.
+issues.review.show_outdated = Ipakita ang luma
+issues.review.hide_outdated = Itago ang luma
+issues.review.resolved_by = minarkahan ang paguusap na ito bilang naresolba
+issues.review.content.empty = Kailangan mong magiwan ng komento na nagpapahiwatig sa (mga) hinihiling na pagbabago.
+issues.review.outdated = Luma na
+issues.review.outdated_description = Nagbago ang nilalaman mula noong ginawa ang komentong ito
+issues.review.option.show_outdated_comments = Ipakita ang mga lumang komento
+issues.review.option.hide_outdated_comments = Itago ang mga lumang komento
+wiki.reserved_page = Nakareserba ang pangalan ng wiki page na "%s".
[search]
commit_kind = Maghanap ng mga commit...
@@ -1886,6 +1959,9 @@ pull_kind = Maghanap ng mga paghila...
issue_kind = Maghanap ng mga isyu...
exact = Eksakto
exact_tooltip = Samahan lamang ang mga resulta na tutugma sa eksaktong search term
+union = Kaugnay
+union_tooltip = Isama ang mga resulta na tumutugma sa anumang mga nahiwalay ng whitespace na keyword
+milestone_kind = Maghanap ng mga milestone...
[admin]
auths.updated = Nabago
@@ -1964,7 +2040,7 @@ users.2fa = 2FA
users.repos = Mga Repo
users.send_register_notify = Abisuhan tungkol sa pagrehistro sa pamamagitan ng email
users.is_admin = Ay tagapangasiwa
-users.is_restricted = Ay pinaghihigpitan
+users.is_restricted = Pinaghihigpitang account
users.allow_import_local = Maaring mag-import ng mga lokal na repositoryo
users.allow_create_organization = Makakagawa ng mga organisasyon
users.update_profile = I-update ang user account
@@ -2048,7 +2124,7 @@ users.password_helper = Iwanang walang laman ang password upang panatilihing hin
users.max_repo_creation = Pinakamataas na numero ng mga repositoryo
users.max_repo_creation_desc = (Ilagay ang -1 para gamitin ang global na default na limitasyon.)
users.is_activated = Naka-activate ang User Account
-users.prohibit_login = I-disable ang pag-sign in
+users.prohibit_login = Sinuspending account
emails.email_manage_panel = Ipamahala ang mga email ng user
self_check = Pansariling pagsusuri
dashboard.total_gc_pause = Kabuuang GC pause
@@ -2120,7 +2196,7 @@ packages.cleanup = Linisin ang na-expire na data
orgs.new_orga = Bagong organisasyon
repos.repo_manage_panel = Ipamahala ang mga repositoryo
repos.unadopted = Mga unadopted na repositoryo
-repos.unadopted.no_more = Wala nang mga unadopted na repositoryo na nahanap
+repos.unadopted.no_more = Wala nang mga unadopted na repositoryo na nahanap.
repos.owner = May-ari
repos.lfs_size = Laki ng LFS
packages.package_manage_panel = Ipamahala ang mga package
@@ -2151,7 +2227,7 @@ config.ssh_listen_port = Listen port
config.ssh_keygen_path = Path ng keygen ("ssh-keygen")
config.ssh_key_test_path = Path ng key test
auths.verify_group_membership = Patunayan ang membership ng grupo sa LDAP (iwanang walang laman ang filter para i-skip)
-config.allow_only_external_registration = Payagan lamang ang pagrehistro sa pamamagitan ng mga panlabas na Serbisyo
+config.allow_only_external_registration = Payagan lamang ang pagrehistro sa pamamagitan ng mga panlabas na serbisyo
config.allow_only_internal_registration = Payagan lamang ang pagrehistro sa pamamagitan ng Forgejo
auths.search_page_size = Laki ng pahina
auths.filter = Filter ng user
@@ -2191,6 +2267,43 @@ notices.delete_selected = Burahin ang pinili
notices.view_detail_header = Mga detalye ng paunawa
notices.inverse_selection = Baliktarin ang pagpili
config.app_slogan = Slogan ng instansya
+auths.oauth2_provider = Tagapagbigay ng OAuth2
+auths.oauth2_tokenURL = URL ng token
+auths.oauth2_authURL = URL ng Authorize
+auths.oauth2_clientID = ID ng kliyente (Key)
+auths.enable_ldap_groups = I-enable ang mga LDAP group
+auths.oauth2_clientSecret = Sikreto ng Kliyente
+auths.openIdConnectAutoDiscoveryURL = URL ng OpenID Connect Auto Discovery
+auths.oauth2_use_custom_url = Gumamit ng mga custom URL sa halip ng mga default URL
+auths.group_attribute_list_users = Group attribute na naglalaman ng listahan ng mga user
+auths.user_attribute_in_group = User attribute na nakalista sa grupo
+auths.oauth2_tenant = Tenant
+auths.oauth2_scopes = Mga karagdagang scope
+auths.oauth2_required_claim_name = Kinakailangang claim name
+auths.pam_email_domain = Email domain ng PAM (opsyonal)
+auths.oauth2_icon_url = URL ng icon
+auths.oauth2_emailURL = URL ng email
+auths.skip_local_two_fa = I-skip ang lokal na 2FA
+auths.skip_tls_verify = I-skip ang pagpapatunay ng TLS
+auths.force_smtps_helper = Palaging ginagagmit ang SMTPS sa port 465. Itakda ito para pilitin ang SMTPS sa mga ibang port. (Kung hindi, gagamitin ang STARTTLS sa mga ibang port kapag sinusuportahan ng host.)
+auths.helo_hostname = Hostname ng HELO
+auths.force_smtps = Pilitin ang SMTPS
+auths.skip_local_two_fa_helper = Ang pag-iwan sa hindi nakatakda ay nangangahulugan na ang mga lokal na user na may 2FA ay kailangan pa ring pumasa sa 2FA upang mag-log on
+auths.ms_ad_sa = Mga search attribute ng MS AD
+auths.smtphost = Host ng SMTP
+auths.allowed_domains_helper = Iwanang walang laman para payagan ang lahat ng mga domain. Ihiwalay ang mga maraming domain gamit ang kuwit (",").
+auths.smtp_auth = Uri ng authentikasyon ng SMTP
+auths.pam_service_name = Pangalan ng serbisyo ng PAM
+auths.map_group_to_team = I-map ang mga LDAP group sa Mga koponan ng organisasyon (iwanang walang laman para i-skip)
+auths.map_group_to_team_removal = Tanggalin ang mga user sa mga naka-synchronize na koponan kapag hindi kasama ang user sa katumbas na LDAP group
+auths.smtpport = Port ng SMTP
+auths.allowed_domains = Mga pinapayagang domain
+auths.helo_hostname_helper = Hostname na pinapadala sa pamamagitan ng HELO. Iwanang walang laman para ipadala ang kasalukuyang hostname.
+auths.disable_helo = I-disable ang HELO
+auths.oauth2_profileURL = URL ng profile
+monitor.queue.settings.maxnumberworkers.placeholder = Kasalukuyang %[1]d
+monitor.queue.settings.remove_all_items = Tanggalin lahat
+users.block.description = Harangan ang tagagamit na ito mula sa pag [interact] sa serbisyong ito sa pamamagitan ng kanilang mga account at pagbawalan ang pag sign in.
[org]
repo_updated = Binago %s
@@ -2217,6 +2330,9 @@ settings.permission = Mga pahintulot
settings.visibility.public = Pangpubliko
settings.full_name = Buong pangalan
form.create_org_not_allowed = Hindi ka pinapayagang gumawa ng organisasyon.
+settings.visibility.limited = Limitado (nakikita lamang ng mga naka-authenticate na user)
+settings.visibility.limited_shortname = Limitado
+form.name_reserved = Nakareserba ang pangalan ng organisasyon na "%s".
[packages]
@@ -2268,11 +2384,102 @@ empty.documentation = Para sa higit pang impormasyon sa package registry, tignan
cargo.install = Para i-install ang package gamit ang Cargo, patakbuhin ang sumusunod na command:
published_by_in = Na-publish ang %[1]s ni %[3]s sa %[5]s
alpine.registry.key = I-download ang registry public RSA key sa /etc/apk/keys folder para i-verify ang index signature:
+swift.install2 = at patakbuhin ang sumusunod na utos:
[actions]
runners.last_online = Huling oras na online
runs.no_workflows.quick_start = Hindi alam kung paano magsimula gamit ang Forgejo Actions? Tingnan ang gabay sa mabilis na pagsisimula.
runs.no_workflows.documentation = Para sa higit pang impormasyon tungkol sa Forgejo Actions, tingnan ang Dokumentasyon.
+status.waiting = Hinihintay
+runners.task_list.run = Patakbuhin
+runners.description = Paglalarawan
+runners.owner_type = Uri
+runners.name = Pangalan
+status.success = Tagumpay
+runs.pushed_by = itinulak ni/ng
+runners.status = Katayuan
+status.failure = Nabigo
+actions = Mga Aksyon
+runs.no_job = Ang workflow ay dapat maglaman ng hindi bababa sa isang trabaho
+runners = Mga Runner
+runs.commit = Commit
+workflow.dispatch.trigger_found = Mayroong workflow_dispatch na trigger ang workflow na ito.
+unit.desc = Ipamahala ang mga pinag-sasamang CI/CD pipeline sa pamamagitan ng Forgejo Actions
+runners.edit_runner = Baguhin ang Runner
+runners.update_runner = I-update ang mga pagbabago
+variables.update.failed = Nabigong baguhin ang variable.
+variables.update.success = Nabago na ang variable.
+runs.no_results = Walang mga tumugmang resulta.
+runners.delete_runner_success = Matagumpay na nabura ang runner
+runs.all_workflows = Lahat ng mga workflow
+runs.scheduled = Naka-iskedyul
+runs.workflow = Workflow
+variables.edit = Baguhin ang Variable
+workflow.enable = I-enable ang workflow
+workflow.disabled = Naka-disable ang workflow.
+need_approval_desc = Kailangan ng pag-apruba para tumakbo ng mga workflow para sa fork na hiling sa paghila.
+variables = Mga variable
+runners.status.active = Aktibo
+runners.version = Bersyon
+status.unknown = Hindi alam
+runs.invalid_workflow_helper = Hindi wasto ang workflow config file. Pakisuri ang iyong config file: %s
+runs.actors_no_select = Lahat ng mga actor
+runners.runner_title = Runner
+runners.task_list = Mga kamakailang trabaho sa runner na ito
+runners.task_list.no_tasks = Wala pang mga trabaho sa ngayon.
+runners.labels = Mga label
+runs.no_matching_online_runner_helper = Walang tumutugmang online runner na may label: %s
+runs.status = Status
+runs.no_workflows = Wala pang mga workflow sa ngayon.
+runs.no_runs = Wala pang mga pagtatakbo ang workflow na ito sa ngayon.
+variables.creation = Magdagdag ng variable
+variables.none = Wala pang mga variable sa ngayon.
+variables.deletion = Tanggalin ang variable
+variables.deletion.description = Permanente ang pagtanggal ng isang variable at hindi ito mababalik. Magpatuloy?
+status.running = Tumatakbo
+runners.new_notice = Paano magsimula ng runner
+runners.update_runner_success = Matagumpay na na-update ang runner
+runners.delete_runner_notice = Kapag may trabaho na tumatakbo sa runner na ito, titigilan ito at mamarkahan bilang nabigo. Maaring sirain ang building workflow.
+runners.none = Walang mga available na runner
+runs.status_no_select = Lahat ng status
+runs.empty_commit_message = (walang laman na mensahe ng commit)
+workflow.enable_success = Matagumpay na na-enable ang workflow na "%s".
+workflow.dispatch.run = Patakbuhin ang workflow
+workflow.dispatch.success = Matagumpay na nahiling ang pagtakbo ng workflow.
+variables.management = Ipamahala ang mga variable
+variables.deletion.failed = Nabigong tanggalin ang variable.
+runners.status.unspecified = Hindi alam
+runs.no_job_without_needs = Ang workflow ay dapat maglaman ng hindi bababa sa isang trabaho na walang dependencies.
+workflow.disable = I-disable ang workflow
+workflow.disable_success = Matagumpay na na-disable ang workflow na "%s".
+runners.task_list.repository = Repositoryo
+status.skipped = Nilaktawan
+runners.runner_manage_panel = Ipamahala ang mga runner
+runners.new = Gumawa ng bagong runner
+variables.creation.failed = Nabigong idagdag ang variable.
+runners.id = ID
+runs.actor = Actor
+runners.update_runner_failed = Nabigong i-update ang runner
+runners.delete_runner = Burahin ang runner na ito
+runners.delete_runner_failed = Nabigong burahin ang runner
+runners.delete_runner_header = Kumpirmahin na burahin ang runner
+status.blocked = Naharang
+status.cancelled = Kinansela
+runners.task_list.status = Status
+runners.status.idle = Idle
+workflow.dispatch.use_from = Gamitin ang workflow mula sa
+runners.reset_registration_token = I-reset ang token ng pagrehistro
+runners.status.offline = Offline
+workflow.dispatch.invalid_input_type = Hindi wastong input type "%s".
+runners.task_list.commit = Commit
+runners.task_list.done_at = Natapos Sa
+runners.reset_registration_token_success = Matagumpay na na-reset ang token ng pagrehistro ng runner
+workflow.dispatch.input_required = Kumailangan ng value para sa input na "%s".
+workflow.dispatch.warn_input_limit = Pinapakita lamang ang unang %d na mga input.
+variables.description = Ipapasa ang mga variable sa ilang mga aksyon at hindi mababasa kung hindi man.
+variables.id_not_exist = Hindi umiiral ang variable na may ID na %d.
+variables.deletion.success = Tinanggal na ang variable.
+variables.creation.success = Nadagdag na ang variable na "%s".
[action]
commit_repo = itinulak sa %[3]s sa %[4]s
@@ -2291,6 +2498,8 @@ compare_commits = Ikumpara ang %d mga [commit]
merge_pull_request = `isinama ang [pull request] %[3]s#%[2]s`
auto_merge_pull_request = `[automatikong] isinama ang [pull request] %[3]s#%[2]s`
approve_pull_request = `inaprubahan ang %[3]s#%[2]s`
+review_dismissed_reason = Dahilan:
+compare_branch = Ikumpara
[tool]
1m = 1 minuto
@@ -2358,4 +2567,12 @@ file_too_big = Ang laki ng file ({{filesize}}) MB) ay lumalagpas sa pinakamataas
remove_file = Tanggalin ang file
[secrets]
-creation.success = Naidagdag na ang lihim na "%s".
\ No newline at end of file
+creation.success = Naidagdag na ang lihim na "%s".
+secrets = Mga lihim
+deletion.success = Natanggal na ang lihim.
+deletion.failed = Nabigong tanggalin ang lihim.
+creation.failed = Nabigong idagdag ang lihim.
+deletion = Tanggalin ang lihim
+
+[markup]
+filepreview.line = Linya %[1]d sa %[2]s
\ No newline at end of file
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index 9566626800..3469d8d899 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -159,6 +159,7 @@ toggle_menu = Menu va-et-vient
more_items = Plus d'éléments
invalid_data = Données invalides : %v
copy_generic = Copier dans le presse-papiers
+test = Test
[aria]
navbar=Barre de navigation
@@ -190,6 +191,8 @@ buttons.ref.tooltip=Référencer un ticket ou demande d’ajout
buttons.switch_to_legacy.tooltip=Utiliser l’ancien éditeur à la place
buttons.enable_monospace_font=Activer la police à chasse fixe
buttons.disable_monospace_font=Désactiver la police à chasse fixe
+buttons.indent.tooltip = Indenter les éléments d'un niveau
+buttons.unindent.tooltip = Supprimer un niveau d'indentation
[filter]
string.asc=A - Z
@@ -209,7 +212,7 @@ app_desc=Un service Git auto-hébergé sans prise de tête
install=Facile à installer
install_desc=Il suffit de lancer l’exécutable adapté à votre plateforme, le déployer avec Docker ou de l’installer depuis un gestionnaire de paquet.
platform=Multi-plateforme
-platform_desc=Forgejo tourne partout où Go peut être compilé : Windows, macOS, Linux, ARM, etc. Choisissez votre préféré !
+platform_desc=Forgejo est confirmé fonctionner sur des systèmes d'exploitation libres comme Linux et FreeBSD, ainsi que différentes architectures CPU. Choisissez ce que vous préférez !
lightweight=Léger
lightweight_desc=Forgejo utilise peu de ressources. Il peut même tourner sur un Raspberry Pi très bon marché. Économisez l'énergie de vos serveurs !
license=Open Source
@@ -246,7 +249,7 @@ err_admin_name_is_invalid=Le nom d'utilisateur de l'administrateur est invalide
general_title=Configuration générale
app_name=Titre du site
-app_name_helper=Entrez ici le nom de votre société.
+app_name_helper=Entrez ici le nom de votre instance. Il sera affiché sur chaque page.
repo_path=Emplacement racine des dépôts
repo_path_helper=Les dépôts Git distants seront stockés dans ce répertoire.
lfs_path=Répertoire racine Git LFS
@@ -405,8 +408,8 @@ allow_password_change=Demande à l'utilisateur de changer son mot de passe (reco
reset_password_mail_sent_prompt=Un mail de confirmation a été envoyé à %s. Veuillez vérifier votre boîte de réception dans les prochaines %s pour terminer la procédure de récupération du compte.
active_your_account=Activer votre compte
account_activated=Le compte a été activé
-prohibit_login=Connexion interdite
-prohibit_login_desc=Votre compte n'autorise pas la connexion, veuillez contacter l'administrateur de votre site.
+prohibit_login=Le compte est suspendu
+prohibit_login_desc=Votre compte a été suspendu et ne peut interagir avec cette instance. Contactez l'administrateur de l'instance pour y avoir accès.
resent_limit_prompt=Désolé, vous avez récemment demandé un courriel d'activation. Veuillez réessayer dans 3 minutes.
has_unconfirmed_mail=Bonjour %s, votre adresse courriel (%s) n’a pas été confirmée. Si vous n’avez reçu aucun mail de confirmation ou souhaitez renouveler l’envoi, cliquez sur le bouton ci-dessous.
resend_mail=Cliquez ici pour renvoyer un mail de confirmation
@@ -463,6 +466,11 @@ last_admin = Vous ne pouvez pas supprimer le dernier compte administrateur. Il d
remember_me.compromised = Le jeton de login n'est plus valide ce qui pourrait indiquer une compromission de compte. Veuillez vérifier d'éventuelles activités inhabituelles.
tab_signup = Enregistrement
tab_signin = Connexion
+hint_register = Besoin d'un compte ? Enregistrez vous.
+sign_up_button = Creation d'un compte.
+hint_login = Vous avez déjà un compte ? Connectez vous maintenant !
+back_to_sign_in = Retour à la connexion
+sign_in_openid = Continuer avec OpenID
[mail]
view_it_on=Voir sur %s
@@ -479,7 +487,7 @@ activate_email=Veuillez vérifier votre adresse courriel
activate_email.title=%s, veuillez vérifier votre adresse courriel
activate_email.text=Veuillez cliquer sur le lien suivant pour vérifier votre adresse courriel dans %s :
-register_notify=Bienvenue sur Forgejo
+register_notify_prev9=Bienvenue sur Forgejo
register_notify.title=%[1]s, bienvenue à %[2]s
register_notify.text_1=ceci est votre courriel de confirmation d'inscription pour %s !
register_notify.text_2=Vous pouvez maintenant vous connecter avec le nom d'utilisateur : %s
@@ -532,6 +540,15 @@ team_invite.text_3=Remarque : Cette invitation était destinée à %[1]s. Si vou
admin.new_user.user_info = Information à propos de l'utilisateur
admin.new_user.text = Veuillez clicker ici afin de gérer l'utilisateur depuis la page d'administration.
admin.new_user.subject = L'utilisateur %s vient de créer un compte
+reset_password.text_1 = Le mot de passe de votre compte vient d'être modifié.
+password_change.subject = Votre mot de passe a été modifié
+password_change.text_1 = Le mot de passe de votre compte vient d'être modifié.
+primary_mail_change.subject = Votre courriel principal a été modifié
+primary_mail_change.text_1 = Le courriel principal de votre compte vient d'être modifié en %[1]s.
+totp_disabled.no_2fa = Il n'y a plus de méthodes 2FA configurées ce qui signifie qu'il n'est plus nécessaire d'utiliser 2FA pour se connecter à votre compte.
+totp_disabled.text_1 = Mot de passe à usage unique basé sur le temps (TOTP) vient d'être désactivé pour votre compte.
+removed_security_key.subject = Une clé de sécurité a été supprimée
+totp_disabled.subject = TOTP a été désactivé
[modal]
yes=Oui
@@ -672,14 +689,22 @@ form.name_pattern_not_allowed=Le motif « %s » n’est pas autorisé dans un
form.name_chars_not_allowed=Le nom d'utilisateur "%s" contient des caractères non valides.
block_user = Bloquer un utilisateur
block_user.detail = Veuillez noter que bloquer un utilisateur a des conséquences. En particulier :
-block_user.detail_1 = Vous ne suivez plus cet utilisateur.
+block_user.detail_1 = Vous cesserez de vous suivre l'un et l'autre et ne pourrez plus vous suivre l'un et l'autre.
block_user.detail_2 = Cet utilisateur ne peut interagir avec vos dépôts, les tickets ou commentaires que vous avez créés.
-block_user.detail_3 = Cet utilisateur ne peut pas vous ajouter en tant que collaborateur, et vous ne pouvez pas l'ajouter en tant que collaborateur.
+block_user.detail_3 = Cet utilisateur ne peut pas vous ajouter l'un et l'autre en tant que collaborateur.
follow_blocked_user = Vous ne pouvez pas suivre cet utilisateur parce vous avez bloqué cet utilisateur ou bien cet utilisateur vous a bloqué.
block = Bloquer
unblock = Débloquer
following_one = Suit %d personnes
followers_one = %d abonné
+public_activity.visibility_hint.self_public = Votre activité est visible de tous, a l'exception de vos interactions dans les espaces privés. Configurer.
+public_activity.visibility_hint.admin_public = Cette activité est visible de tous mais, en tant qu'administrateur vous pouvez aussi voir les interactions dans les espaces privés.
+public_activity.visibility_hint.self_private = Vous pouvez voir votre propre activité, ainsi que les administrateurs de l'instance. Configurer.
+public_activity.visibility_hint.admin_private = Vous pouvez voir cette activité en tant qu'administrateur mais l'utilisateur veut qu'elle reste privée.
+following.title.few = Following
+followers.title.one = Follower
+followers.title.few = Followers
+following.title.one = Following
[settings]
profile=Profil
@@ -794,7 +819,7 @@ add_email_success=La nouvelle adresse e-mail a été ajoutée.
email_preference_set_success=L'e-mail de préférence a été défini avec succès.
add_openid_success=La nouvelle adresse OpenID a été ajoutée.
keep_email_private=Cacher l'adresse courriel
-keep_email_private_popup=Ceci masquera votre adresse e-mail de votre profil, de vos demandes d'ajout et des fichiers modifiés depuis l'interface Web. Les révisions déjà soumises ne seront pas modifiés. Utilisez %s dans les révisions pour les relier à votre compte.
+keep_email_private_popup=Ceci masquera votre adresse courriel de votre profil. Elle ne sera plus la valeur par défaut pour les commits créés par l'interface web, tel que des ajouts de fichiers ou des éditions, et ne sera pas utilisée pour fusionner les commits. Un courriel special %s peut être utilisé pour établir la relation entre des commits et votre compte. Notez que changer cette option n'aura pas d'effet sur les commits existants.
openid_desc=OpenID vous permet de confier l'authentification à une tierce partie.
manage_ssh_keys=Gérer les clés SSH
@@ -1007,6 +1032,7 @@ pronouns_custom = Personnalisés
pronouns = Pronoms
pronouns_unspecified = Non spécifiés
language.title = Langue par défaut
+keep_activity_private.description = Vous seul pourrez voir votre activité publique, ainsi que les administrateurs de l'instance.
[repo]
new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? Migrez-le ici.
@@ -1016,7 +1042,7 @@ repo_name=Nom du dépôt
repo_name_helper=Idéalement, le nom d'un dépôt devrait être court, mémorisable et unique.
repo_size=Taille du dépôt
template=Modèle
-template_select=Sélectionner un modèle.
+template_select=Sélectionner un modèle
template_helper=Faire de ce dépôt un modèle
template_description=Les référentiels de modèles permettent aux utilisateurs de générer de nouveaux référentiels avec la même structure de répertoire, fichiers et paramètres optionnels.
visibility=Visibilité
@@ -1043,15 +1069,15 @@ generate_from=Générer depuis
repo_desc=Description
repo_desc_helper=Décrire brièvement votre dépôt
repo_lang=Langue
-repo_gitignore_helper=Sélectionner quelques .gitignore prédéfinies.
+repo_gitignore_helper=Sélectionner quelques .gitignore prédéfinis
repo_gitignore_helper_desc=De nombreux outils et compilateurs génèrent des fichiers résiduels qui n'ont pas besoin d'être supervisés par git. Composez un .gitignore à l’aide de cette liste des languages de programmation courants.
-issue_labels=Jeu de labels pour les tickets
-issue_labels_helper=Sélectionner un jeu de label.
+issue_labels=Étiquettes
+issue_labels_helper=Sélectionner un jeu d'étiquettes
license=Licence
-license_helper=Sélectionner une licence.
+license_helper=Sélectionner une licence
license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment choisir une licence.
readme=LISEZMOI
-readme_helper=Choisissez un modèle de fichier LISEZMOI.
+readme_helper=Choisissez un modèle de fichier LISEZMOI
readme_helper_desc=Le README est l'endroit idéal pour décrire votre projet et accueillir des contributeurs.
auto_init=Initialiser le dépôt (avec un .gitignore, une Licence et un README.md)
trust_model_helper=Choisissez, parmi les éléments suivants, les règles de confiance des signatures paraphant les révisions :
@@ -1267,6 +1293,7 @@ view_git_blame=Voir Git blame
video_not_supported_in_browser=Votre navigateur ne supporte pas la balise « vidéo » HTML5.
audio_not_supported_in_browser=Votre navigateur ne supporte pas la balise « audio » HTML5.
stored_lfs=Stocké avec Git LFS
+stored_annex=Stocké avec Git Annex
symbolic_link=Lien symbolique
executable_file=Fichier exécutable
vendored=Externe
@@ -1292,6 +1319,7 @@ editor.upload_file=Téléverser un fichier
editor.edit_file=Modifier le fichier
editor.preview_changes=Aperçu des modifications
editor.cannot_edit_lfs_files=Les fichiers LFS ne peuvent pas être modifiés dans l'interface web.
+editor.cannot_edit_annex_files=Les fichiers Annex ne peuvent pas être modifiés dans l'interface web.
editor.cannot_edit_non_text_files=Les fichiers binaires ne peuvent pas être édités dans l'interface web.
editor.edit_this_file=Modifier le fichier
editor.this_file_locked=Le fichier est verrouillé
@@ -1577,7 +1605,7 @@ issues.commit_ref_at=`a référencé ce ticket depuis une révision a fait référence à %[4]s ce ticket %[2]s.`
issues.ref_pull_from=`a fait référence à cette demande d'ajout %[4]s %[2]s.`
issues.ref_closing_from=`a fait référence à une demande d'ajout %[4]s qui clora ce ticket, %[2]s.`
-issues.ref_reopening_from=`a référencé une pull request %[4]s qui va réouvrir ce ticket%[2]s`
+issues.ref_reopening_from=`a référencé une pull request %[4]s qui va ré-ouvrir ce ticket%[2]s`
issues.ref_closed_from=`a fermé ce ticket %[4]s%[2]s`
issues.ref_reopened_from=`a rouvert ce ticket %[4]s %[2]s.`
issues.ref_from=`de %[1]s`
@@ -1887,7 +1915,7 @@ pulls.outdated_with_base_branch=Cette branche est désynchronisée avec la branc
pulls.close=Fermer la demande d’ajout
pulls.closed_at=`a fermé cette demande d'ajout %[2]s.`
pulls.reopened_at=`a rouvert cette demande d'ajout %[2]s.`
-pulls.cmd_instruction_hint=`Voir les instructions en ligne de commande.`
+pulls.cmd_instruction_hint=Voir les instructions en ligne de commande
pulls.cmd_instruction_checkout_title=Basculer
pulls.cmd_instruction_checkout_desc=Depuis votre dépôt, basculer sur une nouvelle branche et tester des modifications.
pulls.cmd_instruction_merge_title=Fusionner
@@ -2490,7 +2518,7 @@ settings.lfs_locks_no_locks=Pas de verrous
settings.lfs_lock_file_no_exist=Le fichier verrouillé n'existe pas dans la branche par défaut
settings.lfs_force_unlock=Forcer le déverrouillage
settings.lfs_pointers.found=%d pointeur(s) sur blob trouvés - %d associés, %d non associés (%d manquant dans le magasin)
-settings.lfs_pointers.sha=SHA du Blob
+settings.lfs_pointers.sha=SHA du blob
settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=Dans le dépôt
settings.lfs_pointers.exists=Existe en magasin
@@ -2768,6 +2796,14 @@ subscribe.issue.guest.tooltip = Authentifiez vous pour vous abonner à ce ticket
subscribe.pull.guest.tooltip = Authentifiez vous pour suivre cette demande d'ajout.
n_release_one = %s publication
n_release_few = %s publications
+issues.author.tooltip.pr = Cet utilisateur est l'auteur de cette pull request.
+issues.author.tooltip.issue = Cet utilisateur est l'auteur de ce ticket.
+issues.edit.already_changed = Impossible de sauvegarder les changements du ticket car son contenu a déjà été modifié par un autre utilisateur. Veuillez recharger la page et essayer de l'éditer à nouveau pour éviter d'écraser ses changements
+pulls.edit.already_changed = Impossible de sauvegarder les changements de la pull request car son contenu a déjà été modifié par un autre utilisateur. Veuillez recharger la page et essayer de l'éditer à nouveau pour éviter d'écraser ses changements
+settings.federation_following_repos = Les URL des dépôts suivis séparés par ";", sans espace.
+settings.federation_not_enabled = La fédération n'est pas activée pour votre instance.
+comments.edit.already_changed = Impossible de sauvegarder les changements du commentaire car son contenu a déjà été modifié par un autre utilisateur. Veuillez recharger la page et essayer de l'éditer à nouveau pour éviter d'écraser ses changements
+settings.federation_apapiurl = URL de fédération de ce dépôt. A copier-coller dans les paramètres de fédérations d'un autre dépôt comme URL d'un dépôt à suivre.
[graphs]
component_loading=Chargement de %s…
@@ -2844,13 +2880,13 @@ members.member=Membre
members.remove=Exclure
members.remove.detail=Supprimer %[1]s de %[2]s ?
members.leave=Quitter
-members.leave.detail=Quitter %s ?
+members.leave.detail=Êtes vous certain·e de vouloir quitter l'organisation «%s» ?
members.invite_desc=Ajouter un nouveau membre à %s :
members.invite_now=Envoyer une invitation
teams.join=Rejoindre
teams.leave=Quitter
-teams.leave.detail=Quitter %s ?
+teams.leave.detail=Êtes vous certain·e de vouloir quitter l'équipe «%s» ?
teams.can_create_org_repo=Créer des dépôts
teams.can_create_org_repo_helper=Les membres peuvent créer de nouveaux dépôts dans l'organisation. Le créateur obtiendra l'accès administrateur au nouveau dépôt.
teams.none_access=Aucun accès
@@ -3035,9 +3071,9 @@ users.edit_account=Modifier un compte
users.max_repo_creation=Nombre maximal de dépôts
users.max_repo_creation_desc=(Mettre à -1 pour utiliser la limite globale par défaut.)
users.is_activated=Ce compte est activé
-users.prohibit_login=Désactiver la connexion
-users.is_admin=Est administrateur
-users.is_restricted=Est restreint
+users.prohibit_login=Suspendre le compte
+users.is_admin=Compte administrateur·rice
+users.is_restricted=Compte restreint
users.allow_git_hook=Autoriser la création de déclencheurs Git
users.allow_git_hook_tooltip=Les Déclencheurs Git sont exécutés par le même utilisateur que Forgejo, qui a des privilèges systèmes élevés. Les utilisateurs ayant ce droit peuvent altérer touts les dépôts, compromettre la base de données applicative, et se promouvoir administrateurs de Forgejo.
users.allow_import_local=Autoriser l'importation de dépôts locaux
@@ -3087,7 +3123,7 @@ orgs.new_orga=Nouvelle organisation
repos.repo_manage_panel=Gestion des dépôts
repos.unadopted=Dépôts non adoptés
-repos.unadopted.no_more=Aucun dépôt dépossédé trouvé
+repos.unadopted.no_more=Aucun dépôt candidat à l'adoption n'a été trouvé
repos.owner=Propriétaire
repos.name=Nom
repos.private=Privé
@@ -3290,7 +3326,7 @@ config.service_config=Configuration du service
config.register_email_confirm=Exiger la confirmation de l'e-mail lors de l'inscription
config.disable_register=Désactiver le formulaire d'inscription
config.allow_only_internal_registration=Autoriser l'inscription uniquement via Forgejo lui-même
-config.allow_only_external_registration=N'autoriser l'inscription qu'à partir des services externes
+config.allow_only_external_registration=N'autoriser l'inscription qu'à partir de services externes
config.enable_openid_signup=Activer l'inscription avec OpenID
config.enable_openid_signin=Activer la connexion avec OpenID
config.show_registration_button=Afficher le bouton d'enregistrement
@@ -3453,6 +3489,10 @@ auths.tip.gitlab_new = Enregistrer une nouvelle application sur https://gitlab.c
auths.default_domain_name = Nom de domaine par défaut utilisé pour le courriel
config.open_with_editor_app_help = Les éditeurs du menu "Ouvrir avec". Si laissé vide, les valeurs par défaut seront utilisées. Ouvrir pour voir les valeurs par défaut.
config.app_slogan = Slogan de l'instance
+config.cache_test_slow = Test du cache réussi, mais le temps de réponse est lent : %s.
+config.cache_test_failed = Échec du contrôle du cache : %v.
+config.cache_test = Tester le cache
+config.cache_test_succeeded = Test du cache réussi, réponse obtenue en %s.
[action]
create_repo=a créé le dépôt %s
@@ -3811,6 +3851,14 @@ runs.no_workflows.documentation = Pour plus d’informations sur Forgejo Actions
variables.id_not_exist = La variable numéro %d n’existe pas.
runs.workflow = Workflow
runs.no_job_without_needs = Le workflow doit contenir au moins une tâche sans dépendances.
+workflow.dispatch.use_from = Utiliser un workflow depuis
+runs.no_job = Le workflow doit au moins contenir une tâche
+workflow.dispatch.trigger_found = Ce workflow a un déclencheur d'événement workflow_dispatch.
+workflow.dispatch.run = Exécuter le workflow
+workflow.dispatch.success = L'exécution du workflow a bien été demandée.
+workflow.dispatch.input_required = Le champ "%s" est obligatoire.
+workflow.dispatch.invalid_input_type = Type invalide pour le champ "%s".
+workflow.dispatch.warn_input_limit = Affichage des %d premiers champs seulement.
[projects]
type-1.display_name=Projet personnel
@@ -3860,6 +3908,13 @@ package_kind = Chercher les paquets...
project_kind = Chercher les projets...
branch_kind = Chercher les branches...
commit_kind = Chercher les commits...
+exact = Exact
+exact_tooltip = Inclure uniquement les résultats qui correspondent exactement au terme recherché
+issue_kind = Rechercher dans les tickets...
+union = Union
+union_tooltip = Inclus les résultats contenant au moins un des mots clé séparés par des espaces
+pull_kind = Rechercher dans les demande d'ajout...
+milestone_kind = Recherche dans les jalons...
[munits.data]
diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini
index 673486f6c0..e650d438e9 100644
--- a/options/locale/locale_gl.ini
+++ b/options/locale/locale_gl.ini
@@ -7,7 +7,7 @@ dashboard = Panel de Control
explore = Explorar
help = Axuda
logo = Logo
-sign_in = Iniciar Sesión
+sign_in = Iniciar sesión
sign_in_with_provider = Iniciar Sesión con %s
sign_in_or = ou
sign_out = Pechar Sesión
@@ -142,6 +142,7 @@ filter.public = Publico
pin = Aproximada
filter.private = Privado
copy_generic = Copiar ao portapapeis
+test = Test
[aria]
navbar = Barra de Navegación
@@ -173,6 +174,8 @@ buttons.ref.tooltip = Referencia un problema ou pull request
[search]
search = Buscar...
type_tooltip = Tipo de busca
+repo_kind = Buscar repositorios...
+user_kind = Buscar usuarios...
[startpage]
platform = Multiplataforma
@@ -221,4 +224,6 @@ log_root_path = Ruta de rexistro
log_root_path_helper = Os ficheiros de rexistro escribiranse neste directorio.
sqlite_helper = Ruta do ficheiro para a base de datos SQLite3. Introduza unha ruta absoluta se executa Forgejo como servizo.
reinstall_confirm_message = A reinstalación cunha base de datos Forgejo existente pode causar varios problemas. Na maioría dos casos, deberías usar o teu "app.ini" existente para executar Forgejo. Se sabes o que estás facendo, confirma o seguinte:
-reinstall_confirm_check_1 = É posible que se perdan os datos cifrados pola SECRET_KEY en app.ini: é posible que os usuarios non poidan iniciar sesión con 2FA/OTP e que os espellos non funcionen correctamente. Ao marcar esta caixa, confirmas que o ficheiro app.ini actual contén a SECRET_KEY correcta.
\ No newline at end of file
+reinstall_confirm_check_1 = É posible que se perdan os datos cifrados pola SECRET_KEY en app.ini: é posible que os usuarios non poidan iniciar sesión con 2FA/OTP e que os espellos non funcionen correctamente. Ao marcar esta caixa, confirmas que o ficheiro app.ini actual contén a SECRET_KEY correcta.
+disable_gravatar.description = Desactiva o uso de Gravatar ou outras fontes de avatares de terceiros. As imaxes predeterminadas utilizaranse para os avatares dos usuarios a menos que carguen o seu propio avatar na instancia.
+federated_avatar_lookup = Activar avatares federados
\ No newline at end of file
diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini
index 627b3a3700..98bd43f9bf 100644
--- a/options/locale/locale_hu-HU.ini
+++ b/options/locale/locale_hu-HU.ini
@@ -16,7 +16,7 @@ template=Sablon
language=Nyelv
notifications=Értesítések
create_new=Létrehozás…
-user_profile_and_more=Profil és beállítások...
+user_profile_and_more=Profil és beállítások…
signed_in_as=Bejelentkezve mint
toc=Tartalomjegyzék
licenses=Licencek
@@ -56,7 +56,7 @@ collaborative=Közreműködő
forks=Másolat
activities=Tevékenységek
-pull_requests=Egyesítési Kérések
+pull_requests=Egyesítési kérések
issues=Hibajegyek
milestones=Mérföldkövek
@@ -90,16 +90,70 @@ concept_user_organization=Szervezet
name=Név
+filter.not_archived = Nem archivált
+filter.public = Nyilvános
+filter.private = Privát
+filter = Szűrő
+filter.is_archived = Archivált
+logo = Logó
+sign_in_with_provider = Bejelentkezés %s fiókkal
+webauthn_insert_key = Helyezze be biztonsági kulcsát
+webauthn_press_button = Kérem nyomja meg a biztonsági kulcsán található gombot…
+access_token = Hozzáférési token
+webauthn_error = A biztonsági kulcsának beolvasása sikertelen volt.
+webauthn_unsupported_browser = A böngészője jelenleg nem támogatja a WebAuthn protokollt.
+webauthn_error_unknown = Egy ismeretlen hiba jelentkezett. Kérem próbálja újra.
+webauthn_error_unable_to_process = A szerver nem tudta feldolgozni kérését.
+webauthn_error_empty = Ennek a kulcsnak nevet kell adnia.
+new_project_column = Új oszlop
+never = Soha
+unknown = Ismeretlen
+value = Érték
+copy_content = Tartalom másolása
+copy_hash = Hash másolása
+copy_success = Másolva!
+confirm_delete_selected = Biztosan törli az összes kijelölt elemet?
+pin = Kitűzés
+show_timestamps = Időbélyegek mutatása
+show_log_seconds = Másodpercek mutatása
+download_logs = Naplófájlok letöltése
+filter.is_template = Sablonok
+error = Hiba
+go_back = Vissza
+filter.not_template = Nem sablonok
+locked = Zárolt
+more_items = További elemek
+view = Megtekintés
+ok = OK
+copy_generic = Másolás vágólapra
+copy_url = URL másolása
+webauthn_error_insecure = A WebAuthn csak biztonságos kapcsolatokat támogat. HTTP-n keresztüli tesztelés esetén használja a "localhost" vagy "127.0.0.1"-es elérési pontokat
[aria]
+footer.links = Hivatkozások
+footer = Lábléc
[heatmap]
+less = Kevesebb
+more = Több
[editor]
+buttons.heading.tooltip = Fejléc hozzáadása
+buttons.code.tooltip = Kód hozzáadása
+buttons.bold.tooltip = Félkövér szöveg hozzáadása
+buttons.italic.tooltip = Dőlt szöveg hozzáadása
+buttons.quote.tooltip = Szöveg idézése
+buttons.link.tooltip = Hivatkozás hozzáadása
+buttons.indent.tooltip = Elemek behúzása egy szinttel
[filter]
+string.asc = A - Z
+string.desc = Z - A
[error]
+occurred = Hiba történt
+server_internal = Belső szerverhiba
+network_error = Hálózati hiba
[startpage]
app_desc=Fájdalommentes, saját gépre telepíthető Git szolgáltatás
@@ -136,7 +190,7 @@ app_name=Webhely címe
app_name_helper=Itt megadhatja a vállalata nevét.
repo_path=Tárolók gyökérkönyvtára
repo_path_helper=Minden távoli Git tároló ebbe a mappába lesz mentve.
-lfs_path=LFS Gyökérkönyvtár
+lfs_path=Git LFS gyökérkönyvtár
lfs_path_helper=A fájlok amiket Git LFS-el elmentesz ebbe a könyvtárba kerülnek. Hagyd üresen az LFS kikapcsolásához.
run_user=Futtatás mint
ssh_port=SSH szerver port
@@ -197,6 +251,7 @@ default_enable_timetracking=Időmérés bekapcsolása alapértelmezetten
default_enable_timetracking.description=Időmérés bekapcsolása az új tárolókra alapértelmezetten.
no_reply_address=Rejtett e-mail tartomány
no_reply_address_helper=Domain név a rejtett email címmel rendelkező felhasználók számára.Például: Ha a felhasználóneve "jani" akkor bejelentkezhet a "jani@noreply.example.org" email címmel,ha a rejtett email domain "noreply.example.org"-ra van állítva.
+domain = Szerver domain
[home]
uname_holder=Felhasználónév vagy e-mail cím
@@ -290,7 +345,7 @@ activate_account=Kérjük aktiválja a fiókját
activate_email=E-mail cím megerősítése
-register_notify=A Forgejo üdvözli
+register_notify_prev9=A Forgejo üdvözli
reset_password=Fiókjának visszaállítása
@@ -689,6 +744,7 @@ file_too_large=Ez a fájl túl nagy ahhoz, hogy megjelenítsük.
video_not_supported_in_browser=A böngésző nem támogatja a HTML5 video tag-et.
audio_not_supported_in_browser=A böngésző nem támogatja a HTML5 audio tag-et.
stored_lfs=Git LFS-el eltárolva
+stored_annex=Git Annex-el eltárolva
symbolic_link=Szimbolikus hivatkozás
commit_graph=Commit gráf
commit_graph.hide_pr_refs=Pull request-ek elrejtése
@@ -701,6 +757,7 @@ editor.upload_file=Fájl feltöltése
editor.edit_file=Fájl szerkesztése
editor.preview_changes=Változások előnézete
editor.cannot_edit_lfs_files=LFS fájlok nem szerkeszthetőek a webes felületen.
+editor.cannot_edit_annex_files=Annex fájlok nem szerkeszthetőek a webes felületen.
editor.cannot_edit_non_text_files=Bináris fájlok nem szerkeszthetőek a webes felületen.
editor.edit_this_file=Fájl szerkesztése
editor.this_file_locked=Zárolt állomány
@@ -1673,3 +1730,17 @@ runs.commit=Commit
symbolic_link=Szimbolikus hivatkozás
submodule = Almodul
+
+
+[search]
+search = Keresés...
+type_tooltip = Keresés típusa
+code_kind = Kód keresése...
+code_search_unavailable = A kódban való keresés jelenleg nem elérhető. Kérem vegye fel a kapcsolatot az oldal adminisztrátorával.
+package_kind = Csomagok keresése...
+project_kind = Projektek keresése...
+user_kind = Felhasználók keresése...
+repo_kind = Tárak keresése...
+org_kind = Szervezetek keresése...
+team_kind = Csapatok keresése...
+exact = Pontos
\ No newline at end of file
diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini
index d85cb78abb..6af9488953 100644
--- a/options/locale/locale_id-ID.ini
+++ b/options/locale/locale_id-ID.ini
@@ -212,7 +212,7 @@ activate_account=Silakan aktifkan akun anda
activate_email=Verifikasi alamat surel anda
-register_notify=Selamat Datang di Forgejo
+register_notify_prev9=Selamat Datang di Forgejo
reset_password=Pulihkan akun Anda
@@ -598,6 +598,7 @@ file_permalink=Permalink
file_too_large=Berkas terlalu besar untuk ditampilkan.
stored_lfs=Tersimpan dengan GIT LFS
+stored_annex=Tersimpan dengan GIT Annex
commit_graph=Grafik Komit
blame=Salahkan
normal_view=Pandangan Normal
@@ -609,6 +610,7 @@ editor.upload_file=Unggah Berkas
editor.edit_file=Sunting Berkas
editor.preview_changes=Tinjau Perubahan
editor.cannot_edit_lfs_files=Berkas LFS tidak dapat disunting dalam antarmuka web.
+editor.cannot_edit_annex_files=Berkas Annex tidak dapat disunting dalam antarmuka web.
editor.cannot_edit_non_text_files=Berkas biner tidak dapat disunting dalam antarmuka web.
editor.edit_this_file=Sunting Berkas
editor.this_file_locked=Berkas terkunci
diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini
index 7b5733e2eb..2abc0f1729 100644
--- a/options/locale/locale_is-IS.ini
+++ b/options/locale/locale_is-IS.ini
@@ -302,7 +302,7 @@ activate_account.text_2=Vinsamlegast smelltu á eftirfarandi tengil til að virk
activate_email=Staðfestu netfangið þitt
activate_email.text=Vinsamlegast smelltu á eftirfarandi tengil til að staðfesta netfangið þitt innan %s:
-register_notify=Velkomin(n) í Forgejo
+register_notify_prev9=Velkomin(n) í Forgejo
register_notify.title=%[1]s, velkomin(n) í %[2]s
register_notify.text_1=þetta er staðfestingarpóstur þinn fyrir skráningu á %s!
register_notify.text_2=Þú getur nú skráð þig inn með notandanafni: %s.
@@ -679,6 +679,7 @@ file_view_rendered=Skoða Unnið
file_copy_permalink=Afrita Varanlega Slóð
stored_lfs=Geymt með Git LFS
+stored_annex=Geymt með Git Annex
commit_graph.hide_pr_refs=Fela Sameiningarbeiðnir
commit_graph.monochrome=Einlitað
commit_graph.color=Litað
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index fe93ea51da..fe2c5df8be 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -8,7 +8,7 @@ sign_in=Accedi
sign_in_or=o
sign_out=Esci
sign_up=Registrati
-link_account=Collega account
+link_account=Collega Profilo
register=Registrati
version=Versione
powered_by=Gestito da %s
@@ -16,11 +16,11 @@ page=Pagina
template=Template
language=Lingua
notifications=Notifiche
-active_stopwatch=Tracker Tempo Attivo
+active_stopwatch=Attiva cronometro
create_new=Crea…
-user_profile_and_more=Profilo ed Impostazioni…
+user_profile_and_more=Profilo ed impostazioni…
signed_in_as=Accesso effettuato come
-toc=Indice dei contenuti
+toc=Indice dei Contenuti
licenses=Licenze
return_to_forgejo=Ritorna a Forgejo
@@ -35,13 +35,13 @@ twofa_scratch=Codice di recupero per la verifica in due passaggi
passcode=Codice di sicurezza
webauthn_insert_key=Inserisci la tua chiave di sicurezza
-webauthn_sign_in=Premere il pulsante sul tasto di sicurezza. Se il tasto di sicurezza non ha pulsante, reinseriscilo.
-webauthn_press_button=Si prega di premere il pulsante sul tasto di sicurezza…
+webauthn_sign_in=Premi il pulsante sul tasto di sicurezza. Se il tasto di sicurezza non ha pulsante, reinseriscilo.
+webauthn_press_button=Premi il pulsante sulla chiave di sicurezza…
webauthn_use_twofa=Usa un codice a due fattori dal tuo telefono
webauthn_error=Impossibile leggere la tua chiave di sicurezza.
webauthn_unsupported_browser=Il tuo browser al momento non supporta WebAuthn.
webauthn_error_unknown=Si è verificato un errore sconosciuto. Riprova.
-webauthn_error_insecure=`WebAuthn supporta solo connessioni sicure. Per il test su HTTP, è possibile utilizzare l'origine "localhost" o "127.0.0.1"`
+webauthn_error_insecure=WebAuthn supporta solo connessioni sicure. Per il test su HTTP, è possibile utilizzare l'origine "localhost" o "127.0.0.1"
webauthn_error_unable_to_process=Il server non può elaborare la richiesta.
webauthn_error_duplicated=La chiave di sicurezza non è consentita per questa richiesta. Assicurati che la chiave non sia già registrata.
webauthn_error_empty=Devi impostare un nome per questa chiave.
@@ -71,18 +71,18 @@ mirrors=Mirror
collaborative=Condivisi
forks=Fork
-activities=Attivitá
-pull_requests=Pull request
+activities=Attività
+pull_requests=Richieste di modifica
issues=Segnalazioni
-milestones=Milestones
+milestones=Traguardi
ok=OK
cancel=Annulla
save=Salva
add=Aggiungi
-add_all=Aggiungi tutti
+add_all=Aggiungi tutto
remove=Rimuovi
-remove_all=Rimuovi Tutti
+remove_all=Rimuovi tutti
edit=Modifica
enabled=Attivo
@@ -142,27 +142,29 @@ download_logs = Scarica logs
confirm_delete_selected = Confermare l'eliminazione di tutti gli elementi selezionati?
sign_in_with_provider = Accedi con %s
new_project_column = Nuova colonna
-toggle_menu = Mostra/Nascondi Menu
-filter.not_fork = Non da fork
+toggle_menu = Mostra/Nascondi menu
+filter.not_fork = Non fork
filter = Filtro
filter.clear = Rimuovi filtri
filter.is_archived = Archiviato
filter.not_archived = Non archiviato
-filter.is_fork = Da Fork
+filter.is_fork = Da fork
filter.is_mirror = Mirror
filter.not_mirror = Non mirror
-filter.is_template = Modello
-filter.not_template = Non modello
+filter.is_template = Modelli
+filter.not_template = Non modelli
filter.public = Pubblico
filter.private = Privato
more_items = Più elementi
invalid_data = Dati non validi: %v
+copy_generic = Copia negli appunti
+test = Prova
[aria]
footer.links = Collegamenti
-navbar = Barra di Navigazione
+navbar = Barra di navigazione
footer = Piè di Pagina
-footer.software = A proposito del Software
+footer.software = A proposito di questo software
[heatmap]
more = Più
@@ -184,10 +186,12 @@ buttons.list.unordered.tooltip = Aggiungi un elenco puntato
buttons.list.ordered.tooltip = Aggiungi un elenco numerato
buttons.list.task.tooltip = Aggiungi un elenco di attività
buttons.mention.tooltip = Menziona un utente o team
-buttons.ref.tooltip = Fai riferimento ad un problema o pull request
+buttons.ref.tooltip = Fa riferimento a una segnalazione o pull request
buttons.switch_to_legacy.tooltip = Passa all'editor classico
buttons.enable_monospace_font = Attiva font monospace
buttons.disable_monospace_font = Disattiva font monospace
+buttons.indent.tooltip = Annida elementi di un livello
+buttons.unindent.tooltip = Disannida elementi di un livello
[filter]
string.asc = A - Z
@@ -199,7 +203,7 @@ missing_csrf=Richiesta errata: nessun token CSRF presente
invalid_csrf=Richiesta errata: token CSRF non valido
not_found=Il bersaglio non è stato trovato.
network_error=Errore di rete
-report_message = Se credi che questo sia un errore di Forgejo, per favore controlla le segnalazioni su Codeberg o aprine una nuova se necessario.
+report_message = Se si pensa che questo sia un errore di Forgejo, controllare le segnalazioni su Codeberg o aprine una nuova se necessario.
server_internal = Errore interno del server
[startpage]
@@ -217,7 +221,7 @@ install_desc = Semplicemente la documentazione prima di cambiare qualsiasi impostazione.
-require_db_desc=Forgejo requires MySQL, PostgreSQL, SQLite3 or TiDB (MySQL protocol).
+require_db_desc=Forgejo richiede MySQL, PostgreSQL, SQLite3 o TiDB (protocollo MySQL).
db_title=Impostazioni database
db_type=Tipo di database
host=Host
@@ -229,13 +233,13 @@ db_schema_helper=Lascia vuoto per il valore predefinito del database ("public").
ssl_mode=SSL
path=Percorso
sqlite_helper=Percorso file del database SQLite3. Inserisci un percorso assoluto se stai usando Forgejo come servizio.
-reinstall_error=Stai cercando di installare in un database Forgejo esistente
+reinstall_error=Stai cercando di installare Forgejo in una base dati già esistente
reinstall_confirm_message=La reinstallazione con una base dati Forgejo esistente può causare vari problemi. Nella maggior parte dei casi, dovresti usare il tuo "app.ini" per eseguire Forgejo. Se sai cosa stai facendo, conferma quanto segue:
-reinstall_confirm_check_1=I dati crittografati da SECRET_KEY nell'app. ni potrebbe essere perso: gli utenti potrebbero non essere in grado di accedere con 2FA/OTP & mirror potrebbe non funzionare correttamente. Selezionando questa casella confermi che il file attuale app.ini contiene il corretto SECRET_KEY.
-reinstall_confirm_check_2=I repository e le impostazioni potrebbero avere bisogno di essere ri-sincronizzati. Selezionando questa casella confermi che potrai risincronizzare manualmente gli hook per i repository e il file authorized_keys. Confermi che assicurerai che le impostazioni del repository e del mirror siano corrette.
-reinstall_confirm_check_3=Confermi di essere assolutamente sicuro che questo Forgejo è in esecuzione con l'app corretta. ni posizione e che sei sicuro di dover reinstallare. Confermi di aver riconosciuto i rischi di cui sopra.
+reinstall_confirm_check_1=I dati crittografati da SECRET_KEY nell'app.ini potrebbero essere persi: gli utenti potrebbero non essere in grado di accedere con 2FA/OTP & i mirror potrebbero non funzionare correttamente. Selezionando questa casella confermi che il file attuale app.ini contiene il corretto SECRET_KEY.
+reinstall_confirm_check_2=I repository e le impostazioni potrebbero avere bisogno di essere ri-sincronizzati. Selezionando questa casella confermi che potrai risincronizzare manualmente gli hook per i repository e il file authorized_keys. Confermi che assicurerai che le impostazioni dei repository e dei mirror siano corrette.
+reinstall_confirm_check_3=Confermi di essere assolutamente sicurə che questo Forgejo è in esecuzione con il file app.ini corretto e che sei sicurə di dover reinstallare. Confermi di aver riconosciuto i rischi di cui sopra.
err_empty_db_path=Il percorso del database SQLite3 non può essere vuoto.
-no_admin_and_disable_registration=Non puoi disabilitare l'auto-registrazione degli utenti senza creare un account amministratore.
+no_admin_and_disable_registration=Non puoi disabilitare l'auto-registrazione degli utenti senza creare un profilo amministratore.
err_empty_admin_password=La password dell'amministratore non può essere vuota.
err_empty_admin_email=L'email dell'amministratore non può essere vuota.
err_admin_name_is_reserved=Nome utente Administrator non valido, nome utente riservato
@@ -244,11 +248,11 @@ err_admin_name_is_invalid=Il nome utente Administrator non è valido
general_title=Impostazioni generali
app_name=Titolo dell'istanza
-app_name_helper=Qui puoi inserire il nome della tua società.
+app_name_helper=Inserire qui il nome dell'istanza. Verrà visualizzato su ogni pagina.
repo_path=Percorso radice dei repository
-repo_path_helper=Le Remote Git repositories saranno salvate in questa directory.
+repo_path_helper=I repository Git remoti saranno salvati in questa cartella.
lfs_path=Percorso radice di git LFS
-lfs_path_helper=I file trovati da Git LFS saranno salvati in questa directory. Lasciare vuoto per disattivare.
+lfs_path_helper=I file trovati da Git LFS saranno salvati in questa cartella. Lascia vuoto per disattivare.
run_user=Nome utente col quale eseguire
domain=Dominio server
domain_helper=Dominio o indirizzo host per il server.
@@ -266,27 +270,27 @@ email_title=Impostazioni e-mail
smtp_addr=Host SMTP
smtp_port=Porta SMTP
smtp_from=Invia e-mail come
-smtp_from_helper=Indirizzo Email che Forgejo utilizzerà. Inserisci un indirizzo email o usa il formato "Name" .
+smtp_from_helper=Indirizzo e-mail che verrà usato da Forgejo. Inserisci un indirizzo e-mail o usa il formato "Nome" .
mailer_user=Nome utente SMTP
mailer_password=Password SMTP
register_confirm=Richiedi conferma e-mail durante la registrazione
mail_notify=Attiva le notifiche e-mail
server_service_title=Impostazioni server e servizi di terze parti
offline_mode=Attiva modalità in locale
-offline_mode.description=Disattiva le reti di distribuzione dei contenuti di terze parti e fornisci tutte le risorse localmente.
+offline_mode.description=Disattiva le reti di distribuzione dei contenuti di terze parti e servi tutte le risorse localmente.
disable_gravatar=Disattiva Gravatar
-disable_gravatar.description=Disattiva Gravatar e le fonti di avatar di terze parti. Verrà usato un avatar predefinito almeno che un utente non carichi un avatar in locale.
+disable_gravatar.description=Disabilita l'utilizzo di Gravatar o di altre fonti avatar di terze parti. Le immagini predefinite verranno utilizzate per gli avatar degli utenti a meno che non carichino il proprio avatar sull'istanza.
federated_avatar_lookup=Attiva le immagini profilo federate
-federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar.
+federated_avatar_lookup.description=Cerca gli avatar utilizzando Libravatar.
disable_registration=Disattiva auto-registrazione
-disable_registration.description=Disattiva la user self-registration. Solo gli amministratori saranno in grado di creare account.
-allow_only_external_registration.description=Attiva la registrazione solo tramite servizi esterni
+disable_registration.description=Solo gli amministratori dell'istanza potranno creare nuovi account utente. Si consiglia vivamente di mantenere la registrazione disabilitata a meno che non si intenda ospitare un'istanza pubblica per tutti e siate pronti a gestire grandi quantità di account spam.
+allow_only_external_registration.description=Gli utenti potranno creare nuovi account usando i servizi esterni configurati.
openid_signin=Attiva l'accesso con OpenID
-openid_signin.description=Attiva registrazione utente via OpenID.
+openid_signin.description=Permetti agli utenti di registrarsi via OpenID.
openid_signup=Attiva auto-registrazione con OpenID
-openid_signup.description=Attiva OpenID-based user self-registration.
+openid_signup.description=Consenti agli utenti di creare account tramite OpenID se l'autoregistrazione è abilitata.
enable_captcha=Abilita CAPTCHA per registrazione
-enable_captcha.description=Richiedi convalida captcha per i nuovi utenti.
+enable_captcha.description=Richiedi convalida CAPTCHA per i nuovi utenti.
require_sign_in_view=Richiedi l'accesso per visualizzare il contenuto dell'istanza
admin_setting.description=Creare un account amministratore è opzionale. Il primo utente registrato sarà automaticamente un amministratore.
admin_title=Impostazioni profilo amministratore
@@ -307,11 +311,11 @@ save_config_failed=Salvataggio della configurazione non riuscito: %v
invalid_admin_setting=Le impostazioni dell'account amministratore sono invalide: %v
invalid_log_root_path=Il percorso del log non è valido: %v
default_keep_email_private=Nascondi Indirizzo e-mail come impostazione predefinita
-default_keep_email_private.description=Nasconi l'indirizzo email dei nuovi account utente di default.
+default_keep_email_private.description=Nascondi l'indirizzo email dei nuovi utenti di default cosicché questa informazione non venga subito rivelata dopo la registrazione.
default_allow_create_organization=Consenti la creazione di organizzazioni come impostazione predefinita
-default_allow_create_organization.description=Consenti ai nuovi account utente di creare organizzazioni di default.
+default_allow_create_organization.description=Consenti ai nuovi utenti di creare organizzazioni per impostazione predefinita. Quando questa opzione è disabilitata, un amministratore dovrà concedere l'autorizzazione per la creazione di organizzazioni ai nuovi utenti.
default_enable_timetracking=Attiva il cronografo come impostazione predefinita
-default_enable_timetracking.description=Attiva il cronografo per le nuove repositories di default.
+default_enable_timetracking.description=Attiva di default il cronografo per i nuovi repository.
no_reply_address=Dominio e-mail nascosto
no_reply_address_helper=Nome di dominio per utenti con un indirizzo email nascosto. Ad esempio, il nome utente "joe" accederà a Git come "joe@noreply.example.org" se il dominio email nascosto è impostato a "noreply.example.org".
password_algorithm=Algoritmo per hash delle password
@@ -324,22 +328,25 @@ env_config_keys = Configurazione Ambiente
env_config_keys_prompt = Le seguenti variabili di ambiente saranno anche applicate al tuo file di configurazione:
run_user_helper = Il nome utente del sistema operativo con il quale Forgejo viene eseguito. Questo utente deve avere accesso alla cartella principale dei repository.
password_algorithm_helper = Imposta l'algoritmo di hashing della password. Gli algoritmi hanno requisiti e punti di forza diversi. L'algoritmo argon2 è relativamente sicuro ma usa un sacco di memoria e potrebbe non essere appropriato a piccoli sistemi.
-require_sign_in_view.description = Limita l'accesso ad utenti autenticati. I visitatori vedranno solo le pagine di accesso e registrazione.
+require_sign_in_view.description = Limita l'accesso a utenti autenticati. I visitatori vedranno solo le pagine di accesso e registrazione.
allow_dots_in_usernames = Consenti l'uso del punto nel nome utente. Non impatta i profili già esistenti.
config_location_hint = Queste opzioni di configurazione saranno salvate in:
+allow_only_external_registration = Permetti la registrazione solo tramite servizi esterni
+app_slogan = Slogan dell'istanza
+app_slogan_helper = Inserire qui lo slogan dell'istanza. Lasciare vuoto per disabilitare.
[home]
uname_holder=Nome utente o indirizzo e-mail
password_holder=Password
-switch_dashboard_context=Cambia Dashboard Context
+switch_dashboard_context=Cambia dashboard context
my_repos=Repositories
show_more_repos=Mostra altre repositories…
-collaborative_repos=Repository Condivisi
+collaborative_repos=Repository condivisi
my_orgs=Organizzazioni
my_mirrors=I miei Mirror
view_home=Vedi %s
search_repos=Trova un repository…
-filter=Altro filtri
+filter=Altri filtri
filter_by_team_repositories=Filtra per repository del team
feed_of=`Feed di "%s"`
@@ -389,21 +396,21 @@ disable_register_prompt=La registrazione è disabilitata. Si prega di contattare
disable_register_mail=Email di conferma per la registrazione disabilitata.
manual_activation_only=Contatta l'amministratore del sito per completare l'attivazione.
remember_me=Ricorda questo dispositivo
-forgot_password_title=Password Dimenticata
+forgot_password_title=Password dimenticata
forgot_password=Password dimenticata?
sign_up_now=Hai bisogno di un account? Registrati adesso.
confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di registrazione.
must_change_password=Aggiorna la tua password
allow_password_change=Richiede all'utente di cambiare la password (scelta consigliata)
reset_password_mail_sent_prompt=Una email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di reset della password.
-active_your_account=Attiva il tuo Account
+active_your_account=Attiva il tuo account
account_activated=L'account è stato attivato
prohibit_login=L'accesso è proibito
resent_limit_prompt=Hai già richiesto un'e-mail d'attivazione recentemente. Si prega di attenere 3 minuti e poi riprovare.
has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (%s). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto.
resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione
email_not_associate=L'indirizzo email non è associato ad alcuna conta.
-send_reset_mail=Inviare email di recupero account
+send_reset_mail=Invia email di recupero
reset_password=Recupero account
invalid_code=Il tuo codice di conferma è invalido oppure è scaduto.
reset_password_helper=Recuperare account
@@ -417,12 +424,12 @@ twofa_passcode_incorrect=Il tuo passcode non è corretto. Se hai smarrito il tuo
twofa_scratch_token_incorrect=I tuo codice scratch non è corretto.
login_userpass=Accedi
tab_openid=OpenID
-oauth_signup_tab=Creare nuovo account
-oauth_signup_title=Completa Nuovo Account
-oauth_signup_submit=Completa l'Account
-oauth_signin_tab=Collegamento ad un Account Esistente
-oauth_signin_title=Accedi per autorizzare l' Account collegato
-oauth_signin_submit=Collega Account
+oauth_signup_tab=Crea nuovo account
+oauth_signup_title=Completa il nuovo account
+oauth_signup_submit=Completa l'account
+oauth_signin_tab=Collega ad un account esistente
+oauth_signin_title=Accedi per autorizzare l'account collegato
+oauth_signin_submit=Collega account
oauth.signin.error=Si è verificato un errore nell'elaborazione della richiesta di autorizzazione. Se questo errore persiste, si prega di contattare l'amministratore del sito.
oauth.signin.error.access_denied=La richiesta di autorizzazione è stata negata.
oauth.signin.error.temporarily_unavailable=Autorizzazione non riuscita perché il server di autenticazione non è temporaneamente disponibile. Riprova più tardi.
@@ -471,7 +478,7 @@ activate_account.text_2=Clicca sul seguente link per attivare il tuo account ent
activate_email=Verifica il tuo indirizzo e-mail
activate_email.text=Clicca sul seguente link per verificare il tuo indirizzo email entro %s:
-register_notify=Benvenuto su Forgejo
+register_notify_prev9=Benvenuto su Forgejo
register_notify.title=%[1]s, benvenuto in %[2]s
register_notify.text_1=questa è la tua email di conferma di registrazione per %s!
register_notify.text_2=Puoi accedere al tuo profilo tramite il tuo nome utente: %s
@@ -672,6 +679,14 @@ form.name_pattern_not_allowed = La sequenza "%s" non è consentita in un nome ut
follow_blocked_user = Non puoi seguire questo utente perchè hai bloccato questo utente o perchè questo utente ha bloccato te.
followers_one = %d seguace
following_one = %d seguito
+public_activity.visibility_hint.self_public = L'attività è visibile a tutti, tranne che per le interazioni negli spazi privati. Configura.
+public_activity.visibility_hint.admin_public = Questa attività è visibile a tutti, ma come amministratore, si possono vedere anche le interazioni negli spazi privati.
+public_activity.visibility_hint.self_private = L'attività è visibile solo a te e agli amministratori dell'istanza. Configura.
+public_activity.visibility_hint.admin_private = Questa attività è visibile a te perché sei un amministratore, ma l'utente desidera che rimanga privata.
+followers.title.one = Seguace
+followers.title.few = Seguaci
+following.title.one = Seguito
+following.title.few = Osservato
[settings]
@@ -999,6 +1014,7 @@ hints = Suggerimenti
pronouns = Pronomi
pronouns_custom = Personalizzato
pronouns_unspecified = Non specificato
+language.title = Lingua predefinita
[repo]
owner=Proprietario
@@ -1019,7 +1035,7 @@ fork_repo=Deriva progetto
fork_from=Deriva da
already_forked=Hai già fatto il fork di %s
fork_to_different_account=Fai Fork a un account diverso
-fork_visibility_helper=La visibilità di un repository forkato non può essere modificata.
+fork_visibility_helper=La visibilità di un repository derivato non può essere modificata.
use_template=Usa questo modello
clone_in_vsc=Clona nel codice VS
download_zip=Scarica ZIP
@@ -1120,7 +1136,7 @@ migrate_options_lfs_endpoint.description=La migrazione tenterà di utilizzare il
migrate_options_lfs_endpoint.description.local=È supportato anche un percorso server locale.
migrate_items=Elementi di migrazione
migrate_items_wiki=Wiki
-migrate_items_milestones=Milestone
+migrate_items_milestones=Traguardi
migrate_items_labels=Etichette
migrate_items_issues=Issues
migrate_items_pullrequests=Richieste di modifica
@@ -1152,14 +1168,14 @@ migrate.codebase.description=Migrare i dati da codebasehq.com.
migrate.gitbucket.description=Migra i dati dalle istanze di GitBucket.
migrate.migrating_git=Migrazione dei dati Git
migrate.migrating_topics=Migrazione degli argomenti
-migrate.migrating_milestones=Migrazione delle pietre miliari
+migrate.migrating_milestones=Migrazione dei traguardi
migrate.migrating_labels=Migrazione delle etichette
migrate.migrating_releases=Migrazione dei rilasci
migrate.migrating_issues=Migrazione delle segnalazioni
migrate.migrating_pulls=Migrazione delle richieste di modifica
mirror_from=mirror da
-forked_from=forkato da
+forked_from=derivato da
generated_from=generato da
fork_from_self=Non puoi effettuare il fork del tuo stesso repository.
fork_guest_user=Accedi per effettuare il fork di questo repository.
@@ -1169,7 +1185,7 @@ unwatch=Non seguire più
watch=Segui
unstar=Togli il voto
star=Vota
-fork=Forka
+fork=Deriva
download_archive=Scarica progetto
no_desc=Nessuna descrizione
@@ -1223,6 +1239,7 @@ view_git_blame=Visualizza git incolpa
video_not_supported_in_browser=Il tuo browser non supporta le etichette "video" di HTML5.
audio_not_supported_in_browser=Il tuo browser non supporta le etichette "audio" di HTML5.
stored_lfs=Memorizzati con Git LFS
+stored_annex=Memorizzati con Git Annex
symbolic_link=Link Simbolico
commit_graph=Grafico dei commit
commit_graph.select=Seleziona rami
@@ -1241,6 +1258,7 @@ editor.upload_file=Carica file
editor.edit_file=Modifica file
editor.preview_changes=Anteprima modifiche
editor.cannot_edit_lfs_files=I file LFS non possono essere modificati nell'interfaccia web.
+editor.cannot_edit_annex_files=I file Annex non possono essere modificati nell'interfaccia web.
editor.cannot_edit_non_text_files=I file binari non possono essere modificati tramite interfaccia web.
editor.edit_this_file=Modifica file
editor.this_file_locked=Il file è bloccato
@@ -1338,9 +1356,9 @@ projects.column.color=Colore
projects.open=Apri
projects.close=Chiudi
-issues.desc=Organizza le segnalazioni di bug, attività e pietre miliari.
+issues.desc=Organizza le segnalazioni di bug, attività e traguardi.
issues.filter_assignees=Filtra assegnatario
-issues.filter_milestones=Filtra traguardo
+issues.filter_milestones=Filtra Traguardo
issues.filter_projects=Filtra Progetti
issues.filter_labels=Filtra etichetta
issues.filter_reviewers=Filtra revisore
@@ -1358,13 +1376,13 @@ issues.new.no_items=Nessun elemento
issues.new.milestone=Traguardo
issues.new.no_milestone=Nessuna pietra miliare
issues.new.clear_milestone=Milestone pulita
-issues.new.open_milestone=Apri pietra miliare
-issues.new.closed_milestone=Pietre miliari chiuse
+issues.new.open_milestone=Traguardi aperti
+issues.new.closed_milestone=Traguardi chiusi
issues.new.assignees=Assegnatari
issues.new.clear_assignees=Cancella assegnatari
issues.new.no_assignees=Nessun assegnatario
issues.new.no_reviewers=Nessun revisore
-issues.choose.get_started=Inizia
+issues.choose.get_started=Cominciare
issues.choose.open_external_link=Apri
issues.choose.blank=Default
issues.choose.blank_about=Crea un problema dal modello predefinito.
@@ -1742,29 +1760,29 @@ pulls.delete.text=Vuoi davvero eliminare questo problema? (Questo rimuoverà per
-milestones.new=Nuova pietra miliare
+milestones.new=Nuovo traguardo
milestones.closed=Chiuso %s
milestones.no_due_date=Nessuna data di scadenza
milestones.open=Apri
milestones.close=Chiudi
-milestones.completeness=%d%% Completato
-milestones.create=Crea pietra miliare
+milestones.completeness=%d%% Completato
+milestones.create=Crea traguardo
milestones.title=Titolo
milestones.desc=Descrizione
milestones.due_date=Scadenza (opzionale)
milestones.clear=Pulisci
milestones.invalid_due_date_format=Il formato della scadenza deve essere 'aaaa-mm-dd'.
-milestones.edit=Modifica pietra miliare
-milestones.edit_subheader=Le pietre miliari organizzano le issue e tengono conto del progresso.
+milestones.edit=Modifica traguardo
+milestones.edit_subheader=I traguardi permettono una migliore organizzazione dei problemi e ne tracciano il progresso.
milestones.cancel=Annulla
-milestones.modify=Aggiorna pietra miliare
-milestones.deletion=Elimina pietra miliare
-milestones.deletion_desc=Eliminare una pietra miliare la rimuove da tutte le relative issue. Continuare?
-milestones.deletion_success=La pietra miliare è stata eliminata.
-milestones.filter_sort.least_complete=Meno completato
-milestones.filter_sort.most_complete=Più completato
-milestones.filter_sort.most_issues=Maggior parte delle segnalazioni
-milestones.filter_sort.least_issues=Meno segnalazioni
+milestones.modify=Aggiorna traguardo
+milestones.deletion=Elimina traguardo
+milestones.deletion_desc=L'eliminazione di un traguardo lo rimuoverà da tutte le segnalazioni collegate ad esso. Continuare?
+milestones.deletion_success=Il traguardo è stato eliminato.
+milestones.filter_sort.least_complete=Completato di meno
+milestones.filter_sort.most_complete=Completato di più
+milestones.filter_sort.most_issues=Con più segnalazioni
+milestones.filter_sort.least_issues=Con meno segnalazioni
ext_wiki=Accesso al Wiki esterno
@@ -2046,7 +2064,7 @@ settings.event_create_desc=Ramo o etichetta creati.
settings.event_delete=Elimina
settings.event_delete_desc=Ramo o etichetta eliminati.
settings.event_fork=Fork
-settings.event_fork_desc=Repository forkato.
+settings.event_fork_desc=Repository derivato.
settings.event_wiki=Wiki
settings.event_release=Release
settings.event_release_desc=Release pubblicata, aggiornata o rimossa in una repository.
@@ -2239,8 +2257,8 @@ diff.git-notes=Note
diff.data_not_available=Differenze non disponibili
diff.options_button=Opzioni differenze
diff.show_diff_stats=Mostra statistiche
-diff.download_patch=Scarica il file toppa
-diff.download_diff=Scarica il file differenza
+diff.download_patch=Scarica file .patch
+diff.download_diff=Scarica file .diff
diff.show_split_view=Visualizzazione separata
diff.show_unified_view=Visualizzazione unificata
diff.whitespace_button=Spazi bianchi
@@ -2407,7 +2425,7 @@ commitstatus.failure = Errore
settings.units.overview = Panoramica
all_branches = Tutti i rami
projects.column.assigned_to = Assegnato a
-pulls.cmd_instruction_hint = `Visualizza istruzioni per la riga di comando.`
+pulls.cmd_instruction_hint = `Visualizza istruzioni per la riga di comando.`
settings.add_collaborator_blocked_them = Non si può aggiungere il collaboratore perché ha bloccato il proprietario del progetto.
branch.protected_deletion_failed = Il ramo "%s" è protetto. Non può essere eliminato.
branch.default_deletion_failed = Il ramo "%s" è il ramo predefinito. Non può essere eliminato.
@@ -2733,6 +2751,27 @@ settings.matrix.room_id_helper = L'ID della Stanza può essere ricavato dal web
settings.graphql_url = URL GraphQL
settings.sourcehut_builds.access_token_helper = Token di accesso con grant JOBS:RW. Genera un token builds.sr.ht o un token builds.sr.ht con accesso ai segreti su meta.sr.ht.
settings.matrix.access_token_helper = È consigliata l'impostazione di un account Matrix dedicato per questa funzione. Il token di accesso può essere prelevato dal web client Element (in una pagina privata/incognito) > Menu utente (in alto a sinistra) > Tutte le impostazioni > Aiuto e informazioni > Avanzato > Token di accesso (sotto all'URL del Homeserver). Chiudi la pagina privata/incognito (La disconnessione invaliderebbe il token).
+issues.author.tooltip.issue = Questo utente è l'autore di questa segnalazione.
+form.string_too_long = La stringa data è più lunga di %d caratteri.
+project = Progetti
+issues.edit.already_changed = Impossibile salvare le modifiche al problema. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche
+subscribe.pull.guest.tooltip = Accedere per sottoscrivere questa richiesta di pull.
+subscribe.issue.guest.tooltip = Accedere per sottoscrivere questo problema.
+n_release_one = rilascio %s
+n_release_few = rilasci %s
+issues.author.tooltip.pr = Questo utente è l'autore di questa richiesta di pull.
+release.hide_archive_links = Nascondi automaticamente gli archivi generati
+settings.federation_settings = Impostazioni di federazione
+settings.federation_apapiurl = URL della federazione di questo repository. Copiarlo e incollarlo nelle Impostazioni della federazione di un altro repository come URL di un repository successivo.
+release.hide_archive_links_helper = Nascondi gli archivi del codice sorgente generati automaticamente per questa versione. Ad esempio, se stai caricando i tuoi.
+comments.edit.already_changed = Impossibile salvare le modifiche al commento. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche
+settings.federation_following_repos = URL dei repository successivi. Separati da ";", senza spazi.
+settings.federation_not_enabled = La federazione non è abilitata nella tua istanza.
+settings.transfer.button = Trasferisci la proprietà
+settings.transfer.modal.title = Trasferisci la proprietà
+pulls.edit.already_changed = Impossibile salvare le modifiche alla richiesta di pull. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche
+wiki.search = Cerca nel wiki
+wiki.no_search_results = Nessun risultato
[graphs]
contributors.what = contribuzioni
@@ -2867,6 +2906,7 @@ follow_blocked_user = Non puoi seguire questa organizzazione perché ti ha blocc
form.name_reserved = Il nome di organizzazione "%s" è riservato.
settings.email = Email di contatto
settings.visibility.limited = Limitato (visibile solo agli utenti autenticati)
+open_dashboard = Apri pannello di controllo
[admin]
dashboard=Pannello di Controllo
@@ -3310,7 +3350,7 @@ monitor.start=Orario Avvio
monitor.execute_time=Tempo di Esecuzione
monitor.last_execution_result=Risultato
monitor.process.cancel=Annulla processo
-monitor.process.cancel_desc=L'annullamento di un processo potrebbe causare la perdita di dati
+monitor.process.cancel_desc=Annullare un processo potrebbe causare una perdita di dati
monitor.process.cancel_notices=Annulla: %s?
monitor.process.children=Figli
@@ -3408,19 +3448,25 @@ auths.tip.gitlab_new = Registra una nuova applicazione su https://gitlab.com/-/p
config_summary = Riepilogo
config.open_with_editor_app_help = L'editor delle opzioni "Apri con" per il menu di clone. Se lasciato vuoto, verranno usati i default. Espandi per vedere i default.
config_settings = Impostazioni
+config.cache_test = Controllo cache
+config.cache_test_failed = Fallito il controllo della cache: %v.
+config.cache_test_succeeded = Successo nel controllo della cache, ottenuta una risposta in %s.
+config.cache_test_slow = Successo nel controllo della cache, ma la risposta è lenta: %s.
+config.app_slogan = Slogan dell'istanza
+auths.default_domain_name = Nome di dominio predefinito utilizzato per l'indirizzo e-mail
[action]
create_repo=ha creato il repository %s
rename_repo=repository rinominato da %[1]s a [3]s
-create_issue=`ha aperto il problema %[3]s#%[2]s`
+create_issue=`ha aperto la segnalazione %[3]s#%[2]s`
close_issue=`ha chiuso il problema %[3]s#%[2]s`
reopen_issue=`ha riaperto il problema %[3]s#%[2]s`
create_pull_request=`ha creato la pull request %[3]s#%[2]s`
close_pull_request=`ha chiuso la pull request %[3]s#%[2]s`
reopen_pull_request=`ha riaperto la pull request %[3]s#%[2]s`
-comment_issue=`ha commentato sul problema %[3]s#%[2]s`
-comment_pull=`ha commentato su pull request %[3]s#%[2]s`
+comment_issue=`ha commentato la segnalazione %[3]s#%[2]s`
+comment_pull=`ha commentato la richiesta di modifica %[3]s#%[2]s`
merge_pull_request=`ha unito il pull request %[3]s#%[2]s`
transfer_repo=repository %s trasferito in %s
push_tag=ha inviato il tag %[3]s su %[4]s
@@ -3434,13 +3480,13 @@ mirror_sync_create=ha sincronizzato un nuovo riferimento %[3]s
mirror_sync_delete=riferimento sincronizzato ed eliminato %[2]s a %[3]s dal mirror
approve_pull_request=`ha approvato %[3]s#%[2]s`
reject_pull_request=`ha suggerito modifiche per %[3]s#%[2]s`
-publish_release=`ha rilasciato "%[4]s" su %[3]s`
+publish_release=`ha rilasciato %[4]s su %[3]s`
review_dismissed=`respinta la recensione da %[4]s per %[3]s#%[2]s`
review_dismissed_reason=Motivo:
create_branch=ha creato il ramo %[3]s in %[4]s
starred_repo=ha salvato come preferito %[2]s
watched_repo=ha iniziato a guardare %[2]s
-commit_repo = immesso a %[3]s a %[4]s
+commit_repo = ha immesso nel ramo %[3]s presso %[4]s
auto_merge_pull_request = `richiesta di modifica %[3]s#%[2]s fusa automaticamente`
[tool]
@@ -3651,6 +3697,7 @@ owner.settings.chef.keypair.description = Per autenticarsi al registro Chef è n
owner.settings.cargo.initialize.success = L'indice di Cargo è stato creato correttamente.
owner.settings.cargo.rebuild.no_index = Impossibile ricostruire, nessun indice è inizializzato.
owner.settings.cargo.rebuild.description = La ricostruzione può essere utile se l'indice non è sincronizzato con i pacchetti Cargo conservati.
+npm.dependencies.bundle = Dipendenze raggruppate
[secrets]
secrets = Segreti
@@ -3757,6 +3804,14 @@ runs.no_workflows.quick_start = Non sai come iniziare con le Forgejo Actions? Ve
runners.delete_runner_notice = Se un'attività è in esecuzione su questo esecutore sarà terminata ed etichettata fallito. Potrebbe rompere flussi di lavoro di costruzione.
runners.task_list = Attività recenti su questo esecutore
runs.no_job_without_needs = Il flusso di lavoro deve contenere almeno un incarico senza dipendenze.
+workflow.dispatch.trigger_found = Questo flusso di lavoro ha un rilevatore di eventi workflow_dispatch.
+workflow.dispatch.run = Esegui flusso di lavoro
+workflow.dispatch.success = L'esecuzione del flusso di lavoro è stata richiesta con successo.
+workflow.dispatch.input_required = Richiedi valore per l'ingresso "%s".
+workflow.dispatch.invalid_input_type = Tipo ingresso "%s" non valido.
+workflow.dispatch.warn_input_limit = Visualizzati solo i primi %d ingressi.
+runs.no_job = Il flusso di lavoro deve contenere almeno un incarico
+workflow.dispatch.use_from = Usa flusso di lavoro da
@@ -3798,6 +3853,10 @@ match_tooltip = Includi solo risultati che corrispondono precisamente al termine
fuzzy_tooltip = Includi anche risultati che corrispondono approssimativamente al termine di ricerca
user_kind = Cerca utenti...
repo_kind = Cerca repository...
+exact_tooltip = Includi solo i risultati che corrispondono esattamente al termine di ricerca
+issue_kind = Cerca segnalazioni...
+pull_kind = Ricerca pull...
+exact = Esatto
[munits.data]
gib = GiB
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index ac0e855e06..a1096bcdbb 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -477,7 +477,7 @@ activate_email=メール アドレスを確認します
activate_email.title=%s さん、メールアドレス確認をお願いします
activate_email.text=あなたのメールアドレスを確認するため、%s以内に次のリンクをクリックしてください:
-register_notify=Forgejoへようこそ
+register_notify_prev9=Forgejoへようこそ
register_notify.title=%[1]s さん、%[2]s にようこそ
register_notify.text_1=これは %s への登録確認メールです!
register_notify.text_2=あなたはユーザー名 %s でログインできるようになりました。
@@ -1266,6 +1266,7 @@ view_git_blame=Git Blameを表示
video_not_supported_in_browser=このブラウザはHTML5のvideoタグをサポートしていません。
audio_not_supported_in_browser=このブラウザーはHTML5のaudioタグをサポートしていません。
stored_lfs=Git LFSで保管されています
+stored_annex=Git Annexで保管されています
symbolic_link=シンボリック リンク
executable_file=実行ファイル
commit_graph=コミットグラフ
@@ -1289,6 +1290,7 @@ editor.upload_file=ファイルをアップロード
editor.edit_file=ファイルを編集
editor.preview_changes=変更をプレビュー
editor.cannot_edit_lfs_files=LFSのファイルはWebインターフェースで編集できません。
+editor.cannot_edit_annex_files=AnnexのファイルはWebインターフェースで編集できません。
editor.cannot_edit_non_text_files=バイナリファイルはWebインターフェースで編集できません。
editor.edit_this_file=ファイルを編集
editor.this_file_locked=ファイルはロックされています
@@ -1883,7 +1885,7 @@ pulls.outdated_with_base_branch=このブランチはベースブランチに対
pulls.close=プルリクエストをクローズ
pulls.closed_at=`がプルリクエストをクローズ %[2]s`
pulls.reopened_at=`がプルリクエストを再オープン %[2]s`
-pulls.cmd_instruction_hint=`コマンドラインの手順を表示します。`
+pulls.cmd_instruction_hint=`コマンドラインの手順 を表示します。`
pulls.cmd_instruction_checkout_title=チェックアウト
pulls.cmd_instruction_checkout_desc=プロジェクトリポジトリから新しいブランチをチェックアウトし、変更内容をテストします。
pulls.cmd_instruction_merge_title=マージ
@@ -2668,7 +2670,7 @@ issues.blocked_by_user = あなたはこのリポジトリの所有者からブ
pulls.nothing_to_compare_have_tag = 選択されたブランチまたはタグは同一です。
pulls.blocked_by_user = あなたはこのリポジトリの所有者からブロックされているため、プルリクエストを作成できません。
rss.must_be_on_branch = RSSフィードを見るためには、ブランチを閲覧する必要があります。
-migrate.forgejo.description = codeberge.orgまたは他のインスタンスからデータを移行する。
+migrate.forgejo.description = codeberg.orgまたは他のインスタンスからデータを移行する。
commits.browse_further = もっと見る
issues.comment.blocked_by_user = あなたはこのリポジトリの所有者か、Issueの投稿者からブロックされているため、このIssueにコメントできません。
pulls.reopen_failed.head_branch = ブランチがもう存在しないため、このプルリクエストはreopenできません。
diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini
index 7c8cd2e960..081169df9b 100644
--- a/options/locale/locale_ko-KR.ini
+++ b/options/locale/locale_ko-KR.ini
@@ -43,7 +43,7 @@ admin_panel=사이트 관리
account_settings=계정 설정
settings=설정
your_profile=프로필
-your_starred=즐겨찾기
+your_starred=좋아한 저장소
your_settings=설정
all=전체
@@ -158,6 +158,7 @@ filter.private = 비공개
filter.not_template = 템플릿이 아님
view = 보기
never = 안함
+test = 테스트
[aria]
navbar = 내비게이션 바
@@ -180,10 +181,15 @@ buttons.heading.tooltip = 헤딩 추가
buttons.bold.tooltip = 두꺼운 텍스트 추가
buttons.code.tooltip = 코드 추가
buttons.link.tooltip = 링크 추가
+buttons.quote.tooltip = 인용구 추가
[filter]
+string.desc = 하 - 가
+string.asc = 가 - 하
[error]
+network_error = 네트워크 오류
+server_internal = 내부 서버 오류
[startpage]
app_desc=편리한 설치형 Git 서비스
@@ -215,7 +221,7 @@ err_admin_name_is_invalid=관리자 사용자 이름이 올바르지 않습니
general_title=기본설정
app_name=인스턴스 제목
-app_name_helper=회사이름을 넣으세요.
+app_name_helper=인스턴스 이름을 입력하세요. 입력한 내용은 모든 페이지에 표시됩니다.
repo_path=저장소 최상위 경로
repo_path_helper=Git 원격 저장소는 이 디렉터리에 저장 됩니다.
lfs_path=Git LFS 루트 경로
@@ -242,16 +248,16 @@ register_confirm=가입시 이메일 확인 필수
mail_notify=이메일 알림 켜기
server_service_title=서버 및 기타 서비스 설정
offline_mode=로컬 모드 켜기
-offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬로 제공하십시오.
+offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬에서 제공합니다.
disable_gravatar=Gravatar 사용안함
disable_gravatar.description=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다.
federated_avatar_lookup=탈중앙화 아바타 사용
federated_avatar_lookup.description=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다.
disable_registration=사용자 등록 비활성화
-disable_registration.description=사용자가 직접 등록할 수 없게 합니다. 관리자만이 추가할 수 있습니다.
-allow_only_external_registration.description=외부 서비스를 통한 등록을 허용
+disable_registration.description=인스턴스 관리자만이 새 사용자 계정을 추가할 수 있게 됩니다. 공개 인스턴스를 제공할 예정이고 많은 양의 스팸 계정을 감당할 준비가 되어 있지 않다면 사용자 등록을 비활성화 할 것을 강력히 권고합니다.
+allow_only_external_registration.description=새 계정을 등록하려는 사용자는 설정된 외부 서비스를 이용해야만 새 계정을 등록할 수 있습니다.
openid_signin=OpenID 로그인 사용
-openid_signin.description=OpenID 를 이용한 로그인을 허용합니다.
+openid_signin.description=OpenID를 이용한 로그인을 허용합니다.
openid_signup=OpenID 가입 허용
openid_signup.description=OpenID를 통한 가입을 허용합니다.
enable_captcha.description=사용자 등록시 캡차를 요구합니다.
@@ -279,6 +285,12 @@ default_enable_timetracking=시간 추적 사용을 기본값으로 설정
default_enable_timetracking.description=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다.
no_reply_address=가려진 이메일 도메인
no_reply_address_helper=가려진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 가려잔 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 처리 됩니다.
+db_schema_helper = 데이터베이스 기본값 ("공개")를 사용하려면 빈 칸으로 두세요.
+require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 또는 TiDB (MySQL 프로토콜) 이 설치되어 있어야 합니다.
+domain = 서버 도메인
+smtp_from_invalid = "이메일 발신인" 주소가 유효하지 않습니다
+enable_captcha = 등록 시 CAPTCHA 활성화
+allow_only_external_registration = 외부 서비스를 통한 등록만 허용
[home]
uname_holder=사용자 이름 또는 이메일 주소
@@ -307,6 +319,8 @@ repo_no_results=일치하는 레포지토리가 없습니다.
user_no_results=일치하는 사용자가 없습니다.
org_no_results=일치하는 조직이 없습니다.
code_no_results=검색어와 일치하는 소스코드가 없습니다.
+stars_one = %d 좋아요
+stars_few = %d 좋아요
[auth]
create_new_account=계정 등록
@@ -365,12 +379,23 @@ activate_account=계정을 활성화하세요
activate_email=이메일 주소 확인
-register_notify=Forgejo에 오신것을 환영합니다
+register_notify_prev9=Forgejo에 오신것을 환영합니다
reset_password=계정 복구
register_success=등록 완료
issue.action.close = @%[1]s님이 #%[2]d를 닫았습니다.
+release.new.text = @%[1]s님이 %[2]s를 %[3]s에 출시함
+issue.action.push_n = @%[1]s님이 %[3]d개의 커밋을 %[2]s에 푸시함
+issue.action.reopen = @%[1]s님이 #%[2]d를 다시 열었습니다.
+issue.action.approve = @%[1]s님이 이 풀 리퀘스트를 승인했습니다.
+issue.action.review = @%[1]s님이 이 풀 리퀘스트에 커밋했습니다.
+issue.action.ready_for_review = @%[1]s님이 이 풀 리퀘스트를 검토하기 적합하다 표시했습니다.
+issue.action.push_1 = @%[1]s님이 %[3]d개의 커밋을 %[2]s에 푸시함
+issue.action.merge = @%[1]s님이 #%[2]d를 %[3]s에 병합했습니다.
+issue.action.review_dismissed = @%[1]s님이 이 풀 리퀘스트에 대한 %[2]s의 마지막 검토를 거부했습니다.
+issue.action.reject = @%[1]s님이 이 풀 리퀘스트에 수정을 요청했습니다.
+issue.action.new = @%[1]s님이 #%[2]d를 만들었습니다.
@@ -452,7 +477,7 @@ change_avatar=아바타 변경…
repositories=저장소
activity=공개 활동
followers_few=%d 팔로워
-starred=관심있는 저장소
+starred=좋아하는 저장소
overview=개요
following_few=%d 팔로우 중
follow=추적하기
@@ -739,6 +764,7 @@ file_too_large=보여주기에는 파일이 너무 큽니다.
video_not_supported_in_browser=당신의 브라우저가 HTML5의 "video" 태그를 지원하지 않습니다.
audio_not_supported_in_browser=당신의 브라우저가 HTML5의 "audio" 태그를 지원하지 않습니다.
stored_lfs=Git LFS에 저장되어 있습니다
+stored_annex=Git Annex에 저장되어 있습니다
commit_graph=커밋 그래프
editor.new_file=새 파일
@@ -848,7 +874,7 @@ issues.action_milestone=마일스톤
issues.action_milestone_no_select=마일스톤 없음
issues.action_assignee=담당자
issues.action_assignee_no_select=담당자 없음
-issues.opened_by= %[3]s님이 %[1]s에 오픈
+issues.opened_by= %[3]s님이 %[1]s 오픈
issues.previous=이전
issues.next=다음
issues.open_title=오픈
@@ -911,8 +937,8 @@ issues.due_date_form_add=마감일 추가
issues.due_date_form_edit=편집
issues.due_date_form_remove=삭제
issues.due_date_not_set=마감일이 설정되지 않았습니다.
-issues.due_date_added=마감일 %s 를 추가 %s
-issues.due_date_remove=%s %s 마감일이 삭제됨
+issues.due_date_added=님이 마감일 %s을 %s 추가함
+issues.due_date_remove=님이 마감일 %s를 %s 삭제함
issues.due_date_overdue="기한 초과"
issues.due_date_invalid=기한이 올바르지 않거나 범위를 벗어났습니다. "yyyy-mm-dd"형식을 사용해주십시오.
issues.dependency.title=전제조건
@@ -932,7 +958,7 @@ issues.dependency.add_error_dep_exists=전제조건이 이미 존재합니다.
issues.dependency.add_error_dep_not_same_repo=두 이슈는 같은 저장소 안에 있어야 합니다.
issues.review.self.approval=자신의 풀 리퀘스트를 승인할 수 없습니다.
issues.review.self.rejection=자신의 풀 리퀘스트에 대한 변경을 요청할 수 없습니다.
-issues.review.approve="이 변경사항을 승인하였습니다. %s"
+issues.review.approve=이 변경사항을 승인함 %s
issues.review.comment=검토됨 %s
issues.review.pending=보류
issues.review.review=검토
@@ -948,19 +974,19 @@ pulls.compare_compare=다음으로부터 풀
pulls.filter_branch=Filter Branch
pulls.no_results=결과를 찾을 수 없습니다.
pulls.create=풀 리퀘스트 생성
-pulls.title_desc_few=%[2]s 에서 %[3]s 로 %[1]d개의 커밋들을 머지하려 합니다
-pulls.merged_title_desc_few=%[2]s 에서 %[3]s 로 %[1]d commits 를 머지했습니다 %[4]s
+pulls.title_desc_few=%[2]s 에서 %[3]s 로 %[1]d개의 커밋들을 병합하려함
+pulls.merged_title_desc_few=님이 %[2]s 에서 %[3]s 로 %[1]d 커밋을 %[4]s 병합함
pulls.tab_conversation=대화
pulls.tab_commits=커밋
-pulls.tab_files=파일 변경됨
-pulls.reopen_to_merge=머지 작업을 수행하려면 이 풀 리퀘스트를 다시 열어주세요.
-pulls.merged=병합
-pulls.can_auto_merge_desc=이 풀리퀘스트는 자동적으로 머지될 수 있습니다.
-pulls.cannot_auto_merge_helper=충돌을 해결하려면 수동으로 머지하십시오.
+pulls.tab_files=파일 변경
+pulls.reopen_to_merge=병합을 수행하려면 이 풀 리퀘스트를 다시 열어주세요.
+pulls.merged=병합됨
+pulls.can_auto_merge_desc=이 풀리퀘스트는 자동적으로 병합될 수 있습니다.
+pulls.cannot_auto_merge_helper=충돌을 해결하려면 수동으로 병합하십시오.
-pulls.no_merge_desc=모든 저장소 머지 옵션이 비활성화 되어있기 때문에 이 풀 리퀘스트를 머지할 수 없습니다.
+pulls.no_merge_desc=모든 저장소 병합 옵션이 비활성화 되어있기 때문에 이 풀 리퀘스트를 병합할 수 없습니다.
-pulls.invalid_merge_option=이 풀 리퀘스트에서 설정한 머지 옵션을 사용하실 수 없습니다.
+pulls.invalid_merge_option=이 풀 리퀘스트에서 설정한 병합 옵션을 사용하실 수 없습니다.
@@ -1028,7 +1054,7 @@ activity.title.user_1=%d 사용자
activity.title.user_n=%d 사용자
activity.title.prs_1=풀 리퀘스트 %d개
activity.title.prs_n=풀 리퀘스트 %d개
-activity.title.prs_merged_by=%s 가 %s 로부터 머지 되었음
+activity.title.prs_merged_by=%s 가 %s 로부터 병합되었음
activity.title.prs_opened_by=%s 가 %s 로 부터 제안됨
activity.merged_prs_label=병합됨
activity.opened_prs_label=제안중
@@ -1194,7 +1220,7 @@ settings.protect_disable_push=푸시 끄기
settings.protect_enable_push=푸시 켜기
settings.protect_whitelist_search_users=사용자 찾기...
settings.protect_whitelist_search_teams=팀 찾기...
-settings.protect_merge_whitelist_committers=머지 화이트리스트 활성화
+settings.protect_merge_whitelist_committers=병합 화이트리스트 활성화
settings.protect_required_approvals=필요한 승인:
settings.protect_approvals_whitelist_users=화이트리스트된 리뷰어:
settings.add_protected_branch=보호 활성화
@@ -1297,7 +1323,7 @@ pulls.blocked_by_official_review_requests = 이 풀 리퀘스트는 공식 검
watch_guest_user = 이 저장소를 주시하려면 로그인 해야합니다.
issues.closed_by_fake = %[2]s님이 %[1]s에 닫음
issues.new.closed_projects = 닫힌 프로젝트
-pulls.merged_by_fake = %[2]s님이 %[1]s에 머지함
+pulls.merged_by_fake = %[2]s님이 %[1]s 병합함
issues.closed_by = %[3]s님이 %[1]s에 닫음
issues.closed_at = `%[2]s`에 이 이슈를 닫음
issues.filter_milestone_closed = 닫힌 마일스톤
@@ -1321,6 +1347,25 @@ issues.dependency.no_permission_1 = %d개의 전제조건을 읽을 권한이
issues.dependency.no_permission.can_remove = 이 전제조건을 읽을 권한이 없지만 지울 수 있음
issues.dependency.removed_dependency = `님이 %s 전제조건 삭제`
issues.dependency.pr_close_blocked = 병합하기 전에 이 풀 리퀘스트을 제한하는 모든 이슈를 종료해야 합니다.
+stars = 좋아요
+stars_remove_warning = 이 작업은 이 저장소에 대한 모든 좋아요를 제거할것입니다.
+star_guest_user = 로그인하여 이 저장소에 좋아요 하세요.
+issues.author.tooltip.issue = 이 사용자는 이 이슈의 작성자 입니다.
+issues.author.tooltip.pr = 이 사용자는 이 풀 리퀘스트의 작성자 입니다.
+activity.git_stats_author_1 = %d명의 작성자
+issues.filter_poster_no_select = 모든 작성자
+pulls.blocked_by_user = 당신은 이 저장소의 소유자에게 차단당했기 떄문에 풀 리퀘스트를 만들 수 없습니다.
+commits.search.tooltip = 키워드 앞에 접두사 "author:", "committer:", "after:", "before:"을 사용할 수 있습니다 (예: "revert author:Alice before:2019-01-13").
+issues.filter_poster = 작성자
+issues.author = 작성자
+issues.role.owner_helper = 이 사용자는 이 저장소의 소유자 입니다.
+activity.git_stats_author_n = %d명의 작성자
+diff.review.self_reject = 풀 리퀘스트 작성자는 자신의 풀 리퀘스트에 수정을 요청할 수 없음
+diff.review.self_approve = 풀 리퀘스트 작성자는 자신의 풀 리퀘스트를 승인할 수 없음
+issues.blocked_by_user = 당신은 이 저장소의 소유자에게 차단당했기 떄문에 이슈를 만들 수 없습니다.
+issues.comment.blocked_by_user = 당신은 이 저장소의 소유자 혹은 이 이슈의 작성자 에게 차단당했기 떄문에 이슈에 댓글을 달 수 없습니다.
+author_search_tooltip = 최대 30명의 사용자를 표시함
+pulls.merged_title_desc_one = 님이 %[2]s 에서 %[3]s 로 %[1]d 커밋을 %[4]s 병합함
@@ -1695,6 +1740,7 @@ rename_repo=저장소 이름을 %[1]s에서에서
transfer_repo=저장소가 %s에서 %s로 이동됨
compare_commits=%d 커밋들 비교
watched_repo = %[2]s에대한 주시를 시작함
+starred_repo = %[2]s를 좋아함
[tool]
now=현재
@@ -1754,6 +1800,7 @@ nuget.dependency.framework = 타겟 프레임워크
maven.download = 종속성을 다운로드하려면 명령줄을 통해 실행하세요:
dependency.id = ID
dependency.version = 버전
+details.author = 작성자
[secrets]
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index 460b0d351e..447de6a314 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -439,7 +439,7 @@ activate_email=Apstipriniet savu e-pasta adresi
activate_email.title=%s, apstipriniet savu e-pasta adresi
activate_email.text=Nospiediet uz saites, lai apstiprinātu savu e-pasta adresi lapā %s:
-register_notify=Laipni lūdzam Forgejo
+register_notify_prev9=Laipni lūdzam Forgejo
register_notify.title=%[1]s, esat reģistrējies %[2]s
register_notify.text_1=šis ir reģistrācijas apstiprinājuma e-pasts lapai %s!
register_notify.text_2=Tagad varat autorizēties ar lietotāja vārdu: %s.
@@ -1184,6 +1184,7 @@ view_git_blame=Aplūkot Git vainīgos
video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video.
audio_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 audio.
stored_lfs=Saglabāts Git LFS
+stored_annex=Saglabāts Git Annex
symbolic_link=Simboliska saite
executable_file=Izpildāmais fails
commit_graph=Revīziju grafs
@@ -1207,6 +1208,7 @@ editor.upload_file=Augšupielādēt failu
editor.edit_file=Labot failu
editor.preview_changes=Priekšskatīt izmaiņas
editor.cannot_edit_lfs_files=LFS failus nevar labot no tīmekļa saskarnes.
+editor.cannot_edit_annex_files=Annex failus nevar labot no tīmekļa saskarnes.
editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes.
editor.edit_this_file=Labot failu
editor.this_file_locked=Fails ir bloķēts
@@ -1801,7 +1803,7 @@ pulls.outdated_with_base_branch=Atzars ir novecojis salīdzinot ar bāzes atzaru
pulls.close=Aizvērt izmaiņu pieprasījumu
pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %[2]s`
pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %[2]s`
-pulls.cmd_instruction_hint=`Apskatīt komandrindas izmantošanas norādes.`
+pulls.cmd_instruction_hint=`Apskatīt komandrindas izmantošanas norādes.`
pulls.cmd_instruction_checkout_title=Paņemt
pulls.cmd_instruction_checkout_desc=Projekta repozitorijā jāizveido jauns atzars un jāpārbauda izmaiņas.
pulls.cmd_instruction_merge_title=Sapludināt
diff --git a/options/locale/locale_ml-IN.ini b/options/locale/locale_ml-IN.ini
new file mode 100644
index 0000000000..a15fd5a9dc
--- /dev/null
+++ b/options/locale/locale_ml-IN.ini
@@ -0,0 +1,805 @@
+[common]
+home=പൂമുഖം
+dashboard=ഡാഷ്ബോർഡ്
+explore=കണ്ടെത്തൂ
+help=സഹായം
+sign_in=പ്രവേശിക്കുക
+sign_in_with=ഉപയോഗിച്ചു് പ്രവേശിയ്ക്കുക
+sign_out=പുറത്തുകടക്കുക
+sign_up=രജിസ്റ്റർ
+link_account=അക്കൌണ്ട് ബന്ധിപ്പിയ്ക്കുക
+register=രജിസ്റ്റർ
+version=പതിപ്പ്
+page=പേജ്
+template=ടെംപ്ലേറ്റ്
+language=ഭാഷ
+notifications=അറിയിപ്പുകൾ
+create_new=സൃഷ്ടിക്കുക…
+user_profile_and_more=പ്രൊഫൈലും ക്രമീകരണങ്ങളും…
+signed_in_as=ഇയാളായി പ്രവേശിയ്ക്കുക
+enable_javascript=ഈ വെബ്സൈറ്റ് ജാവാസ്ക്രിപ്റ്റിനൊപ്പം മികച്ച രീതിയിൽ പ്രവർത്തിക്കുന്നു.
+
+username=ഉപയോക്ത്രു നാമം
+email=ഈമെയില് വിലാസം
+password=രഹസ്യവാക്കു്
+re_type=രഹസ്യവാക്കു് വീണ്ടും നല്കുക
+captcha=ക്യാപ്ച
+twofa=ഇരട്ട ഘടക പ്രാമാണീകരണം
+twofa_scratch=ഇരട്ട ഫാക്ടർ സ്ക്രാച്ച് കോഡ്
+passcode=രഹസ്യ കോഡ്
+
+
+repository=കലവറ
+organization=സംഘടന
+mirror=മിറര്
+new_repo=പുതിയ കലവറ
+new_migrate=പുതിയ കുടിയേറ്റിപ്പാര്പ്പിക്കല്
+new_mirror=പുതിയ മിറര്
+new_fork=കലവറയുടെ പുതിയ ശിഖരം
+new_org=പുതിയ സംഘടന
+manage_org=സംഘടനകളെ നിയന്ത്രിക്കുക
+admin_panel=സൈറ്റിന്റെ കാര്യനിര്വ്വാഹണം
+account_settings=അക്കൌണ്ട് ക്രമീകരണങള്
+settings=ക്രമീകരണങ്ങള്
+your_profile=പ്രൊഫൈൽ
+your_starred=നക്ഷത്ര ചിഹ്നമിട്ടവ
+your_settings=ക്രമീകരണങ്ങള്
+
+all=എല്ലാം
+sources=ഉറവിടങ്ങൾ
+mirrors=മിററുകള്
+collaborative=സഹകരിക്കുന്ന
+forks=ശാഖകള്
+
+activities=പ്രവര്ത്തനങ്ങള്
+pull_requests=ലയന അഭ്യർത്ഥനകൾ
+issues=പ്രശ്നങ്ങൾ
+
+cancel=റദ്ദാക്കുക
+
+
+write=എഴുതുക
+preview=തിരനോട്ടം
+loading=ലഭ്യമാക്കുന്നു…
+
+
+
+
+
+[filter]
+
+[error]
+
+[startpage]
+
+[install]
+install=സന്നിവേശിപ്പിയ്ക്കുക
+title=പ്രാരംഭ ക്രമീകരണങ്ങള്
+docker_helper=ഡോക്കറിനുള്ളിലാണ് ഗിറ്റീ പ്രവര്ത്തിപ്പിയ്ക്കുന്നതെങ്കില്, മാറ്റങ്ങള് വരുത്തുന്നതിനു മുമ്പു് ദയവായി ഡോക്യുമെന്റേഷൻ വായിയ്ക്കുക.
+db_title=ഡാറ്റാബേസ് ക്രമീകരണങ്ങൾ
+db_type=ഡാറ്റാബേസിന്റെ തരം
+host=ഹോസ്റ്റ്
+user=ഉപയോക്ത്രു നാമം
+password=രഹസ്യവാക്കു്
+db_name=ഡാറ്റാബേസിന്റെ പേര്
+db_helper=MySQL ഉപയോക്താക്കൾക്കുള്ള കുറിപ്പ്: ദയവായി InnoDB സ്റ്റോറേജ് എഞ്ചിൻ ഉപയോഗിക്കുക. നിങ്ങൾ "utf8mb4" ഉപയോഗിക്കുകയാണെങ്കിൽ, InnoDB പതിപ്പ് 5.6 നേക്കാൾ വലുതായിരിക്കണം.
+ssl_mode=SSL
+charset=ക്യാര്സെറ്റ്
+path=പാത
+sqlite_helper=SQLite3 ഡാറ്റാബേസിന്റെ ഫയല് പാത്ത്. നിങ്ങൾ ഗിറ്റീയെ ഒരു സേവനമായി പ്രവർത്തിപ്പിക്കുകയാണെങ്കിൽ സമ്പൂര്ണ്ണ ഫയല് പാത നൽകുക.
+err_empty_db_path=SQLite3 ഡാറ്റാബേസ് പാത്ത് ശൂന്യമായിരിക്കരുത്.
+no_admin_and_disable_registration=ഒരു അഡ്മിനിസ്ട്രേറ്റർ അക്കൌണ്ട് സൃഷ്ടിക്കാതെ നിങ്ങൾക്ക് ഉപയോക്തൃ സ്വയം രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കാൻ കഴിയില്ല.
+err_empty_admin_password=അഡ്മിനിസ്ട്രേറ്ററുടെ രഹസ്യവാക്കു് ശൂന്യമായിരിക്കരുത്.
+err_empty_admin_email=അഡ്മിനിസ്ട്രേറ്ററുടെ ഇമെയില് വിലാസം ശൂന്യമായിരിക്കരുത്.
+err_admin_name_is_reserved=അഡ്മിനിസ്ട്രേറ്റര് ഉപയോക്തൃനാമം അസാധുവാണ്, ഉപയോക്തൃനാമം റിസര്വ്വ് ചെയ്തതാണ്
+err_admin_name_is_invalid=അഡ്മിനിസ്ട്രേറ്റർ ഉപയോക്തൃനാമം അസാധുവാണ്
+
+general_title=പൊതുവായ ക്രമീകരണങ്ങൾ
+app_name=സൈറ്റ് ശീർഷകം
+app_name_helper=നിങ്ങളുടെ കമ്പനിയുടെ പേര് ഇവിടെ നൽകാം.
+repo_path=സംഭരണിയുടെ റൂട്ട് പാത്ത്
+repo_path_helper=വിദൂര ഗിറ്റു് സംഭരണികള് ഈ ഡയറക്ടറിയിലേക്ക് സംരക്ഷിക്കും.
+lfs_path=Git LFS റൂട്ട് പാത്ത്
+lfs_path_helper=Git LFS ട്രാക്കുചെയ്ത ഫയലുകൾ ഈ ഡയറക്ടറിയിൽ സൂക്ഷിക്കും. പ്രവർത്തനരഹിതമാക്കാൻ ഈ കളം ശൂന്യമായി വിടുക.
+run_user=ഉപയോക്താവായി പ്രവര്ത്തിപ്പിക്കുക
+run_user_helper=ഗിറ്റീ പ്രവർത്തിക്കുന്ന ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ ഉപയോക്തൃനാമം നല്കുക. ഈ ഉപയോക്താവിന് സംഭരണിയുടെ റൂട്ട് പാത്തിലേക്ക് പ്രവേശനം ഉണ്ടായിരിക്കണം.
+ssh_port=SSH സെർവർ പോര്ട്ട്
+ssh_port_helper=നിങ്ങളുടെ SSH സെർവർ ശ്രവിക്കുന്ന പോർട്ട് നമ്പർ നല്കുക. പ്രവർത്തനരഹിതമാക്കാൻ കളം ശൂന്യമായി വിടുക.
+http_port=ഗിറ്റീ എച്ച്ടിടിപി ശ്രവിയ്ക്കുന്ന പോർട്ട്
+http_port_helper=ഗിറ്റീ വെബ് സെർവർ ശ്രവിയ്ക്കുന്ന പോർട്ട് നമ്പർ.
+app_url=ഗിറ്റീയുടെ അടിസ്ഥാന വിലാസം
+app_url_helper=എച്ച്ടിടിപി(എസ്) ക്ലോണുകള്ക്കും ഇമെയിൽ അറിയിപ്പുകൾക്കുമായുള്ള അടിസ്ഥാന വിലാസം.
+log_root_path=ലോഗ് പാത്ത്
+log_root_path_helper=ലോഗ് ഫയലുകൾ ഈ ഡയറക്ടറിയിലേക്ക് എഴുതപ്പെടും.
+
+optional_title=ഐച്ഛികമായ ക്രമീകരണങ്ങൾ
+email_title=ഇമെയിൽ ക്രമീകരണങ്ങൾ
+smtp_from=ഈ വിലാസത്തില് ഇമെയിൽ അയയ്ക്കുക
+smtp_from_helper=ഗിറ്റീ ഉപയോഗിയ്ക്കുന്ന ഇമെയില് വിലാസം. ഒരു സാധാ ഇമെയിൽ വിലാസം നൽകുക അല്ലെങ്കിൽ "പേര്" എന്ന ഘടന ഉപയോഗിക്കുക.
+mailer_user=SMTP ഉപയോക്തൃനാമം
+mailer_password=SMTP രഹസ്യവാക്കു്
+register_confirm=രജിസ്റ്റർ ചെയ്യുന്നതിന് ഇമെയിൽ സ്ഥിരീകരണം ആവശ്യമാക്കുക
+mail_notify=ഇമെയിൽ അറിയിപ്പുകൾ പ്രാപ്തമാക്കുക
+server_service_title=സെർവറിന്റെയും മൂന്നാം കക്ഷി സേവനങ്ങളുടെയും ക്രമീകരണങ്ങള്
+offline_mode=പ്രാദേശിക മോഡ് പ്രവർത്തനക്ഷമമാക്കുക
+offline_mode_popup=മൂന്നാം കക്ഷി ഉള്ളടക്ക ഡെലിവറി നെറ്റ്വർക്കുകൾ അപ്രാപ്തമാക്കി എല്ലാ വിഭവങ്ങളും പ്രാദേശികമായി നല്കുക.
+disable_gravatar=ഗ്രവതാര് പ്രവർത്തനരഹിതമാക്കുക
+disable_gravatar_popup=ഗ്രവതാര് അല്ലെങ്കില് മൂന്നാം കക്ഷി അവതാർ ഉറവിടങ്ങൾ പ്രവർത്തനരഹിതമാക്കുക. ഒരു ഉപയോക്താവ് പ്രാദേശികമായി ഒരു അവതാർ അപ്ലോഡുചെയ്യുന്നില്ലെങ്കിൽ സ്ഥിരസ്ഥിതി അവതാർ ഉപയോഗിക്കും.
+federated_avatar_lookup=കേന്ദ്രീകൃത അവതാര് പ്രാപ്തമാക്കുക
+federated_avatar_lookup_popup=ലിബ്രാവതാർ ഉപയോഗിച്ച് കേന്ദ്രീക്രത അവതാർ തിരയൽ പ്രാപ്തമാക്കുക.
+disable_registration=സ്വയം രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കുക
+disable_registration_popup=ഉപയോക്താക്കള് സ്വയം രജിസ്റ്റര് ചെയ്യുന്നതു അപ്രാപ്യമാക്കുക. അഡ്മിനിസ്ട്രേറ്റർമാർക്ക് മാത്രമേ പുതിയ ഉപയോക്തൃ അക്കൌണ്ടുകൾ സൃഷ്ടിക്കാന് കഴിയൂ.
+allow_only_external_registration_popup=ബാഹ്യ സേവനങ്ങളിലൂടെ മാത്രം രജിസ്ട്രേഷന് അനുവദിക്കുക
+openid_signin=OpenID പ്രവേശനം പ്രവർത്തനക്ഷമമാക്കുക
+openid_signin_popup=OpenID വഴി ഉപയോക്തൃ പ്രവേശനം പ്രാപ്തമാക്കുക.
+openid_signup=OpenID സ്വയം രജിസ്ട്രേഷൻ പ്രാപ്തമാക്കുക
+openid_signup_popup=OpenID അടിസ്ഥാനമാക്കിയുള്ള ഉപയോക്തൃ സ്വയം രജിസ്ട്രേഷൻ പ്രാപ്തമാക്കുക.
+enable_captcha_popup=ഉപയോക്താക്കള് സ്വയം രജിസ്ട്രേഷന് ചെയ്യുന്നതിനു് ഒരു ക്യാപ്ച ആവശ്യമാണ്.
+require_sign_in_view=പേജുകൾ കാണുന്നതിന് സൈറ്റില് പ്രവേശിക്കണം
+require_sign_in_view_popup=പേജ് ആക്സസ്സ്, പ്രവേശിച്ച ഉപയോക്താക്കൾക്കുമാത്രമായി പരിമിതപ്പെടുത്തുക. സന്ദർശകർ 'പ്രവേശനം', രജിസ്ട്രേഷൻ പേജുകൾ എന്നിവ മാത്രമേ കാണൂ.
+admin_setting_desc=ഒരു അഡ്മിനിസ്ട്രേറ്റര് അക്കൗണ്ട് സൃഷ്ടിക്കുന്നത് ഐച്ഛികമാണ്. ആദ്യം രജിസ്റ്റര് ചെയ്ത ഉപയോക്താവ് യാന്ത്രികമായി ഒരു അഡ്മിനിസ്ട്രേറ്ററായി മാറും.
+admin_title=അഡ്മിനിസ്ട്രേറ്റര് അക്കൗണ്ട് ക്രമീകരണങ്ങൾ
+admin_name=അഡ്മിനിസ്ട്രേറ്ററുടെ ഉപയോക്തൃനാമം
+admin_password=രഹസ്യവാക്കു്
+confirm_password=രഹസ്യവാക്കു് സ്ഥിരീകരിക്കുക
+admin_email=ഇ-മെയില് വിലാസം
+install_btn_confirm=ഗിറ്റീ സന്നിവേശിപ്പിയ്ക്കുക
+test_git_failed='git' കമാന്ഡ് പരീക്ഷിക്കാന് കഴിഞ്ഞില്ല: %v
+sqlite3_not_available=ഗിറ്റീയുടെ ഈ വേര്ഷന് SQLite3യെ പിന്തുണക്കുന്നില്ല. %s ൽ നിന്നും ഔദ്യോഗിക ബൈനറി പതിപ്പ് ഡൌണ്ലോഡ് ചെയ്യുക ('gobuild' പതിപ്പല്ല).
+invalid_db_setting=ഡാറ്റാബേസ് ക്രമീകരണങ്ങൾ അസാധുവാണ്: %v
+invalid_repo_path=കലവറയുടെ റൂട്ട് പാത്ത് അസാധുവാണ്: %v
+run_user_not_match='റൺ ആസ്' ഉപയോക്തൃനാമം നിലവിലെ ഉപയോക്തൃനാമമല്ല: %s -> %s
+save_config_failed=കോൺഫിഗറേഷൻ സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു: %v
+invalid_admin_setting=അഡ്മിനിസ്ട്രേറ്റര് അക്കൌണ്ട് ക്രമീകരണം അസാധുവാണ്: %v
+install_success=സ്വാഗതം! ഗിറ്റീ തിരഞ്ഞെടുത്തതിന് നന്ദി. സൂക്ഷിക്കുക, ആസ്വദിക്കൂ,!
+invalid_log_root_path=ലോഗ് പാത്ത് അസാധുവാണ്: %v
+default_keep_email_private=സ്ഥിരസ്ഥിതിയായി ഇമെയില് വിലാസങ്ങള് മറയ്ക്കുക
+default_keep_email_private_popup=സ്ഥിരസ്ഥിതിയായി പുതിയ ഉപയോക്തൃ അക്കൗണ്ടുകളുടെ ഇമെയില് വിലാസങ്ങള് മറയ്ക്കുക.
+default_allow_create_organization=സ്ഥിരസ്ഥിതിയായി സംഘടനകള് സൃഷ്ടിക്കാന് അനുവദിക്കുക
+default_allow_create_organization_popup=സ്ഥിരസ്ഥിതിയായി സംഘടനകള് സൃഷ്ടിക്കാന് പുതിയ ഉപയോക്തൃ അക്കൗണ്ടുകളെ അനുവദിക്കുക.
+default_enable_timetracking=സ്ഥിരസ്ഥിതിയായി സമയം ട്രാക്കു് ചെയ്യുന്നതു പ്രാപ്തമാക്കുക
+default_enable_timetracking_popup=സ്ഥിരസ്ഥിതിയായി പുതിയ കലവറകള്ക്കു് സമയം ട്രാക്കു് ചെയ്യുന്നതു് പ്രാപ്തമാക്കുക.
+no_reply_address=മറച്ച ഇമെയിൽ ഡൊമെയ്ൻ
+no_reply_address_helper=മറഞ്ഞിരിക്കുന്ന ഇമെയിൽ വിലാസമുള്ള ഉപയോക്താക്കൾക്കുള്ള ഡൊമെയ്ൻ നാമം. ഉദാഹരണത്തിന്, മറഞ്ഞിരിക്കുന്ന ഇമെയിൽ ഡൊമെയ്ൻ 'noreply.example.org' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ 'joe' എന്ന ഉപയോക്താവു് 'joe@noreply.example.org' ആയി ലോഗിൻ ചെയ്യും.
+
+[home]
+uname_holder=ഉപയോക്തൃനാമമോ ഇമെയിൽ വിലാസമോ
+password_holder=രഹസ്യവാക്കു്
+switch_dashboard_context=ഡാഷ്ബോർഡ് സന്ദർഭം മാറ്റുക
+my_repos=കലവറകള്
+show_more_repos=കൂടുതൽ കലവറകള് കാണിക്കുക…
+collaborative_repos=സഹകരിക്കാവുന്ന കലവറകള്
+my_orgs=എന്റെ സംഘടനകള്
+my_mirrors=എന്റെ മിററുകള്
+view_home=%s കാണുക
+search_repos=ഒരു കലവറ കണ്ടെത്തുക…
+
+
+
+issues.in_your_repos=നിങ്ങളുടെ കലവറകളില്
+
+[explore]
+repos=കലവറകള്
+users=ഉപയോക്താക്കള്
+organizations=സംഘടനകള്
+search=തിരയുക
+code=കോഡ്
+repo_no_results=പൊരുത്തപ്പെടുന്ന കലവറകളൊന്നും കണ്ടെത്താനായില്ല.
+user_no_results=പൊരുത്തപ്പെടുന്ന ഉപയോക്താക്കളെയൊന്നും കണ്ടെത്താനായില്ല.
+org_no_results=പൊരുത്തപ്പെടുന്ന സംഘടനകളൊന്നും കണ്ടെത്താനായില്ല.
+code_no_results=നിങ്ങളുടെ തിരയൽ പദവുമായി പൊരുത്തപ്പെടുന്ന സോഴ്സ് കോഡുകളൊന്നും കണ്ടെത്താനായില്ല.
+code_search_results=%s എന്നതിനായുള്ള തിരയൽ ഫലങ്ങൾ
+
+
+[auth]
+create_new_account=അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യുക
+register_helper_msg=ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ടോ? ഇപ്പോൾ പ്രവേശിക്കുക!
+social_register_helper_msg=ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ടോ? ഇത് ഇപ്പോൾ ബന്ധിപ്പിയ്ക്കുക!
+disable_register_prompt=രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കി. നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
+disable_register_mail=രജിസ്ട്രേഷനായുള്ള ഇമെയിൽ സ്ഥിരീകരണം അപ്രാപ്തമാക്കി.
+forgot_password_title=അടയാളവാക്യം മറന്നുപോയോ
+forgot_password=അടയാള വാക്ക് ഓർക്കുന്നില്ലേ?
+sign_up_now=ഒരു അക്കൗണ്ട് ആവശ്യമുണ്ടോ? ഇപ്പോള് രജിസ്റ്റര് ചെയ്യുക.
+sign_up_successful=അക്കൗണ്ട് വിജയകരമായി സൃഷ്ടിച്ചു.
+confirmation_mail_sent_prompt=%s ലേക്ക് ഒരു പുതിയ സ്ഥിരീകരണ ഇമെയിൽ അയച്ചു. രജിസ്ട്രേഷൻ പ്രക്രിയ പൂർത്തിയാക്കുന്നതിന് അടുത്ത %s നുള്ളിൽ നിങ്ങളുടെ ഇൻബോക്സ് പരിശോധിക്കുക.
+must_change_password=നിങ്ങളുടെ രഹസ്യവാക്കു് പുതുക്കുക
+allow_password_change=രഹസ്യവാക്കു് മാറ്റാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടുക (ശുപാർശിതം)
+reset_password_mail_sent_prompt=%s ലേക്ക് ഒരു പുതിയ സ്ഥിരീകരണ ഇമെയിൽ അയച്ചു. അക്കൗണ്ട് വീണ്ടെടുക്കൽ പ്രക്രിയ പൂർത്തിയാക്കുന്നതിന് അടുത്ത %s നുള്ളിൽ നിങ്ങളുടെ ഇൻബോക്സ് പരിശോധിക്കുക.
+active_your_account=നിങ്ങളുടെ അക്കൗണ്ട് സജീവമാക്കുക
+account_activated=നിങ്ങളുടെ അക്കൗണ്ട് സജീവമാക്കി
+prohibit_login=പ്രവേശനം നിരോധിച്ചിരിക്കുന്നു
+prohibit_login_desc=നിങ്ങളുടെ അക്കൗണ്ടിലേയ്ക്കുള്ള പ്രവേശനം നിരോധിച്ചിരിക്കുന്നു, ദയവായി നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
+resent_limit_prompt=നിങ്ങൾ അടുത്തിടെ ഒരു സജീവമാക്കൽ ഇമെയിൽ അഭ്യർത്ഥിച്ചു. 3 മിനിറ്റ് കാത്തിരുന്ന് വീണ്ടും ശ്രമിക്കുക.
+has_unconfirmed_mail=ഹായ് %s, നിങ്ങൾക്ക് സ്ഥിരീകരിക്കാത്ത ഇമെയിൽ വിലാസം (%s) ഉണ്ട്. നിങ്ങൾക്ക് ഒരു സ്ഥിരീകരണ ഇമെയിൽ ലഭിച്ചില്ലെങ്കിലോ പുതിയതൊന്ന് വീണ്ടും അയയ്ക്കേണ്ടതുണ്ടെങ്കിലോ, ചുവടെയുള്ള ബട്ടണിൽ ക്ലിക്കുചെയ്യുക.
+resend_mail=നിങ്ങളുടെ സജീവമാക്കൽ ഇമെയിൽ വീണ്ടും അയയ്ക്കാൻ ഇവിടെ ക്ലിക്കുചെയ്യുക
+email_not_associate=ഇമെയിൽ വിലാസം ഏതെങ്കിലും അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തിയിട്ടില്ല.
+send_reset_mail=അക്കൗണ്ട് വീണ്ടെടുക്കൽ ഇമെയിൽ അയയ്ക്കുക
+reset_password=അക്കൗണ്ട് വീണ്ടെടുക്കൽ
+invalid_code=നിങ്ങളുടെ സ്ഥിരീകരണ കോഡ് അസാധുവാണ് അല്ലെങ്കിൽ കാലഹരണപ്പെട്ടു.
+reset_password_helper=അക്കൗണ്ട് വീണ്ടെടുക്കുക
+reset_password_wrong_user=നിങ്ങൾ %s ആയി സൈൻ ഇൻ ചെയ്തു, പക്ഷേ അക്കൗണ്ട് വീണ്ടെടുക്കൽ ലിങ്ക് %s എന്നതിനാണ്
+password_too_short=പാസ്വേഡ് ദൈർഘ്യം %d അക്ഷരങ്ങളിലും കുറവായിരിക്കരുത്.
+non_local_account=പ്രാദേശിക ഇതര ഉപയോക്താക്കൾക്ക് ഗിറ്റീ വെബ് വഴി പാസ്വേഡ് പുതുക്കാന് ചെയ്യാൻ കഴിയില്ല.
+verify=പ്രമാണീകരിയ്ക്കുക
+scratch_code=സ്ക്രാച്ച് കോഡ്
+use_scratch_code=ഒരു സ്ക്രാച്ച് കോഡ് ഉപയോഗിക്കുക
+twofa_scratch_used=നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് ഉപയോഗിച്ചു. നിങ്ങളെ രണ്ട്-ഘടക ക്രമീകരണ പേജിലേക്ക് റീഡയറക്ട് ചെയ്തിരിക്കുന്നതിനാൽ നിങ്ങളുടെ ഉപകരണ എൻറോൾമെന്റ് നീക്കംചെയ്യാനോ പുതിയ സ്ക്രാച്ച് കോഡ് സൃഷ്ടിക്കാനോ കഴിയും.
+twofa_passcode_incorrect=നിങ്ങളുടെ പാസ്കോഡ് തെറ്റാണ്. നിങ്ങളുടെ ഉപകരണം തെറ്റായി സ്ഥാപിച്ചിട്ടുണ്ടെങ്കിൽ, പ്രവേശിക്കാൻ നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് ഉപയോഗിക്കുക.
+twofa_scratch_token_incorrect=നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് തെറ്റാണ്.
+login_userpass=പ്രവേശിക്കുക
+login_openid=OpenID
+oauth_signup_tab=പുതിയ അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യുക
+oauth_signup_submit=അക്കൗണ്ട് പൂർത്തിയാക്കുക
+oauth_signin_tab=നിലവിലുള്ള അക്കൌണ്ടുമായി ബന്ധിപ്പിയ്ക്കുക
+oauth_signin_title=അക്കൗണ്ട് ബന്ധിപ്പിയ്ക്കുന്നതു് അംഗീകരിക്കുന്നതിനായി സൈറ്റിലേയ്ക്കു് പ്രവേശിക്കുക
+oauth_signin_submit=അക്കൌണ്ട് ബന്ധിപ്പിയ്ക്കുക
+openid_connect_submit=ബന്ധിപ്പിക്കുക
+openid_connect_title=നിലവിലുള്ള അക്കൗണ്ടുമായി ബന്ധിപ്പിയ്ക്കുക
+openid_connect_desc=തിരഞ്ഞെടുത്ത ഓപ്പൺഐഡി യുആർഐ അജ്ഞാതമാണ്. ഇവിടെ നിന്നും ഒരു പുതിയ അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തുക.
+openid_register_title=അംഗത്വമെടുക്കുക
+openid_register_desc=തിരഞ്ഞെടുത്ത ഓപ്പൺഐഡി യുആർഐ അജ്ഞാതമാണ്. ഇവിടെ നിന്നും ഒരു പുതിയ അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തുക.
+openid_signin_desc=നിങ്ങളുടെ OpenID URI നൽകുക. ഉദാഹരണത്തിന്: https://anne.me, bob.openid.org.cn അല്ലെങ്കിൽ gnusocial.net/carry.
+email_domain_blacklisted=നിങ്ങളുടെ ഇമെയിൽ വിലാസത്തിൽ രജിസ്റ്റർ ചെയ്യാൻ കഴിയില്ല.
+authorize_application=അപ്ലിക്കേഷനു് അംഗീകാരം നല്കുക
+authorize_application_created_by=%s സൃഷ്ടിച്ച അപ്ലിക്കേഷൻ ആണ്.
+authorize_application_description=നിങ്ങൾ പ്രവേശനം അനുവദിക്കുകയാണെങ്കിൽ, സ്വകാര്യ റിപ്പോകളും ഓർഗനൈസേഷനുകളും ഉൾപ്പെടെ നിങ്ങളുടെ എല്ലാ അക്കൌണ്ട് വിവരങ്ങള് നേടാനും വേണമെങ്കില് മാറ്റങ്ങള് വരുത്താനും അതിന് കഴിയും.
+authorize_title=നിങ്ങളുടെ അക്കൌണ്ടില് പ്രവേശിയ്ക്കുന്നതിനു് "%s"നു് അംഗീകാരം നൽകണോ?
+authorization_failed=അംഗീകാരം നല്കുന്നതില് പരാജയപ്പെട്ടു
+authorization_failed_desc=അസാധുവായ ഒരു അഭ്യർത്ഥന കണ്ടെത്തിയതിനാൽ ഞങ്ങൾ അംഗീകാരം പരാജയപ്പെടുത്തി. ദയവായി നിങ്ങൾ അംഗീകരിക്കാൻ ശ്രമിച്ച അപ്ലിക്കേഷന്റെ പരിപാലകനുമായി ബന്ധപ്പെടുക.
+
+[mail]
+
+activate_account=നിങ്ങളുടെ അക്കൗണ്ട് സജീവമാക്കുക
+
+activate_email=ഇമെയില് വിലാസം സ്ഥിരീകരിയ്ക്കുക
+
+register_notify=ഗിറ്റീയിലേയ്ക്കു് സ്വാഗതം
+
+reset_password=നിങ്ങളുടെ അക്കൗണ്ട് വീണ്ടെടുക്കുക
+
+register_success=രജിസ്ട്രേഷൻ വിജയകരം
+
+
+
+
+
+
+
+[modal]
+yes=അതെ
+no=ഇല്ല
+modify=പുതുക്കുക
+
+[form]
+UserName=ഉപയോക്ത്രു നാമം
+RepoName=കലവറയുടെ പേരു്
+Email=ഇ-മെയില് വിലാസം
+Password=രഹസ്യവാക്കു്
+Retype=രഹസ്യവാക്കു് വീണ്ടും നല്കുക
+SSHTitle=SSH കീയുടെ പേരു്
+HttpsUrl=HTTPS URL
+PayloadUrl=പേലോഡ് URL
+TeamName=ടീമിന്റെ പേരു്
+AuthName=അംഗീകാരത്തിന്റെ പേരു്
+AdminEmail=അഡ്മിൻ ഇമെയിൽ
+
+NewBranchName=പുതിയ ശാഖയുടെ പേരു്
+CommitSummary=നിയോഗത്തിന്റെ സംഗ്രഹം
+CommitMessage=നിയോഗത്തിന്റെ സന്ദേശം
+CommitChoice=നിയോഗത്തിന്റെ തിരഞ്ഞെടുക്കല്
+TreeName=ഫയല് പാത്ത്
+Content=ഉള്ളടക്കം
+
+
+require_error=`ശൂന്യമായിരിക്കരുത്.`
+alpha_dash_error=`ആൽഫാന്യൂമെറിക്, ഡാഷ് ('-'), അടിവരയിട്ട ('_') എന്നീ ചിഹ്നങ്ങള് മാത്രം അടങ്ങിയിരിക്കണം.`
+alpha_dash_dot_error=`ആൽഫാന്യൂമെറിക്, ഡാഷ് ('-'), അടിവരയിടുക ('_'), ഡോട്ട് ('.') എന്നീ ച്ഹ്നങ്ങള് മാത്രം അടങ്ങിയിരിക്കണം.`
+git_ref_name_error=`നന്നായി രൂപപ്പെടുത്തിയ Git റഫറൻസ് നാമമായിരിക്കണം.`
+size_error=`വലുപ്പം %s ആയിരിക്കണം.`
+min_size_error=`കുറഞ്ഞത് %s അക്ഷരങ്ങള് അടങ്ങിയിരിക്കണം.`
+max_size_error=`പരമാവധി %s അക്ഷരങ്ങള് അടങ്ങിയിരിക്കണം.`
+email_error=സാധുവായ ഒരു ഈ-മെയിൽ വിലാസം അല്ല
+include_error=`%s'എന്ന ഉപവാക്യം അടങ്ങിയിരിക്കണം.`
+glob_pattern_error=ഗ്ലോബു് ശൃേണി തെറ്റാണു്: %s
+unknown_error=അജ്ഞാതമായ പിശക്:
+captcha_incorrect=ക്യാപ്ച കോഡ് തെറ്റാണ്.
+password_not_match=രഹസ്യവാക്കുകള് യോജിക്കുന്നില്ല.
+
+username_been_taken=ഉപയോക്തൃനാമം ലഭ്യമല്ല.
+repo_name_been_taken=കലവറയുടെ പേരു് ഇതിനോടകം ഉപയോഗിച്ചിട്ടുണ്ടു്.
+visit_rate_limit=വിദൂര വിലാസം വിവരകൈമാറ്റത്തിനു് പരിധി നിശ്ചയിച്ചിട്ടുണ്ടു്.
+2fa_auth_required=വിദൂര വിലാസം ഇരട്ട ഘടക പ്രാമാണീകരണം ആവശ്യപ്പെടുന്നുണ്ടു്.
+org_name_been_taken=സംഘടനയുടെ പേര് ഇതിനകം എടുത്തിട്ടുണ്ട്.
+team_name_been_taken=ടീമിന്റെ പേര് ഇതിനകം എടുത്തിട്ടുണ്ട്.
+team_no_units_error=കുറഞ്ഞത് ഒരു കലവറ വിഭാഗത്തിലേക്ക് പ്രവേശനം അനുവദിക്കുക.
+email_been_used=ഈ ഇമെയിൽ വിലാസം ഇതിനു മുന്നേ എടുത്തിട്ടുണ്ട്.
+openid_been_used=%s എന്ന ഓപ്പണ്ഐഡി വിലാസം ഇതിനു മുന്നേ എടുത്തിട്ടുണ്ട്.
+username_password_incorrect=ഉപഭോക്തൃനാമമോ രഹസ്യവാക്കോ തെറ്റാണ്.
+enterred_invalid_repo_name=ഈ കവവറയുടെ പേരു് തെറ്റാണു്.
+enterred_invalid_owner_name=പുതിയ ഉടമസ്ഥന്റെ പേരു് സാധുവല്ല.
+enterred_invalid_password=താങ്കള് നല്കിയ രഹസ്യവാക്കു് തെറ്റാണ്.
+user_not_exist=ഉപയോക്താവ് നിലവിലില്ല.
+cannot_add_org_to_team=ഒരു സംഘടനയെ ടീം അംഗമായി ചേർക്കാൻ കഴിയില്ല.
+
+invalid_ssh_key=നിങ്ങളുടെ SSH കീ സ്ഥിരീകരിക്കാൻ കഴിയില്ല: %s
+invalid_gpg_key=നിങ്ങളുടെ GPG കീ സ്ഥിരീകരിക്കാൻ കഴിയില്ല: %s
+unable_verify_ssh_key=SSH കീ സ്ഥിരീകരിക്കാൻ കഴിയില്ല; തെറ്റുകളുണ്ടോയെന്നു് ഒന്നുകൂടി പരിശോധിക്കുക.
+auth_failed=പ്രാമാണീകരണം പരാജയപ്പെട്ടു: %v
+
+still_own_repo=നിങ്ങളുടെ അക്കൗണ്ടിന് ഒന്നോ അതിലധികമോ കലവറകള് ഉണ്ട്; ആദ്യം അവ ഇല്ലാതാക്കുക അല്ലെങ്കിൽ കൈമാറുക.
+still_has_org=നിങ്ങളുടെ അക്കൗണ്ട് ഒന്നോ അതിലധികമോ സംഘടനകളില് അംഗമാണ്; ആദ്യം അവ വിടുക.
+org_still_own_repo=നിങ്ങളുടെ സംഘടന ഇനിയും ഒന്നോ അതിലധികമോ കലവറകളുടെ ഉടമസ്ഥനാണു്; ആദ്യം അവ ഇല്ലാതാക്കുക അല്ലെങ്കിൽ കൈമാറുക.
+
+target_branch_not_exist=ലക്ഷ്യമാക്കിയ ശാഖ നിലവിലില്ല.
+
+[user]
+change_avatar=നിങ്ങളുടെ അവതാർ മാറ്റുക…
+join_on=ചേർന്നതു്
+repositories=കലവറകള്
+activity=പൊതുവായ പ്രവർത്തനങ്ങള്
+followers=പിന്തുടരുന്നവര്
+starred=നക്ഷത്രമിട്ട കലവറകള്
+following=പിന്തുടരുന്നവര്
+follow=പിന്തുടരൂ
+unfollow=പിന്തുടരുന്നത് നിര്ത്തുക
+heatmap.loading=ഹീറ്റ്മാപ്പ് ലോഡുചെയ്യുന്നു…
+user_bio=ജീവചരിത്രം
+
+form.name_reserved='%s' എന്ന ഉപയോക്തൃനാമം മറ്റാവശ്യങ്ങള്ക്കായി നീക്കിവച്ചിരിക്കുന്നു.
+form.name_pattern_not_allowed=ഉപയോക്തൃനാമത്തിൽ '%s' എന്ന ശ്രേണി അനുവദനീയമല്ല.
+
+[settings]
+profile=പ്രൊഫൈൽ
+account=അക്കൗണ്ട്
+password=രഹസ്യവാക്കു്
+security=സുരക്ഷ
+avatar=അവതാര്
+ssh_gpg_keys=SSH / GPG കീകള്
+social=സോഷ്യൽ അക്കൗണ്ടുകൾ
+applications=അപ്ലിക്കേഷനുകൾ
+orgs=സംഘടനകളെ നിയന്ത്രിക്കുക
+repos=കലവറകള്
+delete=അക്കൗണ്ട് ഇല്ലാതാക്കുക
+twofa=ഇരട്ട ഘടക പ്രാമാണീകരണം
+account_link=ബന്ധിപ്പിച്ച അക്കൌണ്ടുകള്
+organization=സംഘടനകള്
+uid=Uid
+
+public_profile=പരസ്യമായ പ്രൊഫൈൽ
+profile_desc=അറിയിപ്പുകൾക്കും മറ്റ് പ്രവർത്തനങ്ങൾക്കുമായി നിങ്ങളുടെ ഇമെയിൽ വിലാസം ഉപയോഗിക്കും.
+password_username_disabled=പ്രാദേശികമല്ലാത്ത ഉപയോക്താക്കൾക്ക് അവരുടെ ഉപയോക്തൃനാമം മാറ്റാൻ അനുവാദമില്ല. കൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
+full_name=പൂർണ്ണമായ പേര്
+website=വെബ് സൈറ്റ്
+location=സ്ഥലം
+update_theme=പ്രമേയം പുതുക്കുക
+update_profile=പ്രോഫൈല് പരിഷ്കരിക്കുക
+update_profile_success=നിങ്ങളുടെ പ്രൊഫൈൽ പരിഷ്കരിച്ചിരിക്കുന്നു.
+change_username=നിങ്ങളുടെ ഉപയോക്തൃനാമം മാറ്റി.
+change_username_prompt=കുറിപ്പ്: ഉപയോക്തൃനാമത്തിലെ മാറ്റം നിങ്ങളുടെ അക്കൗണ്ട് URLഉം മാറ്റുന്നു.
+continue=തുടരുക
+cancel=റദ്ദാക്കുക
+language=ഭാഷ
+ui=പ്രമേയങ്ങള്
+
+lookup_avatar_by_mail=ഇമെയിൽ വിലാസം അനുസരിച്ച് അവതാർ കണ്ടെത്തുക
+federated_avatar_lookup=കേന്ദ്രീക്രത അവതാര് കണ്ടെത്തല്
+enable_custom_avatar=ഇഷ്ടാനുസൃത അവതാർ ഉപയോഗിക്കുക
+choose_new_avatar=പുതിയ അവതാർ തിരഞ്ഞെടുക്കുക
+update_avatar=അവതാർ പുതുക്കുക
+delete_current_avatar=നിലവിലെ അവതാർ ഇല്ലാതാക്കുക
+uploaded_avatar_not_a_image=അപ്ലോഡുചെയ്ത ഫയൽ ഒരു ചിത്രമല്ല.
+uploaded_avatar_is_too_big=അപ്ലോഡുചെയ്ത ഫയൽ പരമാവധി വലുപ്പം കവിഞ്ഞു.
+update_avatar_success=നിങ്ങളുടെ അവതാര് പരിഷ്കരിച്ചിരിക്കുന്നു.
+
+change_password=പാസ്വേഡ് പുതുക്കുക
+old_password=നിലവിലുള്ള രഹസ്യവാക്കു്
+new_password=പുതിയ രഹസ്യവാക്കു്
+retype_new_password=പുതിയ രഹസ്യവാക്കു് വീണ്ടും നല്കുക
+password_incorrect=നിലവിലെ പാസ്വേഡ് തെറ്റാണ്.
+change_password_success=നിങ്ങളുടെ പാസ്വേഡ് അപ്ഡേറ്റുചെയ്തു. ഇനി മുതൽ നിങ്ങളുടെ പുതിയ പാസ്വേഡ് ഉപയോഗിച്ച് പ്രവേശിക്കുക.
+password_change_disabled=പ്രാദേശിക ഇതര ഉപയോക്താക്കൾക്ക് ഗിറ്റീ വെബ് വഴി പാസ്വേഡ് പുതുക്കാന് ചെയ്യാൻ കഴിയില്ല.
+
+emails=ഇ-മെയില് വിലാസങ്ങള്
+manage_emails=ഇമെയിൽ വിലാസങ്ങൾ നിയന്ത്രിക്കുക
+manage_themes=സ്ഥിരസ്ഥിതി പ്രമേയം തിരഞ്ഞെടുക്കുക
+manage_openid=ഓപ്പൺഐഡി വിലാസങ്ങൾ നിയന്ത്രിക്കുക
+email_desc=അറിയിപ്പുകൾക്കും മറ്റ് പ്രവർത്തനങ്ങൾക്കുമായി നിങ്ങളുടെ പ്രാഥമിക ഇമെയിൽ വിലാസം ഉപയോഗിക്കും.
+theme_desc=സൈറ്റിലുടനീളം ഇത് നിങ്ങളുടെ സ്ഥിരസ്ഥിതി പ്രമേയം ആയിരിക്കും.
+primary=പ്രാഥമികം
+primary_email=പ്രാഥമികമാക്കുക
+delete_email=നീക്കം ചെയ്യുക
+email_deletion=ഈ-മെയില് വിലാസം നീക്കം ചെയ്യുക
+email_deletion_desc=ഇമെയിൽ വിലാസവും അനുബന്ധ വിവരങ്ങളും നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് നീക്കംചെയ്യും. ഈ ഇമെയിൽ വിലാസം വഴിയുള്ള ഗിറ്റു് നിയോഗങ്ങളും മാറ്റമില്ലാതെ ഉണ്ടാകും. തുടരട്ടെ?
+email_deletion_success=ഇമെയിൽ വിലാസം നീക്കംചെയ്തു.
+theme_update_success=നിങ്ങളുടെ പ്രമേയം പുതുക്കി.
+theme_update_error=തിരഞ്ഞെടുത്ത പ്രമേയം നിലവിലില്ല.
+openid_deletion=OpenID വിലാസം നീക്കം ചെയ്യുക
+openid_deletion_desc=നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് ഓപ്പൺഐഡി വിലാസം നീക്കംചെയ്യുന്നത് ഇതുപയോഗിച്ചു് ഇനി പ്രവേശിക്കുന്നതിൽ നിന്ന് നിങ്ങളെ തടയും. തുടരട്ടെ?
+openid_deletion_success=ഓപ്പൺഐഡി വിലാസം നീക്കംചെയ്തു.
+add_new_email=ഈ-മെയില് വിലാസം ചേര്ക്കുക
+add_new_openid=പുതിയ ഓപ്പണ് ഐഡി വിലാസം ചേര്ക്കുക
+add_email=ഈ-മെയില് വിലാസം ചേര്ക്കുക
+add_openid=ഓപ്പണ് ഐഡി വിലാസം ചേര്ക്കുക
+add_email_confirmation_sent=ഒരു സ്ഥിരീകരണ ഇമെയിൽ '%s' ലേക്ക് അയച്ചു. നിങ്ങളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കുന്നതിന് അടുത്ത %s നുള്ളിൽ നിങ്ങളുടെ ഇൻബോക്സ് പരിശോധിക്കുക.
+add_email_success=പുതിയ ഇമെയിൽ വിലാസം ചേര്ത്തു.
+add_openid_success=പുതിയ ഓപ്പണ്ഐഡി വിലാസം ചേര്ത്തു.
+keep_email_private=ഈ-മെയില് വിലാസം മറയ്ക്കുക
+keep_email_private_popup=നിങ്ങളുടെ ഇമെയിൽ വിലാസം മറ്റ് ഉപയോക്താക്കു് കാണാനാകില്ല.
+openid_desc=ഒരു ബാഹ്യ ദാതാവിന് പ്രാമാണീകരണം നിയുക്തമാക്കാൻ ഓപ്പൺഐഡി നിങ്ങളെ അനുവദിക്കുന്നു.
+
+manage_ssh_keys=എസ്. എസ്. എച്ച് കീകള് നിയന്ത്രിക്കുക
+manage_gpg_keys=ജീ പീ. ജി കീകള് നിയന്ത്രിക്കുക
+add_key=കീ ചേര്ക്കുക
+ssh_desc=ഇവയാണു് നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തിയിരിക്കുന്ന പൊതുവായ എസ്. എസ്. എച്ച് കീകൾ. ഇതിനോടനു ബന്ധിപ്പിച്ചിട്ടുള്ള സ്വകാര്യ കീകൾ നിങ്ങളുടെ കലവറകളിലേയ്ക്കു് പൂർണ്ണ ആക്സസ് അനുവദിക്കുന്നു.
+gpg_desc=ഈ പൊതു GPG കീകൾ നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു. കമ്മിറ്റുകളെ പരിശോധിച്ചുറപ്പിക്കാൻ നിങ്ങളുടെ സ്വകാര്യ കീകൾ അനുവദിക്കുന്നതിനാൽ അവ സുരക്ഷിതമായി സൂക്ഷിക്കുക.
+ssh_helper=സഹായം ആവശ്യമുണ്ടോ? നിങ്ങളുടെ സ്വന്തം SSH കീകൾ സൃഷ്ടിക്കുക, അല്ലെങ്കിൽ പൊതുവായ പ്രശ്നങ്ങൾ എന്നിവയ്ക്കായുള്ള ഗിറ്റ്ഹബ്ബിന്റെ മാര്ഗദര്ശനങ്ങള് ഉപയോഗിച്ചു് നിങ്ങൾക്ക് എസ്. എസ്. എച്ചുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങള് പരിഹരിക്കാം.
+gpg_helper= സഹായം ആവശ്യമുണ്ടോ? ജിപിജിയെക്കുറിച്ച് ഗിറ്റ്ഹബിന്റെ മാര്ഗ്ഗനിര്ദ്ദേശങ്ങള് പരിശോധിയ്ക്കുക.
+add_new_key=SSH കീ ചേർക്കുക
+add_new_gpg_key=GPG കീ ചേർക്കുക
+ssh_key_been_used=ഈ SSH കീ ഇതിനകം ചേർത്തു.
+gpg_key_id_used=സമാന ഐഡിയുള്ള ഒരു പൊതു ജിപിജി കീ ഇതിനകം നിലവിലുണ്ട്.
+subkeys=സബ് കീകള്
+key_id=കീ ഐഡി
+key_name=കീയുടെ പേരു്
+key_content=ഉള്ളടക്കം
+add_key_success='%s' എന്ന SSH കീ ചേർത്തു.
+add_gpg_key_success='%s' എന്ന GPG കീ ചേർത്തു.
+delete_key=നീക്കം ചെയ്യുക
+ssh_key_deletion=SSH കീ നീക്കം ചെയ്യുക
+gpg_key_deletion=GPG കീ നീക്കം ചെയ്യുക
+ssh_key_deletion_desc=ഒരു SSH കീ നീക്കംചെയ്യുന്നത് നിങ്ങളുടെ അക്കൌണ്ടിലേക്കുള്ള പ്രവേശനം അസാധുവാക്കുന്നു. തുടരട്ടെ?
+gpg_key_deletion_desc=ഒരു ജിപിജി കീ നീക്കംചെയ്യുന്നത് അതിൽ ഒപ്പിട്ട കമ്മിറ്റുകളെ സ്ഥിരീകരിക്കില്ല. തുടരട്ടെ?
+ssh_key_deletion_success=SSH കീ നീക്കംചെയ്തു.
+gpg_key_deletion_success=GPG കീ നീക്കംചെയ്തു.
+add_on=ചേര്ത്തതു്
+valid_until=വരെ സാധുവാണ്
+valid_forever=എന്നും സാധുവാണു്
+last_used=അവസാനം ഉപയോഗിച്ചത്
+no_activity=സമീപകാലത്തു് പ്രവർത്തനങ്ങളൊന്നുമില്ല
+can_read_info=വായിയ്ക്കുക
+can_write_info=എഴുതുക
+key_state_desc=കഴിഞ്ഞ 7 ദിവസങ്ങളിൽ ഈ കീ ഉപയോഗിച്ചു
+token_state_desc=ഈ ടോക്കൺ കഴിഞ്ഞ 7 ദിവസങ്ങളിൽ ഉപയോഗിച്ചു
+show_openid=പ്രൊഫൈലിൽ കാണുക
+hide_openid=പ്രൊഫൈലിൽ നിന്ന് മറയ്ക്കുക
+ssh_disabled=SSH അപ്രാപ്തമാക്കി
+manage_social=സഹവസിക്കുന്ന സോഷ്യൽ അക്കൗണ്ടുകളെ നിയന്ത്രിക്കുക
+social_desc=ഈ സോഷ്യൽ അക്കൗണ്ടുകൾ നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടുമായി ലിങ്കുചെയ്തു. ഇവ നിങ്ങളുടെ ഗീറ്റീ അക്കൗണ്ടിലേക്ക് പ്രവേശിക്കാൻ ഉപയോഗിക്കാവുന്നതിനാൽ അവയെല്ലാം നിങ്ങൾ തിരിച്ചറിഞ്ഞുവെന്ന് ഉറപ്പാക്കുക.
+unbind=അൺലിങ്ക് ചെയ്യുക
+unbind_success=നിങ്ങളുടെ ഗീറ്റീ അക്കൗണ്ടിൽ നിന്ന് സോഷ്യൽ അക്കൗണ്ട് അൺലിങ്ക് ചെയ്തു.
+
+manage_access_token=ആക്സസ്സ് ടോക്കണുകൾ നിയന്ത്രിക്കുക
+generate_new_token=പുതിയ ടോക്കൺ സൃഷ്ടിക്കുക
+tokens_desc=ഈ ടോക്കണുകൾ ഗിറ്റീ API ഉപയോഗിച്ച് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പ്രവേശനം നൽകുന്നു.
+new_token_desc=ഒരു ടോക്കൺ ഉപയോഗിക്കുന്ന അപ്ലിക്കേഷനുകൾക്ക് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പൂർണ്ണ പ്രവേശനം ഉണ്ട്.
+token_name=ടോക്കണിന്റെ പേരു്
+generate_token=ടോക്കൺ സൃഷ്ടിക്കുക
+generate_token_success=നിങ്ങളുടെ പുതിയ ടോക്കൺ ജനറേറ്റുചെയ്തു. ഇത് വീണ്ടും കാണിക്കാത്തതിനാൽ ഇപ്പോൾ തന്നെ പകർത്തുക.
+delete_token=നീക്കം ചെയ്യുക
+access_token_deletion=ആക്സസ്സ് ടോക്കണ് നീക്കം ചെയ്യുക
+delete_token_success=ടോക്കൺ ഇല്ലാതാക്കി. ഇനി ഇത് ഉപയോഗിക്കുന്ന അപ്ലിക്കേഷനുകൾക്ക് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പ്രവേശനം ഉണ്ടാകില്ല.
+
+manage_oauth2_applications=OAuth2 അപ്ലിക്കേഷനുകൾ നിയന്ത്രിക്കുക
+edit_oauth2_application=OAuth2 അപ്ലിക്കേഷൻ എഡിറ്റുചെയ്യുക
+oauth2_applications_desc=നിങ്ങളുടെ മൂന്നാം കക്ഷി അപ്ലിക്കേഷനെ, ഈ ഗിറ്റീ ഇന്സ്റ്റാളേഷനുമായി സുരക്ഷിതമായി ഉപയോക്താക്കളെ പ്രാമാണീകരിക്കാൻ OAuth2 അപ്ലിക്കേഷനുകൾ പ്രാപ്തമാക്കുന്നു.
+remove_oauth2_application=OAuth2 അപ്ലിക്കേഷനുകൾ നീക്കംചെയ്യുക
+remove_oauth2_application_desc=ഒരു OAuth2 അപ്ലിക്കേഷൻ നീക്കംചെയ്യുന്നത് ഒപ്പിട്ട എല്ലാ ആക്സസ് ടോക്കണുകളിലേക്കും പ്രവേശനം റദ്ദാക്കും. തുടരട്ടെ?
+remove_oauth2_application_success=അപ്ലിക്കേഷൻ ഇല്ലാതാക്കി.
+create_oauth2_application=ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ സൃഷ്ടിക്കുക
+create_oauth2_application_button=അപ്ലിക്കേഷൻ സൃഷ്ടിക്കുക
+create_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ സൃഷ്ടിച്ചു.
+update_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ പുതുക്കി.
+oauth2_application_name=അപ്ലിക്കേഷന്റെ പേര്
+oauth2_redirect_uri=URI റീഡയറക്ട് ചെയ്യുക
+save_application=സംരക്ഷിയ്ക്കുക
+oauth2_client_id=ക്ലൈന്റ് ഐഡി
+oauth2_client_secret=ക്ലൈന്റു് രഹസ്യം
+oauth2_regenerate_secret=രഹസ്യം പുനഃസൃഷ്ടിയ്ക്കുക
+oauth2_regenerate_secret_hint=നിങ്ങളുടെ രഹസ്യം നഷ്ടപ്പെട്ടോ?
+oauth2_client_secret_hint=നിങ്ങൾ ഈ പേജ് വീണ്ടും സന്ദർശിക്കുകയാണെങ്കിൽ രഹസ്യം ദൃശ്യമാകില്ല. നിങ്ങളുടെ രഹസ്യം സംരക്ഷിക്കുക.
+oauth2_application_edit=ക്രമീകരിക്കുക
+oauth2_application_create_description=OAuth2 ആപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ മൂന്നാം കക്ഷി ആപ്ലിക്കേഷൻ ഉപയോക്തൃ അക്കൌണ്ടുകളിലേക്ക് ആക്സസ് നൽകുന്നു.
+oauth2_application_remove_description=ഒരു OAuth2 ആപ്ലിക്കേഷൻ നീക്കംചെയ്യുന്നത് ഈ സന്ദർഭത്തിൽ അംഗീകൃത ഉപയോക്തൃ അക്കൌണ്ടുകളിലേക്ക് പ്രവേശിക്കുന്നത് തടയും. തുടരട്ടെ?
+
+authorized_oauth2_applications=അംഗീകൃത OAuth2 അപ്ലിക്കേഷനുകൾ
+authorized_oauth2_applications_description=ഈ മൂന്നാം കക്ഷി അപ്ലിക്കേഷനുകളിലേക്ക് നിങ്ങളുടെ സ്വകാര്യ ഗീറ്റീ അക്കൗണ്ടിലേക്ക് പ്രവേശനം അനുവദിച്ചു. അപ്ലിക്കേഷനുകൾക്കായുള്ള നിയന്ത്രണം ഇനി ആവശ്യമില്ല.
+revoke_key=അസാധുവാക്കുക
+revoke_oauth2_grant=നിയന്ത്രണം തിരിച്ചെടുക്കുക
+revoke_oauth2_grant_description=ഈ മൂന്നാം കക്ഷി ആപ്ലിക്കേഷനായി ആക്സസ് അസാധുവാക്കുന്നത് നിങ്ങളുടെ ഡാറ്റ ആക്സസ് ചെയ്യുന്നതിൽ നിന്ന് ഈ ആപ്ലിക്കേഷനെ തടയും. നിങ്ങള്ക്ക് ഉറപ്പാണോ?
+revoke_oauth2_grant_success=നിങ്ങൾ വിജയകരമായി പ്രവേശനം റദ്ദാക്കി.
+
+twofa_desc=ഇരട്ട ഘടക പ്രാമാണീകരണം നിങ്ങളുടെ അക്കൗണ്ടിന്റെ സുരക്ഷ വർദ്ധിപ്പിക്കുന്നു.
+twofa_is_enrolled=നിങ്ങളുടെ അക്കൗണ്ട് നിലവിൽ ഇരട്ട ഘടക പ്രമാണീകരണത്തിനു് എൻറോൾ ചെയ്തിട്ടുണ്ട്. .
+twofa_not_enrolled=നിങ്ങളുടെ അക്കൗണ്ട് നിലവിൽ ഇരട്ട ഘടക പ്രമാണീകരണത്തിനു് എൻറോൾ ചെയ്തിട്ടില്ല..
+twofa_disable=ഇരട്ട ഘടക പ്രാമാണീകരണം റദ്ദാക്കി
+twofa_scratch_token_regenerate=സ്ക്രാച്ച് ടോക്കൺ പുനഃനിര്മ്മിയ്ക്കുക
+twofa_scratch_token_regenerated=%s ആണ് ഇപ്പോൾ നിങ്ങളുടെ സ്ക്രാച്ച് ടോക്കൺ. സുരക്ഷിതമായ സ്ഥലത്ത് സൂക്ഷിക്കുക.
+twofa_enroll=ഇരട്ട ഘടക പ്രാമാണീകരണത്തില് അംഗമാകുക
+twofa_disable_note=ആവശ്യമെങ്കിൽ നിങ്ങൾക്ക് രണ്ട്-ഘടക പ്രാമാണീകരണം അപ്രാപ്തമാക്കാൻ കഴിയും.
+twofa_disable_desc=രണ്ട്-ഘടക പ്രാമാണീകരണം അപ്രാപ്തമാക്കുന്നത് നിങ്ങളുടെ അക്കൗണ്ട് സുരക്ഷിതമല്ലാത്തതാക്കും. തുടരട്ടെ?
+regenerate_scratch_token_desc=നിങ്ങളുടെ സ്ക്രാച്ച് ടോക്കൺ തെറ്റായി സ്ഥാപിക്കുകയോ അല്ലെങ്കിൽ സൈൻ ഇൻ ചെയ്യാൻ ഇതിനകം ഉപയോഗിക്കുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ അത് ഇവിടെനിന്നു് പുനഃസജ്ജമാക്കാൻ കഴിയും.
+twofa_disabled=രണ്ട്-ഘട്ട പ്രാമാണീകരണം അപ്രാപ്തമാക്കി.
+scan_this_image=നിങ്ങളുടെ പ്രാമാണീകരണ ആപ്ലിക്കേഷൻ ഉപയോഗിച്ച് ഈ ചിത്രം സൂക്ഷ്മപരിശോധന നടത്തുക:
+or_enter_secret=അല്ലെങ്കിൽ രഹസ്യ കോഡ് നൽകുക: %s
+then_enter_passcode=അപ്ലിക്കേഷനിൽ കാണിച്ചിരിക്കുന്ന പാസ്കോഡ് നൽകുക:
+passcode_invalid=പാസ്കോഡ് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക.
+twofa_enrolled=നിങ്ങളുടെ അക്കൌണ്ട് രണ്ട്-ഘട്ട പ്രാമാണീകരണത്തിലേക്ക് ചേർത്തിട്ടുണ്ട്. നിങ്ങളുടെ സ്ക്രാച്ച് ടോക്കൺ (%s) ഒരു തവണ മാത്രം കാണിക്കുന്നതിനാൽ അതു് സുരക്ഷിതമായ സ്ഥലത്ത് സൂക്ഷിക്കുക!
+
+
+manage_account_links=ബന്ധിപ്പിച്ചിട്ടുള്ള അക്കൗണ്ടുകൾ നിയന്ത്രിക്കുക
+manage_account_links_desc=ഈ ബാഹ്യ അക്കൗണ്ടുകൾ നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടുമായി ലിങ്കുചെയ്തു.
+account_links_not_available=നിങ്ങളുടെ ഗിറ്റീ അക്കൌണ്ടുമായി നിലവിൽ മറ്റു് ബാഹ്യ അക്കൌണ്ടുകളൊന്നും ബന്ധിപ്പിച്ചിട്ടില്ല.
+remove_account_link=ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്യുക
+remove_account_link_desc=ഒരു ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്യുന്നത് നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടിലേക്കുള്ള പ്രവേശനം അസാധുവാക്കും. തുടരട്ടെ?
+remove_account_link_success=ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്തു.
+
+orgs_none=നിങ്ങൾ ഏതെങ്കിലും സംഘടനയില് അംഗമല്ല.
+repos_none=നിങ്ങൾക്ക് ഒരു കലവറയും സ്വന്തമായി ഇല്ല
+
+delete_account=അക്കൗണ്ട് ഇല്ലാതാക്കുക
+delete_prompt=ഈ പ്രവർത്തനം നിങ്ങളുടെ ഉപയോക്തൃ അക്കൗണ്ട് ശാശ്വതമായി ഇല്ലാതാക്കും. ഇത് പൂർവ്വാവസ്ഥയിലാക്കാൻ കഴിയില്ല..
+confirm_delete_account=ഇല്ലാതാക്കൽ സ്ഥിരീകരിക്കുക
+delete_account_title=ഉപയോക്തൃ അക്കൗണ്ട് ഇല്ലാതാക്കുക
+delete_account_desc=ഈ ഉപയോക്തൃ അക്കൗണ്ട് ശാശ്വതമായി ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?
+
+email_notifications.enable=ഇമെയിൽ അറിയിപ്പുകൾ പ്രാപ്തമാക്കുക
+email_notifications.onmention=ഇ-മെയിൽ പരാമര്ശിച്ചാൽ മാത്രം അയയ്ക്കുക
+email_notifications.disable=ഇമെയിൽ അറിയിപ്പുകൾ അപ്രാപ്തമാക്കുക
+email_notifications.submit=ഇ-മെയില് മുൻഗണനകള്
+
+
+[repo]
+owner=ഉടമസ്ഥന്
+repo_name=കലവറയുടെ പേരു്
+repo_name_helper=നല്ല കലവറയുടെ പേരു് ഹ്രസ്വവും അവിസ്മരണീയവും അതുല്യവുമായ കീവേഡുകൾ ഉപയോഗിക്കുന്നു.
+visibility=കാണാനാവുന്നതു്
+visibility_description=ഉടമയ്ക്കോ ഓർഗനൈസേഷൻ അംഗങ്ങൾക്കോ അവകാശങ്ങളുണ്ടെങ്കിൽ മാത്രമേ കാണാൻ കഴിയൂ.
+visibility_helper=കലവറ സ്വകാര്യമാക്കുക
+visibility_helper_forced=നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്റർ പുതിയ കലവറകളെ സ്വകാര്യമാക്കാൻ നിർബന്ധിക്കുന്നു.
+visibility_fork_helper=(മാറ്റം എല്ലാ ഫോർക്കുകളെയും ബാധിക്കും.)
+clone_helper=ക്ലോണ് ചെയ്യാന് സഹായം വേണോ? സഹായം സന്ദര്ശിക്കുക.
+fork_repo=കലവറ ഫോര്ക്കു് ചെയ്യുക
+fork_from=ല് നിന്നും ഫോര്ക്കു് ചെയ്യൂ
+fork_visibility_helper=ഒരു കലവറയുടെ ഫോര്ക്കിന്റെ ദൃശ്യപരത മാറ്റാൻ കഴിയില്ല.
+repo_desc=വിരരണം
+repo_lang=ഭാഷ
+repo_gitignore_helper=.gitignore ടെംപ്ലേറ്റുകൾ തിരഞ്ഞെടുക്കുക.
+license=ലൈസൻസ്
+license_helper=ഒരു ലൈസൻസ് ഫയൽ തിരഞ്ഞെടുക്കുക.
+readme=റീഡ്മീ
+readme_helper=ഒരു റീഡ്മീ ഫയൽ ടെംപ്ലേറ്റ് തിരഞ്ഞെടുക്കുക.
+auto_init=കലവറ സമാരംഭിക്കുക (.gitignore, ലൈസൻസ്, റീഡ്മീ എന്നിവ ചേർക്കുന്നു)
+create_repo=കലവറ സൃഷ്ടിക്കുക
+default_branch=സ്ഥിരസ്ഥിതി ശാഖ
+mirror_prune=വെട്ടിഒതുക്കുക
+mirror_prune_desc=കാലഹരണപ്പെട്ട വിദൂര ട്രാക്കിംഗ് റഫറൻസുകൾ നീക്കംചെയ്യുക
+mirror_interval_invalid=മിറർ ചെയ്യാനുള്ള ഇടവേള സാധുവല്ല.
+mirror_address=URL- ൽ നിന്നുള്ള ക്ലോൺ
+mirror_address_url_invalid=നൽകിയ url അസാധുവാണ്. നിങ്ങൾ url- ന്റെ എല്ലാ ഘടകങ്ങളും ശരിയായി നല്കണം.
+mirror_address_protocol_invalid=നൽകിയ url അസാധുവാണ്. http(s):// അല്ലെങ്കിൽ git:// ലൊക്കേഷനുകൾ മാത്രമേ മിറർ ചെയ്യാൻ കഴിയൂ.
+mirror_last_synced=അവസാനം സമന്വയിപ്പിച്ചതു്
+watchers=നിരീക്ഷകർ
+stargazers=സ്റ്റാർഗാസറുകൾ
+forks=ശാഖകള്
+pick_reaction=നിങ്ങളുടെ പ്രതികരണം തിരഞ്ഞെടുക്കുക
+reactions_more=കൂടാതെ %d അധികം
+
+
+
+
+archive.title=ഈ കലവറ ചരിത്രരേഖാപരമായി നിലനിര്ത്തിയിരിക്കുന്നു. നിങ്ങൾക്ക് ഫയലുകൾ കാണാനും ക്ലോൺ ചെയ്യാനും കഴിയും, പക്ഷേ പ്രശ്നങ്ങൾ / ലയന അഭ്യർത്ഥനകൾ ഉണ്ടാക്കാനോ തുറക്കാനോ കഴിയില്ല.
+archive.issue.nocomment=ഈ കലവറ ചരിത്രപരമായി നിലനിര്ത്തിയിരിക്കുന്നതാണു്. നിങ്ങൾക്ക് പ്രശ്നങ്ങളിൽ അഭിപ്രായമിടാൻ കഴിയില്ല.
+archive.pull.nocomment=ഈ കലവറ ചരിത്രപരമായി നിലനിര്ത്തിയിരിക്കുന്നതാണു്. നിങ്ങൾക്ക് ലയന അഭ്യർത്ഥനകളില് അഭിപ്രായമിടാൻ കഴിയില്ല.
+
+form.name_reserved='%s' എന്ന കലവറയുടെ പേരു് മറ്റാവശ്യങ്ങള്ക്കായി നീക്കിവച്ചിരിക്കുന്നു.
+form.name_pattern_not_allowed=കലവറനാമത്തിൽ '%s' എന്ന ശ്രേണി അനുവദനീയമല്ല.
+
+migrate_items=മൈഗ്രേഷൻ ഇനങ്ങൾ
+migrate_items_wiki=വിക്കി
+migrate_items_milestones=നാഴികക്കല്ലുകള്
+migrate_items_labels=ലേബലുകള്
+migrate_items_issues=പ്രശ്നങ്ങൾ
+migrate_items_pullrequests=ലയന അഭ്യർത്ഥനകൾ
+migrate_items_releases=പ്രസിദ്ധീകരണങ്ങള്
+migrate_repo=കലവറ മൈഗ്രേറ്റ് ചെയ്യുക
+migrate.clone_address=URL- ൽ നിന്ന് മൈഗ്രേറ്റ് / ക്ലോൺ ചെയ്യുക
+migrate.clone_address_desc=നിലവിലുള്ള ഒരു കലവറയുടെ HTTP(S) അല്ലെങ്കിൽ ഗിറ്റു് 'ക്ലോൺ' URL
+migrate.clone_local_path=അല്ലെങ്കിൽ ഒരു പ്രാദേശിക സെർവർ പാത
+migrate.permission_denied=പ്രാദേശിക കലവറകള് ഇറക്കുമതി ചെയ്യാൻ നിങ്ങള്ക്കു് അനുവാദമില്ല.
+migrate.invalid_local_path=പ്രാദേശിക പാത അസാധുവാണ്. ഇത് നിലവിലില്ല അല്ലെങ്കിൽ ഒരു ഡയറക്ടറിയല്ല.
+migrate.failed=മൈഗ്രേഷൻ പരാജയപ്പെട്ടു: %v
+migrated_from=%[2]s നിന്ന് മൈഗ്രേറ്റുചെയ്തു
+migrated_from_fake=%[1]s നിന്ന് മൈഗ്രേറ്റുചെയ്തു
+
+mirror_from=ന്റെ കണ്ണാടി
+forked_from=ല് നിന്നും വഴിപിരിഞ്ഞതു്
+fork_from_self=നിങ്ങളുടെ ഉടമസ്ഥതയിലുള്ള ഒരു ശേഖരം നിങ്ങൾക്ക് ഫോര്ക്കു് ചെയ്യാൻ കഴിയില്ല.
+fork_guest_user=ഈ ശേഖരം ഫോർക്ക് ചെയ്യുന്നതിന് സൈൻ ഇൻ ചെയ്യുക.
+unwatch=ശ്രദ്ധിക്കാതിരിയ്ക്കുക
+watch=ശ്രദ്ധിയ്ക്കുക
+unstar=നക്ഷത്രം നീക്കുക
+star=നക്ഷത്രം നല്ക്കുക
+fork=ഫോര്ക്കു്
+download_archive=കലവറ ഡൗൺലോഡുചെയ്യുക
+
+no_desc=വിവരണം ലഭ്യമല്ല
+quick_guide=ദ്രുത മാര്ഗദര്ശനം
+clone_this_repo=ഈ കലവറ ക്ലോൺ ചെയ്യുക
+create_new_repo_command=കമാൻഡ് ലൈന് വഴി ഒരു പുതിയ കലവറ സൃഷ്ടിക്കുക
+push_exist_repo=കമാൻഡ് ലൈനിൽ നിന്ന് നിലവിലുള്ള ഒരു കലവറ തള്ളിക്കയറ്റുക
+empty_message=ഈ കലവറയില് ഉള്ളടക്കമൊന്നും അടങ്ങിയിട്ടില്ല.
+
+code=കോഡ്
+code.desc=ഉറവിട കോഡ്, ഫയലുകൾ, കമ്മിറ്റുകളും ശാഖകളും പ്രവേശിയ്ക്കുക.
+branch=ശാഖ
+tree=മരം
+filter_branch_and_tag=ശാഖ അല്ലെങ്കിൽ ടാഗ് അരിച്ചെടുക്കുക
+branches=ശാഖകള്
+tags=ടാഗുകള്
+issues=പ്രശ്നങ്ങൾ
+pulls=ലയന അഭ്യർത്ഥനകൾ
+labels=ലേബലുകള്
+
+milestones=നാഴികക്കല്ലുകള്
+commits=കമ്മിറ്റുകള്
+commit=കമ്മിറ്റ്
+releases=പ്രസിദ്ധപ്പെടുത്തുക
+file_raw=കലര്പ്പില്ലാത്തതു്
+file_history=നാള്വഴി
+file_view_raw=കലര്പ്പില്ലാതെ കാണുക
+file_permalink=സ്ഥിരമായ കണ്ണി
+file_too_large=ഈ ഫയൽ കാണിക്കാൻ കഴിയാത്തത്ര വലുതാണ്.
+
+video_not_supported_in_browser=നിങ്ങളുടെ ബ്രൌസർ HTML5 'വീഡിയോ' ടാഗിനെ പിന്തുണയ്ക്കുന്നില്ല.
+audio_not_supported_in_browser=നിങ്ങളുടെ ബ്ര browser സർ HTML5 'ഓഡിയോ' ടാഗിനെ പിന്തുണയ്ക്കുന്നില്ല.
+stored_lfs=ഗിറ്റു് LFS ഉപയോഗിച്ച് സംഭരിച്ചു
+commit_graph=കമ്മിറ്റ് ഗ്രാഫ്
+blame=ചുമതല
+normal_view=സാധാരണ കാഴ്ച
+
+editor.new_file=പുതിയ ഫയൽ
+editor.upload_file=ഫയൽ അപ്ലോഡ്
+editor.edit_file=ഫയൽ തിരുത്തുക
+editor.preview_changes=മാറ്റങ്ങൾ കാണുക
+editor.cannot_edit_lfs_files=വെബ് ഇന്റർഫേസിൽ LFS ഫയലുകൾ എഡിറ്റുചെയ്യാൻ കഴിയില്ല.
+editor.cannot_edit_non_text_files=വെബ് ഇന്റർഫേസിൽ ബൈനറി ഫയലുകൾ എഡിറ്റുചെയ്യാൻ കഴിയില്ല.
+editor.edit_this_file=ഫയൽ തിരുത്തുക
+editor.must_be_on_a_branch=ഈ ഫയലിൽ മാറ്റങ്ങൾ വരുത്താനോ നിർദ്ദേശിക്കാനോ നിങ്ങൾ ഏതെങ്കിലും ഒരു ശാഖയിൽ ആയിരിക്കണം.
+editor.fork_before_edit=ഈ ഫയലിൽ മാറ്റങ്ങൾ വരുത്താനോ നിർദ്ദേശിക്കാനോ നിങ്ങൾ ഈ ശേഖരം ഫോര്ക്കു ചെയ്തിരിക്കണം.
+editor.delete_this_file=ഫയൽ ഇല്ലാതാക്കുക
+editor.must_have_write_access=ഈ ഫയലിൽ മാറ്റങ്ങൾ വരുത്താനോ നിർദ്ദേശിക്കാനോ നിങ്ങൾക്ക് എഴുതാനുള്ള അനുമതി ഉണ്ടായിരിക്കണം.
+editor.file_delete_success=%s ഫയൽ ഇല്ലാതാക്കി.
+editor.name_your_file=നിങ്ങളുടെ ഫയലിന് പേര് നൽകുക…
+editor.filename_help=ഒരു ഡയറക്ടറിയുടെ പേര് ടൈപ്പുചെയ്ത് സ്ലാഷും ('/') ചേർത്ത് ചേർക്കുക. ഇൻപുട്ട് ഫീൽഡിന്റെ തുടക്കത്തിൽ ബാക്ക്സ്പെയ്സ് ടൈപ്പുചെയ്ത് ഒരു ഡയറക്ടറി നീക്കംചെയ്യുക.
+editor.or=അഥവാ
+editor.cancel_lower=റദ്ദാക്കുക
+editor.commit_changes=മാറ്റങ്ങൾ വരുത്തുക
+editor.add_tmpl='<ഫയല്>' ചേർക്കുക
+editor.add=%s ചേര്ക്കുക
+editor.update=%s പുതുക്കുക
+editor.delete=%s നീക്കം ചെയ്യുക
+editor.propose_file_change=ഫയലിനു് മാറ്റങ്ങള് നിർദ്ദേശിക്കുക
+editor.new_branch_name_desc=പുതിയ ശാഖയുടെ പേരു്…
+editor.cancel=റദ്ദാക്കുക
+editor.filename_cannot_be_empty=ഫയലിന്റെ പേരു് ശൂന്യമായിരിക്കരുത്.
+editor.add_subdir=ഒരു ഡയറക്ടറി ചേർക്കുക…
+editor.upload_files_to_dir=ഫയലുകൾ %s ലേക്ക് അപ്ലോഡുചെയ്യുക
+
+
+
+
+
+issues.new.clear_labels=ലേബലുകൾ മായ്ക്കുക
+issues.new.milestone=നാഴികക്കല്ല്
+issues.new.no_milestone=നാഴികക്കല്ല് ഇല്ല
+issues.new.clear_milestone=നാഴികക്കല്ല് എടുത്തു മാറ്റുക
+issues.new.open_milestone=നാഴികക്കല്ലുകൾ തുറക്കുക
+issues.new.closed_milestone=അടച്ച നാഴികക്കല്ലുകൾ
+issues.new.assignees=നിശ്ചയിക്കുന്നവര്
+issues.new.clear_assignees=നിശ്ചയിക്കുന്നവരെ നീക്കം ചെയ്യുക
+issues.new.no_assignees=നിശ്ചയിക്കുന്നവര് ഇല്ല
+issues.no_ref=ശാഖാ അഥവാ ടാഗ് വ്യക്തമാക്കിയിട്ടില്ല
+issues.create=പ്രശ്നം സൃഷ്ടിക്കുക
+issues.new_label=പുതിയ അടയാളം
+issues.new_label_placeholder=അടയാള നാമം
+issues.new_label_desc_placeholder=വിരരണം
+issues.create_label=അടയാളം സൃഷ്ടിക്കുക
+issues.label_templates.title=മുൻനിശ്ചയിച്ച ഒരു കൂട്ടം ലേബലുകൾ നിറയ്ക്കുക
+issues.label_templates.info=ലേബലുകളൊന്നും ഇതുവരെ നിലവിലില്ല. 'പുതിയ ലേബൽ' ഉപയോഗിച്ച് ഒരു ലേബൽ സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മുൻനിശ്ചയിച്ച ലേബൽ സെറ്റ് ഉപയോഗിക്കുക:
+issues.label_templates.helper=ഒരു ലേബൽ സെറ്റ് തിരഞ്ഞെടുക്കുക
+issues.label_templates.use=ലേബൽ സെറ്റ് ഉപയോഗിക്കുക
+issues.deleted_milestone=`(ഇല്ലാതാക്കി)`
+issues.filter_type.all_issues=എല്ലാ ഇഷ്യൂകളും
+issues.label_open_issues=%d തുറന്നനിലയിലുള്ള ഇഷ്യൂകള്
+issues.label_deletion_desc=ഒരു ലേബൽ ഇല്ലാതാക്കിയാല്, അതു് നിയുകതമാക്കിയ എല്ലാ ഇഷ്യൂകളില് നിന്നും നീക്കംചെയ്യും. തുടരട്ടെ?
+issues.dependency.issue_close_blocks=ഈ ഇഷ്യു അടയ്ക്കുന്നത് ഇനിപ്പറയുന്ന ഇഷ്യൂകള് തടയുന്നു്
+issues.dependency.pr_close_blocks=ഈ ഇഷ്യൂകള് അടയ്ക്കുന്നത് ഈ ലയന അഭ്യര്ത്ഥന തടയുന്നു്
+issues.dependency.issue_close_blocked=ഈ ഇഷ്യൂ അടയ്ക്കുന്നതിന് മുമ്പ് ഇതിനെ തടയുന്ന എല്ലാ ഇഷ്യൂകളും നിങ്ങൾ അടയ്ക്കേണ്ടതുണ്ട്.
+issues.dependency.pr_close_blocked=ഈ ലയന അഭ്യര്ത്ഥന സ്ഥിരീകരിയ്ക്കുന്നതിനു മുമ്പ് ഇതിനെ തടയുന്ന എല്ലാ ഇഷ്യൂകളും നിങ്ങൾ അടയ്ക്കേണ്ടതുണ്ട്.
+issues.dependency.setting=ലയന അഭ്യര്ത്ഥനകള്ക്കും ഇഷ്യൂകള്ക്കുമായി ആശ്രിതത്വം സജ്ജമാക്കുക
+issues.dependency.add_error_cannot_create_circular=രണ്ട് ഇഷ്യൂകളും പരസ്പരം തടയുന്നതാകുന്നതിലൂടെ നിങ്ങൾക്ക് ഒരു ആശ്രയത്വം സൃഷ്ടിക്കാൻ കഴിയില്ല.
+issues.dependency.add_error_dep_not_same_repo=രണ്ട് പ്രശ്നങ്ങളും ഒരേ കലവറയിലേതു് ആയിരിക്കണം.
+
+
+
+
+; %[2]s %[3]s
+
+
+
+
+
+milestones.filter_sort.most_issues=മിക്ക ഇഷ്യൂകളും
+milestones.filter_sort.least_issues=കുറഞ്ഞ ഇഷ്യൂകളെങ്കിലും
+
+
+
+
+activity.active_issues_count_n=%d സജ്ജീവ ഇഷ്യൂകള്
+activity.closed_issues_count_n=അടച്ച ഇഷ്യൂകള്
+activity.title.issues_n=%d ഇഷ്യൂകള്
+activity.new_issues_count_n=പുതിയ ഇഷ്യൂകള്
+
+
+settings.event_issues=ഇഷ്യൂകള്
+
+
+
+
+
+
+
+
+
+[org]
+
+
+
+
+
+
+
+[admin]
+
+
+
+
+
+repos.issues=ഇഷ്യൂകള്
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[action]
+
+[tool]
+
+[dropzone]
+
+[notification]
+
+[gpg]
+
+[units]
+
+[packages]
+
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 399e42de29..49704a7c7a 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -67,7 +67,7 @@ your_settings=Instellingen
all=Alles
sources=Bronnen
-mirrors=Spiegels
+mirrors=Mirrors
collaborative=Samenwerkend
forks=Forks
@@ -158,6 +158,8 @@ filter.not_archived = Niet gearchiveerd
more_items = Meer items
invalid_data = Ongeldige data: %v
copy_generic = Kopieer naar klembord
+test = Test
+error413 = U heeft al uw quotum opgebruikt.
[aria]
navbar = Navigatiebalk
@@ -189,6 +191,8 @@ buttons.enable_monospace_font = Lettertype monospace inschakelen
buttons.italic.tooltip = Schuingedrukte tekst toevoegen
buttons.list.task.tooltip = Een lijst met taken toevoegen
buttons.disable_monospace_font = Lettertype monospace uitschakelen
+buttons.indent.tooltip = Items één niveau lager plaatsen
+buttons.unindent.tooltip = Items één niveau hoger plaatsen
[filter]
string.asc = A - Z
@@ -207,7 +211,7 @@ server_internal = Interne serverfout
app_desc=Een eenvoudige, self-hosted Git service
install=Makkelijk te installeren
platform=Cross-platform
-platform_desc=Forgejo werkt op alles waar Go op kan compileren: Windows, macOS, Linux, ARM, etc. Kies het platform dat bij je past!
+platform_desc=Forgejo draait op libre-besturingssystemen zoals Linux en FreeBSD en op verschillende CPU-architecturen. Kies degene waar u van houdt!
lightweight=Lichtgewicht
lightweight_desc=Forgejo heeft hele lage systeemeisen, je kunt Forgejo al draaien op een goedkope Raspberry Pi!
license=Open Source
@@ -232,7 +236,7 @@ path=Pad
sqlite_helper=Bestandspad voor de SQLite3-database. Vul een volledig pad in als je Forgejo als een service uitvoert.
reinstall_error=U probeert te installeren in een bestaande Forgejo database
reinstall_confirm_message=Herinstalleren met een bestaande Forgejo-database kan meerdere problemen veroorzaken. In de meeste gevallen kun je het bestaande "app.ini" gebruiken om Forgejo te laten draaien. Als je weet wat je aan het doen bent, bevestig dan het volgende:
-reinstall_confirm_check_1=De gegevens versleuteld door de SECRET_KEY in de app.ini kan verloren gaan: gebruikers kunnen mogelijk niet meer inloggen met 2FA/OTP & spiegels werken mogelijk niet meer. Door dit vakje aan te vinken bevestigt u dat het huidige app.ini bestand de juiste SECRET_KEY bevat.
+reinstall_confirm_check_1=De gegevens versleuteld door de SECRET_KEY in de app.ini kan verloren gaan: gebruikers kunnen mogelijk niet meer inloggen met 2FA/OTP & mirrors werken mogelijk niet meer. Door dit vakje aan te vinken bevestigt u dat het huidige app.ini bestand de juiste SECRET_KEY bevat.
reinstall_confirm_check_2=De repositories en instellingen moeten mogelijk opnieuw worden gesynchroniseerd. Door dit vakje aan te vinken, bevestigt u dat u de hooks voor de repositories en authorized_keys bestand handmatig zult hersynchroniseren. U bevestigt dat u ervoor zult zorgen dat de instellingen van de repository en mirror correct zijn.
reinstall_confirm_check_3=Je bevestigt dat je er absoluut zeker van bent dat deze Forgejo draait met de juiste app. Geen locatie en dat je zeker weet dat je opnieuw moet installeren. Je bevestigt dat je de hierbovenstaande risico's erkent.
err_empty_db_path=SQLite3 database pad mag niet leeg zijn.
@@ -274,20 +278,20 @@ register_confirm=E-mailbevestiging vereist bij registreren
mail_notify=Activeer e-mailnotificaties
server_service_title=Server en service-instellingen van derden
offline_mode=Lokale modus inschakelen
-offline_mode.description=Schakel third-party content uit en gebruik alleen lokale middelen.
+offline_mode.description=Schakel content delivery netwerken van derden uit en serveer alle middelen lokaal.
disable_gravatar=Gravatar uitschakelen
disable_gravatar.description=Gravatar en derden avatar bronnen uitschakelen. Een standaard avatar zal worden gebruikt, tenzij een gebruiker hun eigen avatar uploadt naar de instantie.
federated_avatar_lookup=Federated avatars toestaan
federated_avatar_lookup.description=Zoek avatars op met Libravatar.
disable_registration=Schakel zelf registratie uit
-disable_registration.description=Schakel zelfregistratie uit, alleen admins kunnen accounts maken.
-allow_only_external_registration.description=Registratie alleen via externe diensten toestaan
+disable_registration.description=Alleen instantiebeheerders kunnen nieuwe gebruikersaccounts aanmaken. Het wordt sterk aangeraden om registratie uitgeschakeld te houden, tenzij je van plan bent om een publieke instantie voor iedereen te hosten en klaar bent om grote hoeveelheden spam-accounts te verwerken.
+allow_only_external_registration.description=Gebruikers kunnen alleen nieuwe accounts aanmaken via geconfigureerde externe services.
openid_signin=OpenID-inloggen inschakelen
-openid_signin.description=Gebruikerslogin via OpenID inschakelen.
+openid_signin.description=Laat gebruikers zich aanmelden via OpenID.
openid_signup=OpenID zelf-registratie inschakelen
-openid_signup.description=OpenID zelfregistratie inschakelen.
+openid_signup.description=Sta gebruikers toe om accounts aan te maken via OpenID als zelfregistratie is ingeschakeld.
enable_captcha=Registratie CAPTCHA inschakelen
-enable_captcha.description=Vereis captcha validatie voor zelf-registratie van gebruiker.
+enable_captcha.description=Gebruikers verplichten om CAPTCHA te passeren om accounts aan te maken.
require_sign_in_view=Aanmelden vereist om inhoud van instantie te bekijken
admin_setting.description=Het creëren van een administrator-account is optioneel. De eerste geregistreerde gebruiker wordt automatisch de beheerder.
admin_title=Instellingen beheerdersaccount
@@ -308,11 +312,11 @@ save_config_failed=Kan de configuratie niet opslaan: %v
invalid_admin_setting=Instelling van de administrator-account is ongeldig: %v
invalid_log_root_path=Ongeldig log-pad: %v
default_keep_email_private=Verberg standaard alle e-mailadressen
-default_keep_email_private.description=Verberg standaard de email-adressen van nieuwe gebruikers.
+default_keep_email_private.description=Schakel het verbergen van e-mailadressen standaard in voor nieuwe gebruikers, zodat deze informatie niet meteen na het aanmelden uitlekt.
default_allow_create_organization=Standaard toestaan om organisaties aan te maken
-default_allow_create_organization.description=Standaard toestaan dat nieuwe gebruikers organisaties kunnen aanmaken.
+default_allow_create_organization.description=Sta nieuwe gebruikers standaard toe om organisaties aan te maken. Als deze optie is uitgeschakeld, moet een beheerder nieuwe gebruikers toestemming geven om organisaties aan te maken.
default_enable_timetracking=Tijdregistratie standaard inschakelen
-default_enable_timetracking.description=Tijdsregistratie voor nieuwe repositories standaard inschakelen.
+default_enable_timetracking.description=Sta het gebruik van de tijd-tracking functie voor nieuwe repositories standaard toe.
no_reply_address=Verborgen e-maildomein
no_reply_address_helper=Domeinnaam voor gebruikers met een verborgen e-mailadres. Bijvoorbeeld zal de gebruikersnaam "joe" in Git worden geregistreerd als "joe@noreply.example.org" als het verborgen email domein is ingesteld op "noreply.example.org".
password_algorithm=Wachtwoord hash-algoritme
@@ -324,7 +328,7 @@ enable_update_checker = Updatecontrole inschakelen
invalid_password_algorithm = Ongeldig wachtwoord hash-algoritme
password_algorithm_helper = Stel het hashing-algoritme voor wachtwoorden in. De algoritmes hebben verschillende vereisten en sterkte. Het argon2-algoritme is tamelijk veilig, maar gebruikt veel geheugen en kan ongeschikt zijn voor kleine systemen.
run_user_helper = De gebruikersnaam van het besturingssysteem waaronder Forgejo draait. Merk op dat deze gebruiker toegang moet hebben tot de hoofdmap van de repository.
-require_sign_in_view.description = Beperk de toegang tot de pagina's tot ingelogde gebruikers. Bezoekers zien alleen de aanmeldings- en registratiepagina's.
+require_sign_in_view.description = Beperk de inhoudstoegang tot aangemelde gebruikers. Bezoekers kunnen alleen de verificatiepagina's bezoeken.
enable_update_checker_helper_forgejo = Het zal periodiek controleren op nieuwe Forgejo-versies door een TXT DNS-record op release.forgejo.org te controleren.
smtp_from_invalid = Het adres "E-mails versturen als" is ongeldig
config_location_hint = Deze configuratieopties worden opgeslagen in:
@@ -402,12 +406,12 @@ allow_password_change=Verplicht de gebruiker om zijn/haar wachtwoord te wijzigen
reset_password_mail_sent_prompt=Een bevestigingsmail is verstuurd naar %s. Controleer uw inbox in de volgende %s om het herstel van uw account te voltooien.
active_your_account=Activeer uw account
account_activated=Account is geactiveerd
-prohibit_login=Inloggen niet toegestaan
+prohibit_login=Account is geschorst
resent_limit_prompt=Sorry, je hebt te snel na elkaar een aanvraag gedaan voor een activatiemail. Wacht drie minuten voor je volgende aanvraag.
has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (%s). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop.
resend_mail=Klik hier om uw activatie mail nog een keer te verzenden
email_not_associate=Dit emailadres is niet gekoppeld aan een account.
-send_reset_mail=Stuur account herstel e-mail
+send_reset_mail=Verzend e-mail voor herstel
reset_password=Account herstel
invalid_code=Uw bevestigingscode is ongeldig of is verlopen.
reset_password_helper=Account herstellen
@@ -446,7 +450,7 @@ authorize_title=Autoriseer "%s" voor toegang tot uw account?
authorization_failed=Autorisatie mislukt
sspi_auth_failed=SSPI-authenticatie mislukt
password_pwned_err=Kan het verzoek om HaveIBeenPwned niet voltooien
-prohibit_login_desc = Het is verboden om aan te melden met dit account. Neem contact op met de beheerder van je site.
+prohibit_login_desc = Uw account is geschorst voor interactie met de instantie. Neem contact op met de beheerder van de instantie om weer toegang te krijgen.
change_unconfirmed_email_error = Kan het e-mailadres niet wijzigen: %v
sign_up_successful = Account succesvol aangemaakt. Welkom!
change_unconfirmed_email = Als je tijdens de registratie een verkeerd e-mailadres hebt opgegeven, kun je dit hieronder wijzigen. Er wordt dan een bevestiging naar het nieuwe e-mailadres gestuurd.
@@ -461,6 +465,11 @@ authorization_failed_desc = De autorisatie is mislukt omdat we een ongeldig verz
remember_me.compromised = De login-sleutel is niet meer geldig, dit kan wijzen op een gecompromitteerd account. Controleer uw account voor verdachte activiteiten.
tab_signin = Inloggen
tab_signup = Aanmelden
+hint_login = Heb je al een account? Nu aanmelden!
+hint_register = Heb je een account nodig? Registreer nu.
+sign_up_button = Registreer nu.
+back_to_sign_in = Terug naar aanmelden
+sign_in_openid = Ga verder met OpenID
[mail]
view_it_on=Bekijk het op %s
@@ -475,7 +484,7 @@ activate_account.text_2=Klik op de volgende link om uw account te activeren binn
activate_email=Verifieer uw e-mailadres
activate_email.text=Klik op de volgende link om je e-mailadres te bevestigen in %s:
-register_notify=Welkom bij Forgejo
+register_notify_prev9=Welkom bij Forgejo
register_notify.title=%[1]s, welkom bij %[2]s
register_notify.text_1=dit is uw registratie bevestigingsemail voor %s!
register_notify.text_2=U kunt zich aanmelden bij uw account met uw gebruikersnaam: %s
@@ -529,6 +538,22 @@ team_invite.text_3 = Merk op: Deze uitnodiging was bestemd voor %[1]s. Als u dez
team_invite.text_1 = %[1]s heeft u een uitnodiging gestuurd om aan het team %[2]s in de organisatie %[3]s deel te nemen.
team_invite.text_2 = Klik alstublieft op de volgende link om aan het team deel te nemen:
admin.new_user.text = Klik hier om deze gebruiker te beheren vanuit het beheerderspaneel.
+password_change.subject = Uw wachtwoord is gewijzigd
+password_change.text_1 = Het wachtwoord voor je account is zojuist gewijzigd.
+reset_password.text_1 =
+totp_disabled.subject = TOTP is uitgeschakeld
+primary_mail_change.subject = Uw primaire e-mail is gewijzigd
+totp_disabled.no_2fa = Er zijn geen andere 2FA methodes meer geconfigureerd, wat betekent dat het niet langer nodig is om in te loggen op uw account met 2FA.
+removed_security_key.no_2fa = Er zijn geen andere 2FA methodes meer geconfigureerd, wat betekent dat het niet langer nodig is om in te loggen op uw account met 2FA.
+account_security_caution.text_1 = Als u dit was, dan kun u deze mail gerust negeren.
+totp_disabled.text_1 = Tijdgebaseerd eenmalig wachtwoord (TOTP) op uw account is zojuist uitgeschakeld.
+primary_mail_change.text_1 = Het primaire e-mailadres van uw account is zojuist gewijzigd in %[1]s. Dit betekent dat dit e-mailadres niet langer e-mailmeldingen voor uw account zal ontvangen.
+removed_security_key.subject = Een beveiligingssleutel is verwijderd
+removed_security_key.text_1 = Beveiligingssleutel “%[1]s” is zojuist verwijderd van uw account.
+account_security_caution.text_2 = Als u dit niet was, is uw account gecompromitteerd. Neem contact op met de beheerders van deze site.
+totp_enrolled.text_1.no_webauthn = U heeft zojuist TOTP ingeschakeld voor uw account. Dit betekent dat u voor alle toekomstige aanmeldingen op uw account TOTP moet gebruiken als 2FA-methode.
+totp_enrolled.subject = U heeft TOTP geactiveerd als 2FA methode
+totp_enrolled.text_1.has_webauthn = U heeft zojuist TOTP ingeschakeld voor uw account. Dit betekent dat je voor alle toekomstige aanmeldingen op uw account TOTP kunt gebruiken als 2FA-methode of een van uw beveiligingssleutels kunt gebruiken.
[modal]
@@ -659,10 +684,10 @@ user_bio=Biografie
disabled_public_activity=Deze gebruiker heeft de publieke zichtbaarheid van de activiteit uitgeschakeld.
block_user = Blokkeer gebruiker
joined_on = Geregistreerd op %s
-block_user.detail_1 = Deze gebruiker zal u ontvolgen.
-block_user.detail = Begrijp alsjeblieft dat als u deze gebruiker blokkeert, er andere acties worden genomen. Zoals:
-block_user.detail_2 = Deze gebruiker kan geen interactie hebben met repositories, gecreëerde issues en reacties.
-block_user.detail_3 = Deze gebruiker kunt u niet toevoegen als samenwerker, noch kunt u hen toevoegen als samenwerker.
+block_user.detail_1 = Jullie zullen elkaar niet meer volgen en zullen elkaar niet meer kunnen volgen.
+block_user.detail = Merk op dat het blokkeren van een gebruiker andere effecten heeft, zoals:
+block_user.detail_2 = Deze gebruiker kan geen interactie hebben met de repositories waarvan jij de eigenaar bent, of met de issues en berichten die je hebt aangemaakt.
+block_user.detail_3 = Je zult elkaar niet kunnen toevoegen als samenwerker.
follow_blocked_user = U kunt deze gebruiker niet volgen, omdat u hen geblokkeerd heeft en of deze gebruiker heeft u geblokkeerd.
block = Blokkeren
unblock = Deblokkeren
@@ -680,6 +705,10 @@ followers.title.few = Volgers
following.title.one = Volgend
following.title.few = Volgend
followers.title.one = Volger
+public_activity.visibility_hint.self_public = Uw activiteiten zijn zichtbaar voor iedereen, behalve voor interacties in privéruimtes. Configureer.
+public_activity.visibility_hint.admin_public = Deze activiteit is zichtbaar voor iedereen, maar als beheerder kun je ook interacties in privéruimtes zien.
+public_activity.visibility_hint.self_private = Uw activiteiten zijn alleen zichtbaar voor jou en de beheerders van de instantie. Configureer.
+public_activity.visibility_hint.admin_private = Deze activiteit is zichtbaar voor u omdat u een beheerder bent, maar de gebruiker wil dat het privé blijft.
[settings]
@@ -692,11 +721,11 @@ avatar=Profielfoto
ssh_gpg_keys=SSH / GPG sleutels
social=Sociale netwerk-accounts
applications=Applicaties
-orgs=Beheer organisaties
+orgs=Organisaties
repos=Repositories
delete=Verwijder account
twofa=Twee-factor authenticatie (TOTP)
-account_link=Gekoppelde Accounts
+account_link=Gekoppelde accounts
organization=Organisaties
webauthn=Twee-factor authenticatie (Beveiligingssleutels)
@@ -753,8 +782,8 @@ password_change_disabled=Niet-lokale gebruikers kunnen hun wachtwoord niet in de
emails=E-mailadressen
manage_emails=E-mailadressen beheren
-manage_themes=Selecteer standaardthema
-manage_openid=Beheer OpenID-adressen
+manage_themes=Standaardthema
+manage_openid=OpenID-adressen
theme_desc=Dit zal het standaardthema worden op de gehele site.
primary=Primair
activated=Geactiveerd
@@ -794,7 +823,7 @@ add_new_key=SSH sleutel toevoegen
add_new_gpg_key=GPG sleutel toevoegen
key_content_ssh_placeholder=Begint met "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", of "sk-ssh-ed25519@openssh.com"
key_content_gpg_placeholder=Begint met "-----BEGIN PGP PUBLIC KEY BLOCK-----"
-add_new_principal=Verantwoordelijke toevoegen
+add_new_principal=Principaal toevoegen
ssh_key_been_used=Deze SSH-sleutel is al toegevoegd aan de server.
ssh_key_name_used=Er bestaat al een SSH sleutel met dezelfde naam in uw account.
ssh_principal_been_used=Deze verantwoordelijke is al toegevoegd aan de server.
@@ -821,7 +850,7 @@ ssh_token=Token
ssh_token_help=U kunt een handtekening genereren door het volgende:
ssh_token_signature=Gepantserde SSH handtekening
key_signature_ssh_placeholder=Begint met "-----BEGIN SSH SIGNATURE-----"
-subkeys=Subkeys
+subkeys=Subsleutels
key_id=Key-ID
key_name=Sleutel naam
key_content=Inhoud
@@ -846,12 +875,12 @@ token_state_desc=Dit token werd gebruikt in de laatste 7 dagen
principal_state_desc=Deze verantwoordelijke werd gebruikt in de laatste 7 dagen
show_openid=Tonen op profiel
hide_openid=Verbergen van profiel
-ssh_disabled=SSH uitgeschakeld
+ssh_disabled=SSH is uitgeschakeld
ssh_externally_managed=Deze SSH sleutel wordt extern beheerd voor deze gebruiker
manage_social=Beheer gekoppelde sociale accounts
unbind=Ontkoppelen
-manage_access_token=Beheer toegangstokens
+manage_access_token=Toegangstokens
generate_new_token=Nieuw token genereren
tokens_desc=Deze tokens geven toegang tot je account via de API van Forgejo.
token_name=Tokennaam
@@ -911,7 +940,7 @@ webauthn_nickname=Bijnaam
webauthn_delete_key=Verwijder beveiligingssleutel
webauthn_delete_key_desc=Als u een beveiligingssleutel verwijdert, kunt u er niet meer mee inloggen. Doorgaan?
-manage_account_links=Gekoppelde accounts beheren
+manage_account_links=Gekoppelde accounts
manage_account_links_desc=Deze externe accounts zijn gekoppeld aan je Forgejo-account.
account_links_not_available=Er zijn momenteel geen externe accounts aan je Forgejo-account gelinkt.
link_account=Account koppelen
@@ -975,7 +1004,7 @@ at_least_one_permission = Je moet minstens één machtiging kiezen om een token
permission_write = Lees en schrijf
oauth2_client_secret_hint = Dit geheim zal niet meer worden getoond nadat u deze pagina heeft verlaten of vernieuwd. Zorg ervoor dat u het heeft opgeslagen.
revoke_oauth2_grant_success = Toegang succesvol ingetrokken.
-keep_email_private_popup = Dit zal uw e-mailadres verbergen van uw profielpagina en ook wanneer u een web-gebaseerde Git-operatie uitvoert. Gepushte commits zullen niet aangepast worden. Gebruik %s in commits om deze met uw account te associëren.
+keep_email_private_popup = Dit zal je e-mailadres verbergen van uw profielpagina. Het zal niet langer de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads en bewerkingen, en het zal niet gebruikt worden voor samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits met je account te associëren. Merk op dat het veranderen van deze optie geen effect heeft op bestaande commits.
create_oauth2_application_success = U heeft met succes een OAuth2 applicatie gecreëerd.
permissions_access_all = Alle (publiek, privé en gelimiteerd)
oauth2_application_remove_description = Door een OAuth2-applicatie te verwijderen, krijgt deze geen toegang meer tot geautoriseerde gebruikersaccounts op deze instantie. Doorgaan?
@@ -999,7 +1028,7 @@ hidden_comment_types.issue_ref_tooltip = Reacties waarbij de gebruiker de branch
oauth2_redirect_uris = Omleiding URI's. Gebruik een nieuwe regel voor elke URI.
oauth2_application_locked = Forgejo registreert sommige OAuth2 applicaties vooraf bij het opstarten als dit is ingeschakeld in de configuratie. Om onverwacht gedrag te voorkomen, kunnen deze niet bewerkt of verwijderd worden. Raadpleeg de OAuth2 documentatie voor meer informatie.
change_password = Wachtwoord bijwerken
-additional_repo_units_hint = Stimuleer het inschakelen van extra repositorie units
+additional_repo_units_hint = Stel voor om extra repositorie units in te schakelen
update_hints = Tips bijwerken
update_hints_success = Tips zijn bijgewerkt.
hints = Tips
@@ -1008,6 +1037,9 @@ pronouns = Persoonlijke voornaamwoord
pronouns_custom = Aangepast
pronouns_unspecified = Ongedefinieerd
language.title = Standaard taal
+keep_activity_private.description = Uw publieke activiteit zal alleen zichtbaar zijn voor u en de beheerders van de instantie.
+language.description = Deze taal wordt opgeslagen in uw account en wordt als standaardtaal gebruikt nadat u zich heeft aangemeld.
+language.localization_project = Help ons Forgejo in uw taal te vertalen! Leer meer.
[repo]
owner=Eigenaar
@@ -1016,13 +1048,13 @@ repo_name=Naam van repository
repo_name_helper=Goede repository-namen zijn kort, makkelijk te onthouden en uniek.
repo_size=Repositorygrootte
template=Sjabloon
-template_select=Selecteer een sjabloon.
+template_select=Selecteer een sjabloon
template_helper=Maak template van repository
template_description=Sjabloon repositories laten gebruikers nieuwe repositories genereren met dezelfde directory structuur, bestanden en optionele instellingen.
visibility=Zichtbaarheid
visibility_description=Alleen de eigenaar of de organisatielid kan het zien als ze rechten hebben.
visibility_helper_forced=De sitebeheerder verplicht alle repositories om privé te zijn.
-visibility_fork_helper=(Als je dit wijzigt, heeft dit invloed op de zichtbaarheid van alle forks).
+visibility_fork_helper=(Als u dit wijzigt, heeft dit invloed op de zichtbaarheid van alle forks.)
clone_helper=Heb je hulp nodig om te clonen? Bekijk dan de handleiding.
fork_repo=Repository forken
fork_from=Fork van
@@ -1039,15 +1071,15 @@ generate_from=Genereer van
repo_desc=Omschrijving
repo_desc_helper=Voer korte beschrijving in (optioneel)
repo_lang=Taal
-repo_gitignore_helper=Selecteer .gitignore templates.
+repo_gitignore_helper=Selecteer .gitignore sjabloons
repo_gitignore_helper_desc=Kies welke bestanden niet bij te houden vanuit een lijst met sjablonen voor alledaagse talen. Gebruikelijke artefacten gegenereerd door de build tools van elke taal zijn standaard inbegrepen met .gitignore.
-issue_labels=Issue labels
-issue_labels_helper=Selecteer een issuelabelset.
+issue_labels=Labels
+issue_labels_helper=Selecteer een labelset
license=Licentie
-license_helper=Selecteer een licentie bestand.
+license_helper=Selecteer een licentie bestand
license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie Kies een licentie.
readme=README
-readme_helper=Selecteer een README-bestandssjabloon.
+readme_helper=Selecteer een README-bestandssjabloon
readme_helper_desc=Dit is de plek waar je een volledige beschrijving van je project kunt schrijven.
auto_init=Initialiseer repository (voegt .gitignore, License en README toe)
trust_model_helper=Selecteer het vertrouwensmodel voor handtekeningverificatie. Mogelijke opties zijn:
@@ -1074,7 +1106,7 @@ mirror_password_placeholder=(Ongewijzigd)
mirror_password_blank_placeholder=(Niet ingesteld)
mirror_password_help=Wijzig de gebruikersnaam om een opgeslagen wachtwoord te wissen.
watchers=Volgers
-stargazers=Stargazers
+stargazers=Sterrenkijkers
forks=Forks
reactions_more=en %d meer
unit_disabled=De sitebeheerder heeft deze repositorie sectie uitgeschakeld.
@@ -1122,7 +1154,7 @@ form.reach_limit_of_creation_n=U heeft al uw limiet van %d repositories bereikt.
need_auth=Autorisatie
migrate_options=Migratie opties
migrate_service=Migratie service
-migrate_options_mirror_helper=Deze repositorie zal een spiegel zijn
+migrate_options_mirror_helper=Deze repositorie zal een mirror zijn
migrate_options_lfs=Migreer LFS bestanden
migrate_options_lfs_endpoint.label=LFS eindpunt
migrate_options_lfs_endpoint.description=Migratie zal proberen om je Git remote te gebruiken om de LFS-server te bepalen. Je kan ook een aangepast eindpunt opgeven als de LFS-gegevens ergens anders zijn opgeslagen.
@@ -1221,8 +1253,8 @@ file_view_rendered=Weergave weergeven
file_view_raw=Weergave ruw bestand
file_permalink=Permalink
file_too_large=Dit bestand is te groot om te tonen.
-invisible_runes_line=`Deze lijn heeft onzichtbare unicode karakters`
-ambiguous_runes_line=`Deze lijn heeft dubbelzinnige unicode karakters`
+invisible_runes_line=`Deze lijn heeft onzichtbare Unicode karakters`
+ambiguous_runes_line=`Deze lijn heeft dubbelzinnige Unicode karakters`
ambiguous_character=`%[1]c [U+%04[1]X] is verwarrend met %[2]c [U+%04[2]X]`
escape_control_characters=Escape
@@ -1232,6 +1264,7 @@ view_git_blame=Bekijk git blame
video_not_supported_in_browser=Uw browser ondersteunt de HTML5 "video" element niet.
audio_not_supported_in_browser=Uw browser ondersteunt de HTML5 "audio" element niet.
stored_lfs=Opgeslagen met Git LFS
+stored_annex=Opgeslagen met Git Annex
symbolic_link=Symbolische link
commit_graph=Commit grafiek
commit_graph.select=Selecteer branches
@@ -1250,6 +1283,7 @@ editor.upload_file=Upload bestand
editor.edit_file=Bewerk bestand
editor.preview_changes=Voorbeeld tonen
editor.cannot_edit_lfs_files=LFS-bestanden kunnen niet worden bewerkt in de webinterface.
+editor.cannot_edit_annex_files=Annex-bestanden kunnen niet worden bewerkt in de webinterface.
editor.cannot_edit_non_text_files=Binaire bestanden kunnen niet worden bewerkt in de webinterface.
editor.edit_this_file=Bewerk bestand
editor.this_file_locked=Bestand is vergrendeld
@@ -1266,7 +1300,7 @@ editor.commit_changes=Wijzigingen doorvoeren
editor.add_tmpl="" toevoegen
editor.patch=Patch toepassen
editor.patching=Patchen:
-editor.new_patch=Nieuwe Patch
+editor.new_patch=Nieuwe patch
editor.commit_message_desc=Voeg een optionele uitgebreide omschrijving toe…
editor.signoff_desc=Voeg een Signed-off-by toe aan het einde van het commit logbericht.
editor.commit_directly_to_this_branch=Commit direct naar de branch '%s'.
@@ -1474,7 +1508,7 @@ issues.reopened_at=`heropende dit probleem %[2]s
issues.commit_ref_at=`verwees naar dit probleem vanuit commit %[2]s'`
issues.ref_issue_from=`refereerde aan dit issue %[4]s%[2]s`
issues.ref_pull_from=`refereerde aan deze pull request %[4]s%[2]s`
-issues.ref_closing_from=`verwees naar een pull request %[4]s dat het issue zal sluiten%[2]s`
+issues.ref_closing_from=`verwees naar deze issue van een pull request %[4]s dat het zal sluiten, %[2]s`
issues.ref_reopening_from=`verwees naar een pull request %[4]s dat dit issue heropent%[2]s `
issues.ref_closed_from=`sloot dit issue %[4]s%[2]s`
issues.ref_reopened_from=`heropende dit issue %[4]s%[2]s`
@@ -1613,7 +1647,7 @@ issues.review.remove_review_request=beoordelingsaanvraag voor %s %s verwijderd
issues.review.remove_review_request_self=beoordeling geweigerd %s
issues.review.pending=In behandeling
issues.review.review=Review
-issues.review.reviewers=Reviewers
+issues.review.reviewers=Beoordelaars
issues.review.outdated=Verouderd
issues.review.show_outdated=Toon verouderd
issues.review.hide_outdated=Verouderde verbergen
@@ -1790,7 +1824,7 @@ wiki.last_commit_info=%s heeft deze pagina aangepast %s
wiki.edit_page_button=Bewerken
wiki.new_page_button=Nieuwe pagina
wiki.file_revision=Pagina revisie
-wiki.wiki_page_revisions=Herzieningen wiki pagina
+wiki.wiki_page_revisions=Pagina revisies
wiki.back_to_wiki=Terug naar wiki-pagina
wiki.delete_page_button=Verwijder pagina
wiki.page_already_exists=Er bestaat al een wiki-pagina met deze naam.
@@ -1808,8 +1842,8 @@ activity.period.quarterly=3 maanden
activity.period.semiyearly=6 maanden
activity.period.yearly=1 jaar
activity.overview=Overzicht
-activity.active_prs_count_1=%d actieve pull requests
-activity.active_prs_count_n=%d Actieve pull requests
+activity.active_prs_count_1=%d actieve pull request
+activity.active_prs_count_n=%d actieve pull requests
activity.merged_prs_count_1=Samengevoegde pull request
activity.merged_prs_count_n=Samengevoegde pull requests
activity.opened_prs_count_1=Voorgestelde pull request
@@ -1841,7 +1875,7 @@ activity.unresolved_conv_label=Open
activity.title.releases_1=%d release
activity.title.releases_n=%d releases
activity.title.releases_published_by=%s gepubliceerd door %s
-activity.published_release_label=Gepubliceerd
+activity.published_release_label=Release
activity.no_git_activity=Er is in deze periode geen sprake geweest van een commit activiteit.
activity.git_stats_exclude_merges=Exclusief merges,
activity.git_stats_author_1=%d auteur
@@ -1892,12 +1926,12 @@ settings.mirror_settings.direction=Richting
settings.mirror_settings.direction.pull=Pull
settings.mirror_settings.direction.push=Push
settings.mirror_settings.last_update=Laatst bijgewerkt
-settings.mirror_settings.push_mirror.none=Geen spiegels geconfigureerd
+settings.mirror_settings.push_mirror.none=Geen push mirrors geconfigureerd
settings.mirror_settings.push_mirror.add=Push mirror toevoegen
settings.sync_mirror=Nu synchroniseren
settings.site=Website
-settings.update_settings=Instellingen bewerken
+settings.update_settings=Instellingen opslaan
settings.branches.update_default_branch=Standaard branch bewerken
settings.advanced_settings=Geavanceerde instellingen
settings.wiki_desc=Repository-wiki inschakelen
@@ -2080,7 +2114,7 @@ settings.protected_branch=Branch bescherming
settings.protected_branch_can_push=Push toestaan?
settings.protected_branch_can_push_yes=U mag pushen
settings.protected_branch_can_push_no=U mag niet pushen
-settings.branch_protection=Branch bescherming voor branch "%s"
+settings.branch_protection=Beschermingsregels voor branch “%s”
settings.protect_this_branch=Branch bescherming inschakelen
settings.protect_this_branch_desc=Voorkomt verwijdering en beperkt Git pushing en samenvoegen tot de branch.
settings.protect_disable_push=Push uitschakelen
@@ -2145,7 +2179,7 @@ settings.archive.button=Repo archiveren
settings.archive.header=Archiveer deze repo
settings.archive.success=De repo is succesvol gearchiveerd.
settings.archive.error=Er is een fout opgetreden tijdens het archiveren van de repo. Zie het logboek voor meer informatie.
-settings.archive.error_ismirror=U kunt geen gespiegelde repo archiveren.
+settings.archive.error_ismirror=U kunt geen gespiegelde repository archiveren.
settings.archive.branchsettings_unavailable=Branch instellingen zijn niet beschikbaar als de repo is gearchiveerd.
settings.archive.tagsettings_unavailable=Labelinstellingen zijn niet beschikbaar als de repo is gearchiveerd.
settings.update_avatar_success=De repository avatar is bijgewerkt.
@@ -2153,7 +2187,7 @@ settings.lfs=LFS
settings.lfs_filelist=LFS bestanden opgeslagen in deze repository
settings.lfs_no_lfs_files=Geen LFS bestanden opgeslagen in deze repository
settings.lfs_findcommits=Vind commits
-settings.lfs_lfs_file_no_commits=Geen Commits gevonden voor dit LFS-bestand
+settings.lfs_lfs_file_no_commits=Geen commits gevonden voor dit LFS-bestand
settings.lfs_noattribute=Dit pad heeft niet het vergrendelbare attribuut in de standaard branch
settings.lfs_delete=LFS-bestand met OID %s verwijderen
settings.lfs_delete_warning=Het verwijderen van een LFS bestand kan leiden tot "object bestaat niet" fouten bij het uitchecken. Weet u het zeker?
@@ -2164,13 +2198,13 @@ settings.lfs_invalid_lock_directory=Kan map %s niet vergrendelen
settings.lfs_lock_already_exists=Vergrendeling bestaat al: %s
settings.lfs_lock=Vergrendel
settings.lfs_lock_path=Bestandspad om te vergrendelen...
-settings.lfs_locks_no_locks=Geen Locks
+settings.lfs_locks_no_locks=Geen locks
settings.lfs_lock_file_no_exist=Vergrendeld bestand bestaat niet in de standaard branch
settings.lfs_force_unlock=Forceer ontgrendelen
settings.lfs_pointers.found=%d blob-pointer(s) gevonden - %d gekoppeld, %d niet-gekoppeld (%d ontbreekt in de winkel)
-settings.lfs_pointers.sha=Blob SHA
+settings.lfs_pointers.sha=Blob hash
settings.lfs_pointers.oid=OID
-settings.lfs_pointers.inRepo=In Repository
+settings.lfs_pointers.inRepo=In repository
settings.lfs_pointers.exists=Bestaat in opslag
settings.lfs_pointers.accessible=Toegankelijk voor gebruiker
settings.lfs_pointers.associateAccessible=Koppel toegankelijke %d OIDs
@@ -2220,7 +2254,7 @@ diff.comment.add_single_comment=Één reactie toevoegen
diff.comment.add_review_comment=Voeg commentaar toe
diff.comment.start_review=Review starten
diff.comment.reply=Reageer
-diff.review=Review
+diff.review=Beoordeling voltooien
diff.review.header=Review versturen
diff.review.placeholder=Commentaar controleren
diff.review.comment=Opmerking
@@ -2239,7 +2273,7 @@ release.detail=Release details
release.tags=Labels
release.new_release=Nieuwe release
release.draft=Concept
-release.prerelease=Voorlopige versie
+release.prerelease=Voorlopige release
release.stable=Stabiel
release.compare=Vergelijk
release.edit=bewerken
@@ -2249,14 +2283,14 @@ release.source_code=Broncode
release.tag_name=Tagnaam
release.target=Doel
release.tag_helper=Kies een bestaande tag, of creëer een nieuwe tag bij publiceren.
-release.prerelease_desc=Markeren als voorlopige versie
+release.prerelease_desc=Markeren als voorlopige release
release.prerelease_helper=Markeer deze release als ongeschikt voor productiedoeleinden.
release.cancel=Annuleren
release.publish=Release publiceren
release.save_draft=Concept opslaan
-release.edit_release=Update release
-release.delete_release=Verwijder release
-release.deletion=Verwijder release
+release.edit_release=Release bijwerken
+release.delete_release=Release verwijderen
+release.deletion=Release verwijderen
release.deletion_success=De release is verwijderd.
release.tag_name_already_exist=Een versie met deze naam bestaat al.
release.tag_name_invalid=Tagnaam is niet geldig.
@@ -2306,7 +2340,7 @@ fork_no_valid_owners = Deze repository kan niet geforkt worden omdat er geen gel
visibility_helper = Maak repository privé
clone_in_vscodium = Kloon in VSCodium
object_format = Objectformaat
-object_format_helper = Objectformaat van de repository. Dit kan niet worden veranderd. SHA1 is het meest compatibel.
+object_format_helper = Objectformaat van de repository. Kan later niet worden gewijzigd. SHA1 is het meest compatibel.
mirror_sync = gesynchroniseerd
branch.delete_branch_has_new_commits = Branch "%s" kan niet verwijderd worden omdat er nieuwe commits zijn toegevoegd na het samenvoegen.
branch.create_success = Branch "%s" is gecreëerd.
@@ -2336,7 +2370,7 @@ branch.new_branch_from = Creëer nieuwe branch van "%s"
branch.renamed = Branch %s is hernoemd naar %s.
tag.create_success = Tag "%s" is gecreëerd.
topic.format_prompt = Onderwerpen moeten beginnen met een letter of cijfer, kunnen streepjes ("-") en puntjes (".") bevatten en mogen maximaal 35 tekens lang zijn. Letters moeten kleine letters zijn.
-find_file.go_to_file = Ga naar bestand
+find_file.go_to_file = Zoek een bestand
find_file.no_matching = Geen overeenkomstige bestanden gevonden
error.csv.too_large = Kan dit bestand niet renderen omdat het te groot is.
error.csv.unexpected = Kan dit bestand niet renderen omdat het een onverwacht karakter bevat in regel %d en kolom %d.
@@ -2405,7 +2439,7 @@ issues.role.collaborator_helper = Deze gebruiker is uitgenodigd om mee te werken
issues.role.first_time_contributor = Eerste keer bijdrager
issues.role.first_time_contributor_helper = Dit is de eerste bijdrage van deze gebruiker aan de repository.
issues.role.contributor = Bijdrager
-issues.role.contributor_helper = Deze gebruiker heeft al eerder gecommitteerd in de repository.
+issues.role.contributor_helper = Deze gebruiker heeft al eerder gecommitteerd in deze repository.
issues.label_exclusive = Exclusief
issues.label_archive = Label archiveren
issues.label_exclusive_warning = Eventuele conflicterende scoped labels worden verwijderd bij het bewerken van de labels van een issue of pull request.
@@ -2429,7 +2463,7 @@ tree_path_not_found_commit = Pad %[1]s bestaat niet in commit %[2]s
tree_path_not_found_tag = Pad %[1]s bestaat niet in tag %[2]s
transfer.no_permission_to_reject = Je hebt geen rechten om deze overdracht af te wijzen.
settings.transfer_owner = Nieuwe eigenaar
-mirror_address_protocol_invalid = De opgegeven URL is ongeldig. Alleen http(s):// of git:// locaties kunnen gebruikt worden voor spiegeling.
+mirror_address_protocol_invalid = De opgegeven URL is ongeldig. Alleen http(s):// of git:// locaties kunnen gebruikt worden voor spiegelen.
archive.title = Deze repo is gearchiveerd. Je kunt bestanden bekijken en klonen, maar geen issues of pull requests pushen of openen.
archive.title_date = Deze repository is gearchiveerd op %s. Je kunt bestanden bekijken en klonen, maar je kunt niet pushen of issues of pull requests openen.
migrate_options_lfs_endpoint.placeholder = Als dit leeg gelaten wordt, zal het eindpunt afgeleid worden van de kloon URL
@@ -2485,7 +2519,7 @@ wiki.page_content = Pagine inhoud
wiki.cancel = Annuleren
settings.projects_desc = Repository projecten inschakelen
settings.admin_code_indexer = Code indexeerder
-settings.admin_indexer_commit_sha = Laatst geïndexeerde SHA
+settings.admin_indexer_commit_sha = Laatst geïndexeerde commit
settings.reindex_button = Toevoegen aan herindexeringswachtrij
settings.reindex_requested = Herindexering aangevraagd
settings.danger_zone = Gevaren zone
@@ -2505,7 +2539,7 @@ editor.update = %s bijwerken
projects.column.unset_default_desc = Maak deze kolom ongedaan als standaard
pulls.showing_only_single_commit = Alleen veranderingen tonen van commit %[1]s
pulls.blocked_by_changed_protected_files_1 = Dit pull request is geblokkeerd omdat het een beveiligd bestand wijzigt:
-signing.wont_sign.nokey = Er is geen sleutel beschikbaar om deze commit te ondertekenen.
+signing.wont_sign.nokey = Deze instantie heeft geen sleutel om deze commmit mee te ondertekenen.
settings.admin_enable_close_issues_via_commit_in_any_branch = Sluit een issue via een commit gedaan in een niet standaard branch
stars_remove_warning = Hiermee worden alle sterren uit deze repository verwijderd.
tree_path_not_found_branch = Pad %[1]s bestaat niet in branch %[2]s
@@ -2544,7 +2578,7 @@ issues.action_check = Aanvinken/uitvinken
issues.dependency.issue_batch_close_blocked = Het is niet mogelijk om de issues die u gekozen heeft in bulk te sluiten, omdat issue #%d nog open afhankelijkheden heeft
pulls.review_only_possible_for_full_diff = Beoordeling is alleen mogelijk bij het bekijken van de volledige diff
pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %[2]s`
-pulls.cmd_instruction_hint = `Bekijk opdrachtregelinstructies.`
+pulls.cmd_instruction_hint = Bekijk opdrachtregelinstructies
pulls.cmd_instruction_checkout_desc = Vanuit uw project repository, schakel over naar een nieuwe branch en test de veranderingen.
pulls.showing_specified_commit_range = Alleen veranderingen weergeven tussen %[1]s..%[2]s
pulls.reopen_failed.base_branch = De pull request kan niet worden heropend, omdat de base branch niet meer bestaat.
@@ -2573,9 +2607,9 @@ release.tag_helper_existing = Bestaande tag.
release.title = Releasetitel
release.title_empty = Titel kan niet leeg zijn.
release.message = Beschrijf deze release
-release.delete_tag = Verwijder Tag
+release.delete_tag = Tag verwijderen
release.add_tag_msg = Gebruik de titel en inhoud van de release als bericht.
-release.add_tag = Alleen Tag Aanmaken
+release.add_tag = Tag aanmaken
release.releases_for = Releases voor %s
release.tags_for = Tags voor %s
branch.delete = Branch "%s" verwijderen
@@ -2606,7 +2640,7 @@ settings.tracker_issue_style.regexp_pattern_desc = De eerste groep wordt gebruik
settings.admin_indexer_unindexed = Niet-geïndexeerd
settings.admin_enable_health_check = Repository gezondheidscontroles inschakelen (git fsck)
settings.admin_settings = Beheerdersinstellingen
-settings.actions_desc = Repository acties inschakelen
+settings.actions_desc = Geïntegreerde CI/CD-pijplijnen met Forgejo Actions inschakelen
settings.releases_desc = Repository releases inschakelen
settings.pulls.default_delete_branch_after_merge = Verwijder standaard pull request branch na samenvoegen
settings.pulls.allow_rebase_update = Het bijwerken van een pull request branch door rebase inschakelen
@@ -2616,7 +2650,7 @@ settings.trust_model.default.desc = Gebruik de standaard repository vertrouwensm
settings.signing_settings = Instellingen voor verificatie van ondertekening
settings.wiki_branch_rename_success = De branch naam van de repository wiki is succesvol genormaliseerd.
settings.wiki_rename_branch_main_notices_1 = Deze bewerking KAN NIET ongedaan worden gemaakt.
-settings.wiki_rename_branch_main_desc = Hernoem de branch die intern door de Wiki wordt gebruikt naar "%s". Dit is permanent en kan niet ongedaan gemaakt worden.
+settings.wiki_rename_branch_main_desc = Hernoem de branch die intern door de Wiki wordt gebruikt naar "%s". Deze verandering is permanent en kan niet ongedaan worden gemaakt.
settings.add_collaborator_owner = Kan geen eigenaar toevoegen als samenwerker.
settings.update_settings_no_unit = De repository moet op zijn minst enige vorm van interactie toestaan.
settings.authorization_header = Autorisatie-header
@@ -2668,7 +2702,7 @@ settings.mirror_settings.docs.doc_link_title = Hoe kan ik repositories spiegelen
settings.mirror_settings.docs.pull_mirror_instructions = Raadpleeg voor het instellen van een pull mirror:
settings.mirror_settings.docs.more_information_if_disabled = Hier vindt u meer informatie over duw- en pull mirrors:
settings.mirror_settings.docs.pulling_remote_title = Pullen uit een externe repository
-settings.mirror_settings.pushed_repository = Pushed repository
+settings.mirror_settings.pushed_repository = Gepusht repository
settings.units.units = Repository-eenheden
settings.mirror_settings.push_mirror.remote_url = Git externe repository URL
settings.units.overview = Overzicht
@@ -2711,7 +2745,7 @@ commits.search_branch = Deze branch
pulls.merged_title_desc_one = heeft %[1]d commit van %[2]s samengevoegd in %[3]s %[4]s
pulls.ready_for_review = Klaar voor een beoordeling?
editor.push_out_of_date = De push lijkt verouderd.
-editor.commit_id_not_matching = De commit ID komt niet overeen met degene die je aan het bewerken was. Committeer naar een nieuwe branch en voeg dan samen.
+editor.commit_id_not_matching = Het bestand is gewijzigd terwijl je het aan het bewerken was. Committeer naar een nieuwe branch en voeg dan samen.
settings.rename_branch_failed_protected = Kan branch %s niet hernoemen omdat het een beschermde branch is.
stars = Sterren
n_commit_few = %s commits
@@ -2737,8 +2771,8 @@ settings.federation_following_repos = URLs van de volgende repositories. Geschei
settings.federation_settings = Federatie instellingen
settings.federation_apapiurl = Federatie URL van deze repository. Kopiër en plak dit in de federatie instellingen van een andere repository als een URL van de volgende repository.
settings.federation_not_enabled = Federatie is niet ingeschakeld voor deze instantie.
-subscribe.issue.guest.tooltip = Log in om dit issue te volgen.
-subscribe.pull.guest.tooltip = Log in om dit pull request te volgen.
+subscribe.issue.guest.tooltip = Log in om deze issue te volgen.
+subscribe.pull.guest.tooltip = Log in om deze pull request te volgen.
settings.transfer.modal.title = Eigendom overdragen
settings.transfer.button = Eigendom overdragen
settings.graphql_url = GraphQL URL
@@ -2750,6 +2784,28 @@ settings.sourcehut_builds.visibility = Job zichtbaarheid
settings.sourcehut_builds.manifest_path = Bouw manifestpad
n_release_one = %s release
n_release_few = %s releases
+issues.author.tooltip.issue = Deze gebruiker is de auteur van deze issue.
+issues.author.tooltip.pr = Deze gebruiker is de auteur van deze pull request.
+settings.matrix.room_id_helper = De kamer-ID kan worden opgehaald uit de Element webclient > Kamerinstellingen > Geavanceerd > Interne ruimte ID. Voorbeeld: %s.
+issues.edit.already_changed = Kan wijzigingen in deze issue niet opslaan. Het lijkt erop dat de inhoud al is gewijzigd door een andere gebruiker. Vernieuw de pagina en probeer opnieuw te bewerken om te voorkomen dat hun wijzigingen worden overschreven
+pulls.edit.already_changed = Kan wijzigingen in deze pull request niet opslaan. Het lijkt erop dat de inhoud al is gewijzigd door een andere gebruiker. Vernieuw de pagina en probeer opnieuw te bewerken om te voorkomen dat hun wijzigingen worden overschreven
+comments.edit.already_changed = Kan wijzigingen in deze reactie niet opslaan. Het lijkt erop dat de inhoud al is gewijzigd door een andere gebruiker. Vernieuw de pagina en probeer opnieuw te bewerken om te voorkomen dat hun wijzigingen worden overschreven
+settings.sourcehut_builds.secrets_helper = Geef de job toegang tot de bouwgeheimen (SECRETS:RO toekenning vereist)
+settings.add_webhook.invalid_path = Het pad mag geen deel bevatten dat "." of ".." of de lege tekenreeks is. Het kan niet beginnen of eindigen met een schuine streep.
+settings.matrix.access_token_helper = Het is aanbevolen om hiervoor een speciale Matrix-account in te stellen. Het toegangstoken kan worden opgehaald via de Element webclient (in een besloten/incognito tabblad) > Gebruikersmenu (linksboven) > Instellingen > Hulp & Info > Geavanceerd > Toegangstoken (onder de Homeserver URL). Sluit het privé/incognito tabblad (uitloggen maakt de token ongeldig).
+settings.sourcehut_builds.access_token_helper = Toegangstoken met JOBS:RW toekenning. Genereer een builds.sr.ht token of een builds.sr.ht token met toegang voor geheimen op meta.sr.ht.
+activity.commit = Commit activiteit
+milestones.filter_sort.name = Naam
+release.type_external_asset = Externe asset
+release.asset_name = Asset naam
+release.asset_external_url = Externe URL
+release.invalid_external_url = Ongeldige externe URL: “%s”
+release.type_attachment = Bijlage
+release.add_external_asset = Externe asset toevoegen
+activity.published_prerelease_label = Pre-versie
+activity.published_tag_label = Tag
+settings.pull_mirror_sync_quota_exceeded = Quotum overschreden, wijzigingen worden niet doorgevoerd.
+settings.transfer_quota_exceeded = De nieuwe eigenaar (%s) is over hun quotum heen. De repository is niet overgedragen.
@@ -2807,9 +2863,9 @@ settings.labels_desc=Voeg labels toe die kunnen worden gebruikt bij problemen vo
members.membership_visibility=Zichtbaarheid lidmaatschap:
members.public=Zichtbaar
-members.public_helper=verborgen maken
+members.public_helper=Verborgen maken
members.private=Verborgen
-members.private_helper=maak zichtbaar
+members.private_helper=Maak zichtbaar
members.member_role=Rol van lid:
members.owner=Eigenaar
members.member=Lid
@@ -2865,8 +2921,8 @@ form.name_pattern_not_allowed = Het patroon "%s' is niet toegestaan in een organ
settings.email = Contact e-mail
settings.change_orgname_redirect_prompt = De oude naam zal worden omgeleid tot het wordt geclaimd.
members.remove.detail = %[1]s van %[2]s verwijderen?
-members.leave.detail = %s verlaten?
-teams.leave.detail = %s verlaten?
+members.leave.detail = Weet u zeker dat je organisatie "%s" wilt verlaten?
+teams.leave.detail = Weet u zeker dat je team “%s” wilt verlaten?
teams.general_access_helper = De machtigingen van de leden zullen worden vastgesteld door middel van de onderstaande tabel.
teams.write_access = Schrijf
teams.invite_team_member = Uitnodigen tot %s
@@ -2973,7 +3029,7 @@ users.repos=Repos
users.created=Aangemaakt
users.last_login=Laatste keer ingelogd
users.never_login=Nooit ingelogd
-users.send_register_notify=Stuur gebruikersregistratie notificatie
+users.send_register_notify=Via e-mail informeren over registratie
users.edit=Bewerken
users.auth_source=Authenticatiebron
users.local=Lokaal
@@ -2983,10 +3039,10 @@ users.update_profile_success=Het gebruikersaccount is bijgewerkt.
users.edit_account=Wijzig gebruikers account
users.max_repo_creation=Maximale aantal repositories
users.max_repo_creation_desc=(Zet op -1 om de globale limiet te gebruiken)
-users.is_activated=Gebruikersaccount is geactiveerd
-users.prohibit_login=Inloggen uitschakelen
-users.is_admin=Is beheerder
-users.is_restricted=Is beperkt
+users.is_activated=Geactiveerd account
+users.prohibit_login=Geschorst account
+users.is_admin=Beheerdersaccount
+users.is_restricted=Beperkte account
users.allow_git_hook=Mag Git hooks maken
users.allow_git_hook_tooltip=Git hooks worden uitgevoerd als de OS-gebruiker die Forgejo uitvoert en zal hetzelfde niveau van host toegang hebben. Als gevolg daarvan hebben gebruikers met dit speciale Git hook privilege toegang tot alle Forgejo repositories en de door Forgejo gebruikte database. Zij zijn dus ook in staat om Forgejo beheerdersprivileges te verkrijgen.
users.allow_import_local=Mag lokale repositories importeren
@@ -3022,7 +3078,7 @@ orgs.new_orga=Nieuwe organisatie
repos.repo_manage_panel=Repositories beheren
repos.unadopted=Niet-geadopteerde repositories
-repos.unadopted.no_more=Geen niet-geadopteerde repositories meer gevonden
+repos.unadopted.no_more=Geen niet-geadopteerde repositories gevonden.
repos.owner=Eigenaar
repos.name=Naam
repos.private=Prive
@@ -3232,7 +3288,7 @@ config.git_max_diff_lines=Max diff regels per bestand
config.git_max_diff_files=Max. getoonde diff-bestanden
config.git_gc_args=GC-argumenten
config.git_migrate_timeout=Migratie time-out
-config.git_mirror_timeout=Time-out spiegelupdate
+config.git_mirror_timeout=Time-out mirror update
config.git_clone_timeout=Kloon operatie timeout
config.git_pull_timeout=Pull operatie timeout
config.git_gc_timeout=GC operatie timeout
@@ -3308,7 +3364,7 @@ users.list_status_filter.not_prohibit_login = Inloggen toestaan
users.list_status_filter.is_2fa_enabled = 2FA ingeschakeld
users.details = Gebruikersgegevens
emails.change_email_text = Weet je zeker dat je dit e-mailadres wilt bijwerken?
-repos.lfs_size = LFS Grootte
+repos.lfs_size = LFS grootte
packages.package_manage_panel = Pakketten beheren
packages.total_size = Totale grootte: %s
packages.unreferenced_size = Grootte waarnaar niet wordt verwezen: %s
@@ -3344,17 +3400,17 @@ dashboard.sync_repo_tags = Tags synchroniseren van git data naar database
dashboard.cleanup_hook_task_table = Tabel hook_task opschonen
dashboard.cleanup_packages = Verlopen pakketten opschonen
dashboard.cleanup_actions = Verlopen logs en artefacten van actions opschonen
-dashboard.delete_old_actions.started = Het verwijderen van alle oude acties uit de database is gestart.
+dashboard.delete_old_actions.started = Het verwijderen van alle oude activiteiten uit de database is gestart.
dashboard.update_checker = Update checker
dashboard.stop_zombie_tasks = Zombietaken stoppen
dashboard.stop_endless_tasks = Eindeloze taken stoppen
dashboard.start_schedule_tasks = Start geplande taken
-dashboard.sync_branch.started = Branches synchroniseren is gestart
-dashboard.sync_tag.started = Tags synchroniseren is gestart
+dashboard.sync_branch.started = Branch synchronisatie is gestart
+dashboard.sync_tag.started = Tag synchronisatie is gestart
auths.attribute_avatar = Avatar attribuut
auths.enable_ldap_groups = LDAP-groepen inschakelen
auths.ms_ad_sa = MS AD zoekattributen
-dashboard.delete_old_actions = Verwijder alle oude acties uit de database
+dashboard.delete_old_actions = Verwijder alle oude activiteiten uit de database
identity_access = Identiteit & toegang
assets = Code assets
auths.helo_hostname_helper = Hostnaam verzonden met HELO. Laat leeg om huidige hostnaam te versturen.
@@ -3423,6 +3479,20 @@ config.open_with_editor_app_help = De "Openen met" editors voor het kloonmenu. A
auths.tip.gitlab_new = Registreer een nieuwe applicatie op https://gitlab.com/-/profile/applications
config.app_slogan = Instantie slogan
auths.default_domain_name = Standaarddomeinnaam die voor het e-mailadres wordt gebruikt
+config.cache_test = Test cache
+config.cache_test_succeeded = Cache test succesvol, kreeg een antwoord in %s.
+users.activated.description = Voltooiing van e-mailverificatie. De eigenaar van een niet-geactiveerd account kan zich pas aanmelden nadat de e-mailverificatie is voltooid.
+users.block.description = Blokkeer deze gebruiker voor interactie met deze service via zijn account en verbied het aanmelden.
+users.admin.description = Geef deze gebruiker volledige toegang tot alle beheerfuncties die beschikbaar zijn via de web UI en de API.
+users.restricted.description = Sta alleen interactie toe met de repositories en organisaties waar deze gebruiker als samenwerker is toegevoegd. Dit voorkomt toegang tot openbare repositories op deze instantie.
+users.local_import.description = Sta het importeren van repositories vanaf het lokale bestandssysteem van de server toe. Dit kan een beveiligingsprobleem zijn.
+users.organization_creation.description = Sta het aanmaken van nieuwe organisaties toe.
+config.cache_test_failed = Het is niet gelukt om de cache te peilen: %v.
+config.cache_test_slow = Cache-test geslaagd, maar reactie is traag: %s.
+emails.delete_desc = Weet u zeker dat u deze e-mailadres wilt verwijderen?
+emails.delete_primary_email_error = U kunt de primaire e-mail niet verwijderen.
+emails.delete = E-mail verwijderen
+emails.deletion_success = Het e-mailadres is verwijderd.
[action]
@@ -3438,13 +3508,13 @@ comment_issue = `gaf reactie op issue %[3]s#%[2]s`
comment_pull = `gaf reactie op pull request %[3]s#%[2]s`
merge_pull_request = `pull request samengevoegd %[3]s#%[2]s`
push_tag = tag %[3]s gepusht naar %[4]s
-mirror_sync_create = nieuwe referentie gesynchroniseerd naar %[3]s op %[4]s van spiegel
+mirror_sync_create = nieuwe referentie gesynchroniseerd naar %[3]s op %[4]s van mirror
approve_pull_request = `goedgekeurd %[3]s#%[2]s`
reopen_pull_request = `heropend pull request %[3]s#%[2]s`
close_pull_request = `sloot pull request %[3]s#%[2]s`
-mirror_sync_delete = gesynchroniseerde en verwijderde referentie %[2]s op %[3]s van spiegel
+mirror_sync_delete = gesynchroniseerde en verwijderde referentie %[2]s op %[3]s van mirror
auto_merge_pull_request = `pull request automatisch samengevoegd %[3]s#%[2]s`
-mirror_sync_push = commits gesynchroniseerd naar %[3]s op %[4]s van spiegel
+mirror_sync_push = commits gesynchroniseerd naar %[3]s op %[4]s van mirror
review_dismissed_reason = Reden:
commit_repo = gepusht naar %[3]s bij %[4]s
create_issue = `opent issue %[3]s#%[2]s`
@@ -3455,7 +3525,7 @@ reject_pull_request = `stelde wijzigingen voor %[3]s#%[2]s`
review_dismissed = `heeft beoordeling van %[4]s voor %[3]s#%[2]s afgewezen`
create_branch = heeft de branch %[3]s gemaakt in %[4]s
watched_repo = begon te kijken naar %[2]s
-publish_release = `released "%[4]s" op %[3]s`
+publish_release = `released %[4]s op %[3]s`
starred_repo = heeft %[2]s een star gegeven
[tool]
@@ -3608,7 +3678,7 @@ owner.settings.cargo.rebuild = Index herbouwen
owner.settings.cargo.rebuild.description = Heropbouwen kan nuttig zijn als de index niet is gesynchroniseerd met de opgeslagen Cargo pakketten.
owner.settings.cargo.rebuild.error = Mislukt om Cargo index te herbouwen: %v
owner.settings.cargo.rebuild.success = De Cargo index is met succes opnieuw opgebouwd.
-owner.settings.cleanuprules.title = Opschoonregels beheren
+owner.settings.cleanuprules.title = Opschoonregels
owner.settings.cleanuprules.add = Regel voor opschonen toevoegen
owner.settings.cleanuprules.edit = Regel voor opschonen bewerken
owner.settings.cleanuprules.preview = Voorbeeld opruimregel
@@ -3667,6 +3737,22 @@ versions.view_all = Alles weergeven
filter.type.all = Alle
owner.settings.cargo.rebuild.no_index = Kan niet herbouwen, er is geen index geïnitialiseerd.
npm.dependencies.bundle = Gebundelde dependencies
+arch.version.depends = Afhankelijk van
+arch.pacman.helper.gpg = Vertrouwenscertificaat toevoegen voor pacman:
+arch.pacman.repo.multi = %s heeft dezelfde versie in verschillende distributies.
+arch.pacman.repo.multi.item = Configuratie voor %s
+arch.pacman.conf = Voeg server met gerelateerde distributie en architectuur toe aan /etc/pacman.conf :
+arch.pacman.sync = Synchroniseer pakket met pacman:
+arch.version.properties = Versie-eigenschappen
+arch.version.description = Beschrijving
+arch.version.provides = Biedt
+arch.version.groups = Groep
+arch.version.optdepends = Optioneel is afhankelijk van
+arch.version.checkdepends = Controleer is afhankelijk van
+arch.version.conflicts = Conflicten
+arch.version.replaces = Vervangt
+arch.version.backup = Back-up
+arch.version.makedepends = Maken is afhankelijk van
[secrets]
secrets = Geheimen
@@ -3761,7 +3847,7 @@ runs.actors_no_select = Alle acteurs
runs.status_no_select = Alle statussen
runs.no_results = Geen resultaten gevonden.
runs.no_workflows = Er zijn nog geen workflows.
-unit.desc = Beheer actions
+unit.desc = Beheer geïntegreerde CI/CD-pijplijnen met Forgejo Actions
runs.no_workflows.documentation = Voor meer informatie over Forgejo acties, zie de documentatie.
workflow.disable_success = Workflow "%s" is succesvol uitgeschakeld.
variables.none = Er zijn nog geen variabelen.
@@ -3774,6 +3860,13 @@ runs.no_matching_online_runner_helper = Geen overeenkomende online runner met la
runs.workflow = Workflow
runs.no_job_without_needs = De workflow moet ten minste één taak zonder afhankelijkheden bevatten.
runs.no_job = De workflow moet minimaal één job bevatten
+workflow.dispatch.trigger_found = Deze workflow heeft een workflow_dispatch event trigger.
+workflow.dispatch.success = Workflow-run is met succes aangevraagd.
+workflow.dispatch.use_from = Gebruik workflow van
+workflow.dispatch.run = Workflow uitvoeren
+workflow.dispatch.warn_input_limit = Alleen de eerste %d invoeren worden weergegeven.
+workflow.dispatch.invalid_input_type = Ongeldig invoertype “%s”.
+workflow.dispatch.input_required = Waarde vereist voor invoer “%s”.
@@ -3829,6 +3922,9 @@ exact = Exact
exact_tooltip = Bevat alleen resultaten die de exacte zoekterm bevatten
issue_kind = Zoek issues...
pull_kind = Zoek pulls...
+union = Trefwoorden
+union_tooltip = Neem resultaten op die overeenkomen met een van de trefwoorden gescheiden door spaties
+milestone_kind = Zoek mijlpalen...
[munits.data]
b = B
@@ -3843,3 +3939,7 @@ pib = PiB
filepreview.line = Lijn %[1]d in %[2]s
filepreview.lines = Lijnen %[1]d naar %[2]d in %[3]s
filepreview.truncated = Voorbeeld is ingekort
+
+
+[translation_meta]
+test = Oké
\ No newline at end of file
diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini
index f2bc34d711..837d8c0a30 100644
--- a/options/locale/locale_pl-PL.ini
+++ b/options/locale/locale_pl-PL.ini
@@ -157,6 +157,7 @@ filter.is_archived = Zarchiwizowane
filter.is_mirror = Kopie lustrzane
more_items = Więcej elementów
filter.is_fork = Forki
+test = Test
[aria]
navbar = Pasek nawigacji
@@ -466,7 +467,7 @@ activate_account.text_2=Kliknij poniższy link, aby aktywować swoje konto w ci
activate_email=Potwierdź swój adres e-mail
activate_email.text=Aby zweryfikować swój adres e-mail, w ciągu następnych %s kliknij poniższy link:
-register_notify=Witamy w Forgejo
+register_notify_prev9=Witamy w Forgejo
register_notify.title=%[1]s, witaj w %[2]s
register_notify.text_1=to jest Twój e-mail z potwierdzeniem rejestracji dla %s!
register_notify.text_2=Możesz teraz zalogować się za pomocą nazwy użytkownika: %s
@@ -523,6 +524,7 @@ yes=Tak
no=Nie
cancel=Anuluj
modify=Aktualizuj
+confirm = Potwierdź
[form]
UserName=Nazwa użytkownika
@@ -613,6 +615,7 @@ follow=Obserwuj
unfollow=Przestań obserwować
user_bio=Biografia
disabled_public_activity=Ten użytkownik wyłączył publiczne wyświetlanie jego aktywności.
+code = Kod
[settings]
@@ -845,6 +848,17 @@ visibility=Widoczność użytkownika
visibility.public=Publiczny
visibility.limited=Ograniczony
visibility.private=Prywatny
+uid = UID
+comment_type_group_label = Etykieta
+comment_type_group_milestone = Kamień milowy
+comment_type_group_assignee = Przypisanie
+comment_type_group_branch = Gałąź
+comment_type_group_deadline = Termin
+comment_type_group_project = Projekt
+comment_type_group_reference = Odniesienie
+webauthn_nickname = Pseudonim
+comment_type_group_dependency = Zależność
+permissions_list = Uprawnienia:
[repo]
owner=Właściciel
@@ -1046,6 +1060,7 @@ file_copy_permalink=Kopiuj bezpośredni odnośnik
video_not_supported_in_browser=Twoja przeglądarka nie obsługuje znacznika HTML5 "video".
audio_not_supported_in_browser=Twoja przeglądarka nie obsługuje znacznika HTML5 "audio".
stored_lfs=Przechowane za pomocą Git LFS
+stored_annex=Przechowane za pomocą Git Annex
symbolic_link=Dowiązanie symboliczne
commit_graph=Wykres commitów
commit_graph.select=Wybierz gałęzie
@@ -1063,6 +1078,7 @@ editor.upload_file=Wyślij plik
editor.edit_file=Edytuj plik
editor.preview_changes=Podgląd zmian
editor.cannot_edit_lfs_files=Pliki LFS nie mogą być edytowane poprzez interfejs przeglądarkowy.
+editor.cannot_edit_annex_files=Pliki Annex nie mogą być edytowane poprzez interfejs przeglądarkowy.
editor.cannot_edit_non_text_files=Pliki binarne nie mogą być edytowane poprzez interfejs przeglądarkowy.
editor.edit_this_file=Edytuj plik
editor.this_file_locked=Plik jest zablokowany
@@ -2025,6 +2041,39 @@ topic.count_prompt=Nie możesz wybrać więcej, niż 25 tematów
error.csv.too_large=Nie można wyświetlić tego pliku, ponieważ jest on zbyt duży.
error.csv.unexpected=Nie można renderować tego pliku, ponieważ zawiera nieoczekiwany znak w wierszu %d i kolumnie %d.
error.csv.invalid_field_count=Nie można renderować tego pliku, ponieważ ma nieprawidłową liczbę pól w wierszu %d.
+settings.admin_indexer_unindexed = Nieindeksowane
+settings.web_hook_name_forgejo = Forgejo
+issues.filter_poster = Autor
+issues.content_history.options = Opcje
+issues.content_history.deleted = usunięto
+issues.content_history.created = utworzono
+editor.patching = Łatanie:
+settings.web_hook_name_gogs = Gogs
+desc.sha256 = SHA256
+commitstatus.failure = Awaria
+settings.protect_status_check_matched = Dopasowano
+settings.web_hook_name_slack = Slack
+settings.web_hook_name_dingtalk = DingTalk
+commitstatus.success = Sukces
+wiki.cancel = Anuluj
+settings.web_hook_name_packagist = Packagist
+settings.web_hook_name_telegram = Telegram
+settings.event_package = Pakiet
+settings.web_hook_name_discord = Discord
+settings.web_hook_name_matrix = Matrix
+settings.protect_patterns = Szablony
+default_branch_label = domyślnie
+issues.author = Autor
+commit.operations = Operacje
+commit.revert = Odwróć
+pull.deleted_branch = (usunięto):%s
+diff.vendored = dostarczono
+from_comment = (komentarz)
+issues.filter_project = Projekt
+mirror_sync = zsynchronizowano
+settings.web_hook_name_gitea = Gitea
+packages = Pakiety
+actions = Akcje
[graphs]
@@ -2133,6 +2182,8 @@ teams.all_repositories_helper=Zespół ma dostęp do wszystkich repozytoriów. W
teams.all_repositories_read_permission_desc=Ten zespół nadaje uprawnienie Odczytu do wszystkich repozytoriów: jego członkowie mogą wyświetlać i klonować repozytoria.
teams.all_repositories_write_permission_desc=Ten zespół nadaje uprawnienie Zapisu do wszystkich repozytoriów: jego członkowie mogą odczytywać i przesyłać do repozytoriów.
teams.all_repositories_admin_permission_desc=Ten zespół nadaje uprawnienia Administratora do wszystkich repozytoriów: jego członkowie mogą odczytywać, przesyłać oraz dodawać innych współtwórców do repozytoriów.
+teams.write_access = Zapis
+code = Kod
[admin]
dashboard=Pulpit
@@ -2553,6 +2604,20 @@ notices.type_2=Zadanie
notices.desc=Opis
notices.op=Operacja
notices.delete_success=Powiadomienia systemu zostały usunięte.
+monitor.last_execution_result = Wynik
+monitor.process.children = Dzieci
+integrations = Integracje
+users.bot = Bot
+users.list_status_filter.menu_text = Filtr
+packages.version = Wersja
+packages.creator = Twórca
+users.list_status_filter.not_active = Nieaktywne
+notices.operations = Operacje
+config.send_test_mail_submit = Wyślij
+packages.published = Opublikowane
+config.mailer_protocol = Protokół
+monitor.stats = Statystyki
+users.remote = Zdalnie
[action]
@@ -2603,6 +2668,7 @@ pin=Przypnij powiadomienie
mark_as_read=Oznacz jako przeczytane
mark_as_unread=Oznacz jak nieprzeczytane
mark_all_as_read=Oznacz wszystkie jako przeczytane
+subscriptions = Subskrybcje
[gpg]
default_key=Podpisano domyślnym kluczem
@@ -2618,6 +2684,7 @@ error.probable_bad_default_signature=OSTRZEŻENIE! Pomimo, że domyślny klucz p
[units]
error.no_unit_allowed_repo=Nie masz uprawnień do żadnej sekcji tego repozytorium.
error.unit_not_allowed=Nie masz uprawnień do tej sekcji repozytorium.
+unit = Jednostka
[packages]
filter.type=Typ
@@ -2625,6 +2692,23 @@ alpine.repository.branches=Gałęzie
alpine.repository.repositories=Repozytoria
conan.details.repository=Repozytorium
owner.settings.cleanuprules.enabled=Włączone
+alpine.repository.architectures = Architektury
+container.details.platform = Platforma
+requirements = Wymagania
+keywords = Słowa kluczowe
+versions = Wersje
+dependency.id = ID
+dependency.version = Wersja
+details.author = Autor
+filter.type.all = Wszystko
+filter.container.tagged = Oznaczone
+details.license = Licencja
+installation = Instalacja
+composer.dependencies = Zależności
+filter.container.untagged = Nieoznaczone
+title = Pakiety
+dependencies = Zależności
+details = Szczegóły
[secrets]
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 1778c865be..f2edd3c283 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -24,7 +24,7 @@ signed_in_as=Sessão iniciada como
enable_javascript=Este site requer JavaScript.
toc=Índice
licenses=Licenças
-return_to_forgejo=Volte para Forgejo
+return_to_forgejo=Retornar ao Forgejo
username=Nome de usuário
email=Endereço de e-mail
@@ -89,7 +89,7 @@ add=Adicionar
add_all=Adicionar todos
remove=Remover
remove_all=Excluir todos
-remove_label_str=`Remover item "%s"`
+remove_label_str=Remover item "%s"
edit=Editar
enabled=Habilitado
@@ -157,7 +157,7 @@ filter.not_archived = Não arquivado
filter.not_fork = Sem forks
filter.not_mirror = Sem espelhos
filter.not_template = Sem modelos
-copy_generic = Copiar para área de transferência
+copy_generic = Copiar para a área de transferência
[aria]
navbar=Barra de navegação
@@ -456,9 +456,9 @@ password_pwned=A senha que você escolheu faz parte de uma %s:
-register_notify=Bem-vindo ao Forgejo
+register_notify_prev9=Bem-vindo ao Forgejo
register_notify.title=%[1]s, bem-vindo(a) a %[2]s
register_notify.text_1=este é o seu e-mail de confirmação de registro para %s!
register_notify.text_2=Você pode fazer login em sua conta utilizando o usuário: %s
@@ -631,7 +631,7 @@ target_branch_not_exist=O branch de destino não existe.
username_error_no_dots = ` pode conter apenas caracteres alfanuméricos ("0-9, "a-z", "A-Z"), hífens ("-") e traços inferiores ("_"). Não é permitido conter caracteres não alfanuméricos no início ou fim. Caracteres não alfanuméricos consecutivos também não são permitidos.`
admin_cannot_delete_self = Você não pode excluir a si mesmo quando você é um administrador. Por favor, remova suas permissões de administrador primeiro.
AccessToken = Token de acesso
-To = Nome do Branch
+To = Nome do ramo
Website = Site
Pronouns = Pronomes
Biography = Biografia
@@ -671,7 +671,7 @@ block_user = Bloquear usuário
unblock = Desbloquear
block = Bloquear
block_user.detail_2 = Este usuário não poderá interagir com seus repositórios, questões criadas e comentários.
-follow_blocked_user = Você não pode seguir este usuário, pois você o bloqueou ou foi bloqueado por ele.
+follow_blocked_user = Você não pode seguir este usuário porque você o bloqueou ou foi bloqueado por ele.
block_user.detail_3 = Este(a) usuário(a) não poderá adicioná-lo(a) como colaborador(a), nem você poderá adicioná-lo(a) como colaborador(a).
block_user.detail = Por favor, entenda que se você bloquear este usuário, outras ações serão tomadas. Tais como:
followers_one = %d seguidor
@@ -755,14 +755,14 @@ update_user_avatar_success=O avatar do usuário foi atualizado.
update_password=Modificar senha
old_password=Senha atual
new_password=Nova senha
-retype_new_password=Confirmar nova senha
+retype_new_password=Confirme a nova senha
password_incorrect=A senha atual está incorreta.
change_password_success=Sua senha foi atualizada. Acesse usando sua nova senha de agora em diante.
password_change_disabled=Contas não-locais não podem alterar sua senha através da interface web do Forgejo.
emails=Endereços de e-mail
manage_emails=Gerenciar endereços de e-mail
-manage_themes=Tema Padrão
+manage_themes=Tema padrão
manage_openid=Endereços OpenID
email_desc=Seu endereço de e-mail principal será usado para notificações, recuperação de senha e, desde que não esteja oculto, para operações do Git baseadas na Web.
theme_desc=Este será o seu tema padrão em todo o site.
@@ -770,7 +770,7 @@ primary=Principal
activated=Ativado
requires_activation=Requer ativação
primary_email=Tornar primário
-activate_email=Enviar ativação
+activate_email=Enviar e-mail de ativação
activations_pending=Ativações pendentes
can_not_add_email_activations_pending=Há uma ativação pendente, tente novamente em alguns minutos se quiser adicionar um novo e-mail.
delete_email=Remover
@@ -986,7 +986,7 @@ visibility.limited_tooltip=Visível apenas para usuários autenticados
visibility.private=Privada
visibility.private_tooltip=Visível apenas para membros das organizações às quais você se associou
blocked_users = Usuários bloqueados
-blocked_since = Bloqueado desde %s
+blocked_since = Bloqueado(a) desde %s
user_unblock_success = O usuário foi desbloqueado.
user_block_success = O usuário foi bloqueado.
twofa_recovery_tip = Caso perca o seu dispositivo, você poderá usar uma chave de uso único para recuperar o acesso à sua conta.
@@ -1254,6 +1254,7 @@ view_git_blame=Ver Git Blame
video_not_supported_in_browser=Seu navegador não suporta a tag 'video' do HTML5.
audio_not_supported_in_browser=Seu navegador não suporta a tag 'audio' do HTML5.
stored_lfs=Armazenado com Git LFS
+stored_annex=Armazenado com Git Annex
symbolic_link=Link simbólico
executable_file=Arquivo executável
commit_graph=Gráfico de commits
@@ -1277,6 +1278,7 @@ editor.upload_file=Enviar arquivo
editor.edit_file=Editar arquivo
editor.preview_changes=Pré-visualizar alterações
editor.cannot_edit_lfs_files=Arquivos LFS não podem ser editados na interface web.
+editor.cannot_edit_annex_files=Arquivos Annex não podem ser editados na interface web.
editor.cannot_edit_non_text_files=Arquivos binários não podem ser editados na interface web.
editor.edit_this_file=Editar arquivo
editor.this_file_locked=Arquivo está bloqueado
@@ -1770,8 +1772,8 @@ pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidad
pulls.nothing_to_compare_and_allow_empty_pr=Estes branches são iguais. Este PR ficará vazio.
pulls.has_pull_request=`Um pull request entre esses branches já existe: %[2]s#%[3]d`
pulls.create=Criar pull request
-pulls.title_desc_few=quer aplicar o merge de %[1]d commits de %[2]s em %[3]s
-pulls.merged_title_desc_few=aplicou merge dos %[1]d commits de %[2]s em %[3]s %[4]s
+pulls.title_desc_few=quer mesclar %[1]d commits de %[2]s em %[3]s
+pulls.merged_title_desc_few=mesclou %[1]d commits de %[2]s em %[3]s %[4]s
pulls.change_target_branch_at=`mudou o branch de destino de %s para %s %s`
pulls.tab_conversation=Conversação
pulls.tab_commits=Commits
@@ -2119,7 +2121,7 @@ settings.convert_fork_desc=Você pode converter este fork em um repositório nor
settings.convert_fork_notices_1=Esta operação irá converter o fork em um repositório normal e não pode ser desfeita.
settings.convert_fork_confirm=Converter repositório
settings.convert_fork_succeed=O fork foi convertido em um repositório normal.
-settings.transfer.title=Transferir propriedade
+settings.transfer.title=Transferir titularidade
settings.transfer.rejected=A transferência do repositório foi rejeitada.
settings.transfer.success=A transferência do repositório foi bem sucedida.
settings.transfer_abort=Cancelar transferência
@@ -2584,7 +2586,7 @@ issues.role.collaborator = Colaborador(a)
issues.label_archived_filter = Mostrar etiquetas arquivadas
pulls.status_checks_hide_all = Esconder todas as verificações
pulls.status_checks_show_all = Mostrar todas as verificações
-pulls.cmd_instruction_hint = `Ver as instruções da linha de comando.`
+pulls.cmd_instruction_hint = `Ver as instruções da linha de comando.`
wiki.cancel = Cancelar
settings.unarchive.success = O repositório foi desarquivado.
settings.unarchive.button = Desarquivar repositório
@@ -2592,13 +2594,13 @@ settings.unarchive.header = Desarquivar este repositório
diff.comment.add_line_comment = Adicionar comentário na linha
new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? Migrar repositório
blame.ignore_revs.failed = Falha ao ignorar as revisões em .git-blame-ignore-revs.
-migrate.forgejo.description = Migrar dados do codeberg.org ou outras instâncias Forgejo.
+migrate.forgejo.description = Migrar dados do codeberg.org ou outras servidores Forgejo.
commits.browse_further = Ver mais
issues.role.first_time_contributor = Primeira vez contribuindo
issues.role.first_time_contributor_helper = Esta é a primeira contribuição deste usuário para o repositório.
issues.role.contributor = Contribuidor(a)
issues.role.member_helper = Este usuário é membro da organização proprietária deste repositório.
-issues.role.collaborator_helper = Este usuário foi convidado para colaborar neste repositório.
+issues.role.collaborator_helper = Este(a) usuário(a) foi convidado(a) para colaborar neste repositório.
pulls.cmd_instruction_checkout_title = Checkout
settings.wiki_globally_editable = Permitir que qualquer pessoa possa editar a wiki
settings.transfer_abort_success = A transferência de repositório para %s foi cancelada.
@@ -2612,12 +2614,12 @@ admin.manage_flags = Gerenciar sinalizadores
admin.enabled_flags = Sinalizadores habilitados para o repositório:
admin.update_flags = Atualizar sinalizadores
admin.flags_replaced = Os sinalizadores do repositório foram substituídos
-all_branches = Todas as branches
+all_branches = Todos os ramos
fork_branch = Branch a ser clonada para o fork
object_format_helper = O formato utilizado para armazenar os objetos do repositório, sendo SHA1 o mais compatível. Esta ação é IRREVERSÍVEL.
object_format = Formato dos objetos
-tree_path_not_found_branch = Caminho %[1]s não existe na branch %[2]s
-tree_path_not_found_tag = Caminho %[1]s não existe na etiqueta %[2]s
+tree_path_not_found_branch = O caminho %[1]s não existe no ramo %[2]s
+tree_path_not_found_tag = O caminho %[1]s não existe na etiqueta %[2]s
commits.view_path = Ver neste ponto do histórico
commits.renamed_from = Renomeado de %s
admin.failed_to_replace_flags = Falha ao substituir os sinalizadores do repositório
@@ -2639,7 +2641,7 @@ settings.units.units = Funcionalidades
vendored = Externo
issues.num_participants_one = %d participante
issues.archived_label_description = (arquivada) %s
-n_branch_few = %s branches
+n_branch_few = %s ramos
stars = Favoritos
n_commit_one = %s commit
n_tag_few = %s etiquetas
@@ -3358,6 +3360,7 @@ dashboard.task.cancelled = Tarefa: %[1]s cancelada: %[3]s
dashboard.sync_branch.started = Sincronização de ramos iniciada
dashboard.sync_repo_branches = Sincronizar ramos perdidos do Git para o banco de dados
packages.cleanup.success = Os dados expirados foram limpos com sucesso
+monitor.queue.activeworkers = Processos ativos
[action]
@@ -3567,10 +3570,10 @@ settings.delete.notice=Você está prestes a excluir %s (%s). Esta operação é
settings.delete.success=O pacote foi excluído.
settings.delete.error=Falha ao excluir o pacote.
owner.settings.cargo.title=Índice do Registro Cargo
-owner.settings.cargo.initialize=Iniciar Índice
+owner.settings.cargo.initialize=Inicializar índice
owner.settings.cargo.initialize.error=Falha ao inicializar índice Cargo: %v
owner.settings.cargo.initialize.success=O índice Cargo foi criado com sucesso.
-owner.settings.cargo.rebuild=Reconstruir Índice
+owner.settings.cargo.rebuild=Reconstruir índice
owner.settings.cargo.rebuild.error=Falha ao reconstruir índice Cargo: %v
owner.settings.cargo.rebuild.success=O índice Cargo foi reconstruído com sucesso.
owner.settings.cleanuprules.title=Gerenciar Regras de Limpeza
@@ -3613,7 +3616,7 @@ deletion=Excluir segredo
deletion.description=A exclusão de um segredo é permanente e não pode ser desfeita. Continuar?
deletion.success=O segredo foi excluído.
deletion.failed=Falha ao excluir segredo.
-management=Gerenciamento de Segredos
+management=Gerenciar segredos
[actions]
actions=Ações
@@ -3649,7 +3652,7 @@ runners.task_list.repository=Repositório
runners.task_list.commit=Commit
runners.task_list.done_at=Realizada em
runners.edit_runner=Editar Runner
-runners.update_runner=Atualizar as Alterações
+runners.update_runner=Salvar alterações
runners.update_runner_success=Runner atualizado com sucesso
runners.update_runner_failed=Falha ao atualizar runner
runners.delete_runner=Deletar esse runner
@@ -3741,8 +3744,8 @@ match_tooltip = Inclui apenas os resultados que correspondem exatamente aos term
repo_kind = Buscar repositórios...
type_tooltip = Tipo de busca
code_search_by_git_grep = Os resultados atuais da pesquisa de código são fornecidos por "git grep". Pode haver melhores resultados se o administrador do site ativar o indexador de código.
-branch_kind = Pesquisar branches…
-commit_kind = Pesquisar commits…
+branch_kind = Buscar ramos…
+commit_kind = Buscar commits…
runner_kind = Pesquisar runners...
code_search_unavailable = A pesquisa de código não está disponível no momento. Entre em contato com o administrador do site.
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index f4ab925dd0..87eac9d9d0 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -158,6 +158,8 @@ filter.not_template = Não modelos
toggle_menu = Comutar menu
filter = Filtro
copy_generic = Copiar para a área de transferência
+test = Testar
+error413 = Você esgotou a sua quota.
[aria]
navbar=Barra de navegação
@@ -189,6 +191,8 @@ buttons.ref.tooltip=Referenciar uma questão ou um pedido de integração
buttons.switch_to_legacy.tooltip=Usar o editor clássico
buttons.enable_monospace_font=Habilitar tipo de letra mono-espaçado
buttons.disable_monospace_font=Desabilitar tipo de letra mono-espaçado
+buttons.indent.tooltip = Aninhar itens num nível
+buttons.unindent.tooltip = Desaninhar itens por um nível
[filter]
string.asc=A - Z
@@ -208,7 +212,7 @@ app_desc=Um serviço Git auto-hospedado e fácil de usar
install=Fácil de instalar
install_desc=Corra, simplesmente, o ficheiro binário executável para a sua plataforma, despache-o com o Docker, ou obtenha-o sob a forma de pacote.
platform=Multiplataforma
-platform_desc=Forgejo corre em qualquer plataforma onde possa compilar em linguagem Go: Windows, macOS, Linux, ARM, etc. Escolha a sua preferida!
+platform_desc=Está confirmado que Forgejo corre em sistemas operativos livres, tais como Linux ou FreeBSD, assim como em arquitecturas de CPU diversas. Escolha a sua preferida!
lightweight=Leve
lightweight_desc=Forgejo requer poucos recursos e pode correr num simples Raspberry Pi. Economize a energia da sua máquina!
license=Código aberto
@@ -245,7 +249,7 @@ err_admin_name_is_invalid=O nome de utilizador do administrador é inválido
general_title=Configurações gerais
app_name=Título do sítio
-app_name_helper=Pode escrever aqui o nome da sua companhia.
+app_name_helper=Escreva aqui o nome da sua instância. Será mostrado em todas as páginas.
repo_path=Localização dos repositórios
repo_path_helper=Os repositórios Git remotos serão guardados nesta pasta.
lfs_path=Localização do Git LFS
@@ -404,8 +408,8 @@ allow_password_change=Exigir que o utilizador mude a senha (recomendado)
reset_password_mail_sent_prompt=Foi enviado um email de confirmação para %s. Verifique a sua caixa de entrada dentro de %s para completar o processo de recuperação.
active_your_account=Ponha a sua conta em funcionamento
account_activated=A conta foi posta em funcionamento
-prohibit_login=É proibido iniciar sessão
-prohibit_login_desc=A sua conta está proibida de iniciar sessão. Contacte o administrador.
+prohibit_login=A conta está suspensa
+prohibit_login_desc=A sua conta foi suspendida de interagir com a instância. Contacte o administrador da instância para recuperar o acesso.
resent_limit_prompt=Já fez um pedido recentemente para enviar um email para pôr a conta em funcionamento. Espere 3 minutos e tente novamente.
has_unconfirmed_mail=Olá %s, tem um endereço de email não confirmado (%s). Se não recebeu um email de confirmação ou precisa de o voltar a enviar, clique no botão abaixo.
resend_mail=Clique aqui para voltar a enviar um email para pôr a conta em funcionamento
@@ -461,6 +465,11 @@ change_unconfirmed_email_summary = Mudar o endereço de email para onde a mensag
tab_signin = Iniciar sessão
tab_signup = Criar conta
change_unconfirmed_email_error = Não foi possível mudar o endereço de email: %v
+hint_login = Já tem uma conta? Inicie a sessão agora!
+hint_register = Precisa de uma conta? Faça uma inscrição agora.
+sign_up_button = Faça uma inscrição agora.
+back_to_sign_in = Voltar ao iniciar a sessão
+sign_in_openid = Prosseguir com OpenID
[mail]
view_it_on=Ver em %s
@@ -477,7 +486,7 @@ activate_email=Valide o seu endereço de email
activate_email.title=%s, por favor valide o seu endereço de email
activate_email.text=Por favor clique na seguinte ligação para validar o seu endereço de email dentro de %s:
-register_notify=Bem-vindo(a) ao Forgejo
+register_notify_prev9=Bem-vindo/a ao Forgejo
register_notify.title=%[1]s, bem-vindo(a) a %[2]s
register_notify.text_1=este é o seu email de confirmação de registo para %s!
register_notify.text_2=Pode iniciar a sessão usando o seu nome de utilizador: %s
@@ -530,6 +539,21 @@ team_invite.text_3=Nota: Este convite é dirigido a %[1]s. Se não estava à esp
admin.new_user.subject = O novo utilizador %s acabou de criar uma conta
admin.new_user.user_info = Informação do utilizador
admin.new_user.text = Clique aqui para gerir este utilizador a partir do painel de administração.
+totp_disabled.subject = O TOTP foi desabilitado
+totp_disabled.text_1 = A senha de uso único baseada no tempo (TOTP) na sua conta acabou de ser desabilitada.
+totp_disabled.no_2fa = Já não há quaisquer outros métodos 2FA configurados, o que quer dizer que já não é necessário iniciar a sua conta com 2FA.
+removed_security_key.subject = Foi removida uma chave de segurança
+removed_security_key.text_1 = A chave de segurança "%[1]s" acabou de ser removida da sua conta.
+removed_security_key.no_2fa = Já não existem quaisquer outros métodos 2FA configurados, o que quer dizer que já não é necessário iniciar a sua conta com 2FA.
+account_security_caution.text_1 = Se foi você, pode ignorar este email em segurança.
+account_security_caution.text_2 = Se não foi você, a sua conta está comprometida. Contacte o administrador deste sítio.
+totp_enrolled.subject = Habilitou TOTP como método 2FA
+totp_enrolled.text_1.no_webauthn = Acabou de habilitar TOTP para a sua conta. Isso significa que no futuro, ao iniciar sessão na sua conta, vai ter de usar TOTP como um método 2FA.
+totp_enrolled.text_1.has_webauthn = Acabou de habilitar TOTP para a sua conta. Isso significa que no futuro, ao iniciar sessão na sua conta, pode usar TOTP como um método 2FA ou usar uma das suas chaves de segurança.
+primary_mail_change.subject = O seu email principal foi alterado
+password_change.subject = A sua senha foi alterada
+password_change.text_1 = A senha para a sua conta acabou de ser alterada.
+primary_mail_change.text_1 = O email principal da sua conta acabou de ser alterado para %[1]s. Isso quer dizer que este endereço de email não vai mais receber notificações de email relativas à sua conta.
[modal]
yes=Sim
@@ -671,12 +695,20 @@ block = Bloquear
unblock = Desbloquear
followers_one = %d seguidor
following_one = %d seguindo
-block_user.detail = Note que se bloquear este utilizador, serão executadas outras operações, tais como:
-block_user.detail_1 = Está a deixar de ser seguido/a por este utilizador.
-block_user.detail_2 = Este utilizador não pode interagir com os seus repositórios, questões criadas e comentários.
-block_user.detail_3 = Este/a utilizador/a não o/a pode adicionar como colaborador/a nem você pode o/a adicionar como colaborador/a.
+block_user.detail = Repare que bloquear um utilizador tem outros efeitos, tais como:
+block_user.detail_1 = Irão deixar de seguir um ao outro e deixarão de poder seguir um ao outro.
+block_user.detail_2 = Este/a utilizador/a deixará de poder interagir com os seus repositórios ou com as questões e comentários criados por si.
+block_user.detail_3 = Não poderão adicionar um ao outro como colaboradores do repositório.
follow_blocked_user = Não pode seguir este/a utilizador/a porque você o/a bloqueou ou este/a utilizador/a bloqueou-o/a a si.
block_user = Bloquear utilizador
+followers.title.one = Seguidor
+followers.title.few = Seguidores
+following.title.one = Seguindo
+following.title.few = Seguindo
+public_activity.visibility_hint.self_public = O seu trabalho está visível para todos, salvo o que é feito em espaços privados. Configurar.
+public_activity.visibility_hint.admin_public = Este trabalho está visível para todos, mas como administrador/a pode também ver o que consta em espaços privados.
+public_activity.visibility_hint.self_private = O seu trabalho apenas está visível para si e para os administradores da instância. Configurar.
+public_activity.visibility_hint.admin_private = Este trabalho está visível para si porque é um/a administrador/a, mas o/a utilizador/a quer permanecer privado/a.
[settings]
profile=Perfil
@@ -791,7 +823,7 @@ add_email_success=O novo endereço de email foi adicionado.
email_preference_set_success=As preferências relativas ao email foram definidas com sucesso.
add_openid_success=O novo endereço OpenID foi adicionado.
keep_email_private=Ocultar endereço de email
-keep_email_private_popup=Isto irá ocultar o seu endereço de email no seu perfil, assim como quando fizer um pedido de integração ou editar um ficheiro usando a interface web. Cometimentos enviados não serão modificados.
+keep_email_private_popup=Isto irá ocultar o seu endereço de email no seu perfil. Não será mais o predefinido nos cometimentos feitos através da interface web, tais como carregamentos de ficheiros e edições, e não será usado para cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para associar cometimentos à sua conta. Note que mudar esta opção não irá alterar os cometimentos existentes.
openid_desc=O OpenID permite delegar a autenticação num fornecedor externo.
manage_ssh_keys=Gerir chaves SSH
@@ -1004,6 +1036,9 @@ update_hints_success = As sugestões foram modificadas.
blocked_users_none = Não há utilizadores bloqueados.
user_unblock_success = O utilizador foi desbloqueado com sucesso.
language.title = Idioma predefinido
+keep_activity_private.description = O seu trabalho público apenas estará visível para si e para os administradores da instância.
+language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão.
+language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Saiba mais.
[repo]
new_repo_helper=Um repositório contém todos os ficheiros do trabalho, incluindo o histórico das revisões. Já tem um hospedado noutro sítio? Migre o repositório.
@@ -1013,7 +1048,7 @@ repo_name=Nome do repositório
repo_name_helper=Um bom nome de repositório utiliza palavras curtas, memoráveis e únicas.
repo_size=Tamanho do repositório
template=Modelo
-template_select=Escolha um modelo.
+template_select=Escolha um modelo
template_helper=Fazer do repositório um modelo
template_description=Repositórios modelo permitem que os utilizadores gerem novos repositórios com a mesma estrutura de pastas, ficheiros e configurações opcionais.
visibility=Visibilidade
@@ -1040,17 +1075,17 @@ generate_from=Gerar a partir de
repo_desc=Descrição
repo_desc_helper=Insira uma descrição curta (opcional)
repo_lang=Idioma
-repo_gitignore_helper=Escolher modelos .gitignore.
+repo_gitignore_helper=Escolher modelos .gitignore
repo_gitignore_helper_desc=Escolha os ficheiros que não são para rastrear, a partir de uma lista de modelos de linguagens comuns. Serão incluídos no ficheiro .gitignore, logo à partida, artefactos típicos gerados pelas ferramentas de construção de cada uma das linguagens.
-issue_labels=Rótulos para as questões
-issue_labels_helper=Escolha um conjunto de rótulos para as questões.
+issue_labels=Rótulos
+issue_labels_helper=Escolha um conjunto de rótulos
license=Licença
-license_helper=Escolha um ficheiro de licença.
+license_helper=Escolha um ficheiro de licença
license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: Escolher uma licença.
object_format=Formato dos elementos
object_format_helper=Formato dos elementos do repositório. Não poderá ser alterado mais tarde. SHA1 é o mais compatível.
readme=README
-readme_helper=Escolha um modelo de ficheiro README.
+readme_helper=Escolha um modelo de ficheiro README
readme_helper_desc=Este é o sítio onde pode escrever uma descrição completa do seu trabalho.
auto_init=Inicializar repositório (adiciona `.gitignore`, `LICENSE` e `README.md`)
trust_model_helper=Escolha o modelo de confiança para a validação das assinaturas. As opções são:
@@ -1266,6 +1301,7 @@ view_git_blame=Ver git blame
video_not_supported_in_browser=O seu navegador não suporta a etiqueta "video" do HTML5.
audio_not_supported_in_browser=O seu navegador não suporta a etiqueta "audio" do HTML5.
stored_lfs=Armazenado com Git LFS
+stored_annex=Armazenado com Git Annex
symbolic_link=Ligação simbólica
executable_file=Ficheiro executável
vendored=Externo
@@ -1291,6 +1327,7 @@ editor.upload_file=Carregar ficheiro
editor.edit_file=Editar ficheiro
editor.preview_changes=Pré-visualizar modificações
editor.cannot_edit_lfs_files=Ficheiros LFS não podem ser editados na interface web.
+editor.cannot_edit_annex_files=Ficheiros Annex não podem ser editados na interface web.
editor.cannot_edit_non_text_files=Ficheiros binários não podem ser editados na interface da web.
editor.edit_this_file=Editar ficheiro
editor.this_file_locked=Ficheiro bloqueado
@@ -1575,8 +1612,8 @@ issues.reopened_at=`reabriu esta questão %[2]s`
issues.commit_ref_at=`referenciou esta questão num cometimento %[2]s`
issues.ref_issue_from=`referiu esta questão %[4]s%[2]s`
issues.ref_pull_from=`referiu este pedido de integração %[4]s%[2]s`
-issues.ref_closing_from=`referiu um pedido de integração %[4]s que fechará esta questão%[2]s`
-issues.ref_reopening_from=`referiu um pedido de integração %[4]s que reabrirá esta questão%[2]s`
+issues.ref_closing_from=`referiu esta questão a partir de um pedido de integração %[4]s que a fechará%[2]s`
+issues.ref_reopening_from=`referiu esta questão a partir de um pedido de integração %[4]s que a reabrirá%[2]s`
issues.ref_closed_from=`encerrou esta questão %[4]s%[2]s`
issues.ref_reopened_from=`reabriu esta questão %[4]s%[2]s`
issues.ref_from=`de %[1]s`
@@ -1887,7 +1924,7 @@ pulls.outdated_with_base_branch=Este ramo é obsoleto em relação ao ramo base
pulls.close=Encerrar pedido de integração
pulls.closed_at=`fechou este pedido de integração %[2]s`
pulls.reopened_at=`reabriu este pedido de integração %[2]s`
-pulls.cmd_instruction_hint=`Ver instruções para a linha de comandos.`
+pulls.cmd_instruction_hint=Ver instruções para a linha de comandos
pulls.cmd_instruction_checkout_title=Conferir
pulls.cmd_instruction_checkout_desc=No seu repositório, irá criar um novo ramo para que possa testar as modificações.
pulls.cmd_instruction_merge_title=Integrar
@@ -2658,7 +2695,7 @@ topic.done=Concluído
topic.count_prompt=Não pode escolher mais do que 25 tópicos
topic.format_prompt=Os tópicos devem começar com uma letra ou um número, podem incluir traços ("-") ou pontos (".") e podem ter até 35 caracteres. As letras têm que ser minúsculas.
-find_file.go_to_file=Ir para o ficheiro
+find_file.go_to_file=Procurar um ficheiro
find_file.no_matching=Não foi encontrado qualquer ficheiro correspondente
error.csv.too_large=Não é possível apresentar este ficheiro por ser demasiado grande.
@@ -2756,6 +2793,20 @@ settings.federation_following_repos = URLs de repositórios que estão a ser seg
settings.federation_not_enabled = A federação não está a habilitada na sua instância.
n_release_one = %s lançamento
n_release_few = %s lançamentos
+issues.author.tooltip.issue = Este/a utilizador/a é o/a autor/a desta questão.
+issues.author.tooltip.pr = Este/a utilizador/a é o/a autor/a deste pedido de integração.
+activity.commit = Cometimentos feitos
+milestones.filter_sort.name = Nome
+release.invalid_external_url = URL externo inválido: "%s"
+release.type_external_asset = Recurso externo
+release.asset_name = Nome do recurso
+release.asset_external_url = URL externo
+release.add_external_asset = Adicionar recurso externo
+release.type_attachment = Anexo
+activity.published_prerelease_label = Pré-lançamento
+activity.published_tag_label = Etiqueta
+settings.pull_mirror_sync_quota_exceeded = A quota foi excedida, as modificações não vão ser puxadas.
+settings.transfer_quota_exceeded = O novo proprietário (%s) excedeu a quota. O repositório não foi transferido.
[graphs]
component_loading=A carregar %s...
@@ -2834,7 +2885,7 @@ members.member=Membro
members.remove=Remover
members.remove.detail=Remover %[1]s de %[2]s?
members.leave=Sair
-members.leave.detail=Sair de %s?
+members.leave.detail=Tem a certeza que quer sair da organização %s?
members.invite_desc=Adicionar um novo membro a %s:
members.invite_now=Convidar agora
@@ -3026,8 +3077,8 @@ users.max_repo_creation=Número máximo de repositórios
users.max_repo_creation_desc=(insira -1 para usar o limite predefinido a nível global)
users.is_activated=A conta de utilizador está em funcionamento
users.prohibit_login=Desabilitar início de sessão
-users.is_admin=É administrador/a
-users.is_restricted=A conta é restrita
+users.is_admin=Conta de administrador
+users.is_restricted=Conta restrita
users.allow_git_hook=Pode criar automatismos do Git
users.allow_git_hook_tooltip=Os automatismos do Git são executados em nome do utilizador do sistema operativo que corre o Forgejo e têm o mesmo nível de acesso ao servidor. Por causa disso, utilizadores com este privilégio especial de automatismo do Git podem aceder e modificar todos os repositórios do Forgejo, assim como a base de dados usada pelo Forgejo. Consequentemente, também podem ganhar privilégios de administrador do Forgejo.
users.allow_import_local=Pode importar repositórios locais
@@ -3435,6 +3486,20 @@ config.open_with_editor_app_help = Os editores da opção "Abrir com" do menu da
config.allow_dots_in_usernames = Permitir que os utilizadores usem pontos no seu nome de utilizador. Não altera as contas existentes.
auths.default_domain_name = Nome de domínio predefinido usado para o endereço de email
config.app_slogan = Lema da instância
+config.cache_test = Testar a cache
+config.cache_test_slow = O teste da cache foi bem sucedido, mas a resposta é lenta: %s.
+config.cache_test_succeeded = O teste da cache foi bem sucedido, o tempo de resposta foi de %s.
+config.cache_test_failed = Falhou a sondagem da cache: %v.
+users.block.description = Impedir que este utilizador interaja com este serviço através da sua conta e proibi-lo de iniciar sessão.
+users.admin.description = Atribuir acesso total a este utilizador a todos os recursos administrativos disponíveis através da interface web e da API.
+users.local_import.description = Permitir a importação de repositórios a partir do sistema de ficheiros local do servidor. Isto poderá ser um problema de segurança.
+users.organization_creation.description = Permitir a criação de novas organizações.
+users.activated.description = Finalização da verificação do email. O proprietário de uma conta não habilitada não poderá iniciar a sessão enquanto a verificação do email não estiver finalizada.
+users.restricted.description = Permitir que este/a utilizador/a interaja apenas com os repositórios e as organizações onde tenha sido adicionado/a como colaborador/a. Isto impede o acesso a repositórios públicos nesta instância.
+emails.delete = Eliminar email
+emails.deletion_success = O endereço de email foi eliminado.
+emails.delete_primary_email_error = Não pode eliminar o endereço de email principal.
+emails.delete_desc = Tem a certeza que quer eliminar este endereço de email?
[action]
create_repo=criou o repositório %s
@@ -3788,6 +3853,13 @@ runs.no_workflows.quick_start = Não sabe como começar com o Forgejo Action? Ve
runs.no_job_without_needs = A sequência de trabalho tem de conter pelo menos um trabalho sem dependências.
runs.workflow = Sequência de trabalho
runs.no_job = A sequência de trabalho tem de conter pelo menos um trabalho
+workflow.dispatch.use_from = Usar sequência de trabalho de
+workflow.dispatch.run = Executar sequência de trabalho
+workflow.dispatch.input_required = Exigir valor para a entrada "%s".
+workflow.dispatch.warn_input_limit = Apresentando apenas as %d primeiras entradas.
+workflow.dispatch.trigger_found = Esta sequência de trabalho é despoletada pelo evento workflow_dispatch.
+workflow.dispatch.success = A execução da sequência de trabalho foi pedida com sucesso.
+workflow.dispatch.invalid_input_type = Tipo de entrada "%s" inválido.
[projects]
type-1.display_name=Planeamento individual
@@ -3826,6 +3898,13 @@ user_kind = Pesquisar utilizadores...
team_kind = Pesquisar equipas...
code_kind = Pesquisar código...
code_search_unavailable = A pesquisa de código não está disponível, neste momento. Entre em contacto com o administrador.
+exact = Fiel
+exact_tooltip = Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa
+issue_kind = Procurar questões...
+pull_kind = Procurar puxadas...
+union = Palavras-chave
+union_tooltip = Incluir resultados correspondentes a qualquer das palavras-chave separadas por espaços em branco
+milestone_kind = Procurar etapas...
[munits.data]
kib = KiB
@@ -3839,4 +3918,7 @@ b = B
[markup]
filepreview.lines = Linhas %[1]d até %[2]d em %[3]s
filepreview.line = Linha %[1]d em %[2]s
-filepreview.truncated = A previsão foi truncada
\ No newline at end of file
+filepreview.truncated = A previsão foi truncada
+
+[translation_meta]
+test = ok
\ No newline at end of file
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 30cb893fa0..16dc0187ce 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -36,16 +36,16 @@ twofa=Двухфакторная аутентификация
twofa_scratch=Scratch-код 2ФА
passcode=Код
-webauthn_insert_key=Вставьте ваш ключ безопасности
-webauthn_sign_in=Нажмите кнопку на ключе безопасности. Если ваш ключ безопасности не имеет кнопки, вставьте его снова.
-webauthn_press_button=Пожалуйста, нажмите кнопку на ключе безопасности…
+webauthn_insert_key=Вставьте ваш токен авторизации
+webauthn_sign_in=Подтвердите действие на токене авторизации. Если на вашем токене нет кнопки, вставьте его заново.
+webauthn_press_button=Подтвердите действие на токене авторизации…
webauthn_use_twofa=Используйте двухфакторный код с вашего телефона
-webauthn_error=Не удалось прочитать ваш ключ безопасности.
+webauthn_error=Не удалось прочитать токен авторизации.
webauthn_unsupported_browser=Ваш браузер в настоящее время не поддерживает WebAuthn.
webauthn_error_unknown=Произошла неизвестная ошибка. Повторите попытку.
webauthn_error_insecure=WebAuthn поддерживает только безопасные соединения. Для тестирования по HTTP можно использовать "localhost" или "127.0.0.1"
webauthn_error_unable_to_process=Сервер не смог обработать ваш запрос.
-webauthn_error_duplicated=Данный ключ безопасности не разрешен для этого запроса. Пожалуйста, убедитесь, что ключ не регистрировался ранее.
+webauthn_error_duplicated=Этот токен авторизации не разрешен для выполнения этого запроса. Убедитесь, что токен не был зарегистрирован ранее.
webauthn_error_empty=Необходимо задать имя для этого ключа.
webauthn_error_timeout=Время истекло раньше, чем ключ был прочитан. Перезагрузите эту страницу и повторите попытку.
webauthn_reload=Обновить
@@ -53,11 +53,11 @@ webauthn_reload=Обновить
repository=Репозиторий
organization=Организация
mirror=Зеркало
-new_repo=Новый репозиторий
-new_migrate=Новая миграция
+new_repo=Создать репозиторий
+new_migrate=Выполнить миграцию
new_mirror=Новое зеркало
new_fork=Новое ответвление репозитория
-new_org=Новая организация
+new_org=Создать организацию
new_project=Новый проект
new_project_column=Новый столбец
manage_org=Управление организациями
@@ -100,7 +100,7 @@ copy=Копировать
copy_url=Копировать ссылку
copy_hash=Копировать хеш
copy_content=Копировать содержимое
-copy_branch=Копировать название ветки
+copy_branch=Копировать название ветви
copy_success=Скопировано!
copy_error=Не удалось скопировать
copy_type_unsupported=Невозможно скопировать этот тип файла
@@ -152,12 +152,20 @@ filter.is_mirror = Зеркала
filter.is_template = Шаблоны
filter.not_template = Не шаблоны
filter.public = Публичные
-filter.private = Приватные
+filter.private = Частные
filter.is_archived = Архивированные
filter.not_mirror = Не зеркала
more_items = Больше элементов
invalid_data = Неверные данные: %v
copy_generic = Копировать в буфер обмена
+test = Проверить
+error413 = Ваша квота исчерпана.
+new_migrate.link = Выполнить миграцию
+new_org.link = Создать организацию
+new_repo.title = Новый репозиторий
+new_migrate.title = Новая миграция
+new_org.title = Новая организация
+new_repo.link = Создать репозиторий
[aria]
navbar=Панель навигации
@@ -189,6 +197,8 @@ buttons.ref.tooltip=Сослаться на задачу или запрос с
buttons.switch_to_legacy.tooltip=Использовать старый редактор
buttons.enable_monospace_font=Включить моноширинный шрифт
buttons.disable_monospace_font=Выключить моноширинный шрифт
+buttons.unindent.tooltip = Уменьшить вложенность на 1
+buttons.indent.tooltip = Увеличить вложенность на 1
[filter]
string.asc=A - Я
@@ -208,7 +218,7 @@ app_desc=Удобный, самостоятельный хостинг Git-ре
install=Простой в установке
install_desc=Просто запустите исполняемый файл для вашей платформы, разверните через Docker, или установите с помощью менеджера пакетов.
platform=Кроссплатформенный
-platform_desc=Forgejo работает на любой платформе, поддерживаемой Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!
+platform_desc=Forgejo может работать на многих открытых ОС вроде Linux и FreeBSD, а также на оборудовании различных архитектур. Выберите ту, что нравится вам!
lightweight=Легковесный
lightweight_desc=Forgejo имеет низкие системные требования и может работать на недорогом Raspberry Pi. Экономьте ресурсы вашей машины!
license=Открытый исходный код
@@ -250,7 +260,7 @@ repo_path=Путь до каталога репозиториев
repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге.
lfs_path=Путь до корневого каталога Git LFS
lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
-run_user=Запуск от имени пользователя
+run_user=Выполнение под пользователем
run_user_helper=Имя пользователя операционной системы, под которым работает Forgejo. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
domain=Домен сервера
domain_helper=Домен или адрес хоста для сервера.
@@ -277,9 +287,9 @@ server_service_title=Настройки сервера и внешних слу
offline_mode=Локальный режим
offline_mode.description=Отключить сторонние службы доставки контента и передавать все ресурсы из их локальных копий.
disable_gravatar=Отключить Gravatar
-disable_gravatar.description=Отключить Gravatar и прочие сторонние источники аватаров. Если у пользователя нет локально установленного аватара, будет использован аватар по умолчанию.
-federated_avatar_lookup=Федерированные аватары
-federated_avatar_lookup.description=Искать аватары используя Libravatar.
+disable_gravatar.description=Отключить Gravatar и прочие сторонние источники изображений профилей. Если у пользователя нет локально установленного изображения профиля, будет использовано изображение по умолчанию.
+federated_avatar_lookup=Федерированные изображения профилей
+federated_avatar_lookup.description=Искать изображения профилей, используя Libravatar.
disable_registration=Отключить самостоятельную регистрацию
disable_registration.description=Только администраторы смогут создавать новые учётные записи пользователей. Отключение саморегистрации крайне рекомендовано, разве что если вы не собираетесь создать публичный сервер для всех и готовы бороться с большим количеством спама.
allow_only_external_registration.description=Пользователи смогут создавать новые учётные записи только через добавленные сторонние службы.
@@ -291,9 +301,9 @@ enable_captcha=CAPTCHA для регистрации
enable_captcha.description=Требовать прохождение CAPTCHA для регистрации учётных записей.
require_sign_in_view=Требовать авторизацию для просмотра содержимого
require_sign_in_view.description=Требовать наличие учётной записи для просмотра содержимого сервера. Посетители увидят лишь страницы входа и регистрации.
-admin_setting.description=Создание учётной записи администратора необязательно. Первый зарегистрированный пользователь автоматически становится администратором.
+admin_setting.description=Создание учётной записи администратора необязательно. Первый зарегистрировавшийся пользователь автоматически станет администратором.
admin_title=Учётная запись администратора
-admin_name=Логин администратора
+admin_name=Имя администратора
admin_password=Пароль
confirm_password=Подтверждение пароля
admin_email=Адрес эл. почты
@@ -325,7 +335,7 @@ enable_update_checker=Проверка обновлений
env_config_keys=Настройка окружения
env_config_keys_prompt=Следующие переменные окружения также будут применены к вашему конфигурационному файлу:
enable_update_checker_helper_forgejo = Периодически проверять наличие новых версий Forgejo через DNS-запись TXT на release.forgejo.org.
-allow_dots_in_usernames = Разрешить точки в логинах пользователей. Это не повлияет на уже созданные учётные записи.
+allow_dots_in_usernames = Разрешить точки в именах пользователей. Это не повлияет на уже созданные учётные записи.
smtp_from_invalid = Адрес для отправки писем некорректен
config_location_hint = Эти настройки конфигурации будут сохранены в:
allow_only_external_registration = Разрешить регистрацию только через сторонние службы
@@ -333,9 +343,9 @@ app_slogan = Лозунг сервера
app_slogan_helper = Укажите лозунг вашего сервера, либо оставьте пустым для отключения.
[home]
-uname_holder=Логин или адрес эл. почты
+uname_holder=Имя или адрес эл. почты
password_holder=Пароль
-switch_dashboard_context=Переключить контекст панели управления
+switch_dashboard_context=Сменить просматриваемое пространство
my_repos=Репозитории
show_more_repos=Показать больше репозиториев…
collaborative_repos=Совместные репозитории
@@ -352,7 +362,7 @@ show_both_archived_unarchived=Показаны архивированные и
show_only_archived=Показаны только архивированные
show_only_unarchived=Показаны только разархивированные
-show_private=Приватный
+show_private=Частные
show_both_private_public=Показаны как публичные, так и частные
show_only_private=Показаны только приватные
show_only_public=Показаны только публичные
@@ -394,7 +404,7 @@ disable_register_mail=Подтверждение регистрации по э
manual_activation_only=Обратитесь к администратору сайта для завершения активации.
remember_me=Запомнить это устройство
remember_me.compromised=Токен входа более не действителен, что может указывать на компрометацию учётной записи. Пожалуйста, проверьте свою учётную запись на необычные действия.
-forgot_password_title=Восстановить пароль
+forgot_password_title=Восстановление пароля
forgot_password=Забыли пароль?
sign_up_now=Нужна учётная запись? Зарегистрируйтесь.
sign_up_successful=Учётная запись успешно создана. Добро пожаловать!
@@ -402,15 +412,15 @@ confirmation_mail_sent_prompt=Новое письмо для подтвержд
must_change_password=Обновите пароль
allow_password_change=Требовать смену пароля пользователем (рекомендуется)
reset_password_mail_sent_prompt=Письмо с подтверждением отправлено на %s. Пожалуйста, проверьте входящую почту в течение %s, чтобы завершить процесс восстановления учётной записи.
-active_your_account=Активируйте свою учётную запись
+active_your_account=Активация учётной записи
account_activated=Учётная запись активирована
-prohibit_login=Вход запрещён
-prohibit_login_desc=Вход в вашу учётную запись запрещен. Свяжитесь с администратором сайта.
+prohibit_login=Учётная запись приостановлена
+prohibit_login_desc=Возможность использования этой уч. записи была приостановлена. Обратитесь к администрации сервера для восстановления доступа.
resent_limit_prompt=Недавно вы уже запрашивали письмо для активации. Пожалуйста, повторите попытку через 3 минуты.
has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес эл. почты (%s). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже.
resend_mail=Нажмите здесь, чтобы отправить письмо для активации ещё раз
email_not_associate=Этот адрес эл. почты не связан ни с одной учётной записью.
-send_reset_mail=Отправить письмо для восстановления учётной записи
+send_reset_mail=Отправить восстановление пароля
reset_password=Восстановление учётной записи
invalid_code=Код подтверждения недействителен или истёк.
invalid_code_forgot_password=Ваш код подтверждения недействителен или истек. Нажмите здесь для начала новой сессии.
@@ -430,11 +440,11 @@ tab_signin = Войти
tab_signup = Зарегистрироваться
tab_openid=OpenID
oauth_signup_tab=Зарегистрировать новую учётную запись
-oauth_signup_title=Полная новая учётная запись
-oauth_signup_submit=Полная учётная запись
-oauth_signin_tab=Ссылка на существующую учётную запись
+oauth_signup_title=Завершение регистрации учётной записи
+oauth_signup_submit=Завершить регистрацию
+oauth_signin_tab=Привязать существующую уч. запись
oauth_signin_title=Войдите, чтобы авторизовать связанную учётную запись
-oauth_signin_submit=Привязать учётную запись
+oauth_signin_submit=Привязать уч. запись
oauth.signin.error=Произошла ошибка при обработке запроса авторизации. Если эта ошибка повторяется, обратитесь к администратору сайта.
oauth.signin.error.access_denied=Запрос на авторизацию был отклонен.
oauth.signin.error.temporarily_unavailable=Произошла ошибка авторизации, так как сервер аутентификации временно недоступен. Пожалуйста, повторите попытку позже.
@@ -461,6 +471,11 @@ change_unconfirmed_email_summary = Измените адрес эл. почты,
change_unconfirmed_email_error = Невозможно изменить адрес почты: %v
last_admin = Невозможно удалить единственного администратора. Всегда должен оставаться хотя бы один администратор.
change_unconfirmed_email = Если при регистрации был введён неправильный адрес, его можно изменить ниже, и письмо с подтверждением будет выслано на исправленный адрес.
+hint_register = Нет учётной записи? Зарегистрируйтесь.
+sign_up_button = Зарегистрироваться.
+back_to_sign_in = Назад ко входу
+sign_in_openid = Продолжить с OpenID
+hint_login = Уже есть учётная запись? Войдите!
[mail]
view_it_on=Посмотреть на %s
@@ -477,10 +492,10 @@ activate_email=Подтвердите свой адрес эл. почты
activate_email.title=%s, пожалуйста, подтвердите свой адрес эл. почты
activate_email.text=Для подтверждения эл. почты перейдите по следующей ссылке в течение %s:
-register_notify=Добро пожаловать в Forgejo
+register_notify_prev9=Приветствуем в Forgejo
register_notify.title=%[1]s, добро пожаловать в %[2]s
register_notify.text_1=это письмо с вашим подтверждением регистрации в %s!
-register_notify.text_2=Теперь вы можете войти в учётную запись, используя логин: %s
+register_notify.text_2=Теперь вы можете войти в свою учётную запись, используя имя: %s
register_notify.text_3=Если эта учётная запись создана кем-то для вас, сперва будет необходимо задать пароль.
reset_password=Восстановление учётной записи
@@ -530,6 +545,21 @@ team_invite.text_3=Примечание: Это приглашение было
admin.new_user.user_info = Информация о пользователе
admin.new_user.text = Нажмите здесь, чтобы открыть этого пользователя в панели администрации.
admin.new_user.subject = Зарегистрировался новый пользователь %s
+totp_disabled.subject = Отключена 2ФА по TOTP
+totp_disabled.text_1 = Двухфакторная аутентификация временными кодами (TOTP) только что была отключена на вашей учётной записи.
+removed_security_key.subject = Отвязан токен авторизации
+removed_security_key.text_1 = Токен авторизации «%[1]s» только что был отвязан от вашей учётной записи.
+primary_mail_change.text_1 = Основной адрес эл. почты вашей учётной записи только что был изменён на %[1]s. Прежний адрес больше не будет получать уведомления об этой учётной записи.
+totp_disabled.no_2fa = В данный момент на вашей учётной записи отсутствуют какие-либо другие методы 2ФА и вход возможен без дополнительного фактора аутентификации.
+password_change.text_1 = Пароль вашей учётной записи только что был изменён.
+password_change.subject = Изменён пароль учётной записи
+primary_mail_change.subject = Изменён основной адрес эл. почты
+account_security_caution.text_1 = Если это действие выполнили вы, то можете спокойно игнорировать это уведомление.
+account_security_caution.text_2 = Если это были не вы, ваша учётная запись была скомпрометирована. Свяжитесь с администрацией сервера.
+removed_security_key.no_2fa = В данный момент на вашей учётной записи отсутствуют какие-либо другие методы 2ФА и вход возможен без дополнительного фактора аутентификации.
+totp_enrolled.subject = Активирована двухфакторная аутентификация по TOTP
+totp_enrolled.text_1.has_webauthn = На вашей учётной записи была активирована 2ФА по TOTP. Это означает, что для следующих входов потребуется вводить одноразовый код (TOTP), либо применять привязанный токен авторизации.
+totp_enrolled.text_1.no_webauthn = На вашей учётной записи была активирована 2ФА по TOTP. Это означает, что для следующих входов потребуется вводить одноразовый код (TOTP).
[modal]
yes=Да
@@ -551,7 +581,7 @@ TeamName=Название команды
AuthName=Имя авторизации
AdminEmail=Эл. почта администратора
-NewBranchName=Новая ветка
+NewBranchName=Новая ветвь
CommitSummary=Резюме коммита
CommitMessage=Зафиксировать сообщение
CommitChoice=Выбор коммита
@@ -627,7 +657,7 @@ still_own_packages=Ваша учётная запись владеет одни
org_still_own_repo=Эта организация всё ещё владеет одним или несколькими репозиториями, сначала удалите или передайте их.
org_still_own_packages=Эта организация всё ещё владеет одним или несколькими пакетами, сначала удалите их.
-target_branch_not_exist=Целевая ветка не существует.
+target_branch_not_exist=Целевая ветвь не существует.
admin_cannot_delete_self = Вы не можете удалить свою учётную запись, будучи администратором. Сперва снимите с себя роль администратора.
username_error_no_dots = ` может состоять только из латинских букв («a-z», «A-Z»), цифр («0-9»), знаков минуса («-») и нижнего подчёркивания («_»). Знаки не могут стоять в начале или в конце, а также идти подряд.`
unsupported_login_type = Удаление аккаунта невозможно с этим типом авторизации.
@@ -640,11 +670,11 @@ Pronouns = Местоимения
Biography = О себе
Website = Веб-сайт
Location = Местоположение
-To = Название ветки
+To = Название ветви
[user]
-change_avatar=Изменить свой аватар…
+change_avatar=Изменить изображение профиля…
joined_on=Регистрация %s
repositories=Репозитории
activity=Публичная активность
@@ -692,11 +722,11 @@ account=Учётная запись
appearance=Внешний вид
password=Пароль
security=Безопасность
-avatar=Аватар
+avatar=Изображение профиля
ssh_gpg_keys=Ключи SSH / GPG
social=Учётные записи в соцсетях
applications=Приложения
-orgs=Управление организациями
+orgs=Организации
repos=Репозитории
delete=Удалить учётную запись
twofa=Двухфакторная аутентификация (TOTP)
@@ -707,7 +737,7 @@ webauthn=Двухфакторная аутентификация (ключами
public_profile=Публичный профиль
biography_placeholder=Расскажите немного о себе! (Можно использовать Markdown)
-location_placeholder=Поделитесь своим приблизительным местоположением с другими
+location_placeholder=Пусть все знают, откуда вы
profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
full_name=Полное имя
@@ -729,13 +759,13 @@ ui=Тема
hidden_comment_types=Скрытые типы комментариев
hidden_comment_types_description=Отмеченные типы комментариев не будут отображаться на страницах задач. Например, если выбрать «Метки», не станет всех комментариев «<пользователь> добавил/удалил <метку>».
hidden_comment_types.ref_tooltip=Комментарии об упоминании задачи в другой задаче/коммите/…
-hidden_comment_types.issue_ref_tooltip=Комментарии об изменении ветки/тега, связанных с этой задачей
+hidden_comment_types.issue_ref_tooltip=Комментарии об изменении ветви/тега, связанных с этой задачей
comment_type_group_reference=Упоминания
comment_type_group_label=Операции с метками
comment_type_group_milestone=Этап
comment_type_group_assignee=Назначения
comment_type_group_title=Правки заголовков
-comment_type_group_branch=Операции с ветками
+comment_type_group_branch=Операции с ветвями
comment_type_group_time_tracking=Отслеживание времени
comment_type_group_deadline=Модификации сроков выполнения
comment_type_group_dependency=Модификации зависимостей
@@ -745,20 +775,20 @@ comment_type_group_pull_request_push=Добавленные коммиты
comment_type_group_project=Проект
comment_type_group_issue_ref=Ссылка на задачу
saved_successfully=Ваши настройки успешно сохранены.
-privacy=Приватность
+privacy=Конфиденциальность
keep_activity_private=Скрыть активность со страницы профиля
keep_activity_private_popup=Ваша активность будет видна только вам и администраторам сервера
-lookup_avatar_by_mail=Найти аватар по адресу эл. почты
-federated_avatar_lookup=Найти внешний аватар
-enable_custom_avatar=Использовать собственный аватар
-choose_new_avatar=Выбрать новый аватар
-update_avatar=Обновить аватар
-delete_current_avatar=Удалить текущий аватар
-uploaded_avatar_not_a_image=Загружаемый файл не является изображением.
-uploaded_avatar_is_too_big=Размер загружаемого файла (%d КиБ) превышает максимальный размер (%d КиБ).
-update_avatar_success=Ваш аватар был изменен.
-update_user_avatar_success=Аватар пользователя обновлён.
+lookup_avatar_by_mail=Найти изображение по моему адресу эл. почты
+federated_avatar_lookup=Федерированный поиск изображений профилей
+enable_custom_avatar=Использовать своё изображение профиля
+choose_new_avatar=Выберите новое изображение профиля
+update_avatar=Обновить изображение профиля
+delete_current_avatar=Удалить текущее изображение профиля
+uploaded_avatar_not_a_image=Загруженный файл не является изображением.
+uploaded_avatar_is_too_big=Размер выбранного файла (%d КиБ) превышает максимальный размер (%d КиБ).
+update_avatar_success=Изображение профиля было изменено.
+update_user_avatar_success=Изображение профиля было обновлено.
update_password=Обновить пароль
old_password=Текущий пароль
@@ -770,16 +800,16 @@ password_change_disabled=Нелокальные учётные записи не
emails=Адреса эл. почты
manage_emails=Управление адресами эл. почты
-manage_themes=Выберите тему по умолчанию
-manage_openid=Управление адресами OpenID
+manage_themes=Тема по умолчанию
+manage_openid=Адреса OpenID
email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе.
theme_desc=Это будет темой по умолчанию для всего сайта.
primary=Основной
activated=Активирован
requires_activation=Требуется активация
primary_email=Сделать основным
-activate_email=Отправить активацию
-activations_pending=Ожидает активации
+activate_email=Отправить письмо активации
+activations_pending=Ожидают активации
can_not_add_email_activations_pending=Ожидается активация. Если хотите добавить новый почтовый ящик, попробуйте еще раз через несколько минут.
delete_email=Удалить
email_deletion=Удалить адрес эл. почты
@@ -791,7 +821,7 @@ openid_deletion=Удалить OpenID URI
openid_deletion_desc=После удаления адреса OpenID вы не сможете войти в вашу учётную запись с его помощью. Вы уверены?
openid_deletion_success=Адрес OpenID удален.
add_new_email=Добавить адрес эл. почты
-add_new_openid=Добавить новый OpenID URI
+add_new_openid=Добавить новый URI OpenID
add_email=Добавить адрес эл. почты
add_openid=Добавить адрес OpenID
add_email_confirmation_sent=Письмо для подтверждения отправлено на «%s». Пожалуйста, проверьте ваш почтовый ящик в течение %s, чтобы завершить процесс подтверждения.
@@ -814,7 +844,7 @@ add_new_key=Добавить ключ SSH
add_new_gpg_key=Добавить ключ GPG
key_content_ssh_placeholder=Начинается с «ssh-ed25519», «ssh-rsa», «ecdsa-sha2-nistp256», «ecdsa-sha2-nistp384», «ecdsa-sha2-nistp521», «sk-ecdsa-sha2-nistp256@openssh.com» или «sk-ssh-ed25519@openssh.com»
key_content_gpg_placeholder=Начинается с «-----BEGIN PGP PUBLIC KEY BLOCK-----»
-add_new_principal=Добавить принципала
+add_new_principal=Добавить принципал
ssh_key_been_used=Этот ключ SSH уже был добавлен на сервер.
ssh_key_name_used=Ключ SSH с таким именем уже есть в вашей учётной записи.
ssh_principal_been_used=Принципал уже был добавлен на сервер.
@@ -881,7 +911,7 @@ social_desc=Эти учётные записи социальных сетей
unbind=Удалить связь
unbind_success=Учётная запись социальной сети успешно удалена.
-manage_access_token=Управление токенами
+manage_access_token=Токены доступа
generate_new_token=Создать новый токен
tokens_desc=Эти токены предоставляют доступ к вашей учётной записи с помощью Forgejo API.
token_name=Имя токена
@@ -916,7 +946,7 @@ create_oauth2_application_button=Создать приложение
create_oauth2_application_success=Вы успешно создали новое приложение OAuth2.
update_oauth2_application_success=Изменения настроек приложения OAuth2 успешно применены.
oauth2_application_name=Имя приложения
-oauth2_redirect_uris=URI для перенаправления. Используйте новую строку для каждого URI.
+oauth2_redirect_uris=URI перенаправлений. Размещайте URI на отдельных строках.
save_application=Сохранить
oauth2_client_id=ИД клиента
oauth2_client_secret=Клиентский ключ
@@ -959,11 +989,11 @@ webauthn_delete_key=Удалить ключ безопасности
webauthn_delete_key_desc=Если удалить ключ безопасности, его больше не выйдет использовать для входа. Продолжить?
webauthn_key_loss_warning=Потеря ключей безопасности приведёт к утрате доступа к учётной записи.
-manage_account_links=Управление привязанными учётными записями
+manage_account_links=Привязанные учетные записи
manage_account_links_desc=Эти сторонние учётные записи привязаны к вашей учётной записи Forgejo.
account_links_not_available=У вас нет привязанных сторонних учётных записей.
link_account=Привязать учётную запись
-remove_account_link=Удалить привязанный аккаунт
+remove_account_link=Удалить привязанную учётную запись
remove_account_link_desc=Удаление привязанной учётной записи отменит её доступ к вашей учётной записи Forgejo. Продолжить?
remove_account_link_success=Привязанная учётная запись удалена.
@@ -972,11 +1002,11 @@ orgs_none=Вы не состоите ни в одной организации.
repos_none=Вы не владеете ни одним репозиторием.
delete_account=Удаление учётной записи
-delete_prompt=Эта операция навсегда удалит вашу учётную запись. Это НЕВОЗМОЖНО будет отменить.
+delete_prompt=Эта операция навсегда удалит вашу учётную запись. Её НЕВОЗМОЖНО отменить.
delete_with_all_comments=Ваша учётная запись младше %s. Чтобы избежать комментариев к плану, все комментарии к ней будут удалены.
confirm_delete_account=Подтвердить удаление
-delete_account_title=Удалить эту учётную запись
-delete_account_desc=Вы уверены, что хотите навсегда удалить эту учётную запись?
+delete_account_title=Удаление учётной записи
+delete_account_desc=Вы точно хотите навсегда удалить эту учётную запись?
email_notifications.enable=Включить уведомления по эл. почте
email_notifications.onmention=Посылать письмо на эл. почту только при упоминании
@@ -984,13 +1014,13 @@ email_notifications.disable=Отключить уведомления по по
email_notifications.submit=Задать настройку уведомлений
email_notifications.andyourown=И ваши собственные уведомления
-visibility=Видимость пользователя
+visibility=Видимость профиля
visibility.public=Публичный
-visibility.public_tooltip=Видимый для всех
+visibility.public_tooltip=Виден всем, кто может открыть этот сайт
visibility.limited=Ограниченный
-visibility.limited_tooltip=Виден только выполнившим вход пользователям
-visibility.private=Приватный
-visibility.private_tooltip=Видно только участникам организаций, к которым вы присоединились
+visibility.limited_tooltip=Виден только зарегистрированным пользователям сайта
+visibility.private=Частный
+visibility.private_tooltip=Виден только участникам организаций, в которых вы состоите
blocked_users_none = Заблокированных пользователей нет.
user_block_success = Пользователь заблокирован.
oauth2_application_locked = Forgejo предварительно регистрирует некоторые приложения OAuth2 при запуске, если это включено в конфигурации. Для избежания неожиданного поведения их нельзя удалять или редактировать. Ознакомиться с подробностями можно в документации OAuth2.
@@ -1000,7 +1030,7 @@ blocked_since = Заблокирован с %s
user_unblock_success = Пользователь разблокирован.
twofa_scratch_token_regenerated = Ваш одноразовый ключ восстановления: %s. Сохраните его в надёжном месте. Больше он показан не будет.
blocked_users = Заблокированные пользователи
-keep_email_private_popup = Ваш адрес эл. почты будет скрыт из профиля и не будет использован для запросов на слияние или при редактировании файлов из веб-интерфейса. Уже существующие комиты не будут изменены. Используйте %s в качестве адреса для комитов, чтобы они ассоциировались с вашей учётной записью.
+keep_email_private_popup = Ваш адрес эл. почты будет скрыт из профиля. Он больше не будет использоваться по умолчанию для коммитов, сделанных из веб-интерфейса, таких как загрузки и редактирования файлов и не будет использоваться для коммитов запросов на слияние. Вместо него можно будет использовать специальный адрес %s, чтобы присваивать коммиты с вашим аккаунтом. Обратите внимание на то, что изменение данной настройки не повлияет на существующие коммиты.
oauth2_confidential_client = Конфиденциальный клиент. Выберите для приложений, хранящих секрет в тайне, например, для веб-приложений. Не выбирайте для нативных приложений, включая приложения для ПК или смартфонов.
change_password = Изменение пароля
hints = Подсказки
@@ -1012,6 +1042,9 @@ pronouns_custom = Другие
pronouns = Местоимения
pronouns_unspecified = Не указаны
language.title = Язык по умолчанию
+keep_activity_private.description = Ваша публичная активность будет видна только вам и администраторам сервера.
+language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа.
+language.localization_project = Помогите с переводом Forgejo на свой язык! Подробнее.
[repo]
owner=Владелец
@@ -1021,7 +1054,7 @@ repo_name_helper=Лучшие названия репозиториев сост
repo_size=Размер репозитория
size_format = `%[1]s: %[2]s; %[3]s: %[4]s`
template=Шаблон
-template_select=Выбрать шаблон.
+template_select=Выберите шаблон
template_helper=Сделать репозиторий шаблоном
template_description=Шаблонные репозитории дают возможность пользователям создавать новые репозитории с той же структурой каталогов, файлами и дополнительными настройками.
visibility=Видимость
@@ -1035,8 +1068,8 @@ fork_from=Ответвить от
already_forked=У вас уже есть ответвление %s
fork_to_different_account=Ответвление для другой учётной записи
fork_visibility_helper=Нельзя изменить видимость ответвлённого репозитория.
-fork_branch=Ветка, клонируемая в ответвление
-all_branches=Все ветки
+fork_branch=Ветвь, клонируемая в ответвление
+all_branches=Все ветви
use_template=Использовать этот шаблон
clone_in_vsc=Клонировать в VS Code
download_zip=Скачать ZIP
@@ -1047,15 +1080,15 @@ generate_from=Создать из
repo_desc=Описание
repo_desc_helper=Добавьте краткое описание (необязательно)
repo_lang=Язык
-repo_gitignore_helper=Выберите шаблон .gitignore.
+repo_gitignore_helper=Выберите шаблоны .gitignore
repo_gitignore_helper_desc=Выберите из списка шаблонов для популярных языков , какие файлы не надо отслеживать. По умолчанию в .gitignore включены типичные артефакты, создаваемые инструментами сборки каждого языка.
-issue_labels=Метки задач
-issue_labels_helper=Выберите набор ярлыков задачи.
+issue_labels=Метки
+issue_labels_helper=Выберите набор меток
license=Лицензия
-license_helper=Выберите файл лицензии.
+license_helper=Выберите лицензию
license_helper_desc=Лицензия определяет, что другие люди могут, а что не могут делать с вашим кодом. Не уверены, какая лицензия подходит для вашего проекта? Смотрите Выберите лицензию.
readme=README
-readme_helper=Выберите шаблон README.
+readme_helper=Выберите шаблон README
readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта.
auto_init=Инициализировать репозиторий (Добавляет .gitignore, LICENSE and README)
trust_model_helper=Выберите модель доверия для проверки подписи. Возможные варианты:
@@ -1064,9 +1097,9 @@ trust_model_helper_committer=Автор коммита: доверять под
trust_model_helper_collaborator_committer=Соучастник+Коммитер: доверять подписям соучастников, которые соответствуют автору коммита
trust_model_helper_default=По умолчанию: используйте модель доверия по умолчанию для этой установки
create_repo=Создать репозиторий
-default_branch=Ветка по умолчанию
+default_branch=Ветвь по умолчанию
default_branch_label=по умолчанию
-default_branch_helper=Ветка по умолчанию является базовой веткой для запросов на слияние и коммитов кода.
+default_branch_helper=Ветвь по умолчанию является базовой ветвью для запросов на слияние и коммитов кода.
mirror_prune=Очистить
mirror_prune_desc=Удаление устаревших отслеживаемых ссылок
mirror_interval=Интервал зеркалирования (единицы времени: «h», «m», «s»). Значение 0 отключит периодическую синхронизацию. (Мин. интервал: %s)
@@ -1102,14 +1135,14 @@ blame_prior=Показать авторство предшествующих и
author_search_tooltip=Показывает максимум 30 пользователей
tree_path_not_found_commit=Путь %[1]s не существует в коммите %[2]s
-tree_path_not_found_branch=Путь %[1]s не существует в ветке %[2]s
+tree_path_not_found_branch=Путь %[1]s не существует в ветви %[2]s
transfer.accept=Принять передачу
transfer.accept_desc=Переместить в «%s»
transfer.reject=Отказаться от передачи
transfer.reject_desc=Отменить перемещение в «%s»
-desc.private=Приватный
+desc.private=Частный
desc.public=Публичный
desc.template=Шаблон
desc.internal=Внутренний
@@ -1121,7 +1154,7 @@ template.git_hooks=Git-хуки
template.git_hooks_tooltip=В настоящее время вы не можете изменить или удалить Git-хуки после добавления. Выберите это только если вы доверяете репозиторию шаблона.
template.webhooks=Веб-хуки
template.topics=Темы
-template.avatar=Аватар
+template.avatar=Картинка
template.issue_labels=Метки задач
template.one_item=Необходимо выбрать хотя бы один элемент шаблона
template.invalid=Необходимо выбрать шаблон репозитория
@@ -1211,13 +1244,13 @@ empty_message=В репозитории нет файлов.
broken_message=Данные Git, лежащие в основе репозитория, не могут быть прочитаны. Свяжитесь с администратором этого ресурса или удалите этот репозиторий.
code=Код
-code.desc=Исходный код, файлы, коммиты и ветки.
-branch=ветка
+code.desc=Исходный код, файлы, коммиты и ветви.
+branch=ветвь
tree=Дерево
clear_ref=`Удалить текущую ссылку`
-filter_branch_and_tag=Фильтр по ветке или тегу
+filter_branch_and_tag=Фильтр по ветви или тегу
find_tag=Найти тег
-branches=ветки
+branches=ветви
tags=теги
issues=Задачи
pulls=Слияния
@@ -1257,16 +1290,17 @@ view_git_blame=Показать git blame
video_not_supported_in_browser=Ваш браузер не поддерживает тэг HTML5 «video».
audio_not_supported_in_browser=Ваш браузер не поддерживает тэг HTML5 «audio».
stored_lfs=Хранится Git LFS
+stored_annex=Хранится Git Annex
symbolic_link=Символическая ссылка
executable_file=Исполняемый файл
commit_graph=Граф коммитов
-commit_graph.select=Выбрать ветку
+commit_graph.select=Выбрать ветвь
commit_graph.hide_pr_refs=Скрыть запросы слияний
commit_graph.monochrome=Моно
commit_graph.color=Цвет
commit.contained_in=Этот коммит содержится в:
-commit.contained_in_default_branch=Этот коммит является частью ветки по умолчанию
-commit.load_referencing_branches_and_tags=Загрузить ветки и теги, ссылающиеся на этот коммит
+commit.contained_in_default_branch=Этот коммит является частью ветви по умолчанию
+commit.load_referencing_branches_and_tags=Загрузить ветви и теги, ссылающиеся на этот коммит
blame=Авторство
download_file=Скачать файл
normal_view=Обычный вид
@@ -1280,10 +1314,11 @@ editor.upload_file=Загрузить файл
editor.edit_file=Редактировать файл
editor.preview_changes=Просмотр изменений
editor.cannot_edit_lfs_files=LFS файлы невозможно редактировать в веб-интерфейсе.
+editor.cannot_edit_annex_files=Annex файлы невозможно редактировать в веб-интерфейсе.
editor.cannot_edit_non_text_files=Двоичные файлы нельзя редактировать в веб-интерфейсе.
editor.edit_this_file=Редактировать файл
editor.this_file_locked=Файл заблокирован
-editor.must_be_on_a_branch=Чтобы внести или предложить изменения этого файла, необходимо выбрать ветку.
+editor.must_be_on_a_branch=Чтобы внести или предложить изменения этого файла, необходимо выбрать ветвь.
editor.fork_before_edit=Необходимо сделать ответвление этого репозитория, чтобы внести или предложить изменения этого файла.
editor.delete_this_file=Удалить файл
editor.must_have_write_access=Вам необходимо иметь права на запись, чтобы вносить или предлагать изменения этого файла.
@@ -1298,30 +1333,30 @@ editor.add_tmpl=Добавить «»
editor.add=Добавить %s
editor.update=Обновить %s
editor.delete=Удалить %s
-editor.patch=Применить патч
+editor.patch=Применить правку
editor.patching=Исправление:
editor.fail_to_apply_patch=Невозможно применить патч «%s»
-editor.new_patch=Новый патч
+editor.new_patch=Новая правка
editor.commit_message_desc=Добавьте необязательное расширенное описание…
editor.signoff_desc=Добавить трейлер Signed-off-by с автором коммита в конце сообщения коммита.
-editor.commit_directly_to_this_branch=Сделайте коммит напрямую в ветку %s.
-editor.create_new_branch=Создайте новую ветку для этого коммита, и сделайте запрос на слияние.
-editor.create_new_branch_np=Создать новую ветку для этого коммита.
+editor.commit_directly_to_this_branch=Сделайте коммит напрямую в ветвь %s.
+editor.create_new_branch=Создайте новую ветвь для этого коммита, и сделайте запрос на слияние.
+editor.create_new_branch_np=Создать новую ветвь для этого коммита.
editor.propose_file_change=Предложить изменение файла
-editor.new_branch_name=Укажите название новой ветки для этого коммита
-editor.new_branch_name_desc=Новое название ветки…
+editor.new_branch_name=Укажите название новой ветви для этого коммита
+editor.new_branch_name_desc=Новое название ветви…
editor.cancel=Отмена
editor.filename_cannot_be_empty=Имя файла не может быть пустым.
editor.filename_is_invalid=Недопустимое имя файла: «%s».
-editor.branch_does_not_exist=Ветка «%s» отсутствует в этом репозитории.
-editor.branch_already_exists=Ветка «%s» уже существует в этом репозитории.
+editor.branch_does_not_exist=Ветвь «%s» отсутствует в этом репозитории.
+editor.branch_already_exists=Ветвь «%s» уже существует в этом репозитории.
editor.directory_is_a_file=Имя каталога «%s» уже используется в качестве имени файла в этом репозитории.
editor.file_is_a_symlink=`«%s» является символической ссылкой. Символические ссылки невозможно отредактировать в веб-редакторе`
editor.filename_is_a_directory=Имя файла «%s» уже используется в качестве каталога в этом репозитории.
editor.file_editing_no_longer_exists=Редактируемый файл «%s» больше не существует в этом репозитории.
editor.file_deleting_no_longer_exists=Удаляемый файл «%s» больше не существует в этом репозитории.
editor.file_changed_while_editing=Содержимое файла изменилось с момента начала редактирования. Нажмите здесь, чтобы увидеть, что было изменено, или Зафиксировать изменения снова, чтобы заменить их.
-editor.file_already_exists=Файл «%s» уже существует в этом репозитории.
+editor.file_already_exists=Файл с названием «%s» уже существует в этом репозитории.
editor.commit_empty_file_header=Закоммитить пустой файл
editor.commit_empty_file_text=Файл, который вы собираетесь зафиксировать, пуст. Продолжить?
editor.no_changes_to_show=Нет изменений.
@@ -1329,26 +1364,26 @@ editor.fail_to_update_file=Не удалось обновить/создать
editor.fail_to_update_file_summary=Ошибка:
editor.push_rejected_no_message=Изменение отклонено сервером без сообщения. Пожалуйста, проверьте Git-хуки.
editor.push_rejected=Изменение отклонено сервером. Пожалуйста, проверьте Git-хуки.
-editor.push_rejected_summary=Полное сообщение об отклонении:
+editor.push_rejected_summary=Причина отклонения:
editor.add_subdir=Добавить каталог…
editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v
editor.upload_file_is_locked=Файл «%s» заблокирован %s.
editor.upload_files_to_dir=Загрузить файлы в «%s»
-editor.cannot_commit_to_protected_branch=Невозможно сделать коммит в защищённую ветку «%s».
-editor.no_commit_to_branch=Невозможно совершить прямой коммит в ветку по причине:
-editor.user_no_push_to_branch=Пользователь не может отправлять коммиты в эту ветку
-editor.require_signed_commit=Ветка ожидает подписанный коммит
+editor.cannot_commit_to_protected_branch=Невозможно сделать коммит в защищённую ветвь «%s».
+editor.no_commit_to_branch=Невозможно совершить прямой коммит в ветвь по причине:
+editor.user_no_push_to_branch=Пользователь не может отправлять коммиты в эту ветвь
+editor.require_signed_commit=Ветвь ожидает подписанный коммит
editor.cherry_pick=Перенести изменения %s в:
editor.revert=Откатить %s к:
commits.desc=Просмотр истории изменений исходного кода.
commits.commits=коммиты
commits.no_commits=Нет общих коммитов. «%s» и «%s» имеют совершенно разные истории.
-commits.nothing_to_compare=Эти ветки одинаковы.
+commits.nothing_to_compare=Эти ветви одинаковы.
commits.search=Поиск коммитов…
commits.search.tooltip=Можно предварять ключевые слова префиксами "author:", "committer:", "after:", или "before:", например "revert author:Alice before:2019-01-13".
commits.find=Поиск
-commits.search_all=Во всех ветках
+commits.search_all=Во всех ветвях
commits.author=Автор
commits.message=Сообщение
commits.date=Дата
@@ -1363,10 +1398,10 @@ commits.ssh_key_fingerprint=Отпечаток ключа SSH
commit.operations=Операции
commit.revert=Откатить
commit.revert-header=Откат: %s
-commit.revert-content=Выбрать ветку для отката:
+commit.revert-content=Выбрать ветвь для отката:
commit.cherry-pick=Перенос
commit.cherry-pick-header=Выбрать: %s
-commit.cherry-pick-content=Выбрать ветку для переноса:
+commit.cherry-pick-content=Выбрать ветвь для переноса:
commitstatus.error=Ошибка
commitstatus.failure=Неудача
@@ -1423,25 +1458,25 @@ issues.filter_milestones=Фильтр этапов
issues.filter_projects=Фильтровать проекты
issues.filter_labels=Фильтр меток
issues.filter_reviewers=Фильтр рецензентов
-issues.new=Добавить задачу
+issues.new=Создать задачу
issues.new.title_empty=Заголовок не может быть пустым
issues.new.labels=Метки
issues.new.no_label=Нет меток
issues.new.clear_labels=Очистить метки
issues.new.projects=Проекты
-issues.new.clear_projects=Очистить проекты
+issues.new.clear_projects=Удалить из проектов
issues.new.no_projects=Нет проекта
issues.new.open_projects=Открытые проекты
issues.new.closed_projects=Закрытые проекты
issues.new.no_items=Нет элементов
issues.new.milestone=Этап
issues.new.no_milestone=Нет этапа
-issues.new.clear_milestone=Очистить этап
+issues.new.clear_milestone=Удалить из этапа
issues.new.open_milestone=Открытые этапы
issues.new.closed_milestone=Завершённые этапы
issues.new.assignees=Назначенные
-issues.new.clear_assignees=Убрать ответственных
-issues.new.no_assignees=Нет назначенных лиц
+issues.new.clear_assignees=Снять назначения
+issues.new.no_assignees=Нет назначенных
issues.new.no_reviewers=Нет рецензентов
issues.choose.get_started=Начать
issues.choose.open_external_link=Открыть
@@ -1449,8 +1484,8 @@ issues.choose.blank=По умолчанию
issues.choose.blank_about=Создать запрос из шаблона по умолчанию.
issues.choose.ignore_invalid_templates=Некорректные шаблоны были проигнорированы
issues.choose.invalid_templates=Найден(ы) %v неверный(х) шаблон(ов)
-issues.choose.invalid_config=Конфигурация задачи содержит ошибки:
-issues.no_ref=Нет связанной ветки или тега
+issues.choose.invalid_config=Ошибки в конфигурации задачи:
+issues.no_ref=Нет связанной ветви или тега
issues.create=Создать задачу
issues.new_label=Новая метка
issues.new_label_placeholder=Имя метки
@@ -1482,7 +1517,7 @@ issues.change_title_at=`изменил(а) заголовок с %s
issues.change_ref_at=`изменил(а) ссылку с %s на %s %s`
issues.remove_ref_at=`убрал(а) ссылку %s %s`
issues.add_ref_at=`добавлена ссылка %s %s`
-issues.delete_branch_at=`удалена ветка %s %s`
+issues.delete_branch_at=`удалена ветвь %s %s`
issues.filter_label=Метка
issues.filter_label_exclude=`Используйте alt + click/enter, чтобы исключить метки`
issues.filter_label_no_select=Все метки
@@ -1494,7 +1529,7 @@ issues.filter_milestone_open=Открытые этапы
issues.filter_milestone_closed=Завершённые этапы
issues.filter_project=Проект
issues.filter_project_all=Все проекты
-issues.filter_project_none=Нет проекта
+issues.filter_project_none=Без проекта
issues.filter_assignee=Назначено
issues.filter_assginee_no_select=Все назначения
issues.filter_assginee_no_assignee=Нет ответственного
@@ -1525,9 +1560,9 @@ issues.action_open=Открыть
issues.action_close=Закрыть
issues.action_label=Метка
issues.action_milestone=Этап
-issues.action_milestone_no_select=Нет этапа
-issues.action_assignee=Ответственный
-issues.action_assignee_no_select=Нет ответственного
+issues.action_milestone_no_select=Без этапа
+issues.action_assignee=Назначенный
+issues.action_assignee_no_select=Без назначенного
issues.action_check=Выбрать/отменить выбор
issues.action_check_all=Выбрать/отменить выбор всех элементов
issues.opened_by=открыта %[1]s %[3]s
@@ -1542,7 +1577,7 @@ issues.open_title=Открыто
issues.closed_title=Закрыто
issues.draft_title=Черновик
issues.num_comments_1=%d комментарий
-issues.num_comments=комментариев: %d
+issues.num_comments=%d комментариев
issues.commented_at=`оставлен комментарий %s`
issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий?
issues.context.copy_link=Копировать ссылку
@@ -1563,8 +1598,8 @@ issues.reopened_at=`задача была открыта снова %[2]s`
issues.ref_issue_from=`упоминание этой задачи %[4]s%[2]s`
issues.ref_pull_from=`упоминание этого запроса слияния %[4]s%[2]s`
-issues.ref_closing_from=`упоминание запроса слияния %[4]s, закрывающего эту задачу%[2]s`
-issues.ref_reopening_from=`упоминание запроса слияния %[4]s, повторно открывающего эту задачу%[2]s`
+issues.ref_closing_from=`упоминание из запроса на слияние %[4]s, который закроет эту задачу%[2]s`
+issues.ref_reopening_from=`упоминание из запроса на слияние %[4]s, который повторно откроет эту задачу%[2]s`
issues.ref_closed_from=`закрыл этот запрос %[4]s%[2]s`
issues.ref_reopened_from=`задача была открыта снова %[4]s%[2]s`
issues.ref_from=`из %[1]s`
@@ -1756,45 +1791,45 @@ pulls.desc=Включить запросы на слияние и проверк
pulls.new=Создать запрос
pulls.view=Просмотр запроса на слияние
pulls.compare_changes=Новый запрос на слияние
-pulls.allow_edits_from_maintainers=Разрешить редактирование сопровождающими
-pulls.allow_edits_from_maintainers_desc=Пользователи с доступом на запись в основную ветку могут отправлять изменения и в эту ветку
+pulls.allow_edits_from_maintainers=Разрешить правки от сопровождающих
+pulls.allow_edits_from_maintainers_desc=Пользователи с доступом на запись в основную ветвь могут отправлять изменения и в эту ветвь
pulls.allow_edits_from_maintainers_err=Не удалось обновить
-pulls.compare_changes_desc=Сравнить две ветки и создать запрос на слияние для изменений.
+pulls.compare_changes_desc=Сравнить две ветви и создать запрос на слияние для изменений.
pulls.has_viewed_file=Просмотрено
pulls.has_changed_since_last_review=Изменено с момента вашего последнего отзыва
pulls.viewed_files_label=%[1]d из %[2]d файлов просмотрено
pulls.expand_files=Показать все файлы
pulls.collapse_files=Свернуть все файлы
-pulls.compare_base=базовая ветка
+pulls.compare_base=базовая ветвь
pulls.compare_compare=взять из
pulls.switch_comparison_type=Переключить тип сравнения
-pulls.switch_head_and_base=Поменять исходную и целевую ветки местами
-pulls.filter_branch=Фильтр по ветке
+pulls.switch_head_and_base=Поменять исходную и целевую ветви местами
+pulls.filter_branch=Фильтр по ветви
pulls.no_results=Результатов не найдено.
pulls.show_all_commits=Показать все коммиты
pulls.show_changes_since_your_last_review=Показать изменения с момента вашего последнего отзыва
pulls.showing_only_single_commit=Показать только изменения коммита %[1]s
pulls.showing_specified_commit_range=Показаны только изменения между %[1]s..%[2]
pulls.filter_changes_by_commit=Фильтр по коммиту
-pulls.nothing_to_compare=Нечего сравнивать, родительская и текущая ветка одинаковые.
-pulls.nothing_to_compare_and_allow_empty_pr=Ветки идентичны. Этот PR будет пустым.
-pulls.has_pull_request=`Запрос на слияние этих веток уже существует: %[2]s#%[3]d`
+pulls.nothing_to_compare=Нечего сравнивать, родительская и текущая ветвь одинаковые.
+pulls.nothing_to_compare_and_allow_empty_pr=Ветви идентичны. Этот PR будет пустым.
+pulls.has_pull_request=`Запрос на слияние этих ветвей уже существует: %[2]s#%[3]d`
pulls.create=Создать запрос на слияние
pulls.title_desc_one=хочет влить %[1]d коммит из %[2]s в %[3]s
pulls.title_desc_few=хочет влить %[1]d коммит(ов) из %[2]s в %[3]s
pulls.merged_title_desc_one=слит %[1]d коммит из %[2]s в %[3]s %[4]s
pulls.merged_title_desc_few=слито %[1]d коммит(ов) из %[2]s в %[3]s %[4]s
-pulls.change_target_branch_at=`изменил(а) целевую ветку с %s на %s %s`
+pulls.change_target_branch_at=`изменил(а) целевую ветвь с %s на %s %s`
pulls.tab_conversation=Обсуждение
pulls.tab_commits=Коммиты
pulls.tab_files=Изменённые файлы
pulls.reopen_to_merge=Пожалуйста, переоткройте этот запрос на слияние для выполнения слияния.
-pulls.cant_reopen_deleted_branch=Этот запрос на слияние не может быть открыт заново, потому что ветка была удалена.
+pulls.cant_reopen_deleted_branch=Этот запрос на слияние не может быть открыт заново, потому что ветвь была удалена.
pulls.merged=Слито
pulls.merged_success=Запрос на слияние удовлетворён и закрыт
pulls.closed=Запрос на слияние закрыт
pulls.manually_merged=Слито вручную
-pulls.merged_info_text=Ветку %s теперь можно удалить.
+pulls.merged_info_text=Ветвь %s теперь можно удалить.
pulls.is_closed=Запрос на слияние закрыт.
pulls.title_wip_desc=`Добавьте %s в начало заголовка для защиты от случайного досрочного принятия запроса на слияние`
pulls.cannot_merge_work_in_progress=Этот запрос слияния помечен как черновик.
@@ -1802,10 +1837,10 @@ pulls.still_in_progress=Всё ещё в процессе?
pulls.add_prefix=Добавить префикс %s
pulls.remove_prefix=Удалить префикс %s
pulls.data_broken=Содержимое этого слияния нарушено из-за удаления информации об ответвлении.
-pulls.files_conflicted=Этот запрос на слияние имеет изменения конфликтующие с целевой веткой.
+pulls.files_conflicted=Этот запрос на слияние имеет изменения конфликтующие с целевой ветвью.
pulls.is_checking=Продолжается проверка конфликтов. Повторите попытку позже.
-pulls.is_ancestor=Эта ветка уже включена в целевую ветку. Объединять нечего.
-pulls.is_empty=Изменения из этой ветки уже есть в целевой ветке. Получится пустой коммит.
+pulls.is_ancestor=Эта ветвь уже включена в целевую ветвь. Объединять нечего.
+pulls.is_empty=Изменения из этой ветви уже есть в целевой ветви. Получится пустой коммит.
pulls.required_status_check_failed=Некоторые необходимые проверки не были пройдены.
pulls.required_status_check_missing=Отсутствуют некоторые обязательные проверки.
pulls.required_status_check_administrator=Как администратор, вы все равно можете принять этот запрос на слияние.
@@ -1822,7 +1857,7 @@ pulls.reject_count_1=%d запрос изменений
pulls.reject_count_n=%d запросов изменений
pulls.waiting_count_1=%d ожидает проверки
pulls.waiting_count_n=%d ожидающих проверки
-pulls.wrong_commit_id=id коммита должен быть ид коммита в целевой ветке
+pulls.wrong_commit_id=ид коммита должен быть ид коммита в целевой ветви
pulls.no_merge_desc=Запрос на слияние не может быть принят, так как отключены все настройки слияния.
pulls.no_merge_helper=Включите опции слияния в настройках репозитория или совершите слияние этого запроса вручную.
@@ -1835,7 +1870,7 @@ pulls.rebase_merge_commit_pull_request=Выполнить rebase и создат
pulls.squash_merge_pull_request=Создать объединяющий коммит
pulls.merge_manually=Слито вручную
pulls.merge_commit_id=ИД коммита слияния
-pulls.require_signed_wont_sign=Данная ветка ожидает подписанные коммиты, однако слияние не будет подписано
+pulls.require_signed_wont_sign=Данная ветвь ожидает подписанные коммиты, однако слияние не будет подписано
pulls.invalid_merge_option=Этот параметр слияния нельзя использовать для этого запроса на слияние.
pulls.merge_conflict=Слияние не удалось: произошел конфликт во время слияния. Совет: попробуйте другую стратегию
@@ -1849,7 +1884,7 @@ pulls.push_rejected=Отправка была отклонена. Проверь
pulls.push_rejected_summary=Полная причина отклонения
pulls.push_rejected_no_message=Отправка была отклонена и удалённый сервер не указал причину. Проверьте Git-хуки этого репозитория
pulls.open_unmerged_pull_exists=`Нельзя открыть снова, поскольку существует другой открытый запрос на слияние (#%d) с такими же свойствами.`
-pulls.status_checking=Выполняются проверки
+pulls.status_checking=Ожидается выполнение проверок
pulls.status_checks_success=Все проверки успешно пройдены
pulls.status_checks_warning=Некоторые проверки имеют предупреждения
pulls.status_checks_failure=Некоторые проверки провалились
@@ -1858,15 +1893,15 @@ pulls.status_checks_requested=Требуется
pulls.status_checks_details=Подробности
pulls.status_checks_hide_all=Скрыть все проверки
pulls.status_checks_show_all=Показать все проверки
-pulls.update_branch=Обновить ветку слиянием
-pulls.update_branch_rebase=Обновить ветку перебазированием
-pulls.update_branch_success=Ветка успешно обновлена
-pulls.update_not_allowed=Недостаточно прав для обновления ветки
-pulls.outdated_with_base_branch=Эта ветка отстает от базовой ветки
+pulls.update_branch=Обновить ветвь слиянием
+pulls.update_branch_rebase=Обновить ветвь перебазированием
+pulls.update_branch_success=Ветвь успешно обновлена
+pulls.update_not_allowed=Недостаточно прав для обновления ветви
+pulls.outdated_with_base_branch=Эта ветвь отстает от базовой ветви
pulls.close=Закрыть запрос на слияние
pulls.closed_at=`закрыл этот запрос на слияние %[2]s`
pulls.reopened_at=`переоткрыл этот запрос на слияние %[2]s`
-pulls.cmd_instruction_hint=`Показать инструкции для командной строки.`
+pulls.cmd_instruction_hint=Показать инструкции для командной строки
pulls.cmd_instruction_merge_title=Слейте изменения
pulls.cmd_instruction_merge_desc=Слейте изменения и отправьте их обратно.
pulls.clear_merge_message=Очистить сообщение о слиянии
@@ -1950,7 +1985,7 @@ wiki.last_commit_info=%s редактировал(а) эту страницу %s
wiki.edit_page_button=Редактировать
wiki.new_page_button=Новая страница
wiki.file_revision=Версия страницы
-wiki.wiki_page_revisions=Версии страницы вики
+wiki.wiki_page_revisions=Версии страницы
wiki.back_to_wiki=Вернуться на страницу вики
wiki.delete_page_button=Удалить страницу
wiki.delete_page_notice_1=Удаление страницы вики «%s» не может быть отменено. Продолжить?
@@ -2003,7 +2038,7 @@ activity.unresolved_conv_label=Открытые
activity.title.releases_1=%d выпуск
activity.title.releases_n=%d выпуски
activity.title.releases_published_by=%s опубликованы %s
-activity.published_release_label=Опубликовано
+activity.published_release_label=Выпуск
activity.no_git_activity=В этот период не было новых коммитов.
activity.git_stats_exclude_merges=За исключением слияний,
activity.git_stats_author_1=%d автор
@@ -2013,7 +2048,7 @@ activity.git_stats_pushed_n=отправили
activity.git_stats_commit_1=%d коммит
activity.git_stats_commit_n=%d коммитов
activity.git_stats_push_to_branch=в %s и
-activity.git_stats_push_to_all_branches=во все ветки.
+activity.git_stats_push_to_all_branches=во все ветви.
activity.git_stats_on_default_branch=На %s,
activity.git_stats_file_1=%d файл
activity.git_stats_file_n=%d файлов
@@ -2052,9 +2087,9 @@ settings.hooks=Веб-хуки
settings.githooks=Git-хуки
settings.basic_settings=Основные параметры
settings.mirror_settings=Зеркалирование
-settings.mirror_settings.docs=Настройте свой репозиторий для автоматической синхронизации коммитов, тегов и веток с другим репозиторием.
-settings.mirror_settings.docs.disabled_pull_mirror.instructions=Настройте свой проект для автоматической отправки коммитов, тегов и веток в другой репозиторий. Pull-зеркала были отключены администратором сайта.
-settings.mirror_settings.docs.disabled_push_mirror.instructions=Настройте свой проект, чтобы автоматически получать коммиты, теги и ветки из другого репозитория.
+settings.mirror_settings.docs=Настройте свой репозиторий для автоматической синхронизации коммитов, тегов и ветвей с другим репозиторием.
+settings.mirror_settings.docs.disabled_pull_mirror.instructions=Настройте свой проект для автоматической отправки коммитов, тегов и ветвей в другой репозиторий. Pull-зеркала были отключены администратором сайта.
+settings.mirror_settings.docs.disabled_push_mirror.instructions=Настройте свой проект, чтобы автоматически получать коммиты, теги и ветви из другого репозитория.
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=В настоящее время это можно сделать только в меню «Новая миграция». Для получения дополнительной информации, пожалуйста, ознакомьтесь:
settings.mirror_settings.docs.disabled_push_mirror.info=Push-зеркала отключены администратором сайта.
settings.mirror_settings.docs.no_new_mirrors=Ваш репозиторий зеркалирует изменения в другой репозиторий или из него. Пожалуйста, имейте в виду, что в данный момент невозможно создавать новые зеркала.
@@ -2069,7 +2104,7 @@ settings.mirror_settings.direction.pull=Отправка
settings.mirror_settings.direction.push=Отправка
settings.mirror_settings.last_update=Последнее обновление
settings.mirror_settings.push_mirror.none=Push-зеркало не добавлено
-settings.mirror_settings.push_mirror.remote_url=Ссылка на удалённый git-репозиторий
+settings.mirror_settings.push_mirror.remote_url=Ссылка на удалённый Git-репозиторий
settings.mirror_settings.push_mirror.add=Добавить push-зеркало
settings.mirror_settings.push_mirror.edit_sync_time=Изменить интервал синхронизации зеркала
@@ -2078,8 +2113,8 @@ settings.push_mirror_sync_in_progress=Идёт отправка изменени
settings.site=Сайт
settings.update_settings=Сохранить настройки
settings.update_mirror_settings=Обновить настройки зеркала
-settings.branches.switch_default_branch=Изменить ветку по умолчанию
-settings.branches.update_default_branch=Сменить ветку по умолчанию
+settings.branches.switch_default_branch=Изменить ветвь по умолчанию
+settings.branches.update_default_branch=Сменить ветвь по умолчанию
settings.branches.add_new_rule=Добавить новое правило
settings.advanced_settings=Расширенные настройки
settings.wiki_desc=Включить вики репозитория
@@ -2087,14 +2122,14 @@ settings.use_internal_wiki=Использовать встроенную вик
settings.use_external_wiki=Использовать внешнюю вики
settings.external_wiki_url=Ссылка на внешнюю вики
settings.external_wiki_url_error=URL внешней вики не является корректным URL.
-settings.external_wiki_url_desc=Посетители будут перенаправлены на URL, когда они кликнут по вкладке.
-settings.issues_desc=Включить систему задач
+settings.external_wiki_url_desc=Посетители будут перенаправлены по указанному адресу вики при открытии вкладки.
+settings.issues_desc=Включить задачи
settings.use_internal_issue_tracker=Использовать встроенную систему задач
settings.use_external_issue_tracker=Использовать внешнюю систему задач
-settings.external_tracker_url=Ссылка на внешнюю систему отслеживания задач
+settings.external_tracker_url=Ссылка на внешнюю систему задач
settings.external_tracker_url_error=URL внешнего баг-трекера не является корректным URL.
-settings.external_tracker_url_desc=Посетители будут перенаправлены на URL, когда они кликнут по вкладке.
-settings.tracker_url_format=Формат ссылки внешней системы отслеживания задач
+settings.external_tracker_url_desc=Посетители будут перенаправлены по указанному адресу трекера задач при открытии вкладки.
+settings.tracker_url_format=Формат ссылки внешней системы задач
settings.tracker_url_format_error=Формат URL внешнего баг-трекера некорректен.
settings.tracker_issue_style=Формат нумерации во внешней системе задач
settings.tracker_issue_style.numeric=Цифровой
@@ -2108,22 +2143,22 @@ settings.allow_only_contributors_to_track_time=Подсчитывать врем
settings.pulls_desc=Включить запросы слияний
settings.pulls.ignore_whitespace=Игнорировать незначащие различия (пробелы, табуляцию) при проверке слияний на конфликты
settings.pulls.enable_autodetect_manual_merge=Включить автоопределение ручного слияния (Примечание: в некоторых особых случаях могут возникнуть ошибки)
-settings.pulls.allow_rebase_update=Включить обновление ветки из запроса на слияние путём rebase
-settings.pulls.default_delete_branch_after_merge=Удалить ветку запроса после его слияния по умолчанию
+settings.pulls.allow_rebase_update=Включить обновление ветви из запроса на слияние путём rebase
+settings.pulls.default_delete_branch_after_merge=Удалить ветвь запроса после его слияния по умолчанию
settings.pulls.default_allow_edits_from_maintainers=По умолчанию разрешать редактирование сопровождающими
settings.releases_desc=Включить выпуски
settings.packages_desc=Включить реестр пакетов
-settings.projects_desc=Включить проекты репозитория
+settings.projects_desc=Включить проекты
settings.actions_desc=Включить интеграцию конвейеров CI/CD с Forgejo Actions
settings.admin_settings=Настройки администратора
-settings.admin_enable_health_check=Проверять целостность этого репозитория (git fsck)
+settings.admin_enable_health_check=Проверять целостность данных в этом репозитории (git fsck)
settings.admin_code_indexer=Индексатор кода
settings.admin_stats_indexer=Индексатор статистики кода
settings.admin_indexer_commit_sha=Последний индексированный коммит
settings.admin_indexer_unindexed=Не индексировано
settings.reindex_button=Добавить в очередь переиндексации
settings.reindex_requested=Переиндексация запрошена
-settings.admin_enable_close_issues_via_commit_in_any_branch=Закрыть задачу с помощью коммита, сделанного в ветке не по умолчанию
+settings.admin_enable_close_issues_via_commit_in_any_branch=Закрыть задачу с помощью коммита, сделанного в ветви не по умолчанию
settings.danger_zone=Опасная зона
settings.new_owner_has_same_repo=У нового владельца уже есть репозиторий с таким названием.
settings.convert=Преобразовать в обычный репозиторий
@@ -2132,7 +2167,7 @@ settings.convert_notices_1=Эта операция преобразует это
settings.convert_confirm=Подтвердите преобразование
settings.convert_succeed=Репозиторий успешно преобразован в обычный.
settings.convert_fork=Преобразовать в обычный репозиторий
-settings.convert_fork_desc=Вы можете преобразовать это ответвление в обычный репозиторий. Это не может быть отменено.
+settings.convert_fork_desc=Это ответвление можно преобразовать в обычный репозиторий. Это действие невозможно отменить.
settings.convert_fork_notices_1=Эта операция преобразует этот ответвление в обычный репозиторий, и не может быть отменена.
settings.convert_fork_confirm=Преобразовать репозиторий
settings.convert_fork_succeed=Ответвление преобразовано в обычный репозиторий.
@@ -2152,7 +2187,7 @@ settings.transfer_owner=Новый владелец
settings.transfer_perform=Выполнить передачу
settings.transfer_started=Репозиторий ожидает подтверждения передачи от «%s»
settings.transfer_succeed=Репозиторий перенесён.
-settings.signing_settings=Настройки подписи верификации
+settings.signing_settings=Настройки проверки подписей
settings.trust_model=Модель доверия подписи
settings.trust_model.default=Модель доверия по умолчанию
settings.trust_model.default.desc=Использовать стандартную модель доверия репозитория для этой установки.
@@ -2170,7 +2205,7 @@ settings.wiki_delete_desc=Будьте внимательны! Как тольк
settings.wiki_delete_notices_1=- Это безвозвратно удалит и отключит вики для %s.
settings.confirm_wiki_delete=Стереть данные вики
settings.wiki_deletion_success=Данные вики репозитория удалены.
-settings.delete=Удалить этот репозиторий
+settings.delete=Удалить репозиторий
settings.delete_desc=Будьте внимательны! Как только вы удалите репозиторий — пути назад не будет.
settings.delete_notices_1=- Эта операция НЕ МОЖЕТ быть отменена.
settings.delete_notices_2=- Эта операция навсегда удалит всё из репозитория %s, включая данные Git, связанные с ним задачи, комментарии и права доступа для сотрудников.
@@ -2220,7 +2255,7 @@ settings.githook_edit_desc=Если хук не активен, будет по
settings.githook_name=Название хукa
settings.githook_content=Содержимое хука
settings.update_githook=Обновить хук
-settings.add_webhook_desc=Forgejo будет оправлять POST-запросы на указанный URL адрес с информацией о происходящих событиях. Подробности на странице инструкции по использованию веб-хуков.
+settings.add_webhook_desc=Forgejo будет оправлять POST-запросы на указанный URL адрес с указанным заголовком «Content-Type». Подробности в инструкции по использованию веб-хуков.
settings.payload_url=URL обработчика
settings.http_method=HTTP-метод
settings.content_type=Тип содержимого POST
@@ -2236,9 +2271,9 @@ settings.event_send_everything=Все события
settings.event_choose=Другие события…
settings.event_header_repository=События репозитория
settings.event_create=Создать
-settings.event_create_desc=Ветка или тэг созданы.
+settings.event_create_desc=Ветвь или тэг созданы.
settings.event_delete=Удалить
-settings.event_delete_desc=Ветка или тег удалены.
+settings.event_delete_desc=Ветвь или тег удалены.
settings.event_fork=Ответвление
settings.event_fork_desc=Ответвление создано.
settings.event_wiki=Вики
@@ -2263,17 +2298,17 @@ settings.event_issue_comment_desc=Комментарий создан, изме
settings.event_header_pull_request=События запросов слияний
settings.event_pull_request=Запрос на слияние
settings.event_pull_request_desc=Запрос на слияние открыт, закрыт, переоткрыт или отредактирован.
-settings.event_pull_request_assign=Запроса на слияние назначен
+settings.event_pull_request_assign=Запрос на слияние назначен
settings.event_pull_request_assign_desc=Запрос на слияние назначен или не назначен.
settings.event_pull_request_label=Запрос на слияние отмечен
settings.event_pull_request_label_desc=Метки запроса на слияние обновлены или очищены.
settings.event_pull_request_milestone=Этап запроса на слияние завершен
settings.event_pull_request_milestone_desc=Этап запроса на слияние или промежуточный шаг.
-settings.event_pull_request_comment=Комментарий запроса на слияние
+settings.event_pull_request_comment=Комментарий на запрос на слияние
settings.event_pull_request_comment_desc=Комментарий запроса на слияние создан, отредактирован или удалён.
settings.event_pull_request_review=Запрос на слияние рассмотрен
settings.event_pull_request_review_desc=Запрос на слияние утвержден, отклонён или оставлен комментарий.
-settings.event_pull_request_sync=Синхронизация запроса на слияние
+settings.event_pull_request_sync=Запрос на слияние синхронизирован
settings.event_pull_request_sync_desc=Запрос на слияние синхронизирован.
settings.event_pull_request_review_request=Запрошена рецензия для запроса на слияние
settings.event_pull_request_review_request_desc=Создан или удалён запрос на рецензию для запроса на слияние.
@@ -2281,7 +2316,7 @@ settings.event_pull_request_approvals=Одобрения запросов сли
settings.event_pull_request_merge=Слияние запроса на слияние
settings.event_package=Пакеты
settings.event_package_desc=Пакет создан или удален в репозитории.
-settings.branch_filter=Фильтр веток
+settings.branch_filter=Фильтр ветвей
settings.branch_filter_desc=Белый список ветвей для событий Push, создания ветвей и удаления ветвей, указанных в виде глоб-шаблона. Если пустой или *, то все событий для всех ветвей будут зарегистрированы. Перейдите по ссылке github.com/gobwas/glob на документацию по синтаксису. Примеры: master, {master,release*}.
settings.authorization_header=Заголовок авторизации
settings.authorization_header_desc=Будет включён в качестве заголовка авторизации для запросов. Примеры: %s.
@@ -2328,37 +2363,37 @@ settings.add_key_success=Ключ развёртывания «%s» добавл
settings.deploy_key_deletion=Удалить ключ развёртывания
settings.deploy_key_deletion_desc=Удаление ключа развёртывания сделает невозможным доступ к репозиторию с его помощью. Вы уверены?
settings.deploy_key_deletion_success=Ключ развёртывания удалён.
-settings.branches=Ветки
-settings.protected_branch=Защита веток
+settings.branches=Ветви
+settings.protected_branch=Защита ветвей
settings.protected_branch.save_rule=Сохранить правило
settings.protected_branch.delete_rule=Удалить правило
settings.protected_branch_can_push=Разрешить отправку?
settings.protected_branch_can_push_yes=Вы можете выполнять отправку
settings.protected_branch_can_push_no=Вы не можете выполнять отправку
-settings.branch_protection=Правила доступа ветки «%s»
-settings.protect_this_branch=Защитить эту ветку
-settings.protect_this_branch_desc=Предотвращает удаление, ограничивает Push и слияние Git в ветку.
+settings.branch_protection=Правила доступа ветви «%s»
+settings.protect_this_branch=Защитить эту ветвь
+settings.protect_this_branch_desc=Предотвращает удаление, ограничивает Push и слияние Git в ветвь.
settings.protect_disable_push=Запретить отправку изменений
-settings.protect_disable_push_desc=Отправка не будет разрешена в эту ветку.
+settings.protect_disable_push_desc=Отправка в эту ветвь не будет разрешена.
settings.protect_enable_push=Разрешить отправку изменений
-settings.protect_enable_push_desc=Любому, у кого есть доступ на запись, будет разрешена отправка изменений в эту ветку (но не принудительная отправка).
+settings.protect_enable_push_desc=Любому, у кого есть доступ на запись, будет разрешена отправка изменений в эту ветвь (но не принудительная отправка).
settings.protect_enable_merge=Разрешить слияние изменений
-settings.protect_enable_merge_desc=Все, у кого есть доступ на запись, смогут удовлетворять запросы на слияние в эту ветку.
+settings.protect_enable_merge_desc=Все, у кого есть доступ на запись, смогут удовлетворять запросы на слияние в эту ветвь.
settings.protect_whitelist_committers=Ограничение отправки по белому списку
-settings.protect_whitelist_committers_desc=Только пользователям или командам из белого списка будет разрешена отправка изменений в эту ветку (но не принудительная отправка).
+settings.protect_whitelist_committers_desc=Только пользователям или командам из белого списка будет разрешена отправка изменений в эту ветвь (но не принудительная отправка).
settings.protect_whitelist_deploy_keys=Белый список развёртываемых ключей с доступом на запись в push.
-settings.protect_whitelist_users=Пользователи, которые могут отправлять изменения в эту ветку:
+settings.protect_whitelist_users=Пользователи, которые могут отправлять изменения в эту ветвь:
settings.protect_whitelist_search_users=Поиск пользователей…
-settings.protect_whitelist_teams=Команды, члены которых могут отправлять изменения в эту ветку:
+settings.protect_whitelist_teams=Команды, члены которых могут отправлять изменения в эту ветвь:
settings.protect_whitelist_search_teams=Поиск команд…
settings.protect_merge_whitelist_committers=Ограничить право на слияние белым списком
-settings.protect_merge_whitelist_committers_desc=Разрешить принимать запросы на слияние в эту ветку только пользователям и командам из «белого списка».
+settings.protect_merge_whitelist_committers_desc=Разрешить принимать запросы на слияние в эту ветвь только пользователям и командам из «белого списка».
settings.protect_merge_whitelist_users=Пользователи с правом на слияние:
settings.protect_merge_whitelist_teams=Команды, члены которых обладают правом на слияние:
-settings.protect_check_status_contexts=Включить проверку статуса
+settings.protect_check_status_contexts=Включить проверку состояния
settings.protect_status_check_patterns=Шаблоны проверки состояния:
settings.protect_status_check_patterns_desc=Добавьте шаблоны, чтобы указать, какие проверки состояния должны быть пройдены, прежде чем ветви могут быть объединены в ветвь, соответствующую этому правилу. В каждой строке указывается шаблон. Шаблоны не могут быть пустыми.
-settings.protect_check_status_contexts_desc=Требуется пройти проверку состояния перед слиянием. Выберите, какие проверки состояния должны быть пройдены, прежде чем ветви можно будет объединить в ветвь, соответствующую этому правилу. Если этот параметр включен, коммиты сначала должны быть перемещены в другую ветвь, а затем объединены или перемещены непосредственно в ветвь, соответствующую этому правилу, после прохождения проверки состояния. Если контексты не выбраны, то последний коммит должен быть успешным вне зависимости от контекста.
+settings.protect_check_status_contexts_desc=Требовать успешнее прохождение проверок перед слиянием. Коммиты сначала должны будут быть перемещены в другую ветвь, а затем объединены или перемещены непосредственно в ветвь, соответствующую этому правилу, после прохождения проверки состояния. Если нет соответствующих контекстов, то последний коммит должен быть успешным вне зависимости от контекста.
settings.protect_check_status_contexts_list=Проверки состояния за последнюю неделю для этого репозитория
settings.protect_status_check_matched=Совпало
settings.protect_invalid_status_check_pattern=Неверный шаблон проверки состояния: «%s».
@@ -2370,37 +2405,37 @@ settings.protect_approvals_whitelist_enabled_desc=Только отзывы по
settings.protect_approvals_whitelist_users=Рецензенты в белом списке:
settings.protect_approvals_whitelist_teams=Команды в белом списке для рецензирования:
settings.dismiss_stale_approvals=Отклонить устаревшие разрешения
-settings.dismiss_stale_approvals_desc=Когда новые коммиты, изменяющие содержимое запроса на слияние, отправляются в ветку, старые разрешения будут отклонены.
+settings.dismiss_stale_approvals_desc=Когда новые коммиты, изменяющие содержимое запроса на слияние, отправляются в ветвь, старые разрешения будут отклонены.
settings.require_signed_commits=Требовать подпись коммитов
-settings.require_signed_commits_desc=Отклонить отправку изменений в эту ветку, если они не подписаны или не проверяемы.
-settings.protect_branch_name_pattern=Шаблон названий защищённых веток
-settings.protect_branch_name_pattern_desc=Шаблоны названий защищённых веток. О синтаксисе шаблонов читайте в документации. Примеры: main, release/**
+settings.require_signed_commits_desc=Отклонить отправку изменений в эту ветвь, если они не подписаны или не проверяемы.
+settings.protect_branch_name_pattern=Шаблон названий защищённых ветвей
+settings.protect_branch_name_pattern_desc=Шаблоны названий защищённых ветвей. О синтаксисе шаблонов читайте в документации. Примеры: main, release/**
settings.protect_patterns=Шаблоны
settings.protect_protected_file_patterns=Шаблоны защищённых файлов, разделённые точкой с запятой «;»:
-settings.protect_protected_file_patterns_desc=Защищенные файлы нельзя изменить напрямую, даже если пользователь имеет право добавлять, редактировать или удалять файлы в этой ветке. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt.
+settings.protect_protected_file_patterns_desc=Защищенные файлы нельзя изменить напрямую, даже если пользователь имеет право добавлять, редактировать или удалять файлы в этой ветви. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt.
settings.protect_unprotected_file_patterns=Шаблоны незащищённых файлов, разделённые точкой с запятой «;»:
settings.protect_unprotected_file_patterns_desc=Незащищенные файлы, которые допускается изменять напрямую, если пользователь имеет право на запись, несмотря на ограничение отправки изменений. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch=Включить защиту
settings.delete_protected_branch=Отключить защиту
settings.update_protect_branch_success=Правила доступа веток «%s» изменена.
settings.remove_protected_branch_success=Правила доступа веток «%s» удалена.
-settings.remove_protected_branch_failed=Не удалось удалить правило доступа веток «%s».
-settings.protected_branch_deletion=Отключение защиты ветки
-settings.protected_branch_deletion_desc=Любой пользователь с разрешениями на запись сможет выполнять push в эту ветку. Вы уверены?
+settings.remove_protected_branch_failed=Не удалось удалить правило доступа ветвей «%s».
+settings.protected_branch_deletion=Удаление правила защиты ветвей
+settings.protected_branch_deletion_desc=Любой пользователь с разрешениями на запись сможет выполнять push в эту ветвь. Вы уверены?
settings.block_rejected_reviews=Блокировка слияния по отклоненным отзывам
settings.block_rejected_reviews_desc=Слияние будет невозможно, если официальными рецензентами будут запрошены изменения, даже если имеется достаточное количество одобрений.
settings.block_on_official_review_requests=Блокировать слияние при запросах на официальное рассмотрение
settings.block_on_official_review_requests_desc=Слияние невозможно, если не имеется достаточное количество одобрений официальных представителей.
settings.block_outdated_branch=Блокировать слияние, если запрос на слияние устарел
settings.block_outdated_branch_desc=Слияние будет невозможно, если головная ветвь находится позади базовой ветви.
-settings.default_branch_desc=Главная ветка является "базовой" для вашего репозитория, на которую по умолчанию направлены все запросы на слияние и которая является лицом вашего репозитория. Первое, что увидит посетитель — это содержимое главной ветки. Выберите её из уже существующих:
+settings.default_branch_desc=Главная ветвь является "базовой" для вашего репозитория, на которую по умолчанию направлены все запросы на слияние и которая является лицом вашего репозитория. Первое, что увидит посетитель — это содержимое главной ветви. Выберите её из уже существующих:
settings.merge_style_desc=Стили слияния
settings.default_merge_style_desc=Стиль слияния по умолчанию
-settings.choose_branch=Выберите ветку…
-settings.no_protected_branch=Нет защищённых веток.
+settings.choose_branch=Выберите ветвь…
+settings.no_protected_branch=Нет защищённых ветвей.
settings.edit_protected_branch=Редактировать
settings.protected_branch_required_rule_name=Необходимо имя для правила
-settings.protected_branch_duplicate_rule_name=Для этого набора веток уже есть правило
+settings.protected_branch_duplicate_rule_name=Для этого набора ветвей уже есть правило
settings.protected_branch_required_approvals_min=Число необходимых одобрений не может быть отрицательным.
settings.tags=Теги
settings.tags.protection=Защита тегов
@@ -2411,31 +2446,31 @@ settings.tags.protection.allowed.teams=Разрешенные команды
settings.tags.protection.allowed.noone=Никто
settings.tags.protection.create=Добавить правило
settings.tags.protection.none=Нет защищенных тегов.
-settings.bot_token=Токен для бота
+settings.bot_token=Токен бота
settings.chat_id=ИД чата
settings.matrix.homeserver_url=URL домашнего сервера
settings.matrix.room_id=ИД комнаты
settings.matrix.message_type=Тип сообщения
-settings.archive.button=Архивировать
-settings.archive.header=Архивировать этот репозиторий
+settings.archive.button=Архивировать репозиторий
+settings.archive.header=Архивация репозитория
settings.archive.success=Репозиторий был успешно архивирован.
settings.archive.error=Ошибка при попытке архивировать репозиторий. Смотрите логи для получения подробностей.
settings.archive.error_ismirror=Вы не можете поместить зеркалируемый репозиторий в архив.
-settings.archive.branchsettings_unavailable=Настройки ветки недоступны, если репозиторий архивирован.
+settings.archive.branchsettings_unavailable=Настройки ветви недоступны, если репозиторий архивирован.
settings.archive.tagsettings_unavailable=Настройки тегов недоступны, если репозиторий архивирован.
settings.unarchive.button=Разархивировать
settings.unarchive.header=Вернуть этот репозиторий из архива
settings.unarchive.text=Разархивирование репозитория восстановит его способность принимать изменения, а также новые задачи и запросы на слияние.
settings.unarchive.success=Репозиторий был успешно разархивирован.
-settings.update_avatar_success=Аватар репозитория обновлён.
+settings.update_avatar_success=Картинка репозитория изменена.
settings.lfs=LFS
settings.lfs_filelist=Файлы LFS хранятся в этом репозитории
settings.lfs_no_lfs_files=Нет файлов LFS в этом репозитории
settings.lfs_findcommits=Найти коммиты
-settings.lfs_lfs_file_no_commits=Для этого LFS файла не найдено коммитов
-settings.lfs_noattribute=Этот путь не имеет блокируемого атрибута в ветке по умолчанию
+settings.lfs_lfs_file_no_commits=Не найдены коммиты с этим файлом в LFS
+settings.lfs_noattribute=Этот путь не имеет блокируемого атрибута в ветви по умолчанию
settings.lfs_delete=Удалить файл LFS с OID %s
-settings.lfs_delete_warning=Удаление файла LFS может привести к ошибкам «объект не существует» при проверке. Вы уверены?
+settings.lfs_delete_warning=Удаление файла из LFS может привести к ошибкам «объект не существует» при проверках. Вы точно хотите его удалить?
settings.lfs_findpointerfiles=Найти файлы указателя
settings.lfs_locks=Заблокировать
settings.lfs_invalid_locking_path=Недопустимый путь: %s
@@ -2443,22 +2478,22 @@ settings.lfs_invalid_lock_directory=Невозможно заблокирова
settings.lfs_lock_already_exists=Блокировка уже существует: %s
settings.lfs_lock=Заблокировать
settings.lfs_lock_path=Путь к файлу для блокировки...
-settings.lfs_locks_no_locks=Нет блокировки
-settings.lfs_lock_file_no_exist=Заблокированный файл не существует в ветке по умолчанию
+settings.lfs_locks_no_locks=Нет блокировок
+settings.lfs_lock_file_no_exist=Заблокированный файл не существует в ветви по умолчанию
settings.lfs_force_unlock=Принудительная разблокировка
settings.lfs_pointers.found=Найдено %d указатель(ей) блоков - присоединено %d, %d не привязано (%d отсутствует в хранилище)
-settings.lfs_pointers.sha=Blob SHA
+settings.lfs_pointers.sha=Хеш blob'а
settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=В репозитории
settings.lfs_pointers.exists=Существуют в хранилище
-settings.lfs_pointers.accessible=Доступно для пользователя
+settings.lfs_pointers.accessible=Доступно пользователю
settings.lfs_pointers.associateAccessible=Связать доступные %d OID
-settings.rename_branch_failed_exist=Невозможно переименовать ветку, потому что целевая ветка %s уже существует.
-settings.rename_branch_failed_not_exist=Невозможно переименовать ветку %s, потому что она не существует.
-settings.rename_branch_success=Ветка %s была успешно переименована в %s.
-settings.rename_branch_from=старое название ветки
-settings.rename_branch_to=новое название ветки
-settings.rename_branch=Переименовать ветку
+settings.rename_branch_failed_exist=Невозможно переименовать ветвь, потому что целевая ветвь %s уже существует.
+settings.rename_branch_failed_not_exist=Невозможно переименовать ветвь %s, потому что она не существует.
+settings.rename_branch_success=Ветвь %s была успешно переименована в %s.
+settings.rename_branch_from=старое название ветви
+settings.rename_branch_to=новое название ветви
+settings.rename_branch=Переименовать ветвь
diff.browse_source=Просмотр исходного кода
diff.parent=родитель
@@ -2490,7 +2525,7 @@ diff.file_suppressed=Различия файлов не показаны, т.к.
diff.file_suppressed_line_too_long=Различия файлов скрыты, т.к. они включают слишком длинные строки
diff.too_many_files=Показаны не все изменённые файлы, т.к. их слишком много
diff.show_more=Показать больше
-diff.load=Загрузить различия
+diff.load=Показать различия
diff.generated=сгенерированный
diff.vendored=предоставленный
diff.comment.placeholder=Оставить комментарий
@@ -2530,8 +2565,8 @@ release.ahead.commits=%d коммиты
release.ahead.target=%s с этого выпуска
tag.ahead.target=в %s после этого тега
release.source_code=Исходный код
-release.new_subheader=Подробный журнал изменений может помочь пользователям понять, что было изменено в очередной версии.
-release.edit_subheader=Подробный журнал изменений может помочь пользователям понять, что было изменено в очередной версии.
+release.new_subheader=Выпуски помогают с организацией и распространением версий проекта.
+release.edit_subheader=Выпуски помогают с организацией и распространением версий проекта.
release.tag_name=Имя тега
release.target=Цель
release.tag_helper=Выберите существующий тег, или создайте новый.
@@ -2563,41 +2598,41 @@ release.add_tag=Создать тег
release.releases_for=Выпуски %s
release.tags_for=Теги %s
-branch.name=Название ветки
-branch.already_exists=Ветка с названием «%s» уже существует.
+branch.name=Название ветви
+branch.already_exists=Ветвь с названием «%s» уже существует.
branch.delete_head=Удалить
-branch.delete=Удалить ветку «%s»
-branch.delete_html=Удалить ветку
-branch.delete_desc=Удаление ветки необратимо. Несмотря на то, что удаленная ветка может просуществовать некоторое время перед тем, как она будет окончательно удалена, это действие НЕВОЗМОЖНО отменить в большинстве случаев. Продолжить?
-branch.deletion_success=Ветка «%s» удалена.
-branch.deletion_failed=Не удалось удалить ветку «%s».
-branch.delete_branch_has_new_commits=Ветку «%s» нельзя удалить, поскольку после слияния были добавлены новые коммиты.
-branch.create_branch=Создать ветку %s
+branch.delete=Удалить ветвь «%s»
+branch.delete_html=Удалить ветвь
+branch.delete_desc=Удаление ветви необратимо. Несмотря на то, что удаленная ветвь может просуществовать некоторое время перед тем, как она будет окончательно удалена, это действие НЕВОЗМОЖНО отменить в большинстве случаев. Продолжить?
+branch.deletion_success=Ветвь «%s» удалена.
+branch.deletion_failed=Не удалось удалить ветвь «%s».
+branch.delete_branch_has_new_commits=Ветвь «%s» нельзя удалить, поскольку после слияния были добавлены новые коммиты.
+branch.create_branch=Создать ветвь %s
branch.create_from=от «%s»
-branch.create_success=Ветка «%s» создана.
-branch.branch_already_exists=Ветка «%s» уже существует в этом репозитории.
-branch.branch_name_conflict=Название ветки «%s» конфликтует с уже существующей веткой «%s».
-branch.tag_collision=Ветка «%s» не может быть создана, так как уже существует тег с таким именем.
+branch.create_success=Ветвь «%s» создана.
+branch.branch_already_exists=Ветвь «%s» уже существует в этом репозитории.
+branch.branch_name_conflict=Название ветви «%s» конфликтует с уже существующей ветвью «%s».
+branch.tag_collision=Ветвь «%s» не может быть создана, так как уже существует тег с таким именем.
branch.deleted_by=Удалён %s
-branch.restore_success=Ветка «%s» восстановлена.
-branch.restore_failed=Не удалось восстановить ветку «%s».
-branch.protected_deletion_failed=Ветка «%s» защищена. Её нельзя удалить.
-branch.default_deletion_failed=Ветка «%s» является веткой по умолчанию. Её нельзя удалить.
-branch.restore=Восстановить ветку «%s»
-branch.download=Скачать ветку «%s»
-branch.rename=Переименовать ветку «%s»
+branch.restore_success=Ветвь «%s» восстановлена.
+branch.restore_failed=Не удалось восстановить ветвь «%s».
+branch.protected_deletion_failed=Ветвь «%s» защищена. Её нельзя удалить.
+branch.default_deletion_failed=Ветвь «%s» является ветвью по умолчанию. Её нельзя удалить.
+branch.restore=Восстановить ветвь «%s»
+branch.download=Скачать ветвь «%s»
+branch.rename=Переименовать ветвь «%s»
branch.search=Поиск ветки
-branch.included_desc=Эта ветка является частью ветки по умолчанию
+branch.included_desc=Эта ветвь является частью ветви по умолчанию
branch.included=Включено
-branch.create_new_branch=Создать ветку из ветви:
-branch.confirm_create_branch=Создать ветку
-branch.warning_rename_default_branch=Вы переименовываете ветку по умолчанию.
-branch.rename_branch_to=Переименовать ветку «%s» в:
-branch.confirm_rename_branch=Переименовать ветку
-branch.create_branch_operation=Создать ветку
-branch.new_branch=Создать новую ветку
-branch.new_branch_from=Создать новую ветку из «%s»
-branch.renamed=Ветка %s была переименована в %s.
+branch.create_new_branch=Создать ветвь из ветви:
+branch.confirm_create_branch=Создать ветвь
+branch.warning_rename_default_branch=Вы переименовываете ветвь по умолчанию.
+branch.rename_branch_to=Переименовать ветвь «%s» в:
+branch.confirm_rename_branch=Переименовать ветвь
+branch.create_branch_operation=Создать ветвь
+branch.new_branch=Создать новую ветвь
+branch.new_branch_from=Создать новую ветвь из «%s»
+branch.renamed=Ветвь %s была переименована в %s.
tag.create_tag=Создать тег %s
tag.create_tag_operation=Создать тег
@@ -2611,7 +2646,7 @@ topic.done=Сохранить
topic.count_prompt=Нельзя выбрать более 25 тем
topic.format_prompt=Темы должны начинаться с буквы или цифры и могут содержать дефисы («-») и точки («.»). Длина темы не должна превышать 35 символов. Все буквы должны быть строчными.
-find_file.go_to_file=Перейти к файлу
+find_file.go_to_file=Найти файл
find_file.no_matching=Совпадающих файлов не найдено
error.csv.too_large=Не удается отобразить этот файл, потому что он слишком большой.
@@ -2627,7 +2662,7 @@ settings.add_collaborator_blocked_our = Невозможно добавить с
admin.enabled_flags = Включенные флаги репозитория:
admin.failed_to_replace_flags = Не удалось заменить флаги репозитория
admin.flags_replaced = Флаги репозитория заменены
-rss.must_be_on_branch = Перейдите на ветку, чтобы сделать RSS-ленту доступной.
+rss.must_be_on_branch = Перейдите к ветви, чтобы сделать RSS-ленту доступной.
admin.manage_flags = Управление флагами
admin.update_flags = Обновить флаги
object_format = Формат объекта
@@ -2647,7 +2682,7 @@ archive.title = Этот репозиторий архивирован. Вы м
archive.title_date = С %s этот репозиторий архивирован. Вы можете просматривать его содержимое или клонировать, но не добавлять новые комиты, открывать задачи или запросы на слияние.
migrate.forgejo.description = Перенести данные с codeberg.org или другого сервера Forgejo.
generated = Сгенерированный
-pulls.review_only_possible_for_full_diff = Отзыв возможен только при просмотре всех различий
+pulls.review_only_possible_for_full_diff = Оставить отзыв можно только при просмотре всех различий
diff.comment.add_line_comment = Добавить комментарий к строке
tree_path_not_found_tag = Путь %[1]s отсутствует в теге %[2]s
migrate_options_lfs_endpoint.placeholder = Если не заполнено, конечная точка будет определена из URL клонирования
@@ -2658,25 +2693,25 @@ commits.view_path = Просмотреть в этом моменте истор
commits.renamed_from = Переименован с %s
issues.due_date_not_writer = Для обновления срока выполнения задачи требуется право на запись в этом репозитории.
issues.review.outdated_description = С момента добавления этого комментария содержимое изменилось
-pulls.nothing_to_compare_have_tag = Выбранные ветки/теги идентичны.
+pulls.nothing_to_compare_have_tag = Выбранные ветви/теги идентичны.
pulls.select_commit_hold_shift_for_range = Выберите коммит. Зажмите Shift, чтобы выбрать диапазон
pulls.blocked_by_official_review_requests = Этот запрос на слияние заблокирован, т.к. у него не хватает одобрений от одного или нескольких официальных рецензентов.
-pulls.recently_pushed_new_branches = Вы отправили коммиты в ветку %[1]s %[1]s
+pulls.recently_pushed_new_branches = Вы отправили коммиты в ветвь %[1]s %[1]s
milestones.new_subheader = Этапы полезны для систематизации задач и отслеживания их выполнения.
wiki.cancel = Отмена
-settings.unarchive.error = При разархивации репозитория произошла ошибка. Подробности доступны в логе.
+settings.unarchive.error = При распаковке репозитория произошла ошибка. Подробности доступны в логе.
settings.archive.mirrors_unavailable = Зеркалирование недоступно для архивированных репозиториев.
issues.role.contributor_helper = В репозитории присутствуют коммиты за авторством этого пользователя.
-settings.wiki_rename_branch_main = Нормализовать название ветки вики
-settings.wiki_rename_branch_main_notices_2 = Внутренняя ветка вики репозитория %s будет переименована. Несохранённые изменения потребуют обновления.
-settings.wiki_branch_rename_failure = Не удалось нормализовать название ветки вики репозитория.
-settings.confirm_wiki_branch_rename = Переименовать ветку вики
+settings.wiki_rename_branch_main = Нормализовать название ветви вики
+settings.wiki_rename_branch_main_notices_2 = Внутренняя ветвь вики репозитория %s будет переименована. Несохранённые изменения потребуют обновления.
+settings.wiki_branch_rename_failure = Не удалось нормализовать название ветви вики репозитория.
+settings.confirm_wiki_branch_rename = Переименовать ветвь вики
settings.wiki_rename_branch_main_notices_1 = Эта операция НЕОБРАТИМА.
-settings.wiki_rename_branch_main_desc = Переименовать внутреннюю ветку, используемую вики, в "%s". Это изменение является перманентным и необратимым.
-settings.wiki_branch_rename_success = Название ветки вики репозитория успешно нормализовано.
+settings.wiki_rename_branch_main_desc = Переименовать внутреннюю ветвь, используемую вики, в "%s". Это изменение является перманентным и необратимым.
+settings.wiki_branch_rename_success = Название ветви вики репозитория успешно нормализовано.
ambiguous_runes_description = `Этот файл содержит символы Юникода, которые легко спутать с похожими. Если так и должно быть, можете спокойно игнорировать это предупреждение. Отобразить символы можно кнопкой Экранирования.`
editor.invalid_commit_mail = Неправильная почта для создания коммита.
-pulls.has_merged = Слияние не удалось: запрос уже был слит, изменение целевой ветки или повторное слияние невозможно.
+pulls.has_merged = Слияние не удалось: запрос уже был слит, изменение целевой ветви или повторное слияние невозможно.
settings.enter_repo_name = Введите имя владельца и название репозитория как указано:
signing.wont_sign.error = Не удалось проверить возможность подписать коммит.
signing.wont_sign.nokey = Сервер не предоставляет ключ для подписи коммита.
@@ -2688,8 +2723,8 @@ settings.units.add_more = Доб. больше...
pulls.fast_forward_only_merge_pull_request = Только fast-forward
settings.units.overview = Обзор
settings.units.units = Разделы репозитория
-pulls.reopen_failed.head_branch = Этот запрос на слияние не может быть открыт заново, потому что головная ветка больше не существует.
-pulls.reopen_failed.base_branch = Этот запрос на слияние не может быть открыт заново, потому что базовая ветка больше не существует.
+pulls.reopen_failed.head_branch = Этот запрос на слияние не может быть открыт заново, потому что головная ветвь больше не существует.
+pulls.reopen_failed.base_branch = Этот запрос на слияние не может быть открыт заново, потому что базовая ветвь больше не существует.
settings.ignore_stale_approvals = Игнорировать устаревшие одобрения
contributors.contribution_type.commits = Коммиты
contributors.contribution_type.additions = Добавления
@@ -2704,7 +2739,7 @@ activity.navbar.recent_commits = Недавние коммиты
settings.confirmation_string = Подтверждение
settings.archive.text = Архивация репозитория сделает всё его содержимое доступным только для чтения. Он будет скрыт с домашнего экрана. Никто (включая вас!) не сможет добавлять коммиты, открывать задачи и запросы слияний.
release.deletion_desc = Удаление выпуска удаляет его только в Forgejo. Это действие не затронет тег в git, содержимое репозитория и его историю. Продолжить?
-pulls.agit_explanation = Создано через рабочий поток AGit. С ним можно предлагать изменения, используя команду «git push», без необходимости в создании ответвления или новой ветки.
+pulls.agit_explanation = Создано через рабочий поток AGit. С ним можно предлагать изменения, используя команду «git push», без необходимости в создании ответвления или новой ветви.
settings.webhook.replay.description_disabled = Активируйте веб-хук для повторения отправки.
activity.navbar.pulse = Недавняя активность
settings.tags.protection.pattern.description = Можно указать название тега. Для выбора нескольких тегов можно указать поисковый шаблон или регулярное выражение. Подробнее о защищённых тегах.
@@ -2714,20 +2749,20 @@ settings.ignore_stale_approvals_desc = Не учитывать одобрени
settings.mirror_settings.docs.doc_link_pull_section = раздел документации «Pulling from a remote repository».
wiki.original_git_entry_tooltip = Перейти по настоящему пути вместо читабельной ссылки.
open_with_editor = Открыть в %s
-commits.search_branch = В этой ветке
+commits.search_branch = В этой ветви
stars = Добавившие в избранное
n_tag_one = %s тег
-n_branch_few = %s веток
+n_branch_few = %s ветвей
n_commit_few = %s коммитов
n_commit_one = %s коммит
n_tag_few = %s тегов
-n_branch_one = %s ветка
+n_branch_one = %s ветвь
pulls.ready_for_review = Готово к рецензии?
-editor.commit_id_not_matching = ID коммита не совпадает с тем, который вы редактировали. Сохраните изменения в новую ветку и выполните слияние.
+editor.commit_id_not_matching = Файл был изменён кем-то другим, пока вы его редактировали. Сохраните изменения в новую ветвь и выполните слияние.
editor.push_out_of_date = Похоже, отправка устарела.
settings.enforce_on_admins = Обязательно для администраторов репозитория
settings.enforce_on_admins_desc = Администраторы репозитория не смогут обойти это ограничение.
-settings.rename_branch_failed_protected = Невозможно переименовать защищённую ветку «%s».
+settings.rename_branch_failed_protected = Невозможно переименовать защищённую ветвь «%s».
issues.archived_label_description = (Архивная) %s
settings.sourcehut_builds.graphql_url = Ссылка на GraphQL (напр. https://builds.sr.ht/query)
settings.sourcehut_builds.secrets_helper = Дать задачам доступ к секретам сборки (требуется разрешение SECRETS:RO)
@@ -2740,9 +2775,9 @@ release.download_count_one = %s скачивание
release.download_count_few = %s скачиваний
release.system_generated = Это вложение сгенерировано автоматически.
settings.event_pull_request_enforcement = Форсирование
-pulls.cmd_instruction_checkout_desc = В репозитории вашего проекта перейдите на эта ветку и протестируйте изменения.
+pulls.cmd_instruction_checkout_desc = В репозитории вашего проекта перейдите на эту ветвь и протестируйте изменения.
error.broken_git_hook = Гит-хуки этого репозитория сломаны. Ознакомьтесь с документацией и почините их, затем отправьте какие-нибудь коммиты для обновления статуса.
-pulls.cmd_instruction_checkout_title = Перейдите на ветку
+pulls.cmd_instruction_checkout_title = Перейдите к ветви
settings.graphql_url = Ссылка GraphQL
settings.sourcehut_builds.access_token_helper = Токен builds.sr.ht с разрешением JOBS:RW. Создайте обычный токен или токен с доступом к секретам на meta.sr.ht.
settings.matrix.room_id_helper = ID комнаты можно получить в веб-клиенте Element: Настройки комнаты > Подробности > Внутренний ID комнаты. Пример: %s.
@@ -2761,12 +2796,28 @@ issues.edit.already_changed = Не удалось отредактировать
pulls.edit.already_changed = Не удалось отредактировать запрос слияния. Похоже, содержимое уже было изменено другим пользователем. Попробуйте обновить страницу и отредактировать запрос ещё раз, чтобы избежать отмены чужих изменений
comments.edit.already_changed = Не удалось отредактировать комментарий. Похоже, он уже был изменён другим пользователем. Попробуйте обновить страницу и отредактировать его ещё раз, чтобы избежать отмены чужих изменений
settings.federation_settings = Настройки федерации
-settings.federation_apapiurl = Федеративная ссылка на этот репозиторий. Скопируйте и вставьте её в настройки федерации другого репозитория как ссылку следуемого репозитория.
-settings.federation_following_repos = Ссылки следуемых репозиториев. Разделены с «;», без пробелов.
+settings.federation_apapiurl = Федеративная ссылка на этот репозиторий. Скопируйте и вставьте её в настройки федерации другого репозитория как ссылку репозитория для отслеживания.
+settings.federation_following_repos = Ссылки на отслеживаемые репозитории. Разделяются с помощью «;», без пробелов.
n_release_one = %s выпуск
n_release_few = %s выпусков
subscribe.issue.guest.tooltip = Войдите, чтобы подписаться на эту задачу.
subscribe.pull.guest.tooltip = Войдите, чтобы подписаться на это слияние.
+issues.author.tooltip.issue = Автор этой задачи.
+issues.author.tooltip.pr = Автор этого запроса слияния.
+activity.commit = Кол-во коммитов
+milestones.filter_sort.name = По названию
+release.asset_external_url = Внешняя ссылка
+release.type_external_asset = Внешний файл
+release.asset_name = Название файла
+release.invalid_external_url = Недопустимая ссылка: «%s»
+release.add_external_asset = Добавить внешний файл
+release.type_attachment = Вложение
+activity.published_prerelease_label = Пред. выпуск
+activity.published_tag_label = Тег
+settings.transfer_quota_exceeded = У нового владельца (%s) превышена квота. Репозиторий не будет передан.
+settings.pull_mirror_sync_quota_exceeded = Квота исчерпана, синхронизация невозможна.
+no_eol.text = Без EOL
+no_eol.tooltip = В этом файле отсутствует завершающий символ конца строки.
[graphs]
@@ -2816,7 +2867,7 @@ settings.update_settings=Обновить настройки
settings.update_setting_success=Настройки организации обновлены.
settings.change_orgname_prompt=Обратите внимание: изменение названия организации также изменит URL вашей организации и освободит старое имя.
settings.change_orgname_redirect_prompt=Старое имя будет перенаправлено до тех пор, пока оно не будет введено.
-settings.update_avatar_success=Аватар организации обновлён.
+settings.update_avatar_success=Изображение организации обновлено.
settings.delete=Удалить организацию
settings.delete_account=Удалить эту организацию
settings.delete_prompt=Это действие БЕЗВОЗВРАТНО удалит эту организацию навсегда!
@@ -2838,13 +2889,13 @@ members.member=Участник
members.remove=Удалить
members.remove.detail=Исключить %[1]s из %[2]s?
members.leave=Покинуть
-members.leave.detail=Покинуть %s?
+members.leave.detail=Вы точно хотите покинуть организацию «%s»?
members.invite_desc=Добавить нового участника в %s:
members.invite_now=Пригласить
teams.join=Присоединиться
teams.leave=Выйти
-teams.leave.detail=Покинуть %s?
+teams.leave.detail=Вы точно хотите покинуть команду «%s»?
teams.can_create_org_repo=Создать репозитории
teams.can_create_org_repo_helper=Участники могут создавать новые репозитории в организации. Создатель получит администраторский доступ к новому репозиторию.
teams.none_access=Нет доступа
@@ -2939,7 +2990,7 @@ dashboard.delete_repo_archives=Удалить все архивы репозит
dashboard.delete_repo_archives.started=Удаление всех архивов репозитория началось.
dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git
dashboard.delete_missing_repos.started=Начато удаление всех репозиториев без Git-файлов.
-dashboard.delete_generated_repository_avatars=Удалить генерированные аватары репозитория
+dashboard.delete_generated_repository_avatars=Удалить сгенерированные картинки репозиториев
dashboard.update_mirrors=Обновить зеркала
dashboard.repo_health_check=Проверка состояния всех репозиториев
dashboard.check_repo_stats=Проверить всю статистику репозитория
@@ -2988,23 +3039,23 @@ dashboard.delete_old_actions.started=Запущено удаление всех
dashboard.update_checker=Проверка обновлений
dashboard.delete_old_system_notices=Удалить все старые системные уведомления из базы данных
dashboard.gc_lfs=Выполнить сборку мусора метаобъектов LFS
-dashboard.stop_zombie_tasks=Остановить задания-зомби
-dashboard.stop_endless_tasks=Остановить непрекращающиеся задания
-dashboard.cancel_abandoned_jobs=Отменить брошенные задания
-dashboard.start_schedule_tasks=Запустить запланированные задания
+dashboard.stop_zombie_tasks=Остановить зомби-задания действий
+dashboard.stop_endless_tasks=Остановить непрекращающиеся задания действий
+dashboard.cancel_abandoned_jobs=Отменить брошенные задания действий
+dashboard.start_schedule_tasks=Запустить запланированные задания действий
users.user_manage_panel=Управление пользователями
-users.new_account=Создать новую учётную запись
+users.new_account=Создать новую уч. запись
users.name=Имя пользователя
users.full_name=Полное имя
users.activated=Активирован
users.admin=Администратор
-users.restricted=Ограничено
+users.restricted=Ограничен
users.reserved=Резерв
users.bot=Бот
-users.2fa=Двухфакторная авторизация
+users.2fa=2ФА
users.repos=Репозитории
-users.created=Создано
+users.created=Регистрация
users.last_login=Последний вход
users.never_login=Никогда не входил
users.send_register_notify=Уведомить о регистрации по эл. почте
@@ -3018,21 +3069,21 @@ users.update_profile_success=Профиль учётной записи обно
users.edit_account=Изменение учётной записи
users.max_repo_creation=Ограничение количества репозиториев
users.max_repo_creation_desc=(Установите -1 для использования стандартного глобального значения предела)
-users.is_activated=Эта учётная запись активирована
-users.prohibit_login=Вход запрещён
-users.is_admin=Является администратором
-users.is_restricted=Ограниченная
-users.allow_git_hook=Может создавать Git-хуки
+users.is_activated=Подтверждённая уч. запись
+users.prohibit_login=Приостановленная уч. запись
+users.is_admin=Уч. запись администратора
+users.is_restricted=Ограниченная уч. запись
+users.allow_git_hook=Разрешено создание Git-хуков
users.allow_git_hook_tooltip=Git hooks выполняются от пользователя ОС, под которым работает Forgejo. Они будут иметь такой же доступ к хосту. Из-за этого пользователи с правами на Git hook будут иметь возможность получать доступ и модифицировать все репозитории в Forgejo, а также базу данных Forgejo. Следовательно, они также могут получить права администратора Forgejo.
-users.allow_import_local=Может импортировать локальные репозитории
-users.allow_create_organization=Может создавать организации
+users.allow_import_local=Разрешён импорт локальных репозиториев
+users.allow_create_organization=Разрешено создание организаций
users.update_profile=Обновить учётную запись
-users.delete_account=Удалить эту учётную запись
+users.delete_account=Удалить учётную запись
users.cannot_delete_self=Вы не можете удалить свою учётную запись
users.still_own_repo=Этот пользователь всё ещё является владельцем одного или более репозиториев. Сначала удалите или передайте эти репозитории.
users.still_has_org=Этот пользователь состоит в одной или нескольких организациях. Сначала удалите пользователя из всех организаций.
-users.purge=Удалить пользователя
-users.purge_help=Принудительное удаление пользователя и любых репозиториев, организаций и пакетов, принадлежащих пользователю. Все комментарии и задачи этого пользователя тоже будут удалены.
+users.purge=Уничтожить данные
+users.purge_help=Принудительно удалить все данные, связанные с этим пользователем: все его репозитории, организации, пакеты, все созданные им задачи и оставленные комментарии.
users.still_own_packages=Этот пользователь всё ещё владеет одним или несколькими пакетами, сначала удалите их.
users.deletion_success=Учётная запись успешно удалена.
users.reset_2fa=Сброс 2ФА
@@ -3067,11 +3118,11 @@ orgs.org_manage_panel=Управление организациями
orgs.name=Название
orgs.teams=Команды
orgs.members=Участники
-orgs.new_orga=Новая организация
+orgs.new_orga=Создать организацию
repos.repo_manage_panel=Управление репозиториями
repos.unadopted=Непринятые репозитории
-repos.unadopted.no_more=Больше непринятых репозиториев не найдено
+repos.unadopted.no_more=Непринятые репозитории не найдены.
repos.owner=Владелец
repos.name=Название
repos.private=Частный
@@ -3118,7 +3169,7 @@ auths.domain=Домен
auths.host=Сервер
auths.port=Порт
auths.bind_dn=Bind DN
-auths.bind_password=Привязать пароль
+auths.bind_password=Пароль bind
auths.user_base=База поиска пользователей
auths.user_dn=DN пользователя
auths.attribute_username=Атрибут username
@@ -3127,14 +3178,14 @@ auths.attribute_name=Атрибут first name
auths.attribute_surname=Атрибут surname
auths.attribute_mail=Атрибут эл. почты
auths.attribute_ssh_public_key=Атрибут открытого ключа SSH
-auths.attribute_avatar=Атрибут аватара
-auths.attributes_in_bind=Извлекать атрибуты в контексте Bind DN
+auths.attribute_avatar=Атрибут изображения профиля (avatar)
+auths.attributes_in_bind=Извлекать атрибуты в контексте bind DN
auths.allow_deactivate_all=Разрешить пустой результат поиска для отключения всех пользователей
auths.use_paged_search=Использовать постраничный поиск
auths.search_page_size=Размер страницы
-auths.filter=Фильтр пользователя
-auths.admin_filter=Фильтр администратора
-auths.restricted_filter=Ограниченный фильтр
+auths.filter=Фильтр пользователей
+auths.admin_filter=Фильтр администраторов
+auths.restricted_filter=Фильтр ограниченных пользователей
auths.restricted_filter_helper=Оставьте пустым, чтобы не назначать никаких пользователей ограниченными. Используйте звёздочку («*»), чтобы сделать ограниченными всех пользователей, не соответствующих фильтру администратора.
auths.verify_group_membership=Проверить принадлежность к группе в LDAP (оставьте фильтр пустым, чтобы пропустить)
auths.group_search_base=Поисковая база групп DN
@@ -3152,11 +3203,11 @@ auths.allowed_domains_helper=Разделяйте домены запятыми
auths.skip_tls_verify=Пропуск проверки TLS
auths.force_smtps=Принудительный SMTPS
auths.force_smtps_helper=SMTPS всегда использует 465 порт. Установите это, что бы принудительно использовать SMTPS на других портах. (Иначе STARTTLS будет использоваться на других портах, если это поддерживается хостом.)
-auths.helo_hostname=HELO Hostname
+auths.helo_hostname=Имя хоста HELO
auths.helo_hostname_helper=Имя хоста отправляется с HELO. Оставьте поле пустым, чтобы отправить текущее имя хоста.
auths.disable_helo=Отключить HELO
auths.pam_service_name=Имя службы PAM
-auths.pam_email_domain=Домен почты PAM (необязательно)
+auths.pam_email_domain=Почтовый домен PAM (необязателен)
auths.oauth2_provider=Поставщик OAuth2
auths.oauth2_icon_url=URL иконки
auths.oauth2_clientID=ID клиента (ключ)
@@ -3170,17 +3221,17 @@ auths.oauth2_emailURL=URL эл. почты
auths.skip_local_two_fa=Пропустить локальную двухфакторную аутентификацию
auths.skip_local_two_fa_helper=Если значение не задано, локальным пользователям с установленной двухфакторной аутентификацией все равно придется пройти двухфакторную аутентификацию для входа в систему
auths.oauth2_tenant=Tenant
-auths.oauth2_scopes=Дополнительные полномочия
-auths.oauth2_required_claim_name=Необходимое имя заявки
+auths.oauth2_scopes=Дополнительные разрешения
+auths.oauth2_required_claim_name=Требуемое имя заявки
auths.oauth2_required_claim_name_helper=Задайте, чтобы ограничить вход с этого источника только пользователями с заявкой, имеющей такое имя
-auths.oauth2_required_claim_value=Необходимое значение заявки
+auths.oauth2_required_claim_value=Требуемое значение заявки
auths.oauth2_required_claim_value_helper=Задайте, чтобы ограничить вход с этого источника только пользователями с заявкой, имеющей такие имя и значение
auths.oauth2_group_claim_name=Имя заявки, указывающее имена групп для этого источника. (Необязательно)
auths.oauth2_admin_group=Значение заявки группы для администраторов. (Необязательно - требуется имя заявки выше)
auths.oauth2_restricted_group=Значение заявки группы для ограниченных пользователей. (Необязательно - требуется имя заявки выше)
auths.oauth2_map_group_to_team=Сопоставление заявленных групп командам организации. (Необязательно — требуется имя заявки выше)
auths.oauth2_map_group_to_team_removal=Удалить пользователей из синхронизированных команд, если пользователь не принадлежит к соответствующей группе.
-auths.enable_auto_register=Включить автоматическую регистрацию
+auths.enable_auto_register=Автоматическая регистрация
auths.sspi_auto_create_users=Автоматически создавать пользователей
auths.sspi_auto_create_users_helper=Разрешить метод аутентификации SSPI для автоматического создания новых учётных записей для пользователей, которые впервые входят в систему
auths.sspi_auto_activate_users=Автоматически активировать пользователей
@@ -3204,14 +3255,14 @@ auths.tip.google_plus=Получите учётные данные клиент
auths.tip.openid_connect=Используйте URL в OpenID Connect Discovery (/.well-known/openid-configuration) для указания конечных точек
auths.tip.twitter=Перейдите на https://dev.twitter.com/apps, создайте приложение и убедитесь, что включена опция «Разрешить использовать это приложение для входа через Twitter»
auths.tip.discord=Зарегистрируйте новое приложение на https://discordapp.com/developers/applications/me
-auths.tip.yandex=Создайте новое приложение на https://oauth.yandex.com/client/new. В разделе «API Яндекс.Паспорта» выберите следующие разрешения: «Доступ к адресу эл. почты», «Доступ к аватару пользователя» и «Доступ к логину, имени, фамилии и полу»
+auths.tip.yandex=Создайте новое приложение на https://oauth.yandex.com/client/new. В разделе «API Яндекс.Паспорта» выберите следующие разрешения: «Доступ к адресу электронной почты», «Доступ к портрету пользователя» и «Доступ к логину, имени, фамилии, полу»
auths.tip.mastodon=Введите URL сервера Mastodon, который хотите использовать (или оставьте сервер по умолчанию)
-auths.edit=Обновить параметры аутентификации
+auths.edit=Изменить параметры аутентификации
auths.activated=Источник аутентификации активирован
auths.new_success=Метод аутентификации «%s» добавлен.
auths.update_success=Источник аутентификации обновлён.
auths.update=Обновить источник аутентификации
-auths.delete=Удалить этот источник аутентификации
+auths.delete=Удалить источник аутентификации
auths.delete_auth_title=Удалить источник аутентификации
auths.delete_auth_desc=Удаление источника аутентификации не позволяет пользователям использовать его для входа. Продолжить?
auths.still_in_used=Эта проверка подлинности до сих пор используется некоторыми пользователями, удалите или преобразуйте этих пользователей в другой тип входа в систему.
@@ -3230,7 +3281,7 @@ config.custom_file_root_path=Путь до каталога с файлами д
config.domain=Домен сервера
config.offline_mode=Локальный режим
config.disable_router_log=Отключение журнала маршрутизатора
-config.run_user=Запуск от имени пользователя
+config.run_user=Выполнение под пользователем
config.run_mode=Режим работы
config.git_version=Версия git
config.app_data_path=Путь к данным приложения
@@ -3249,8 +3300,8 @@ config.ssh_listen_port=Прослушиваемый порт
config.ssh_root_path=Корневой путь
config.ssh_key_test_path=Путь к тестовому ключу
config.ssh_keygen_path=Путь до генератора ключей («ssh-keygen»)
-config.ssh_minimum_key_size_check=Минимальный размер ключа проверки
-config.ssh_minimum_key_sizes=Минимальные размеры ключа
+config.ssh_minimum_key_size_check=Проверка минимального размер ключа
+config.ssh_minimum_key_sizes=Минимальные размеры ключей
config.lfs_config=Конфигурация LFS
config.lfs_enabled=Включено
@@ -3274,7 +3325,7 @@ config.allow_only_external_registration=Регистрация только че
config.enable_openid_signup=Саморегистрация через OpenID
config.enable_openid_signin=Вход через OpenID
config.show_registration_button=Кнопка регистрации
-config.require_sign_in_view=Для просмотра необходима авторизация
+config.require_sign_in_view=Для просмотра содержимого необходима авторизация
config.mail_notify=Уведомления по эл. почте
config.enable_captcha=CAPTCHA
config.active_code_lives=Срок действия кода активации учётной записи
@@ -3283,7 +3334,7 @@ config.default_keep_email_private=Скрывать адреса эл. почты
config.default_allow_create_organization=Разрешить создание организаций по умолчанию
config.enable_timetracking=Отслеживание времени
config.default_enable_timetracking=Включить отслеживание времени по умолчанию
-config.allow_dots_in_usernames = Разрешить точки в логинах пользователей. Это не повлияет на уже созданные учётные записи.
+config.allow_dots_in_usernames = Разрешить точки в именах пользователей. Это не повлияет на уже созданные учётные записи.
config.default_allow_only_contributors_to_track_time=Подсчитывать время могут только соавторы
config.no_reply_address=Домен скрытых адресов почты
config.default_visibility_organization=Видимость новых организаций по умолчанию
@@ -3303,7 +3354,7 @@ config.mailer_smtp_addr=Адрес SMTP
config.mailer_smtp_port=Порт SMTP
config.mailer_user=Пользователь
config.mailer_use_sendmail=Использовать Sendmail
-config.mailer_sendmail_path=Путь к Sendmail
+config.mailer_sendmail_path=Путь Sendmail
config.mailer_sendmail_args=Дополнительные аргументы для Sendmail
config.mailer_sendmail_timeout=Истечение ожидания Sendmail
config.mailer_use_dummy=Заглушка
@@ -3331,10 +3382,10 @@ config.session_life_time=Время жизни сессии
config.https_only=Только HTTPS
config.cookie_life_time=Время жизни файла cookie
-config.picture_config=Конфигурация аватаров и изображений
+config.picture_config=Конфигурация изображений профилей
config.picture_service=Служба изображений
config.disable_gravatar=Отключить Gravatar
-config.enable_federated_avatar=Федерированные аватары
+config.enable_federated_avatar=Федерированные изображения профилей
config.git_config=Конфигурация Git
config.git_disable_diff_highlight=Отключить подсветку синтаксиса при сравнении
@@ -3400,9 +3451,9 @@ monitor.queue.settings.remove_all_items_done=Все элементы в очер
notices.system_notice_list=Системные оповещения
notices.view_detail_header=Подробности уведомления
notices.operations=Операции
-notices.select_all=Выбрать всё
-notices.deselect_all=Отменить выделение
-notices.inverse_selection=Инверсия выделения
+notices.select_all=Выбрать все
+notices.deselect_all=Снять выделение
+notices.inverse_selection=Инвертировать выделенные
notices.delete_selected=Удалить выбранные
notices.delete_all=Удалить все уведомления
notices.type=Тип
@@ -3416,13 +3467,13 @@ auths.tip.gitea = Зарегистрируйте новое приложение
auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть:
self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "gitea doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL.
dashboard.cleanup_actions = Очистить устаревшие журналы и артефакты Действий
-dashboard.sync_repo_branches = Синхронизировать ветки из Git в базу данных
+dashboard.sync_repo_branches = Синхронизировать ветви из Git в базу данных
assets = Кодовые объекты
dashboard.sync_tag.started = Начата синхронизация тегов
settings = Админ. настройки
self_check.database_collation_case_insensitive = БД использует нечувствительное сопоставление %s. Хоть Forgejo и будет работать, могут возникать случаи с неожиданным поведением.
self_check.database_inconsistent_collation_columns = БД использует сопоставление %s, но эти столбцы используют перемешанные сопоставления. Это может вызывать неожиданные проблемы.
-dashboard.sync_branch.started = Начата синхронизация веток
+dashboard.sync_branch.started = Начата синхронизация ветвей
dashboard.sync_repo_tags = Синхронизировать теги из Git в базу данных
self_check.database_collation_mismatch = Ожидается, что БД использует сопоставление: %s
self_check = Самопроверка
@@ -3438,6 +3489,20 @@ auths.tip.gitlab_new = Создайте новое приложение в https
monitor.queue.review_add = Подробности / добавить обработчики
auths.default_domain_name = Домен по умолчанию для адресов эл. почты
config.app_slogan = Лозунг сервера
+config.cache_test = Проверить кэш
+config.cache_test_slow = Кэш проверен успешно, но ответ был медленным: %s.
+config.cache_test_failed = Не удалось проверить кэш: %v.
+config.cache_test_succeeded = Кэш был проверен успешно, ответ получен за %v.
+users.activated.description = Подтверждение учётной записи по эл. почте. Пользователь неподтверждённой уч. записи не сможет войти, не выполнив подтверждение.
+users.block.description = Заблокировать учётную запись, чтобы препятствовать её использованию и запретить вход.
+users.organization_creation.description = Разрешить создание новых организаций на сервере.
+users.local_import.description = Разрешить импортировать репозитории из локальной ФС сервера. Это может нести угрозу безопасности.
+users.admin.description = Предоставить полный доступ к административному функционалу веб-интерфейса и API.
+users.restricted.description = Разрешить взаимодействие с лишь репозиториями и организациями, в которых этот пользователь состоит в качестве соучастника. Предотвращает доступ к публичным репозиториям на этом сервере.
+emails.delete = Удалить адрес
+emails.deletion_success = Адрес эл. посты удалён из учётной записи.
+emails.delete_primary_email_error = Невозможно удалить основной адрес.
+emails.delete_desc = Вы точно хотите удалить этот адрес эл. почты?
[action]
@@ -3457,7 +3522,7 @@ auto_merge_pull_request=`автоматически принят запрос н
transfer_repo=передан репозиторий %s%s
push_tag=создан тег %[3]s в %[4]s
delete_tag=удалён тэг %[2]s из %[3]s
-delete_branch=удалена ветка %[2]s из %[3]s
+delete_branch=удалена ветвь %[2]s из %[3]s
compare_branch=Сравнить
compare_commits=Сравнить %d коммитов
compare_commits_general=Сравнить коммиты
@@ -3469,7 +3534,7 @@ reject_pull_request=`предложил(а) изменения для %[4]s опубликован в %[3]s`
review_dismissed=`отклонён отзыв от %[4]s для %[3]s#%[2]s`
review_dismissed_reason=Причина:
-create_branch=создана ветка %[3]s в %[4]s
+create_branch=создана ветвь %[3]s в %[4]s
starred_repo=добавлено %[2]s в избранное
watched_repo=теперь отслеживает %[2]s
@@ -3503,7 +3568,7 @@ pib = ПиБ
eib = ЭиБ
[dropzone]
-default_message=Перетащите файл или кликните сюда для загрузки.
+default_message=Перетащите сюда файлы или нажмите для загрузки.
invalid_input_type=Вы не можете загружать файлы этого типа.
file_too_big=Размер файла ({{filesize}} МБ) больше чем максимальный размер ({{maxFilesize}} МБ).
remove_file=Удалить файл
@@ -3525,7 +3590,7 @@ no_subscriptions=Нет подписок
[gpg]
default_key=Подписано ключом по умолчанию
error.extract_sign=Не удалось извлечь подпись
-error.generate_hash=Не удалось создать хэш коммита
+error.generate_hash=Не удалось создать хеш коммита
error.no_committer_account=Учётная запись с эл. почтой этого коммитера не найдена
error.no_gpg_keys_found=Не найден ключ, соответствующий данной подписи
error.not_signed_commit=Неподписанный коммит
@@ -3559,9 +3624,9 @@ dependencies=Зависимости
keywords=Ключевые слова
details=Сведения
details.author=Автор
-details.project_site=Сайт проекта
-details.repository_site=Сайт репозитория
-details.documentation_site=Сайт документации
+details.project_site=Веб-сайт проекта
+details.repository_site=Веб-сайт репозитория
+details.documentation_site=Веб-сайт документации
details.license=Лицензия
assets=Ресурсы
versions=Версии
@@ -3573,7 +3638,7 @@ alpine.registry.key=Загрузите публичный ключ RSA реес
alpine.registry.info=Выберите $branch и $repository из списка ниже.
alpine.install=Чтобы установить пакет, выполните следующую команду:
alpine.repository=О репозитории
-alpine.repository.branches=Ветки
+alpine.repository.branches=Ветви
alpine.repository.repositories=Репозитории
alpine.repository.architectures=Архитектуры
cargo.registry=Настройте этот реестр в файле конфигурации Cargo (например, ~/.cargo/config.toml):
@@ -3664,10 +3729,10 @@ owner.settings.cargo.initialize.success=Индекс Cargo успешно соз
owner.settings.cargo.rebuild=Перестроить индекс
owner.settings.cargo.rebuild.error=Не удалось перестроить индекс Cargo: %v
owner.settings.cargo.rebuild.success=Индекс Cargo успешно перестроен.
-owner.settings.cleanuprules.title=Управление правилами очистки
+owner.settings.cleanuprules.title=Правила очистки
owner.settings.cleanuprules.add=Добавить правило очистки
owner.settings.cleanuprules.edit=Изменить правило очистки
-owner.settings.cleanuprules.preview=Предварительный просмотр правила очистки
+owner.settings.cleanuprules.preview=Предпросмотр правила очистки
owner.settings.cleanuprules.preview.overview=Планируется удалить %d пакетов.
owner.settings.cleanuprules.preview.none=Правило очистки не соответствует ни одному пакету.
owner.settings.cleanuprules.enabled=Включено
@@ -3693,6 +3758,22 @@ rpm.repository.multiple_groups = Этот пакет доступен в нес
owner.settings.chef.keypair.description = Для аутентификации реестра Chef необходима пара ключей. Если до этого вы уже сгенерировали пару ключей, генерация новой приведёт к прекращению действия предыдущей.
owner.settings.cargo.rebuild.no_index = Невозможно выполнить пересборку. Нет инициализированного индекса.
npm.dependencies.bundle = Комплектные зависимости
+arch.pacman.conf = Добавьте адрес с необходимым дистрибутивом и архитектурой в /etc/pacman.conf:
+arch.pacman.helper.gpg = Добавьте сертификат доверия в pacman:
+arch.pacman.repo.multi.item = Конфигурация %s
+arch.pacman.sync = Синхронизируйте пакет в pacman:
+arch.version.properties = Свойства версии
+arch.version.description = Описание
+arch.version.provides = Предоставляет
+arch.version.groups = Группа
+arch.version.depends = Зависит от
+arch.version.optdepends = Опциональные зависимости
+arch.pacman.repo.multi = У %s имеется одна и та же версия в разных дистрибутивах.
+arch.version.makedepends = Сборочные зависимости
+arch.version.replaces = Заменяет
+arch.version.backup = Рез. копия
+arch.version.conflicts = Конфликтует с
+arch.version.checkdepends = Проверочные зависимости
[secrets]
secrets=Секреты
@@ -3803,11 +3884,20 @@ runs.status_no_select = Любое состояние
runs.no_matching_online_runner_helper = Нет работающего исполнителя с меткой: %s
runs.no_job_without_needs = Рабочий поток должен содержать хотя бы одну задачу без зависимостей.
runs.no_job = Рабочий поток должен включать хотя бы одну задачу
+workflow.dispatch.trigger_found = Этот рабочий поток срабатывает на события workflow_dispatch.
+workflow.dispatch.use_from = Использовать рабочий поток из
+workflow.dispatch.run = Выполнить рабочий поток
+workflow.dispatch.success = Выполнение рабочего потока запрошено успешно.
+workflow.dispatch.input_required = Требовать значение для поля «%s».
+workflow.dispatch.invalid_input_type = Неизвестный тип поля «%s».
+workflow.dispatch.warn_input_limit = Отображаются только первые %d полей.
+runs.expire_log_message = Журнал был удалён из-за старости.
[projects]
type-1.display_name=Индивидуальный проект
type-2.display_name=Проект репозитория
type-3.display_name=Проект организации
+deleted.display_name = Удалённый проект
[git.filemode]
changed_filemode=%[1]s → %[2]s
@@ -3832,7 +3922,7 @@ recent_commits.what = недавние коммиты
[search]
search = Поиск...
-fuzzy_tooltip = Включать результаты, достаточно похожие на запрос
+fuzzy_tooltip = Включает результаты, достаточно похожие на запрос, даже при наличии неточностей
type_tooltip = Тип поиска
fuzzy = Приблизительный
match = Точный
@@ -3843,7 +3933,7 @@ team_kind = Поиск команд...
code_kind = Поиск по коду...
package_kind = Поиск пакетов...
project_kind = Поиск проектов...
-branch_kind = Поиск веток...
+branch_kind = Поиск ветвей...
commit_kind = Поиск коммитов...
no_results = По запросу ничего не найдено.
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора.
@@ -3852,12 +3942,18 @@ code_search_unavailable = Поиск по коду сейчас недоступ
runner_kind = Поиск исполнителей...
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
exact = Точный
-exact_tooltip = Включать только результаты, точно соответствующие запросу
+exact_tooltip = Включает только результаты, в точности соответствующие запросу
issue_kind = Поиск задач...
pull_kind = Поиск слияний...
+union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами
+union = Обычный
+milestone_kind = Поиск этапов...
[markup]
filepreview.line = Строка %[1]d в %[2]s
filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
-filepreview.truncated = Предпросмотр был обрезан
\ No newline at end of file
+filepreview.truncated = Предпросмотр был обрезан
+
+[translation_meta]
+test = хи-хи
\ No newline at end of file
diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini
index a6fb37c2bb..132f9be5ee 100644
--- a/options/locale/locale_si-LK.ini
+++ b/options/locale/locale_si-LK.ini
@@ -324,7 +324,7 @@ activate_account.text_2=%sතුළ ඔබගේ ගිණුම සක
activate_email=ඔබගේ විද්යුත් තැපැල් ලිපිනය සත්යාපනය කරන්න
activate_email.text=තුළ ඔබගේ විද්යුත් තැපැල් ලිපිනය සත්යාපනය කිරීමට පහත සබැඳිය ක්ලික් කරන්න %s:
-register_notify=ගිටියා වෙත සාදරයෙන් පිළිගනිමු
+register_notify_prev9=ගිටියා වෙත සාදරයෙන් පිළිගනිමු
register_notify.title=%[1]s, %[2]s වෙත සාදරයෙන් පිළිගනිමු
register_notify.text_1=මෙය %sසඳහා ඔබගේ ලියාපදිංචි තහවුරු කිරීමේ විද්යුත් තැපෑලයි!
register_notify.text_2=ඔබට දැන් පරිශීලක නාමය හරහා පිවිසිය හැකිය: %s.
@@ -890,6 +890,7 @@ file_copy_permalink=පිටපත් මාමලින්ක්
video_not_supported_in_browser=ඔබගේ බ්රව්සරය HTML5 'වීඩියෝ' ටැගය සඳහා සහය නොදක්වයි.
audio_not_supported_in_browser=ඔබගේ බ්රව්සරය HTML5 'ශ්රව්ය' ටැගය සඳහා සහය නොදක්වයි.
stored_lfs=Git LFS සමඟ ගබඩා
+stored_annex=Git Annex සමඟ ගබඩා
symbolic_link=සංකේතාත්මක සබැඳිය
commit_graph=ප්රස්තාරය කැප
commit_graph.select=ශාඛා තෝරන්න
@@ -907,6 +908,7 @@ editor.upload_file=ගොනුව උඩුගත කරන්න
editor.edit_file=ගොනුව සංස්කරණය
editor.preview_changes=වෙනස්කම් පෙරදසුන
editor.cannot_edit_lfs_files=LFS ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය කළ නොහැක.
+editor.cannot_edit_annex_files=Annex ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය කළ නොහැක.
editor.cannot_edit_non_text_files=ද්විමය ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය කළ නොහැක.
editor.edit_this_file=ගොනුව සංස්කරණය
editor.this_file_locked=ගොනුවට අගුළු ලා ඇත
diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini
index d37f909c40..068781beec 100644
--- a/options/locale/locale_sk-SK.ini
+++ b/options/locale/locale_sk-SK.ini
@@ -425,7 +425,7 @@ activate_account.text_2=Pre aktiváciu vašeho účtu kliknite, prosím, na nasl
activate_email=Overte svoju e-mailovú adresu
activate_email.text=Pre overenie vašej e-mailovej adresy kliknite, prosím, na nasledovný odkaz do %s:
-register_notify=Vitajte v Forgejo
+register_notify_prev9=Vitajte v Forgejo
register_notify.title=%[1]s, vitajte v %[2]s
register_notify.text_1=toto je e-mail potvrdzujúci vašu registráciu pre %s!
register_notify.text_2=Teraz sa môžete prihlásiť s používateľským menom: %s.
@@ -1011,6 +1011,7 @@ view_git_blame=Zobraziť Git Blame
video_not_supported_in_browser=Váš prehliadač nepodporuje HTML5 tag 'video'.
audio_not_supported_in_browser=Váš prehliadač nepodporuje HTML5 tag 'audio'.
stored_lfs=Uložené pomocou Git LFS
+stored_annex=Uložené pomocou Git Annex
symbolic_link=Symbolický odkaz
commit_graph=Graf commitov
line=riadok
diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini
index 962b1d0d72..6ddda5fc64 100644
--- a/options/locale/locale_sl.ini
+++ b/options/locale/locale_sl.ini
@@ -537,7 +537,7 @@ activate_account.text_1 = Pozdravljeni %[1]s, hvala za registracijo na %[
admin.new_user.subject = Prijavil se je nov uporabnik %s
admin.new_user.user_info = Informacije o uporabniku
admin.new_user.text = Prosimo, da klikni tukaj za upravljanje tega uporabnika iz upraviteljske plošče.
-register_notify = Dobrodošli v Forgejo
+register_notify_prev9 = Dobrodošli v Forgejo
register_notify.title = %[1]s, dobrodošli v %[2]s
register_notify.text_2 = V svoj račun se lahko prijavite z uporabniškim imenom: %s
register_notify.text_3 = Če je ta račun namesto vas ustvaril nekdo drug, boste morali najprej nastaviti svoje geslo.
diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini
new file mode 100644
index 0000000000..e091f91a68
--- /dev/null
+++ b/options/locale/locale_sr-SP.ini
@@ -0,0 +1,732 @@
+[common]
+home=Почетна
+dashboard=Контролни панел
+explore=Преглед
+help=Помоћ
+sign_in=Пријавите Се
+sign_out=Одјава
+register=Регистрација
+website=Веб-страница
+version=Верзија
+page=Страница
+template=Шаблон
+language=Језик
+signed_in_as=Пријављени сте као
+
+username=Корисничко име
+password=Лозинка
+
+
+repository=Спремиште
+organization=Организација
+mirror=Огледало
+new_repo=Ново спремиште
+new_migrate=Нова миграција
+new_mirror=Ново огледало
+new_org=Нова организација
+manage_org=Управљање организацијама
+account_settings=Подешавања налога
+settings=Подешавања
+
+
+activities=Активности
+pull_requests=Захтеви за спајање
+issues=Дискусије
+
+cancel=Откажи
+
+
+
+
+
+
+[error]
+
+[startpage]
+
+[install]
+install=Инсталација
+db_title=Подешавања базе
+db_type=Тип базе података
+host=Хост
+password=Лозинка
+db_name=Име базе података
+path=Пут
+
+repo_path=Пут до корена спремишта
+log_root_path=Пут до журнала
+
+optional_title=Напредна подешавања
+smtp_host=SMTP сервер
+federated_avatar_lookup_popup=Омогућите federated avatars lookup да би сте користили федеративни сервис помоћу libravatar.
+enable_captcha_popup=Тражи Captcha приликом регистрације корисника.
+admin_password=Лозинка
+confirm_password=Потврдите лозинку
+install_btn_confirm=Успостави Gitea
+test_git_failed=Команда 'git' није успела: %v
+
+[home]
+password_holder=Лозинка
+switch_dashboard_context=Пребаците контекст контролној панели
+collaborative_repos=Заједничка спремишта
+my_orgs=Моје организације
+my_mirrors=Моја огледала
+view_home=Прикажи %s
+
+
+
+issues.in_your_repos=У вашим спремиштима
+
+[explore]
+repos=Спремишта
+users=Корисници
+search=Претрага
+
+[auth]
+register_helper_msg=Већ имате налог? Пријавите се!
+active_your_account=Активирајте ваш налог
+has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (%s). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме.
+resend_mail=Кликните овде да поново пошаљете писмо
+
+[mail]
+
+activate_account=Молимо вас активирајте ваш налог
+
+activate_email=Потврдите вашу адресу е-поште
+
+
+
+
+
+
+
+
+
+[modal]
+yes=Да
+no=Не
+
+[form]
+UserName=Корисничко име
+RepoName=Име спремишта
+Email=Адреса ел. поште
+Password=Лозинка
+SSHTitle=Име SSH кључа
+HttpsUrl=HTTPS URL адреса
+PayloadUrl=URL адреса за слање
+TeamName=Име тима
+AuthName=Ауторизацијско име
+AdminEmail=Адреса е-поште администратора
+
+NewBranchName=Име нове гране
+CommitSummary=Опис за ревизију
+CommitMessage=Ревизни текст
+CommitChoice=Избор ревизије
+TreeName=Пут до датотеке
+Content=Садржај
+
+
+require_error=` не може бити празно.`
+size_error=` мора бити величине %s.`
+min_size_error=` мора да садржи најмање %s карактера.`
+max_size_error=` мора да садржи највише %s карактера.`
+email_error=` није важећа адреса е-поште.`
+url_error=` није исправна URL адреса.`
+include_error=` мора да садржи текст '%s'.`
+unknown_error=Непозната грешка:
+
+
+auth_failed=Грешка идентитета: %v
+
+
+target_branch_not_exist=Ова грана не постоји.
+
+[user]
+join_on=Регистриран
+repositories=Спремишта
+activity=Активности
+followers=Пратиоци
+following=Пратим
+follow=Прати
+unfollow=Престани да пратиш
+
+
+[settings]
+profile=Профил
+password=Лозинка
+avatar=Аватар
+social=Налози на друштвеним мрежама
+delete=Уклоните налог
+
+public_profile=Јавни профил
+full_name=Име и презиме
+website=Веб страница
+location=Локација
+update_profile=Ажурирај профил
+continue=Настави
+cancel=Откажи
+
+federated_avatar_lookup=Federated Avatar претрага
+enable_custom_avatar=Укључи ваш аватар
+choose_new_avatar=Изаберите нови аватар
+delete_current_avatar=Обришите тренутни аватар
+
+old_password=Тренутна лозинка
+new_password=Нова лозинка
+
+emails=Адреса ел. поште
+email_desc=Ваша главна адреса ће се користити за обавештења и других операција.
+primary=Главно
+
+manage_ssh_keys=Управљање SSH кључева
+add_key=Додај кључ
+add_new_key=Додај SSH кључ
+key_name=Име кључа
+key_content=Садржај
+add_on=Додато
+last_used=Задње корршћено
+no_activity=Нема недавних активности
+manage_social=Управљање прикључених друштвеним мрежама
+
+generate_new_token=Генериши нови токен
+token_name=Име токена
+generate_token=Генериши токен
+delete_token=Уклони
+
+
+
+
+
+
+
+delete_account=Уклоните ваш налог
+confirm_delete_account=Потврдите брисање
+
+
+
+[repo]
+owner=Власник
+repo_name=Име спремишта
+visibility=Видљивост
+fork_repo=Креирај огранак спремишта
+fork_from=Огранак од
+repo_desc=Опис
+repo_lang=Језик
+license=Лиценца
+create_repo=Ново спремиште
+default_branch=Главна грана
+mirror_prune=Очисти
+watchers=Посматрачи
+stargazers=Пратиоци
+forks=Огранци
+
+
+
+
+
+
+migrate_repo=Мигрирајте спремиште
+migrate.permission_denied=Немате права на увезете локално спремиште.
+migrate.failed=Миграција није успела: %v
+
+mirror_from=огледало од
+forked_from=изданак од
+unwatch=Престани пратити
+watch=Прати
+unstar=Улкони звезду
+star=Волим
+fork=Креирај огранак
+
+no_desc=Нема описа
+quick_guide=Кратак водич
+clone_this_repo=Клонирај спремиште
+
+code=Код
+branch=Грана
+tree=Дрво
+filter_branch_and_tag=Профилтрирај по грани или ознаци
+branches=Гране
+tags=Ознаке
+issues=Дискусије
+pulls=Захтеви за спајање
+labels=Лабеле
+
+milestones=Фазе
+commits=Комити
+releases=Издања
+file_raw=Датотека
+file_history=Историја
+file_view_raw=Прегледај саму датотеку
+file_permalink=Пермалинк
+
+
+editor.preview_changes=Преглед промена
+editor.or=или
+editor.commit_changes=Изврши комит промена
+editor.add=Додај '%s'
+editor.update=Ажурирај '%s'
+editor.delete=Уклони '%s'
+editor.commit_directly_to_this_branch=Изврши комит директно на %s грану.
+editor.create_new_branch=Креирај нову грану за овај комит и поднеси захтев за спајање.
+editor.cancel=Откажи
+editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште.
+editor.no_changes_to_show=Нема никаквих промена.
+editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
+editor.upload_files_to_dir=Пошаљи датотеке на '%s'
+
+commits.commits=Комити
+commits.author=Аутор
+commits.message=Порука
+commits.date=Датум
+commits.older=Старије
+commits.newer=Новије
+
+
+
+issues.new=Нови задатак
+issues.new.labels=Лавеле
+issues.new.no_label=Нема лабеле
+issues.new.clear_labels=Уклони лабеле
+issues.new.milestone=Фаза
+issues.new.no_milestone=Нема фазе
+issues.new.clear_milestone=Уклони фазу
+issues.new.open_milestone=Отворене фазе
+issues.new.closed_milestone=Затворене фазе
+issues.create=Додај задатак
+issues.new_label=Нова лабела
+issues.create_label=Креирај лабелу
+issues.label_templates.title=Преузмите унапред дефинисани скуп лабела
+issues.label_templates.helper=Изаберите скуп лабела
+issues.label_templates.fail_to_load_file=Није могуће преузети датотеку '%s': %v
+issues.open_tab=%d отворено
+issues.close_tab=%d затворено
+issues.filter_label=Лабела
+issues.filter_milestone=Фаза
+issues.filter_assignee=Одговорни
+issues.filter_type=Тип
+issues.filter_type.all_issues=Сви задаци
+issues.filter_type.assigned_to_you=Заказано вама
+issues.filter_type.created_by_you=креирано од вас
+issues.filter_type.mentioning_you=Помењује вас
+issues.filter_sort=Сортирај
+issues.filter_sort.latest=Најновије
+issues.filter_sort.oldest=Најстарије
+issues.filter_sort.recentupdate=Недавно ажурирано
+issues.filter_sort.leastupdate=Давно ажуриано
+issues.filter_sort.mostcomment=Највише коментара
+issues.filter_sort.leastcomment=Најмање коментара
+issues.opened_by=отворено %[1]s од %[3]s
+issues.previous=Претходна
+issues.next=Следеће
+issues.open_title=Отворено
+issues.closed_title=Затворено
+issues.num_comments=%d коментара
+issues.commented_at=`коментирира %s`
+issues.delete_comment_confirm=Да ли желите да избришете овај коментар?
+issues.no_content=Још нема садржаја.
+issues.close_issue=Затвори
+issues.reopen_issue=Поново отвори
+issues.create_comment=Коментирај
+issues.commit_ref_at=`поменуо овај задатак у комит %[2]s`
+issues.poster=Аутор
+issues.collaborator=Коаутор
+issues.owner=Власник
+issues.sign_in_require_desc=Пријавите се да се прикључе у овом разговору.
+issues.edit=Уреди
+issues.cancel=Откажи
+issues.save=Сачувај
+issues.label_title=Име лабеле
+issues.label_color=Боја лабеле
+issues.label_count=%d лабела
+issues.label_open_issues=%d отворених задатака
+issues.label_edit=Уреди
+issues.label_delete=Уклони
+issues.num_participants=%d учесника
+issues.attachment.open_tab=`Кликните "%s" да видите у новом прозору`
+issues.attachment.download=`Кликните да преузмете "%s"`
+
+
+pulls.new=Нови захтев за спајање
+pulls.filter_branch=Филтер по грани
+pulls.no_results=Нема резултата.
+pulls.create=Поднеси захтев за спајање
+pulls.merged_title_desc=споји(ла) %[1]d комит(е) из %[2]s у %[3]s %[4]s
+pulls.tab_conversation=Дискусија
+pulls.tab_commits=Комити
+pulls.merged=Спојено
+pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски.
+
+; %[2]s %[3]s
+
+
+milestones.new=Нова фаза
+milestones.open_tab=%d отворено
+milestones.close_tab=%d затворено
+milestones.closed=Затворено %s
+milestones.no_due_date=Рок није наведен
+milestones.open=Отвори
+milestones.close=Затвори
+milestones.create=Креирај фазу
+milestones.title=Наслов
+milestones.desc=Опис
+milestones.due_date=Датум завршетка (опционо)
+milestones.clear=Уклони
+milestones.edit=Ажурирај фазу
+milestones.cancel=Откажи
+
+
+
+wiki=Вики
+wiki.page=Страница
+wiki.filter_page=Филтер странице
+wiki.save_page=Сачувај страницу
+wiki.last_commit_info=%s урећивао ову страницу %s
+wiki.edit_page_button=Уреди
+wiki.new_page_button=Нова страница
+wiki.delete_page_button=Уклони страницу
+wiki.page_already_exists=Страница са овим именом већ постоји.
+wiki.pages=Странице
+wiki.last_updated=Последње ажурирано %s
+
+
+
+settings=Подешавања
+settings.collaboration.write=За писање
+settings.collaboration.read=Читање
+settings.collaboration.undefined=Није дефинисано
+settings.githooks=Git хуки
+settings.basic_settings=Основна подешавања
+settings.mirror_settings=Подешавања огледала
+settings.update_settings=Примени промене
+settings.advanced_settings=Напредна подешавања
+settings.external_wiki_url=URL адреса спољног Вики
+settings.tracker_url_format=Спољни формат везе система за праћење грешака
+settings.tracker_issue_style.numeric=Нумерично
+settings.tracker_issue_style.alphanumeric=Алфанумерично
+settings.danger_zone=Опасна зона
+settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име.
+settings.transfer=Пренеси власништво
+settings.transfer_owner=Нови власник
+settings.delete=Уклони ово спремиште
+settings.delete_notices_1=- Ова операција НЕЋЕ МОЧИ бити укинута.
+settings.add_webhook=Додај Webhook
+settings.webhook.test_delivery=Провери испоруку
+settings.webhook.request=Захтев
+settings.webhook.response=Одговор
+settings.webhook.headers=Наслови
+settings.webhook.body=Тело
+settings.githook_edit_desc=Aко Webhook није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен.
+settings.githook_name=Име Hook-а
+settings.githook_content=Садржај Hook-а
+settings.update_githook=Ажурирај Hook
+settings.secret=Тајна
+settings.slack_username=Корисничко име
+settings.slack_icon_url=URL адреса иконице
+settings.event_create=Креирај
+settings.event_pull_request=Захтев за спајање
+settings.update_webhook=Ажурирај Webhook
+settings.recent_deliveries=Недавне испоруке
+settings.hook_type=Тип Hook-а
+settings.slack_token=Токен
+settings.slack_domain=Домен
+settings.slack_channel=Канал
+settings.deploy_keys=Кључеви за распоређивање
+settings.add_deploy_key=Додај кључ за распоређивање
+settings.title=Наслов
+settings.deploy_key_content=Садржај
+
+diff.browse_source=Преглед изворни кода
+diff.parent=родитељ
+diff.commit=комит
+diff.show_split_view=Подељен поглед
+diff.show_unified_view=Један поглед
+diff.stats_desc= %d измењених фајлова са %d додато и %d уклоњено
+diff.view_file=Прегледај датотеку
+diff.file_suppressed=Разлика између датотеке није приказан због своје велике величине
+
+release.releases=Издања
+release.new_release=Ново издање
+release.draft=Нацрт
+release.prerelease=Пред-верзија
+release.stable=Стабилно
+release.edit=уреди
+release.source_code=Изворни код
+release.tag_name=Име ознаке
+release.target=Циљ
+release.title=Наслов
+release.content=Садржај
+release.cancel=Откажи
+release.publish=Објави издање
+release.save_draft=Сачувај нацрт
+release.downloads=Преузимања
+
+
+
+
+
+[org]
+org_name_holder=Име организације
+org_full_name_holder=Пун назив организације
+create_org=Створи Организацију
+repo_updated=Ажурирано
+people=Особе
+teams=Тимови
+lower_members=чланови
+lower_repositories=спремишта
+org_desc=Опис
+team_name=Име тима
+team_desc=Опис
+
+
+settings=Подешавања
+settings.full_name=Пуно име
+settings.website=Саит
+settings.location=Локација
+
+settings.update_settings=Ажурирај подешавања
+settings.delete=Уклони организацију
+settings.delete_account=Уклони ову организацију
+settings.confirm_delete_account=Потврди брисање
+
+
+members.membership_visibility=Видљивост:
+members.member_role=Улога учесника:
+members.owner=Власник
+members.member=Члан
+members.remove=Уклони
+members.leave=Изађи
+members.invite_desc=Додја новог члана %s:
+members.invite_now=Позовите сада
+
+teams.join=Придружи се
+teams.leave=Изаћи
+teams.no_desc=Овај тим нема описа
+teams.settings=Подешавања
+teams.members=Чланови тима
+teams.update_settings=Примени промене
+teams.add_team_member=Додај члан тиму
+teams.repositories=Тимска спремишта
+teams.add_nonexistent_repo=Овакво спремиште не постоји, молим вас прво да га направите.
+
+[admin]
+dashboard=Контролни панел
+organizations=Организације
+repositories=Спремишта
+config=Подешавања
+notices=Системска обавештења
+monitor=Праћење
+first_page=Први
+last_page=Последњи
+total=Укупно: %d
+
+dashboard.operation_name=Име операције
+dashboard.operation_switch=Пребаци
+dashboard.operation_run=Покрени
+dashboard.server_uptime=Време непрекидног рада сервера
+dashboard.current_goroutine=Тренутнe Goroutine
+dashboard.current_memory_usage=Тренутна употреба меморије
+dashboard.total_memory_allocated=Укупно меморије алоцирано
+dashboard.memory_obtained=Коришћена меморија
+dashboard.pointer_lookup_times=Захтева показивача
+dashboard.current_heap_usage=Тренутна употреба динамичке меморије
+dashboard.heap_memory_obtained=Слободно динамичке меморије
+dashboard.heap_memory_idle=Неактиво динамичке меморије
+dashboard.heap_memory_in_use=Динамичка меморија у употреби
+dashboard.heap_memory_released=Ослобођено динамичке меморије
+dashboard.heap_objects=Објекти динамичке меморије
+dashboard.bootstrap_stack_usage=Коришћење стек меморије
+dashboard.stack_memory_obtained=Слободно стек меморије
+dashboard.mspan_structures_usage=Употреба структуре MSpan
+dashboard.mspan_structures_obtained=Добијено структуре MSpan
+dashboard.mcache_structures_usage=Употреба структурa MCache
+dashboard.mcache_structures_obtained=Добијено структурa MCache
+dashboard.profiling_bucket_hash_table_obtained=Хеш-таблеа постигнуто за Profiling Bucket
+dashboard.gc_metadata_obtained=Добијених метаподатака cакупљању смећа
+dashboard.other_system_allocation_obtained=Добијено друга системска меморија
+dashboard.next_gc_recycle=Следећа рециклажа cакупљању смећа
+dashboard.last_gc_time=Времена од прошлог cакупљању смећа
+dashboard.total_gc_time=Укупно време cакупљању смећа
+dashboard.total_gc_pause=Укупно време cакупљању смећа
+dashboard.last_gc_pause=Задња пауза у cакупљању смећа
+dashboard.gc_times=Времена cакупљању смећа
+
+users.activated=Активиран
+users.admin=Администратор
+users.repos=Спремишта
+users.created=Креирано
+users.edit=Уреди
+users.auth_source=Извор аутентикације
+users.local=Локално
+
+
+orgs.name=Име
+orgs.teams=Тимови
+orgs.members=Чланови
+
+repos.owner=Власник
+repos.name=Име
+repos.private=Приватно
+repos.stars=Фаворити
+repos.issues=Задаци
+
+
+
+auths.name=Име
+auths.type=Тип
+auths.enabled=Омогућено
+auths.updated=Ажурирано
+auths.auth_type=Врста провере аутентичности
+auths.auth_name=Име провере аутентичности
+auths.security_protocol=Протокол безбедности
+auths.domain=Домен
+auths.host=Хост
+auths.port=Порт
+auths.bind_password=Bind лозинкa
+auths.user_base=База претраживање корисника
+auths.user_dn=DN корисника
+auths.filter=Филтер корисника
+auths.admin_filter=Филтер администратора
+auths.smtp_auth=Тип SMTP аутентикације
+auths.smtphost=SMTP хост
+auths.smtpport=SMTP порт
+auths.allowed_domains=Дозвољени домени
+auths.skip_tls_verify=Прескочи TLS проверу
+auths.pam_service_name=Назив PAM сервиса
+auths.enable_auto_register=Омогући аутоматску регистрацију
+auths.tips=Савети
+
+config.server_config=Конфигурација сервера
+config.disable_router_log=Онемогући журнал рутера
+config.run_mode=Режим извршавања
+config.repo_root_path=Пут до корена спремишта
+config.static_file_root_path=Пут до статичке датотеке
+config.script_type=Врста скрипта
+config.reverse_auth_user=Корисничко име при обрнуту аутентикацију
+
+config.ssh_config=SSH конфигурација
+config.ssh_enabled=Омогућено
+config.ssh_port=Порт
+config.ssh_listen_port=Порт за слушање
+config.ssh_root_path=Основни пут
+config.ssh_key_test_path=Пут до кључу
+config.ssh_keygen_path=Пут до генератор кључева ('ssh-keygen')
+config.ssh_minimum_key_size_check=Минимална величина провера кључа
+config.ssh_minimum_key_sizes=Минимална величина кључева
+
+
+config.db_config=Конфигурација базе података
+config.db_type=Тип
+config.db_host=Хост
+config.db_name=Име
+config.db_path=Пут
+
+config.service_config=Подешавања сервиса
+config.show_registration_button=Прикажи дугме за регистрацију
+config.disable_key_size_check=Онемогући проверу на минималној величини кључа
+config.active_code_lives=Дужина живота активних кодова
+
+config.webhook_config=Подешавања Webhook
+config.queue_length=Дужина реда
+config.deliver_timeout=Време до отказивање слања
+
+config.mailer_enabled=Омогућено
+config.mailer_disable_helo=Онемогући HELO
+config.mailer_name=Име
+config.mailer_host=Хост
+config.mailer_user=Корисник
+
+config.oauth_config=Подешавања OAuth
+config.oauth_enabled=Укључено
+
+config.cache_config=Подешавања кеша
+config.cache_adapter=Кеш адаптер
+config.cache_interval=Кеш интервал
+config.cache_conn=Кеш на вези
+
+config.session_config=Подешавања сесије
+config.session_provider=Добављач сесија
+config.provider_config=Конфигурација на добављачу
+config.cookie_name=Име датотеке cookie
+config.gc_interval_time=Интервал cакупљања смећа
+config.session_life_time=Дужина живота сесјие
+config.https_only=Само HTTPS
+config.cookie_life_time=Дужина живота датотеке cookie
+
+config.picture_service=Услуга за слике
+config.disable_gravatar=Онемогући Gravatar
+config.enable_federated_avatar=Омогући Federated Avatars
+
+config.git_config=Git конфигурација
+config.git_disable_diff_highlight=Онемогући бојење синтаксе када гледате разлике
+config.git_max_diff_lines=Максималан број различитих редова (у датотеци)
+config.git_max_diff_line_characters=Максималан број различитих карактера (у реду)
+config.git_max_diff_files=Максималан број измењених датотека (приказаних)
+config.git_gc_args=Аргументи на cакупљање смећа
+config.git_migrate_timeout=Време до отказања миграције
+config.git_mirror_timeout=Време до отазање синхронизацији огледала
+config.git_clone_timeout=Време до отказивања клонирањем
+config.git_pull_timeout=Време до отказивања pull операцији
+config.git_gc_timeout=Време до отказивања cакупљање смећа
+
+config.log_config=Kонфигурација журнала
+config.log_mode=Режим журналовања
+
+monitor.cron=Cron задаци
+monitor.name=Име
+monitor.schedule=Распоред
+monitor.next=Следећи пут
+monitor.previous=Претходни пут
+monitor.process=Покренути процеси
+monitor.desc=Опис
+monitor.start=Почетно време
+monitor.execute_time=Време извршивања
+
+
+
+notices.system_notice_list=Системска обавештавања
+notices.actions=Акције
+notices.select_all=Изабери све
+notices.deselect_all=Уклоните избор свих
+notices.inverse_selection=Обрна селекција
+notices.delete_selected=Избриши изабране
+notices.delete_all=Уклони сва обавештења
+notices.type=Тип
+notices.type_1=Спремиште
+notices.desc=Опис
+notices.op=Oп.
+
+[action]
+create_repo=креира спремиште %s
+rename_repo=преимензје спремиште од %[1]s на %[3]s
+transfer_repo=преноси спремиште %s на %s
+
+[tool]
+ago=пре %s
+from_now=од сада %s
+now=сада
+1s=1 секунд
+1m=1 минут
+1h=1 час
+1d=1 дан
+1w=1 недеља
+1mon=1 месец
+1y=1 година
+seconds=%d секунди
+minutes=%d минута
+hours=%d часа
+days=%d дана
+weeks=%d недеља
+months=%d месеци
+years=%d година
+raw_seconds=секунди
+raw_minutes=минута
+
+[dropzone]
+remove_file=Уклони датотеку
+
+[notification]
+
+[gpg]
+
+[units]
+
diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini
index 8e9727deef..47b0cb806a 100644
--- a/options/locale/locale_sv-SE.ini
+++ b/options/locale/locale_sv-SE.ini
@@ -305,7 +305,7 @@ activate_account=Vänligen aktivera ditt konto
activate_email=Verifiera din epostaddress
-register_notify=Välkommen till Forgejo
+register_notify_prev9=Välkommen till Forgejo
reset_password=Återställ ditt konto
@@ -755,6 +755,7 @@ file_too_large=Filen är för stor för att visas.
video_not_supported_in_browser=Din webbläsare stödjer ej HTML5-taggen 'video'.
audio_not_supported_in_browser=Din webbläsare stöder inte taggen 'audio' i HTML5.
stored_lfs=Sparad med Git LFS
+stored_annex=Sparad med Git Annex
symbolic_link=Symbolisk länk
commit_graph=Commit-Graf
commit_graph.monochrome=Mono
@@ -768,6 +769,7 @@ editor.upload_file=Ladda Upp Fil
editor.edit_file=Redigera Fil
editor.preview_changes=Förhandsgranska ändringar
editor.cannot_edit_lfs_files=LFS-filer kan inte redigeras i webbgränssnittet.
+editor.cannot_edit_annex_files=Annex-filer kan inte redigeras i webbgränssnittet.
editor.cannot_edit_non_text_files=Binära filer kan inte redigeras genom webbgränssnittet.
editor.edit_this_file=Redigera Fil
editor.this_file_locked=Filen är låst
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index f3acf9e4da..4094612d57 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -454,7 +454,7 @@ activate_email=E-posta adresinizi doğrulayın
activate_email.title=%s, lütfen e-posta adresinizi doğrulayın
activate_email.text=E posta adresinizi doğrulamak için lütfen %s içinde linke tıklayın:
-register_notify=Forgejo'ya Hoş Geldiniz
+register_notify_prev9=Forgejo'ya Hoş Geldiniz
register_notify.title=%[1]s, %[2]s e hoşgeldiniz
register_notify.text_1=bu %s için kayıt onay e postanızdır!
register_notify.text_2=Artık %s kullanıcı adı ile oturum açabilirsiniz.
@@ -1198,6 +1198,7 @@ view_git_blame=Git Suç Görüntüle
video_not_supported_in_browser=Tarayıcınız HTML5 'video' etiketini desteklemiyor.
audio_not_supported_in_browser=Tarayıcınız HTML5 'audio' etiketini desteklemiyor.
stored_lfs=Git LFS ile depolandı
+stored_annex=Git Annex ile depolandı
symbolic_link=Sembolik Bağlantı
executable_file=Çalıştırılabilir Dosya
commit_graph=İşleme Grafiği
@@ -1221,6 +1222,7 @@ editor.upload_file=Dosya Yükle
editor.edit_file=Dosyayı Düzenle
editor.preview_changes=Değişiklikleri Önizle
editor.cannot_edit_lfs_files=LFS dosyaları web arayüzünde düzenlenemez.
+editor.cannot_edit_annex_files=Annex dosyaları web arayüzünde düzenlenemez.
editor.cannot_edit_non_text_files=Bu tür dosyalar web arayüzünden düzenlenemez.
editor.edit_this_file=Dosyayı Düzenle
editor.this_file_locked=Dosya kilitlendi
@@ -1815,7 +1817,7 @@ pulls.outdated_with_base_branch=Bu dal, temel dal ile güncel değil
pulls.close=Değişiklik İsteğini Kapat
pulls.closed_at=`%[2]s değişiklik isteğini kapattı`
pulls.reopened_at=`%[2]s değişiklik isteğini yeniden açtı`
-pulls.cmd_instruction_hint=`Komut satırı talimatlarını görüntüleyin.`
+pulls.cmd_instruction_hint=`Komut satırı talimatlarını görüntüleyin.`
pulls.cmd_instruction_checkout_title=Çekme
pulls.cmd_instruction_checkout_desc=Proje deponuzdan yeni bir dalı çekin ve değişiklikleri test edin.
pulls.cmd_instruction_merge_title=Birleştir
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 6334bcf469..615274d534 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -390,7 +390,7 @@ activate_account.text_2=Перейдіть за цим посиланням, щ
activate_email=Підтвердить вашу адресу електронної пошти
activate_email.text=Перейдіть за цим посиланням, щоб підтвердити вашу електронну адресу в %s:
-register_notify=Ласкаво просимо у Forgejo
+register_notify_prev9=Ласкаво просимо у Forgejo
register_notify.title=%[1]s, ласкаво просимо до %[2]s
register_notify.text_1=це ваша е-пошта для підтвердження реєстрації для %s!
register_notify.text_2=Тепер ви можете увійти як: %s.
@@ -995,6 +995,7 @@ file_copy_permalink=Копіювати постійне посилання
video_not_supported_in_browser=Ваш браузер не підтримує тег 'video' HTML5.
audio_not_supported_in_browser=Ваш браузер не підтримує тег HTML5 'audio'.
stored_lfs=Збережено з Git LFS
+stored_annex=Збережено з Git Annex
symbolic_link=Символічне посилання
commit_graph=Графік комітів
commit_graph.select=Виберіть гілки
@@ -1012,6 +1013,7 @@ editor.upload_file=Завантажити файл
editor.edit_file=Редагування файлу
editor.preview_changes=Попередній перегляд змін
editor.cannot_edit_lfs_files=Файли LFS не можна редагувати в веб-інтерфейсі.
+editor.cannot_edit_annex_files=Файли Annex не можна редагувати в веб-інтерфейсі.
editor.cannot_edit_non_text_files=Бінарні файли не можливо редагувати у веб-інтерфейсі.
editor.edit_this_file=Редагувати файл
editor.this_file_locked=Файл заблоковано
diff --git a/options/locale/locale_yi.ini b/options/locale/locale_yi.ini
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/options/locale/locale_yi.ini
@@ -0,0 +1 @@
+
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index 9dc86d07ee..a6b344c138 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -158,6 +158,14 @@ toggle_menu = 切换菜单
invalid_data = 无效数据:%v
more_items = 显示更多
copy_generic = 复制到剪贴板
+test = 测试
+error413 = 您已用尽您的配额。
+new_repo.title = 新仓库
+new_migrate.title = 新迁移
+new_org.title = 新组织
+new_repo.link = 新仓库
+new_migrate.link = 新迁移
+new_org.link = 新组织
[aria]
navbar=导航栏
@@ -189,6 +197,8 @@ buttons.ref.tooltip=引用一个问题或拉取请求
buttons.switch_to_legacy.tooltip=使用旧版编辑器
buttons.enable_monospace_font=启用等宽字体
buttons.disable_monospace_font=禁用等宽字体
+buttons.unindent.tooltip = 解除一级嵌套条目
+buttons.indent.tooltip = 解除一级嵌套条目
[filter]
string.asc=A - Z
@@ -208,7 +218,7 @@ app_desc=一款极易搭建的自助 Git 服务
install=易安装
install_desc=通过 二进制 来运行;或者通过 docker 来运行;或者通过 安装包 来运行
platform=跨平台
-platform_desc=任何 Go 语言 支持的平台都可以运行 Forgejo,包括 Windows、Mac、Linux 以及 ARM。挑一个您喜欢的就行!
+platform_desc=已证实可以在 Linux 和 FreeBSD 等自由操作系统以及不同的 CPU 架构上运行 Forgejo。挑一个您喜欢的就行!
lightweight=轻量级
lightweight_desc=一个廉价的树莓派的配置足以满足 Forgejo 的最低系统硬件要求。最大程度上节省您的服务器资源!
license=开源化
@@ -404,8 +414,8 @@ allow_password_change=要求用户更改密码(推荐)
reset_password_mail_sent_prompt=确认电子邮件已被发送到 %s。请您在 %s 内检查您的收件箱 ,完成密码重置过程。
active_your_account=激活您的帐户
account_activated=帐户已激活
-prohibit_login=禁止登录
-prohibit_login_desc=您的帐户被禁止登录,请与网站管理员联系。
+prohibit_login=账号已暂停
+prohibit_login_desc=您的账号已暂停与实例交互。请与实例管理员联系以重新获得访问权限。
resent_limit_prompt=您请求发送激活邮件过于频繁,请等待 3 分钟后再试!
has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 %s 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。
resend_mail=单击此处重新发送确认邮件
@@ -461,6 +471,11 @@ change_unconfirmed_email_summary = 修改用来接收激活邮件的邮箱地址
change_unconfirmed_email_error = 无法修改邮箱地址: %v
tab_signin = 登录
tab_signup = 注册
+hint_login = 已创建账户?立即登录
+back_to_sign_in = 返回登录
+sign_in_openid = 继续使用 OpenID
+sign_up_button = 立即注册。
+hint_register = 需要账号?立即注册。
[mail]
view_it_on=在 %s 上查看
@@ -477,7 +492,7 @@ activate_email=请验证您的邮箱地址
activate_email.title=%s,请验证您的邮箱
activate_email.text=请在 %s 时间内,点击以下链接,以验证你的电子邮件地址:
-register_notify=欢迎来到 Forgejo
+register_notify_prev9=欢迎来到 Forgejo
register_notify.title=%[1]s,欢迎来到 %[2]s
register_notify.text_1=这是您的 %s 注册确认电子邮件 !
register_notify.text_2=您现在可以以用户名 %s 登录
@@ -530,6 +545,21 @@ team_invite.text_3=注意:这是发送给 %[1]s 的邀请。如果您未曾收
admin.new_user.subject = 新用户 %s 刚刚完成注册
admin.new_user.user_info = 用户信息
admin.new_user.text = 请 点击这里 以在管理员面板中管理此用户。
+removed_security_key.no_2fa = 不再配置其他 2FA 方法,这意味着不再需要使用 2FA 登录您的账号。
+account_security_caution.text_2 = 如果这不是您本人所为,则您的账号已盗用。请联系本网站管理员。
+totp_enrolled.text_1.no_webauthn = 您刚刚为您的账号启用了 TOTP。这意味着,在将来登录您的账号必须使用 TOTP 作为 2FA 方法。
+totp_enrolled.subject = 您已将 TOTP 激活为 2FA 方法
+totp_enrolled.text_1.has_webauthn = 您刚刚为您的账号启用了 TOTP。这意味着,在将来登录您的账号,您可以使用 TOTP 作为 2FA 方法或您使用的任何安全密钥。
+password_change.text_1 = 您的账号密码刚刚更改。
+primary_mail_change.subject = 您的主要邮件地址已更改
+primary_mail_change.text_1 = 您账号的主要邮件地址刚刚更改为 %[1]s。这意味着此电子邮件地址将不再收到您账号的电子邮件通知。
+totp_disabled.subject = TOTP 已禁用
+totp_disabled.text_1 = 您账号上的基于时间的一次性密码(TOTP)刚刚禁用。
+password_change.subject = 您的密码已更改
+totp_disabled.no_2fa = 不再配置其他 2FA 方法,这意味着不再需要使用 2FA 登录您的账号。
+removed_security_key.subject = 安全密钥已移除
+removed_security_key.text_1 = 安全密钥“%[1]s”刚刚从您的账号中移除。
+account_security_caution.text_1 = 如果这是您,那么您可以放心地忽略这封邮件。
[modal]
yes=确认操作
@@ -649,13 +679,13 @@ change_avatar=修改头像
joined_on=加入于 %s
repositories=仓库列表
activity=公开活动
-followers_few=%d 关注者
+followers_few=%d 位关注者
starred=已点赞
watched=已关注仓库
code=代码
projects=项目
overview=概览
-following_few=%d 关注中
+following_few=%d 关注
follow=关注
unfollow=取消关注
user_bio=简历
@@ -669,15 +699,23 @@ form.name_reserved=用户名 "%s" 被保留。
form.name_pattern_not_allowed=用户名中不允许使用 "%s" 格式。
form.name_chars_not_allowed=用户名 "%s" 包含无效字符。
block_user = 屏蔽用户
-block_user.detail = 请注意,屏蔽该用户会产生其他后果。例如:
-block_user.detail_1 = 您已被该用户取消关注。
-block_user.detail_2 = 该用户不能对您的代码库、提交的问题和评论做出任何操作。
+block_user.detail = 请注意,屏蔽用户还有其他影响,例如:
+block_user.detail_1 = 将会停止互相关注对方,也无法再互相关注对方。
+block_user.detail_2 = 此用户将无法对您的仓库或创建的问题和评论做出任何操作。
follow_blocked_user = 您不能关注该用户,因为您已屏蔽该用户或该用户已屏蔽您。
block = 屏蔽
unblock = 解除屏蔽
-block_user.detail_3 = 该用户无法将您添加为合作者,您也无法将其添加为合作者。
-followers_one = %d 人关注
-following_one = %d 人被该用户关注
+block_user.detail_3 = 您将无法将彼此添加为仓库协作者。
+followers_one = %d 位关注者
+following_one = %d 关注
+public_activity.visibility_hint.self_public = 您的活动对所有人都是可见的,但在私人空间中的交互除外。配置。
+public_activity.visibility_hint.admin_public = 此活动对所有人可见,但作为管理员,您还可以看到私人空间中的交互。
+public_activity.visibility_hint.self_private = 您的活动仅对您和实例管理员可见。配置。
+public_activity.visibility_hint.admin_private = 此活动对您可见,因为您是管理员,但用户希望它保持私有。
+followers.title.one = 关注者
+followers.title.few = 关注者
+following.title.one = 关注
+following.title.few = 关注
[settings]
profile=个人信息
@@ -792,7 +830,7 @@ add_email_success=新的电子邮件地址已添加。
email_preference_set_success=电子邮件首选项已成功设置。
add_openid_success=新的 OpenID 地址已添加。
keep_email_private=隐藏邮箱地址
-keep_email_private_popup=这将会隐藏您的电子邮件地址,不仅在您的个人资料中,还在您使用Web界面创建拉取请求或编辑文件时。已推送的提交将不会被修改。
+keep_email_private_popup=这将从您的个人资料中隐藏您的电子邮件地址。它将不再是通过 Web 界面创建拉取请求的默认地址,如文件上传和编辑,也不会用于合并提交。相反,可以使用特殊地址 %s 将提交与您的账号相关联。请注意,更改此选项不会影响现有的提交。
openid_desc=OpenID 让你可以将认证转发到外部服务。
manage_ssh_keys=管理 SSH 密钥
@@ -1005,6 +1043,9 @@ pronouns_custom = 自定义
pronouns = 代词
pronouns_unspecified = 不指定
language.title = 默认语言
+keep_activity_private.description = 您的公开活动将仅对您和实例管理员可见。
+language.description = 此语言将保存到您的账号中,并在您登录后用作默认语言。
+language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!了解更多。
[repo]
new_repo_helper=代码仓库包含了所有的项目文件,包括版本历史记录。已经在其他地方托管了?迁移仓库。
@@ -1041,17 +1082,17 @@ generate_from=生成自
repo_desc=仓库描述
repo_desc_helper=输入简要描述 (可选)
repo_lang=仓库语言
-repo_gitignore_helper=选择 .gitignore 模板。
+repo_gitignore_helper=选择 .gitignore 模板
repo_gitignore_helper_desc=从常见语言的模板列表中选择忽略跟踪的文件。默认情况下,由开发或构建工具生成的特殊文件都包含在 .gitignore 中。
-issue_labels=工单标签
-issue_labels_helper=选择一个工单标签集
+issue_labels=标签
+issue_labels_helper=选择标签集
license=授权许可
-license_helper=选择授权许可文件。
+license_helper=选择授权许可文件
license_helper_desc=许可证说明了其他人可以和不可以用您的代码做什么。不确定哪一个适合你的项目?见 选择一个许可证
object_format=对象格式
object_format_helper=仓库的对象格式。之后无法更改。SHA1 是最兼容的。
readme=自述
-readme_helper=选择自述文件模板。
+readme_helper=选择自述文件模板
readme_helper_desc=这是您可以为您的项目撰写完整描述的地方。
auto_init=初始化仓库(添加. gitignore、许可证和自述文件)
trust_model_helper=选择签名验证的“信任模型”。可能的选项是:
@@ -1267,6 +1308,7 @@ view_git_blame=查看 Git Blame
video_not_supported_in_browser=您的浏览器不支持 HTML5 “video” 标签。
audio_not_supported_in_browser=您的浏览器不支持 HTML5 “audio” 标签。
stored_lfs=存储到Git LFS
+stored_annex=存储到Git Annex
symbolic_link=符号链接
executable_file=可执行文件
vendored=被供应的
@@ -1292,6 +1334,7 @@ editor.upload_file=上传文件
editor.edit_file=编辑文件
editor.preview_changes=预览变更
editor.cannot_edit_lfs_files=无法在 web 界面中编辑 lfs 文件。
+editor.cannot_edit_annex_files=无法在 web 界面中编辑 lfs 文件。
editor.cannot_edit_non_text_files=网页不能编辑二进制文件。
editor.edit_this_file=编辑文件
editor.this_file_locked=文件已锁定
@@ -1887,7 +1930,7 @@ pulls.outdated_with_base_branch=此分支相比基础分支已过期
pulls.close=关闭合并请求
pulls.closed_at=`于 %[2]s 关闭此合并请求 `
pulls.reopened_at=`重新打开此合并请求 %[2]s`
-pulls.cmd_instruction_hint=`查看 命令行提示。`
+pulls.cmd_instruction_hint=查看命令行说明
pulls.cmd_instruction_checkout_title=检出
pulls.cmd_instruction_checkout_desc=从你的仓库中检出一个新的分支并测试变更。
pulls.cmd_instruction_merge_title=合并
@@ -2032,7 +2075,7 @@ activity.unresolved_conv_label=打开
activity.title.releases_1=%d 个版本发布
activity.title.releases_n=%d 个版本发布
activity.title.releases_published_by=%[2]s 发布了 %[1]s
-activity.published_release_label=已发布
+activity.published_release_label=版本发布
activity.no_git_activity=在此期间没有任何提交活动。
activity.git_stats_exclude_merges=排除合并,
activity.git_stats_author_1=%d 作者
@@ -2657,7 +2700,7 @@ topic.done=保存
topic.count_prompt=您最多选择25个主题
topic.format_prompt=主题必须以字母或数字开头,可以包含半角连字符(“-”)和句点(“.”),长度不得超过35个字符。字符必须为小写。
-find_file.go_to_file=转到文件
+find_file.go_to_file=查找文件
find_file.no_matching=没有找到匹配的文件
error.csv.too_large=无法渲染此文件,因为它太大了。
@@ -2670,13 +2713,13 @@ rss.must_be_on_branch = 您必须处于一个分支上才能拥有一个RSS订
admin.manage_flags = 管理标志
admin.failed_to_replace_flags = 替换仓库标志失败
clone_in_vscodium = 在 VSCodium 中克隆
-object_format_helper = 仓库的对象格式,一旦设置无法更改。SHA1的兼容性最强。
+object_format_helper = 仓库的对象格式,一旦设置无法更改。SHA1 的兼容性最强。
object_format = 对象格式
mirror_sync = 已同步
vendored = Vendored
issues.blocked_by_user = 你无法在此仓库创建工单,因为你已被仓库所有者屏蔽。
issues.comment.blocked_by_user = 你无法对此工单进行评论,因为你已被仓库所有者或此工单的发布者屏蔽。
-settings.wiki_rename_branch_main_desc = 将百科内部使用的分支重命名为“%s”。 此操作是永久性的且不可撤消。
+settings.wiki_rename_branch_main_desc = 将百科内部使用的分支重命名为“%s”。此更改是永久性的且不可撤销。
generated = 已生成
editor.invalid_commit_mail = 用于创建提交的邮件地址无效。
pulls.blocked_by_user = 你无法在此存储库上创建合并请求,因为您已被仓库所有者屏蔽。
@@ -2770,6 +2813,22 @@ settings.federation_following_repos = 关注仓库的 URL。以“;”分隔,
settings.federation_settings = 邦联设置
settings.federation_apapiurl = 此仓库的邦联URL地址。将其作为关注的仓库URL地址填写到另一个仓库的邦联设置中。
settings.federation_not_enabled = 当前实例未启用邦联功能。
+issues.author.tooltip.issue = 此用户是本工单的作者。
+issues.author.tooltip.pr = 此用户是此合并请求的作者。
+release.type_attachment = 附件
+release.type_external_asset = 外部资产
+release.asset_name = 资产名称
+release.asset_external_url = 外部 URL
+release.add_external_asset = 添加外部资产
+release.invalid_external_url = 无效的外部 URL:“%s”
+milestones.filter_sort.name = 名称
+settings.pull_mirror_sync_quota_exceeded = 超出配额,未拉取更改。
+settings.transfer_quota_exceeded = 新所有者(%s)已超出配额。仓库尚未转移。
+no_eol.tooltip = 此文件不包含行尾字符。
+no_eol.text = 无行尾
+activity.published_tag_label = 标签
+activity.published_prerelease_label = 预发行
+activity.commit = 提交活动
[graphs]
component_loading=正在加载 %s...
@@ -2848,13 +2907,13 @@ members.member=普通成员
members.remove=移除成员
members.remove.detail=从 %[2]s 中移除 %[1]s 吗?
members.leave=离开组织
-members.leave.detail=离开 %s?
+members.leave.detail=是否确定要离开组织“%s”?
members.invite_desc=邀请新的用户加入 %s:
members.invite_now=立即邀请
teams.join=加入团队
teams.leave=离开团队
-teams.leave.detail=离开 %s?
+teams.leave.detail=是否确定要离开团队“%s”?
teams.can_create_org_repo=创建仓库
teams.can_create_org_repo_helper=成员可以在组织中创建仓库。创建者将自动获得创建的仓库的管理员权限。
teams.none_access=无访问权限
@@ -3004,10 +3063,10 @@ dashboard.delete_old_actions.started=已开始从数据库中删除所有旧操
dashboard.update_checker=更新检查器
dashboard.delete_old_system_notices=从数据库中删除所有旧系统通知
dashboard.gc_lfs=垃圾回收 LFS 元数据
-dashboard.stop_zombie_tasks=停止僵尸任务
-dashboard.stop_endless_tasks=停止永不停止的任务
-dashboard.cancel_abandoned_jobs=取消丢弃的任务
-dashboard.start_schedule_tasks=开始调度任务
+dashboard.stop_zombie_tasks=停止僵尸操作任务
+dashboard.stop_endless_tasks=停止无休止的操作任务
+dashboard.cancel_abandoned_jobs=取消放弃的操作任务
+dashboard.start_schedule_tasks=开始安排操作任务
dashboard.sync_branch.started=分支同步已开始
dashboard.sync_tag.started=标签同步已开始
dashboard.rebuild_issue_indexer=重建工单索引
@@ -3038,10 +3097,10 @@ users.update_profile_success=该帐户已被更新。
users.edit_account=编辑帐号
users.max_repo_creation=最大仓库数
users.max_repo_creation_desc=(设置为 -1 表示使用全局默认值)
-users.is_activated=该用户已被激活
-users.prohibit_login=禁用登录
-users.is_admin=是管理员
-users.is_restricted=受限
+users.is_activated=已激活账号
+users.prohibit_login=已暂停账号
+users.is_admin=管理员账号
+users.is_restricted=受限账号
users.allow_git_hook=允许创建 Git 钩子
users.allow_git_hook_tooltip=Git 钩子将会被以操作系统用户运行,将会拥有同样的主机访问权限。因此,拥有此特殊的Git 钩子权限将能够访问合修改所有的 Forgejo 仓库或者Forgejo的数据库。同时也能获得Forgejo的管理员权限。
users.allow_import_local=允许导入本地仓库
@@ -3091,7 +3150,7 @@ orgs.new_orga=创建新的组织
repos.repo_manage_panel=仓库管理
repos.unadopted=未收录仓库
-repos.unadopted.no_more=找不到更多未被收录的仓库
+repos.unadopted.no_more=找不到更多未被收录的仓库。
repos.owner=所有者
repos.name=名称
repos.private=私有库
@@ -3457,6 +3516,20 @@ config_summary = 概况
auths.default_domain_name = 用于电子邮件地址的默认域名
config.open_with_editor_app_help = 克隆菜单中的“打开方式”所用的编辑器。如果留空,将使用默认值。展开以查看默认值。
config.app_slogan = 实例标语
+config.cache_test_slow = 缓存测试成功,但响应缓慢:%s。
+config.cache_test_failed = 探测缓存失败:%v。
+config.cache_test = 测试缓存
+emails.delete = 删除电子邮件
+emails.delete_desc = 是否确定要删除此电子邮件地址?
+emails.deletion_success = 已删除此电子邮件地址。
+emails.delete_primary_email_error = 您无法删除主要电子邮件。
+config.cache_test_succeeded = 缓存测试成功,在 %s 中收到响应。
+users.activated.description = 完成电子邮件验证。在电子邮件验证完成之前,未激活账号的所有者将无法登录。
+users.block.description = 阻止此用户通过其账号与此服务交互,并禁止登录。
+users.admin.description = 授予此用户对通过 Web UI 和 API 提供的所有管理功能的完全访问权限。
+users.restricted.description = 仅允许与添加此用户作为协作者的仓库和组织进行交互。这将阻止访问此实例上的公开仓库。
+users.local_import.description = 允许从服务器的本地文件系统导入仓库。这可能是一个安全问题。
+users.organization_creation.description = 允许创建新组织。
[action]
create_repo=创建了仓库 %s
@@ -3703,6 +3776,21 @@ rpm.repository.architectures = 架构
rpm.repository.multiple_groups = 该软件包可在多个组中使用。
owner.settings.cargo.rebuild.no_index = 无法重建,未初始化任何索引。
npm.dependencies.bundle = 捆绑依赖项
+arch.pacman.helper.gpg = 为 pacman 添加信任证书:
+arch.pacman.repo.multi = %s 在不同的发行版中有相同的版本。
+arch.pacman.repo.multi.item = %s 的配置
+arch.pacman.conf = 将具有相关发行版和架构的服务器添加到 /etc/pacman.conf 中:
+arch.pacman.sync = 与 pacman 同步软件包:
+arch.version.properties = 版本属性
+arch.version.description = 说明
+arch.version.provides = 提供
+arch.version.groups = 组
+arch.version.depends = 依赖
+arch.version.optdepends = 可选依赖
+arch.version.conflicts = 冲突
+arch.version.replaces = 替换
+arch.version.backup = 备份
+arch.version.checkdepends = 检查依赖
[secrets]
secrets=密钥
@@ -3813,11 +3901,20 @@ variables.update.success=该变量已被编辑。
runs.workflow = 工作流
runs.no_job_without_needs = 工作流必须至少包含一组没有依赖的作业。
runs.no_job = 工作流必须至少包含一个作业
+workflow.dispatch.trigger_found = 此工作流有一个 workflow_dispatch 事件触发。
+workflow.dispatch.use_from = 使用工作流
+workflow.dispatch.invalid_input_type = 输入类型“%s”无效。
+workflow.dispatch.warn_input_limit = 仅显示前 %d 个输入。
+workflow.dispatch.run = 运行工作流
+workflow.dispatch.success = 已成功请求工作流运行。
+workflow.dispatch.input_required = 需要输入“%s”的值。
+runs.expire_log_message = 已清除日志,因为它们太旧了。
[projects]
type-1.display_name=个人项目
type-2.display_name=仓库项目
type-3.display_name=组织项目
+deleted.display_name = 已删除项目
[git.filemode]
changed_filemode=%[1]s -> %[2]s
@@ -3855,6 +3952,9 @@ exact = 精确
issue_kind = 搜索工单...
pull_kind = 搜索拉取...
exact_tooltip = 仅包含与精确搜索词匹配的结果
+milestone_kind = 搜索里程碑…
+union_tooltip = 包括与任何空格分隔的关键字匹配的结果
+union = 关键字
[munits.data]
diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini
index 941f93bfc3..b2c6c06818 100644
--- a/options/locale/locale_zh-HK.ini
+++ b/options/locale/locale_zh-HK.ini
@@ -24,8 +24,8 @@ organization=組織
mirror=鏡像
new_repo=新增儲存庫
new_migrate=遷移外部儲存庫
-new_mirror=新鏡像
-new_fork=Fork 新的儲存庫
+new_mirror=新增鏡像
+new_fork=新增儲存庫分叉
new_org=新增組織
manage_org=管理組織
account_settings=帳號設定
@@ -67,7 +67,7 @@ email = 電子信箱
access_token = 訪問令牌
powered_by = 由 %s 提供
create_new = 建立…
-user_profile_and_more = 個人資料同埋設定…
+user_profile_and_more = 個人資料和設定…
signed_in_as = 已經登入
toc = 目錄
licenses = 軟件授權
@@ -88,10 +88,45 @@ webauthn_error_unable_to_process = 伺服器唔可以執行你嘅請求。
logo = 標識
enable_javascript = 本網站需要 JavaScript。
webauthn_error_empty = 你要起名呢條鎖匙。
+your_starred = 已加星號
+active_stopwatch = 活動時間追蹤器
+rerun = 重新執行
+save = 儲存
+retry = 重試
+add = 新增
+locked = 已鎖定
+disabled = 已停用
+copy = 複製
+preview = 預覽
+value = 值
+webauthn_reload = 重新載入
+your_profile = 個人資料
+milestones = 里程碑
+ok = 好的
+view = 檢視
+copy_success = 已複製!
+loading = 載入中…
+error = 錯誤
+never = 從不
+unknown = 未知
+concept_user_organization = 組織
+pin = 釘選
+unpin = 取消釘選
+artifacts = 製品
+archived = 已封存
+concept_system_global = 全域
+concept_user_individual = 個人
+new_project = 新增專案
+new_project_column = 新增欄位
+filter.public = 公開
[aria]
+footer = 頁尾
+footer.links = 連結
[heatmap]
+more = 較多
+less = 較少
[editor]
@@ -100,6 +135,8 @@ webauthn_error_empty = 你要起名呢條鎖匙。
[error]
[startpage]
+platform = 跨平台
+lightweight = 輕量級
[install]
install=安裝頁面
@@ -125,13 +162,16 @@ confirm_password=確認密碼
install_btn_confirm=立即安裝
test_git_failed=無法識別 'git' 命令:%v
save_config_failed=儲存設定失敗:%v
+user = 使用者名稱
+db_schema = 資料結構
+ssl_mode = SSL
[home]
password_holder=密碼
switch_dashboard_context=切換控制面版用戶
my_repos=儲存庫管理
collaborative_repos=參與協作的儲存庫
-my_orgs=我的組織
+my_orgs=組織
my_mirrors=我的鏡像
view_home=訪問 %s
@@ -139,12 +179,14 @@ view_home=訪問 %s
show_private=私有庫
issues.in_your_repos=屬於該用戶儲存庫的
+show_archived = 已封存
[explore]
repos=儲存庫
users=使用者
organizations=組織
search=搜尋
+code = 程式碼
[auth]
register_helper_msg=已經註冊?立即登錄!
@@ -165,6 +207,10 @@ oauth_signin_submit=連結帳戶
openid_connect_submit=連接
openid_connect_title=連接到現有帳戶
openid_register_title=建立新帳戶
+oauth_signup_submit = 完成帳戶
+reset_password_helper = 復原帳戶
+create_new_account = 註冊帳戶
+reset_password = 帳戶復原
[mail]
@@ -172,10 +218,13 @@ activate_account=請啟用您的帳戶
activate_email=請驗證您的郵箱地址
-register_notify=歡迎來到 Forgejo
+register_notify_prev9=歡迎來到 Forgejo
register_success=註冊成功
+release.note = 說明:
+release.downloads = 下載:
+repo.transfer.to_you = 你
@@ -187,6 +236,8 @@ register_success=註冊成功
yes=確認操作
no=取消操作
cancel=取消
+confirm = 確定
+modify = 更新
[form]
UserName=使用者名稱
@@ -222,6 +273,8 @@ auth_failed=授權驗證失敗:%v
target_branch_not_exist=目標分支不存在
+SSPISeparatorReplacement = 分隔符
+SSPIDefaultLanguage = 預設語言
[user]
@@ -231,6 +284,10 @@ followers_few=%d 關註者
following_few=%d 關註中
follow=關注
unfollow=取消關注
+code = 程式碼
+projects = 專案
+overview = 概覽
+user_bio = 個人簡介
[settings]
@@ -238,8 +295,8 @@ profile=個人訊息
password=修改密碼
avatar=頭像
ssh_gpg_keys=SSH / GPG 金鑰
-social=社交帳號綁定
-orgs=管理組織
+social=社交帳戶
+orgs=組織
repos=儲存庫管理
delete=刪除帳戶
twofa=兩步驟驗證
@@ -321,10 +378,34 @@ link_account=連結帳戶
orgs_none=您尚未成為任一組織的成員。
delete_account=刪除當前帳戶
-confirm_delete_account=確認刪除帳戶
+confirm_delete_account=確認刪除
visibility.private=私有庫
+applications = 應用程式
+uid = UID
+appearance = 外觀
+security = 安全性
+manage_themes = 預設主題
+account_link = 已連結的帳戶
+access_token_deletion_confirm_action = 刪除
+permissions_list = 權限:
+ui = 主題
+privacy = 私隱
+account = 帳戶
+visibility.public = 公開
+unbind = 解除連結
+visibility.limited = 受限
+comment_type_group_reference = 參考
+comment_type_group_label = 標籤
+comment_type_group_milestone = 里程碑
+language.title = 預設語言
+comment_type_group_branch = 分支
+webauthn_nickname = 暱稱
+save_application = 儲存
+manage_account_links = 已連結的帳戶
+revoke_key = 撤銷
+comment_type_group_project = 專案
[repo]
owner=擁有者
@@ -337,7 +418,7 @@ repo_desc=儲存庫描述
repo_lang=儲存庫語言
license=授權許可
create_repo=建立儲存庫
-default_branch=默認分支
+default_branch=預設分支
mirror_prune=裁減
watchers=關注者
stargazers=稱讚者
@@ -392,6 +473,7 @@ file_view_raw=查看原始文件
file_permalink=永久連結
stored_lfs=儲存到到 Git LFS
+stored_annex=儲存到到 Git Annex
editor.preview_changes=預覽更改
editor.or=或
@@ -417,8 +499,8 @@ commits.signed_by=簽署人
projects.description_placeholder=組織描述
projects.title=標題
projects.template.desc=樣板
-projects.column.edit_title=組織名稱
-projects.column.new_title=組織名稱
+projects.column.edit_title=名稱
+projects.column.new_title=名稱
issues.new=建立問題
issues.new.labels=標籤
@@ -501,7 +583,7 @@ issues.subscribe=訂閱
issues.unsubscribe=取消訂閱
issues.add_time_cancel=取消
issues.due_date_form_edit=編輯
-issues.due_date_form_remove=移除成員
+issues.due_date_form_remove=移除
issues.dependency.cancel=取消
issues.dependency.remove=移除成員
@@ -663,6 +745,33 @@ release.publish=發佈版本
release.save_draft=儲存草稿
release.deletion_success=已刪除此版本發佈。
release.downloads=下載附件
+mirror_password_blank_placeholder = (未設定)
+settings.trust_model.default = 預設信任模型
+issue_labels = 標籤
+migrate_items_milestones = 里程碑
+settings.default_merge_style_desc = 預設合併方式
+language_other = 其他
+delete_preexisting_label = 刪除
+desc.internal = 內部
+desc.archived = 已封存
+issues.choose.blank = 預設
+desc.public = 公開
+desc.sha256 = SHA256
+template.webhooks = Webhook
+template.topics = 主題
+projects.column.set_default = 設為預設
+org_labels_desc_manage = 管理
+mirror_password_placeholder = (未變更)
+readme = 讀我檔案
+release = 發佈
+commit = 提交
+migrate_items_wiki = 維基
+migrate_items_labels = 標籤
+tag = 標籤
+settings.branches.switch_default_branch = 切換預設分支
+mirror_sync = 已同步
+default_branch_label = 預設
+settings.branches.update_default_branch = 更新預設分支
@@ -696,7 +805,7 @@ settings.update_settings=更新組織設定
settings.update_setting_success=組織設定已更新。
settings.delete=刪除組織
settings.delete_account=刪除當前組織
-settings.confirm_delete_account=確認刪除組織
+settings.confirm_delete_account=確認刪除
settings.delete_org_title=刪除組織
settings.hooks_desc=新增 webhooks 將觸發在這個組織下 全部的儲存庫 。
@@ -720,6 +829,7 @@ teams.update_settings=更新團隊設定
teams.add_team_member=新增團隊成員
teams.delete_team_success=該團隊已被刪除。
teams.repositories=團隊儲存庫
+settings.visibility.public = 公開
[admin]
dashboard=控制面版
@@ -947,6 +1057,11 @@ notices.type_1=儲存庫
notices.desc=描述
notices.op=操作
notices.delete_success=已刪除系統提示。
+defaulthooks.update_webhook = 更新預設 Webhook
+defaulthooks.add_webhook = 新增預設 Webhook
+auths.sspi_default_language = 預設使用者語言
+users = 使用者帳戶
+defaulthooks = 預設 Webhook
[action]
@@ -1001,6 +1116,7 @@ alpine.repository.branches=分支列表
alpine.repository.repositories=儲存庫管理
conan.details.repository=儲存庫
owner.settings.cleanuprules.enabled=已啟用
+container.labels = 標籤
[secrets]
@@ -1013,6 +1129,7 @@ runners.owner_type=認證類型
runners.description=組織描述
runners.task_list.run=執行
runners.task_list.repository=儲存庫
+runners.labels = 標籤
@@ -1022,4 +1139,3 @@ runners.task_list.repository=儲存庫
[git.filemode]
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
-
diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini
index fd73d62c1a..705c6eb32e 100644
--- a/options/locale/locale_zh-TW.ini
+++ b/options/locale/locale_zh-TW.ini
@@ -83,7 +83,7 @@ cancel=取消
retry=重試
save=儲存
add=新增
-add_all=全部新增
+add_all=新增全部
remove=移除
remove_all=全部移除
remove_label_str=移除項目「%s」
@@ -158,11 +158,13 @@ confirm_delete_artifact = 您確定要刪除製品「%s」嗎?
more_items = 顯示更多
invalid_data = 無效資料:%v
copy_generic = 複製到剪貼簿
+error413 = 您已用盡您的額度。
+test = 測試
[aria]
navbar=導航列
footer=頁尾
-footer.software=關於軟體
+footer.software=關於此軟體
footer.links=連結
[heatmap]
@@ -274,7 +276,7 @@ register_confirm=要求註冊時確認電子郵件
mail_notify=啟用郵件通知
server_service_title=伺服器和第三方服務設定
offline_mode=啟用本地模式
-offline_mode.description=停用其他服務並在本地提供所有資源。
+offline_mode.description=停用第三方內容傳遞網路並在本地提供所有資源。
disable_gravatar=停用 Gravatar
disable_gravatar.description=停用 Gravatar 和第三方大頭貼服務。若使用者在未本地上傳大頭貼,將使用預設的大頭貼。
federated_avatar_lookup=啟用聯邦式大頭貼
@@ -328,6 +330,8 @@ smtp_from_invalid = 郵件寄件人的地址無效
config_location_hint = 這些設定將被儲存在:
allow_dots_in_usernames = 允許使用者在使用者名稱中使用英文句點。不影響既有帳號。
enable_update_checker_helper_forgejo = 透過檢查 release.forgejo.org 的 DNS TXT 記錄來定期檢查新的 Forgejo 版本。
+app_slogan = 站點標語
+app_slogan_helper = 在這裡輸入您站點的標語。留空來停用。
[home]
uname_holder=帳號名稱或電子信箱
@@ -437,7 +441,7 @@ disable_forgot_password_mail=由於未設定電子郵件功能,帳號復原功
disable_forgot_password_mail_admin=帳號復原功能需要設定電子郵件功能才能使用。請設定電子郵件功能以啟用帳號復原。
email_domain_blacklisted=您無法使用您的電子信箱註冊帳號。
authorize_application=授權應用程式
-authorize_redirect_notice=如果您授權此應用程式,您將會被重新導向至 %s。
+authorize_redirect_notice=如果您授權此應用程式,您將會被轉址至 %s。
authorize_application_created_by=此應用程式是由 %s 建立的。
authorize_application_description=如果您允許,它將能夠讀取和修改您的所有帳號資訊,包括私有儲存庫和組織。
authorize_title=授權「%s」存取您的帳號?
@@ -458,6 +462,11 @@ password_pwned = 該密碼出現在先前資料洩露的馬上登入!
+hint_register = 需要一個帳號嗎?馬上註冊。
+sign_up_button = 馬上註冊。
+sign_in_openid = 使用 OpenID 繼續
+back_to_sign_in = 返回登入頁面
[mail]
view_it_on=在 %s 上查看
@@ -473,7 +482,7 @@ activate_account.text_2=請在%s內點擊下列連結以啟用您的帳
activate_email=請驗證您的電子信箱
activate_email.text=請在%s內點擊下列連結以驗證您的電子信箱:
-register_notify=歡迎來到 Forgejo
+register_notify_prev9=歡迎來到 Forgejo
register_notify.title=%[1]s,歡迎來到 %[2]s
register_notify.text_1=這是您在 %s 的註冊確認信!
register_notify.text_2=您現在可以使用您的使用者名稱登入:%s
@@ -527,6 +536,15 @@ activate_email.title = %s,請驗證你的信箱地址
admin.new_user.subject = 新使用者 %s 剛剛完成註冊
admin.new_user.user_info = 使用者資訊
admin.new_user.text = 請點擊這裡以在管理員控制台管理此使用者。
+password_change.subject = 已更改您的密碼
+password_change.text_1 = 您帳號的密號剛被更改了。
+totp_disabled.subject = 已停用 TOTP
+primary_mail_change.text_1 = 您帳號的主要信箱剛被更改為 %[1]s。這表示這個信箱地址將不再收到關於您帳號的電子信箱通知。
+primary_mail_change.subject = 已更改您的主要信箱
+removed_security_key.subject = 已移除一把安全金鑰
+removed_security_key.text_1 = 從您的帳號移除了安全金鑰「%[1]s」。
+account_security_caution.text_1 = 如果這是您,那您可以安全的忽略這則電子郵件。
+account_security_caution.text_2 = 如果這不是您,您的帳號已被盜用。請連絡網站管理員。
[modal]
yes=是
@@ -617,10 +635,10 @@ must_use_public_key=您提供的金鑰是私有金鑰,請勿上傳您的私有
unable_verify_ssh_key=無法驗證 SSH 金鑰,請再次檢查是否有錯誤。
auth_failed=授權認證失敗:%v
-still_own_repo=您的帳號擁有至少一個儲存庫,請先刪除或轉移它們。
-still_has_org=您的帳號是至少一個組織的成員,請先離開它們。
+still_own_repo=您的帳號擁有一個或多個儲存庫,請先刪除或轉移它們。
+still_has_org=您的帳號是一個或多個組織的成員,請先離開它們。
still_own_packages=您的帳號擁有至少一個軟體包,請先刪除它們。
-org_still_own_repo=此組織仍然擁有一個以上的儲存庫,請先刪除或轉移它們。
+org_still_own_repo=此組織仍然擁有一個或多個的儲存庫,請先刪除或轉移它們。
org_still_own_packages=此組織仍然擁有至少一個軟體包,請先刪除它們。
target_branch_not_exist=目標分支不存在。
@@ -644,13 +662,13 @@ required_prefix = 輸入文字必須以「%s」開頭
change_avatar=更改大頭貼…
repositories=儲存庫
activity=公開動態
-followers_few=%d 追蹤者
+followers_few=%d 位追蹤者
starred=已加星號的儲存庫
watched=關注的儲存庫
code=程式碼
projects=專案
overview=概覽
-following_few=%d 追蹤中
+following_few=追蹤 %d 個人
follow=追蹤
unfollow=取消追蹤
user_bio=個人簡介
@@ -667,13 +685,15 @@ settings = 使用者設定
block_user = 封鎖使用者
block_user.detail_1 = 該使用者已停止追踪您。
block_user.detail_2 = 這個使用者無法對您的儲存庫、您提出的問題或發表的留言做出任何操作。
-followers_one = %d 個追踪者
-following_one = 追踪 %d 個人
+followers_one = %d 位追蹤者
+following_one = 追蹤 %d 個人
block_user.detail_3 = 該使用者無法將您加為協作者,您也無法將其加為協作者。
follow_blocked_user = 因為這個使用者封鎖您或被您封鎖,您不能追蹤此使用者。
block = 封鎖
unblock = 解除封鎖
block_user.detail = 請注意,封鎖此使用者將會導致以下結果。例如:
+followers.title.one = 位追蹤者
+followers.title.few = 位追蹤者
[settings]
profile=個人資料
@@ -787,7 +807,7 @@ ssh_helper=需要協助嗎?建議可看看 GitHub 的文件
gpg_helper=需要協助嗎?建議可看看 GitHub 的 about GPG 文件。
add_new_key=新增 SSH 金鑰
add_new_gpg_key=新增 GPG 金鑰
-key_content_ssh_placeholder=以 「ssh-ed25519」、「ssh-rsa」、「ecdsa-sha2-nistp256」、「ecdsa-sha2-nistp384」、「ecdsa-sha2-nistp521」、「sk-ecdsa-sha2-nistp256@openssh.com」、或 「sk-ssh-ed25519@openssh.com」 開頭
+key_content_ssh_placeholder=以 「ssh-ed25519」、「ssh-rsa」、「ecdsa-sha2-nistp256」、「ecdsa-sha2-nistp384」、「ecdsa-sha2-nistp521」、「sk-ecdsa-sha2-nistp256@openssh.com」或 「sk-ssh-ed25519@openssh.com」 開頭
key_content_gpg_placeholder=以 「-----BEGIN PGP PUBLIC KEY BLOCK-----」 開頭
add_new_principal=新增主體
ssh_key_been_used=此 SSH 金鑰早已加入本伺服器。
@@ -853,7 +873,7 @@ unbind=解除連結
manage_access_token=管理存取符記
generate_new_token=產生新的符記
-tokens_desc=這些符記透過 Forgejo API 獲得存取您帳號的權限。
+tokens_desc=這些符記透過 Forgejo API 授予存取您帳號的權限。
token_name=符記名稱
generate_token=產生符記
generate_token_success=已經產生新的符記。請立刻複製它,因為它將不會被再次顯示。
@@ -870,10 +890,10 @@ permission_read=讀取
manage_oauth2_applications=管理 OAuth2 應用程式
edit_oauth2_application=編輯 OAuth2 應用程式
oauth2_applications_desc=OAuth2 應用程式讓您的第三方應用程式安全地驗證此 Forgejo 站點中的使用者。
-remove_oauth2_application=刪除 OAuth2 應用程式
+remove_oauth2_application=移除 OAuth2 應用程式
remove_oauth2_application_desc=刪除 OAuth2 應用程式將會撤銷所有已簽署的存取符記之存取權。是否繼續?
-remove_oauth2_application_success=已刪除應用程式。
-create_oauth2_application=新增 OAuth2 應用程式
+remove_oauth2_application_success=已移除應用程式。
+create_oauth2_application=建立新的 OAuth2 應用程式
create_oauth2_application_button=建立應用程式
oauth2_application_name=應用程式名稱
oauth2_confidential_client=機密客戶端 (Confidential Client)。請為能保持機密性的程式勾選,例如網頁應用程式。使用原生程式時不要勾選,包含桌面、行動應用程式。
@@ -915,10 +935,10 @@ webauthn_delete_key_desc=如果您移除安全金鑰,將不能再使用它登
manage_account_links=連結的帳號
manage_account_links_desc=這些外部帳號已連結至您的 Forgejo 帳號。
-account_links_not_available=目前沒有外部帳號連結到您的 Forgejo 帳號。
+account_links_not_available=目前沒有外部帳號連結至您的 Forgejo 帳號。
link_account=連結帳號
remove_account_link=刪除連結的帳號
-remove_account_link_desc=移除連結帳號將撤銷其對 Forgejo 帳號的存取權限。是否繼續?
+remove_account_link_desc=移除連結帳號將撤銷其對 Forgejo 帳號的存取權限。要繼續嗎?
remove_account_link_success=已移除連結的帳號。
@@ -942,18 +962,18 @@ visibility.public=公開
visibility.public_tooltip=所有人都可以看到
visibility.limited=受限
visibility.private=私有
-blocked_users_none = 您沒有封鎖任何使用者 。
+blocked_users_none = 沒有任何被封鎖的使用者 。
blocked_users = 封鎖的使用者
hints = 提示
update_hints = 更新提示
update_hints_success = 提示已被更改。
added_on = 於 %s 新增
biography_placeholder = 和我們介紹一下您自己吧!(您可以使用 Markdown)
-location_placeholder = 與其他人分享您的地理位置
+location_placeholder = 與其他人分享您粗略的地理位置
profile_desc = 管理其他人如何看到您的個人資料。通知、密碼復原和網頁上的 Git 操作會使用您的主要電子信箱。
hidden_comment_types.ref_tooltip = 註記哪些問題/提交/… 提及了此問題
keep_activity_private = 隱藏個人頁面中的活動資料
-uploaded_avatar_is_too_big = 上傳檔案的大小 (%d KiB)超過了上限 (%d KiB )。
+uploaded_avatar_is_too_big = 上傳檔案的大小 (%d KiB)超過了上限 (%d KiB )。
select_permissions = 選擇權限
permission_write = 讀寫
permissions_list = 權限:
@@ -970,7 +990,7 @@ social_desc = 這些社群帳號可以被用來登入您的帳號。請確保您
unbind_success = 已成功移除該社群帳號。
create_oauth2_application_success = 您已成功建立一個新的 OAuth2 應用程式。
change_username_prompt = 註:更改您的使用者名稱也會更改您的帳號 URL。
-change_username_redirect_prompt = 舊的使用者名稱在其他使用者認領之前將會轉址到新的使用者名稱。
+change_username_redirect_prompt = 舊的使用者名稱在被其他使用者認領之前將會轉址到新的使用者名稱。
visibility.limited_tooltip = 只有已登入的使用者能看見
visibility.private_tooltip = 只有您加入的組織之成員能看見
keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被修改。在提交中使用 %s 來將其連結至您的帳號。
@@ -980,7 +1000,7 @@ pronouns_custom = 自訂
oauth2_client_secret_hint = 這把密鑰在您離開或重新整理此頁面後將不再被顯示。請確保您已儲存它。
additional_repo_units_hint_description = 在沒有啟用所有模組的儲存庫中顯示「新增更多模組…」按鈕。
hidden_comment_types.issue_ref_tooltip = 使用者更改與問題相關分支/標籤的留言
-pronouns = 代名詞
+pronouns = 稱謂語
update_oauth2_application_success = 您已成功更新該 OAuth2 應用程式。
oauth2_redirect_uris = 轉址 URI。每個 URI 應各佔一行。
pronouns_unspecified = 未指定
@@ -997,10 +1017,12 @@ webauthn_key_loss_warning = 如果您弄丟了您的安全金鑰,您將無法
user_unblock_success = 已成功解除對此使用者的封鎖。
webauthn_alternative_tip = 您可能想新增一個額外的驗證方法。
user_block_success = 已成功封鎖此使用者。
-access_token_desc = 已選擇的符記僅授權相對應的 API 路徑。請參閱文件來了解更多。
+access_token_desc = 選擇的符記僅授權相對應的 API路徑。請參閱文件來了解更多。
oauth2_application_locked = 可以在組態中設定 Forgejo 預先註冊一些 OAuth2 應用程式。為了避免不可預料的情況,它們無法被編輯或是移除。請參閱 OAuth2 文件來了解更多。
hidden_comment_types_description = 在這裡選取的留言種類將不會顯示於問題頁面中。舉例來說,核取「標籤」將隱藏所有「使用者新增/移除了<標籤>」留言。
authorized_oauth2_applications_description = 您已授權給這些第三方應用程式取用您的 Forgejo 個人帳號的權限。請撤銷您不再使用的應用程式的權限。
+language.localization_project = 幫助我們翻譯 Forgejo 至您的語言!了解更多。
+language.description = 這個語言會被儲存至您的帳號,並被用作您登入後的預設語言。
[repo]
owner=所有者
@@ -1034,7 +1056,7 @@ repo_desc_helper=輸入簡介 (選用)
repo_lang=儲存庫語言
repo_gitignore_helper=選擇 .gitignore 範本。
repo_gitignore_helper_desc=從常見語言範本清單中挑選忽略追蹤的檔案。預設情況下各種語言建置工具產生的特殊檔案都包含在 .gitignore 中。
-issue_labels=問題標籤
+issue_labels=標籤
issue_labels_helper=選擇問題標籤集。
license=授權條款
license_helper=請選擇授權條款檔案。
@@ -1042,7 +1064,7 @@ license_helper_desc=授權條款定義了他人使用您原始碼的允許和禁
readme=讀我檔案
readme_helper=選擇讀我檔案範本。
readme_helper_desc=這是您能為專案撰寫完整描述的地方。
-auto_init=初始化儲存庫 (加入 .gitignore、授權條款、讀我檔案)
+auto_init=初始化儲存庫(加入 .gitignore、授權條款、讀我檔案)
trust_model_helper=選擇簽署驗證的信任模型。可用的選項:
trust_model_helper_collaborator=協作者: 信任協作者的簽署
trust_model_helper_committer=提交者: 信任與提交者相符的簽署
@@ -1053,10 +1075,10 @@ default_branch=預設分支
default_branch_helper=預設分支是合併請求和提交程式碼的基底分支。
mirror_prune=裁減
mirror_prune_desc=刪除過時的遠端追蹤參考
-mirror_interval=鏡像週期(有效時間單位為「h」、「m」、「s」),設為 0 以停用定期同步。(最小值為:%s)
+mirror_interval=鏡像週期(有效時間單位為「h」、「m」、「s」)。設為 0 以停用定期同步。(最小值為:%s)
mirror_interval_invalid=鏡像週期無效。
mirror_sync_on_commit=推送提交後進行同步
-mirror_address=從 URL Clone
+mirror_address=從 URL 拓製
mirror_address_desc=在授權資訊中填入必要的資料。
mirror_lfs=Large File Storage (LFS)
mirror_lfs_desc=啟動 LFS 檔案的鏡像功能。
@@ -1232,6 +1254,7 @@ view_git_blame=檢視 Git Blame
video_not_supported_in_browser=您的瀏覽器不支援 HTML5 的「video」標籤。
audio_not_supported_in_browser=您的瀏覽器不支援 HTML5 的「audio」標籤。
stored_lfs=已使用 Git LFS 儲存
+stored_annex=已使用 Git Annex 儲存
symbolic_link=符號連結
commit_graph=提交線圖
commit_graph.select=選擇分支
@@ -1249,8 +1272,9 @@ editor.add_file=新增檔案
editor.new_file=建立新檔案
editor.upload_file=上傳檔案
editor.edit_file=編輯檔案
-editor.preview_changes=預覽更改
+editor.preview_changes=預覽變更
editor.cannot_edit_lfs_files=無法在 web 介面中編輯 LFS 檔。
+editor.cannot_edit_annex_files=無法在 web 介面中編輯 Annex 檔。
editor.cannot_edit_non_text_files=網站介面不能編輯二進位檔案。
editor.edit_this_file=編輯檔案
editor.this_file_locked=檔案已被鎖定
@@ -1260,12 +1284,12 @@ editor.delete_this_file=刪除檔案
editor.must_have_write_access=您必須擁有寫入權限才能對此檔案進行修改或提出變更。
editor.file_delete_success=已刪除文件「%s」。
editor.name_your_file=命名您的檔案…
-editor.filename_help=輸入名稱和斜線("/") 以新增目錄。在文字框開始處輸入退格鍵以移除目錄。
+editor.filename_help=輸入以斜線("/")結尾的名稱來新增目錄。在文字框開始處輸入退格鍵以移除目錄。
editor.or=或
editor.cancel_lower=取消
-editor.commit_signed_changes=提交簽署過的變更
+editor.commit_signed_changes=提交簽署的變更
editor.commit_changes=提交變更
-editor.add_tmpl=新增「」
+editor.add_tmpl=新增「<檔案>」
editor.add=新增 %s
editor.update=更新 %s
editor.delete=刪除 %s
@@ -1286,14 +1310,14 @@ editor.filename_cannot_be_empty=檔案名稱不能為空。
editor.filename_is_invalid=檔名無效:「%s」。
editor.branch_does_not_exist=此儲存庫沒有名為「%s」的分支。
editor.branch_already_exists=此儲存庫已有名為「%s」的分支。
-editor.file_changed_while_editing=檔案內容在您編輯時已被變更。按一下此處查看被更動的地方或再次提交以覆蓋這些變更。
+editor.file_changed_while_editing=檔案內容在您編輯時已被更改。按一下此處來檢視被更改的地方或再次提交以覆蓋這些變更。
editor.file_already_exists=此儲存庫已有名為「%s」的檔案。
editor.commit_empty_file_header=提交空白檔案
editor.commit_empty_file_text=你準備提交的檔案是空白的,是否繼續?
editor.no_changes_to_show=沒有可以顯示的變更。
editor.fail_to_update_file=更新/建立檔案「%s」失敗。
editor.fail_to_update_file_summary=錯誤訊息:
-editor.push_rejected_no_message=該變更被伺服器拒絕,它未提供其他資訊。請檢查 Git Hook。
+editor.push_rejected_no_message=該變更被伺服器拒絕,它未提供其他訊息。請檢查 Git Hook。
editor.push_rejected=該變更被伺服器拒絕。請檢查 Git Hook。
editor.push_rejected_summary=完整的拒絕訊息:
editor.add_subdir=加入目錄…
@@ -1554,7 +1578,7 @@ issues.label.filter_sort.alphabetically=按字母順序排序
issues.label.filter_sort.reverse_alphabetically=按字母反向排序
issues.label.filter_sort.by_size=檔案由小到大
issues.label.filter_sort.reverse_by_size=檔案由大到小
-issues.num_participants_few=%d 參與者
+issues.num_participants_few=%d 位參與者
issues.attachment.open_tab=`在新分頁中查看「%s」`
issues.attachment.download=`點擊下載「%s」`
issues.subscribe=訂閱
@@ -1855,9 +1879,9 @@ wiki.default_commit_message=關於此次頁面修改的說明(非必要)。
wiki.save_page=儲存頁面
wiki.last_commit_info=%s 於 %s 修改了此頁面
wiki.edit_page_button=修改
-wiki.new_page_button=新的頁面
+wiki.new_page_button=新頁面
wiki.file_revision=頁面修訂記錄
-wiki.wiki_page_revisions=Wiki 頁面修訂記錄
+wiki.wiki_page_revisions=頁面修訂記錄
wiki.back_to_wiki=回到 Wiki 頁面
wiki.delete_page_button=刪除頁面
wiki.delete_page_notice_1=刪除 Wiki 頁面「%s」將不可還原。是否繼續?
@@ -1910,7 +1934,7 @@ activity.unresolved_conv_label=開放
activity.title.releases_1=%d 個版本
activity.title.releases_n=%d 個版本
activity.title.releases_published_by=%[2]s發布了 %[1]s
-activity.published_release_label=已發布
+activity.published_release_label=發行
activity.no_git_activity=在此期間內沒有任何提交動態。
activity.git_stats_exclude_merges=不計合併,
activity.git_stats_author_1=%d 位作者
@@ -1970,7 +1994,7 @@ settings.mirror_settings.push_mirror.add=新增推送鏡像
settings.sync_mirror=立即同步
settings.site=網站
-settings.update_settings=更新設定
+settings.update_settings=儲存設定
settings.branches.update_default_branch=更新預設分支
settings.branches.add_new_rule=加入新規則
settings.advanced_settings=進階設定
@@ -1979,13 +2003,13 @@ settings.use_internal_wiki=使用內建 Wiki
settings.use_external_wiki=使用外部 Wiki
settings.external_wiki_url=外部 Wiki 連結
settings.external_wiki_url_error=外部 Wiki 網址不是有效的網址。
-settings.external_wiki_url_desc=點擊問題標籤時,使用者會被導向到外部 Wiki URL。
+settings.external_wiki_url_desc=點擊百科分頁時,使用者會被轉址至外部百科的 URL。
settings.issues_desc=啟用儲存庫問題追蹤器
settings.use_internal_issue_tracker=使用內建問題追蹤器
settings.use_external_issue_tracker=使用外部問題追蹤器
settings.external_tracker_url=外部問題追蹤器 URL
settings.external_tracker_url_error=該外部問題追蹤器 URL 無效。
-settings.external_tracker_url_desc=點擊問題頁籤時,使用者會被導向至外部問題追蹤器 URL。
+settings.external_tracker_url_desc=點擊問題頁籤時,使用者會被轉址至外部問題追蹤器 URL。
settings.tracker_url_format=外部問題追蹤器的 URL 格式
settings.tracker_url_format_error=該外部問題追蹤器 URL 格式無效。
settings.tracker_issue_style=外部問題追蹤器的編號格式
@@ -2090,7 +2114,7 @@ settings.search_team=搜尋團隊...
settings.change_team_permission_tip=團隊權限只能於團隊設定頁面修改,不能針對儲存庫分別調整
settings.delete_team_tip=此團隊可存取所有儲存庫,無法移除
settings.remove_team_success=已移除團隊存取儲存庫的權限。
-settings.add_webhook=建立 Webhook
+settings.add_webhook=增加 Webhook
settings.add_webhook.invalid_channel_name=Webhook 頻道名稱不可留白,且不能僅有 # 字號。
settings.hooks_desc=當觸發某些 Forgejo 事件時,Webhook 會自動發出 HTTP POST 請求到指定的伺服器。在 Webhook 指南閱讀更多內容。
settings.webhook_deletion=移除 Webhook
@@ -2340,7 +2364,7 @@ diff.data_not_available=沒有內容比較可以使用
diff.options_button=差異選項
diff.show_diff_stats=顯示統計資料
diff.download_patch=下載補綴檔案
-diff.download_diff=下載差異檔
+diff.download_diff=下載差異檔案
diff.show_split_view=分割檢視
diff.show_unified_view=合併檢視
diff.whitespace_button=空白符號
@@ -2394,7 +2418,7 @@ release.detail=版本詳情
release.tags=標籤
release.new_release=發布新版本
release.draft=草稿
-release.prerelease=預發布版本
+release.prerelease=預發行
release.stable=穩定
release.compare=比較
release.edit=編輯
@@ -2487,8 +2511,8 @@ mirror_sync = 已同步
commit.contained_in_default_branch = 這個提交是預設分支的一部分
editor.invalid_commit_mail = 用於建立提交的信箱無效。
admin.update_flags = 更新旗標
-admin.failed_to_replace_flags = 儲存庫旗標更新失敗
-admin.flags_replaced = 儲存庫旗標已被更換
+admin.failed_to_replace_flags = 儲存庫旗標替換失敗
+admin.flags_replaced = 已替換儲存庫旗標
default_branch_label = 預設
tree_path_not_found_tag = 路徑 %[1]s 不存在於標籤 %[2]s 中
tree_path_not_found_commit = 路徑 %[1]s 不存在於提交 %[2]s 中
@@ -2513,7 +2537,7 @@ migrate.cancel_migrating_confirm = 您確定要取消這次的遷移嗎?
invisible_runes_header = `此檔案內含不可見的 Unicode 字元`
ambiguous_runes_header = `這個檔案內含模棱兩可的 Unicode 字元`
rss.must_be_on_branch = 您必須在一個分支上才能訂閱 RSS。
-admin.enabled_flags = 該儲存庫的旗標:
+admin.enabled_flags = 該儲存庫啟用的旗標:
mirror_address_protocol_invalid = 輸入的 URL 無效。只有 https(s):// 或 git:// 連結可以被設定為鏡像來源。
ambiguous_runes_description = `這個檔案內含容易造成混淆的 Unicode 字元。如果您覺得這是檔案作者的本意,您可以安全的忽略這則訊息。按下 Escape 可以顯示這些字元。`
commit.contained_in = 這個提交存在於:
@@ -2606,7 +2630,7 @@ pulls.commit_ref_at = `在提交 %[2]s 引用了
pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫 checkout 一個新的分支來測試這些更改。
pulls.cmd_instruction_merge_title = 合併
pulls.ready_for_review = 可以開始審閱了嗎?
-pulls.cmd_instruction_hint = `檢視命令列指示`
+pulls.cmd_instruction_hint = `檢視 命令列指示`
file_follow = 跟隨象徵式連結
milestones.filter_sort.earliest_due_data = 最早到期日
size_format = %[1]s:%[2]s,%[3]s:%[4]s
@@ -2648,6 +2672,17 @@ wiki.original_git_entry_tooltip = 與其使用友善連結,檢視原始 Git
settings.mirror_settings.docs.more_information_if_disabled = 您可以在這裡找到更多關於 push 和 pull 鏡像的資訊:
settings.mirror_settings.docs.doc_link_title = 如何建立儲存庫鏡像?
settings.mirror_settings.docs.pulling_remote_title = 從遠端儲存庫拉取
+issues.author.tooltip.pr = 此使用者是這個合併請求的作者。
+form.string_too_long = 提供的字串超過了 %d 個字母。
+subscribe.issue.guest.tooltip = 登入來追蹤這個問題。
+subscribe.pull.guest.tooltip = 登入來追蹤這個合併請求。
+milestones.filter_sort.name = 名稱
+settings.units.overview = 概覽
+settings.federation_settings = 聯邦設定
+issues.author.tooltip.issue = 這個使用者是這個問題的作者。
+settings.units.add_more = 新增更多...
+release.download_count_one = %s 次下載
+release.download_count_few = %s 次下載
[graphs]
@@ -2693,7 +2728,7 @@ settings.visibility.private_shortname=私有
settings.update_settings=更新設定
settings.update_setting_success=組織設定已更新。
-settings.change_orgname_redirect_prompt=舊的名稱被領用前,會重新導向新名稱。
+settings.change_orgname_redirect_prompt=舊的名稱被領用前將會轉址至新名稱。
settings.update_avatar_success=已更新組織的大頭貼。
settings.delete=刪除組織
settings.delete_account=刪除這個組織
@@ -2824,9 +2859,9 @@ dashboard.resync_all_hooks=重新同步所有儲存庫的 pre-receive、update
dashboard.reinit_missing_repos=重新初始化所有記錄存在但遺失的 Git 儲存庫
dashboard.sync_external_users=同步外部使用者資料
dashboard.cleanup_hook_task_table=清理 hook_task 資料表
-dashboard.cleanup_packages=清理已過期的軟體包
+dashboard.cleanup_packages=清理過期的軟體包
dashboard.server_uptime=伺服器運作時間
-dashboard.current_goroutine=目前的 Goroutines 數量
+dashboard.current_goroutine=目前的 Goroutines
dashboard.current_memory_usage=目前記憶體使用量
dashboard.total_memory_allocated=所有被分配的記憶體
dashboard.memory_obtained=獲得的記憶體
@@ -3119,7 +3154,7 @@ config.lfs_enabled=已啟用
config.lfs_content_path=LFS 內容路徑
config.lfs_http_auth_expiry=LFS HTTP 驗證有效時間
-config.db_config=資料庫設定
+config.db_config=資料庫組態
config.db_type=資料庫類型
config.db_host=主機地址
config.db_name=名稱
@@ -3171,7 +3206,7 @@ config.mailer_use_dummy=Dummy
config.test_email_placeholder=電子信箱 (例:test@example.com)
config.send_test_mail=寄送測試郵件
config.test_mail_failed=傳送測試郵件至「%s」時失敗: %v
-config.test_mail_sent=測試郵件已傳送至「%s」。
+config.test_mail_sent=已傳送測試郵件至「%s」。
config.oauth_config=OAuth 設定
config.oauth_enabled=啟用服務
@@ -3204,7 +3239,7 @@ config.git_max_diff_files=差異比較時顯示的最多檔案數
config.git_gc_args=GC 參數
config.git_migrate_timeout=遷移逾時
config.git_mirror_timeout=鏡像更新逾時
-config.git_clone_timeout=Clone 作業逾時
+config.git_clone_timeout=拓製逾時
config.git_pull_timeout=Pull 作業逾時
config.git_gc_timeout=GC 作業逾時
@@ -3280,7 +3315,7 @@ assets = 程式碼資料
dashboard.sync_branch.started = 已開始同步分支
dashboard.rebuild_issue_indexer = 重建問題索引
repos.lfs_size = LFS 大小
-packages.cleanup = 清除過期資料
+packages.cleanup = 清除過期的資料
packages.cleanup.success = 已成功清除過期資料
monitor.processes_count = %d 個程序
monitor.queue.settings.remove_all_items = 全部移除
@@ -3653,4 +3688,8 @@ runner_kind = 搜尋 Runners …
project_kind = 搜尋專案…
branch_kind = 搜尋分支…
commit_kind = 搜尋提交…
-code_search_by_git_grep = 目前搜尋結果由「git grep」提供。如果網站管理員啟用程式碼索引,可能會有更好的結果。
\ No newline at end of file
+code_search_by_git_grep = 目前搜尋結果由「git grep」提供。如果網站管理員啟用程式碼索引,可能會有更好的結果。
+exact = 精確
+milestone_kind = 搜尋里程碑...
+issue_kind = 搜尋問題...
+exact_tooltip = 只包含與搜尋詞完全相符的結合
diff --git a/package-lock.json b/package-lock.json
index 6c628bd836..4f2c267139 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "forgejo",
+ "name": "forgejo-aneksajo",
"lockfileVersion": 3,
"requires": true,
"packages": {
@@ -7,7 +7,6 @@
"dependencies": {
"@citation-js/core": "0.7.11",
"@citation-js/plugin-bibtex": "0.7.11",
- "@citation-js/plugin-csl": "0.7.11",
"@citation-js/plugin-software-formats": "0.6.1",
"@github/markdown-toolbar-element": "2.2.3",
"@github/relative-time-element": "4.4.2",
@@ -55,7 +54,6 @@
"uint8-to-base64": "0.2.0",
"vanilla-colorful": "0.7.2",
"vue": "3.4.31",
- "vue-bar-graph": "2.0.0",
"vue-chartjs": "5.3.1",
"vue-loader": "17.4.2",
"vue3-calendar-heatmap": "2.0.5",
@@ -377,22 +375,6 @@
"node": ">=14.0.0"
}
},
- "node_modules/@citation-js/plugin-csl": {
- "version": "0.7.11",
- "resolved": "https://registry.npmjs.org/@citation-js/plugin-csl/-/plugin-csl-0.7.11.tgz",
- "integrity": "sha512-4OGZ9wHZDfpgiPU2cOXWGuKt7P+ndGWAeLG95nOG+DXe5U+f9EEZTXfaM4C99x8Ri+g6JklR96A3kuYZxYLllg==",
- "license": "MIT",
- "dependencies": {
- "@citation-js/date": "^0.5.0",
- "citeproc": "^2.4.6"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "@citation-js/core": "^0.7.0"
- }
- },
"node_modules/@citation-js/plugin-github": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/@citation-js/plugin-github/-/plugin-github-0.6.1.tgz",
@@ -461,9 +443,9 @@
}
},
"node_modules/@csstools/css-parser-algorithms": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.0.tgz",
- "integrity": "sha512-qvBMcOU/uWFCH/VO0MYe0AMs0BGMWAt6FTryMbFIKYtZtVnqTZtT8ktv5o718llkaGZWomJezJZjq3vJDHeJNQ==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
+ "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
"dev": true,
"funding": [
{
@@ -480,13 +462,13 @@
"node": "^14 || ^16 || >=18"
},
"peerDependencies": {
- "@csstools/css-tokenizer": "^2.3.2"
+ "@csstools/css-tokenizer": "^2.4.1"
}
},
"node_modules/@csstools/css-tokenizer": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.2.tgz",
- "integrity": "sha512-0xYOf4pQpAaE6Sm2Q0x3p25oRukzWQ/O8hWVvhIt9Iv98/uu053u2CGm/g3kJ+P0vOYTAYzoU8Evq2pg9ZPXtw==",
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
+ "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
"dev": true,
"funding": [
{
@@ -504,9 +486,9 @@
}
},
"node_modules/@csstools/media-query-list-parser": {
- "version": "2.1.12",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.12.tgz",
- "integrity": "sha512-t1/CdyVJzOQUiGUcIBXRzTAkWTFPxiPnoKwowKW2z9Uj78c2bBWI/X94BeVfUwVq1xtCjD7dnO8kS6WONgp8Jw==",
+ "version": "2.1.13",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
+ "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
"dev": true,
"funding": [
{
@@ -523,8 +505,8 @@
"node": "^14 || ^16 || >=18"
},
"peerDependencies": {
- "@csstools/css-parser-algorithms": "^2.7.0",
- "@csstools/css-tokenizer": "^2.3.2"
+ "@csstools/css-parser-algorithms": "^2.7.1",
+ "@csstools/css-tokenizer": "^2.4.1"
}
},
"node_modules/@csstools/selector-resolve-nested": {
@@ -1337,9 +1319,9 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
@@ -1583,9 +1565,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
- "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz",
+ "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==",
"cpu": [
"arm"
],
@@ -1597,9 +1579,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz",
- "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz",
+ "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==",
"cpu": [
"arm64"
],
@@ -1611,9 +1593,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz",
- "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz",
+ "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==",
"cpu": [
"arm64"
],
@@ -1625,9 +1607,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz",
- "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz",
+ "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==",
"cpu": [
"x64"
],
@@ -1639,9 +1621,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz",
- "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz",
+ "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==",
"cpu": [
"arm"
],
@@ -1653,9 +1635,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz",
- "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz",
+ "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==",
"cpu": [
"arm"
],
@@ -1667,9 +1649,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz",
- "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz",
+ "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==",
"cpu": [
"arm64"
],
@@ -1681,9 +1663,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz",
- "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz",
+ "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==",
"cpu": [
"arm64"
],
@@ -1695,9 +1677,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz",
- "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz",
+ "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==",
"cpu": [
"ppc64"
],
@@ -1709,9 +1691,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz",
- "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz",
+ "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==",
"cpu": [
"riscv64"
],
@@ -1723,9 +1705,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz",
- "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz",
+ "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==",
"cpu": [
"s390x"
],
@@ -1737,9 +1719,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
- "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz",
+ "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==",
"cpu": [
"x64"
],
@@ -1751,9 +1733,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz",
- "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz",
+ "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==",
"cpu": [
"x64"
],
@@ -1765,9 +1747,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz",
- "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz",
+ "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==",
"cpu": [
"arm64"
],
@@ -1779,9 +1761,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz",
- "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz",
+ "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==",
"cpu": [
"ia32"
],
@@ -1793,9 +1775,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz",
- "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz",
+ "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==",
"cpu": [
"x64"
],
@@ -2512,9 +2494,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "20.14.9",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz",
- "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==",
+ "version": "20.14.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
+ "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
"license": "MIT",
"dependencies": {
"undici-types": "~5.26.4"
@@ -2557,17 +2539,17 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz",
- "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz",
+ "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.14.1",
- "@typescript-eslint/type-utils": "7.14.1",
- "@typescript-eslint/utils": "7.14.1",
- "@typescript-eslint/visitor-keys": "7.14.1",
+ "@typescript-eslint/scope-manager": "7.16.0",
+ "@typescript-eslint/type-utils": "7.16.0",
+ "@typescript-eslint/utils": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0",
"graphemer": "^1.4.0",
"ignore": "^5.3.1",
"natural-compare": "^1.4.0",
@@ -2591,16 +2573,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz",
- "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz",
+ "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "@typescript-eslint/scope-manager": "7.14.1",
- "@typescript-eslint/types": "7.14.1",
- "@typescript-eslint/typescript-estree": "7.14.1",
- "@typescript-eslint/visitor-keys": "7.14.1",
+ "@typescript-eslint/scope-manager": "7.16.0",
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/typescript-estree": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0",
"debug": "^4.3.4"
},
"engines": {
@@ -2620,14 +2602,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz",
- "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
+ "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "7.14.1",
- "@typescript-eslint/visitor-keys": "7.14.1"
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -2638,14 +2620,14 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz",
- "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz",
+ "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "7.14.1",
- "@typescript-eslint/utils": "7.14.1",
+ "@typescript-eslint/typescript-estree": "7.16.0",
+ "@typescript-eslint/utils": "7.16.0",
"debug": "^4.3.4",
"ts-api-utils": "^1.3.0"
},
@@ -2666,9 +2648,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz",
- "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
+ "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2680,14 +2662,14 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz",
- "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
+ "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "@typescript-eslint/types": "7.14.1",
- "@typescript-eslint/visitor-keys": "7.14.1",
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/visitor-keys": "7.16.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -2709,16 +2691,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz",
- "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz",
+ "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.14.1",
- "@typescript-eslint/types": "7.14.1",
- "@typescript-eslint/typescript-estree": "7.14.1"
+ "@typescript-eslint/scope-manager": "7.16.0",
+ "@typescript-eslint/types": "7.16.0",
+ "@typescript-eslint/typescript-estree": "7.16.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -2732,13 +2714,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz",
- "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
+ "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "7.14.1",
+ "@typescript-eslint/types": "7.16.0",
"eslint-visitor-keys": "^3.4.3"
},
"engines": {
@@ -3284,9 +3266,9 @@
}
},
"node_modules/acorn": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
- "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
+ "version": "8.12.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+ "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -3820,9 +3802,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.23.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
- "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
+ "version": "4.23.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+ "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
"funding": [
{
"type": "opencollective",
@@ -3839,10 +3821,10 @@
],
"license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001629",
- "electron-to-chromium": "^1.4.796",
+ "caniuse-lite": "^1.0.30001640",
+ "electron-to-chromium": "^1.4.820",
"node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.16"
+ "update-browserslist-db": "^1.1.0"
},
"bin": {
"browserslist": "cli.js"
@@ -3950,9 +3932,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001639",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz",
- "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==",
+ "version": "1.0.30001641",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz",
+ "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==",
"funding": [
{
"type": "opencollective",
@@ -4125,12 +4107,6 @@
"node": ">=8"
}
},
- "node_modules/citeproc": {
- "version": "2.4.63",
- "resolved": "https://registry.npmjs.org/citeproc/-/citeproc-2.4.63.tgz",
- "integrity": "sha512-68F95Bp4UbgZU/DBUGQn0qV3HDZLCdI9+Bb2ByrTaNJDL5VEm9LqaiNaxljsvoaExSLEXe1/r6n2Z06SCzW3/Q==",
- "license": "CPAL-1.0 OR AGPL-1.0"
- },
"node_modules/clean-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
@@ -5357,9 +5333,9 @@
}
},
"node_modules/dompurify": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz",
- "integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==",
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz",
+ "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==",
"license": "(MPL-2.0 OR Apache-2.0)"
},
"node_modules/domutils": {
@@ -5442,9 +5418,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.815",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz",
- "integrity": "sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==",
+ "version": "1.4.825",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.825.tgz",
+ "integrity": "sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==",
"license": "ISC"
},
"node_modules/elkjs": {
@@ -6631,9 +6607,9 @@
}
},
"node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -7301,12 +7277,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/gsap": {
- "version": "3.12.5",
- "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.5.tgz",
- "integrity": "sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==",
- "license": "Standard 'no charge' license: https://gsap.com/standard-license. Club GSAP members get more: https://gsap.com/licensing/. Why GreenSock doesn't employ an MIT license: https://gsap.com/why-license/"
- },
"node_modules/hammerjs": {
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
@@ -8248,9 +8218,9 @@
}
},
"node_modules/istanbul-lib-source-maps": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz",
- "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==",
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
+ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -8291,16 +8261,13 @@
}
},
"node_modules/jackspeak": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz",
- "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==",
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
- "engines": {
- "node": ">=14"
- },
"funding": {
"url": "https://github.com/sponsors/isaacs"
},
@@ -8375,9 +8342,9 @@
}
},
"node_modules/js-beautify/node_modules/glob": {
- "version": "10.4.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
- "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -8391,9 +8358,6 @@
"bin": {
"glob": "dist/esm/bin.mjs"
},
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
@@ -8953,13 +8917,10 @@
}
},
"node_modules/lru-cache": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz",
- "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==",
- "license": "ISC",
- "engines": {
- "node": "14 || >=16.14"
- }
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
},
"node_modules/magic-string": {
"version": "0.25.9",
@@ -9071,9 +9032,9 @@
}
},
"node_modules/markdownlint-cli/node_modules/glob": {
- "version": "10.4.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
- "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -9087,9 +9048,6 @@
"bin": {
"glob": "dist/esm/bin.mjs"
},
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
@@ -10513,14 +10471,14 @@
}
},
"node_modules/pkg-types": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz",
- "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz",
+ "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==",
"dev": true,
"license": "MIT",
"dependencies": {
"confbox": "^0.1.7",
- "mlly": "^1.7.0",
+ "mlly": "^1.7.1",
"pathe": "^1.1.2"
}
},
@@ -12511,9 +12469,9 @@
}
},
"node_modules/sucrase/node_modules/glob": {
- "version": "10.4.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
- "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
@@ -12526,9 +12484,6 @@
"bin": {
"glob": "dist/esm/bin.mjs"
},
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
@@ -12745,9 +12700,9 @@
"license": "ISC"
},
"node_modules/terser": {
- "version": "5.31.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz",
- "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==",
+ "version": "5.31.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz",
+ "integrity": "sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==",
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -13184,9 +13139,9 @@
}
},
"node_modules/typescript": {
- "version": "5.5.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz",
- "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==",
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
+ "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
"devOptional": true,
"license": "Apache-2.0",
"peer": true,
@@ -13270,9 +13225,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
- "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+ "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
"funding": [
{
"type": "opencollective",
@@ -13390,14 +13345,14 @@
"license": "MIT"
},
"node_modules/vite": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz",
- "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==",
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
+ "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.21.3",
- "postcss": "^8.4.38",
+ "postcss": "^8.4.39",
"rollup": "^4.13.0"
},
"bin": {
@@ -13927,10 +13882,39 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
+ "node_modules/vite/node_modules/postcss": {
+ "version": "8.4.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+ "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.1",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
"node_modules/vite/node_modules/rollup": {
- "version": "4.18.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz",
- "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz",
+ "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -13944,22 +13928,22 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.18.0",
- "@rollup/rollup-android-arm64": "4.18.0",
- "@rollup/rollup-darwin-arm64": "4.18.0",
- "@rollup/rollup-darwin-x64": "4.18.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.18.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.18.0",
- "@rollup/rollup-linux-arm64-gnu": "4.18.0",
- "@rollup/rollup-linux-arm64-musl": "4.18.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.18.0",
- "@rollup/rollup-linux-s390x-gnu": "4.18.0",
- "@rollup/rollup-linux-x64-gnu": "4.18.0",
- "@rollup/rollup-linux-x64-musl": "4.18.0",
- "@rollup/rollup-win32-arm64-msvc": "4.18.0",
- "@rollup/rollup-win32-ia32-msvc": "4.18.0",
- "@rollup/rollup-win32-x64-msvc": "4.18.0",
+ "@rollup/rollup-android-arm-eabi": "4.18.1",
+ "@rollup/rollup-android-arm64": "4.18.1",
+ "@rollup/rollup-darwin-arm64": "4.18.1",
+ "@rollup/rollup-darwin-x64": "4.18.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.18.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.18.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.18.1",
+ "@rollup/rollup-linux-arm64-musl": "4.18.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.18.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.18.1",
+ "@rollup/rollup-linux-x64-gnu": "4.18.1",
+ "@rollup/rollup-linux-x64-musl": "4.18.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.18.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.18.1",
+ "@rollup/rollup-win32-x64-msvc": "4.18.1",
"fsevents": "~2.3.2"
}
},
@@ -14060,16 +14044,6 @@
}
}
},
- "node_modules/vue-bar-graph": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/vue-bar-graph/-/vue-bar-graph-2.0.0.tgz",
- "integrity": "sha512-IoYP+r5Ggjys6QdUNYFPh7qD41wi/uDOJj9nMawvDgvV6niOz3Dw8O2/98ZnUgjTpcgcGFDaaAaK6qa9x1jgpw==",
- "license": "MIT",
- "dependencies": {
- "gsap": "^3.10.4",
- "vue": "^3.2.37"
- }
- },
"node_modules/vue-chartjs": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.1.tgz",
@@ -14081,9 +14055,9 @@
}
},
"node_modules/vue-component-type-helpers": {
- "version": "2.0.24",
- "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.24.tgz",
- "integrity": "sha512-Jr5N8QVYEcbQuMN1LRgvg61758G8HTnzUlQsAFOxx6Y6X8kmhJ7C+jOvWsQruYxi3uHhhS6BghyRlyiwO99DBg==",
+ "version": "2.0.26",
+ "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.26.tgz",
+ "integrity": "sha512-sO9qQ8oC520SW6kqlls0iqDak53gsTVSrYylajgjmkt1c0vcgjsGSy1KzlDrbEx8pm02IEYhlUkU5hCYf8rwtg==",
"dev": true,
"license": "MIT"
},
@@ -14503,9 +14477,9 @@
}
},
"node_modules/why-is-node-running": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
- "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index 3c4d79f6a1..0abf6fe8b9 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,6 @@
"dependencies": {
"@citation-js/core": "0.7.11",
"@citation-js/plugin-bibtex": "0.7.11",
- "@citation-js/plugin-csl": "0.7.11",
"@citation-js/plugin-software-formats": "0.6.1",
"@github/markdown-toolbar-element": "2.2.3",
"@github/relative-time-element": "4.4.2",
@@ -54,7 +53,6 @@
"uint8-to-base64": "0.2.0",
"vanilla-colorful": "0.7.2",
"vue": "3.4.31",
- "vue-bar-graph": "2.0.0",
"vue-chartjs": "5.3.1",
"vue-loader": "17.4.2",
"vue3-calendar-heatmap": "2.0.5",
diff --git a/public/.well-known/security.txt b/public/.well-known/security.txt
index f301a00542..5e7f9b387b 100644
--- a/public/.well-known/security.txt
+++ b/public/.well-known/security.txt
@@ -1,6 +1,6 @@
# This site is running a Forgejo instance.
# Forgejo-related security problems should be reported to the Forgejo security team.
-# Site-related security problems should be reported to this site's admin.
+# Security problems related to this instance should be reported to its administration.
Policy: https://codeberg.org/forgejo/forgejo/src/branch/forgejo/CONTRIBUTING.md
Contact: mailto:security@forgejo.org
Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/1B638BDF10969D627926B8D9F585D0F99E1FB56F
diff --git a/release-notes/8.0.0/feat/31513.md b/release-notes/8.0.0/feat/31513.md
new file mode 100644
index 0000000000..3c9baf5d70
--- /dev/null
+++ b/release-notes/8.0.0/feat/31513.md
@@ -0,0 +1 @@
+- add support for LFS server implementations which have batch API responses in an older/deprecated schema
diff --git a/release-notes/8.0.0/fix/4253.md b/release-notes/8.0.0/fix/4253.md
new file mode 100644
index 0000000000..1533c2a734
--- /dev/null
+++ b/release-notes/8.0.0/fix/4253.md
@@ -0,0 +1 @@
+- unknown git push options are rejected instead of being ignored
diff --git a/routers/api/v1/repo/action.go b/routers/api/v1/repo/action.go
index 3e25327ccb..72232d66ef 100644
--- a/routers/api/v1/repo/action.go
+++ b/routers/api/v1/repo/action.go
@@ -621,10 +621,10 @@ func DispatchWorkflow(ctx *context.APIContext) {
name := ctx.Params("workflowname")
if len(opt.Ref) == 0 {
- ctx.Error(http.StatusBadRequest, "ref", nil)
+ ctx.Error(http.StatusBadRequest, "ref", "ref is empty")
return
} else if len(name) == 0 {
- ctx.Error(http.StatusBadRequest, "workflowname", nil)
+ ctx.Error(http.StatusBadRequest, "workflowname", "workflow name is empty")
return
}
diff --git a/routers/api/v1/repo/commits.go b/routers/api/v1/repo/commits.go
index d06a3b4e49..5e7d10e6c2 100644
--- a/routers/api/v1/repo/commits.go
+++ b/routers/api/v1/repo/commits.go
@@ -354,7 +354,7 @@ func GetCommitPullRequest(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"
- pr, err := issues_model.GetPullRequestByMergedCommit(ctx, ctx.Repo.Repository.ID, ctx.Params(":sha"))
+ pr, err := issues_model.GetPullRequestByMergedCommit(ctx, ctx.Repo.Repository.ID, ctx.Params("ref"))
if err != nil {
if issues_model.IsErrPullRequestNotExist(err) {
ctx.Error(http.StatusNotFound, "GetPullRequestByMergedCommit", err)
diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go
index 8f9b598c0b..afcfbc00e3 100644
--- a/routers/api/v1/repo/issue.go
+++ b/routers/api/v1/repo/issue.go
@@ -893,13 +893,16 @@ func EditIssue(ctx *context.APIContext) {
return
}
}
- if err := issue_service.ChangeStatus(ctx, issue, ctx.Doer, "", api.StateClosed == api.StateType(*form.State)); err != nil {
- if issues_model.IsErrDependenciesLeft(err) {
- ctx.Error(http.StatusPreconditionFailed, "DependenciesLeft", "cannot close this issue because it still has open dependencies")
+ isClosed := api.StateClosed == api.StateType(*form.State)
+ if issue.IsClosed != isClosed {
+ if err := issue_service.ChangeStatus(ctx, issue, ctx.Doer, "", isClosed); err != nil {
+ if issues_model.IsErrDependenciesLeft(err) {
+ ctx.Error(http.StatusPreconditionFailed, "DependenciesLeft", "cannot close this issue because it still has open dependencies")
+ return
+ }
+ ctx.Error(http.StatusInternalServerError, "ChangeStatus", err)
return
}
- ctx.Error(http.StatusInternalServerError, "ChangeStatus", err)
- return
}
}
diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go
index fbd37e00cb..1ff755c058 100644
--- a/routers/api/v1/repo/issue_comment.go
+++ b/routers/api/v1/repo/issue_comment.go
@@ -462,6 +462,11 @@ func GetIssueComment(ctx *context.APIContext) {
return
}
+ if err := comment.LoadAttachments(ctx); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadAttachments", err)
+ return
+ }
+
ctx.JSON(http.StatusOK, convert.ToAPIComment(ctx, ctx.Repo.Repository, comment))
}
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go
index 725a33929f..d5bed1f640 100644
--- a/routers/api/v1/repo/pull.go
+++ b/routers/api/v1/repo/pull.go
@@ -711,13 +711,16 @@ func EditPullRequest(ctx *context.APIContext) {
ctx.Error(http.StatusPreconditionFailed, "MergedPRState", "cannot change state of this pull request, it was already merged")
return
}
- if err := issue_service.ChangeStatus(ctx, issue, ctx.Doer, "", api.StateClosed == api.StateType(*form.State)); err != nil {
- if issues_model.IsErrDependenciesLeft(err) {
- ctx.Error(http.StatusPreconditionFailed, "DependenciesLeft", "cannot close this pull request because it still has open dependencies")
+ isClosed := api.StateClosed == api.StateType(*form.State)
+ if issue.IsClosed != isClosed {
+ if err := issue_service.ChangeStatus(ctx, issue, ctx.Doer, "", isClosed); err != nil {
+ if issues_model.IsErrDependenciesLeft(err) {
+ ctx.Error(http.StatusPreconditionFailed, "DependenciesLeft", "cannot close this pull request because it still has open dependencies")
+ return
+ }
+ ctx.Error(http.StatusInternalServerError, "ChangeStatus", err)
return
}
- ctx.Error(http.StatusInternalServerError, "ChangeStatus", err)
- return
}
}
diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go
index b78f19d51e..11d1161e85 100644
--- a/routers/private/hook_post_receive.go
+++ b/routers/private/hook_post_receive.go
@@ -18,6 +18,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/cache"
"code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/git/pushoptions"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
@@ -170,7 +171,7 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) {
}
// Handle Push Options
- if len(opts.GitPushOptions) > 0 {
+ if !opts.GetGitPushOptions().Empty() {
// load the repository
if repo == nil {
repo = loadRepository(ctx, ownerName, repoName)
@@ -181,8 +182,8 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) {
wasEmpty = repo.IsEmpty
}
- repo.IsPrivate = opts.GitPushOptions.Bool(private.GitPushOptionRepoPrivate, repo.IsPrivate)
- repo.IsTemplate = opts.GitPushOptions.Bool(private.GitPushOptionRepoTemplate, repo.IsTemplate)
+ repo.IsPrivate = opts.GetGitPushOptions().GetBool(pushoptions.RepoPrivate, repo.IsPrivate)
+ repo.IsTemplate = opts.GetGitPushOptions().GetBool(pushoptions.RepoTemplate, repo.IsTemplate)
if err := repo_model.UpdateRepositoryCols(ctx, repo, "is_private", "is_template"); err != nil {
log.Error("Failed to Update: %s/%s Error: %v", ownerName, repoName, err)
ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{
diff --git a/routers/private/hook_post_receive_test.go b/routers/private/hook_post_receive_test.go
index 658557d3cf..bfd647e365 100644
--- a/routers/private/hook_post_receive_test.go
+++ b/routers/private/hook_post_receive_test.go
@@ -17,18 +17,19 @@ import (
"code.gitea.io/gitea/services/contexttest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestHandlePullRequestMerging(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
pr, err := issues_model.GetUnmergedPullRequest(db.DefaultContext, 1, 1, "branch2", "master", issues_model.PullRequestFlowGithub)
- assert.NoError(t, err)
- assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
+ require.NoError(t, err)
+ require.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
err = pull_model.ScheduleAutoMerge(db.DefaultContext, user1, pr.ID, repo_model.MergeStyleSquash, "squash merge a pr")
- assert.NoError(t, err)
+ require.NoError(t, err)
autoMerge := unittest.AssertExistsAndLoadBean(t, &pull_model.AutoMerge{PullID: pr.ID})
@@ -39,9 +40,9 @@ func TestHandlePullRequestMerging(t *testing.T) {
}, pr.BaseRepo.OwnerName, pr.BaseRepo.Name, []*repo_module.PushUpdateOptions{
{NewCommitID: "01234567"},
})
- assert.Equal(t, 0, len(resp.Body.String()))
+ assert.Empty(t, resp.Body.String())
pr, err = issues_model.GetPullRequestByID(db.DefaultContext, pr.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, pr.HasMerged)
assert.EqualValues(t, "01234567", pr.MergedCommitID)
diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go
index 456a288b00..8f7575c1db 100644
--- a/routers/private/hook_pre_receive.go
+++ b/routers/private/hook_pre_receive.go
@@ -123,23 +123,7 @@ func (ctx *preReceiveContext) canChangeSettings() error {
func (ctx *preReceiveContext) validatePushOptions() error {
opts := web.GetForm(ctx).(*private.HookOptions)
- if len(opts.GitPushOptions) == 0 {
- return nil
- }
-
- changesRepoSettings := false
- for key := range opts.GitPushOptions {
- switch key {
- case private.GitPushOptionRepoPrivate, private.GitPushOptionRepoTemplate:
- changesRepoSettings = true
- case "topic", "force-push", "title", "description":
- // Agit options
- default:
- return fmt.Errorf("unknown option %s", key)
- }
- }
-
- if changesRepoSettings {
+ if opts.GetGitPushOptions().ChangeRepoSettings() {
return ctx.canChangeSettings()
}
diff --git a/routers/private/hook_verification_test.go b/routers/private/hook_verification_test.go
index 04445b8eaf..5f0d1d0f4f 100644
--- a/routers/private/hook_verification_test.go
+++ b/routers/private/hook_verification_test.go
@@ -10,7 +10,7 @@ import (
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/git"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
var testReposDir = "tests/repos/"
@@ -20,10 +20,10 @@ func TestVerifyCommits(t *testing.T) {
gitRepo, err := git.OpenRepository(context.Background(), testReposDir+"repo1_hook_verification")
defer gitRepo.Close()
- assert.NoError(t, err)
+ require.NoError(t, err)
objectFormat, err := gitRepo.GetObjectFormat()
- assert.NoError(t, err)
+ require.NoError(t, err)
testCases := []struct {
base, head string
@@ -38,9 +38,9 @@ func TestVerifyCommits(t *testing.T) {
for _, tc := range testCases {
err = verifyCommits(tc.base, tc.head, gitRepo, nil)
if tc.verified {
- assert.NoError(t, err)
+ require.NoError(t, err)
} else {
- assert.Error(t, err)
+ require.Error(t, err)
}
}
}
diff --git a/routers/private/serv.go b/routers/private/serv.go
index ef3920d359..a3a0c6961a 100644
--- a/routers/private/serv.go
+++ b/routers/private/serv.go
@@ -81,12 +81,14 @@ func ServCommand(ctx *context.PrivateContext) {
ownerName := ctx.Params(":owner")
repoName := ctx.Params(":repo")
mode := perm.AccessMode(ctx.FormInt("mode"))
+ verbs := ctx.FormStrings("verb")
// Set the basic parts of the results to return
results := private.ServCommandResults{
RepoName: repoName,
OwnerName: ownerName,
KeyID: keyID,
+ UserMode: perm.AccessModeNone,
}
// Now because we're not translating things properly let's just default some English strings here
@@ -287,8 +289,10 @@ func ServCommand(ctx *context.PrivateContext) {
repo.IsPrivate ||
owner.Visibility.IsPrivate() ||
(user != nil && user.IsRestricted) || // user will be nil if the key is a deploykey
+ (setting.Annex.Enabled && len(verbs) > 0 && verbs[0] == "git-annex-shell") || // git-annex has its own permission enforcement, for which we expose results.UserMode
setting.Service.RequireSignInView) {
if key.Type == asymkey_model.KeyTypeDeploy {
+ results.UserMode = deployKey.Mode
if deployKey.Mode < mode {
ctx.JSON(http.StatusUnauthorized, private.Response{
UserMsg: fmt.Sprintf("Deploy Key: %d:%s is not authorized to %s %s/%s.", key.ID, key.Name, modeString, results.OwnerName, results.RepoName),
@@ -310,9 +314,9 @@ func ServCommand(ctx *context.PrivateContext) {
return
}
- userMode := perm.UnitAccessMode(unitType)
+ results.UserMode = perm.UnitAccessMode(unitType)
- if userMode < mode {
+ if results.UserMode < mode {
log.Warn("Failed authentication attempt for %s with key %s (not authorized to %s %s/%s) from %s", user.Name, key.Name, modeString, ownerName, repoName, ctx.RemoteAddr())
ctx.JSON(http.StatusUnauthorized, private.Response{
UserMsg: fmt.Sprintf("User: %d:%s with Key: %d:%s is not authorized to %s %s/%s.", user.ID, user.Name, key.ID, key.Name, modeString, ownerName, repoName),
@@ -353,6 +357,7 @@ func ServCommand(ctx *context.PrivateContext) {
})
return
}
+ results.UserMode = perm.AccessModeWrite
results.RepoID = repo.ID
}
@@ -381,13 +386,14 @@ func ServCommand(ctx *context.PrivateContext) {
return
}
}
- log.Debug("Serv Results:\nIsWiki: %t\nDeployKeyID: %d\nKeyID: %d\tKeyName: %s\nUserName: %s\nUserID: %d\nOwnerName: %s\nRepoName: %s\nRepoID: %d",
+ log.Debug("Serv Results:\nIsWiki: %t\nDeployKeyID: %d\nKeyID: %d\tKeyName: %s\nUserName: %s\nUserID: %d\nUserMode: %d\nOwnerName: %s\nRepoName: %s\nRepoID: %d",
results.IsWiki,
results.DeployKeyID,
results.KeyID,
results.KeyName,
results.UserName,
results.UserID,
+ results.UserMode,
results.OwnerName,
results.RepoName,
results.RepoID)
diff --git a/routers/web/admin/users_test.go b/routers/web/admin/users_test.go
index f6f9237858..ae3b130101 100644
--- a/routers/web/admin/users_test.go
+++ b/routers/web/admin/users_test.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/services/forms"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestNewUserPost_MustChangePassword(t *testing.T) {
@@ -48,7 +49,7 @@ func TestNewUserPost_MustChangePassword(t *testing.T) {
u, err := user_model.GetUserByName(ctx, username)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, username, u.Name)
assert.Equal(t, email, u.Email)
assert.True(t, u.MustChangePassword)
@@ -85,7 +86,7 @@ func TestNewUserPost_MustChangePasswordFalse(t *testing.T) {
u, err := user_model.GetUserByName(ctx, username)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, username, u.Name)
assert.Equal(t, email, u.Email)
assert.False(t, u.MustChangePassword)
@@ -152,7 +153,7 @@ func TestNewUserPost_VisibilityDefaultPublic(t *testing.T) {
u, err := user_model.GetUserByName(ctx, username)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, username, u.Name)
assert.Equal(t, email, u.Email)
// As default user visibility
@@ -191,7 +192,7 @@ func TestNewUserPost_VisibilityPrivate(t *testing.T) {
u, err := user_model.GetUserByName(ctx, username)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, username, u.Name)
assert.Equal(t, email, u.Email)
// As default user visibility
diff --git a/routers/web/auth/oauth_test.go b/routers/web/auth/oauth_test.go
index 3726daee93..5a4a646577 100644
--- a/routers/web/auth/oauth_test.go
+++ b/routers/web/auth/oauth_test.go
@@ -15,11 +15,12 @@ import (
"github.com/golang-jwt/jwt/v5"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func createAndParseToken(t *testing.T, grant *auth.OAuth2Grant) *oauth2.OIDCToken {
signingKey, err := oauth2.CreateJWTSigningKey("HS256", make([]byte, 32))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, signingKey)
response, terr := newAccessTokenResponse(db.DefaultContext, grant, signingKey, signingKey)
@@ -31,7 +32,7 @@ func createAndParseToken(t *testing.T, grant *auth.OAuth2Grant) *oauth2.OIDCToke
assert.Equal(t, signingKey.SigningMethod().Alg(), token.Method.Alg())
return signingKey.VerifyKey(), nil
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, parsedToken.Valid)
oidcToken, ok := parsedToken.Claims.(*oauth2.OIDCToken)
@@ -42,10 +43,10 @@ func createAndParseToken(t *testing.T, grant *auth.OAuth2Grant) *oauth2.OIDCToke
}
func TestNewAccessTokenResponse_OIDCToken(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
grants, err := auth.GetOAuth2GrantsByUserID(db.DefaultContext, 3)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, grants, 1)
// Scopes: openid
@@ -61,7 +62,7 @@ func TestNewAccessTokenResponse_OIDCToken(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
grants, err = auth.GetOAuth2GrantsByUserID(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, grants, 1)
// Scopes: openid profile email
@@ -97,6 +98,6 @@ func TestNewAccessTokenResponse_OIDCToken(t *testing.T) {
func TestEncodeCodeChallenge(t *testing.T) {
// test vector from https://datatracker.ietf.org/doc/html/rfc7636#page-18
codeChallenge, err := encodeCodeChallenge("dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", codeChallenge)
}
diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go
index 90d3226f2d..ff3b16159b 100644
--- a/routers/web/repo/actions/actions.go
+++ b/routers/web/repo/actions/actions.go
@@ -95,6 +95,8 @@ func List(ctx *context.Context) {
allRunnerLabels.AddMultiple(r.AgentLabels...)
}
+ canRun := ctx.Repo.CanWrite(unit.TypeActions)
+
workflows = make([]Workflow, 0, len(entries))
for _, entry := range entries {
workflow := Workflow{Entry: *entry}
@@ -146,7 +148,7 @@ func List(ctx *context.Context) {
}
workflows = append(workflows, workflow)
- if workflow.Entry.Name() == curWorkflow {
+ if canRun && workflow.Entry.Name() == curWorkflow {
config := wf.WorkflowDispatchConfig()
if config != nil {
keys := util.KeysOfMap(config.Inputs)
diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go
index 33491ec696..bf9a448ec5 100644
--- a/routers/web/repo/commit.go
+++ b/routers/web/repo/commit.go
@@ -242,6 +242,12 @@ func FileHistory(ctx *context.Context) {
ctx.ServerError("CommitsByFileAndRange", err)
return
}
+
+ if len(commits) == 0 {
+ ctx.NotFound("CommitsByFileAndRange", nil)
+ return
+ }
+
oldestCommit := commits[len(commits)-1]
renamedFiles, err := git.GetCommitFileRenames(ctx, ctx.Repo.GitRepo.Path, oldestCommit.ID.String())
diff --git a/routers/web/repo/download.go b/routers/web/repo/download.go
index c4a8baecca..b55d8d5046 100644
--- a/routers/web/repo/download.go
+++ b/routers/web/repo/download.go
@@ -9,6 +9,7 @@ import (
"time"
git_model "code.gitea.io/gitea/models/git"
+ "code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/httpcache"
"code.gitea.io/gitea/modules/lfs"
@@ -79,6 +80,26 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim
}
closed = true
+ // check for git-annex files
+ // (this code is weirdly redundant because I'm trying not to delete any lines in order to make merges easier)
+ isAnnexed, err := annex.IsAnnexed(blob)
+ if err != nil {
+ ctx.ServerError("annex.IsAnnexed", err)
+ return err
+ }
+ if isAnnexed {
+ content, err := annex.Content(blob)
+ if err != nil {
+ // XXX are there any other possible failure cases here?
+ // there are, there could be unrelated io errors; those should be ctx.ServerError()s
+ ctx.NotFound("annex.Content", err)
+ return err
+ }
+ defer content.Close()
+ common.ServeContentByReadSeeker(ctx.Base, ctx.Repo.TreePath, lastModified, content)
+ return nil
+ }
+
return common.ServeBlob(ctx.Base, ctx.Repo.TreePath, blob, lastModified)
}
diff --git a/routers/web/repo/githttp.go b/routers/web/repo/githttp.go
index 9f3b63698a..0c27e28f99 100644
--- a/routers/web/repo/githttp.go
+++ b/routers/web/repo/githttp.go
@@ -596,3 +596,34 @@ func GetIdxFile(ctx *context.Context) {
h.sendFile(ctx, "application/x-git-packed-objects-toc", "objects/pack/pack-"+ctx.Params("file")+".idx")
}
}
+
+// GetAnnexObject implements git-annex dumb HTTP
+func GetAnnexObject(ctx *context.Context) {
+ h := httpBase(ctx)
+ if h != nil {
+ // git-annex objects are stored in .git/annex/objects/{hash1}/{hash2}/{key}/{key}
+ // where key is a string containing the size and (usually SHA256) checksum of the file,
+ // and hash1+hash2 are the first few bits of the md5sum of key itself.
+ // ({hash1}/{hash2}/ is just there to avoid putting too many files in one directory)
+ // ref: https://git-annex.branchable.com/internals/hashing/
+
+ // keyDir should = key, but we don't enforce that
+ object := filepath.Join(ctx.Params("hash1"), ctx.Params("hash2"), ctx.Params("keyDir"), ctx.Params("key"))
+
+ // Sanitize the input against directory traversals.
+ //
+ // This works because at the filesystem root, "/.." = "/";
+ // So if a path starts rooted ("/"), path.Clean(), which
+ // path.Join() calls internally, removes all '..' prefixes.
+ // After, this unroots the path unconditionally ([1:]), which
+ // works because we know the input is never supposed to be rooted.
+ //
+ // The router code probably also disallows "..", so this
+ // should be redundant, but it's defensive to keep it
+ // whenever touching filesystem paths with user input.
+ object = filepath.Join(string(filepath.Separator), object)[1:]
+
+ setHeaderCacheForever(ctx)
+ h.sendFile(ctx, "application/octet-stream", "annex/objects/"+object)
+ }
+}
diff --git a/routers/web/repo/issue_label_test.go b/routers/web/repo/issue_label_test.go
index 93fc72300b..2b4915e855 100644
--- a/routers/web/repo/issue_label_test.go
+++ b/routers/web/repo/issue_label_test.go
@@ -17,6 +17,7 @@ import (
"code.gitea.io/gitea/services/forms"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func int64SliceToCommaSeparated(a []int64) string {
@@ -32,7 +33,7 @@ func int64SliceToCommaSeparated(a []int64) string {
func TestInitializeLabels(t *testing.T) {
unittest.PrepareTestEnv(t)
- assert.NoError(t, repository.LoadRepoConfig())
+ require.NoError(t, repository.LoadRepoConfig())
ctx, _ := contexttest.MockContext(t, "user2/repo1/labels/initialize")
contexttest.LoadUser(t, ctx, 2)
contexttest.LoadRepo(t, ctx, 2)
diff --git a/routers/web/repo/pull_review_test.go b/routers/web/repo/pull_review_test.go
index 70f6a0e055..329e83fe4b 100644
--- a/routers/web/repo/pull_review_test.go
+++ b/routers/web/repo/pull_review_test.go
@@ -17,6 +17,7 @@ import (
"code.gitea.io/gitea/services/pull"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRenderConversation(t *testing.T) {
@@ -42,14 +43,12 @@ func TestRenderConversation(t *testing.T) {
var preparedComment *issues_model.Comment
run("prepare", func(t *testing.T, ctx *context.Context, resp *httptest.ResponseRecorder) {
comment, err := pull.CreateCodeComment(ctx, pr.Issue.Poster, ctx.Repo.GitRepo, pr.Issue, 1, "content", "", false, 0, pr.HeadCommitID, nil)
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
+
comment.Invalidated = true
err = issues_model.UpdateCommentInvalidate(ctx, comment)
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
+
preparedComment = comment
})
if !assert.NotNil(t, preparedComment) {
@@ -80,9 +79,9 @@ func TestRenderConversation(t *testing.T) {
reviews, err := issues_model.FindReviews(db.DefaultContext, issues_model.FindReviewOptions{
IssueID: 2,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, r := range reviews {
- assert.NoError(t, issues_model.DeleteReview(db.DefaultContext, r))
+ require.NoError(t, issues_model.DeleteReview(db.DefaultContext, r))
}
ctx.Data["ShowOutdatedComments"] = true
renderConversation(ctx, preparedComment, "diff")
@@ -93,9 +92,9 @@ func TestRenderConversation(t *testing.T) {
reviews, err := issues_model.FindReviews(db.DefaultContext, issues_model.FindReviewOptions{
IssueID: 2,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, r := range reviews {
- assert.NoError(t, issues_model.DeleteReview(db.DefaultContext, r))
+ require.NoError(t, issues_model.DeleteReview(db.DefaultContext, r))
}
ctx.Data["ShowOutdatedComments"] = true
renderConversation(ctx, preparedComment, "timeline")
diff --git a/routers/web/repo/release_test.go b/routers/web/repo/release_test.go
index 7ebea4c3fb..5c7b6e2e8f 100644
--- a/routers/web/repo/release_test.go
+++ b/routers/web/repo/release_test.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/services/forms"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestNewReleasePost(t *testing.T) {
@@ -79,12 +80,12 @@ func TestCalReleaseNumCommitsBehind(t *testing.T) {
IncludeDrafts: ctx.Repo.CanWrite(unit.TypeReleases),
RepoID: ctx.Repo.Repository.ID,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
countCache := make(map[string]int64)
for _, release := range releases {
err := calReleaseNumCommitsBehind(ctx.Repo, release, countCache)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
type computedFields struct {
diff --git a/routers/web/repo/setting/settings_test.go b/routers/web/repo/setting/settings_test.go
index b771113841..0c8553faea 100644
--- a/routers/web/repo/setting/settings_test.go
+++ b/routers/web/repo/setting/settings_test.go
@@ -22,6 +22,7 @@ import (
repo_service "code.gitea.io/gitea/services/repository"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func createSSHAuthorizedKeysTmpPath(t *testing.T) func() {
@@ -126,7 +127,7 @@ func TestCollaborationPost(t *testing.T) {
assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
exists, err := repo_model.IsCollaborator(ctx, re.ID, 4)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, exists)
}
@@ -186,7 +187,7 @@ func TestCollaborationPost_AddCollaboratorTwice(t *testing.T) {
assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
exists, err := repo_model.IsCollaborator(ctx, re.ID, 4)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, exists)
// Try adding the same collaborator again
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index 5295bfdb2a..dacacad5ff 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -33,6 +33,7 @@ import (
unit_model "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/actions"
+ "code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/git"
@@ -208,14 +209,59 @@ func localizedExtensions(ext, languageCode string) (localizedExts []string) {
}
type fileInfo struct {
- isTextFile bool
- isLFSFile bool
- fileSize int64
- lfsMeta *lfs.Pointer
- st typesniffer.SniffedType
+ isTextFile bool
+ isLFSFile bool
+ isAnnexFile bool
+ isAnnexFilePresent bool
+ fileSize int64
+ lfsMeta *lfs.Pointer
+ st typesniffer.SniffedType
}
func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte, io.ReadCloser, *fileInfo, error) {
+ isAnnexed, err := annex.IsAnnexed(blob)
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ if isAnnexed {
+ // TODO: this code could be merged with the LFS case, especially the redundant type sniffer,
+ // but it is *currently* written this way to make merging with the non-annex upstream easier:
+ // this way, the git-annex patch is (mostly) pure additions.
+
+ annexContent, err := annex.Content(blob)
+ if err != nil {
+ // If annex.Content returns an error it can mean that the blob does not
+ // refer to an annexed file or that it is not present here. Since we already
+ // checked that it is annexed the latter must be the case. So we return the
+ // content of the blob instead and indicate that the file is indeed annexed,
+ // but not present here. The template can then communicate the situation.
+ dataRc, err := blob.DataAsync()
+ if err != nil {
+ return nil, nil, nil, err
+ }
+
+ buf := make([]byte, 1024)
+ n, _ := util.ReadAtMost(dataRc, buf)
+ buf = buf[:n]
+
+ st := typesniffer.DetectContentType(buf)
+ return buf, dataRc, &fileInfo{st.IsText(), false, true, false, blob.Size(), nil, st}, nil
+ }
+
+ stat, err := annexContent.Stat()
+ if err != nil {
+ return nil, nil, nil, err
+ }
+
+ buf := make([]byte, 1024)
+ n, _ := util.ReadAtMost(annexContent, buf)
+ buf = buf[:n]
+
+ st := typesniffer.DetectContentType(buf)
+
+ return buf, annexContent, &fileInfo{st.IsText(), false, true, true, stat.Size(), nil, st}, nil
+ }
+
dataRc, err := blob.DataAsync()
if err != nil {
return nil, nil, nil, err
@@ -230,17 +276,17 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte,
// FIXME: what happens when README file is an image?
if !isTextFile || !setting.LFS.StartServer {
- return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil
+ return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil
}
pointer, _ := lfs.ReadPointerFromBuffer(buf)
if !pointer.IsValid() { // fallback to plain file
- return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil
+ return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil
}
meta, err := git_model.GetLFSMetaObjectByOid(ctx, repoID, pointer.Oid)
if err != nil && err != git_model.ErrLFSObjectNotExist { // fallback to plain file
- return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil
+ return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil
}
dataRc.Close()
@@ -263,7 +309,7 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte,
st = typesniffer.DetectContentType(buf)
- return buf, dataRc, &fileInfo{st.IsText(), true, meta.Size, &meta.Pointer, st}, nil
+ return buf, dataRc, &fileInfo{st.IsText(), true, false, false, meta.Size, &meta.Pointer, st}, nil
}
func renderReadmeFile(ctx *context.Context, subfolder string, readmeFile *git.TreeEntry) {
@@ -445,10 +491,17 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
isDisplayingSource := ctx.FormString("display") == "source"
isDisplayingRendered := !isDisplayingSource
- if fInfo.isLFSFile {
+ if fInfo.isLFSFile || fInfo.isAnnexFile {
ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/media/" + ctx.Repo.BranchNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath)
}
+ if fInfo.isAnnexFile {
+ // pre-git-annex v7, all annexed files were represented in-repo as symlinks;
+ // but we pretend they aren't, since that's a distracting quirk of git-annex
+ // and not a meaningful choice on the user's part
+ ctx.Data["FileIsSymlink"] = false
+ }
+
isRepresentableAsText := fInfo.st.IsRepresentableAsText()
if !isRepresentableAsText {
// If we can't show plain text, always try to render.
@@ -456,6 +509,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
isDisplayingRendered = true
}
ctx.Data["IsLFSFile"] = fInfo.isLFSFile
+ ctx.Data["IsAnnexFile"] = fInfo.isAnnexFile
+ ctx.Data["IsAnnexFilePresent"] = fInfo.isAnnexFilePresent
ctx.Data["FileSize"] = fInfo.fileSize
ctx.Data["IsTextFile"] = fInfo.isTextFile
ctx.Data["IsRepresentableAsText"] = isRepresentableAsText
@@ -490,6 +545,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
// Assume file is not editable first.
if fInfo.isLFSFile {
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_lfs_files")
+ } else if fInfo.isAnnexFile {
+ ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_annex_files")
} else if !isRepresentableAsText {
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_non_text_files")
}
@@ -557,14 +614,21 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
// The Open Group Base Specification: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html
// empty: 0 lines; "a": 1 incomplete-line; "a\n": 1 line; "a\nb": 1 line, 1 incomplete-line;
// Forgejo uses the definition (like most modern editors):
- // empty: 0 lines; "a": 1 line; "a\n": 2 lines; "a\nb": 2 lines;
- // When rendering, the last empty line is not rendered in UI, while the line-number is still counted, to tell users that the file contains a trailing EOL.
- // To make the UI more consistent, it could use an icon mark to indicate that there is no trailing EOL, and show line-number as the rendered lines.
+ // empty: 0 lines; "a": 1 line; "a\n": 1 line; "a\nb": 2 lines;
+ // When rendering, the last empty line is not rendered in U and isn't counted towards the number of lines.
+ // To tell users that the file not contains a trailing EOL, text with a tooltip is displayed in the file header.
// This NumLines is only used for the display on the UI: "xxx lines"
+ hasTrailingEOL := bytes.HasSuffix(buf, []byte{'\n'})
+ ctx.Data["HasTrailingEOL"] = hasTrailingEOL
+ ctx.Data["HasTrailingEOLSet"] = true
if len(buf) == 0 {
ctx.Data["NumLines"] = 0
} else {
- ctx.Data["NumLines"] = bytes.Count(buf, []byte{'\n'}) + 1
+ numLines := bytes.Count(buf, []byte{'\n'})
+ if !hasTrailingEOL {
+ numLines++
+ }
+ ctx.Data["NumLines"] = numLines
}
ctx.Data["NumLinesSet"] = true
@@ -589,7 +653,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
ctx.Data["FileContent"] = fileContent
ctx.Data["LineEscapeStatus"] = statuses
}
- if !fInfo.isLFSFile {
+ if !fInfo.isLFSFile && !fInfo.isAnnexFile {
if ctx.Repo.CanEnableEditor(ctx, ctx.Doer) {
if lfsLock != nil && lfsLock.OwnerID != ctx.Doer.ID {
ctx.Data["CanEditFile"] = false
@@ -1142,6 +1206,15 @@ PostRecentBranchCheck:
ctx.Data["TreeNames"] = treeNames
ctx.Data["BranchLink"] = branchLink
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
+ isAnnexFile, okAnnexFile := ctx.Data["IsAnnexFile"]
+ isAnnexFilePresent, okAnnexFilePresent := ctx.Data["IsAnnexFilePresent"]
+ if okAnnexFile && okAnnexFilePresent && isAnnexFile.(bool) && !isAnnexFilePresent.(bool) {
+ // If the file to be viewed is annexed but not present then render it normally
+ // (which will show the plain git blob content, i.e. the symlink or pointer target)
+ // but make the status code a 404.
+ ctx.HTML(http.StatusNotFound, tplRepoHome)
+ return
+ }
ctx.HTML(http.StatusOK, tplRepoHome)
}
diff --git a/routers/web/repo/wiki_test.go b/routers/web/repo/wiki_test.go
index 719cca3049..00a35a5da0 100644
--- a/routers/web/repo/wiki_test.go
+++ b/routers/web/repo/wiki_test.go
@@ -19,6 +19,7 @@ import (
wiki_service "code.gitea.io/gitea/services/wiki"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const (
@@ -28,12 +29,12 @@ const (
func wikiEntry(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) *git.TreeEntry {
wikiRepo, err := gitrepo.OpenWikiRepository(git.DefaultContext, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer wikiRepo.Close()
commit, err := wikiRepo.GetBranchCommit("master")
- assert.NoError(t, err)
+ require.NoError(t, err)
entries, err := commit.ListEntries()
- assert.NoError(t, err)
+ require.NoError(t, err)
for _, entry := range entries {
if entry.Name() == wiki_service.WebPathToGitPath(wikiName) {
return entry
@@ -48,10 +49,10 @@ func wikiContent(t *testing.T, repo *repo_model.Repository, wikiName wiki_servic
return ""
}
reader, err := entry.Blob().DataAsync()
- assert.NoError(t, err)
+ require.NoError(t, err)
defer reader.Close()
bytes, err := io.ReadAll(reader)
- assert.NoError(t, err)
+ require.NoError(t, err)
return string(bytes)
}
@@ -127,7 +128,7 @@ func TestNewWikiPost(t *testing.T) {
NewWikiPost(ctx)
assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
assertWikiExists(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title))
- assert.Equal(t, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)), content)
+ assert.Equal(t, content, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)))
}
}
@@ -179,7 +180,7 @@ func TestEditWikiPost(t *testing.T) {
EditWikiPost(ctx)
assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
assertWikiExists(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title))
- assert.Equal(t, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)), content)
+ assert.Equal(t, content, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)))
if title != "Home" {
assertWikiNotExists(t, ctx.Repo.Repository, "Home")
}
diff --git a/routers/web/user/home_test.go b/routers/web/user/home_test.go
index a59afce12c..f6e91b6219 100644
--- a/routers/web/user/home_test.go
+++ b/routers/web/user/home_test.go
@@ -17,12 +17,13 @@ import (
"code.gitea.io/gitea/services/contexttest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestArchivedIssues(t *testing.T) {
// Arrange
setting.UI.IssuePagingNum = 1
- assert.NoError(t, unittest.LoadFixtures())
+ require.NoError(t, unittest.LoadFixtures())
ctx, _ := contexttest.MockContext(t, "issues")
contexttest.LoadUser(t, ctx, 30)
@@ -53,7 +54,7 @@ func TestArchivedIssues(t *testing.T) {
func TestIssues(t *testing.T) {
setting.UI.IssuePagingNum = 1
- assert.NoError(t, unittest.LoadFixtures())
+ require.NoError(t, unittest.LoadFixtures())
ctx, _ := contexttest.MockContext(t, "issues")
contexttest.LoadUser(t, ctx, 2)
@@ -67,7 +68,7 @@ func TestIssues(t *testing.T) {
func TestPulls(t *testing.T) {
setting.UI.IssuePagingNum = 20
- assert.NoError(t, unittest.LoadFixtures())
+ require.NoError(t, unittest.LoadFixtures())
ctx, _ := contexttest.MockContext(t, "pulls")
contexttest.LoadUser(t, ctx, 2)
@@ -80,7 +81,7 @@ func TestPulls(t *testing.T) {
func TestMilestones(t *testing.T) {
setting.UI.IssuePagingNum = 1
- assert.NoError(t, unittest.LoadFixtures())
+ require.NoError(t, unittest.LoadFixtures())
ctx, _ := contexttest.MockContext(t, "milestones")
contexttest.LoadUser(t, ctx, 2)
@@ -99,7 +100,7 @@ func TestMilestones(t *testing.T) {
func TestMilestonesForSpecificRepo(t *testing.T) {
setting.UI.IssuePagingNum = 1
- assert.NoError(t, unittest.LoadFixtures())
+ require.NoError(t, unittest.LoadFixtures())
ctx, _ := contexttest.MockContext(t, "milestones")
contexttest.LoadUser(t, ctx, 2)
@@ -123,17 +124,17 @@ func TestDashboardPagination(t *testing.T) {
setting.AppSubURL = "/SubPath"
out, err := ctx.RenderToHTML("base/paginate", map[string]any{"Link": setting.AppSubURL, "Page": page})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Contains(t, out, ``)
setting.AppSubURL = ""
out, err = ctx.RenderToHTML("base/paginate", map[string]any{"Link": setting.AppSubURL, "Page": page})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Contains(t, out, ``)
}
func TestOrgLabels(t *testing.T) {
- assert.NoError(t, unittest.LoadFixtures())
+ require.NoError(t, unittest.LoadFixtures())
ctx, _ := contexttest.MockContext(t, "org/org3/issues")
contexttest.LoadUser(t, ctx, 2)
diff --git a/routers/web/web.go b/routers/web/web.go
index 3480a18844..e822dc0f89 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -346,6 +346,13 @@ func registerRoutes(m *web.Route) {
}
}
+ annexEnabled := func(ctx *context.Context) {
+ if !setting.Annex.Enabled {
+ ctx.Error(http.StatusNotFound)
+ return
+ }
+ }
+
federationEnabled := func(ctx *context.Context) {
if !setting.Federation.Enabled {
ctx.Error(http.StatusNotFound)
@@ -1610,6 +1617,12 @@ func registerRoutes(m *web.Route) {
})
}, ignSignInAndCsrf, lfsServerEnabled)
+ m.Group("", func() {
+ // for git-annex
+ m.Methods("GET,OPTIONS", "/config", repo.GetTextFile("config")) // needed by clients reading annex.uuid during `git annex initremote`
+ m.Methods("GET,OPTIONS", "/annex/objects/{hash1}/{hash2}/{keyDir}/{key}", repo.GetAnnexObject)
+ }, ignSignInAndCsrf, annexEnabled, context.UserAssignmentWeb())
+
gitHTTPRouters(m)
})
})
diff --git a/services/actions/auth_test.go b/services/actions/auth_test.go
index 12db2bae56..1400e61f47 100644
--- a/services/actions/auth_test.go
+++ b/services/actions/auth_test.go
@@ -12,45 +12,46 @@ import (
"github.com/golang-jwt/jwt/v5"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestCreateAuthorizationToken(t *testing.T) {
var taskID int64 = 23
token, err := CreateAuthorizationToken(taskID, 1, 2)
- assert.Nil(t, err)
+ require.NoError(t, err)
assert.NotEqual(t, "", token)
claims := jwt.MapClaims{}
_, err = jwt.ParseWithClaims(token, claims, func(t *jwt.Token) (any, error) {
return setting.GetGeneralTokenSigningSecret(), nil
})
- assert.Nil(t, err)
+ require.NoError(t, err)
scp, ok := claims["scp"]
assert.True(t, ok, "Has scp claim in jwt token")
assert.Contains(t, scp, "Actions.Results:1:2")
taskIDClaim, ok := claims["TaskID"]
assert.True(t, ok, "Has TaskID claim in jwt token")
- assert.Equal(t, float64(taskID), taskIDClaim, "Supplied taskid must match stored one")
+ assert.InDelta(t, float64(taskID), taskIDClaim, 0, "Supplied taskid must match stored one")
acClaim, ok := claims["ac"]
assert.True(t, ok, "Has ac claim in jwt token")
ac, ok := acClaim.(string)
assert.True(t, ok, "ac claim is a string for buildx gha cache")
scopes := []actionsCacheScope{}
err = json.Unmarshal([]byte(ac), &scopes)
- assert.NoError(t, err, "ac claim is a json list for buildx gha cache")
+ require.NoError(t, err, "ac claim is a json list for buildx gha cache")
assert.GreaterOrEqual(t, len(scopes), 1, "Expected at least one action cache scope for buildx gha cache")
}
func TestParseAuthorizationToken(t *testing.T) {
var taskID int64 = 23
token, err := CreateAuthorizationToken(taskID, 1, 2)
- assert.Nil(t, err)
+ require.NoError(t, err)
assert.NotEqual(t, "", token)
headers := http.Header{}
headers.Set("Authorization", "Bearer "+token)
rTaskID, err := ParseAuthorizationToken(&http.Request{
Header: headers,
})
- assert.Nil(t, err)
+ require.NoError(t, err)
assert.Equal(t, taskID, rTaskID)
}
@@ -59,6 +60,6 @@ func TestParseAuthorizationTokenNoAuthHeader(t *testing.T) {
rTaskID, err := ParseAuthorizationToken(&http.Request{
Header: headers,
})
- assert.Nil(t, err)
+ require.NoError(t, err)
assert.Equal(t, int64(0), rTaskID)
}
diff --git a/services/actions/notifier.go b/services/actions/notifier.go
index 3a6dd9db5b..1166bbbfd2 100644
--- a/services/actions/notifier.go
+++ b/services/actions/notifier.go
@@ -55,10 +55,20 @@ func (n *actionsNotifier) NewIssue(ctx context.Context, issue *issues_model.Issu
}).Notify(withMethod(ctx, "NewIssue"))
}
+func (n *actionsNotifier) IssueChangeTitle(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, _ string) {
+ ctx = withMethod(ctx, "IssueChangeTitle")
+
+ n.issueChange(ctx, doer, issue)
+}
+
// IssueChangeContent notifies change content of issue
-func (n *actionsNotifier) IssueChangeContent(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldContent string) {
+func (n *actionsNotifier) IssueChangeContent(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, _ string) {
ctx = withMethod(ctx, "IssueChangeContent")
+ n.issueChange(ctx, doer, issue)
+}
+
+func (n *actionsNotifier) issueChange(ctx context.Context, doer *user_model.User, issue *issues_model.Issue) {
var err error
if err = issue.LoadRepo(ctx); err != nil {
log.Error("LoadRepo: %v", err)
diff --git a/services/actions/notifier_helper_test.go b/services/actions/notifier_helper_test.go
index 3c23414b8e..0fa40c0168 100644
--- a/services/actions/notifier_helper_test.go
+++ b/services/actions/notifier_helper_test.go
@@ -12,10 +12,11 @@ import (
webhook_module "code.gitea.io/gitea/modules/webhook"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_SkipPullRequestEvent(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repoID := int64(1)
commitSHA := "1234"
diff --git a/services/agit/agit.go b/services/agit/agit.go
index e46a5771e1..bd8cc82e55 100644
--- a/services/agit/agit.go
+++ b/services/agit/agit.go
@@ -13,6 +13,7 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/git/pushoptions"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
notify_service "code.gitea.io/gitea/services/notify"
@@ -23,10 +24,10 @@ import (
func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, opts *private.HookOptions) ([]private.HookProcReceiveRefResult, error) {
results := make([]private.HookProcReceiveRefResult, 0, len(opts.OldCommitIDs))
- topicBranch := opts.GitPushOptions["topic"]
- _, forcePush := opts.GitPushOptions["force-push"]
- title, hasTitle := opts.GitPushOptions["title"]
- description, hasDesc := opts.GitPushOptions["description"]
+ topicBranch, _ := opts.GetGitPushOptions().GetString(pushoptions.AgitTopic)
+ _, forcePush := opts.GetGitPushOptions().GetString(pushoptions.AgitForcePush)
+ title, hasTitle := opts.GetGitPushOptions().GetString(pushoptions.AgitTitle)
+ description, hasDesc := opts.GetGitPushOptions().GetString(pushoptions.AgitDescription)
objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
diff --git a/services/asymkey/ssh_key_test.go b/services/asymkey/ssh_key_test.go
index fbd5d13ab2..d667a02557 100644
--- a/services/asymkey/ssh_key_test.go
+++ b/services/asymkey/ssh_key_test.go
@@ -13,10 +13,11 @@ import (
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestAddLdapSSHPublicKeys(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
s := &auth.Source{ID: 1}
@@ -71,7 +72,7 @@ ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ib
OwnerID: user.ID,
LoginSourceID: s.ID,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
if err != nil {
continue
}
diff --git a/services/attachment/attachment_test.go b/services/attachment/attachment_test.go
index 142bcfe629..fe861c6dc8 100644
--- a/services/attachment/attachment_test.go
+++ b/services/attachment/attachment_test.go
@@ -16,6 +16,7 @@ import (
_ "code.gitea.io/gitea/models/actions"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -23,13 +24,13 @@ func TestMain(m *testing.M) {
}
func TestUploadAttachment(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
fPath := "./attachment_test.go"
f, err := os.Open(fPath)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer f.Close()
attach, err := NewAttachment(db.DefaultContext, &repo_model.Attachment{
@@ -37,10 +38,10 @@ func TestUploadAttachment(t *testing.T) {
UploaderID: user.ID,
Name: filepath.Base(fPath),
}, f, -1)
- assert.NoError(t, err)
+ require.NoError(t, err)
attachment, err := repo_model.GetAttachmentByUUID(db.DefaultContext, attach.UUID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, user.ID, attachment.UploaderID)
assert.Equal(t, int64(0), attachment.DownloadCount)
}
diff --git a/services/auth/auth.go b/services/auth/auth.go
index c10872313f..100e5b25a2 100644
--- a/services/auth/auth.go
+++ b/services/auth/auth.go
@@ -61,6 +61,17 @@ func isArchivePath(req *http.Request) bool {
return archivePathRe.MatchString(req.URL.Path)
}
+var annexPathRe = regexp.MustCompile(`^/[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+/annex/`)
+
+func isAnnexPath(req *http.Request) bool {
+ if setting.Annex.Enabled {
+ // "/config" is git's config, not specifically git-annex's; but the only current
+ // user of it is when git-annex downloads the annex.uuid during 'git annex init'.
+ return strings.HasSuffix(req.URL.Path, "/config") || annexPathRe.MatchString(req.URL.Path)
+ }
+ return false
+}
+
// handleSignIn clears existing session variables and stores new ones for the specified user object
func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore, user *user_model.User) {
// We need to regenerate the session...
diff --git a/services/auth/basic.go b/services/auth/basic.go
index c8cb1735ee..562d8e747e 100644
--- a/services/auth/basic.go
+++ b/services/auth/basic.go
@@ -42,8 +42,8 @@ func (b *Basic) Name() string {
// name/token on successful validation.
// Returns nil if header is empty or validation fails.
func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) {
- // Basic authentication should only fire on API, Download or on Git or LFSPaths
- if !middleware.IsAPIPath(req) && !isContainerPath(req) && !isAttachmentDownload(req) && !isGitRawOrAttachOrLFSPath(req) {
+ // Basic authentication should only fire on API, Download or on Git, LFSPaths or Git-Annex paths
+ if !middleware.IsAPIPath(req) && !isContainerPath(req) && !isAttachmentDownload(req) && !isGitRawOrAttachOrLFSPath(req) && !isAnnexPath(req) {
return nil, nil
}
diff --git a/services/context/api_test.go b/services/context/api_test.go
index 911a49949e..6064fee1c3 100644
--- a/services/context/api_test.go
+++ b/services/context/api_test.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGenAPILinks(t *testing.T) {
@@ -38,7 +39,7 @@ func TestGenAPILinks(t *testing.T) {
for req, response := range kases {
u, err := url.Parse(setting.AppURL + req)
- assert.NoError(t, err)
+ require.NoError(t, err)
p := u.Query().Get("page")
curPage, _ := strconv.Atoi(p)
diff --git a/services/context/repo.go b/services/context/repo.go
index e4cacbc53c..9d2fd2ddbe 100644
--- a/services/context/repo.go
+++ b/services/context/repo.go
@@ -897,7 +897,7 @@ func getRefName(ctx *Base, repo *Repository, pathType RepoRefType) string {
case RepoRefCommit:
parts := strings.Split(path, "/")
- if len(parts) > 0 && len(parts[0]) >= 7 && len(parts[0]) <= repo.GetObjectFormat().FullLength() {
+ if len(parts) > 0 && len(parts[0]) >= 4 && len(parts[0]) <= repo.GetObjectFormat().FullLength() {
repo.TreePath = strings.Join(parts[1:], "/")
return parts[0]
}
@@ -1021,7 +1021,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
return cancel
}
ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
- } else if len(refName) >= 7 && len(refName) <= ctx.Repo.GetObjectFormat().FullLength() {
+ } else if len(refName) >= 4 && len(refName) <= ctx.Repo.GetObjectFormat().FullLength() {
ctx.Repo.IsViewCommit = true
ctx.Repo.CommitID = refName
diff --git a/services/contexttest/context_tests.go b/services/contexttest/context_tests.go
index 073af213a2..a4cc967a57 100644
--- a/services/contexttest/context_tests.go
+++ b/services/contexttest/context_tests.go
@@ -28,6 +28,7 @@ import (
"github.com/go-chi/chi/v5"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func mockRequest(t *testing.T, reqPath string) *http.Request {
@@ -37,7 +38,7 @@ func mockRequest(t *testing.T, reqPath string) *http.Request {
path = reqPath
}
requestURL, err := url.Parse(path)
- assert.NoError(t, err)
+ require.NoError(t, err)
req := &http.Request{Method: method, URL: requestURL, Form: maps.Clone(requestURL.Query()), Header: http.Header{}}
req = req.WithContext(middleware.WithContextData(req.Context()))
return req
@@ -117,10 +118,10 @@ func LoadRepo(t *testing.T, ctx gocontext.Context, repoID int64) {
repo.Repository = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID})
var err error
repo.Owner, err = user_model.GetUserByID(ctx, repo.Repository.OwnerID)
- assert.NoError(t, err)
+ require.NoError(t, err)
repo.RepoLink = repo.Repository.Link()
repo.Permission, err = access_model.GetUserRepoPermission(ctx, repo.Repository, doer)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
// LoadRepoCommit loads a repo's commit into a test context.
@@ -136,14 +137,14 @@ func LoadRepoCommit(t *testing.T, ctx gocontext.Context) {
}
gitRepo, err := gitrepo.OpenRepository(ctx, repo.Repository)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer gitRepo.Close()
branch, err := gitRepo.GetHEADBranch()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, branch)
if branch != nil {
repo.Commit, err = gitRepo.GetBranchCommit(branch.Name)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
}
@@ -176,10 +177,10 @@ func LoadOrganization(t *testing.T, ctx gocontext.Context, orgID int64) {
// LoadGitRepo load a git repo into a test context. Requires that ctx.Repo has
// already been populated.
func LoadGitRepo(t *testing.T, ctx *context.Context) {
- assert.NoError(t, ctx.Repo.Repository.LoadOwner(ctx))
+ require.NoError(t, ctx.Repo.Repository.LoadOwner(ctx))
var err error
ctx.Repo.GitRepo, err = gitrepo.OpenRepository(ctx, ctx.Repo.Repository)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
type MockRender struct{}
diff --git a/services/convert/git_commit_test.go b/services/convert/git_commit_test.go
index 73cb5e8c71..68d1b05168 100644
--- a/services/convert/git_commit_test.go
+++ b/services/convert/git_commit_test.go
@@ -14,10 +14,11 @@ import (
"code.gitea.io/gitea/modules/util"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestToCommitMeta(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
headRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
sha1 := git.Sha1ObjectFormat
signature := &git.Signature{Name: "Test Signature", Email: "test@email.com", When: time.Unix(0, 0)}
diff --git a/services/convert/issue_test.go b/services/convert/issue_test.go
index 4d780f3f00..0aeb3e5612 100644
--- a/services/convert/issue_test.go
+++ b/services/convert/issue_test.go
@@ -16,10 +16,11 @@ import (
"code.gitea.io/gitea/modules/timeutil"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestLabel_ToLabel(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: label.RepoID})
assert.Equal(t, &api.Label{
diff --git a/services/convert/pull_test.go b/services/convert/pull_test.go
index 66c7313f7d..1339ed5cc0 100644
--- a/services/convert/pull_test.go
+++ b/services/convert/pull_test.go
@@ -17,15 +17,16 @@ import (
"code.gitea.io/gitea/modules/structs"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestPullRequest_APIFormat(t *testing.T) {
// with HeadRepo
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
headRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1})
- assert.NoError(t, pr.LoadAttributes(db.DefaultContext))
- assert.NoError(t, pr.LoadIssue(db.DefaultContext))
+ require.NoError(t, pr.LoadAttributes(db.DefaultContext))
+ require.NoError(t, pr.LoadIssue(db.DefaultContext))
apiPullRequest := ToAPIPullRequest(git.DefaultContext, pr, nil)
assert.NotNil(t, apiPullRequest)
assert.EqualValues(t, &structs.PRBranchInfo{
@@ -38,8 +39,8 @@ func TestPullRequest_APIFormat(t *testing.T) {
// withOut HeadRepo
pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1})
- assert.NoError(t, pr.LoadIssue(db.DefaultContext))
- assert.NoError(t, pr.LoadAttributes(db.DefaultContext))
+ require.NoError(t, pr.LoadIssue(db.DefaultContext))
+ require.NoError(t, pr.LoadAttributes(db.DefaultContext))
// simulate fork deletion
pr.HeadRepo = nil
pr.HeadRepoID = 100000
@@ -50,7 +51,7 @@ func TestPullRequest_APIFormat(t *testing.T) {
}
func TestPullReviewList(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
t.Run("Pending review", func(t *testing.T) {
reviewer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
@@ -59,18 +60,18 @@ func TestPullReviewList(t *testing.T) {
t.Run("Anonymous", func(t *testing.T) {
prList, err := ToPullReviewList(db.DefaultContext, rl, nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, prList)
})
t.Run("Reviewer", func(t *testing.T) {
prList, err := ToPullReviewList(db.DefaultContext, rl, reviewer)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, prList, 1)
})
t.Run("Admin", func(t *testing.T) {
adminUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{IsAdmin: true}, unittest.Cond("id != ?", reviewer.ID))
prList, err := ToPullReviewList(db.DefaultContext, rl, adminUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, prList, 1)
})
})
diff --git a/services/convert/release_test.go b/services/convert/release_test.go
index 201b27e16d..2e40bb9cdd 100644
--- a/services/convert/release_test.go
+++ b/services/convert/release_test.go
@@ -11,10 +11,11 @@ import (
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRelease_ToRelease(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
release1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{ID: 1})
diff --git a/services/convert/user_test.go b/services/convert/user_test.go
index 4b1effc7aa..0f0b520c9b 100644
--- a/services/convert/user_test.go
+++ b/services/convert/user_test.go
@@ -12,10 +12,11 @@ import (
api "code.gitea.io/gitea/modules/structs"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestUser_ToUser(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1, IsAdmin: true})
diff --git a/services/cron/tasks_test.go b/services/cron/tasks_test.go
index 979371a022..9b969a69a9 100644
--- a/services/cron/tasks_test.go
+++ b/services/cron/tasks_test.go
@@ -9,10 +9,11 @@ import (
"testing"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestAddTaskToScheduler(t *testing.T) {
- assert.Len(t, scheduler.Jobs(), 0)
+ assert.Empty(t, scheduler.Jobs())
defer scheduler.Clear()
// no seconds
@@ -22,7 +23,7 @@ func TestAddTaskToScheduler(t *testing.T) {
Schedule: "5 4 * * *",
},
})
- assert.NoError(t, err)
+ require.NoError(t, err)
jobs := scheduler.Jobs()
assert.Len(t, jobs, 1)
assert.Equal(t, "task 1", jobs[0].Tags()[0])
@@ -35,7 +36,7 @@ func TestAddTaskToScheduler(t *testing.T) {
Schedule: "30 5 4 * * *",
},
})
- assert.NoError(t, err)
+ require.NoError(t, err)
jobs = scheduler.Jobs() // the item order is not guaranteed, so we need to sort it before "assert"
sort.Slice(jobs, func(i, j int) bool {
return jobs[i].Tags()[0] < jobs[j].Tags()[0]
diff --git a/services/doctor/paths.go b/services/doctor/paths.go
index 3f62d587ab..8e37f01ef5 100644
--- a/services/doctor/paths.go
+++ b/services/doctor/paths.go
@@ -60,7 +60,7 @@ func checkConfigurationFile(logger log.Logger, autofix bool, fileOpts configurat
func checkConfigurationFiles(ctx context.Context, logger log.Logger, autofix bool) error {
if fi, err := os.Stat(setting.CustomConf); err != nil || !fi.Mode().IsRegular() {
logger.Error("Failed to find configuration file at '%s'.", setting.CustomConf)
- logger.Error("If you've never ran Gitea yet, this is normal and '%s' will be created for you on first run.", setting.CustomConf)
+ logger.Error("If you've never ran Forgejo yet, this is normal and '%s' will be created for you on first run.", setting.CustomConf)
logger.Error("Otherwise check that you are running this command from the correct path and/or provide a `--config` parameter.")
logger.Critical("Cannot proceed without a configuration file")
return err
diff --git a/services/f3/driver/main_test.go b/services/f3/driver/main_test.go
index 0d3d3d3cec..8505b69b7e 100644
--- a/services/f3/driver/main_test.go
+++ b/services/f3/driver/main_test.go
@@ -17,11 +17,11 @@ import (
_ "code.gitea.io/gitea/services/f3/driver/tests"
tests_f3 "code.forgejo.org/f3/gof3/v3/tree/tests/f3"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestF3(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
tests_f3.ForgeCompliance(t, driver_options.Name)
}
diff --git a/services/f3/util/logger_test.go b/services/f3/util/logger_test.go
index d16c688bb0..db880aa439 100644
--- a/services/f3/util/logger_test.go
+++ b/services/f3/util/logger_test.go
@@ -78,12 +78,12 @@ func testLoggerCase(t *testing.T, level logger.Level, loggerFunc func(logger.Mes
assert.True(t, logFiltered[i], filtered[i])
if moreVerbose != nil {
i++
- require.True(t, len(logFiltered) > i)
+ require.Greater(t, len(logFiltered), i)
assert.False(t, logFiltered[i], filtered[i])
}
if lessVerbose != nil {
i++
- require.True(t, len(logFiltered) > i)
+ require.Greater(t, len(logFiltered), i)
assert.True(t, logFiltered[i], filtered[i])
}
}
diff --git a/services/feed/action_test.go b/services/feed/action_test.go
index e1b071d8f6..404d89c7b8 100644
--- a/services/feed/action_test.go
+++ b/services/feed/action_test.go
@@ -15,7 +15,7 @@ import (
_ "code.gitea.io/gitea/models/actions"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -23,7 +23,7 @@ func TestMain(m *testing.M) {
}
func TestRenameRepoAction(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID})
diff --git a/services/forgejo/sanity_test.go b/services/forgejo/sanity_test.go
index 29ed3bbfff..657f7e2720 100644
--- a/services/forgejo/sanity_test.go
+++ b/services/forgejo/sanity_test.go
@@ -11,21 +11,21 @@ import (
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/setting"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestForgejo_PreMigrationSanityChecks(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
ctx := db.DefaultContext
e := db.GetEngine(ctx)
- assert.NoError(t, PreMigrationSanityChecks(e, ForgejoV4DatabaseVersion, configFixture(t, "")))
+ require.NoError(t, PreMigrationSanityChecks(e, ForgejoV4DatabaseVersion, configFixture(t, "")))
}
func configFixture(t *testing.T, content string) setting.ConfigProvider {
config := filepath.Join(t.TempDir(), "app.ini")
- assert.NoError(t, os.WriteFile(config, []byte(content), 0o777))
+ require.NoError(t, os.WriteFile(config, []byte(content), 0o777))
cfg, err := setting.NewConfigProviderFromFile(config)
- assert.NoError(t, err)
+ require.NoError(t, err)
return cfg
}
diff --git a/services/forgejo/sanity_v1TOv5_0_1Included_test.go b/services/forgejo/sanity_v1TOv5_0_1Included_test.go
index 93bca0d2fb..56618ebd5f 100644
--- a/services/forgejo/sanity_v1TOv5_0_1Included_test.go
+++ b/services/forgejo/sanity_v1TOv5_0_1Included_test.go
@@ -11,11 +11,11 @@ import (
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/log"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestForgejo_v1TOv5_0_1Included(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
logFatal = func(string, ...any) {}
defer func() {
@@ -71,7 +71,7 @@ func verifyForgejoV1TOv5_0_1Included(t *testing.T, config, message string) {
} {
cfg := configFixture(t, testCase.config)
semver.SetVersionString(ctx, testCase.semver)
- assert.NoError(t, v1TOv5_0_1Included(e, testCase.dbVersion, cfg))
+ require.NoError(t, v1TOv5_0_1Included(e, testCase.dbVersion, cfg))
}
for _, testCase := range []struct {
@@ -110,6 +110,6 @@ func verifyForgejoV1TOv5_0_1Included(t *testing.T, config, message string) {
} {
cfg := configFixture(t, testCase.config)
semver.SetVersionString(ctx, testCase.semver)
- assert.ErrorContains(t, v1TOv5_0_1Included(e, testCase.dbVersion, cfg), message)
+ require.ErrorContains(t, v1TOv5_0_1Included(e, testCase.dbVersion, cfg), message)
}
}
diff --git a/services/gitdiff/csv_test.go b/services/gitdiff/csv_test.go
index c006a7c2bd..1dbe616374 100644
--- a/services/gitdiff/csv_test.go
+++ b/services/gitdiff/csv_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestCSVDiff(t *testing.T) {
@@ -212,7 +213,7 @@ c,d,e`,
}
result, err := CreateCsvDiff(diff.Files[0], baseReader, headReader)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, result, 1, "case %d: should be one section", n)
section := result[0]
diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go
index 8d6c376dce..40285f8119 100644
--- a/services/gitdiff/gitdiff_test.go
+++ b/services/gitdiff/gitdiff_test.go
@@ -20,6 +20,7 @@ import (
dmp "github.com/sergi/go-diff/diffmatchpatch"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDiffToHTML(t *testing.T) {
@@ -595,22 +596,22 @@ func setupDefaultDiff() *Diff {
}
func TestDiff_LoadCommentsNoOutdated(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
diff := setupDefaultDiff()
- assert.NoError(t, diff.LoadComments(db.DefaultContext, issue, user, false))
+ require.NoError(t, diff.LoadComments(db.DefaultContext, issue, user, false))
assert.Len(t, diff.Files[0].Sections[0].Lines[0].Conversations, 2)
}
func TestDiff_LoadCommentsWithOutdated(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
diff := setupDefaultDiff()
- assert.NoError(t, diff.LoadComments(db.DefaultContext, issue, user, true))
+ require.NoError(t, diff.LoadComments(db.DefaultContext, issue, user, true))
assert.Len(t, diff.Files[0].Sections[0].Lines[0].Conversations, 2)
assert.Len(t, diff.Files[0].Sections[0].Lines[0].Conversations[0], 2)
assert.Len(t, diff.Files[0].Sections[0].Lines[0].Conversations[1], 1)
@@ -631,9 +632,8 @@ func TestDiffLine_GetCommentSide(t *testing.T) {
func TestGetDiffRangeWithWhitespaceBehavior(t *testing.T) {
gitRepo, err := git.OpenRepository(git.DefaultContext, "./testdata/academic-module")
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
+
defer gitRepo.Close()
for _, behavior := range []git.TrustedCmdArgs{{"-w"}, {"--ignore-space-at-eol"}, {"-b"}, nil} {
diffs, err := GetDiff(db.DefaultContext, gitRepo,
@@ -645,9 +645,9 @@ func TestGetDiffRangeWithWhitespaceBehavior(t *testing.T) {
MaxFiles: setting.Git.MaxGitDiffFiles,
WhitespaceBehavior: behavior,
})
- assert.NoError(t, err, fmt.Sprintf("Error when diff with %s", behavior))
+ require.NoError(t, err, fmt.Sprintf("Error when diff with %s", behavior))
for _, f := range diffs.Files {
- assert.True(t, len(f.Sections) > 0, fmt.Sprintf("%s should have sections", f.Name))
+ assert.Positive(t, len(f.Sections), fmt.Sprintf("%s should have sections", f.Name))
}
}
}
diff --git a/services/issue/assignee_test.go b/services/issue/assignee_test.go
index 38d56f9d9d..2b70b8c8ce 100644
--- a/services/issue/assignee_test.go
+++ b/services/issue/assignee_test.go
@@ -12,36 +12,37 @@ import (
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDeleteNotPassedAssignee(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// Fake issue with assignees
issue, err := issues_model.GetIssueByID(db.DefaultContext, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = issue.LoadAttributes(db.DefaultContext)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, issue.Assignees, 1)
user1, err := user_model.GetUserByID(db.DefaultContext, 1) // This user is already assigned (see the definition in fixtures), so running UpdateAssignee should unassign him
- assert.NoError(t, err)
+ require.NoError(t, err)
// Check if he got removed
isAssigned, err := issues_model.IsUserAssignedToIssue(db.DefaultContext, issue, user1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, isAssigned)
// Clean everyone
err = DeleteNotPassedAssignee(db.DefaultContext, issue, user1, []*user_model.User{})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, issue.Assignees)
// Reload to check they're gone
issue.ResetAttributesLoaded()
- assert.NoError(t, issue.LoadAssignees(db.DefaultContext))
+ require.NoError(t, issue.LoadAssignees(db.DefaultContext))
assert.Empty(t, issue.Assignees)
assert.Empty(t, issue.Assignee)
}
diff --git a/services/issue/commit_test.go b/services/issue/commit_test.go
index 0518803683..c3c3e4c042 100644
--- a/services/issue/commit_test.go
+++ b/services/issue/commit_test.go
@@ -15,11 +15,11 @@ import (
"code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestUpdateIssuesCommit(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
pushCommits := []*repository.PushCommit{
{
Sha1: "abcdef1",
@@ -61,7 +61,7 @@ func TestUpdateIssuesCommit(t *testing.T) {
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
unittest.AssertExistsAndLoadBean(t, commentBean)
unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
unittest.CheckConsistencyFor(t, &activities_model.Action{})
@@ -88,7 +88,7 @@ func TestUpdateIssuesCommit(t *testing.T) {
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 1}, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, "non-existing-branch"))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, "non-existing-branch"))
unittest.AssertExistsAndLoadBean(t, commentBean)
unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
unittest.CheckConsistencyFor(t, &activities_model.Action{})
@@ -114,14 +114,14 @@ func TestUpdateIssuesCommit(t *testing.T) {
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 1}, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
unittest.AssertExistsAndLoadBean(t, commentBean)
unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
unittest.CheckConsistencyFor(t, &activities_model.Action{})
}
func TestUpdateIssuesCommit_Colon(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
pushCommits := []*repository.PushCommit{
{
Sha1: "abcdef2",
@@ -140,13 +140,13 @@ func TestUpdateIssuesCommit_Colon(t *testing.T) {
issueBean := &issues_model.Issue{RepoID: repo.ID, Index: 4}
unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
unittest.CheckConsistencyFor(t, &activities_model.Action{})
}
func TestUpdateIssuesCommit_Issue5957(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
// Test that push to a non-default branch closes an issue.
@@ -173,14 +173,14 @@ func TestUpdateIssuesCommit_Issue5957(t *testing.T) {
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, "non-existing-branch"))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, "non-existing-branch"))
unittest.AssertExistsAndLoadBean(t, commentBean)
unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
unittest.CheckConsistencyFor(t, &activities_model.Action{})
}
func TestUpdateIssuesCommit_AnotherRepo(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
// Test that a push to default branch closes issue in another repo
@@ -208,14 +208,14 @@ func TestUpdateIssuesCommit_AnotherRepo(t *testing.T) {
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
unittest.AssertExistsAndLoadBean(t, commentBean)
unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
unittest.CheckConsistencyFor(t, &activities_model.Action{})
}
func TestUpdateIssuesCommit_AnotherRepo_FullAddress(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
// Test that a push to default branch closes issue in another repo
@@ -243,14 +243,14 @@ func TestUpdateIssuesCommit_AnotherRepo_FullAddress(t *testing.T) {
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
unittest.AssertExistsAndLoadBean(t, commentBean)
unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
unittest.CheckConsistencyFor(t, &activities_model.Action{})
}
func TestUpdateIssuesCommit_AnotherRepoNoPermission(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
// Test that a push with close reference *can not* close issue
@@ -293,7 +293,7 @@ func TestUpdateIssuesCommit_AnotherRepoNoPermission(t *testing.T) {
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, commentBean2)
unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
- assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
+ require.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
unittest.AssertNotExistsBean(t, commentBean)
unittest.AssertNotExistsBean(t, commentBean2)
unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
diff --git a/services/issue/issue_test.go b/services/issue/issue_test.go
index 8806cec0e7..a0bb88e387 100644
--- a/services/issue/issue_test.go
+++ b/services/issue/issue_test.go
@@ -13,6 +13,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGetRefEndNamesAndURLs(t *testing.T) {
@@ -33,10 +34,10 @@ func TestGetRefEndNamesAndURLs(t *testing.T) {
}
func TestIssue_DeleteIssue(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
issueIDs, err := issues_model.GetIssueIDsByRepoID(db.DefaultContext, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, issueIDs, 5)
issue := &issues_model.Issue{
@@ -45,42 +46,42 @@ func TestIssue_DeleteIssue(t *testing.T) {
}
err = deleteIssue(db.DefaultContext, issue)
- assert.NoError(t, err)
+ require.NoError(t, err)
issueIDs, err = issues_model.GetIssueIDsByRepoID(db.DefaultContext, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, issueIDs, 4)
// check attachment removal
attachments, err := repo_model.GetAttachmentsByIssueID(db.DefaultContext, 4)
- assert.NoError(t, err)
+ require.NoError(t, err)
issue, err = issues_model.GetIssueByID(db.DefaultContext, 4)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = deleteIssue(db.DefaultContext, issue)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, attachments, 2)
for i := range attachments {
attachment, err := repo_model.GetAttachmentByUUID(db.DefaultContext, attachments[i].UUID)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, repo_model.IsErrAttachmentNotExist(err))
assert.Nil(t, attachment)
}
// check issue dependencies
user, err := user_model.GetUserByID(db.DefaultContext, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
issue1, err := issues_model.GetIssueByID(db.DefaultContext, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
issue2, err := issues_model.GetIssueByID(db.DefaultContext, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = issues_model.CreateIssueDependency(db.DefaultContext, user, issue1, issue2)
- assert.NoError(t, err)
+ require.NoError(t, err)
left, err := issues_model.IssueNoDependenciesLeft(db.DefaultContext, issue1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, left)
err = deleteIssue(db.DefaultContext, issue2)
- assert.NoError(t, err)
+ require.NoError(t, err)
left, err = issues_model.IssueNoDependenciesLeft(db.DefaultContext, issue1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, left)
}
diff --git a/services/issue/label_test.go b/services/issue/label_test.go
index 90608c9e26..b9d26345c1 100644
--- a/services/issue/label_test.go
+++ b/services/issue/label_test.go
@@ -11,7 +11,7 @@ import (
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestIssue_AddLabels(t *testing.T) {
@@ -26,14 +26,14 @@ func TestIssue_AddLabels(t *testing.T) {
{2, []int64{}, 1}, // pull-request, empty
}
for _, test := range tests {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: test.issueID})
labels := make([]*issues_model.Label, len(test.labelIDs))
for i, labelID := range test.labelIDs {
labels[i] = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: labelID})
}
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: test.doerID})
- assert.NoError(t, AddLabels(db.DefaultContext, issue, doer, labels))
+ require.NoError(t, AddLabels(db.DefaultContext, issue, doer, labels))
for _, labelID := range test.labelIDs {
unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: test.issueID, LabelID: labelID})
}
@@ -52,11 +52,11 @@ func TestIssue_AddLabel(t *testing.T) {
{2, 1, 2}, // pull-request, already-added label
}
for _, test := range tests {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: test.issueID})
label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: test.labelID})
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: test.doerID})
- assert.NoError(t, AddLabel(db.DefaultContext, issue, doer, label))
+ require.NoError(t, AddLabel(db.DefaultContext, issue, doer, label))
unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: test.issueID, LabelID: test.labelID})
}
}
diff --git a/services/issue/milestone_test.go b/services/issue/milestone_test.go
index 42b910166f..1c06572f8e 100644
--- a/services/issue/milestone_test.go
+++ b/services/issue/milestone_test.go
@@ -12,10 +12,11 @@ import (
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestChangeMilestoneAssign(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: 1})
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
assert.NotNil(t, issue)
@@ -23,7 +24,7 @@ func TestChangeMilestoneAssign(t *testing.T) {
oldMilestoneID := issue.MilestoneID
issue.MilestoneID = 2
- assert.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
+ require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{
IssueID: issue.ID,
Type: issues_model.CommentTypeMilestone,
diff --git a/services/mailer/incoming/incoming_test.go b/services/mailer/incoming/incoming_test.go
index 001374d371..1ff12d0e67 100644
--- a/services/mailer/incoming/incoming_test.go
+++ b/services/mailer/incoming/incoming_test.go
@@ -10,6 +10,7 @@ import (
"github.com/emersion/go-imap"
"github.com/jhillyerd/enmime"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestNotHandleTwice(t *testing.T) {
@@ -17,12 +18,12 @@ func TestNotHandleTwice(t *testing.T) {
msg := imap.NewMessage(90, []imap.FetchItem{imap.FetchBody})
handled := isAlreadyHandled(handledSet, msg)
- assert.Equal(t, false, handled)
+ assert.False(t, handled)
handledSet.AddNum(msg.SeqNum)
handled = isAlreadyHandled(handledSet, msg)
- assert.Equal(t, true, handled)
+ assert.True(t, handled)
}
func TestIsAutomaticReply(t *testing.T) {
@@ -74,9 +75,9 @@ func TestIsAutomaticReply(t *testing.T) {
b = b.Header(k, v)
}
root, err := b.Build()
- assert.NoError(t, err)
+ require.NoError(t, err)
env, err := enmime.EnvelopeFromPart(root)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, c.Expected, isAutomaticReply(env))
}
@@ -102,7 +103,7 @@ func TestGetContentFromMailReader(t *testing.T) {
"--message-boundary--\r\n"
env, err := enmime.ReadEnvelope(strings.NewReader(mailString))
- assert.NoError(t, err)
+ require.NoError(t, err)
content := getContentFromMailReader(env)
assert.Equal(t, "mail content", content.Content)
assert.Len(t, content.Attachments, 1)
@@ -139,7 +140,7 @@ func TestGetContentFromMailReader(t *testing.T) {
"--message-boundary--\r\n"
env, err = enmime.ReadEnvelope(strings.NewReader(mailString))
- assert.NoError(t, err)
+ require.NoError(t, err)
content = getContentFromMailReader(env)
assert.Equal(t, "mail content\n--\nattachment content", content.Content)
assert.Len(t, content.Attachments, 2)
@@ -161,7 +162,7 @@ func TestGetContentFromMailReader(t *testing.T) {
"--message-boundary--\r\n"
env, err = enmime.ReadEnvelope(strings.NewReader(mailString))
- assert.NoError(t, err)
+ require.NoError(t, err)
content = getContentFromMailReader(env)
assert.Equal(t, "mail content", content.Content)
assert.Empty(t, content.Attachments)
@@ -182,9 +183,9 @@ func TestGetContentFromMailReader(t *testing.T) {
"--message-boundary--\r\n"
env, err = enmime.ReadEnvelope(strings.NewReader(mailString))
- assert.NoError(t, err)
+ require.NoError(t, err)
content = getContentFromMailReader(env)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "mail content without signature", content.Content)
assert.Empty(t, content.Attachments)
}
diff --git a/services/mailer/mail.go b/services/mailer/mail.go
index d86607295a..7bc37a37e8 100644
--- a/services/mailer/mail.go
+++ b/services/mailer/mail.go
@@ -158,7 +158,7 @@ func SendRegisterNotifyMail(u *user_model.User) {
return
}
- msg := NewMessage(u.Email, locale.TrString("mail.register_notify"), content.String())
+ msg := NewMessage(u.Email, locale.TrString("mail.register_notify_prev9"), content.String())
msg.Info = fmt.Sprintf("UID: %d, registration notify", u.ID)
SendAsync(msg)
diff --git a/services/mailer/mail_admin_new_user_test.go b/services/mailer/mail_admin_new_user_test.go
index 603a8b95c9..840b063a2d 100644
--- a/services/mailer/mail_admin_new_user_test.go
+++ b/services/mailer/mail_admin_new_user_test.go
@@ -56,7 +56,7 @@ func TestAdminNotificationMail_test(t *testing.T) {
called := false
defer mockMailSettings(func(msgs ...*Message) {
- assert.Equal(t, len(msgs), 1, "Test provides only one admin user, so only one email must be sent")
+ assert.Len(t, msgs, 1, "Test provides only one admin user, so only one email must be sent")
assert.Equal(t, msgs[0].To, users[0].Email, "checks if the recipient is the admin of the instance")
manageUserURL := setting.AppURL + "admin/users/" + strconv.FormatInt(users[1].ID, 10)
assert.Contains(t, msgs[0].Body, manageUserURL)
diff --git a/services/mailer/mail_test.go b/services/mailer/mail_test.go
index 8fa45fd593..05da90a363 100644
--- a/services/mailer/mail_test.go
+++ b/services/mailer/mail_test.go
@@ -26,6 +26,7 @@ import (
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
const subjectTpl = `
@@ -51,12 +52,12 @@ const bodyTpl = `
`
func prepareMailerTest(t *testing.T) (doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, comment *issues_model.Comment) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
doer = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, Owner: doer})
issue = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1, Repo: repo, Poster: doer})
- assert.NoError(t, issue.LoadRepo(db.DefaultContext))
+ require.NoError(t, issue.LoadRepo(db.DefaultContext))
comment = unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2, Issue: issue})
return doer, repo, issue, comment
}
@@ -83,7 +84,7 @@ func TestComposeIssueCommentMessage(t *testing.T) {
Content: fmt.Sprintf("test @%s %s#%d body", doer.Name, issue.Repo.FullName(), issue.Index),
Comment: comment,
}, "en-US", recipients, false, "issue comment")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, msgs, 2)
gomailMsg := msgs[0].ToMessage()
replyTo := gomailMsg.GetHeader("Reply-To")[0]
@@ -105,7 +106,7 @@ func TestComposeIssueCommentMessage(t *testing.T) {
gomailMsg.WriteTo(&buf)
b, err := io.ReadAll(quotedprintable.NewReader(&buf))
- assert.NoError(t, err)
+ require.NoError(t, err)
// text/plain
assert.Contains(t, string(b), fmt.Sprintf(`( %s )`, doer.HTMLURL()))
@@ -126,7 +127,7 @@ func TestComposeIssueMessage(t *testing.T) {
Issue: issue, Doer: doer, ActionType: activities_model.ActionCreateIssue,
Content: "test body",
}, "en-US", recipients, false, "issue create")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, msgs, 2)
gomailMsg := msgs[0].ToMessage()
@@ -147,7 +148,7 @@ func TestComposeIssueMessage(t *testing.T) {
func TestMailerIssueTemplate(t *testing.T) {
defer mockMailSettings(nil)()
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
@@ -170,13 +171,13 @@ func TestMailerIssueTemplate(t *testing.T) {
ctx.Context = context.Background()
fromMention := false
msgs, err := composeIssueCommentMessages(ctx, "en-US", recipients, fromMention, "TestMailerIssueTemplate")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, msgs, 1)
return msgs[0]
}
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
- assert.NoError(t, issue.LoadRepo(db.DefaultContext))
+ require.NoError(t, issue.LoadRepo(db.DefaultContext))
msg := testCompose(t, &mailCommentContext{
Issue: issue, Doer: doer, ActionType: activities_model.ActionCreateIssue,
@@ -205,7 +206,7 @@ func TestMailerIssueTemplate(t *testing.T) {
expect(t, msg, issue, comment.Content)
pull := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
- assert.NoError(t, pull.LoadAttributes(db.DefaultContext))
+ require.NoError(t, pull.LoadAttributes(db.DefaultContext))
pullComment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 4, Issue: pull})
msg = testCompose(t, &mailCommentContext{
@@ -221,7 +222,7 @@ func TestMailerIssueTemplate(t *testing.T) {
expect(t, msg, pull, pullComment.Content, pull.PullRequest.BaseBranch)
reviewComment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 9})
- assert.NoError(t, reviewComment.LoadReview(db.DefaultContext))
+ require.NoError(t, reviewComment.LoadReview(db.DefaultContext))
approveComment := reviewComment
approveComment.Review.Type = issues_model.ReviewTypeApprove
@@ -298,7 +299,7 @@ func TestTemplateSelection(t *testing.T) {
func TestTemplateServices(t *testing.T) {
defer mockMailSettings(nil)()
doer, _, issue, comment := prepareMailerTest(t)
- assert.NoError(t, issue.LoadRepo(db.DefaultContext))
+ require.NoError(t, issue.LoadRepo(db.DefaultContext))
expect := func(t *testing.T, issue *issues_model.Issue, comment *issues_model.Comment, doer *user_model.User,
actionType activities_model.ActionType, fromMention bool, tplSubject, tplBody, expSubject, expBody string,
@@ -343,7 +344,7 @@ func TestTemplateServices(t *testing.T) {
func testComposeIssueCommentMessage(t *testing.T, ctx *mailCommentContext, recipients []*user_model.User, fromMention bool, info string) *Message {
msgs, err := composeIssueCommentMessages(ctx, "en-US", recipients, fromMention, info)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, msgs, 1)
return msgs[0]
}
diff --git a/services/mailer/mailer_test.go b/services/mailer/mailer_test.go
index b7b4c28a3c..045701f3a5 100644
--- a/services/mailer/mailer_test.go
+++ b/services/mailer/mailer_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGenerateMessageID(t *testing.T) {
@@ -69,7 +70,7 @@ func TestToMessage(t *testing.T) {
buf := &strings.Builder{}
_, err := m1.ToMessage().WriteTo(buf)
- assert.NoError(t, err)
+ require.NoError(t, err)
header, _ := extractMailHeaderAndContent(t, buf.String())
assert.EqualValues(t, map[string]string{
"Content-Type": "multipart/alternative;",
@@ -89,7 +90,7 @@ func TestToMessage(t *testing.T) {
buf = &strings.Builder{}
_, err = m1.ToMessage().WriteTo(buf)
- assert.NoError(t, err)
+ require.NoError(t, err)
header, _ = extractMailHeaderAndContent(t, buf.String())
assert.EqualValues(t, map[string]string{
"Content-Type": "multipart/alternative;",
diff --git a/services/markup/processorhelper_test.go b/services/markup/processorhelper_test.go
index 170edae0e0..fafde746d2 100644
--- a/services/markup/processorhelper_test.go
+++ b/services/markup/processorhelper_test.go
@@ -16,10 +16,11 @@ import (
"code.gitea.io/gitea/services/contexttest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestProcessorHelper(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
userPublic := "user1"
userPrivate := "user31"
@@ -39,7 +40,7 @@ func TestProcessorHelper(t *testing.T) {
// when using web context, use user.IsUserVisibleToViewer to check
req, err := http.NewRequest("GET", "/", nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
base, baseCleanUp := gitea_context.NewBaseContext(httptest.NewRecorder(), req)
defer baseCleanUp()
giteaCtx := gitea_context.NewWebContext(base, &contexttest.MockRender{}, nil)
@@ -48,7 +49,7 @@ func TestProcessorHelper(t *testing.T) {
assert.False(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPrivate))
giteaCtx.Doer, err = user.GetUserByName(db.DefaultContext, userPrivate)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPublic))
assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPrivate))
}
diff --git a/services/migrations/codebase_test.go b/services/migrations/codebase_test.go
index 68721e0641..23626d16d7 100644
--- a/services/migrations/codebase_test.go
+++ b/services/migrations/codebase_test.go
@@ -13,6 +13,7 @@ import (
base "code.gitea.io/gitea/modules/migration"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestCodebaseDownloadRepo(t *testing.T) {
@@ -41,7 +42,7 @@ func TestCodebaseDownloadRepo(t *testing.T) {
t.Fatalf("Error creating Codebase downloader: %v", err)
}
repo, err := downloader.GetRepoInfo()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertRepositoryEqual(t, &base.Repository{
Name: "test",
Owner: "",
@@ -51,7 +52,7 @@ func TestCodebaseDownloadRepo(t *testing.T) {
}, repo)
milestones, err := downloader.GetMilestones()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertMilestonesEqual(t, []*base.Milestone{
{
Title: "Milestone1",
@@ -66,11 +67,11 @@ func TestCodebaseDownloadRepo(t *testing.T) {
}, milestones)
labels, err := downloader.GetLabels()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, labels, 4)
issues, isEnd, err := downloader.GetIssues(1, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, isEnd)
assertIssuesEqual(t, []*base.Issue{
{
@@ -107,7 +108,7 @@ func TestCodebaseDownloadRepo(t *testing.T) {
}, issues)
comments, _, err := downloader.GetComments(issues[0])
- assert.NoError(t, err)
+ require.NoError(t, err)
assertCommentsEqual(t, []*base.Comment{
{
IssueIndex: 2,
@@ -120,7 +121,7 @@ func TestCodebaseDownloadRepo(t *testing.T) {
}, comments)
prs, _, err := downloader.GetPullRequests(1, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assertPullRequestsEqual(t, []*base.PullRequest{
{
Number: 3,
@@ -145,6 +146,6 @@ func TestCodebaseDownloadRepo(t *testing.T) {
}, prs)
rvs, err := downloader.GetReviews(prs[0])
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, rvs)
}
diff --git a/services/migrations/gitea_downloader_test.go b/services/migrations/gitea_downloader_test.go
index c37c70947e..28a52c202d 100644
--- a/services/migrations/gitea_downloader_test.go
+++ b/services/migrations/gitea_downloader_test.go
@@ -14,6 +14,7 @@ import (
base "code.gitea.io/gitea/modules/migration"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGiteaDownloadRepo(t *testing.T) {
@@ -32,12 +33,10 @@ func TestGiteaDownloadRepo(t *testing.T) {
if downloader == nil {
t.Fatal("NewGitlabDownloader is nil")
}
- if !assert.NoError(t, err) {
- t.Fatal("NewGitlabDownloader error occur")
- }
+ require.NoError(t, err, "NewGitlabDownloader error occur")
repo, err := downloader.GetRepoInfo()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertRepositoryEqual(t, &base.Repository{
Name: "test_repo",
Owner: "gitea",
@@ -49,12 +48,12 @@ func TestGiteaDownloadRepo(t *testing.T) {
}, repo)
topics, err := downloader.GetTopics()
- assert.NoError(t, err)
+ require.NoError(t, err)
sort.Strings(topics)
assert.EqualValues(t, []string{"ci", "gitea", "migration", "test"}, topics)
labels, err := downloader.GetLabels()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertLabelsEqual(t, []*base.Label{
{
Name: "Bug",
@@ -84,7 +83,7 @@ func TestGiteaDownloadRepo(t *testing.T) {
}, labels)
milestones, err := downloader.GetMilestones()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertMilestonesEqual(t, []*base.Milestone{
{
Title: "V2 Finalize",
@@ -104,7 +103,7 @@ func TestGiteaDownloadRepo(t *testing.T) {
}, milestones)
releases, err := downloader.GetReleases()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReleasesEqual(t, []*base.Release{
{
Name: "Second Release",
@@ -135,13 +134,13 @@ func TestGiteaDownloadRepo(t *testing.T) {
}, releases)
issues, isEnd, err := downloader.GetIssues(1, 50)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, isEnd)
assert.Len(t, issues, 7)
assert.EqualValues(t, "open", issues[0].State)
issues, isEnd, err = downloader.GetIssues(3, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, isEnd)
assertIssuesEqual(t, []*base.Issue{
@@ -198,7 +197,7 @@ func TestGiteaDownloadRepo(t *testing.T) {
}, issues)
comments, _, err := downloader.GetComments(&base.Issue{Number: 4, ForeignIndex: 4})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertCommentsEqual(t, []*base.Comment{
{
IssueIndex: 4,
@@ -221,11 +220,11 @@ func TestGiteaDownloadRepo(t *testing.T) {
}, comments)
prs, isEnd, err := downloader.GetPullRequests(1, 50)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, isEnd)
assert.Len(t, prs, 6)
prs, isEnd, err = downloader.GetPullRequests(1, 3)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, isEnd)
assert.Len(t, prs, 3)
assertPullRequestEqual(t, &base.PullRequest{
@@ -263,7 +262,7 @@ func TestGiteaDownloadRepo(t *testing.T) {
}, prs[1])
reviews, err := downloader.GetReviews(&base.Issue{Number: 7, ForeignIndex: 7})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{
{
ID: 1770,
diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go
index 35da8290c8..ad193b2253 100644
--- a/services/migrations/gitea_uploader_test.go
+++ b/services/migrations/gitea_uploader_test.go
@@ -28,6 +28,7 @@ import (
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGiteaUploadRepo(t *testing.T) {
@@ -60,7 +61,7 @@ func TestGiteaUploadRepo(t *testing.T) {
Private: true,
Mirror: false,
}, nil)
- assert.NoError(t, err)
+ require.NoError(t, err)
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, Name: repoName})
assert.True(t, repo.HasWiki())
@@ -70,18 +71,18 @@ func TestGiteaUploadRepo(t *testing.T) {
RepoID: repo.ID,
IsClosed: optional.Some(false),
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, milestones, 1)
milestones, err = db.Find[issues_model.Milestone](db.DefaultContext, issues_model.FindMilestoneOptions{
RepoID: repo.ID,
IsClosed: optional.Some(true),
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, milestones)
labels, err := issues_model.GetLabelsByRepoID(ctx, repo.ID, "", db.ListOptions{})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, labels, 12)
releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{
@@ -92,7 +93,7 @@ func TestGiteaUploadRepo(t *testing.T) {
IncludeTags: true,
RepoID: repo.ID,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, releases, 8)
releases, err = db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{
@@ -103,7 +104,7 @@ func TestGiteaUploadRepo(t *testing.T) {
IncludeTags: false,
RepoID: repo.ID,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, releases, 1)
issues, err := issues_model.Issues(db.DefaultContext, &issues_model.IssuesOptions{
@@ -111,18 +112,18 @@ func TestGiteaUploadRepo(t *testing.T) {
IsPull: optional.Some(false),
SortType: "oldest",
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, issues, 15)
- assert.NoError(t, issues[0].LoadDiscussComments(db.DefaultContext))
+ require.NoError(t, issues[0].LoadDiscussComments(db.DefaultContext))
assert.Empty(t, issues[0].Comments)
pulls, _, err := issues_model.PullRequests(db.DefaultContext, repo.ID, &issues_model.PullRequestsOptions{
SortType: "oldest",
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, pulls, 30)
- assert.NoError(t, pulls[0].LoadIssue(db.DefaultContext))
- assert.NoError(t, pulls[0].Issue.LoadDiscussComments(db.DefaultContext))
+ require.NoError(t, pulls[0].LoadIssue(db.DefaultContext))
+ require.NoError(t, pulls[0].Issue.LoadDiscussComments(db.DefaultContext))
assert.Len(t, pulls[0].Issue.Comments, 2)
}
@@ -150,7 +151,7 @@ func TestGiteaUploadRemapLocalUser(t *testing.T) {
target := repo_model.Release{}
uploader.userMap = make(map[int64]int64)
err := uploader.remapUser(&source, &target)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, user_model.GhostUserID, target.GetUserID())
//
@@ -161,7 +162,7 @@ func TestGiteaUploadRemapLocalUser(t *testing.T) {
target = repo_model.Release{}
uploader.userMap = make(map[int64]int64)
err = uploader.remapUser(&source, &target)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, user_model.GhostUserID, target.GetUserID())
//
@@ -172,7 +173,7 @@ func TestGiteaUploadRemapLocalUser(t *testing.T) {
target = repo_model.Release{}
uploader.userMap = make(map[int64]int64)
err = uploader.remapUser(&source, &target)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, user.ID, target.GetUserID())
}
@@ -200,7 +201,7 @@ func TestGiteaUploadRemapExternalUser(t *testing.T) {
uploader.userMap = make(map[int64]int64)
target := repo_model.Release{}
err := uploader.remapUser(&source, &target)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, user_model.GhostUserID, target.GetUserID())
//
@@ -214,7 +215,7 @@ func TestGiteaUploadRemapExternalUser(t *testing.T) {
Provider: structs.GiteaService.Name(),
}
err = user_model.LinkExternalToUser(db.DefaultContext, linkedUser, externalLoginUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
//
// When a user is linked to the external ID, it becomes the author of
@@ -223,7 +224,7 @@ func TestGiteaUploadRemapExternalUser(t *testing.T) {
uploader.userMap = make(map[int64]int64)
target = repo_model.Release{}
err = uploader.remapUser(&source, &target)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, linkedUser.ID, target.GetUserID())
}
@@ -235,44 +236,44 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) {
//
fromRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
baseRef := "master"
- assert.NoError(t, git.InitRepository(git.DefaultContext, fromRepo.RepoPath(), false, fromRepo.ObjectFormatName))
+ require.NoError(t, git.InitRepository(git.DefaultContext, fromRepo.RepoPath(), false, fromRepo.ObjectFormatName))
err := git.NewCommand(git.DefaultContext, "symbolic-ref").AddDynamicArguments("HEAD", git.BranchPrefix+baseRef).Run(&git.RunOpts{Dir: fromRepo.RepoPath()})
- assert.NoError(t, err)
- assert.NoError(t, os.WriteFile(filepath.Join(fromRepo.RepoPath(), "README.md"), []byte(fmt.Sprintf("# Testing Repository\n\nOriginally created in: %s", fromRepo.RepoPath())), 0o644))
- assert.NoError(t, git.AddChanges(fromRepo.RepoPath(), true))
+ require.NoError(t, err)
+ require.NoError(t, os.WriteFile(filepath.Join(fromRepo.RepoPath(), "README.md"), []byte(fmt.Sprintf("# Testing Repository\n\nOriginally created in: %s", fromRepo.RepoPath())), 0o644))
+ require.NoError(t, git.AddChanges(fromRepo.RepoPath(), true))
signature := git.Signature{
Email: "test@example.com",
Name: "test",
When: time.Now(),
}
- assert.NoError(t, git.CommitChanges(fromRepo.RepoPath(), git.CommitChangesOptions{
+ require.NoError(t, git.CommitChanges(fromRepo.RepoPath(), git.CommitChangesOptions{
Committer: &signature,
Author: &signature,
Message: "Initial Commit",
}))
fromGitRepo, err := gitrepo.OpenRepository(git.DefaultContext, fromRepo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer fromGitRepo.Close()
baseSHA, err := fromGitRepo.GetBranchCommitID(baseRef)
- assert.NoError(t, err)
+ require.NoError(t, err)
//
// fromRepo branch1
//
headRef := "branch1"
_, _, err = git.NewCommand(git.DefaultContext, "checkout", "-b").AddDynamicArguments(headRef).RunStdString(&git.RunOpts{Dir: fromRepo.RepoPath()})
- assert.NoError(t, err)
- assert.NoError(t, os.WriteFile(filepath.Join(fromRepo.RepoPath(), "README.md"), []byte("SOMETHING"), 0o644))
- assert.NoError(t, git.AddChanges(fromRepo.RepoPath(), true))
+ require.NoError(t, err)
+ require.NoError(t, os.WriteFile(filepath.Join(fromRepo.RepoPath(), "README.md"), []byte("SOMETHING"), 0o644))
+ require.NoError(t, git.AddChanges(fromRepo.RepoPath(), true))
signature.When = time.Now()
- assert.NoError(t, git.CommitChanges(fromRepo.RepoPath(), git.CommitChangesOptions{
+ require.NoError(t, git.CommitChanges(fromRepo.RepoPath(), git.CommitChangesOptions{
Committer: &signature,
Author: &signature,
Message: "Pull request",
}))
- assert.NoError(t, err)
+ require.NoError(t, err)
headSHA, err := fromGitRepo.GetBranchCommitID(headRef)
- assert.NoError(t, err)
+ require.NoError(t, err)
fromRepoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: fromRepo.OwnerID})
@@ -281,28 +282,28 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) {
//
forkHeadRef := "branch2"
forkRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 8})
- assert.NoError(t, git.CloneWithArgs(git.DefaultContext, nil, fromRepo.RepoPath(), forkRepo.RepoPath(), git.CloneRepoOptions{
+ require.NoError(t, git.CloneWithArgs(git.DefaultContext, nil, fromRepo.RepoPath(), forkRepo.RepoPath(), git.CloneRepoOptions{
Branch: headRef,
}))
_, _, err = git.NewCommand(git.DefaultContext, "checkout", "-b").AddDynamicArguments(forkHeadRef).RunStdString(&git.RunOpts{Dir: forkRepo.RepoPath()})
- assert.NoError(t, err)
- assert.NoError(t, os.WriteFile(filepath.Join(forkRepo.RepoPath(), "README.md"), []byte(fmt.Sprintf("# branch2 %s", forkRepo.RepoPath())), 0o644))
- assert.NoError(t, git.AddChanges(forkRepo.RepoPath(), true))
- assert.NoError(t, git.CommitChanges(forkRepo.RepoPath(), git.CommitChangesOptions{
+ require.NoError(t, err)
+ require.NoError(t, os.WriteFile(filepath.Join(forkRepo.RepoPath(), "README.md"), []byte(fmt.Sprintf("# branch2 %s", forkRepo.RepoPath())), 0o644))
+ require.NoError(t, git.AddChanges(forkRepo.RepoPath(), true))
+ require.NoError(t, git.CommitChanges(forkRepo.RepoPath(), git.CommitChangesOptions{
Committer: &signature,
Author: &signature,
Message: "branch2 commit",
}))
forkGitRepo, err := gitrepo.OpenRepository(git.DefaultContext, forkRepo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer forkGitRepo.Close()
forkHeadSHA, err := forkGitRepo.GetBranchCommitID(forkHeadRef)
- assert.NoError(t, err)
+ require.NoError(t, err)
toRepoName := "migrated"
uploader := NewGiteaLocalUploader(context.Background(), fromRepoOwner, fromRepoOwner.Name, toRepoName)
uploader.gitServiceType = structs.GiteaService
- assert.NoError(t, uploader.CreateRepo(&base.Repository{
+ require.NoError(t, uploader.CreateRepo(&base.Repository{
Description: "description",
OriginalURL: fromRepo.RepoPath(),
CloneURL: fromRepo.RepoPath(),
@@ -503,7 +504,7 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) {
testCase.pr.EnsuredSafe = true
head, err := uploader.updateGitForPullRequest(&testCase.pr)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, testCase.head, head)
log.Info(stopMark)
diff --git a/services/migrations/github_test.go b/services/migrations/github_test.go
index 2b89e6dc0f..a2134f8bf2 100644
--- a/services/migrations/github_test.go
+++ b/services/migrations/github_test.go
@@ -13,6 +13,7 @@ import (
base "code.gitea.io/gitea/modules/migration"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGitHubDownloadRepo(t *testing.T) {
@@ -23,10 +24,10 @@ func TestGitHubDownloadRepo(t *testing.T) {
}
downloader := NewGithubDownloaderV3(context.Background(), "https://github.com", "", "", token, "go-gitea", "test_repo")
err := downloader.RefreshRate()
- assert.NoError(t, err)
+ require.NoError(t, err)
repo, err := downloader.GetRepoInfo()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertRepositoryEqual(t, &base.Repository{
Name: "test_repo",
Owner: "go-gitea",
@@ -37,11 +38,11 @@ func TestGitHubDownloadRepo(t *testing.T) {
}, repo)
topics, err := downloader.GetTopics()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Contains(t, topics, "gitea")
milestones, err := downloader.GetMilestones()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertMilestonesEqual(t, []*base.Milestone{
{
Title: "1.0.0",
@@ -64,7 +65,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
}, milestones)
labels, err := downloader.GetLabels()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertLabelsEqual(t, []*base.Label{
{
Name: "bug",
@@ -114,7 +115,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
}, labels)
releases, err := downloader.GetReleases()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReleasesEqual(t, []*base.Release{
{
TagName: "v0.9.99",
@@ -130,7 +131,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
// downloader.GetIssues()
issues, isEnd, err := downloader.GetIssues(1, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, isEnd)
assertIssuesEqual(t, []*base.Issue{
{
@@ -219,7 +220,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
// downloader.GetComments()
comments, _, err := downloader.GetComments(&base.Issue{Number: 2, ForeignIndex: 2})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertCommentsEqual(t, []*base.Comment{
{
IssueIndex: 2,
@@ -249,7 +250,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
// downloader.GetPullRequests()
prs, _, err := downloader.GetPullRequests(1, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assertPullRequestsEqual(t, []*base.PullRequest{
{
Number: 3,
@@ -339,7 +340,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
}, prs)
reviews, err := downloader.GetReviews(&base.PullRequest{Number: 3, ForeignIndex: 3})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{
{
ID: 315859956,
@@ -371,7 +372,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
}, reviews)
reviews, err = downloader.GetReviews(&base.PullRequest{Number: 4, ForeignIndex: 4})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{
{
ID: 338338740,
diff --git a/services/migrations/gitlab_test.go b/services/migrations/gitlab_test.go
index 6e5ab86720..0cae43d9b8 100644
--- a/services/migrations/gitlab_test.go
+++ b/services/migrations/gitlab_test.go
@@ -18,6 +18,7 @@ import (
base "code.gitea.io/gitea/modules/migration"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
"github.com/xanzy/go-gitlab"
)
@@ -35,7 +36,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
t.Fatalf("NewGitlabDownloader is nil: %v", err)
}
repo, err := downloader.GetRepoInfo()
- assert.NoError(t, err)
+ require.NoError(t, err)
// Repo Owner is blank in Gitlab Group repos
assertRepositoryEqual(t, &base.Repository{
Name: "test_repo",
@@ -47,12 +48,12 @@ func TestGitlabDownloadRepo(t *testing.T) {
}, repo)
topics, err := downloader.GetTopics()
- assert.NoError(t, err)
- assert.True(t, len(topics) == 2)
+ require.NoError(t, err)
+ assert.Len(t, topics, 2)
assert.EqualValues(t, []string{"migration", "test"}, topics)
milestones, err := downloader.GetMilestones()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertMilestonesEqual(t, []*base.Milestone{
{
Title: "1.1.0",
@@ -70,7 +71,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
}, milestones)
labels, err := downloader.GetLabels()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertLabelsEqual(t, []*base.Label{
{
Name: "bug",
@@ -111,7 +112,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
}, labels)
releases, err := downloader.GetReleases()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReleasesEqual(t, []*base.Release{
{
TagName: "v0.9.99",
@@ -125,7 +126,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
}, releases)
issues, isEnd, err := downloader.GetIssues(1, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, isEnd)
assertIssuesEqual(t, []*base.Issue{
@@ -217,7 +218,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
ForeignIndex: 2,
Context: gitlabIssueContext{IsMergeRequest: false},
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertCommentsEqual(t, []*base.Comment{
{
IssueIndex: 2,
@@ -254,7 +255,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
}, comments)
prs, _, err := downloader.GetPullRequests(1, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assertPullRequestsEqual(t, []*base.PullRequest{
{
Number: 4,
@@ -303,7 +304,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
}, prs)
rvs, err := downloader.GetReviews(&base.PullRequest{Number: 1, ForeignIndex: 1})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{
{
IssueIndex: 1,
@@ -322,7 +323,7 @@ func TestGitlabDownloadRepo(t *testing.T) {
}, rvs)
rvs, err = downloader.GetReviews(&base.PullRequest{Number: 2, ForeignIndex: 2})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{
{
IssueIndex: 2,
@@ -348,7 +349,7 @@ func TestGitlabSkippedIssueNumber(t *testing.T) {
t.Fatalf("NewGitlabDownloader is nil: %v", err)
}
repo, err := downloader.GetRepoInfo()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertRepositoryEqual(t, &base.Repository{
Name: "archbuild",
Owner: "troyengel",
@@ -359,20 +360,20 @@ func TestGitlabSkippedIssueNumber(t *testing.T) {
}, repo)
issues, isEnd, err := downloader.GetIssues(1, 10)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, isEnd)
// the only issue in this repository has number 2
- assert.EqualValues(t, 1, len(issues))
+ assert.Len(t, issues, 1)
assert.EqualValues(t, 2, issues[0].Number)
assert.EqualValues(t, "vpn unlimited errors", issues[0].Title)
prs, _, err := downloader.GetPullRequests(1, 10)
- assert.NoError(t, err)
+ require.NoError(t, err)
// the only merge request in this repository has number 1,
// but we offset it by the maximum issue number so it becomes
// pull request 3 in Forgejo
- assert.EqualValues(t, 1, len(prs))
+ assert.Len(t, prs, 1)
assert.EqualValues(t, 3, prs[0].Number)
assert.EqualValues(t, "Review", prs[0].Title)
}
@@ -507,7 +508,7 @@ func TestGitlabGetReviews(t *testing.T) {
id := int64(testCase.prID)
rvs, err := downloader.GetReviews(&base.Issue{Number: id, ForeignIndex: id})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{&review}, rvs)
}
}
@@ -541,7 +542,7 @@ func TestAwardsToReactions(t *testing.T) {
]
`
var awards []*gitlab.AwardEmoji
- assert.NoError(t, json.Unmarshal([]byte(testResponse), &awards))
+ require.NoError(t, json.Unmarshal([]byte(testResponse), &awards))
reactions := downloader.awardsToReactions(awards)
assert.EqualValues(t, []*base.Reaction{
diff --git a/services/migrations/gogs_test.go b/services/migrations/gogs_test.go
index ca02b4317b..6c511a2bb5 100644
--- a/services/migrations/gogs_test.go
+++ b/services/migrations/gogs_test.go
@@ -13,6 +13,7 @@ import (
base "code.gitea.io/gitea/modules/migration"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGogsDownloadRepo(t *testing.T) {
@@ -31,7 +32,7 @@ func TestGogsDownloadRepo(t *testing.T) {
downloader := NewGogsDownloader(context.Background(), "https://try.gogs.io", "", "", gogsPersonalAccessToken, "lunnytest", "TESTREPO")
repo, err := downloader.GetRepoInfo()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertRepositoryEqual(t, &base.Repository{
Name: "TESTREPO",
@@ -43,7 +44,7 @@ func TestGogsDownloadRepo(t *testing.T) {
}, repo)
milestones, err := downloader.GetMilestones()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertMilestonesEqual(t, []*base.Milestone{
{
Title: "1.0",
@@ -52,7 +53,7 @@ func TestGogsDownloadRepo(t *testing.T) {
}, milestones)
labels, err := downloader.GetLabels()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertLabelsEqual(t, []*base.Label{
{
Name: "bug",
@@ -86,7 +87,7 @@ func TestGogsDownloadRepo(t *testing.T) {
// downloader.GetIssues()
issues, isEnd, err := downloader.GetIssues(1, 8)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, isEnd)
assertIssuesEqual(t, []*base.Issue{
{
@@ -111,7 +112,7 @@ func TestGogsDownloadRepo(t *testing.T) {
// downloader.GetComments()
comments, _, err := downloader.GetComments(&base.Issue{Number: 1, ForeignIndex: 1})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertCommentsEqual(t, []*base.Comment{
{
IssueIndex: 1,
@@ -135,7 +136,7 @@ func TestGogsDownloadRepo(t *testing.T) {
// downloader.GetPullRequests()
_, _, err = downloader.GetPullRequests(1, 3)
- assert.Error(t, err)
+ require.Error(t, err)
}
func TestGogsDownloaderFactory_New(t *testing.T) {
diff --git a/services/migrations/migrate_test.go b/services/migrations/migrate_test.go
index 03efa6185b..109a092796 100644
--- a/services/migrations/migrate_test.go
+++ b/services/migrations/migrate_test.go
@@ -12,65 +12,65 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMigrateWhiteBlocklist(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
adminUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"})
nonAdminUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user2"})
setting.Migrations.AllowedDomains = "github.com"
setting.Migrations.AllowLocalNetworks = false
- assert.NoError(t, Init())
+ require.NoError(t, Init())
err := IsMigrateURLAllowed("https://gitlab.com/gitlab/gitlab.git", nonAdminUser)
- assert.Error(t, err)
+ require.Error(t, err)
err = IsMigrateURLAllowed("https://github.com/go-gitea/gitea.git", nonAdminUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = IsMigrateURLAllowed("https://gITHUb.com/go-gitea/gitea.git", nonAdminUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
setting.Migrations.AllowedDomains = ""
setting.Migrations.BlockedDomains = "github.com"
- assert.NoError(t, Init())
+ require.NoError(t, Init())
err = IsMigrateURLAllowed("https://gitlab.com/gitlab/gitlab.git", nonAdminUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = IsMigrateURLAllowed("https://github.com/go-gitea/gitea.git", nonAdminUser)
- assert.Error(t, err)
+ require.Error(t, err)
err = IsMigrateURLAllowed("https://10.0.0.1/go-gitea/gitea.git", nonAdminUser)
- assert.Error(t, err)
+ require.Error(t, err)
setting.Migrations.AllowLocalNetworks = true
- assert.NoError(t, Init())
+ require.NoError(t, Init())
err = IsMigrateURLAllowed("https://10.0.0.1/go-gitea/gitea.git", nonAdminUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
old := setting.ImportLocalPaths
setting.ImportLocalPaths = false
err = IsMigrateURLAllowed("/home/foo/bar/goo", adminUser)
- assert.Error(t, err)
+ require.Error(t, err)
setting.ImportLocalPaths = true
abs, err := filepath.Abs(".")
- assert.NoError(t, err)
+ require.NoError(t, err)
err = IsMigrateURLAllowed(abs, adminUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = IsMigrateURLAllowed(abs, nonAdminUser)
- assert.Error(t, err)
+ require.Error(t, err)
nonAdminUser.AllowImportLocal = true
err = IsMigrateURLAllowed(abs, nonAdminUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
setting.ImportLocalPaths = old
}
@@ -80,35 +80,35 @@ func TestAllowBlockList(t *testing.T) {
setting.Migrations.AllowedDomains = allow
setting.Migrations.BlockedDomains = block
setting.Migrations.AllowLocalNetworks = local
- assert.NoError(t, Init())
+ require.NoError(t, Init())
}
// default, allow all external, block none, no local networks
init("", "", false)
- assert.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
- assert.Error(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
+ require.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
+ require.Error(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
// allow all including local networks (it could lead to SSRF in production)
init("", "", true)
- assert.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
- assert.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
+ require.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
+ require.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
// allow wildcard, block some subdomains. if the domain name is allowed, then the local network check is skipped
init("*.domain.com", "blocked.domain.com", false)
- assert.NoError(t, checkByAllowBlockList("sub.domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
- assert.NoError(t, checkByAllowBlockList("sub.domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
- assert.Error(t, checkByAllowBlockList("blocked.domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
- assert.Error(t, checkByAllowBlockList("sub.other.com", []net.IP{net.ParseIP("1.2.3.4")}))
+ require.NoError(t, checkByAllowBlockList("sub.domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
+ require.NoError(t, checkByAllowBlockList("sub.domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
+ require.Error(t, checkByAllowBlockList("blocked.domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
+ require.Error(t, checkByAllowBlockList("sub.other.com", []net.IP{net.ParseIP("1.2.3.4")}))
// allow wildcard (it could lead to SSRF in production)
init("*", "", false)
- assert.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
- assert.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
+ require.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
+ require.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
// local network can still be blocked
init("*", "127.0.0.*", false)
- assert.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
- assert.Error(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
+ require.NoError(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("1.2.3.4")}))
+ require.Error(t, checkByAllowBlockList("domain.com", []net.IP{net.ParseIP("127.0.0.1")}))
// reset
init("", "", false)
diff --git a/services/migrations/onedev_test.go b/services/migrations/onedev_test.go
index 48412fec64..80c26130cc 100644
--- a/services/migrations/onedev_test.go
+++ b/services/migrations/onedev_test.go
@@ -13,6 +13,7 @@ import (
base "code.gitea.io/gitea/modules/migration"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestOneDevDownloadRepo(t *testing.T) {
@@ -27,7 +28,7 @@ func TestOneDevDownloadRepo(t *testing.T) {
t.Fatalf("NewOneDevDownloader is nil: %v", err)
}
repo, err := downloader.GetRepoInfo()
- assert.NoError(t, err)
+ require.NoError(t, err)
assertRepositoryEqual(t, &base.Repository{
Name: "go-gitea-test_repo",
Owner: "",
@@ -37,7 +38,7 @@ func TestOneDevDownloadRepo(t *testing.T) {
}, repo)
milestones, err := downloader.GetMilestones()
- assert.NoError(t, err)
+ require.NoError(t, err)
deadline := time.Unix(1620086400, 0)
assertMilestonesEqual(t, []*base.Milestone{
{
@@ -52,11 +53,11 @@ func TestOneDevDownloadRepo(t *testing.T) {
}, milestones)
labels, err := downloader.GetLabels()
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, labels, 6)
issues, isEnd, err := downloader.GetIssues(1, 2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, isEnd)
assertIssuesEqual(t, []*base.Issue{
{
@@ -99,7 +100,7 @@ func TestOneDevDownloadRepo(t *testing.T) {
ForeignIndex: 398,
Context: onedevIssueContext{IsPullRequest: false},
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertCommentsEqual(t, []*base.Comment{
{
IssueIndex: 4,
@@ -111,7 +112,7 @@ func TestOneDevDownloadRepo(t *testing.T) {
}, comments)
prs, _, err := downloader.GetPullRequests(1, 1)
- assert.NoError(t, err)
+ require.NoError(t, err)
assertPullRequestsEqual(t, []*base.PullRequest{
{
Number: 5,
@@ -137,7 +138,7 @@ func TestOneDevDownloadRepo(t *testing.T) {
}, prs)
rvs, err := downloader.GetReviews(&base.PullRequest{Number: 5, ForeignIndex: 186})
- assert.NoError(t, err)
+ require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{
{
IssueIndex: 5,
diff --git a/services/org/org_test.go b/services/org/org_test.go
index e7d2a18ea9..07358438f6 100644
--- a/services/org/org_test.go
+++ b/services/org/org_test.go
@@ -13,6 +13,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -20,19 +21,19 @@ func TestMain(m *testing.M) {
}
func TestDeleteOrganization(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 6})
- assert.NoError(t, DeleteOrganization(db.DefaultContext, org, false))
+ require.NoError(t, DeleteOrganization(db.DefaultContext, org, false))
unittest.AssertNotExistsBean(t, &organization.Organization{ID: 6})
unittest.AssertNotExistsBean(t, &organization.OrgUser{OrgID: 6})
unittest.AssertNotExistsBean(t, &organization.Team{OrgID: 6})
org = unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
err := DeleteOrganization(db.DefaultContext, org, false)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, models.IsErrUserOwnRepos(err))
user := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 5})
- assert.Error(t, DeleteOrganization(db.DefaultContext, user, false))
+ require.Error(t, DeleteOrganization(db.DefaultContext, user, false))
unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{})
}
diff --git a/services/org/repo_test.go b/services/org/repo_test.go
index 68c64a01ab..2ddb8f9045 100644
--- a/services/org/repo_test.go
+++ b/services/org/repo_test.go
@@ -11,16 +11,16 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestTeam_AddRepository(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
testSuccess := func(teamID, repoID int64) {
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID})
- assert.NoError(t, TeamAddRepository(db.DefaultContext, team, repo))
+ require.NoError(t, TeamAddRepository(db.DefaultContext, team, repo))
unittest.AssertExistsAndLoadBean(t, &organization.TeamRepo{TeamID: teamID, RepoID: repoID})
unittest.CheckConsistencyFor(t, &organization.Team{ID: teamID}, &repo_model.Repository{ID: repoID})
}
@@ -29,6 +29,6 @@ func TestTeam_AddRepository(t *testing.T) {
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
- assert.Error(t, TeamAddRepository(db.DefaultContext, team, repo))
+ require.Error(t, TeamAddRepository(db.DefaultContext, team, repo))
unittest.CheckConsistencyFor(t, &organization.Team{ID: 1}, &repo_model.Repository{ID: 1})
}
diff --git a/services/pull/check_test.go b/services/pull/check_test.go
index dcf5f7b93a..b99cf01ee1 100644
--- a/services/pull/check_test.go
+++ b/services/pull/check_test.go
@@ -17,10 +17,11 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestPullRequest_AddToTaskQueue(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
idChan := make(chan int64, 10)
testHandler := func(items ...string) []string {
@@ -32,9 +33,9 @@ func TestPullRequest_AddToTaskQueue(t *testing.T) {
}
cfg, err := setting.GetQueueSettings(setting.CfgProvider, "pr_patch_checker")
- assert.NoError(t, err)
+ require.NoError(t, err)
prPatchCheckerQueue, err = queue.NewWorkerPoolQueueWithContext(context.Background(), "pr_patch_checker", cfg, testHandler, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
AddToTaskQueue(db.DefaultContext, pr)
@@ -46,7 +47,7 @@ func TestPullRequest_AddToTaskQueue(t *testing.T) {
has, err := prPatchCheckerQueue.Has(strconv.FormatInt(pr.ID, 10))
assert.True(t, has)
- assert.NoError(t, err)
+ require.NoError(t, err)
go prPatchCheckerQueue.Run()
@@ -59,7 +60,7 @@ func TestPullRequest_AddToTaskQueue(t *testing.T) {
has, err = prPatchCheckerQueue.Has(strconv.FormatInt(pr.ID, 10))
assert.False(t, has)
- assert.NoError(t, err)
+ require.NoError(t, err)
pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
assert.Equal(t, issues_model.PullRequestStatusChecking, pr.Status)
diff --git a/services/pull/merge.go b/services/pull/merge.go
index 75b22e00b3..57f3b1e377 100644
--- a/services/pull/merge.go
+++ b/services/pull/merge.go
@@ -7,6 +7,7 @@ package pull
import (
"context"
"fmt"
+ "net/url"
"os"
"path/filepath"
"regexp"
@@ -56,7 +57,11 @@ func getMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issue
issueReference = "!"
}
- reviewedOn := fmt.Sprintf("Reviewed-on: %s/%s", setting.AppURL, pr.Issue.Link())
+ issueURL, err := url.JoinPath(setting.AppURL, pr.Issue.Link())
+ if err != nil {
+ return "", "", err
+ }
+ reviewedOn := fmt.Sprintf("Reviewed-on: %s", issueURL)
reviewedBy := pr.GetApprovers(ctx)
if mergeStyle != "" {
diff --git a/services/pull/pull_test.go b/services/pull/pull_test.go
index 787910bf76..c51619e7f6 100644
--- a/services/pull/pull_test.go
+++ b/services/pull/pull_test.go
@@ -16,6 +16,7 @@ import (
"code.gitea.io/gitea/modules/gitrepo"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
// TODO TestPullRequest_PushToBaseRepo
@@ -38,27 +39,28 @@ func TestPullRequest_CommitMessageTrailersPattern(t *testing.T) {
}
func TestPullRequest_GetDefaultMergeMessage_InternalTracker(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
- assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
+ require.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, pr.BaseRepo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer gitRepo.Close()
- mergeMessage, _, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
- assert.NoError(t, err)
+ mergeMessage, body, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
+ require.NoError(t, err)
assert.Equal(t, "Merge pull request 'issue3' (#3) from branch2 into master", mergeMessage)
+ assert.Equal(t, "Reviewed-on: https://try.gitea.io/user2/repo1/pulls/3\n", body)
pr.BaseRepoID = 1
pr.HeadRepoID = 2
mergeMessage, _, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "Merge pull request 'issue3' (#3) from user2/repo1:branch2 into master", mergeMessage)
}
func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
externalTracker := repo_model.RepoUnit{
Type: unit.TypeExternalTracker,
@@ -71,13 +73,13 @@ func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) {
pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2, BaseRepo: baseRepo})
- assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
+ require.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, pr.BaseRepo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer gitRepo.Close()
mergeMessage, _, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "Merge pull request 'issue3' (!3) from branch2 into master", mergeMessage)
@@ -86,7 +88,7 @@ func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) {
pr.BaseRepo = nil
pr.HeadRepo = nil
mergeMessage, _, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "Merge pull request 'issue3' (#3) from user2/repo2:branch2 into master", mergeMessage)
}
diff --git a/services/pull/review_test.go b/services/pull/review_test.go
index 3bce1e523d..4cb3ad007c 100644
--- a/services/pull/review_test.go
+++ b/services/pull/review_test.go
@@ -13,15 +13,16 @@ import (
pull_service "code.gitea.io/gitea/services/pull"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestDismissReview(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
pull := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{})
- assert.NoError(t, pull.LoadIssue(db.DefaultContext))
+ require.NoError(t, pull.LoadIssue(db.DefaultContext))
issue := pull.Issue
- assert.NoError(t, issue.LoadRepo(db.DefaultContext))
+ require.NoError(t, issue.LoadRepo(db.DefaultContext))
reviewer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
review, err := issues_model.CreateReview(db.DefaultContext, issues_model.CreateReviewOptions{
Issue: issue,
@@ -29,20 +30,20 @@ func TestDismissReview(t *testing.T) {
Type: issues_model.ReviewTypeReject,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
issue.IsClosed = true
pull.HasMerged = false
- assert.NoError(t, issues_model.UpdateIssueCols(db.DefaultContext, issue, "is_closed"))
- assert.NoError(t, pull.UpdateCols(db.DefaultContext, "has_merged"))
+ require.NoError(t, issues_model.UpdateIssueCols(db.DefaultContext, issue, "is_closed"))
+ require.NoError(t, pull.UpdateCols(db.DefaultContext, "has_merged"))
_, err = pull_service.DismissReview(db.DefaultContext, review.ID, issue.RepoID, "", &user_model.User{}, false, false)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, pull_service.IsErrDismissRequestOnClosedPR(err))
pull.HasMerged = true
pull.Issue.IsClosed = false
- assert.NoError(t, issues_model.UpdateIssueCols(db.DefaultContext, issue, "is_closed"))
- assert.NoError(t, pull.UpdateCols(db.DefaultContext, "has_merged"))
+ require.NoError(t, issues_model.UpdateIssueCols(db.DefaultContext, issue, "is_closed"))
+ require.NoError(t, pull.UpdateCols(db.DefaultContext, "has_merged"))
_, err = pull_service.DismissReview(db.DefaultContext, review.ID, issue.RepoID, "", &user_model.User{}, false, false)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, pull_service.IsErrDismissRequestOnClosedPR(err))
}
diff --git a/services/release/release_test.go b/services/release/release_test.go
index eac1879f87..aa22cbbd7b 100644
--- a/services/release/release_test.go
+++ b/services/release/release_test.go
@@ -19,6 +19,7 @@ import (
_ "code.gitea.io/gitea/models/actions"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -26,16 +27,16 @@ func TestMain(m *testing.M) {
}
func TestRelease_Create(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer gitRepo.Close()
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -49,7 +50,7 @@ func TestRelease_Create(t *testing.T) {
IsTag: false,
}, nil, ""))
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -63,7 +64,7 @@ func TestRelease_Create(t *testing.T) {
IsTag: false,
}, nil, ""))
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -77,7 +78,7 @@ func TestRelease_Create(t *testing.T) {
IsTag: false,
}, nil, ""))
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -91,7 +92,7 @@ func TestRelease_Create(t *testing.T) {
IsTag: false,
}, nil, ""))
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -112,7 +113,7 @@ func TestRelease_Create(t *testing.T) {
UploaderID: user.ID,
Name: "test.txt",
}, strings.NewReader(testPlayload), int64(len([]byte(testPlayload))))
- assert.NoError(t, err)
+ require.NoError(t, err)
release := repo_model.Release{
RepoID: repo.ID,
@@ -127,21 +128,21 @@ func TestRelease_Create(t *testing.T) {
IsPrerelease: false,
IsTag: true,
}
- assert.NoError(t, CreateRelease(gitRepo, &release, []string{attach.UUID}, "test"))
+ require.NoError(t, CreateRelease(gitRepo, &release, []string{attach.UUID}, "test"))
}
func TestRelease_Update(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer gitRepo.Close()
// Test a changed release
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -155,17 +156,17 @@ func TestRelease_Update(t *testing.T) {
IsTag: false,
}, nil, ""))
release, err := repo_model.GetRelease(db.DefaultContext, repo.ID, "v1.1.1")
- assert.NoError(t, err)
+ require.NoError(t, err)
releaseCreatedUnix := release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Note = "Changed note"
- assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
+ require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
// Test a changed draft
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -179,17 +180,17 @@ func TestRelease_Update(t *testing.T) {
IsTag: false,
}, nil, ""))
release, err = repo_model.GetRelease(db.DefaultContext, repo.ID, "v1.2.1")
- assert.NoError(t, err)
+ require.NoError(t, err)
releaseCreatedUnix = release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Title = "Changed title"
- assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
+ require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
// Test a changed pre-release
- assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
+ require.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
RepoID: repo.ID,
Repo: repo,
PublisherID: user.ID,
@@ -203,14 +204,14 @@ func TestRelease_Update(t *testing.T) {
IsTag: false,
}, nil, ""))
release, err = repo_model.GetRelease(db.DefaultContext, repo.ID, "v1.3.1")
- assert.NoError(t, err)
+ require.NoError(t, err)
releaseCreatedUnix = release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Title = "Changed title"
release.Note = "Changed note"
- assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
+ require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
// Test create release
@@ -227,15 +228,15 @@ func TestRelease_Update(t *testing.T) {
IsPrerelease: false,
IsTag: false,
}
- assert.NoError(t, CreateRelease(gitRepo, release, nil, ""))
+ require.NoError(t, CreateRelease(gitRepo, release, nil, ""))
assert.Greater(t, release.ID, int64(0))
release.IsDraft = false
tagName := release.TagName
- assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
+ require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false))
release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, tagName, release.TagName)
// Add new attachments
@@ -245,41 +246,41 @@ func TestRelease_Update(t *testing.T) {
UploaderID: user.ID,
Name: "test.txt",
}, strings.NewReader(samplePayload), int64(len([]byte(samplePayload))))
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, []string{attach.UUID}, nil, nil, false))
- assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
+ require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, []string{attach.UUID}, nil, nil, false))
+ require.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
assert.Len(t, release.Attachments, 1)
assert.EqualValues(t, attach.UUID, release.Attachments[0].UUID)
assert.EqualValues(t, release.ID, release.Attachments[0].ReleaseID)
assert.EqualValues(t, attach.Name, release.Attachments[0].Name)
// update the attachment name
- assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, map[string]string{
+ require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, map[string]string{
attach.UUID: "test2.txt",
}, false))
release.Attachments = nil
- assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
+ require.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
assert.Len(t, release.Attachments, 1)
assert.EqualValues(t, attach.UUID, release.Attachments[0].UUID)
assert.EqualValues(t, release.ID, release.Attachments[0].ReleaseID)
assert.EqualValues(t, "test2.txt", release.Attachments[0].Name)
// delete the attachment
- assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, []string{attach.UUID}, nil, false))
+ require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, []string{attach.UUID}, nil, false))
release.Attachments = nil
- assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
+ require.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
assert.Empty(t, release.Attachments)
}
func TestRelease_createTag(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
defer gitRepo.Close()
// Test a changed release
@@ -297,13 +298,13 @@ func TestRelease_createTag(t *testing.T) {
IsTag: false,
}
_, err = createTag(db.DefaultContext, gitRepo, release, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEmpty(t, release.CreatedUnix)
releaseCreatedUnix := release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Note = "Changed note"
_, err = createTag(db.DefaultContext, gitRepo, release, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
// Test a changed draft
@@ -321,12 +322,12 @@ func TestRelease_createTag(t *testing.T) {
IsTag: false,
}
_, err = createTag(db.DefaultContext, gitRepo, release, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
releaseCreatedUnix = release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Title = "Changed title"
_, err = createTag(db.DefaultContext, gitRepo, release, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
// Test a changed pre-release
@@ -344,21 +345,21 @@ func TestRelease_createTag(t *testing.T) {
IsTag: false,
}
_, err = createTag(db.DefaultContext, gitRepo, release, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
releaseCreatedUnix = release.CreatedUnix
time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
release.Title = "Changed title"
release.Note = "Changed note"
_, err = createTag(db.DefaultContext, gitRepo, release, "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
}
func TestCreateNewTag(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
- assert.NoError(t, CreateNewTag(git.DefaultContext, user, repo, "master", "v2.0",
+ require.NoError(t, CreateNewTag(git.DefaultContext, user, repo, "master", "v2.0",
"v2.0 is released \n\n BUGFIX: .... \n\n 123"))
}
diff --git a/services/repository/adopt_test.go b/services/repository/adopt_test.go
index 454d9a76b9..71fb1fc885 100644
--- a/services/repository/adopt_test.go
+++ b/services/repository/adopt_test.go
@@ -37,13 +37,13 @@ func TestCheckUnadoptedRepositories_Add(t *testing.T) {
}
func TestCheckUnadoptedRepositories(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
//
// Non existent user
//
unadopted := &unadoptedRepositories{start: 0, end: 100}
err := checkUnadoptedRepositories(db.DefaultContext, "notauser", []string{"repo"}, unadopted)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, unadopted.repositories)
//
// Unadopted repository is returned
@@ -54,20 +54,20 @@ func TestCheckUnadoptedRepositories(t *testing.T) {
unadoptedRepoName := "unadopted"
unadopted = &unadoptedRepositories{start: 0, end: 100}
err = checkUnadoptedRepositories(db.DefaultContext, userName, []string{repoName, unadoptedRepoName}, unadopted)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, []string{path.Join(userName, unadoptedRepoName)}, unadopted.repositories)
//
// Existing (adopted) repository is not returned
//
unadopted = &unadoptedRepositories{start: 0, end: 100}
err = checkUnadoptedRepositories(db.DefaultContext, userName, []string{repoName}, unadopted)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, unadopted.repositories)
assert.Equal(t, 0, unadopted.index)
}
func TestListUnadoptedRepositories_ListOptions(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
username := "user2"
unadoptedList := []string{path.Join(username, "unadopted1"), path.Join(username, "unadopted2")}
for _, unadopted := range unadoptedList {
@@ -76,23 +76,23 @@ func TestListUnadoptedRepositories_ListOptions(t *testing.T) {
opts := db.ListOptions{Page: 1, PageSize: 1}
repoNames, count, err := ListUnadoptedRepositories(db.DefaultContext, "", &opts)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, 2, count)
assert.Equal(t, unadoptedList[0], repoNames[0])
opts = db.ListOptions{Page: 2, PageSize: 1}
repoNames, count, err = ListUnadoptedRepositories(db.DefaultContext, "", &opts)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, 2, count)
assert.Equal(t, unadoptedList[1], repoNames[0])
}
func TestAdoptRepository(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
username := "user2"
unadopted := "unadopted"
- assert.NoError(t, unittest.CopyDir(
+ require.NoError(t, unittest.CopyDir(
"../../modules/git/tests/repos/repo1_bare",
path.Join(setting.RepoRootPath, username, unadopted+".git"),
))
@@ -110,6 +110,6 @@ func TestAdoptRepository(t *testing.T) {
IsPrivate: false,
AutoInit: true,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, git.Sha1ObjectFormat.Name(), repo.ObjectFormatName)
}
diff --git a/services/repository/archiver/archiver_test.go b/services/repository/archiver/archiver_test.go
index dbd4d9b3c7..9f822a31ce 100644
--- a/services/repository/archiver/archiver_test.go
+++ b/services/repository/archiver/archiver_test.go
@@ -4,7 +4,6 @@
package archiver
import (
- "errors"
"testing"
"time"
@@ -15,6 +14,7 @@ import (
_ "code.gitea.io/gitea/models/actions"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -22,7 +22,7 @@ func TestMain(m *testing.M) {
}
func TestArchive_Basic(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
ctx, _ := contexttest.MockContext(t, "user27/repo49")
firstCommit, secondCommit := "51f84af23134", "aacbdfe9e1c4"
@@ -32,47 +32,47 @@ func TestArchive_Basic(t *testing.T) {
defer ctx.Repo.GitRepo.Close()
bogusReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, bogusReq)
assert.EqualValues(t, firstCommit+".zip", bogusReq.GetArchiveName())
// Check a series of bogus requests.
// Step 1, valid commit with a bad extension.
bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".dilbert")
- assert.Error(t, err)
+ require.Error(t, err)
assert.Nil(t, bogusReq)
// Step 2, missing commit.
bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "dbffff.zip")
- assert.Error(t, err)
+ require.Error(t, err)
assert.Nil(t, bogusReq)
// Step 3, doesn't look like branch/tag/commit.
bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "db.zip")
- assert.Error(t, err)
+ require.Error(t, err)
assert.Nil(t, bogusReq)
bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "master.zip")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, bogusReq)
assert.EqualValues(t, "master.zip", bogusReq.GetArchiveName())
bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "test/archive.zip")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, bogusReq)
assert.EqualValues(t, "test-archive.zip", bogusReq.GetArchiveName())
// Now two valid requests, firstCommit with valid extensions.
zipReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, zipReq)
tgzReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".tar.gz")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, tgzReq)
secondReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, secondCommit+".zip")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, secondReq)
inFlight := make([]*ArchiveRequest, 3)
@@ -92,7 +92,7 @@ func TestArchive_Basic(t *testing.T) {
time.Sleep(2 * time.Second)
zipReq2, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip")
- assert.NoError(t, err)
+ require.NoError(t, err)
// This zipReq should match what's sitting in the queue, as we haven't
// let it release yet. From the consumer's point of view, this looks like
// a long-running archive task.
@@ -107,12 +107,12 @@ func TestArchive_Basic(t *testing.T) {
// after we release it. We should trigger both the timeout and non-timeout
// cases.
timedReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, secondCommit+".tar.gz")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, timedReq)
ArchiveRepository(db.DefaultContext, timedReq)
zipReq2, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip")
- assert.NoError(t, err)
+ require.NoError(t, err)
// Now, we're guaranteed to have released the original zipReq from the queue.
// Ensure that we don't get handed back the released entry somehow, but they
// should remain functionally equivalent in all fields. The exception here
@@ -120,7 +120,7 @@ func TestArchive_Basic(t *testing.T) {
// It's fine to go ahead and set it to nil now.
assert.Equal(t, zipReq, zipReq2)
- assert.False(t, zipReq == zipReq2)
+ assert.NotSame(t, zipReq, zipReq2)
// Same commit, different compression formats should have different names.
// Ideally, the extension would match what we originally requested.
@@ -130,5 +130,5 @@ func TestArchive_Basic(t *testing.T) {
func TestErrUnknownArchiveFormat(t *testing.T) {
err := ErrUnknownArchiveFormat{RequestFormat: "master"}
- assert.True(t, errors.Is(err, ErrUnknownArchiveFormat{}))
+ assert.ErrorIs(t, err, ErrUnknownArchiveFormat{})
}
diff --git a/services/repository/avatar_test.go b/services/repository/avatar_test.go
index 4a0ba61853..f0fe991de8 100644
--- a/services/repository/avatar_test.go
+++ b/services/repository/avatar_test.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/avatar"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestUploadAvatar(t *testing.T) {
@@ -23,11 +24,11 @@ func TestUploadAvatar(t *testing.T) {
var buff bytes.Buffer
png.Encode(&buff, myImage)
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
err := UploadAvatar(db.DefaultContext, repo, buff.Bytes())
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, avatar.HashAvatar(10, buff.Bytes()), repo.Avatar)
}
@@ -37,11 +38,11 @@ func TestUploadBigAvatar(t *testing.T) {
var buff bytes.Buffer
png.Encode(&buff, myImage)
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
err := UploadAvatar(db.DefaultContext, repo, buff.Bytes())
- assert.Error(t, err)
+ require.Error(t, err)
}
func TestDeleteAvatar(t *testing.T) {
@@ -50,14 +51,14 @@ func TestDeleteAvatar(t *testing.T) {
var buff bytes.Buffer
png.Encode(&buff, myImage)
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
err := UploadAvatar(db.DefaultContext, repo, buff.Bytes())
- assert.NoError(t, err)
+ require.NoError(t, err)
err = DeleteAvatar(db.DefaultContext, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "", repo.Avatar)
}
diff --git a/services/repository/collaboration_test.go b/services/repository/collaboration_test.go
index c3d006bfd8..c087018be4 100644
--- a/services/repository/collaboration_test.go
+++ b/services/repository/collaboration_test.go
@@ -10,18 +10,18 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRepository_DeleteCollaboration(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
- assert.NoError(t, repo.LoadOwner(db.DefaultContext))
- assert.NoError(t, DeleteCollaboration(db.DefaultContext, repo, 4))
+ require.NoError(t, repo.LoadOwner(db.DefaultContext))
+ require.NoError(t, DeleteCollaboration(db.DefaultContext, repo, 4))
unittest.AssertNotExistsBean(t, &repo_model.Collaboration{RepoID: repo.ID, UserID: 4})
- assert.NoError(t, DeleteCollaboration(db.DefaultContext, repo, 4))
+ require.NoError(t, DeleteCollaboration(db.DefaultContext, repo, 4))
unittest.AssertNotExistsBean(t, &repo_model.Collaboration{RepoID: repo.ID, UserID: 4})
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID})
diff --git a/services/repository/contributors_graph_test.go b/services/repository/contributors_graph_test.go
index 2c6102005d..72b267b015 100644
--- a/services/repository/contributors_graph_test.go
+++ b/services/repository/contributors_graph_test.go
@@ -15,22 +15,23 @@ import (
"gitea.com/go-chi/cache"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRepository_ContributorsGraph(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
- assert.NoError(t, repo.LoadOwner(db.DefaultContext))
+ require.NoError(t, repo.LoadOwner(db.DefaultContext))
mockCache, err := cache.NewCacher(cache.Options{
Adapter: "memory",
Interval: 24 * 60,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
generateContributorStats(nil, mockCache, "key", repo, "404ref")
err, isErr := mockCache.Get("key").(error)
assert.True(t, isErr)
- assert.ErrorAs(t, err, &git.ErrNotExist{})
+ require.ErrorAs(t, err, &git.ErrNotExist{})
generateContributorStats(nil, mockCache, "key2", repo, "master")
dataString, isData := mockCache.Get("key2").(string)
@@ -39,7 +40,7 @@ func TestRepository_ContributorsGraph(t *testing.T) {
assert.EqualValues(t, `{"ethantkoenig@gmail.com":{"name":"Ethan Koenig","login":"","avatar_link":"https://secure.gravatar.com/avatar/b42fb195faa8c61b8d88abfefe30e9e3?d=identicon","home_link":"","total_commits":1,"weeks":{"1511654400000":{"week":1511654400000,"additions":3,"deletions":0,"commits":1}}},"jimmy.praet@telenet.be":{"name":"Jimmy Praet","login":"","avatar_link":"https://secure.gravatar.com/avatar/93c49b7c89eb156971d11161c9b52795?d=identicon","home_link":"","total_commits":1,"weeks":{"1624752000000":{"week":1624752000000,"additions":2,"deletions":0,"commits":1}}},"jon@allspice.io":{"name":"Jon","login":"","avatar_link":"https://secure.gravatar.com/avatar/00388ce725e6886f3e07c3733007289b?d=identicon","home_link":"","total_commits":1,"weeks":{"1607817600000":{"week":1607817600000,"additions":10,"deletions":0,"commits":1}}},"total":{"name":"Total","login":"","avatar_link":"","home_link":"","total_commits":3,"weeks":{"1511654400000":{"week":1511654400000,"additions":3,"deletions":0,"commits":1},"1607817600000":{"week":1607817600000,"additions":10,"deletions":0,"commits":1},"1624752000000":{"week":1624752000000,"additions":2,"deletions":0,"commits":1}}}}`, dataString)
var data map[string]*ContributorData
- assert.NoError(t, json.Unmarshal([]byte(dataString), &data))
+ require.NoError(t, json.Unmarshal([]byte(dataString), &data))
var keys []string
for k := range data {
diff --git a/services/repository/create_test.go b/services/repository/create_test.go
index 131249ad9c..9cde285181 100644
--- a/services/repository/create_test.go
+++ b/services/repository/create_test.go
@@ -16,14 +16,15 @@ import (
"code.gitea.io/gitea/modules/structs"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestIncludesAllRepositoriesTeams(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
testTeamRepositories := func(teamID int64, repoIds []int64) {
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID})
- assert.NoError(t, team.LoadRepositories(db.DefaultContext), "%s: GetRepositories", team.Name)
+ require.NoError(t, team.LoadRepositories(db.DefaultContext), "%s: GetRepositories", team.Name)
assert.Len(t, team.Repos, team.NumRepos, "%s: len repo", team.Name)
assert.Len(t, team.Repos, len(repoIds), "%s: repo count", team.Name)
for i, rid := range repoIds {
@@ -35,7 +36,7 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
// Get an admin user.
user, err := user_model.GetUserByID(db.DefaultContext, 1)
- assert.NoError(t, err, "GetUserByID")
+ require.NoError(t, err, "GetUserByID")
// Create org.
org := &organization.Organization{
@@ -44,25 +45,25 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
Type: user_model.UserTypeOrganization,
Visibility: structs.VisibleTypePublic,
}
- assert.NoError(t, organization.CreateOrganization(db.DefaultContext, org, user), "CreateOrganization")
+ require.NoError(t, organization.CreateOrganization(db.DefaultContext, org, user), "CreateOrganization")
// Check Owner team.
ownerTeam, err := org.GetOwnerTeam(db.DefaultContext)
- assert.NoError(t, err, "GetOwnerTeam")
+ require.NoError(t, err, "GetOwnerTeam")
assert.True(t, ownerTeam.IncludesAllRepositories, "Owner team includes all repositories")
// Create repos.
repoIDs := make([]int64, 0)
for i := 0; i < 3; i++ {
r, err := CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(), CreateRepoOptions{Name: fmt.Sprintf("repo-%d", i)})
- assert.NoError(t, err, "CreateRepository %d", i)
+ require.NoError(t, err, "CreateRepository %d", i)
if r != nil {
repoIDs = append(repoIDs, r.ID)
}
}
// Get fresh copy of Owner team after creating repos.
ownerTeam, err = org.GetOwnerTeam(db.DefaultContext)
- assert.NoError(t, err, "GetOwnerTeam")
+ require.NoError(t, err, "GetOwnerTeam")
// Create teams and check repositories.
teams := []*organization.Team{
@@ -101,7 +102,7 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
}
for i, team := range teams {
if i > 0 { // first team is Owner.
- assert.NoError(t, models.NewTeam(db.DefaultContext, team), "%s: NewTeam", team.Name)
+ require.NoError(t, models.NewTeam(db.DefaultContext, team), "%s: NewTeam", team.Name)
}
testTeamRepositories(team.ID, teamRepos[i])
}
@@ -111,13 +112,13 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
teams[4].IncludesAllRepositories = true
teamRepos[4] = repoIDs
for i, team := range teams {
- assert.NoError(t, models.UpdateTeam(db.DefaultContext, team, false, true), "%s: UpdateTeam", team.Name)
+ require.NoError(t, models.UpdateTeam(db.DefaultContext, team, false, true), "%s: UpdateTeam", team.Name)
testTeamRepositories(team.ID, teamRepos[i])
}
// Create repo and check teams repositories.
r, err := CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(), CreateRepoOptions{Name: "repo-last"})
- assert.NoError(t, err, "CreateRepository last")
+ require.NoError(t, err, "CreateRepository last")
if r != nil {
repoIDs = append(repoIDs, r.ID)
}
@@ -129,7 +130,7 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
}
// Remove repo and check teams repositories.
- assert.NoError(t, DeleteRepositoryDirectly(db.DefaultContext, user, repoIDs[0]), "DeleteRepository")
+ require.NoError(t, DeleteRepositoryDirectly(db.DefaultContext, user, repoIDs[0]), "DeleteRepository")
teamRepos[0] = repoIDs[1:]
teamRepos[1] = repoIDs[1:]
teamRepos[3] = repoIDs[1:3]
@@ -141,8 +142,8 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
// Wipe created items.
for i, rid := range repoIDs {
if i > 0 { // first repo already deleted.
- assert.NoError(t, DeleteRepositoryDirectly(db.DefaultContext, user, rid), "DeleteRepository %d", i)
+ require.NoError(t, DeleteRepositoryDirectly(db.DefaultContext, user, rid), "DeleteRepository %d", i)
}
}
- assert.NoError(t, organization.DeleteOrganization(db.DefaultContext, org), "DeleteOrganization")
+ require.NoError(t, organization.DeleteOrganization(db.DefaultContext, org), "DeleteOrganization")
}
diff --git a/services/repository/files/content_test.go b/services/repository/files/content_test.go
index 4811f9d327..768d6d2f39 100644
--- a/services/repository/files/content_test.go
+++ b/services/repository/files/content_test.go
@@ -14,6 +14,7 @@ import (
_ "code.gitea.io/gitea/models/actions"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -68,13 +69,13 @@ func TestGetContents(t *testing.T) {
t.Run("Get README.md contents with GetContents(ctx, )", func(t *testing.T) {
fileContentResponse, err := GetContents(ctx, ctx.Repo.Repository, treePath, ref, false)
assert.EqualValues(t, expectedContentsResponse, fileContentResponse)
- assert.NoError(t, err)
+ require.NoError(t, err)
})
t.Run("Get README.md contents with ref as empty string (should then use the repo's default branch) with GetContents(ctx, )", func(t *testing.T) {
fileContentResponse, err := GetContents(ctx, ctx.Repo.Repository, treePath, "", false)
assert.EqualValues(t, expectedContentsResponse, fileContentResponse)
- assert.NoError(t, err)
+ require.NoError(t, err)
})
}
@@ -103,13 +104,13 @@ func TestGetContentsOrListForDir(t *testing.T) {
t.Run("Get root dir contents with GetContentsOrList(ctx, )", func(t *testing.T) {
fileContentResponse, err := GetContentsOrList(ctx, ctx.Repo.Repository, treePath, ref)
assert.EqualValues(t, expectedContentsListResponse, fileContentResponse)
- assert.NoError(t, err)
+ require.NoError(t, err)
})
t.Run("Get root dir contents with ref as empty string (should then use the repo's default branch) with GetContentsOrList(ctx, )", func(t *testing.T) {
fileContentResponse, err := GetContentsOrList(ctx, ctx.Repo.Repository, treePath, "")
assert.EqualValues(t, expectedContentsListResponse, fileContentResponse)
- assert.NoError(t, err)
+ require.NoError(t, err)
})
}
@@ -131,13 +132,13 @@ func TestGetContentsOrListForFile(t *testing.T) {
t.Run("Get README.md contents with GetContentsOrList(ctx, )", func(t *testing.T) {
fileContentResponse, err := GetContentsOrList(ctx, ctx.Repo.Repository, treePath, ref)
assert.EqualValues(t, expectedContentsResponse, fileContentResponse)
- assert.NoError(t, err)
+ require.NoError(t, err)
})
t.Run("Get README.md contents with ref as empty string (should then use the repo's default branch) with GetContentsOrList(ctx, )", func(t *testing.T) {
fileContentResponse, err := GetContentsOrList(ctx, ctx.Repo.Repository, treePath, "")
assert.EqualValues(t, expectedContentsResponse, fileContentResponse)
- assert.NoError(t, err)
+ require.NoError(t, err)
})
}
@@ -158,16 +159,14 @@ func TestGetContentsErrors(t *testing.T) {
t.Run("bad treePath", func(t *testing.T) {
badTreePath := "bad/tree.md"
fileContentResponse, err := GetContents(ctx, repo, badTreePath, ref, false)
- assert.Error(t, err)
- assert.EqualError(t, err, "object does not exist [id: , rel_path: bad]")
+ require.EqualError(t, err, "object does not exist [id: , rel_path: bad]")
assert.Nil(t, fileContentResponse)
})
t.Run("bad ref", func(t *testing.T) {
badRef := "bad_ref"
fileContentResponse, err := GetContents(ctx, repo, treePath, badRef, false)
- assert.Error(t, err)
- assert.EqualError(t, err, "object does not exist [id: "+badRef+", rel_path: ]")
+ require.EqualError(t, err, "object does not exist [id: "+badRef+", rel_path: ]")
assert.Nil(t, fileContentResponse)
})
}
@@ -189,16 +188,14 @@ func TestGetContentsOrListErrors(t *testing.T) {
t.Run("bad treePath", func(t *testing.T) {
badTreePath := "bad/tree.md"
fileContentResponse, err := GetContentsOrList(ctx, repo, badTreePath, ref)
- assert.Error(t, err)
- assert.EqualError(t, err, "object does not exist [id: , rel_path: bad]")
+ require.EqualError(t, err, "object does not exist [id: , rel_path: bad]")
assert.Nil(t, fileContentResponse)
})
t.Run("bad ref", func(t *testing.T) {
badRef := "bad_ref"
fileContentResponse, err := GetContentsOrList(ctx, repo, treePath, badRef)
- assert.Error(t, err)
- assert.EqualError(t, err, "object does not exist [id: "+badRef+", rel_path: ]")
+ require.EqualError(t, err, "object does not exist [id: "+badRef+", rel_path: ]")
assert.Nil(t, fileContentResponse)
})
}
@@ -216,7 +213,7 @@ func TestGetContentsOrListOfEmptyRepos(t *testing.T) {
t.Run("empty repo", func(t *testing.T) {
contents, err := GetContentsOrList(ctx, repo, "", "")
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, contents)
})
}
@@ -247,6 +244,6 @@ func TestGetBlobBySHA(t *testing.T) {
SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
Size: 180,
}
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, expectedGBR, gbr)
}
diff --git a/services/repository/files/diff_test.go b/services/repository/files/diff_test.go
index 7cec979d72..1ea4a170cc 100644
--- a/services/repository/files/diff_test.go
+++ b/services/repository/files/diff_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/services/gitdiff"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGetDiffPreview(t *testing.T) {
@@ -118,21 +119,21 @@ func TestGetDiffPreview(t *testing.T) {
t.Run("with given branch", func(t *testing.T) {
diff, err := GetDiffPreview(ctx, ctx.Repo.Repository, branch, treePath, content)
- assert.NoError(t, err)
+ require.NoError(t, err)
expectedBs, err := json.Marshal(expectedDiff)
- assert.NoError(t, err)
+ require.NoError(t, err)
bs, err := json.Marshal(diff)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, string(expectedBs), string(bs))
})
t.Run("empty branch, same results", func(t *testing.T) {
diff, err := GetDiffPreview(ctx, ctx.Repo.Repository, "", treePath, content)
- assert.NoError(t, err)
+ require.NoError(t, err)
expectedBs, err := json.Marshal(expectedDiff)
- assert.NoError(t, err)
+ require.NoError(t, err)
bs, err := json.Marshal(diff)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, expectedBs, bs)
})
}
diff --git a/services/repository/files/file_test.go b/services/repository/files/file_test.go
index a5b3aad91e..2c6a169da1 100644
--- a/services/repository/files/file_test.go
+++ b/services/repository/files/file_test.go
@@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/services/contexttest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestCleanUploadFileName(t *testing.T) {
@@ -115,6 +116,6 @@ func TestGetFileResponseFromCommit(t *testing.T) {
expectedFileResponse := getExpectedFileResponse()
fileResponse, err := GetFileResponseFromCommit(ctx, repo, commit, branch, treePath)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, expectedFileResponse, fileResponse)
}
diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go
index 50b936cfa7..38539b774e 100644
--- a/services/repository/files/temp_repo.go
+++ b/services/repository/files/temp_repo.go
@@ -202,6 +202,26 @@ func (t *TemporaryUploadRepository) AddObjectToIndex(mode, objectHash, objectPat
return nil
}
+// InitPrivateAnnex initializes a private annex in the repository
+func (t *TemporaryUploadRepository) InitPrivateAnnex() error {
+ if _, _, err := git.NewCommand(t.ctx, "config", "annex.private", "true").RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil {
+ return err
+ }
+ if _, _, err := git.NewCommand(t.ctx, "annex", "init").RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil {
+ return err
+ }
+ return nil
+}
+
+// AddAnnex adds the file at path to the repository using git annex add
+// This requires a non-bare repository
+func (t *TemporaryUploadRepository) AddAnnex(path string) error {
+ if _, _, err := git.NewCommand(t.ctx, "annex", "add").AddDynamicArguments(path).RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil {
+ return err
+ }
+ return nil
+}
+
// WriteTree writes the current index as a tree to the object db and returns its hash
func (t *TemporaryUploadRepository) WriteTree() (string, error) {
stdout, _, err := git.NewCommand(t.ctx, "write-tree").RunStdString(&git.RunOpts{Dir: t.basePath})
diff --git a/services/repository/files/temp_repo_test.go b/services/repository/files/temp_repo_test.go
index 2e31996c40..e7d85ea3cc 100644
--- a/services/repository/files/temp_repo_test.go
+++ b/services/repository/files/temp_repo_test.go
@@ -11,7 +11,7 @@ import (
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/git"
- "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRemoveFilesFromIndexSha256(t *testing.T) {
@@ -22,7 +22,7 @@ func TestRemoveFilesFromIndexSha256(t *testing.T) {
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
temp, err := NewTemporaryUploadRepository(db.DefaultContext, repo)
- assert.NoError(t, err)
- assert.NoError(t, temp.Init("sha256"))
- assert.NoError(t, temp.RemoveFilesFromIndex("README.md"))
+ require.NoError(t, err)
+ require.NoError(t, temp.Init("sha256"))
+ require.NoError(t, temp.RemoveFilesFromIndex("README.md"))
}
diff --git a/services/repository/files/tree_test.go b/services/repository/files/tree_test.go
index 508f20090d..faa9b8e29e 100644
--- a/services/repository/files/tree_test.go
+++ b/services/repository/files/tree_test.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/services/contexttest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGetTreeBySHA(t *testing.T) {
@@ -29,7 +30,7 @@ func TestGetTreeBySHA(t *testing.T) {
ctx.SetParams(":sha", sha)
tree, err := GetTreeBySHA(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.Params(":sha"), page, perPage, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
expectedTree := &api.GitTreeResponse{
SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/trees/65f1bf27bc3bf70f64657658635e66094edbcb4d",
diff --git a/services/repository/files/upload.go b/services/repository/files/upload.go
index 1330116889..30cd5035cc 100644
--- a/services/repository/files/upload.go
+++ b/services/repository/files/upload.go
@@ -8,11 +8,13 @@ import (
"fmt"
"os"
"path"
+ "path/filepath"
"strings"
git_model "code.gitea.io/gitea/models/git"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/lfs"
"code.gitea.io/gitea/modules/setting"
@@ -89,7 +91,7 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
defer t.Close()
hasOldBranch := true
- if err = t.Clone(opts.OldBranch, true); err != nil {
+ if err = t.Clone(opts.OldBranch, false); err != nil {
if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
return err
}
@@ -105,10 +107,30 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
}
}
- // Copy uploaded files into repository.
- if err := copyUploadedLFSFilesIntoRepository(infos, t, opts.TreePath); err != nil {
+ r, err := git.OpenRepository(ctx, repo.RepoPath())
+ if err != nil {
return err
}
+ if annex.IsAnnexRepo(r) {
+ // Initialize annex privately in temporary clone
+ if err := t.InitPrivateAnnex(); err != nil {
+ return err
+ }
+ // Copy uploaded files into git-annex repository
+ if err := copyUploadedFilesIntoAnnexRepository(infos, t, opts.TreePath); err != nil {
+ return err
+ }
+ // Move all annexed content in the temporary repository, i.e. everything we have just added, to the origin
+ author, committer := GetAuthorAndCommitterUsers(opts.Author, opts.Committer, doer)
+ if err := moveAnnexedFilesToOrigin(t, author, committer); err != nil {
+ return err
+ }
+ } else {
+ // Copy uploaded files into repository.
+ if err := copyUploadedLFSFilesIntoRepository(infos, t, opts.TreePath); err != nil {
+ return err
+ }
+ }
// Now write the tree
treeHash, err := t.WriteTree()
@@ -246,3 +268,38 @@ func uploadToLFSContentStore(info uploadInfo, contentStore *lfs.ContentStore) er
}
return nil
}
+
+func copyUploadedFilesIntoAnnexRepository(infos []uploadInfo, t *TemporaryUploadRepository, treePath string) error {
+ for i := range len(infos) {
+ if err := copyUploadedFileIntoAnnexRepository(&infos[i], t, treePath); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func copyUploadedFileIntoAnnexRepository(info *uploadInfo, t *TemporaryUploadRepository, treePath string) error {
+ pathInRepo := path.Join(t.basePath, treePath, info.upload.Name)
+ if err := os.MkdirAll(filepath.Dir(pathInRepo), 0o700); err != nil {
+ return err
+ }
+ if err := os.Rename(info.upload.LocalPath(), pathInRepo); err != nil {
+ return err
+ }
+ return t.AddAnnex(pathInRepo)
+}
+
+func moveAnnexedFilesToOrigin(t *TemporaryUploadRepository, author, committer *user_model.User) error {
+ authorSig := author.NewGitSig()
+ committerSig := committer.NewGitSig()
+ env := append(os.Environ(),
+ "GIT_AUTHOR_NAME="+authorSig.Name,
+ "GIT_AUTHOR_EMAIL="+authorSig.Email,
+ "GIT_COMMITTER_NAME="+committerSig.Name,
+ "GIT_COMMITTER_EMAIL="+committerSig.Email,
+ )
+ if _, _, err := git.NewCommand(t.ctx, "annex", "move", "--to", "origin").RunStdString(&git.RunOpts{Dir: t.basePath, Env: env}); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/services/repository/fork_test.go b/services/repository/fork_test.go
index 452798b25b..4680d99a32 100644
--- a/services/repository/fork_test.go
+++ b/services/repository/fork_test.go
@@ -13,10 +13,11 @@ import (
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestForkRepository(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// user 13 has already forked repo10
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 13})
@@ -28,7 +29,7 @@ func TestForkRepository(t *testing.T) {
Description: "test",
})
assert.Nil(t, fork)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, IsErrForkAlreadyExist(err))
// user not reached maximum limit of repositories
diff --git a/services/repository/lfs_test.go b/services/repository/lfs_test.go
index 52ee05a147..a0c01dff8f 100644
--- a/services/repository/lfs_test.go
+++ b/services/repository/lfs_test.go
@@ -19,6 +19,7 @@ import (
repo_service "code.gitea.io/gitea/services/repository"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGarbageCollectLFSMetaObjects(t *testing.T) {
@@ -26,13 +27,13 @@ func TestGarbageCollectLFSMetaObjects(t *testing.T) {
setting.LFS.StartServer = true
err := storage.Init()
- assert.NoError(t, err)
+ require.NoError(t, err)
repo, err := repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "lfs")
- assert.NoError(t, err)
+ require.NoError(t, err)
validLFSObjects, err := db.GetEngine(db.DefaultContext).Count(git_model.LFSMetaObject{RepositoryID: repo.ID})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Greater(t, validLFSObjects, int64(1))
// add lfs object
@@ -46,29 +47,29 @@ func TestGarbageCollectLFSMetaObjects(t *testing.T) {
UpdatedLessRecentlyThan: time.Time{}, // ensure that the models/fixtures/lfs_meta_object.yml objects are considered as well
LogDetail: t.Logf,
})
- assert.NoError(t, err)
+ require.NoError(t, err)
// lfs meta has been deleted
_, err = git_model.GetLFSMetaObjectByOid(db.DefaultContext, repo.ID, lfsOid)
- assert.ErrorIs(t, err, git_model.ErrLFSObjectNotExist)
+ require.ErrorIs(t, err, git_model.ErrLFSObjectNotExist)
remainingLFSObjects, err := db.GetEngine(db.DefaultContext).Count(git_model.LFSMetaObject{RepositoryID: repo.ID})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, validLFSObjects-1, remainingLFSObjects)
}
func storeObjectInRepo(t *testing.T, repositoryID int64, content *[]byte) string {
pointer, err := lfs.GeneratePointer(bytes.NewReader(*content))
- assert.NoError(t, err)
+ require.NoError(t, err)
_, err = git_model.NewLFSMetaObject(db.DefaultContext, repositoryID, pointer)
- assert.NoError(t, err)
+ require.NoError(t, err)
contentStore := lfs.NewContentStore()
exist, err := contentStore.Exists(pointer)
- assert.NoError(t, err)
+ require.NoError(t, err)
if !exist {
err := contentStore.Put(pointer, bytes.NewReader(*content))
- assert.NoError(t, err)
+ require.NoError(t, err)
}
return pointer.Oid
}
diff --git a/services/repository/repository_test.go b/services/repository/repository_test.go
index 892a11a23e..a5c0b3efcd 100644
--- a/services/repository/repository_test.go
+++ b/services/repository/repository_test.go
@@ -12,10 +12,11 @@ import (
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestLinkedRepository(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
testCases := []struct {
name string
attachID int64
@@ -30,9 +31,9 @@ func TestLinkedRepository(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
attach, err := repo_model.GetAttachmentByID(db.DefaultContext, tc.attachID)
- assert.NoError(t, err)
+ require.NoError(t, err)
repo, unitType, err := LinkedRepository(db.DefaultContext, attach)
- assert.NoError(t, err)
+ require.NoError(t, err)
if tc.expectedRepo != nil {
assert.Equal(t, tc.expectedRepo.ID, repo.ID)
}
diff --git a/services/repository/review_test.go b/services/repository/review_test.go
index 2db56d4e8a..eb1712c2ce 100644
--- a/services/repository/review_test.go
+++ b/services/repository/review_test.go
@@ -11,18 +11,19 @@ import (
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRepoGetReviewerTeams(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
teams, err := GetReviewerTeams(db.DefaultContext, repo2)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Empty(t, teams)
repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
teams, err = GetReviewerTeams(db.DefaultContext, repo3)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, teams, 2)
}
diff --git a/services/repository/transfer_test.go b/services/repository/transfer_test.go
index b201b5cb98..cc51a05781 100644
--- a/services/repository/transfer_test.go
+++ b/services/repository/transfer_test.go
@@ -20,6 +20,7 @@ import (
notify_service "code.gitea.io/gitea/services/notify"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
var notifySync sync.Once
@@ -33,21 +34,21 @@ func registerNotifier() {
func TestTransferOwnership(t *testing.T) {
registerNotifier()
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
repo.Owner = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
- assert.NoError(t, TransferOwnership(db.DefaultContext, doer, doer, repo, nil))
+ require.NoError(t, TransferOwnership(db.DefaultContext, doer, doer, repo, nil))
transferredRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
assert.EqualValues(t, 2, transferredRepo.OwnerID)
exist, err := util.IsExist(repo_model.RepoPath("org3", "repo3"))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, exist)
exist, err = util.IsExist(repo_model.RepoPath("user2", "repo3"))
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, exist)
unittest.AssertExistsAndLoadBean(t, &activities_model.Action{
OpType: activities_model.ActionTransferRepo,
@@ -60,7 +61,7 @@ func TestTransferOwnership(t *testing.T) {
}
func TestStartRepositoryTransferSetPermission(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
recipient := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
@@ -68,56 +69,56 @@ func TestStartRepositoryTransferSetPermission(t *testing.T) {
repo.Owner = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
hasAccess, err := access_model.HasAccess(db.DefaultContext, recipient.ID, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.False(t, hasAccess)
- assert.NoError(t, StartRepositoryTransfer(db.DefaultContext, doer, recipient, repo, nil))
+ require.NoError(t, StartRepositoryTransfer(db.DefaultContext, doer, recipient, repo, nil))
hasAccess, err = access_model.HasAccess(db.DefaultContext, recipient.ID, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.True(t, hasAccess)
unittest.CheckConsistencyFor(t, &repo_model.Repository{}, &user_model.User{}, &organization.Team{})
}
func TestRepositoryTransfer(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
transfer, err := models.GetPendingRepositoryTransfer(db.DefaultContext, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, transfer)
// Cancel transfer
- assert.NoError(t, CancelRepositoryTransfer(db.DefaultContext, repo))
+ require.NoError(t, CancelRepositoryTransfer(db.DefaultContext, repo))
transfer, err = models.GetPendingRepositoryTransfer(db.DefaultContext, repo)
- assert.Error(t, err)
+ require.Error(t, err)
assert.Nil(t, transfer)
assert.True(t, models.IsErrNoPendingTransfer(err))
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- assert.NoError(t, models.CreatePendingRepositoryTransfer(db.DefaultContext, doer, user2, repo.ID, nil))
+ require.NoError(t, models.CreatePendingRepositoryTransfer(db.DefaultContext, doer, user2, repo.ID, nil))
transfer, err = models.GetPendingRepositoryTransfer(db.DefaultContext, repo)
- assert.Nil(t, err)
- assert.NoError(t, transfer.LoadAttributes(db.DefaultContext))
+ require.NoError(t, err)
+ require.NoError(t, transfer.LoadAttributes(db.DefaultContext))
assert.Equal(t, "user2", transfer.Recipient.Name)
org6 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
// Only transfer can be started at any given time
err = models.CreatePendingRepositoryTransfer(db.DefaultContext, doer, org6, repo.ID, nil)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, models.IsErrRepoTransferInProgress(err))
// Unknown user
err = models.CreatePendingRepositoryTransfer(db.DefaultContext, doer, &user_model.User{ID: 1000, LowerName: "user1000"}, repo.ID, nil)
- assert.Error(t, err)
+ require.Error(t, err)
// Cancel transfer
- assert.NoError(t, CancelRepositoryTransfer(db.DefaultContext, repo))
+ require.NoError(t, CancelRepositoryTransfer(db.DefaultContext, repo))
}
diff --git a/services/user/avatar_test.go b/services/user/avatar_test.go
index 557ddccec0..21fca8dd09 100644
--- a/services/user/avatar_test.go
+++ b/services/user/avatar_test.go
@@ -17,6 +17,7 @@ import (
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
type alreadyDeletedStorage struct {
@@ -35,18 +36,18 @@ func TestUserDeleteAvatar(t *testing.T) {
t.Run("AtomicStorageFailure", func(t *testing.T) {
defer test.MockProtect[storage.ObjectStorage](&storage.Avatars)()
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
err := UploadAvatar(db.DefaultContext, user, buff.Bytes())
- assert.NoError(t, err)
+ require.NoError(t, err)
verification := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
assert.NotEqual(t, "", verification.Avatar)
// fail to delete ...
storage.Avatars = storage.UninitializedStorage
err = DeleteAvatar(db.DefaultContext, user)
- assert.Error(t, err)
+ require.Error(t, err)
// ... the avatar is not removed from the database
verification = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
@@ -55,7 +56,7 @@ func TestUserDeleteAvatar(t *testing.T) {
// already deleted ...
storage.Avatars = alreadyDeletedStorage{}
err = DeleteAvatar(db.DefaultContext, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
// ... the avatar is removed from the database
verification = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
@@ -63,16 +64,16 @@ func TestUserDeleteAvatar(t *testing.T) {
})
t.Run("Success", func(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
err := UploadAvatar(db.DefaultContext, user, buff.Bytes())
- assert.NoError(t, err)
+ require.NoError(t, err)
verification := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
assert.NotEqual(t, "", verification.Avatar)
err = DeleteAvatar(db.DefaultContext, user)
- assert.NoError(t, err)
+ require.NoError(t, err)
verification = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
assert.Equal(t, "", verification.Avatar)
diff --git a/services/user/block_test.go b/services/user/block_test.go
index 121c1ea8b7..f9e95ed7f7 100644
--- a/services/user/block_test.go
+++ b/services/user/block_test.go
@@ -13,12 +13,13 @@ import (
user_model "code.gitea.io/gitea/models/user"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
// TestBlockUser will ensure that when you block a user, certain actions have
// been taken, like unfollowing each other etc.
func TestBlockUser(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
blockedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
@@ -27,10 +28,10 @@ func TestBlockUser(t *testing.T) {
defer user_model.UnblockUser(db.DefaultContext, doer.ID, blockedUser.ID)
// Follow each other.
- assert.NoError(t, user_model.FollowUser(db.DefaultContext, doer.ID, blockedUser.ID))
- assert.NoError(t, user_model.FollowUser(db.DefaultContext, blockedUser.ID, doer.ID))
+ require.NoError(t, user_model.FollowUser(db.DefaultContext, doer.ID, blockedUser.ID))
+ require.NoError(t, user_model.FollowUser(db.DefaultContext, blockedUser.ID, doer.ID))
- assert.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
+ require.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
// Ensure they aren't following each other anymore.
assert.False(t, user_model.IsFollowing(db.DefaultContext, doer.ID, blockedUser.ID))
@@ -42,9 +43,9 @@ func TestBlockUser(t *testing.T) {
// Blocked user watch repository of doer.
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: doer.ID})
- assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, blockedUser.ID, repo.ID, true))
+ require.NoError(t, repo_model.WatchRepo(db.DefaultContext, blockedUser.ID, repo.ID, true))
- assert.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
+ require.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
// Ensure blocked user isn't following doer's repository.
assert.False(t, repo_model.IsWatching(db.DefaultContext, blockedUser.ID, repo.ID))
@@ -59,14 +60,14 @@ func TestBlockUser(t *testing.T) {
isBlockedUserCollab := func(repo *repo_model.Repository) bool {
isCollaborator, err := repo_model.IsCollaborator(db.DefaultContext, repo.ID, blockedUser.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
return isCollaborator
}
assert.True(t, isBlockedUserCollab(repo1))
assert.True(t, isBlockedUserCollab(repo2))
- assert.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
+ require.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
assert.False(t, isBlockedUserCollab(repo1))
assert.False(t, isBlockedUserCollab(repo2))
@@ -80,7 +81,7 @@ func TestBlockUser(t *testing.T) {
unittest.AssertExistsIf(t, true, &repo_model.Repository{ID: 3, OwnerID: blockedUser.ID, Status: repo_model.RepositoryPendingTransfer})
unittest.AssertExistsIf(t, true, &model.RepoTransfer{ID: 1, RecipientID: doer.ID, DoerID: blockedUser.ID})
- assert.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
+ require.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID))
unittest.AssertExistsIf(t, false, &model.RepoTransfer{ID: 1, RecipientID: doer.ID, DoerID: blockedUser.ID})
diff --git a/services/user/email_test.go b/services/user/email_test.go
index 0784b4f803..1fff9c5bfa 100644
--- a/services/user/email_test.go
+++ b/services/user/email_test.go
@@ -14,31 +14,32 @@ import (
"github.com/gobwas/glob"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestAdminAddOrSetPrimaryEmailAddress(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 27})
emails, err := user_model.GetEmailAddresses(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, emails, 1)
primary, err := user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEqual(t, "new-primary@example.com", primary.Email)
assert.Equal(t, user.Email, primary.Email)
- assert.NoError(t, AdminAddOrSetPrimaryEmailAddress(db.DefaultContext, user, "new-primary@example.com"))
+ require.NoError(t, AdminAddOrSetPrimaryEmailAddress(db.DefaultContext, user, "new-primary@example.com"))
primary, err = user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "new-primary@example.com", primary.Email)
assert.Equal(t, user.Email, primary.Email)
emails, err = user_model.GetEmailAddresses(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, emails, 2)
setting.Service.EmailDomainAllowList = []glob.Glob{glob.MustCompile("example.org")}
@@ -46,52 +47,52 @@ func TestAdminAddOrSetPrimaryEmailAddress(t *testing.T) {
setting.Service.EmailDomainAllowList = []glob.Glob{}
}()
- assert.NoError(t, AdminAddOrSetPrimaryEmailAddress(db.DefaultContext, user, "new-primary2@example2.com"))
+ require.NoError(t, AdminAddOrSetPrimaryEmailAddress(db.DefaultContext, user, "new-primary2@example2.com"))
primary, err = user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "new-primary2@example2.com", primary.Email)
assert.Equal(t, user.Email, primary.Email)
- assert.NoError(t, AdminAddOrSetPrimaryEmailAddress(db.DefaultContext, user, "user27@example.com"))
+ require.NoError(t, AdminAddOrSetPrimaryEmailAddress(db.DefaultContext, user, "user27@example.com"))
primary, err = user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "user27@example.com", primary.Email)
assert.Equal(t, user.Email, primary.Email)
emails, err = user_model.GetEmailAddresses(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, emails, 3)
}
func TestReplacePrimaryEmailAddress(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
t.Run("User", func(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 13})
emails, err := user_model.GetEmailAddresses(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, emails, 1)
primary, err := user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEqual(t, "primary-13@example.com", primary.Email)
assert.Equal(t, user.Email, primary.Email)
- assert.NoError(t, ReplacePrimaryEmailAddress(db.DefaultContext, user, "primary-13@example.com"))
+ require.NoError(t, ReplacePrimaryEmailAddress(db.DefaultContext, user, "primary-13@example.com"))
primary, err = user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "primary-13@example.com", primary.Email)
assert.Equal(t, user.Email, primary.Email)
emails, err = user_model.GetEmailAddresses(db.DefaultContext, user.ID)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, emails, 1)
- assert.NoError(t, ReplacePrimaryEmailAddress(db.DefaultContext, user, "primary-13@example.com"))
+ require.NoError(t, ReplacePrimaryEmailAddress(db.DefaultContext, user, "primary-13@example.com"))
})
t.Run("Organization", func(t *testing.T) {
@@ -99,37 +100,37 @@ func TestReplacePrimaryEmailAddress(t *testing.T) {
assert.Equal(t, "org3@example.com", org.Email)
- assert.NoError(t, ReplacePrimaryEmailAddress(db.DefaultContext, org.AsUser(), "primary-org@example.com"))
+ require.NoError(t, ReplacePrimaryEmailAddress(db.DefaultContext, org.AsUser(), "primary-org@example.com"))
assert.Equal(t, "primary-org@example.com", org.Email)
})
}
func TestAddEmailAddresses(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- assert.Error(t, AddEmailAddresses(db.DefaultContext, user, []string{" invalid email "}))
+ require.Error(t, AddEmailAddresses(db.DefaultContext, user, []string{" invalid email "}))
emails := []string{"user1234@example.com", "user5678@example.com"}
- assert.NoError(t, AddEmailAddresses(db.DefaultContext, user, emails))
+ require.NoError(t, AddEmailAddresses(db.DefaultContext, user, emails))
err := AddEmailAddresses(db.DefaultContext, user, emails)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
}
func TestReplaceInactivePrimaryEmail(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
email := &user_model.EmailAddress{
Email: "user9999999@example.com",
UID: 9999999,
}
err := ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, user_model.IsErrUserNotExist(err))
email = &user_model.EmailAddress{
@@ -137,29 +138,29 @@ func TestReplaceInactivePrimaryEmail(t *testing.T) {
UID: 10,
}
err = ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
- assert.NoError(t, err)
+ require.NoError(t, err)
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
assert.Equal(t, "user201@example.com", user.Email)
}
func TestDeleteEmailAddresses(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
emails := []string{"user2-2@example.com"}
err := DeleteEmailAddresses(db.DefaultContext, user, emails)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = DeleteEmailAddresses(db.DefaultContext, user, emails)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, user_model.IsErrEmailAddressNotExist(err))
emails = []string{"user2@example.com"}
err = DeleteEmailAddresses(db.DefaultContext, user, emails)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, user_model.IsErrPrimaryEmailCannotDelete(err))
}
diff --git a/services/user/update_test.go b/services/user/update_test.go
index fc24a6c212..11379d4508 100644
--- a/services/user/update_test.go
+++ b/services/user/update_test.go
@@ -14,14 +14,15 @@ import (
"code.gitea.io/gitea/modules/structs"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestUpdateUser(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
- assert.Error(t, UpdateUser(db.DefaultContext, admin, &UpdateOptions{
+ require.Error(t, UpdateUser(db.DefaultContext, admin, &UpdateOptions{
IsAdmin: optional.Some(false),
}))
@@ -48,7 +49,7 @@ func TestUpdateUser(t *testing.T) {
EmailNotificationsPreference: optional.Some("disabled"),
SetLastLogin: true,
}
- assert.NoError(t, UpdateUser(db.DefaultContext, user, opts))
+ require.NoError(t, UpdateUser(db.DefaultContext, user, opts))
assert.Equal(t, opts.KeepEmailPrivate.Value(), user.KeepEmailPrivate)
assert.Equal(t, opts.FullName.Value(), user.FullName)
@@ -91,17 +92,17 @@ func TestUpdateUser(t *testing.T) {
}
func TestUpdateAuth(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 28})
userCopy := *user
- assert.NoError(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
+ require.NoError(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
LoginName: optional.Some("new-login"),
}))
assert.Equal(t, "new-login", user.LoginName)
- assert.NoError(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
+ require.NoError(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
Password: optional.Some("%$DRZUVB576tfzgu"),
MustChangePassword: optional.Some(true),
}))
@@ -109,12 +110,12 @@ func TestUpdateAuth(t *testing.T) {
assert.NotEqual(t, userCopy.Passwd, user.Passwd)
assert.NotEqual(t, userCopy.Salt, user.Salt)
- assert.NoError(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
+ require.NoError(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
ProhibitLogin: optional.Some(true),
}))
assert.True(t, user.ProhibitLogin)
- assert.ErrorIs(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
+ require.ErrorIs(t, UpdateAuth(db.DefaultContext, user, &UpdateAuthOptions{
Password: optional.Some("aaaa"),
}), password_module.ErrMinLength)
}
diff --git a/services/user/user_test.go b/services/user/user_test.go
index 9013208ed0..45bf1e6993 100644
--- a/services/user/user_test.go
+++ b/services/user/user_test.go
@@ -20,6 +20,7 @@ import (
"code.gitea.io/gitea/modules/timeutil"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -28,27 +29,27 @@ func TestMain(m *testing.M) {
func TestDeleteUser(t *testing.T) {
test := func(userID int64) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
ownedRepos := make([]*repo_model.Repository, 0, 10)
- assert.NoError(t, db.GetEngine(db.DefaultContext).Find(&ownedRepos, &repo_model.Repository{OwnerID: userID}))
+ require.NoError(t, db.GetEngine(db.DefaultContext).Find(&ownedRepos, &repo_model.Repository{OwnerID: userID}))
if len(ownedRepos) > 0 {
err := DeleteUser(db.DefaultContext, user, false)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, models.IsErrUserOwnRepos(err))
return
}
orgUsers := make([]*organization.OrgUser, 0, 10)
- assert.NoError(t, db.GetEngine(db.DefaultContext).Find(&orgUsers, &organization.OrgUser{UID: userID}))
+ require.NoError(t, db.GetEngine(db.DefaultContext).Find(&orgUsers, &organization.OrgUser{UID: userID}))
for _, orgUser := range orgUsers {
if err := models.RemoveOrgUser(db.DefaultContext, orgUser.OrgID, orgUser.UID); err != nil {
assert.True(t, organization.IsErrLastOrgOwner(err))
return
}
}
- assert.NoError(t, DeleteUser(db.DefaultContext, user, false))
+ require.NoError(t, DeleteUser(db.DefaultContext, user, false))
unittest.AssertNotExistsBean(t, &user_model.User{ID: userID})
unittest.CheckConsistencyFor(t, &user_model.User{}, &repo_model.Repository{})
}
@@ -58,16 +59,16 @@ func TestDeleteUser(t *testing.T) {
test(11)
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
- assert.Error(t, DeleteUser(db.DefaultContext, org, false))
+ require.Error(t, DeleteUser(db.DefaultContext, org, false))
}
func TestPurgeUser(t *testing.T) {
test := func(userID int64) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
err := DeleteUser(db.DefaultContext, user, true)
- assert.NoError(t, err)
+ require.NoError(t, err)
unittest.AssertNotExistsBean(t, &user_model.User{ID: userID})
unittest.CheckConsistencyFor(t, &user_model.User{}, &repo_model.Repository{})
@@ -78,7 +79,7 @@ func TestPurgeUser(t *testing.T) {
test(11)
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
- assert.Error(t, DeleteUser(db.DefaultContext, org, false))
+ require.Error(t, DeleteUser(db.DefaultContext, org, false))
}
func TestCreateUser(t *testing.T) {
@@ -91,13 +92,13 @@ func TestCreateUser(t *testing.T) {
MustChangePassword: false,
}
- assert.NoError(t, user_model.CreateUser(db.DefaultContext, user))
+ require.NoError(t, user_model.CreateUser(db.DefaultContext, user))
- assert.NoError(t, DeleteUser(db.DefaultContext, user, false))
+ require.NoError(t, DeleteUser(db.DefaultContext, user, false))
}
func TestRenameUser(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 21})
t.Run("Non-Local", func(t *testing.T) {
@@ -105,19 +106,19 @@ func TestRenameUser(t *testing.T) {
Type: user_model.UserTypeIndividual,
LoginType: auth.OAuth2,
}
- assert.ErrorIs(t, RenameUser(db.DefaultContext, u, "user_rename"), user_model.ErrUserIsNotLocal{})
+ require.ErrorIs(t, RenameUser(db.DefaultContext, u, "user_rename"), user_model.ErrUserIsNotLocal{})
})
t.Run("Same username", func(t *testing.T) {
- assert.NoError(t, RenameUser(db.DefaultContext, user, user.Name))
+ require.NoError(t, RenameUser(db.DefaultContext, user, user.Name))
})
t.Run("Non usable username", func(t *testing.T) {
usernames := []string{"--diff", "aa.png", ".well-known", "search", "aaa.atom"}
for _, username := range usernames {
t.Run(username, func(t *testing.T) {
- assert.Error(t, user_model.IsUsableUsername(username))
- assert.Error(t, RenameUser(db.DefaultContext, user, username))
+ require.Error(t, user_model.IsUsableUsername(username))
+ require.Error(t, RenameUser(db.DefaultContext, user, username))
})
}
})
@@ -127,7 +128,7 @@ func TestRenameUser(t *testing.T) {
unittest.AssertNotExistsBean(t, &user_model.User{ID: user.ID, Name: caps})
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name})
- assert.NoError(t, RenameUser(db.DefaultContext, user, caps))
+ require.NoError(t, RenameUser(db.DefaultContext, user, caps))
unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID, Name: caps})
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: caps})
@@ -136,21 +137,21 @@ func TestRenameUser(t *testing.T) {
t.Run("Already exists", func(t *testing.T) {
existUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
- assert.ErrorIs(t, RenameUser(db.DefaultContext, user, existUser.Name), user_model.ErrUserAlreadyExist{Name: existUser.Name})
- assert.ErrorIs(t, RenameUser(db.DefaultContext, user, existUser.LowerName), user_model.ErrUserAlreadyExist{Name: existUser.LowerName})
+ require.ErrorIs(t, RenameUser(db.DefaultContext, user, existUser.Name), user_model.ErrUserAlreadyExist{Name: existUser.Name})
+ require.ErrorIs(t, RenameUser(db.DefaultContext, user, existUser.LowerName), user_model.ErrUserAlreadyExist{Name: existUser.LowerName})
newUsername := fmt.Sprintf("uSEr%d", existUser.ID)
- assert.ErrorIs(t, RenameUser(db.DefaultContext, user, newUsername), user_model.ErrUserAlreadyExist{Name: newUsername})
+ require.ErrorIs(t, RenameUser(db.DefaultContext, user, newUsername), user_model.ErrUserAlreadyExist{Name: newUsername})
})
t.Run("Normal", func(t *testing.T) {
oldUsername := user.Name
newUsername := "User_Rename"
- assert.NoError(t, RenameUser(db.DefaultContext, user, newUsername))
+ require.NoError(t, RenameUser(db.DefaultContext, user, newUsername))
unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID, Name: newUsername, LowerName: strings.ToLower(newUsername)})
redirectUID, err := user_model.LookupUserRedirect(db.DefaultContext, oldUsername)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, user.ID, redirectUID)
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name})
@@ -176,37 +177,37 @@ func TestCreateUser_Issue5882(t *testing.T) {
for _, v := range tt {
setting.Admin.DisableRegularOrgCreation = v.disableOrgCreation
- assert.NoError(t, user_model.CreateUser(db.DefaultContext, v.user))
+ require.NoError(t, user_model.CreateUser(db.DefaultContext, v.user))
u, err := user_model.GetUserByEmail(db.DefaultContext, v.user.Email)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, !u.AllowCreateOrganization, v.disableOrgCreation)
- assert.NoError(t, DeleteUser(db.DefaultContext, v.user, false))
+ require.NoError(t, DeleteUser(db.DefaultContext, v.user, false))
}
}
func TestDeleteInactiveUsers(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// Add an inactive user older than a minute, with an associated email_address record.
oldUser := &user_model.User{Name: "OldInactive", LowerName: "oldinactive", Email: "old@example.com", CreatedUnix: timeutil.TimeStampNow().Add(-120)}
_, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(oldUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
oldEmail := &user_model.EmailAddress{UID: oldUser.ID, IsPrimary: true, Email: "old@example.com", LowerEmail: "old@example.com"}
err = db.Insert(db.DefaultContext, oldEmail)
- assert.NoError(t, err)
+ require.NoError(t, err)
// Add an inactive user that's not older than a minute, with an associated email_address record.
newUser := &user_model.User{Name: "NewInactive", LowerName: "newinactive", Email: "new@example.com"}
err = db.Insert(db.DefaultContext, newUser)
- assert.NoError(t, err)
+ require.NoError(t, err)
newEmail := &user_model.EmailAddress{UID: newUser.ID, IsPrimary: true, Email: "new@example.com", LowerEmail: "new@example.com"}
err = db.Insert(db.DefaultContext, newEmail)
- assert.NoError(t, err)
+ require.NoError(t, err)
err = DeleteInactiveUsers(db.DefaultContext, time.Minute)
- assert.NoError(t, err)
+ require.NoError(t, err)
// User older than a minute should be deleted along with their email address.
unittest.AssertExistsIf(t, false, oldUser)
diff --git a/services/webhook/default_test.go b/services/webhook/default_test.go
index e6e59fed03..f3e2848659 100644
--- a/services/webhook/default_test.go
+++ b/services/webhook/default_test.go
@@ -58,7 +58,7 @@ func TestGiteaPayload(t *testing.T) {
Ref string `json:"ref"`
}
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "test", body.Ref) // short ref
})
@@ -87,7 +87,7 @@ func TestGiteaPayload(t *testing.T) {
Ref string `json:"ref"`
}
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "refs/heads/test", body.Ref) // full ref
})
@@ -116,7 +116,7 @@ func TestGiteaPayload(t *testing.T) {
Ref string `json:"ref"`
}
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "test", body.Ref) // short ref
})
}
@@ -161,7 +161,7 @@ func TestForgejoPayload(t *testing.T) {
Ref string `json:"ref"`
}
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "refs/heads/test", body.Ref) // full ref
})
@@ -190,7 +190,7 @@ func TestForgejoPayload(t *testing.T) {
Ref string `json:"ref"`
}
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "refs/heads/test", body.Ref) // full ref
})
@@ -219,7 +219,7 @@ func TestForgejoPayload(t *testing.T) {
Ref string `json:"ref"`
}
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "refs/heads/test", body.Ref) // full ref
})
}
@@ -245,9 +245,9 @@ func TestOpenProjectPayload(t *testing.T) {
assert.Equal(t, "test/repo", j.Get("base", "repo", "full_name").MustBeValid().ToString())
assert.Equal(t, "http://localhost:3000/test/repo", j.Get("base", "repo", "html_url").MustBeValid().ToString())
- assert.Equal(t, false, j.Get("draft").MustBeValid().ToBool())
+ assert.False(t, j.Get("draft").MustBeValid().ToBool())
assert.Equal(t, jsoniter.NilValue, j.Get("merge_commit_sha").ValueType())
- assert.Equal(t, false, j.Get("merged").MustBeValid().ToBool())
+ assert.False(t, j.Get("merged").MustBeValid().ToBool())
assert.Equal(t, jsoniter.NilValue, j.Get("merged_by").ValueType())
assert.Equal(t, jsoniter.NilValue, j.Get("merged_at").ValueType())
assert.Equal(t, 0, j.Get("comments").MustBeValid().ToInt())
diff --git a/services/webhook/deliver_test.go b/services/webhook/deliver_test.go
index 0311d810e6..21af3c7116 100644
--- a/services/webhook/deliver_test.go
+++ b/services/webhook/deliver_test.go
@@ -76,11 +76,11 @@ func TestWebhookProxy(t *testing.T) {
u, err := webhookProxy(allowedHostMatcher)(req)
if tt.wantErr {
- assert.Error(t, err)
+ require.Error(t, err)
return
}
- assert.NoError(t, err)
+ require.NoError(t, err)
got := ""
if u != nil {
@@ -92,7 +92,7 @@ func TestWebhookProxy(t *testing.T) {
}
func TestWebhookDeliverAuthorizationHeader(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
done := make(chan struct{}, 1)
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -111,8 +111,8 @@ func TestWebhookDeliverAuthorizationHeader(t *testing.T) {
Type: webhook_module.GITEA,
}
err := hook.SetHeaderAuthorization("Bearer s3cr3t-t0ken")
- assert.NoError(t, err)
- assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook))
+ require.NoError(t, err)
+ require.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook))
hookTask := &webhook_model.HookTask{
HookID: hook.ID,
@@ -121,10 +121,10 @@ func TestWebhookDeliverAuthorizationHeader(t *testing.T) {
}
hookTask, err = webhook_model.CreateHookTask(db.DefaultContext, hookTask)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, hookTask)
- assert.NoError(t, Deliver(context.Background(), hookTask))
+ require.NoError(t, Deliver(context.Background(), hookTask))
select {
case <-done:
case <-time.After(5 * time.Second):
@@ -136,7 +136,7 @@ func TestWebhookDeliverAuthorizationHeader(t *testing.T) {
}
func TestWebhookDeliverHookTask(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
done := make(chan struct{}, 1)
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -147,14 +147,14 @@ func TestWebhookDeliverHookTask(t *testing.T) {
assert.Equal(t, "push", r.Header.Get("X-GitHub-Event"))
assert.Equal(t, "", r.Header.Get("Content-Type"))
body, err := io.ReadAll(r.Body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, `{"data": 42}`, string(body))
case "/webhook/6db5dc1e282529a8c162c7fe93dd2667494eeb51":
// Version 2
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
body, err := io.ReadAll(r.Body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Len(t, body, 2147)
default:
@@ -176,7 +176,7 @@ func TestWebhookDeliverHookTask(t *testing.T) {
ContentType: webhook_model.ContentTypeJSON,
Meta: `{"message_type":0}`, // text
}
- assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook))
+ require.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook))
t.Run("Version 1", func(t *testing.T) {
hookTask := &webhook_model.HookTask{
@@ -187,10 +187,10 @@ func TestWebhookDeliverHookTask(t *testing.T) {
}
hookTask, err := webhook_model.CreateHookTask(db.DefaultContext, hookTask)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, hookTask)
- assert.NoError(t, Deliver(context.Background(), hookTask))
+ require.NoError(t, Deliver(context.Background(), hookTask))
select {
case <-done:
case <-time.After(5 * time.Second):
@@ -203,7 +203,7 @@ func TestWebhookDeliverHookTask(t *testing.T) {
t.Run("Version 2", func(t *testing.T) {
p := pushTestPayload()
data, err := p.JSONPayload()
- assert.NoError(t, err)
+ require.NoError(t, err)
hookTask := &webhook_model.HookTask{
HookID: hook.ID,
@@ -213,10 +213,10 @@ func TestWebhookDeliverHookTask(t *testing.T) {
}
hookTask, err = webhook_model.CreateHookTask(db.DefaultContext, hookTask)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, hookTask)
- assert.NoError(t, Deliver(context.Background(), hookTask))
+ require.NoError(t, Deliver(context.Background(), hookTask))
select {
case <-done:
case <-time.After(5 * time.Second):
@@ -228,7 +228,7 @@ func TestWebhookDeliverHookTask(t *testing.T) {
}
func TestWebhookDeliverSpecificTypes(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
type hookCase struct {
gotBody chan []byte
@@ -280,7 +280,7 @@ func TestWebhookDeliverSpecificTypes(t *testing.T) {
require.NotNil(t, hc.gotBody, r.URL.Path)
body, err := io.ReadAll(r.Body)
- assert.NoError(t, err)
+ require.NoError(t, err)
w.WriteHeader(200)
hc.gotBody <- body
}))
@@ -288,7 +288,7 @@ func TestWebhookDeliverSpecificTypes(t *testing.T) {
p := pushTestPayload()
data, err := p.JSONPayload()
- assert.NoError(t, err)
+ require.NoError(t, err)
for typ, hc := range cases {
typ := typ
@@ -304,7 +304,7 @@ func TestWebhookDeliverSpecificTypes(t *testing.T) {
ContentType: 0, // set to 0 so that falling back to default request fails with "invalid content type"
Meta: "{}",
}
- assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook))
+ require.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook))
hookTask := &webhook_model.HookTask{
HookID: hook.ID,
@@ -314,10 +314,10 @@ func TestWebhookDeliverSpecificTypes(t *testing.T) {
}
hookTask, err := webhook_model.CreateHookTask(db.DefaultContext, hookTask)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotNil(t, hookTask)
- assert.NoError(t, Deliver(context.Background(), hookTask))
+ require.NoError(t, Deliver(context.Background(), hookTask))
select {
case gotBody := <-hc.gotBody:
assert.NotEqual(t, string(data), string(gotBody), "request body must be different from the event payload")
diff --git a/services/webhook/dingtalk_test.go b/services/webhook/dingtalk_test.go
index 073904f660..d0a2d48908 100644
--- a/services/webhook/dingtalk_test.go
+++ b/services/webhook/dingtalk_test.go
@@ -247,6 +247,6 @@ func TestDingTalkJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body DingtalkPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\r\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", body.ActionCard.Text)
}
diff --git a/services/webhook/discord_test.go b/services/webhook/discord_test.go
index 895914ab2f..73be143f46 100644
--- a/services/webhook/discord_test.go
+++ b/services/webhook/discord_test.go
@@ -286,6 +286,6 @@ func TestDiscordJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body DiscordPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", body.Embeds[0].Description)
}
diff --git a/services/webhook/feishu_test.go b/services/webhook/feishu_test.go
index f591133cbd..9744571b39 100644
--- a/services/webhook/feishu_test.go
+++ b/services/webhook/feishu_test.go
@@ -188,6 +188,6 @@ func TestFeishuJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body FeishuPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[test/repo:test] \r\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\r\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", body.Content.Text)
}
diff --git a/services/webhook/matrix_test.go b/services/webhook/matrix_test.go
index 7031a45bec..6cedb15ef3 100644
--- a/services/webhook/matrix_test.go
+++ b/services/webhook/matrix_test.go
@@ -221,7 +221,7 @@ func TestMatrixJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body MatrixPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] user1 pushed 2 commits to [test](http://localhost:3000/test/repo/src/branch/test):\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1", body.Body)
}
diff --git a/services/webhook/msteams_test.go b/services/webhook/msteams_test.go
index c63ad1f89a..a97e9f3de3 100644
--- a/services/webhook/msteams_test.go
+++ b/services/webhook/msteams_test.go
@@ -450,6 +450,6 @@ func TestMSTeamsJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body MSTeamsPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[test/repo:test] 2 new commits", body.Summary)
}
diff --git a/services/webhook/packagist_test.go b/services/webhook/packagist_test.go
index d7374fde09..320c1c85a1 100644
--- a/services/webhook/packagist_test.go
+++ b/services/webhook/packagist_test.go
@@ -63,7 +63,7 @@ func TestPackagistPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body PackagistPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "https://packagist.org/packages/example", body.PackagistRepository.URL)
})
}
diff --git a/services/webhook/slack_test.go b/services/webhook/slack_test.go
index 58f4e78878..3d801843ae 100644
--- a/services/webhook/slack_test.go
+++ b/services/webhook/slack_test.go
@@ -189,7 +189,7 @@ func TestSlackJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body SlackPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "[:] 2 new commits pushed by user1", body.Text)
}
@@ -217,11 +217,12 @@ func TestSlackMetadata(t *testing.T) {
Meta: `{"channel": "foo", "username": "username", "color": "blue"}`,
}
slackHook := slackHandler{}.Metadata(w)
- assert.Equal(t, *slackHook.(*SlackMeta), SlackMeta{
+ assert.Equal(t, SlackMeta{
Channel: "foo",
Username: "username",
Color: "blue",
- })
+ },
+ *slackHook.(*SlackMeta))
}
func TestSlackToHook(t *testing.T) {
@@ -242,9 +243,9 @@ func TestSlackToHook(t *testing.T) {
},
}
h, err := ToHook("repoLink", w)
- assert.NoError(t, err)
+ require.NoError(t, err)
- assert.Equal(t, h.Config, map[string]string{
+ assert.Equal(t, map[string]string{
"url": "https://slack.example.com",
"content_type": "json",
@@ -252,13 +253,13 @@ func TestSlackToHook(t *testing.T) {
"color": "blue",
"icon_url": "",
"username": "username",
- })
- assert.Equal(t, h.URL, "https://slack.example.com")
- assert.Equal(t, h.ContentType, "json")
- assert.Equal(t, h.Metadata, &SlackMeta{
+ }, h.Config)
+ assert.Equal(t, "https://slack.example.com", h.URL)
+ assert.Equal(t, "json", h.ContentType)
+ assert.Equal(t, &SlackMeta{
Channel: "foo",
Username: "username",
IconURL: "",
Color: "blue",
- })
+ }, h.Metadata)
}
diff --git a/services/webhook/sourcehut/builds_test.go b/services/webhook/sourcehut/builds_test.go
index 64c6081076..020bbfc9ad 100644
--- a/services/webhook/sourcehut/builds_test.go
+++ b/services/webhook/sourcehut/builds_test.go
@@ -32,7 +32,7 @@ func gitInit(t testing.TB) {
return
}
t.Cleanup(test.MockVariableValue(&setting.Git.HomePath, t.TempDir()))
- assert.NoError(t, git.InitSimple(context.Background()))
+ require.NoError(t, git.InitSimple(context.Background()))
}
func TestSourcehutBuildsPayload(t *testing.T) {
@@ -129,16 +129,16 @@ tasks:
p := &api.DeletePayload{}
pl, err := pc.Delete(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("Fork", func(t *testing.T) {
p := &api.ForkPayload{}
pl, err := pc.Fork(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("Push/simple", func(t *testing.T) {
@@ -250,29 +250,29 @@ triggers:
p.Action = api.HookIssueOpened
pl, err := pc.Issue(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
p.Action = api.HookIssueClosed
pl, err = pc.Issue(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("IssueComment", func(t *testing.T) {
p := &api.IssueCommentPayload{}
pl, err := pc.IssueComment(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("PullRequest", func(t *testing.T) {
p := &api.PullRequestPayload{}
pl, err := pc.PullRequest(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("PullRequestComment", func(t *testing.T) {
@@ -281,8 +281,8 @@ triggers:
}
pl, err := pc.IssueComment(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("Review", func(t *testing.T) {
@@ -290,24 +290,24 @@ triggers:
p.Action = api.HookIssueReviewed
pl, err := pc.Review(p, webhook_module.HookEventPullRequestReviewApproved)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("Repository", func(t *testing.T) {
p := &api.RepositoryPayload{}
pl, err := pc.Repository(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("Package", func(t *testing.T) {
p := &api.PackagePayload{}
pl, err := pc.Package(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("Wiki", func(t *testing.T) {
@@ -315,26 +315,26 @@ triggers:
p.Action = api.HookWikiCreated
pl, err := pc.Wiki(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
p.Action = api.HookWikiEdited
pl, err = pc.Wiki(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
p.Action = api.HookWikiDeleted
pl, err = pc.Wiki(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
t.Run("Release", func(t *testing.T) {
p := &api.ReleasePayload{}
pl, err := pc.Release(p)
- require.Equal(t, err, shared.ErrPayloadTypeNotSupported)
- require.Equal(t, pl, graphqlPayload[buildsVariables]{})
+ require.Equal(t, shared.ErrPayloadTypeNotSupported, err)
+ require.Equal(t, graphqlPayload[buildsVariables]{}, pl)
})
}
@@ -388,7 +388,7 @@ func TestSourcehutJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body graphqlPayload[buildsVariables]
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.Equal(t, "json test", body.Variables.Note)
}
@@ -405,7 +405,7 @@ func CreateDeclarativeRepo(t *testing.T, owner *user_model.User, name string, en
Readme: "Default",
DefaultBranch: "main",
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEmpty(t, repo)
t.Cleanup(func() {
repo_service.DeleteRepository(db.DefaultContext, owner, repo, false)
@@ -421,7 +421,7 @@ func CreateDeclarativeRepo(t *testing.T, owner *user_model.User, name string, en
}
err := repo_service.UpdateRepositoryUnits(db.DefaultContext, repo, units, disabledUnits)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
var sha string
@@ -444,7 +444,7 @@ func CreateDeclarativeRepo(t *testing.T, owner *user_model.User, name string, en
Committer: time.Now(),
},
})
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.NotEmpty(t, resp)
sha = resp.Commit.SHA
diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go
index 724c41012f..74eb133922 100644
--- a/services/webhook/telegram.go
+++ b/services/webhook/telegram.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/markup"
api "code.gitea.io/gitea/modules/structs"
webhook_module "code.gitea.io/gitea/modules/webhook"
"code.gitea.io/gitea/services/forms"
@@ -213,7 +214,7 @@ func (t telegramConvertor) Package(p *api.PackagePayload) (TelegramPayload, erro
func createTelegramPayload(message string) TelegramPayload {
return TelegramPayload{
- Message: strings.TrimSpace(message),
+ Message: markup.Sanitize(strings.TrimSpace(message)),
ParseMode: "HTML",
DisableWebPreview: true,
}
diff --git a/services/webhook/telegram_test.go b/services/webhook/telegram_test.go
index ff6455e16b..0e27535a03 100644
--- a/services/webhook/telegram_test.go
+++ b/services/webhook/telegram_test.go
@@ -23,7 +23,7 @@ func TestTelegramPayload(t *testing.T) {
p := createTelegramPayload("testMsg ")
assert.Equal(t, "HTML", p.ParseMode)
- assert.Equal(t, true, p.DisableWebPreview)
+ assert.True(t, p.DisableWebPreview)
assert.Equal(t, "testMsg", p.Message)
})
@@ -33,7 +33,7 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Create(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] branch test created`, pl.Message)
+ assert.Equal(t, `[test/repo] branch test created`, pl.Message)
})
t.Run("Delete", func(t *testing.T) {
@@ -42,7 +42,7 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Delete(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] branch test deleted`, pl.Message)
+ assert.Equal(t, `[test/repo] branch test deleted`, pl.Message)
})
t.Run("Fork", func(t *testing.T) {
@@ -51,7 +51,7 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Fork(p)
require.NoError(t, err)
- assert.Equal(t, `test/repo2 is forked to test/repo`, pl.Message)
+ assert.Equal(t, `test/repo2 is forked to test/repo`, pl.Message)
})
t.Run("Push", func(t *testing.T) {
@@ -60,7 +60,9 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Push(p)
require.NoError(t, err)
- assert.Equal(t, "[test/repo:test] 2 new commits\n[2020558] commit message - user1\n[2020558] commit message - user1", pl.Message)
+ assert.Equal(t, `[test/repo:test] 2 new commits
+[2020558] commit message - user1
+[2020558] commit message - user1`, pl.Message)
})
t.Run("Issue", func(t *testing.T) {
@@ -70,13 +72,15 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Issue(p)
require.NoError(t, err)
- assert.Equal(t, "[test/repo] Issue opened: #2 crash by user1\n\nissue body", pl.Message)
+ assert.Equal(t, `[test/repo] Issue opened: #2 crash by user1
+
+issue body`, pl.Message)
p.Action = api.HookIssueClosed
pl, err = tc.Issue(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.Message)
+ assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.Message)
})
t.Run("IssueComment", func(t *testing.T) {
@@ -85,7 +89,8 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.IssueComment(p)
require.NoError(t, err)
- assert.Equal(t, "[test/repo] New comment on issue #2 crash by user1\nmore info needed", pl.Message)
+ assert.Equal(t, `[test/repo] New comment on issue #2 crash by user1
+more info needed`, pl.Message)
})
t.Run("PullRequest", func(t *testing.T) {
@@ -94,7 +99,8 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.PullRequest(p)
require.NoError(t, err)
- assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug by user1\nfixes bug #2", pl.Message)
+ assert.Equal(t, `[test/repo] Pull request opened: #12 Fix bug by user1
+fixes bug #2`, pl.Message)
})
t.Run("PullRequestComment", func(t *testing.T) {
@@ -103,7 +109,8 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.IssueComment(p)
require.NoError(t, err)
- assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug by user1\nchanges requested", pl.Message)
+ assert.Equal(t, `[test/repo] New comment on pull request #12 Fix bug by user1
+changes requested`, pl.Message)
})
t.Run("Review", func(t *testing.T) {
@@ -113,7 +120,8 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Review(p, webhook_module.HookEventPullRequestReviewApproved)
require.NoError(t, err)
- assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug\ngood job", pl.Message)
+ assert.Equal(t, `[test/repo] Pull request review approved: #12 Fix bug
+good job`, pl.Message)
})
t.Run("Repository", func(t *testing.T) {
@@ -122,7 +130,7 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Repository(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] Repository created`, pl.Message)
+ assert.Equal(t, `[test/repo] Repository created`, pl.Message)
})
t.Run("Package", func(t *testing.T) {
@@ -131,7 +139,7 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Package(p)
require.NoError(t, err)
- assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.Message)
+ assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.Message)
})
t.Run("Wiki", func(t *testing.T) {
@@ -141,19 +149,19 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Wiki(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.Message)
+ assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.Message)
p.Action = api.HookWikiEdited
pl, err = tc.Wiki(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.Message)
+ assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.Message)
p.Action = api.HookWikiDeleted
pl, err = tc.Wiki(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.Message)
+ assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.Message)
})
t.Run("Release", func(t *testing.T) {
@@ -162,7 +170,7 @@ func TestTelegramPayload(t *testing.T) {
pl, err := tc.Release(p)
require.NoError(t, err)
- assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.Message)
+ assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.Message)
})
}
@@ -197,6 +205,8 @@ func TestTelegramJSONPayload(t *testing.T) {
assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
var body TelegramPayload
err = json.NewDecoder(req.Body).Decode(&body)
- assert.NoError(t, err)
- assert.Equal(t, "[test/repo:test] 2 new commits\n[2020558] commit message - user1\n[2020558] commit message - user1", body.Message)
+ require.NoError(t, err)
+ assert.Equal(t, `[test/repo:test] 2 new commits
+[2020558] commit message - user1
+[2020558] commit message - user1`, body.Message)
}
diff --git a/services/webhook/webhook_test.go b/services/webhook/webhook_test.go
index f8b66d46fc..816940a2b5 100644
--- a/services/webhook/webhook_test.go
+++ b/services/webhook/webhook_test.go
@@ -15,17 +15,18 @@ import (
webhook_module "code.gitea.io/gitea/modules/webhook"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func activateWebhook(t *testing.T, hookID int64) {
t.Helper()
updated, err := db.GetEngine(db.DefaultContext).ID(hookID).Cols("is_active").Update(webhook_model.Webhook{IsActive: true})
assert.Equal(t, int64(1), updated)
- assert.NoError(t, err)
+ require.NoError(t, err)
}
func TestPrepareWebhooks(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
activateWebhook(t, 1)
@@ -36,7 +37,7 @@ func TestPrepareWebhooks(t *testing.T) {
for _, hookTask := range hookTasks {
unittest.AssertNotExistsBean(t, hookTask)
}
- assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Commits: []*api.PayloadCommit{{}}}))
+ require.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Commits: []*api.PayloadCommit{{}}}))
for _, hookTask := range hookTasks {
unittest.AssertExistsAndLoadBean(t, hookTask)
}
@@ -55,7 +56,7 @@ func eventType(p api.Payloader) webhook_module.HookEventType {
}
func TestPrepareWebhooksBranchFilterMatch(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// branch_filter: {master,feature*}
w := unittest.AssertExistsAndLoadBean(t, &webhook_model.Webhook{ID: 4})
@@ -69,7 +70,7 @@ func TestPrepareWebhooksBranchFilterMatch(t *testing.T) {
t.Run(fmt.Sprintf("%T", p), func(t *testing.T) {
db.DeleteBeans(db.DefaultContext, webhook_model.HookTask{HookID: w.ID})
typ := eventType(p)
- assert.NoError(t, PrepareWebhook(db.DefaultContext, w, typ, p))
+ require.NoError(t, PrepareWebhook(db.DefaultContext, w, typ, p))
unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{
HookID: w.ID,
EventType: typ,
@@ -79,7 +80,7 @@ func TestPrepareWebhooksBranchFilterMatch(t *testing.T) {
}
func TestPrepareWebhooksBranchFilterNoMatch(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
// branch_filter: {master,feature*}
w := unittest.AssertExistsAndLoadBean(t, &webhook_model.Webhook{ID: 4})
@@ -92,7 +93,7 @@ func TestPrepareWebhooksBranchFilterNoMatch(t *testing.T) {
} {
t.Run(fmt.Sprintf("%T", p), func(t *testing.T) {
db.DeleteBeans(db.DefaultContext, webhook_model.HookTask{HookID: w.ID})
- assert.NoError(t, PrepareWebhook(db.DefaultContext, w, eventType(p), p))
+ require.NoError(t, PrepareWebhook(db.DefaultContext, w, eventType(p), p))
unittest.AssertNotExistsBean(t, &webhook_model.HookTask{HookID: w.ID})
})
}
diff --git a/services/wiki/wiki_test.go b/services/wiki/wiki_test.go
index ef0c3a0a3a..efcc13db99 100644
--- a/services/wiki/wiki_test.go
+++ b/services/wiki/wiki_test.go
@@ -17,6 +17,7 @@ import (
_ "code.gitea.io/gitea/models/actions"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
@@ -96,7 +97,7 @@ func TestGitPathToWebPath(t *testing.T) {
{"symbols-%2F", "symbols %2F.md"},
} {
name, err := GitPathToWebPath(test.Filename)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, test.Expected, name)
}
for _, badFilename := range []string{
@@ -104,11 +105,11 @@ func TestGitPathToWebPath(t *testing.T) {
"wrongfileextension.txt",
} {
_, err := GitPathToWebPath(badFilename)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, repo_model.IsErrWikiInvalidFileName(err))
}
_, err := GitPathToWebPath("badescaping%%.md")
- assert.Error(t, err)
+ require.Error(t, err)
assert.False(t, repo_model.IsErrWikiInvalidFileName(err))
}
@@ -143,16 +144,16 @@ func TestRepository_InitWiki(t *testing.T) {
unittest.PrepareTestEnv(t)
// repo1 already has a wiki
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
- assert.NoError(t, InitWiki(git.DefaultContext, repo1))
+ require.NoError(t, InitWiki(git.DefaultContext, repo1))
// repo2 does not already have a wiki
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
- assert.NoError(t, InitWiki(git.DefaultContext, repo2))
+ require.NoError(t, InitWiki(git.DefaultContext, repo2))
assert.True(t, repo2.HasWiki())
}
func TestRepository_AddWikiPage(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
const wikiContent = "This is the wiki content"
const commitMsg = "Commit message"
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
@@ -163,18 +164,17 @@ func TestRepository_AddWikiPage(t *testing.T) {
} {
t.Run("test wiki exist: "+userTitle, func(t *testing.T) {
webPath := UserTitleToWebPath("", userTitle)
- assert.NoError(t, AddWikiPage(git.DefaultContext, doer, repo, webPath, wikiContent, commitMsg))
+ require.NoError(t, AddWikiPage(git.DefaultContext, doer, repo, webPath, wikiContent, commitMsg))
// Now need to show that the page has been added:
gitRepo, err := gitrepo.OpenWikiRepository(git.DefaultContext, repo)
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
+
defer gitRepo.Close()
masterTree, err := gitRepo.GetTree("master")
- assert.NoError(t, err)
+ require.NoError(t, err)
gitPath := WebPathToGitPath(webPath)
entry, err := masterTree.GetTreeEntryByPath(gitPath)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, gitPath, entry.Name(), "%s not added correctly", userTitle)
})
}
@@ -183,7 +183,7 @@ func TestRepository_AddWikiPage(t *testing.T) {
t.Parallel()
// test for already-existing wiki name
err := AddWikiPage(git.DefaultContext, doer, repo, "Home", wikiContent, commitMsg)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, repo_model.IsErrWikiAlreadyExist(err))
})
@@ -191,13 +191,13 @@ func TestRepository_AddWikiPage(t *testing.T) {
t.Parallel()
// test for reserved wiki name
err := AddWikiPage(git.DefaultContext, doer, repo, "_edit", wikiContent, commitMsg)
- assert.Error(t, err)
+ require.Error(t, err)
assert.True(t, repo_model.IsErrWikiReservedName(err))
})
}
func TestRepository_EditWikiPage(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
+ require.NoError(t, unittest.PrepareTestDatabase())
const newWikiContent = "This is the new content"
const commitMsg = "Commit message"
@@ -210,21 +210,21 @@ func TestRepository_EditWikiPage(t *testing.T) {
} {
webPath := UserTitleToWebPath("", newWikiName)
unittest.PrepareTestEnv(t)
- assert.NoError(t, EditWikiPage(git.DefaultContext, doer, repo, "Home", webPath, newWikiContent, commitMsg))
+ require.NoError(t, EditWikiPage(git.DefaultContext, doer, repo, "Home", webPath, newWikiContent, commitMsg))
// Now need to show that the page has been added:
gitRepo, err := gitrepo.OpenWikiRepository(git.DefaultContext, repo)
- assert.NoError(t, err)
+ require.NoError(t, err)
masterTree, err := gitRepo.GetTree("master")
- assert.NoError(t, err)
+ require.NoError(t, err)
gitPath := WebPathToGitPath(webPath)
entry, err := masterTree.GetTreeEntryByPath(gitPath)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, gitPath, entry.Name(), "%s not edited correctly", newWikiName)
if newWikiName != "Home" {
_, err := masterTree.GetTreeEntryByPath("Home.md")
- assert.Error(t, err)
+ require.Error(t, err)
}
gitRepo.Close()
}
@@ -234,28 +234,25 @@ func TestRepository_DeleteWikiPage(t *testing.T) {
unittest.PrepareTestEnv(t)
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- assert.NoError(t, DeleteWikiPage(git.DefaultContext, doer, repo, "Home"))
+ require.NoError(t, DeleteWikiPage(git.DefaultContext, doer, repo, "Home"))
// Now need to show that the page has been added:
gitRepo, err := gitrepo.OpenWikiRepository(git.DefaultContext, repo)
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
defer gitRepo.Close()
masterTree, err := gitRepo.GetTree("master")
- assert.NoError(t, err)
+ require.NoError(t, err)
gitPath := WebPathToGitPath("Home")
_, err = masterTree.GetTreeEntryByPath(gitPath)
- assert.Error(t, err)
+ require.Error(t, err)
}
func TestPrepareWikiFileName(t *testing.T) {
unittest.PrepareTestEnv(t)
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
gitRepo, err := gitrepo.OpenWikiRepository(git.DefaultContext, repo)
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
+
defer gitRepo.Close()
tests := []struct {
@@ -282,7 +279,7 @@ func TestPrepareWikiFileName(t *testing.T) {
webPath := UserTitleToWebPath("", tt.arg)
existence, newWikiPath, err := prepareGitPath(gitRepo, "master", webPath)
if (err != nil) != tt.wantErr {
- assert.NoError(t, err)
+ require.NoError(t, err)
return
}
if existence != tt.existence {
@@ -304,17 +301,16 @@ func TestPrepareWikiFileName_FirstPage(t *testing.T) {
tmpDir := t.TempDir()
err := git.InitRepository(git.DefaultContext, tmpDir, true, git.Sha1ObjectFormat.Name())
- assert.NoError(t, err)
+ require.NoError(t, err)
gitRepo, err := git.OpenRepository(git.DefaultContext, tmpDir)
- if !assert.NoError(t, err) {
- return
- }
+ require.NoError(t, err)
+
defer gitRepo.Close()
existence, newWikiPath, err := prepareGitPath(gitRepo, "master", "Home")
assert.False(t, existence)
- assert.NoError(t, err)
+ require.NoError(t, err)
assert.EqualValues(t, "Home.md", newWikiPath)
}
diff --git a/templates/admin/layout_head.tmpl b/templates/admin/layout_head.tmpl
index 7cc6624d50..8ba47f2f14 100644
--- a/templates/admin/layout_head.tmpl
+++ b/templates/admin/layout_head.tmpl
@@ -1,6 +1,6 @@
{{template "base/head" .ctxData}}