Merge branch 'forgejo' into forgejo-federated-star

This commit is contained in:
Michael Jerger 2024-06-05 07:33:12 +02:00
commit 81236bc9ef
173 changed files with 3165 additions and 1753 deletions

View file

@ -77,7 +77,7 @@ package "code.gitea.io/gitea/models/perm/access"
func GetRepoWriters
package "code.gitea.io/gitea/models/project"
func UpdateBoardSorting
func UpdateColumnSorting
func ChangeProjectStatus
package "code.gitea.io/gitea/models/repo"

View file

@ -22,7 +22,7 @@ jobs:
runs-on: docker
container:
image: ghcr.io/visualon/renovate:37.382.4
image: ghcr.io/visualon/renovate:37.385.0
steps:
- name: Load renovate repo cache

View file

@ -45,6 +45,10 @@ jobs:
container:
image: 'docker.io/node:20-bookworm'
services:
elasticsearch:
image: elasticsearch:7.5.0
env:
discovery.type: single-node
minio:
image: bitnami/minio:2024.3.30
options: >-
@ -85,6 +89,7 @@ jobs:
RACE_ENABLED: 'true'
TAGS: bindata
TEST_REDIS_SERVER: redis:6379
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
test-mysql:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
runs-on: docker

View file

@ -1,6 +1,6 @@
FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.19 as build-env
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.20 as build-env
ARG GOPROXY
ENV GOPROXY ${GOPROXY:-direct}
@ -51,7 +51,7 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \
/go/src/code.gitea.io/gitea/environment-to-ini
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
FROM code.forgejo.org/oci/golang:1.22-alpine3.19
FROM code.forgejo.org/oci/golang:1.22-alpine3.20
ARG RELEASE_VERSION
LABEL maintainer="contact@forgejo.org" \
org.opencontainers.image.authors="Forgejo" \

View file

@ -1,6 +1,6 @@
FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.19 as build-env
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.20 as build-env
ARG GOPROXY
ENV GOPROXY ${GOPROXY:-direct}
@ -49,7 +49,7 @@ RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \
/go/src/code.gitea.io/gitea/environment-to-ini
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
FROM code.forgejo.org/oci/golang:1.22-alpine3.19
FROM code.forgejo.org/oci/golang:1.22-alpine3.20
LABEL maintainer="contact@forgejo.org" \
org.opencontainers.image.authors="Forgejo" \
org.opencontainers.image.url="https://forgejo.org" \

View file

@ -26,10 +26,10 @@ DIFF ?= diff --unified
XGO_VERSION := go-1.21.x
AIR_PACKAGE ?= github.com/cosmtrek/air@v1 # renovate: datasource=go
AIR_PACKAGE ?= github.com/air-verse/air@v1 # renovate: datasource=go
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v2/cmd/editorconfig-checker@2.8.0 # renovate: datasource=go
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.6.0 # renovate: datasource=go
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.58.2 # renovate: datasource=go
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.59.0 # renovate: datasource=go
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go
MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.5.1 # renovate: datasource=go
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go
@ -249,9 +249,6 @@ help:
@echo " - test-frontend test frontend files"
@echo " - test-backend test backend files"
@echo " - test-e2e-sqlite[\#name.test.e2e] test end to end using playwright and sqlite"
@echo " - update update js and py dependencies"
@echo " - update-js update js dependencies"
@echo " - update-py update py dependencies"
@echo " - webpack build webpack files"
@echo " - svg build svg files"
@echo " - fomantic build fomantic files"
@ -896,23 +893,6 @@ node_modules: package-lock.json
poetry install --no-root
@touch .venv
.PHONY: update
update: update-js update-py
.PHONY: update-js
update-js: node-check | node_modules
npx updates -u -f package.json
rm -rf node_modules package-lock.json
npm install --package-lock
@touch node_modules
.PHONY: update-py
update-py: node-check | node_modules
npx updates -u -f pyproject.toml
rm -rf .venv poetry.lock
poetry install --no-root
@touch .venv
.PHONY: fomantic
fomantic:
rm -rf $(FOMANTIC_WORK_DIR)/build

View file

@ -222,6 +222,9 @@ RUN_USER = ; git
;; Enable exposure of SSH clone URL to anonymous visitors, default is false
;SSH_EXPOSE_ANONYMOUS = false
;;
;; Command template for authorized keys entries
;SSH_AUTHORIZED_KEYS_COMMAND_TEMPLATE = {{.AppPath}} --config={{.CustomConf}} serv key-{{.Key.ID}}
;;
;; Timeout for any write to ssh connections. (Set to -1 to disable all timeouts.)
;; Will default to the PER_WRITE_TIMEOUT.
;SSH_PER_WRITE_TIMEOUT = 30s
@ -407,6 +410,9 @@ USER = root
;; Database connection max life time, default is 0 or 3s mysql (See #6804 & #7071 for reasoning)
;CONN_MAX_LIFETIME = 3s
;;
;; Database connection max idle time, 0 prevents closing due to idle time.
;CONN_MAX_IDLETIME = 0
;;
;; Database maximum number of open connections, default is 100 which is the lowest default from Postgres (MariaDB + MySQL default to 151). Ensure you only increase the value if you configured your database server accordingly.
;MAX_OPEN_CONNS = 100
;;
@ -443,9 +449,6 @@ INTERNAL_TOKEN =
;; How long to remember that a user is logged in before requiring relogin (in days)
;LOGIN_REMEMBER_DAYS = 31
;;
;; Name of the cookie used to store the current username.
;COOKIE_USERNAME = gitea_awesome
;;
;; Name of cookie used to store authentication information.
;COOKIE_REMEMBER_NAME = gitea_incredible
;;
@ -689,6 +692,12 @@ LEVEL = Info
;; Set the default branches range size
;BRANCHES_RANGE_SIZE = 20
;;
;; Print out verbose infos on push to stdout
;VERBOSE_PUSH = true
;;
;; Delay before verbose push infos are printed to stdout
;VERBOSE_PUSH_DELAY = 5s
;;
;; Arguments for command 'git gc', e.g. "--aggressive --auto"
;; see more on http://git-scm.com/docs/git-gc/
;GC_ARGS =
@ -784,6 +793,11 @@ LEVEL = Info
;; Enable this to require captcha validation for login
;REQUIRE_CAPTCHA_FOR_LOGIN = false
;;
;; Requires captcha for external registrations
;REQUIRE_EXTERNAL_REGISTRATION_CAPTCHA = false
;; Requires a password for external registrations
;REQUIRE_EXTERNAL_REGISTRATION_PASSWORD = false
;;
;; Type of captcha you want to use. Options: image, recaptcha, hcaptcha, mcaptcha, cfturnstile.
;CAPTCHA_TYPE = image
;;
@ -953,7 +967,7 @@ LEVEL = Info
;;
;; Preferred Licenses to place at the top of the List
;; The name here must match the filename in options/license or custom/options/license
;PREFERRED_LICENSES = Apache License 2.0,MIT License
;PREFERRED_LICENSES = Apache-2.0,MIT
;;
;; Disable the ability to interact with repositories using the HTTP protocol
;DISABLE_HTTP_GIT = false
@ -963,7 +977,7 @@ LEVEL = Info
;ACCESS_CONTROL_ALLOW_ORIGIN =
;;
;; Force ssh:// clone url instead of scp-style uri when default SSH port is used
;USE_COMPAT_SSH_URI = false
;USE_COMPAT_SSH_URI = true
;;
;; Value for the "go get" request returns the repository url as https or ssh, default is https
;GO_GET_CLONE_URL_PROTOCOL = https
@ -1088,6 +1102,9 @@ LEVEL = Info
;; In default merge messages only include approvers who are official
;DEFAULT_MERGE_MESSAGE_OFFICIAL_APPROVERS_ONLY = true
;;
;; If an squash commit's comment should be populated with the commit messages of the squashed commits
;POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES = false
;;
;; Add co-authored-by and co-committed-by trailers if committer does not match author
;ADD_CO_COMMITTER_TRAILERS = true
;;
@ -1103,7 +1120,7 @@ LEVEL = Info
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; List of reasons why a Pull Request or Issue can be locked
;LOCK_REASONS = Too heated,Off-topic,Resolved,Spam
;LOCK_REASONS = Too heated,Off-topic,Spam,Resolved
;; Maximum number of pinned Issues per repo
;; Set to 0 to disable pinning Issues
;MAX_PINNED = 3
@ -1219,6 +1236,12 @@ LEVEL = Info
;; Number of issues that are displayed on one page
;ISSUE_PAGING_NUM = 20
;;
;; Number of repositories that are displayed on one page when searching.
;REPO_SEARCH_PAGING_NUM = 20
;;
;; Number of members that are displayed on one page
;MEMBERS_PAGING_NUM = 20
;;
;; Number of maximum commits displayed in one activity feed
;FEED_MAX_COMMIT_NUM = 5
;;
@ -1228,6 +1251,9 @@ LEVEL = Info
;; Number of items that are displayed in a single subsitemap
;SITEMAP_PAGING_NUM = 20
;;
;; Number of packages that are displayed on one page
;PACKAGES_PAGING_NUM = 20
;;
;; Number of maximum commits displayed in commit graph.
;GRAPH_MAX_COMMIT_NUM = 100
;;
@ -1244,9 +1270,14 @@ LEVEL = Info
;SHOW_USER_EMAIL = true
;;
;; Set the default theme for the Gitea install
;DEFAULT_THEME = gitea-auto
;DEFAULT_THEME = forgejo-auto
;;
;; All available themes. Allow users select personalized themes regardless of the value of `DEFAULT_THEME`.
;; By default available:
;; - forgejo-auto, forgejo-light, forgejo-dark
;; - gitea-auto, gitea-light, gitea-dark
;; - forgejo-auto-deuteranopia-protanopia, forgejo-light-deuteranopia-protanopia, forgejo-dark-deuteranopia-protanopia
;; - forgejo-auto-tritanopia, forgejo-light-tritanopia, forgejo-dark-tritanopia
;THEMES = gitea-auto,gitea-light,gitea-dark
;;
;; All available reactions users can choose on issues/prs and comments.
@ -1260,7 +1291,7 @@ LEVEL = Info
;; Additional Emojis not defined in the utf8 standard
;; By default we support gitea (:gitea:), to add more copy them to public/assets/img/emoji/emoji_name.png and add it to this config.
;; Dont mistake it for Reactions.
;CUSTOM_EMOJIS = gitea, codeberg, gitlab, git, github, gogs
;CUSTOM_EMOJIS = gitea, codeberg, gitlab, git, github, gogs, forgejo
;;
;; Whether the full name of the users should be shown where possible. If the full name isn't set, the username will be used.
;DEFAULT_SHOW_FULL_NAME = false
@ -1445,6 +1476,11 @@ LEVEL = Info
;; A comma separated list of glob patterns to exclude from the index; ; default is empty
;REPO_INDEXER_EXCLUDE =
;;
;; If vendored files should be excluded.
;; See https://github.com/go-enry/go-enry for more details which files are considered to be vendored.
;REPO_INDEXER_EXCLUDE_VENDORED = true
;;
;; The maximum filesize to include for indexing
;MAX_FILE_SIZE = 1048576
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -1536,7 +1572,7 @@ LEVEL = Info
;;
;; Whether to allow registering via OpenID
;; Do not include to rely on rhw DISABLE_REGISTRATION setting
;;ENABLE_OPENID_SIGNUP = true
;ENABLE_OPENID_SIGNUP = true
;;
;; Allowed URI patterns (POSIX regexp).
;; Space separated.
@ -1810,6 +1846,9 @@ LEVEL = Info
;; Session life time in seconds, default is 86400 (1 day)
;SESSION_LIFE_TIME = 86400
;;
;; Cookie domain name. Default is empty
;DOMAIN =
;;
;; SameSite settings. Either "none", "lax", or "strict"
;SAME_SITE=lax
@ -1862,7 +1901,7 @@ LEVEL = Info
;ENABLED = true
;;
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
;ALLOWED_TYPES = .csv,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip
;ALLOWED_TYPES = .cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip
;;
;; Max size of each file. Defaults to 2048MB
;MAX_SIZE = 2048
@ -1885,7 +1924,10 @@ LEVEL = Info
;; Minio endpoint to connect only available when STORAGE_TYPE is `minio`
;MINIO_ENDPOINT = localhost:9000
;;
;; Minio accessKeyID to connect only available when STORAGE_TYPE is `minio`
;; Minio accessKeyID to connect only available when STORAGE_TYPE is `minio`.
;; If not provided and STORAGE_TYPE is `minio`, will search for credentials in known
;; environment variables (MINIO_ACCESS_KEY_ID, AWS_ACCESS_KEY_ID), credentials files
;; (~/.mc/config.json, ~/.aws/credentials), and EC2 instance metadata.
;MINIO_ACCESS_KEY_ID =
;;
;; Minio secretAccessKey to connect only available when STORAGE_TYPE is `minio`
@ -1894,6 +1936,11 @@ LEVEL = Info
;; Minio bucket to store the attachments only available when STORAGE_TYPE is `minio`
;MINIO_BUCKET = gitea
;;
;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio`
;; Available values: auto, dns, path
;; If empty, it behaves the same as "auto" was set
;MINIO_BUCKET_LOOKUP =
;;
;; Minio location to create bucket only available when STORAGE_TYPE is `minio`
;MINIO_LOCATION = us-east-1
;;
@ -2428,6 +2475,9 @@ LEVEL = Info
;; Allow private addresses defined by RFC 1918, RFC 1122, RFC 4632 and RFC 4291 (false by default)
;; If a domain is allowed by ALLOWED_DOMAINS, this option will be ignored.
;ALLOW_LOCALNETWORKS = false
;;
;; If set to true, completely ignores server certificate validation errors. This option is unsafe.
;SKIP_TLS_VERIFY = false
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -2586,7 +2636,10 @@ LEVEL = Info
;; Minio endpoint to connect only available when STORAGE_TYPE is `minio`
;MINIO_ENDPOINT = localhost:9000
;;
;; Minio accessKeyID to connect only available when STORAGE_TYPE is `minio`
;; Minio accessKeyID to connect only available when STORAGE_TYPE is `minio`.
;; If not provided and STORAGE_TYPE is `minio`, will search for credentials in known
;; environment variables (MINIO_ACCESS_KEY_ID, AWS_ACCESS_KEY_ID), credentials files
;; (~/.mc/config.json, ~/.aws/credentials), and EC2 instance metadata.
;MINIO_ACCESS_KEY_ID =
;;
;; Minio secretAccessKey to connect only available when STORAGE_TYPE is `minio`
@ -2595,6 +2648,11 @@ LEVEL = Info
;; Minio bucket to store the attachments only available when STORAGE_TYPE is `minio`
;MINIO_BUCKET = gitea
;;
;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio`
;; Available values: auto, dns, path
;; If empty, it behaves the same as "auto" was set
;MINIO_BUCKET_LOOKUP =
;;
;; Minio location to create bucket only available when STORAGE_TYPE is `minio`
;MINIO_LOCATION = us-east-1
;;
@ -2637,3 +2695,13 @@ LEVEL = Info
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; storage type
;STORAGE_TYPE = local
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; settings for action artifacts, will override storage setting
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;[storage.actions_artifacts]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; storage type
;STORAGE_TYPE = local

2
go.mod
View file

@ -85,7 +85,7 @@ require (
github.com/pquerna/otp v1.4.0
github.com/prometheus/client_golang v1.18.0
github.com/quasoft/websspi v1.1.2
github.com/redis/go-redis/v9 v9.4.0
github.com/redis/go-redis/v9 v9.5.2
github.com/robfig/cron/v3 v3.0.1
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1
github.com/sassoftware/go-rpmutils v0.2.1-0.20240124161140-277b154961dd

4
go.sum
View file

@ -607,8 +607,8 @@ github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
github.com/quasoft/websspi v1.1.2 h1:/mA4w0LxWlE3novvsoEL6BBA1WnjJATbjkh1kFrTidw=
github.com/quasoft/websspi v1.1.2/go.mod h1:HmVdl939dQ0WIXZhyik+ARdI03M6bQzaSEKcgpFmewk=
github.com/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk=
github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
github.com/redis/go-redis/v9 v9.5.2 h1:L0L3fcSNReTRGyZ6AqAEN0K56wYeYAwapBIhkvh0f3E=
github.com/redis/go-redis/v9 v9.5.2/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rhysd/actionlint v1.6.27 h1:xxwe8YmveBcC8lydW6GoHMGmB6H/MTqUU60F2p10wjw=

View file

@ -54,7 +54,6 @@ type FindTaskOptions struct {
UpdatedBefore timeutil.TimeStamp
StartedBefore timeutil.TimeStamp
RunnerID int64
IDOrderDesc bool
}
func (opts FindTaskOptions) ToConds() builder.Cond {
@ -84,8 +83,5 @@ func (opts FindTaskOptions) ToConds() builder.Cond {
}
func (opts FindTaskOptions) ToOrders() string {
if opts.IDOrderDesc {
return "`id` DESC"
}
return ""
return "`id` DESC"
}

View file

@ -30,7 +30,7 @@ type Statistic struct {
Mirror, Release, AuthSource, Webhook,
Milestone, Label, HookTask,
Team, UpdateTask, Project,
ProjectBoard, Attachment,
ProjectColumn, Attachment,
Branches, Tags, CommitStatus int64
IssueByLabel []IssueByLabelCount
IssueByRepository []IssueByRepositoryCount
@ -115,6 +115,6 @@ func GetStatistic(ctx context.Context) (stats Statistic) {
stats.Counter.Team, _ = e.Count(new(organization.Team))
stats.Counter.Attachment, _ = e.Count(new(repo_model.Attachment))
stats.Counter.Project, _ = e.Count(new(project_model.Project))
stats.Counter.ProjectBoard, _ = e.Count(new(project_model.Board))
stats.Counter.ProjectColumn, _ = e.Count(new(project_model.Column))
return stats
}

View file

@ -0,0 +1 @@
[] # empty

View file

@ -88,17 +88,13 @@ func (opts FindBranchOptions) ToConds() builder.Cond {
func (opts FindBranchOptions) ToOrders() string {
orderBy := opts.OrderBy
if opts.IsDeletedBranch.ValueOrDefault(true) { // if deleted branch included, put them at the end
if orderBy != "" {
orderBy += ", "
}
orderBy += "is_deleted ASC"
}
if orderBy == "" {
// the commit_time might be the same, so add the "name" to make sure the order is stable
return "commit_time DESC, name ASC"
orderBy = "commit_time DESC, name ASC"
}
if opts.IsDeletedBranch.ValueOrDefault(true) { // if deleted branch included, put them at the beginning
orderBy = "is_deleted ASC, " + orderBy
}
return orderBy
}

View file

@ -27,23 +27,27 @@ func init() {
// LoadAssignees load assignees of this issue.
func (issue *Issue) LoadAssignees(ctx context.Context) (err error) {
if issue.isAssigneeLoaded || len(issue.Assignees) > 0 {
return nil
}
// Reset maybe preexisting assignees
issue.Assignees = []*user_model.User{}
issue.Assignee = nil
err = db.GetEngine(ctx).Table("`user`").
if err = db.GetEngine(ctx).Table("`user`").
Join("INNER", "issue_assignees", "assignee_id = `user`.id").
Where("issue_assignees.issue_id = ?", issue.ID).
Find(&issue.Assignees)
if err != nil {
Find(&issue.Assignees); err != nil {
return err
}
issue.isAssigneeLoaded = true
// Check if we have at least one assignee and if yes put it in as `Assignee`
if len(issue.Assignees) > 0 {
issue.Assignee = issue.Assignees[0]
}
return err
return nil
}
// GetAssigneeIDsByIssue returns the IDs of users assigned to an issue

View file

@ -52,6 +52,8 @@ func (err ErrCommentNotExist) Unwrap() error {
return util.ErrNotExist
}
var ErrCommentAlreadyChanged = util.NewInvalidArgumentErrorf("the comment is already changed")
// CommentType defines whether a comment is just a simple comment, an action (like close) or a reference.
type CommentType int
@ -100,8 +102,8 @@ const (
CommentTypeMergePull // 28 merge pull request
CommentTypePullRequestPush // 29 push to PR head branch
CommentTypeProject // 30 Project changed
CommentTypeProjectBoard // 31 Project board changed
CommentTypeProject // 30 Project changed
CommentTypeProjectColumn // 31 Project column changed
CommentTypeDismissReview // 32 Dismiss Review
@ -146,7 +148,7 @@ var commentStrings = []string{
"merge_pull",
"pull_push",
"project",
"project_board",
"project_board", // FIXME: the name should be project_column
"dismiss_review",
"change_issue_ref",
"pull_scheduled_merge",
@ -262,6 +264,7 @@ type Comment struct {
Line int64 // - previous line / + proposed line
TreePath string
Content string `xorm:"LONGTEXT"`
ContentVersion int `xorm:"NOT NULL DEFAULT 0"`
RenderedContent template.HTML `xorm:"-"`
// Path represents the 4 lines of code cemented by this comment
@ -1119,7 +1122,7 @@ func UpdateCommentInvalidate(ctx context.Context, c *Comment) error {
}
// UpdateComment updates information of comment.
func UpdateComment(ctx context.Context, c *Comment, doer *user_model.User) error {
func UpdateComment(ctx context.Context, c *Comment, contentVersion int, doer *user_model.User) error {
ctx, committer, err := db.TxContext(ctx)
if err != nil {
return err
@ -1139,9 +1142,15 @@ func UpdateComment(ctx context.Context, c *Comment, doer *user_model.User) error
// see https://codeberg.org/forgejo/forgejo/pulls/764#issuecomment-1023801
c.UpdatedUnix = c.Issue.UpdatedUnix
}
if _, err := sess.Update(c); err != nil {
c.ContentVersion = contentVersion + 1
affected, err := sess.Where("content_version = ?", contentVersion).Update(c)
if err != nil {
return err
}
if affected == 0 {
return ErrCommentAlreadyChanged
}
if err := c.AddCrossReferences(ctx, doer, true); err != nil {
return err
}

View file

@ -16,25 +16,25 @@ import (
// CommentList defines a list of comments
type CommentList []*Comment
func (comments CommentList) getPosterIDs() []int64 {
return container.FilterSlice(comments, func(c *Comment) (int64, bool) {
return c.PosterID, c.PosterID > 0
})
}
// LoadPosters loads posters
func (comments CommentList) LoadPosters(ctx context.Context) error {
if len(comments) == 0 {
return nil
}
posterMaps, err := getPosters(ctx, comments.getPosterIDs())
posterIDs := container.FilterSlice(comments, func(c *Comment) (int64, bool) {
return c.PosterID, c.Poster == nil && c.PosterID > 0
})
posterMaps, err := getPostersByIDs(ctx, posterIDs)
if err != nil {
return err
}
for _, comment := range comments {
comment.Poster = getPoster(comment.PosterID, posterMaps)
if comment.Poster == nil {
comment.Poster = getPoster(comment.PosterID, posterMaps)
}
}
return nil
}

View file

@ -94,33 +94,39 @@ func (err ErrIssueWasClosed) Error() string {
return fmt.Sprintf("Issue [%d] %d was already closed", err.ID, err.Index)
}
var ErrIssueAlreadyChanged = util.NewInvalidArgumentErrorf("the issue is already changed")
// Issue represents an issue or pull request of repository.
type Issue struct {
ID int64 `xorm:"pk autoincr"`
RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"`
Repo *repo_model.Repository `xorm:"-"`
Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository.
PosterID int64 `xorm:"INDEX"`
Poster *user_model.User `xorm:"-"`
OriginalAuthor string
OriginalAuthorID int64 `xorm:"index"`
Title string `xorm:"name"`
Content string `xorm:"LONGTEXT"`
RenderedContent template.HTML `xorm:"-"`
Labels []*Label `xorm:"-"`
MilestoneID int64 `xorm:"INDEX"`
Milestone *Milestone `xorm:"-"`
Project *project_model.Project `xorm:"-"`
Priority int
AssigneeID int64 `xorm:"-"`
Assignee *user_model.User `xorm:"-"`
IsClosed bool `xorm:"INDEX"`
IsRead bool `xorm:"-"`
IsPull bool `xorm:"INDEX"` // Indicates whether is a pull request or not.
PullRequest *PullRequest `xorm:"-"`
NumComments int
Ref string
PinOrder int `xorm:"DEFAULT 0"`
ID int64 `xorm:"pk autoincr"`
RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"`
Repo *repo_model.Repository `xorm:"-"`
Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository.
PosterID int64 `xorm:"INDEX"`
Poster *user_model.User `xorm:"-"`
OriginalAuthor string
OriginalAuthorID int64 `xorm:"index"`
Title string `xorm:"name"`
Content string `xorm:"LONGTEXT"`
RenderedContent template.HTML `xorm:"-"`
ContentVersion int `xorm:"NOT NULL DEFAULT 0"`
Labels []*Label `xorm:"-"`
isLabelsLoaded bool `xorm:"-"`
MilestoneID int64 `xorm:"INDEX"`
Milestone *Milestone `xorm:"-"`
isMilestoneLoaded bool `xorm:"-"`
Project *project_model.Project `xorm:"-"`
Priority int
AssigneeID int64 `xorm:"-"`
Assignee *user_model.User `xorm:"-"`
isAssigneeLoaded bool `xorm:"-"`
IsClosed bool `xorm:"INDEX"`
IsRead bool `xorm:"-"`
IsPull bool `xorm:"INDEX"` // Indicates whether is a pull request or not.
PullRequest *PullRequest `xorm:"-"`
NumComments int
Ref string
PinOrder int `xorm:"DEFAULT 0"`
DeadlineUnix timeutil.TimeStamp `xorm:"INDEX"`
@ -131,11 +137,12 @@ type Issue struct {
ClosedUnix timeutil.TimeStamp `xorm:"INDEX"`
NoAutoTime bool `xorm:"-"`
Attachments []*repo_model.Attachment `xorm:"-"`
Comments CommentList `xorm:"-"`
Reactions ReactionList `xorm:"-"`
TotalTrackedTime int64 `xorm:"-"`
Assignees []*user_model.User `xorm:"-"`
Attachments []*repo_model.Attachment `xorm:"-"`
isAttachmentsLoaded bool `xorm:"-"`
Comments CommentList `xorm:"-"`
Reactions ReactionList `xorm:"-"`
TotalTrackedTime int64 `xorm:"-"`
Assignees []*user_model.User `xorm:"-"`
// IsLocked limits commenting abilities to users on an issue
// with write access
@ -187,6 +194,19 @@ func (issue *Issue) LoadRepo(ctx context.Context) (err error) {
return nil
}
func (issue *Issue) LoadAttachments(ctx context.Context) (err error) {
if issue.isAttachmentsLoaded || issue.Attachments != nil {
return nil
}
issue.Attachments, err = repo_model.GetAttachmentsByIssueID(ctx, issue.ID)
if err != nil {
return fmt.Errorf("getAttachmentsByIssueID [%d]: %w", issue.ID, err)
}
issue.isAttachmentsLoaded = true
return nil
}
// IsTimetrackerEnabled returns true if the repo enables timetracking
func (issue *Issue) IsTimetrackerEnabled(ctx context.Context) bool {
if err := issue.LoadRepo(ctx); err != nil {
@ -287,11 +307,12 @@ func (issue *Issue) loadReactions(ctx context.Context) (err error) {
// LoadMilestone load milestone of this issue.
func (issue *Issue) LoadMilestone(ctx context.Context) (err error) {
if (issue.Milestone == nil || issue.Milestone.ID != issue.MilestoneID) && issue.MilestoneID > 0 {
if !issue.isMilestoneLoaded && (issue.Milestone == nil || issue.Milestone.ID != issue.MilestoneID) && issue.MilestoneID > 0 {
issue.Milestone, err = GetMilestoneByRepoID(ctx, issue.RepoID, issue.MilestoneID)
if err != nil && !IsErrMilestoneNotExist(err) {
return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %w", issue.RepoID, issue.MilestoneID, err)
}
issue.isMilestoneLoaded = true
}
return nil
}
@ -327,11 +348,8 @@ func (issue *Issue) LoadAttributes(ctx context.Context) (err error) {
return err
}
if issue.Attachments == nil {
issue.Attachments, err = repo_model.GetAttachmentsByIssueID(ctx, issue.ID)
if err != nil {
return fmt.Errorf("getAttachmentsByIssueID [%d]: %w", issue.ID, err)
}
if err = issue.LoadAttachments(ctx); err != nil {
return err
}
if err = issue.loadComments(ctx); err != nil {
@ -350,6 +368,13 @@ func (issue *Issue) LoadAttributes(ctx context.Context) (err error) {
return issue.loadReactions(ctx)
}
func (issue *Issue) ResetAttributesLoaded() {
issue.isLabelsLoaded = false
issue.isMilestoneLoaded = false
issue.isAttachmentsLoaded = false
issue.isAssigneeLoaded = false
}
// GetIsRead load the `IsRead` field of the issue
func (issue *Issue) GetIsRead(ctx context.Context, userID int64) error {
issueUser := &IssueUser{IssueID: issue.ID, UID: userID}

View file

@ -111,6 +111,7 @@ func NewIssueLabel(ctx context.Context, issue *Issue, label *Label, doer *user_m
return err
}
issue.isLabelsLoaded = false
issue.Labels = nil
if err = issue.LoadLabels(ctx); err != nil {
return err
@ -160,6 +161,8 @@ func NewIssueLabels(ctx context.Context, issue *Issue, labels []*Label, doer *us
return err
}
// reload all labels
issue.isLabelsLoaded = false
issue.Labels = nil
if err = issue.LoadLabels(ctx); err != nil {
return err
@ -325,11 +328,12 @@ func FixIssueLabelWithOutsideLabels(ctx context.Context) (int64, error) {
// LoadLabels loads labels
func (issue *Issue) LoadLabels(ctx context.Context) (err error) {
if issue.Labels == nil && issue.ID != 0 {
if !issue.isLabelsLoaded && issue.Labels == nil && issue.ID != 0 {
issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID)
if err != nil {
return fmt.Errorf("getLabelsByIssueID [%d]: %w", issue.ID, err)
}
issue.isLabelsLoaded = true
}
return nil
}

View file

@ -73,29 +73,29 @@ func (issues IssueList) LoadRepositories(ctx context.Context) (repo_model.Reposi
return repo_model.ValuesRepository(repoMaps), nil
}
func (issues IssueList) getPosterIDs() []int64 {
return container.FilterSlice(issues, func(issue *Issue) (int64, bool) {
return issue.PosterID, true
})
}
func (issues IssueList) loadPosters(ctx context.Context) error {
func (issues IssueList) LoadPosters(ctx context.Context) error {
if len(issues) == 0 {
return nil
}
posterMaps, err := getPosters(ctx, issues.getPosterIDs())
posterIDs := container.FilterSlice(issues, func(issue *Issue) (int64, bool) {
return issue.PosterID, issue.Poster == nil && issue.PosterID > 0
})
posterMaps, err := getPostersByIDs(ctx, posterIDs)
if err != nil {
return err
}
for _, issue := range issues {
issue.Poster = getPoster(issue.PosterID, posterMaps)
if issue.Poster == nil {
issue.Poster = getPoster(issue.PosterID, posterMaps)
}
}
return nil
}
func getPosters(ctx context.Context, posterIDs []int64) (map[int64]*user_model.User, error) {
func getPostersByIDs(ctx context.Context, posterIDs []int64) (map[int64]*user_model.User, error) {
posterMaps := make(map[int64]*user_model.User, len(posterIDs))
left := len(posterIDs)
for left > 0 {
@ -137,7 +137,7 @@ func (issues IssueList) getIssueIDs() []int64 {
return ids
}
func (issues IssueList) loadLabels(ctx context.Context) error {
func (issues IssueList) LoadLabels(ctx context.Context) error {
if len(issues) == 0 {
return nil
}
@ -169,7 +169,7 @@ func (issues IssueList) loadLabels(ctx context.Context) error {
err = rows.Scan(&labelIssue)
if err != nil {
if err1 := rows.Close(); err1 != nil {
return fmt.Errorf("IssueList.loadLabels: Close: %w", err1)
return fmt.Errorf("IssueList.LoadLabels: Close: %w", err1)
}
return err
}
@ -178,7 +178,7 @@ func (issues IssueList) loadLabels(ctx context.Context) error {
// When there are no rows left and we try to close it.
// Since that is not relevant for us, we can safely ignore it.
if err1 := rows.Close(); err1 != nil {
return fmt.Errorf("IssueList.loadLabels: Close: %w", err1)
return fmt.Errorf("IssueList.LoadLabels: Close: %w", err1)
}
left -= limit
issueIDs = issueIDs[limit:]
@ -186,6 +186,7 @@ func (issues IssueList) loadLabels(ctx context.Context) error {
for _, issue := range issues {
issue.Labels = issueLabels[issue.ID]
issue.isLabelsLoaded = true
}
return nil
}
@ -196,7 +197,7 @@ func (issues IssueList) getMilestoneIDs() []int64 {
})
}
func (issues IssueList) loadMilestones(ctx context.Context) error {
func (issues IssueList) LoadMilestones(ctx context.Context) error {
milestoneIDs := issues.getMilestoneIDs()
if len(milestoneIDs) == 0 {
return nil
@ -221,6 +222,7 @@ func (issues IssueList) loadMilestones(ctx context.Context) error {
for _, issue := range issues {
issue.Milestone = milestoneMaps[issue.MilestoneID]
issue.isMilestoneLoaded = true
}
return nil
}
@ -264,7 +266,7 @@ func (issues IssueList) LoadProjects(ctx context.Context) error {
return nil
}
func (issues IssueList) loadAssignees(ctx context.Context) error {
func (issues IssueList) LoadAssignees(ctx context.Context) error {
if len(issues) == 0 {
return nil
}
@ -311,6 +313,10 @@ func (issues IssueList) loadAssignees(ctx context.Context) error {
for _, issue := range issues {
issue.Assignees = assignees[issue.ID]
if len(issue.Assignees) > 0 {
issue.Assignee = issue.Assignees[0]
}
issue.isAssigneeLoaded = true
}
return nil
}
@ -414,6 +420,7 @@ func (issues IssueList) LoadAttachments(ctx context.Context) (err error) {
for _, issue := range issues {
issue.Attachments = attachments[issue.ID]
issue.isAttachmentsLoaded = true
}
return nil
}
@ -539,23 +546,23 @@ func (issues IssueList) LoadAttributes(ctx context.Context) error {
return fmt.Errorf("issue.loadAttributes: LoadRepositories: %w", err)
}
if err := issues.loadPosters(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: loadPosters: %w", err)
if err := issues.LoadPosters(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: LoadPosters: %w", err)
}
if err := issues.loadLabels(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: loadLabels: %w", err)
if err := issues.LoadLabels(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: LoadLabels: %w", err)
}
if err := issues.loadMilestones(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: loadMilestones: %w", err)
if err := issues.LoadMilestones(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: LoadMilestones: %w", err)
}
if err := issues.LoadProjects(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: loadProjects: %w", err)
}
if err := issues.loadAssignees(ctx); err != nil {
if err := issues.LoadAssignees(ctx); err != nil {
return fmt.Errorf("issue.loadAttributes: loadAssignees: %w", err)
}

View file

@ -37,22 +37,22 @@ func (issue *Issue) projectID(ctx context.Context) int64 {
return ip.ProjectID
}
// ProjectBoardID return project board id if issue was assigned to one
func (issue *Issue) ProjectBoardID(ctx context.Context) int64 {
// ProjectColumnID return project column id if issue was assigned to one
func (issue *Issue) ProjectColumnID(ctx context.Context) int64 {
var ip project_model.ProjectIssue
has, err := db.GetEngine(ctx).Where("issue_id=?", issue.ID).Get(&ip)
if err != nil || !has {
return 0
}
return ip.ProjectBoardID
return ip.ProjectColumnID
}
// LoadIssuesFromBoard load issues assigned to this board
func LoadIssuesFromBoard(ctx context.Context, b *project_model.Board) (IssueList, error) {
// LoadIssuesFromColumn load issues assigned to this column
func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueList, error) {
issueList, err := Issues(ctx, &IssuesOptions{
ProjectBoardID: b.ID,
ProjectID: b.ProjectID,
SortType: "project-column-sorting",
ProjectColumnID: b.ID,
ProjectID: b.ProjectID,
SortType: "project-column-sorting",
})
if err != nil {
return nil, err
@ -60,9 +60,9 @@ func LoadIssuesFromBoard(ctx context.Context, b *project_model.Board) (IssueList
if b.Default {
issues, err := Issues(ctx, &IssuesOptions{
ProjectBoardID: db.NoConditionID,
ProjectID: b.ProjectID,
SortType: "project-column-sorting",
ProjectColumnID: db.NoConditionID,
ProjectID: b.ProjectID,
SortType: "project-column-sorting",
})
if err != nil {
return nil, err
@ -77,11 +77,11 @@ func LoadIssuesFromBoard(ctx context.Context, b *project_model.Board) (IssueList
return issueList, nil
}
// LoadIssuesFromBoardList load issues assigned to the boards
func LoadIssuesFromBoardList(ctx context.Context, bs project_model.BoardList) (map[int64]IssueList, error) {
// LoadIssuesFromColumnList load issues assigned to the columns
func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList) (map[int64]IssueList, error) {
issuesMap := make(map[int64]IssueList, len(bs))
for i := range bs {
il, err := LoadIssuesFromBoard(ctx, bs[i])
il, err := LoadIssuesFromColumn(ctx, bs[i])
if err != nil {
return nil, err
}
@ -110,7 +110,7 @@ func IssueAssignOrRemoveProject(ctx context.Context, issue *Issue, doer *user_mo
return util.NewPermissionDeniedErrorf("issue %d can't be accessed by project %d", issue.ID, newProject.ID)
}
if newColumnID == 0 {
newDefaultColumn, err := newProject.GetDefaultBoard(ctx)
newDefaultColumn, err := newProject.GetDefaultColumn(ctx)
if err != nil {
return err
}
@ -153,10 +153,10 @@ func IssueAssignOrRemoveProject(ctx context.Context, issue *Issue, doer *user_mo
}
newSorting := util.Iif(res.IssueCount > 0, res.MaxSorting+1, 0)
return db.Insert(ctx, &project_model.ProjectIssue{
IssueID: issue.ID,
ProjectID: newProjectID,
ProjectBoardID: newColumnID,
Sorting: newSorting,
IssueID: issue.ID,
ProjectID: newProjectID,
ProjectColumnID: newColumnID,
Sorting: newSorting,
})
})
}

View file

@ -33,7 +33,7 @@ type IssuesOptions struct { //nolint
SubscriberID int64
MilestoneIDs []int64
ProjectID int64
ProjectBoardID int64
ProjectColumnID int64
IsClosed optional.Option[bool]
IsPull optional.Option[bool]
LabelIDs []int64
@ -169,12 +169,12 @@ func applyProjectCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Sessio
return sess
}
func applyProjectBoardCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
// opts.ProjectBoardID == 0 means all project boards,
func applyProjectColumnCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
// opts.ProjectColumnID == 0 means all project columns,
// do not need to apply any condition
if opts.ProjectBoardID > 0 {
sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": opts.ProjectBoardID}))
} else if opts.ProjectBoardID == db.NoConditionID {
if opts.ProjectColumnID > 0 {
sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": opts.ProjectColumnID}))
} else if opts.ProjectColumnID == db.NoConditionID {
sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": 0}))
}
return sess
@ -246,7 +246,7 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
applyProjectCondition(sess, opts)
applyProjectBoardCondition(sess, opts)
applyProjectColumnCondition(sess, opts)
if opts.IsPull.Has() {
sess.And("issue.is_pull=?", opts.IsPull.Value())

View file

@ -25,17 +25,18 @@ import (
"xorm.io/builder"
)
// UpdateIssueCols updates cols of issue
func UpdateIssueCols(ctx context.Context, issue *Issue, cols ...string) error {
_, err := UpdateIssueColsWithCond(ctx, issue, builder.NewCond(), cols...)
return err
}
func UpdateIssueColsWithCond(ctx context.Context, issue *Issue, cond builder.Cond, cols ...string) (int64, error) {
sess := db.GetEngine(ctx).ID(issue.ID)
if issue.NoAutoTime {
cols = append(cols, []string{"updated_unix"}...)
sess.NoAutoTime()
}
if _, err := sess.Cols(cols...).Update(issue); err != nil {
return err
}
return nil
return sess.Cols(cols...).Where(cond).Update(issue)
}
func changeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.User, isClosed, isMergePull bool) (*Comment, error) {
@ -250,7 +251,7 @@ func UpdateIssueAttachments(ctx context.Context, issueID int64, uuids []string)
}
// ChangeIssueContent changes issue content, as the given user.
func ChangeIssueContent(ctx context.Context, issue *Issue, doer *user_model.User, content string) (err error) {
func ChangeIssueContent(ctx context.Context, issue *Issue, doer *user_model.User, content string, contentVersion int) (err error) {
ctx, committer, err := db.TxContext(ctx)
if err != nil {
return err
@ -269,10 +270,16 @@ func ChangeIssueContent(ctx context.Context, issue *Issue, doer *user_model.User
}
issue.Content = content
issue.ContentVersion = contentVersion + 1
if err = UpdateIssueCols(ctx, issue, "content"); err != nil {
expectedContentVersion := builder.NewCond().And(builder.Eq{"content_version": contentVersion})
affected, err := UpdateIssueColsWithCond(ctx, issue, expectedContentVersion, "content", "content_version")
if err != nil {
return fmt.Errorf("UpdateIssueCols: %w", err)
}
if affected == 0 {
return ErrIssueAlreadyChanged
}
historyDate := timeutil.TimeStampNow()
if issue.NoAutoTime {

View file

@ -159,10 +159,11 @@ type PullRequest struct {
ChangedProtectedFiles []string `xorm:"TEXT JSON"`
IssueID int64 `xorm:"INDEX"`
Issue *Issue `xorm:"-"`
Index int64
RequestedReviewers []*user_model.User `xorm:"-"`
IssueID int64 `xorm:"INDEX"`
Issue *Issue `xorm:"-"`
Index int64
RequestedReviewers []*user_model.User `xorm:"-"`
isRequestedReviewersLoaded bool `xorm:"-"`
HeadRepoID int64 `xorm:"INDEX"`
HeadRepo *repo_model.Repository `xorm:"-"`
@ -289,7 +290,7 @@ func (pr *PullRequest) LoadHeadRepo(ctx context.Context) (err error) {
// LoadRequestedReviewers loads the requested reviewers.
func (pr *PullRequest) LoadRequestedReviewers(ctx context.Context) error {
if len(pr.RequestedReviewers) > 0 {
if pr.isRequestedReviewersLoaded || len(pr.RequestedReviewers) > 0 {
return nil
}
@ -297,10 +298,10 @@ func (pr *PullRequest) LoadRequestedReviewers(ctx context.Context) error {
if err != nil {
return err
}
if err = reviews.LoadReviewers(ctx); err != nil {
return err
}
pr.isRequestedReviewersLoaded = true
for _, review := range reviews {
pr.RequestedReviewers = append(pr.RequestedReviewers, review.Reviewer)
}

View file

@ -9,8 +9,10 @@ import (
"code.gitea.io/gitea/models/db"
access_model "code.gitea.io/gitea/models/perm/access"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/util"
@ -129,7 +131,7 @@ func GetPullRequestIDsByCheckStatus(ctx context.Context, status PullRequestStatu
}
// PullRequests returns all pull requests for a base Repo by the given conditions
func PullRequests(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) ([]*PullRequest, int64, error) {
func PullRequests(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) (PullRequestList, int64, error) {
if opts.Page <= 0 {
opts.Page = 1
}
@ -159,50 +161,93 @@ func PullRequests(ctx context.Context, baseRepoID int64, opts *PullRequestsOptio
// PullRequestList defines a list of pull requests
type PullRequestList []*PullRequest
func (prs PullRequestList) LoadAttributes(ctx context.Context) error {
if len(prs) == 0 {
return nil
func (prs PullRequestList) getRepositoryIDs() []int64 {
repoIDs := make(container.Set[int64])
for _, pr := range prs {
if pr.BaseRepo == nil && pr.BaseRepoID > 0 {
repoIDs.Add(pr.BaseRepoID)
}
if pr.HeadRepo == nil && pr.HeadRepoID > 0 {
repoIDs.Add(pr.HeadRepoID)
}
}
return repoIDs.Values()
}
// Load issues.
issueIDs := prs.GetIssueIDs()
issues := make([]*Issue, 0, len(issueIDs))
func (prs PullRequestList) LoadRepositories(ctx context.Context) error {
repoIDs := prs.getRepositoryIDs()
reposMap := make(map[int64]*repo_model.Repository, len(repoIDs))
if err := db.GetEngine(ctx).
Where("id > 0").
In("id", issueIDs).
Find(&issues); err != nil {
return fmt.Errorf("find issues: %w", err)
}
set := make(map[int64]*Issue)
for i := range issues {
set[issues[i].ID] = issues[i]
In("id", repoIDs).
Find(&reposMap); err != nil {
return fmt.Errorf("find repos: %w", err)
}
for _, pr := range prs {
pr.Issue = set[pr.IssueID]
/*
Old code:
pr.Issue.PullRequest = pr // panic here means issueIDs and prs are not in sync
It's worth panic because it's almost impossible to happen under normal use.
But in integration testing, an asynchronous task could read a database that has been reset.
So returning an error would make more sense, let the caller has a choice to ignore it.
*/
if pr.Issue == nil {
return fmt.Errorf("issues and prs may be not in sync: cannot find issue %v for pr %v: %w", pr.IssueID, pr.ID, util.ErrNotExist)
if pr.BaseRepo == nil {
pr.BaseRepo = reposMap[pr.BaseRepoID]
}
if pr.HeadRepo == nil {
pr.HeadRepo = reposMap[pr.HeadRepoID]
pr.isHeadRepoLoaded = true
}
pr.Issue.PullRequest = pr
}
return nil
}
func (prs PullRequestList) LoadAttributes(ctx context.Context) error {
if _, err := prs.LoadIssues(ctx); err != nil {
return err
}
return nil
}
func (prs PullRequestList) LoadIssues(ctx context.Context) (IssueList, error) {
if len(prs) == 0 {
return nil, nil
}
// Load issues.
issueIDs := prs.GetIssueIDs()
issues := make(map[int64]*Issue, len(issueIDs))
if err := db.GetEngine(ctx).
In("id", issueIDs).
Find(&issues); err != nil {
return nil, fmt.Errorf("find issues: %w", err)
}
issueList := make(IssueList, 0, len(prs))
for _, pr := range prs {
if pr.Issue == nil {
pr.Issue = issues[pr.IssueID]
/*
Old code:
pr.Issue.PullRequest = pr // panic here means issueIDs and prs are not in sync
It's worth panic because it's almost impossible to happen under normal use.
But in integration testing, an asynchronous task could read a database that has been reset.
So returning an error would make more sense, let the caller has a choice to ignore it.
*/
if pr.Issue == nil {
return nil, fmt.Errorf("issues and prs may be not in sync: cannot find issue %v for pr %v: %w", pr.IssueID, pr.ID, util.ErrNotExist)
}
}
pr.Issue.PullRequest = pr
if pr.Issue.Repo == nil {
pr.Issue.Repo = pr.BaseRepo
}
issueList = append(issueList, pr.Issue)
}
return issueList, nil
}
// GetIssueIDs returns all issue ids
func (prs PullRequestList) GetIssueIDs() []int64 {
issueIDs := make([]int64, 0, len(prs))
for i := range prs {
issueIDs = append(issueIDs, prs[i].IssueID)
}
return issueIDs
return container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) {
if pr.Issue == nil {
return pr.IssueID, pr.IssueID > 0
}
return 0, false
})
}
// HasMergedPullRequestInRepo returns whether the user(poster) has merged pull-request in the repo

View file

@ -22,6 +22,7 @@ import (
"code.gitea.io/gitea/models/migrations/v1_20"
"code.gitea.io/gitea/models/migrations/v1_21"
"code.gitea.io/gitea/models/migrations/v1_22"
"code.gitea.io/gitea/models/migrations/v1_23"
"code.gitea.io/gitea/models/migrations/v1_6"
"code.gitea.io/gitea/models/migrations/v1_7"
"code.gitea.io/gitea/models/migrations/v1_8"
@ -589,6 +590,9 @@ var migrations = []Migration{
NewMigration("Drop wrongly created table o_auth2_application", v1_22.DropWronglyCreatedTable),
// Gitea 1.22.0-rc1 ends at 299
// v299 -> v300
NewMigration("Add content version to issue and comment table", v1_23.AddContentVersionToIssueAndComment),
}
// GetCurrentDBVersion returns the current db version

View file

@ -60,7 +60,7 @@ func addObjectFormatNameToRepository(x *xorm.Engine) error {
// Here to catch weird edge-cases where column constraints above are
// not applied by the DB backend
_, err := x.Exec("UPDATE repository set object_format_name = 'sha1' WHERE object_format_name = '' or object_format_name IS NULL")
_, err := x.Exec("UPDATE `repository` set `object_format_name` = 'sha1' WHERE `object_format_name` = '' or `object_format_name` IS NULL")
return err
}

View file

@ -15,7 +15,7 @@ import (
func Test_CheckProjectColumnsConsistency(t *testing.T) {
// Prepare and load the testing database
x, deferable := base.PrepareTestEnv(t, 0, new(project.Project), new(project.Board))
x, deferable := base.PrepareTestEnv(t, 0, new(project.Project), new(project.Column))
defer deferable()
if x == nil || t.Failed() {
return
@ -23,22 +23,22 @@ func Test_CheckProjectColumnsConsistency(t *testing.T) {
assert.NoError(t, CheckProjectColumnsConsistency(x))
// check if default board was added
var defaultBoard project.Board
has, err := x.Where("project_id=? AND `default` = ?", 1, true).Get(&defaultBoard)
// check if default column was added
var defaultColumn project.Column
has, err := x.Where("project_id=? AND `default` = ?", 1, true).Get(&defaultColumn)
assert.NoError(t, err)
assert.True(t, has)
assert.Equal(t, int64(1), defaultBoard.ProjectID)
assert.True(t, defaultBoard.Default)
assert.Equal(t, int64(1), defaultColumn.ProjectID)
assert.True(t, defaultColumn.Default)
// check if multiple defaults, previous were removed and last will be kept
expectDefaultBoard, err := project.GetBoard(db.DefaultContext, 2)
expectDefaultColumn, err := project.GetColumn(db.DefaultContext, 2)
assert.NoError(t, err)
assert.Equal(t, int64(2), expectDefaultBoard.ProjectID)
assert.False(t, expectDefaultBoard.Default)
assert.Equal(t, int64(2), expectDefaultColumn.ProjectID)
assert.False(t, expectDefaultColumn.Default)
expectNonDefaultBoard, err := project.GetBoard(db.DefaultContext, 3)
expectNonDefaultColumn, err := project.GetColumn(db.DefaultContext, 3)
assert.NoError(t, err)
assert.Equal(t, int64(2), expectNonDefaultBoard.ProjectID)
assert.True(t, expectNonDefaultBoard.Default)
assert.Equal(t, int64(2), expectNonDefaultColumn.ProjectID)
assert.True(t, expectNonDefaultColumn.Default)
}

View file

@ -0,0 +1,18 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package v1_23 //nolint
import "xorm.io/xorm"
func AddContentVersionToIssueAndComment(x *xorm.Engine) error {
type Issue struct {
ContentVersion int `xorm:"NOT NULL DEFAULT 0"`
}
type Comment struct {
ContentVersion int `xorm:"NOT NULL DEFAULT 0"`
}
return x.Sync(new(Comment), new(Issue))
}

View file

@ -1,389 +0,0 @@
// Copyright 2020 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package project
import (
"context"
"errors"
"fmt"
"regexp"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
"xorm.io/builder"
)
type (
// BoardType is used to represent a project board type
BoardType uint8
// CardType is used to represent a project board card type
CardType uint8
// BoardList is a list of all project boards in a repository
BoardList []*Board
)
const (
// BoardTypeNone is a project board type that has no predefined columns
BoardTypeNone BoardType = iota
// BoardTypeBasicKanban is a project board type that has basic predefined columns
BoardTypeBasicKanban
// BoardTypeBugTriage is a project board type that has predefined columns suited to hunting down bugs
BoardTypeBugTriage
)
const (
// CardTypeTextOnly is a project board card type that is text only
CardTypeTextOnly CardType = iota
// CardTypeImagesAndText is a project board card type that has images and text
CardTypeImagesAndText
)
// BoardColorPattern is a regexp witch can validate BoardColor
var BoardColorPattern = regexp.MustCompile("^#[0-9a-fA-F]{6}$")
// Board is used to represent boards on a project
type Board struct {
ID int64 `xorm:"pk autoincr"`
Title string
Default bool `xorm:"NOT NULL DEFAULT false"` // issues not assigned to a specific board will be assigned to this board
Sorting int8 `xorm:"NOT NULL DEFAULT 0"`
Color string `xorm:"VARCHAR(7)"`
ProjectID int64 `xorm:"INDEX NOT NULL"`
CreatorID int64 `xorm:"NOT NULL"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
// TableName return the real table name
func (Board) TableName() string {
return "project_board"
}
// NumIssues return counter of all issues assigned to the board
func (b *Board) NumIssues(ctx context.Context) int {
c, err := db.GetEngine(ctx).Table("project_issue").
Where("project_id=?", b.ProjectID).
And("project_board_id=?", b.ID).
GroupBy("issue_id").
Cols("issue_id").
Count()
if err != nil {
return 0
}
return int(c)
}
func (b *Board) GetIssues(ctx context.Context) ([]*ProjectIssue, error) {
issues := make([]*ProjectIssue, 0, 5)
if err := db.GetEngine(ctx).Where("project_id=?", b.ProjectID).
And("project_board_id=?", b.ID).
OrderBy("sorting, id").
Find(&issues); err != nil {
return nil, err
}
return issues, nil
}
func init() {
db.RegisterModel(new(Board))
}
// IsBoardTypeValid checks if the project board type is valid
func IsBoardTypeValid(p BoardType) bool {
switch p {
case BoardTypeNone, BoardTypeBasicKanban, BoardTypeBugTriage:
return true
default:
return false
}
}
// IsCardTypeValid checks if the project board card type is valid
func IsCardTypeValid(p CardType) bool {
switch p {
case CardTypeTextOnly, CardTypeImagesAndText:
return true
default:
return false
}
}
func createBoardsForProjectsType(ctx context.Context, project *Project) error {
var items []string
switch project.BoardType {
case BoardTypeBugTriage:
items = setting.Project.ProjectBoardBugTriageType
case BoardTypeBasicKanban:
items = setting.Project.ProjectBoardBasicKanbanType
case BoardTypeNone:
fallthrough
default:
return nil
}
board := Board{
CreatedUnix: timeutil.TimeStampNow(),
CreatorID: project.CreatorID,
Title: "Backlog",
ProjectID: project.ID,
Default: true,
}
if err := db.Insert(ctx, board); err != nil {
return err
}
if len(items) == 0 {
return nil
}
boards := make([]Board, 0, len(items))
for _, v := range items {
boards = append(boards, Board{
CreatedUnix: timeutil.TimeStampNow(),
CreatorID: project.CreatorID,
Title: v,
ProjectID: project.ID,
})
}
return db.Insert(ctx, boards)
}
// maxProjectColumns max columns allowed in a project, this should not bigger than 127
// because sorting is int8 in database
const maxProjectColumns = 20
// NewBoard adds a new project board to a given project
func NewBoard(ctx context.Context, board *Board) error {
if len(board.Color) != 0 && !BoardColorPattern.MatchString(board.Color) {
return fmt.Errorf("bad color code: %s", board.Color)
}
res := struct {
MaxSorting int64
ColumnCount int64
}{}
if _, err := db.GetEngine(ctx).Select("max(sorting) as max_sorting, count(*) as column_count").Table("project_board").
Where("project_id=?", board.ProjectID).Get(&res); err != nil {
return err
}
if res.ColumnCount >= maxProjectColumns {
return fmt.Errorf("NewBoard: maximum number of columns reached")
}
board.Sorting = int8(util.Iif(res.ColumnCount > 0, res.MaxSorting+1, 0))
_, err := db.GetEngine(ctx).Insert(board)
return err
}
// DeleteBoardByID removes all issues references to the project board.
func DeleteBoardByID(ctx context.Context, boardID int64) error {
ctx, committer, err := db.TxContext(ctx)
if err != nil {
return err
}
defer committer.Close()
if err := deleteBoardByID(ctx, boardID); err != nil {
return err
}
return committer.Commit()
}
func deleteBoardByID(ctx context.Context, boardID int64) error {
board, err := GetBoard(ctx, boardID)
if err != nil {
if IsErrProjectBoardNotExist(err) {
return nil
}
return err
}
if board.Default {
return fmt.Errorf("deleteBoardByID: cannot delete default board")
}
// move all issues to the default column
project, err := GetProjectByID(ctx, board.ProjectID)
if err != nil {
return err
}
defaultColumn, err := project.GetDefaultBoard(ctx)
if err != nil {
return err
}
if err = board.moveIssuesToAnotherColumn(ctx, defaultColumn); err != nil {
return err
}
if _, err := db.GetEngine(ctx).ID(board.ID).NoAutoCondition().Delete(board); err != nil {
return err
}
return nil
}
func deleteBoardByProjectID(ctx context.Context, projectID int64) error {
_, err := db.GetEngine(ctx).Where("project_id=?", projectID).Delete(&Board{})
return err
}
// GetBoard fetches the current board of a project
func GetBoard(ctx context.Context, boardID int64) (*Board, error) {
board := new(Board)
has, err := db.GetEngine(ctx).ID(boardID).Get(board)
if err != nil {
return nil, err
} else if !has {
return nil, ErrProjectBoardNotExist{BoardID: boardID}
}
return board, nil
}
// UpdateBoard updates a project board
func UpdateBoard(ctx context.Context, board *Board) error {
var fieldToUpdate []string
if board.Sorting != 0 {
fieldToUpdate = append(fieldToUpdate, "sorting")
}
if board.Title != "" {
fieldToUpdate = append(fieldToUpdate, "title")
}
if len(board.Color) != 0 && !BoardColorPattern.MatchString(board.Color) {
return fmt.Errorf("bad color code: %s", board.Color)
}
fieldToUpdate = append(fieldToUpdate, "color")
_, err := db.GetEngine(ctx).ID(board.ID).Cols(fieldToUpdate...).Update(board)
return err
}
// GetBoards fetches all boards related to a project
func (p *Project) GetBoards(ctx context.Context) (BoardList, error) {
boards := make([]*Board, 0, 5)
if err := db.GetEngine(ctx).Where("project_id=?", p.ID).OrderBy("sorting, id").Find(&boards); err != nil {
return nil, err
}
return boards, nil
}
// GetDefaultBoard return default board and ensure only one exists
func (p *Project) GetDefaultBoard(ctx context.Context) (*Board, error) {
var board Board
has, err := db.GetEngine(ctx).
Where("project_id=? AND `default` = ?", p.ID, true).
Desc("id").Get(&board)
if err != nil {
return nil, err
}
if has {
return &board, nil
}
// create a default board if none is found
board = Board{
ProjectID: p.ID,
Default: true,
Title: "Uncategorized",
CreatorID: p.CreatorID,
}
if _, err := db.GetEngine(ctx).Insert(&board); err != nil {
return nil, err
}
return &board, nil
}
// SetDefaultBoard represents a board for issues not assigned to one
func SetDefaultBoard(ctx context.Context, projectID, boardID int64) error {
return db.WithTx(ctx, func(ctx context.Context) error {
if _, err := GetBoard(ctx, boardID); err != nil {
return err
}
if _, err := db.GetEngine(ctx).Where(builder.Eq{
"project_id": projectID,
"`default`": true,
}).Cols("`default`").Update(&Board{Default: false}); err != nil {
return err
}
_, err := db.GetEngine(ctx).ID(boardID).
Where(builder.Eq{"project_id": projectID}).
Cols("`default`").Update(&Board{Default: true})
return err
})
}
// UpdateBoardSorting update project board sorting
func UpdateBoardSorting(ctx context.Context, bs BoardList) error {
return db.WithTx(ctx, func(ctx context.Context) error {
for i := range bs {
if _, err := db.GetEngine(ctx).ID(bs[i].ID).Cols(
"sorting",
).Update(bs[i]); err != nil {
return err
}
}
return nil
})
}
func GetColumnsByIDs(ctx context.Context, projectID int64, columnsIDs []int64) (BoardList, error) {
columns := make([]*Board, 0, 5)
if err := db.GetEngine(ctx).
Where("project_id =?", projectID).
In("id", columnsIDs).
OrderBy("sorting").Find(&columns); err != nil {
return nil, err
}
return columns, nil
}
// MoveColumnsOnProject sorts columns in a project
func MoveColumnsOnProject(ctx context.Context, project *Project, sortedColumnIDs map[int64]int64) error {
return db.WithTx(ctx, func(ctx context.Context) error {
sess := db.GetEngine(ctx)
columnIDs := util.ValuesOfMap(sortedColumnIDs)
movedColumns, err := GetColumnsByIDs(ctx, project.ID, columnIDs)
if err != nil {
return err
}
if len(movedColumns) != len(sortedColumnIDs) {
return errors.New("some columns do not exist")
}
for _, column := range movedColumns {
if column.ProjectID != project.ID {
return fmt.Errorf("column[%d]'s projectID is not equal to project's ID [%d]", column.ProjectID, project.ID)
}
}
for sorting, columnID := range sortedColumnIDs {
if _, err := sess.Exec("UPDATE `project_board` SET sorting=? WHERE id=?", sorting, columnID); err != nil {
return err
}
}
return nil
})
}

359
models/project/column.go Normal file
View file

@ -0,0 +1,359 @@
// Copyright 2020 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package project
import (
"context"
"errors"
"fmt"
"regexp"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
"xorm.io/builder"
)
type (
// CardType is used to represent a project column card type
CardType uint8
// ColumnList is a list of all project columns in a repository
ColumnList []*Column
)
const (
// CardTypeTextOnly is a project column card type that is text only
CardTypeTextOnly CardType = iota
// CardTypeImagesAndText is a project column card type that has images and text
CardTypeImagesAndText
)
// ColumnColorPattern is a regexp witch can validate ColumnColor
var ColumnColorPattern = regexp.MustCompile("^#[0-9a-fA-F]{6}$")
// Column is used to represent column on a project
type Column struct {
ID int64 `xorm:"pk autoincr"`
Title string
Default bool `xorm:"NOT NULL DEFAULT false"` // issues not assigned to a specific column will be assigned to this column
Sorting int8 `xorm:"NOT NULL DEFAULT 0"`
Color string `xorm:"VARCHAR(7)"`
ProjectID int64 `xorm:"INDEX NOT NULL"`
CreatorID int64 `xorm:"NOT NULL"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
// TableName return the real table name
func (Column) TableName() string {
return "project_board" // TODO: the legacy table name should be project_column
}
// NumIssues return counter of all issues assigned to the column
func (c *Column) NumIssues(ctx context.Context) int {
total, err := db.GetEngine(ctx).Table("project_issue").
Where("project_id=?", c.ProjectID).
And("project_board_id=?", c.ID).
GroupBy("issue_id").
Cols("issue_id").
Count()
if err != nil {
return 0
}
return int(total)
}
func (c *Column) GetIssues(ctx context.Context) ([]*ProjectIssue, error) {
issues := make([]*ProjectIssue, 0, 5)
if err := db.GetEngine(ctx).Where("project_id=?", c.ProjectID).
And("project_board_id=?", c.ID).
OrderBy("sorting, id").
Find(&issues); err != nil {
return nil, err
}
return issues, nil
}
func init() {
db.RegisterModel(new(Column))
}
// IsCardTypeValid checks if the project column card type is valid
func IsCardTypeValid(p CardType) bool {
switch p {
case CardTypeTextOnly, CardTypeImagesAndText:
return true
default:
return false
}
}
func createDefaultColumnsForProject(ctx context.Context, project *Project) error {
var items []string
switch project.TemplateType {
case TemplateTypeBugTriage:
items = setting.Project.ProjectBoardBugTriageType
case TemplateTypeBasicKanban:
items = setting.Project.ProjectBoardBasicKanbanType
case TemplateTypeNone:
fallthrough
default:
return nil
}
return db.WithTx(ctx, func(ctx context.Context) error {
column := Column{
CreatedUnix: timeutil.TimeStampNow(),
CreatorID: project.CreatorID,
Title: "Backlog",
ProjectID: project.ID,
Default: true,
}
if err := db.Insert(ctx, column); err != nil {
return err
}
if len(items) == 0 {
return nil
}
columns := make([]Column, 0, len(items))
for _, v := range items {
columns = append(columns, Column{
CreatedUnix: timeutil.TimeStampNow(),
CreatorID: project.CreatorID,
Title: v,
ProjectID: project.ID,
})
}
return db.Insert(ctx, columns)
})
}
// maxProjectColumns max columns allowed in a project, this should not bigger than 127
// because sorting is int8 in database
const maxProjectColumns = 20
// NewColumn adds a new project column to a given project
func NewColumn(ctx context.Context, column *Column) error {
if len(column.Color) != 0 && !ColumnColorPattern.MatchString(column.Color) {
return fmt.Errorf("bad color code: %s", column.Color)
}
res := struct {
MaxSorting int64
ColumnCount int64
}{}
if _, err := db.GetEngine(ctx).Select("max(sorting) as max_sorting, count(*) as column_count").Table("project_board").
Where("project_id=?", column.ProjectID).Get(&res); err != nil {
return err
}
if res.ColumnCount >= maxProjectColumns {
return fmt.Errorf("NewBoard: maximum number of columns reached")
}
column.Sorting = int8(util.Iif(res.ColumnCount > 0, res.MaxSorting+1, 0))
_, err := db.GetEngine(ctx).Insert(column)
return err
}
// DeleteColumnByID removes all issues references to the project column.
func DeleteColumnByID(ctx context.Context, columnID int64) error {
return db.WithTx(ctx, func(ctx context.Context) error {
return deleteColumnByID(ctx, columnID)
})
}
func deleteColumnByID(ctx context.Context, columnID int64) error {
column, err := GetColumn(ctx, columnID)
if err != nil {
if IsErrProjectColumnNotExist(err) {
return nil
}
return err
}
if column.Default {
return fmt.Errorf("deleteColumnByID: cannot delete default column")
}
// move all issues to the default column
project, err := GetProjectByID(ctx, column.ProjectID)
if err != nil {
return err
}
defaultColumn, err := project.GetDefaultColumn(ctx)
if err != nil {
return err
}
if err = column.moveIssuesToAnotherColumn(ctx, defaultColumn); err != nil {
return err
}
if _, err := db.GetEngine(ctx).ID(column.ID).NoAutoCondition().Delete(column); err != nil {
return err
}
return nil
}
func deleteColumnByProjectID(ctx context.Context, projectID int64) error {
_, err := db.GetEngine(ctx).Where("project_id=?", projectID).Delete(&Column{})
return err
}
// GetColumn fetches the current column of a project
func GetColumn(ctx context.Context, columnID int64) (*Column, error) {
column := new(Column)
has, err := db.GetEngine(ctx).ID(columnID).Get(column)
if err != nil {
return nil, err
} else if !has {
return nil, ErrProjectColumnNotExist{ColumnID: columnID}
}
return column, nil
}
// UpdateColumn updates a project column
func UpdateColumn(ctx context.Context, column *Column) error {
var fieldToUpdate []string
if column.Sorting != 0 {
fieldToUpdate = append(fieldToUpdate, "sorting")
}
if column.Title != "" {
fieldToUpdate = append(fieldToUpdate, "title")
}
if len(column.Color) != 0 && !ColumnColorPattern.MatchString(column.Color) {
return fmt.Errorf("bad color code: %s", column.Color)
}
fieldToUpdate = append(fieldToUpdate, "color")
_, err := db.GetEngine(ctx).ID(column.ID).Cols(fieldToUpdate...).Update(column)
return err
}
// GetColumns fetches all columns related to a project
func (p *Project) GetColumns(ctx context.Context) (ColumnList, error) {
columns := make([]*Column, 0, 5)
if err := db.GetEngine(ctx).Where("project_id=?", p.ID).OrderBy("sorting, id").Find(&columns); err != nil {
return nil, err
}
return columns, nil
}
// GetDefaultColumn return default column and ensure only one exists
func (p *Project) GetDefaultColumn(ctx context.Context) (*Column, error) {
var column Column
has, err := db.GetEngine(ctx).
Where("project_id=? AND `default` = ?", p.ID, true).
Desc("id").Get(&column)
if err != nil {
return nil, err
}
if has {
return &column, nil
}
// create a default column if none is found
column = Column{
ProjectID: p.ID,
Default: true,
Title: "Uncategorized",
CreatorID: p.CreatorID,
}
if _, err := db.GetEngine(ctx).Insert(&column); err != nil {
return nil, err
}
return &column, nil
}
// SetDefaultColumn represents a column for issues not assigned to one
func SetDefaultColumn(ctx context.Context, projectID, columnID int64) error {
return db.WithTx(ctx, func(ctx context.Context) error {
if _, err := GetColumn(ctx, columnID); err != nil {
return err
}
if _, err := db.GetEngine(ctx).Where(builder.Eq{
"project_id": projectID,
"`default`": true,
}).Cols("`default`").Update(&Column{Default: false}); err != nil {
return err
}
_, err := db.GetEngine(ctx).ID(columnID).
Where(builder.Eq{"project_id": projectID}).
Cols("`default`").Update(&Column{Default: true})
return err
})
}
// UpdateColumnSorting update project column sorting
func UpdateColumnSorting(ctx context.Context, cl ColumnList) error {
return db.WithTx(ctx, func(ctx context.Context) error {
for i := range cl {
if _, err := db.GetEngine(ctx).ID(cl[i].ID).Cols(
"sorting",
).Update(cl[i]); err != nil {
return err
}
}
return nil
})
}
func GetColumnsByIDs(ctx context.Context, projectID int64, columnsIDs []int64) (ColumnList, error) {
columns := make([]*Column, 0, 5)
if err := db.GetEngine(ctx).
Where("project_id =?", projectID).
In("id", columnsIDs).
OrderBy("sorting").Find(&columns); err != nil {
return nil, err
}
return columns, nil
}
// MoveColumnsOnProject sorts columns in a project
func MoveColumnsOnProject(ctx context.Context, project *Project, sortedColumnIDs map[int64]int64) error {
return db.WithTx(ctx, func(ctx context.Context) error {
sess := db.GetEngine(ctx)
columnIDs := util.ValuesOfMap(sortedColumnIDs)
movedColumns, err := GetColumnsByIDs(ctx, project.ID, columnIDs)
if err != nil {
return err
}
if len(movedColumns) != len(sortedColumnIDs) {
return errors.New("some columns do not exist")
}
for _, column := range movedColumns {
if column.ProjectID != project.ID {
return fmt.Errorf("column[%d]'s projectID is not equal to project's ID [%d]", column.ProjectID, project.ID)
}
}
for sorting, columnID := range sortedColumnIDs {
if _, err := sess.Exec("UPDATE `project_board` SET sorting=? WHERE id=?", sorting, columnID); err != nil {
return err
}
}
return nil
})
}

View file

@ -14,48 +14,48 @@ import (
"github.com/stretchr/testify/assert"
)
func TestGetDefaultBoard(t *testing.T) {
func TestGetDefaultColumn(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
projectWithoutDefault, err := GetProjectByID(db.DefaultContext, 5)
assert.NoError(t, err)
// check if default board was added
board, err := projectWithoutDefault.GetDefaultBoard(db.DefaultContext)
// check if default column was added
column, err := projectWithoutDefault.GetDefaultColumn(db.DefaultContext)
assert.NoError(t, err)
assert.Equal(t, int64(5), board.ProjectID)
assert.Equal(t, "Uncategorized", board.Title)
assert.Equal(t, int64(5), column.ProjectID)
assert.Equal(t, "Uncategorized", column.Title)
projectWithMultipleDefaults, err := GetProjectByID(db.DefaultContext, 6)
assert.NoError(t, err)
// check if multiple defaults were removed
board, err = projectWithMultipleDefaults.GetDefaultBoard(db.DefaultContext)
column, err = projectWithMultipleDefaults.GetDefaultColumn(db.DefaultContext)
assert.NoError(t, err)
assert.Equal(t, int64(6), board.ProjectID)
assert.Equal(t, int64(9), board.ID)
assert.Equal(t, int64(6), column.ProjectID)
assert.Equal(t, int64(9), column.ID)
// set 8 as default board
assert.NoError(t, SetDefaultBoard(db.DefaultContext, board.ProjectID, 8))
// set 8 as default column
assert.NoError(t, SetDefaultColumn(db.DefaultContext, column.ProjectID, 8))
// then 9 will become a non-default board
board, err = GetBoard(db.DefaultContext, 9)
// then 9 will become a non-default column
column, err = GetColumn(db.DefaultContext, 9)
assert.NoError(t, err)
assert.Equal(t, int64(6), board.ProjectID)
assert.False(t, board.Default)
assert.Equal(t, int64(6), column.ProjectID)
assert.False(t, column.Default)
}
func Test_moveIssuesToAnotherColumn(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
column1 := unittest.AssertExistsAndLoadBean(t, &Board{ID: 1, ProjectID: 1})
column1 := unittest.AssertExistsAndLoadBean(t, &Column{ID: 1, ProjectID: 1})
issues, err := column1.GetIssues(db.DefaultContext)
assert.NoError(t, err)
assert.Len(t, issues, 1)
assert.EqualValues(t, 1, issues[0].ID)
column2 := unittest.AssertExistsAndLoadBean(t, &Board{ID: 2, ProjectID: 1})
column2 := unittest.AssertExistsAndLoadBean(t, &Column{ID: 2, ProjectID: 1})
issues, err = column2.GetIssues(db.DefaultContext)
assert.NoError(t, err)
assert.Len(t, issues, 1)
@ -81,7 +81,7 @@ func Test_MoveColumnsOnProject(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
project1 := unittest.AssertExistsAndLoadBean(t, &Project{ID: 1})
columns, err := project1.GetBoards(db.DefaultContext)
columns, err := project1.GetColumns(db.DefaultContext)
assert.NoError(t, err)
assert.Len(t, columns, 3)
assert.EqualValues(t, 0, columns[0].Sorting) // even if there is no default sorting, the code should also work
@ -95,7 +95,7 @@ func Test_MoveColumnsOnProject(t *testing.T) {
})
assert.NoError(t, err)
columnsAfter, err := project1.GetBoards(db.DefaultContext)
columnsAfter, err := project1.GetColumns(db.DefaultContext)
assert.NoError(t, err)
assert.Len(t, columnsAfter, 3)
assert.EqualValues(t, columns[1].ID, columnsAfter[0].ID)
@ -103,23 +103,23 @@ func Test_MoveColumnsOnProject(t *testing.T) {
assert.EqualValues(t, columns[0].ID, columnsAfter[2].ID)
}
func Test_NewBoard(t *testing.T) {
func Test_NewColumn(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
project1 := unittest.AssertExistsAndLoadBean(t, &Project{ID: 1})
columns, err := project1.GetBoards(db.DefaultContext)
columns, err := project1.GetColumns(db.DefaultContext)
assert.NoError(t, err)
assert.Len(t, columns, 3)
for i := 0; i < maxProjectColumns-3; i++ {
err := NewBoard(db.DefaultContext, &Board{
Title: fmt.Sprintf("board-%d", i+4),
err := NewColumn(db.DefaultContext, &Column{
Title: fmt.Sprintf("column-%d", i+4),
ProjectID: project1.ID,
})
assert.NoError(t, err)
}
err = NewBoard(db.DefaultContext, &Board{
Title: "board-21",
err = NewColumn(db.DefaultContext, &Column{
Title: "column-21",
ProjectID: project1.ID,
})
assert.Error(t, err)

View file

@ -18,10 +18,10 @@ type ProjectIssue struct { //revive:disable-line:exported
IssueID int64 `xorm:"INDEX"`
ProjectID int64 `xorm:"INDEX"`
// ProjectBoardID should not be zero since 1.22. If it's zero, the issue will not be displayed on UI and it might result in errors.
ProjectBoardID int64 `xorm:"INDEX"`
// ProjectColumnID should not be zero since 1.22. If it's zero, the issue will not be displayed on UI and it might result in errors.
ProjectColumnID int64 `xorm:"'project_board_id' INDEX"`
// the sorting order on the board
// the sorting order on the column
Sorting int64 `xorm:"NOT NULL DEFAULT 0"`
}
@ -76,13 +76,13 @@ func (p *Project) NumOpenIssues(ctx context.Context) int {
return int(c)
}
// MoveIssuesOnProjectBoard moves or keeps issues in a column and sorts them inside that column
func MoveIssuesOnProjectBoard(ctx context.Context, board *Board, sortedIssueIDs map[int64]int64) error {
// MoveIssuesOnProjectColumn moves or keeps issues in a column and sorts them inside that column
func MoveIssuesOnProjectColumn(ctx context.Context, column *Column, sortedIssueIDs map[int64]int64) error {
return db.WithTx(ctx, func(ctx context.Context) error {
sess := db.GetEngine(ctx)
issueIDs := util.ValuesOfMap(sortedIssueIDs)
count, err := sess.Table(new(ProjectIssue)).Where("project_id=?", board.ProjectID).In("issue_id", issueIDs).Count()
count, err := sess.Table(new(ProjectIssue)).Where("project_id=?", column.ProjectID).In("issue_id", issueIDs).Count()
if err != nil {
return err
}
@ -91,7 +91,7 @@ func MoveIssuesOnProjectBoard(ctx context.Context, board *Board, sortedIssueIDs
}
for sorting, issueID := range sortedIssueIDs {
_, err = sess.Exec("UPDATE `project_issue` SET project_board_id=?, sorting=? WHERE issue_id=?", board.ID, sorting, issueID)
_, err = sess.Exec("UPDATE `project_issue` SET project_board_id=?, sorting=? WHERE issue_id=?", column.ID, sorting, issueID)
if err != nil {
return err
}
@ -100,12 +100,12 @@ func MoveIssuesOnProjectBoard(ctx context.Context, board *Board, sortedIssueIDs
})
}
func (b *Board) moveIssuesToAnotherColumn(ctx context.Context, newColumn *Board) error {
if b.ProjectID != newColumn.ProjectID {
func (c *Column) moveIssuesToAnotherColumn(ctx context.Context, newColumn *Column) error {
if c.ProjectID != newColumn.ProjectID {
return fmt.Errorf("columns have to be in the same project")
}
if b.ID == newColumn.ID {
if c.ID == newColumn.ID {
return nil
}
@ -121,7 +121,7 @@ func (b *Board) moveIssuesToAnotherColumn(ctx context.Context, newColumn *Board)
return err
}
issues, err := b.GetIssues(ctx)
issues, err := c.GetIssues(ctx)
if err != nil {
return err
}
@ -132,7 +132,7 @@ func (b *Board) moveIssuesToAnotherColumn(ctx context.Context, newColumn *Board)
nextSorting := util.Iif(res.IssueCount > 0, res.MaxSorting+1, 0)
return db.WithTx(ctx, func(ctx context.Context) error {
for i, issue := range issues {
issue.ProjectBoardID = newColumn.ID
issue.ProjectColumnID = newColumn.ID
issue.Sorting = nextSorting + int64(i)
if _, err := db.GetEngine(ctx).ID(issue.ID).Cols("project_board_id", "sorting").Update(issue); err != nil {
return err

View file

@ -21,13 +21,7 @@ import (
)
type (
// BoardConfig is used to identify the type of board that is being created
BoardConfig struct {
BoardType BoardType
Translation string
}
// CardConfig is used to identify the type of board card that is being used
// CardConfig is used to identify the type of column card that is being used
CardConfig struct {
CardType CardType
Translation string
@ -38,7 +32,7 @@ type (
)
const (
// TypeIndividual is a type of project board that is owned by an individual
// TypeIndividual is a type of project column that is owned by an individual
TypeIndividual Type = iota + 1
// TypeRepository is a project that is tied to a repository
@ -68,39 +62,39 @@ func (err ErrProjectNotExist) Unwrap() error {
return util.ErrNotExist
}
// ErrProjectBoardNotExist represents a "ProjectBoardNotExist" kind of error.
type ErrProjectBoardNotExist struct {
BoardID int64
// ErrProjectColumnNotExist represents a "ErrProjectColumnNotExist" kind of error.
type ErrProjectColumnNotExist struct {
ColumnID int64
}
// IsErrProjectBoardNotExist checks if an error is a ErrProjectBoardNotExist
func IsErrProjectBoardNotExist(err error) bool {
_, ok := err.(ErrProjectBoardNotExist)
// IsErrProjectColumnNotExist checks if an error is a ErrProjectColumnNotExist
func IsErrProjectColumnNotExist(err error) bool {
_, ok := err.(ErrProjectColumnNotExist)
return ok
}
func (err ErrProjectBoardNotExist) Error() string {
return fmt.Sprintf("project board does not exist [id: %d]", err.BoardID)
func (err ErrProjectColumnNotExist) Error() string {
return fmt.Sprintf("project column does not exist [id: %d]", err.ColumnID)
}
func (err ErrProjectBoardNotExist) Unwrap() error {
func (err ErrProjectColumnNotExist) Unwrap() error {
return util.ErrNotExist
}
// Project represents a project board
// Project represents a project
type Project struct {
ID int64 `xorm:"pk autoincr"`
Title string `xorm:"INDEX NOT NULL"`
Description string `xorm:"TEXT"`
OwnerID int64 `xorm:"INDEX"`
Owner *user_model.User `xorm:"-"`
RepoID int64 `xorm:"INDEX"`
Repo *repo_model.Repository `xorm:"-"`
CreatorID int64 `xorm:"NOT NULL"`
IsClosed bool `xorm:"INDEX"`
BoardType BoardType
CardType CardType
Type Type
ID int64 `xorm:"pk autoincr"`
Title string `xorm:"INDEX NOT NULL"`
Description string `xorm:"TEXT"`
OwnerID int64 `xorm:"INDEX"`
Owner *user_model.User `xorm:"-"`
RepoID int64 `xorm:"INDEX"`
Repo *repo_model.Repository `xorm:"-"`
CreatorID int64 `xorm:"NOT NULL"`
IsClosed bool `xorm:"INDEX"`
TemplateType TemplateType `xorm:"'board_type'"` // TODO: rename the column to template_type
CardType CardType
Type Type
RenderedContent template.HTML `xorm:"-"`
@ -172,16 +166,7 @@ func init() {
db.RegisterModel(new(Project))
}
// GetBoardConfig retrieves the types of configurations project boards could have
func GetBoardConfig() []BoardConfig {
return []BoardConfig{
{BoardTypeNone, "repo.projects.type.none"},
{BoardTypeBasicKanban, "repo.projects.type.basic_kanban"},
{BoardTypeBugTriage, "repo.projects.type.bug_triage"},
}
}
// GetCardConfig retrieves the types of configurations project board cards could have
// GetCardConfig retrieves the types of configurations project column cards could have
func GetCardConfig() []CardConfig {
return []CardConfig{
{CardTypeTextOnly, "repo.projects.card_type.text_only"},
@ -251,8 +236,8 @@ func GetSearchOrderByBySortType(sortType string) db.SearchOrderBy {
// NewProject creates a new Project
func NewProject(ctx context.Context, p *Project) error {
if !IsBoardTypeValid(p.BoardType) {
p.BoardType = BoardTypeNone
if !IsTemplateTypeValid(p.TemplateType) {
p.TemplateType = TemplateTypeNone
}
if !IsCardTypeValid(p.CardType) {
@ -263,27 +248,19 @@ func NewProject(ctx context.Context, p *Project) error {
return util.NewInvalidArgumentErrorf("project type is not valid")
}
ctx, committer, err := db.TxContext(ctx)
if err != nil {
return err
}
defer committer.Close()
if err := db.Insert(ctx, p); err != nil {
return err
}
if p.RepoID > 0 {
if _, err := db.Exec(ctx, "UPDATE `repository` SET num_projects = num_projects + 1 WHERE id = ?", p.RepoID); err != nil {
return db.WithTx(ctx, func(ctx context.Context) error {
if err := db.Insert(ctx, p); err != nil {
return err
}
}
if err := createBoardsForProjectsType(ctx, p); err != nil {
return err
}
if p.RepoID > 0 {
if _, err := db.Exec(ctx, "UPDATE `repository` SET num_projects = num_projects + 1 WHERE id = ?", p.RepoID); err != nil {
return err
}
}
return committer.Commit()
return createDefaultColumnsForProject(ctx, p)
})
}
// GetProjectByID returns the projects in a repository
@ -417,7 +394,7 @@ func DeleteProjectByID(ctx context.Context, id int64) error {
return err
}
if err := deleteBoardByProjectID(ctx, id); err != nil {
if err := deleteColumnByProjectID(ctx, id); err != nil {
return err
}

View file

@ -51,13 +51,13 @@ func TestProject(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
project := &Project{
Type: TypeRepository,
BoardType: BoardTypeBasicKanban,
CardType: CardTypeTextOnly,
Title: "New Project",
RepoID: 1,
CreatedUnix: timeutil.TimeStampNow(),
CreatorID: 2,
Type: TypeRepository,
TemplateType: TemplateTypeBasicKanban,
CardType: CardTypeTextOnly,
Title: "New Project",
RepoID: 1,
CreatedUnix: timeutil.TimeStampNow(),
CreatorID: 2,
}
assert.NoError(t, NewProject(db.DefaultContext, project))

View file

@ -0,0 +1,45 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package project
type (
// TemplateType is used to represent a project template type
TemplateType uint8
// TemplateConfig is used to identify the template type of project that is being created
TemplateConfig struct {
TemplateType TemplateType
Translation string
}
)
const (
// TemplateTypeNone is a project template type that has no predefined columns
TemplateTypeNone TemplateType = iota
// TemplateTypeBasicKanban is a project template type that has basic predefined columns
TemplateTypeBasicKanban
// TemplateTypeBugTriage is a project template type that has predefined columns suited to hunting down bugs
TemplateTypeBugTriage
)
// GetTemplateConfigs retrieves the template configs of configurations project columns could have
func GetTemplateConfigs() []TemplateConfig {
return []TemplateConfig{
{TemplateTypeNone, "repo.projects.type.none"},
{TemplateTypeBasicKanban, "repo.projects.type.basic_kanban"},
{TemplateTypeBugTriage, "repo.projects.type.bug_triage"},
}
}
// IsTemplateTypeValid checks if the project template type is valid
func IsTemplateTypeValid(p TemplateType) bool {
switch p {
case TemplateTypeNone, TemplateTypeBasicKanban, TemplateTypeBugTriage:
return true
default:
return false
}
}

View file

@ -94,7 +94,9 @@ func UpdatePushMirrorInterval(ctx context.Context, m *PushMirror) error {
return err
}
func DeletePushMirrors(ctx context.Context, opts PushMirrorOptions) error {
var DeletePushMirrors = deletePushMirrors
func deletePushMirrors(ctx context.Context, opts PushMirrorOptions) error {
if opts.RepoID > 0 {
_, err := db.Delete[PushMirror](ctx, opts)
return err

View file

@ -28,7 +28,7 @@ const (
TypeWiki // 5 Wiki
TypeExternalWiki // 6 ExternalWiki
TypeExternalTracker // 7 ExternalTracker
TypeProjects // 8 Kanban board
TypeProjects // 8 Projects
TypePackages // 9 Packages
TypeActions // 10 Actions
)

View file

@ -894,6 +894,10 @@ func GetUserByID(ctx context.Context, id int64) (*User, error) {
// GetUserByIDs returns the user objects by given IDs if exists.
func GetUserByIDs(ctx context.Context, ids []int64) ([]*User, error) {
if len(ids) == 0 {
return nil, nil
}
users := make([]*User, 0, len(ids))
err := db.GetEngine(ctx).In("id", ids).
Table("user").

View file

@ -230,8 +230,8 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (
if options.ProjectID.Has() {
queries = append(queries, inner_bleve.NumericEqualityQuery(options.ProjectID.Value(), "project_id"))
}
if options.ProjectBoardID.Has() {
queries = append(queries, inner_bleve.NumericEqualityQuery(options.ProjectBoardID.Value(), "project_board_id"))
if options.ProjectColumnID.Has() {
queries = append(queries, inner_bleve.NumericEqualityQuery(options.ProjectColumnID.Value(), "project_board_id"))
}
if options.PosterID.Has() {

View file

@ -61,7 +61,7 @@ func ToDBOptions(ctx context.Context, options *internal.SearchOptions) (*issue_m
ReviewedID: convertID(options.ReviewedID),
SubscriberID: convertID(options.SubscriberID),
ProjectID: convertID(options.ProjectID),
ProjectBoardID: convertID(options.ProjectBoardID),
ProjectColumnID: convertID(options.ProjectColumnID),
IsClosed: options.IsClosed,
IsPull: options.IsPull,
IncludedLabelNames: nil,

View file

@ -50,7 +50,7 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp
}
searchOpt.ProjectID = convertID(opts.ProjectID)
searchOpt.ProjectBoardID = convertID(opts.ProjectBoardID)
searchOpt.ProjectColumnID = convertID(opts.ProjectColumnID)
searchOpt.PosterID = convertID(opts.PosterID)
searchOpt.AssigneeID = convertID(opts.AssigneeID)
searchOpt.MentionID = convertID(opts.MentionedID)

View file

@ -48,8 +48,8 @@ const (
{
"mappings": {
"properties": {
"id": { "type": "integer", "index": true },
"repo_id": { "type": "integer", "index": true },
"id": { "type": "long", "index": true },
"repo_id": { "type": "long", "index": true },
"is_public": { "type": "boolean", "index": true },
"title": { "type": "text", "index": true },
@ -58,22 +58,22 @@ const (
"is_pull": { "type": "boolean", "index": true },
"is_closed": { "type": "boolean", "index": true },
"label_ids": { "type": "integer", "index": true },
"label_ids": { "type": "long", "index": true },
"no_label": { "type": "boolean", "index": true },
"milestone_id": { "type": "integer", "index": true },
"project_id": { "type": "integer", "index": true },
"project_board_id": { "type": "integer", "index": true },
"poster_id": { "type": "integer", "index": true },
"assignee_id": { "type": "integer", "index": true },
"mention_ids": { "type": "integer", "index": true },
"reviewed_ids": { "type": "integer", "index": true },
"review_requested_ids": { "type": "integer", "index": true },
"subscriber_ids": { "type": "integer", "index": true },
"updated_unix": { "type": "integer", "index": true },
"milestone_id": { "type": "long", "index": true },
"project_id": { "type": "long", "index": true },
"project_board_id": { "type": "long", "index": true },
"poster_id": { "type": "long", "index": true },
"assignee_id": { "type": "long", "index": true },
"mention_ids": { "type": "long", "index": true },
"reviewed_ids": { "type": "long", "index": true },
"review_requested_ids": { "type": "long", "index": true },
"subscriber_ids": { "type": "long", "index": true },
"updated_unix": { "type": "long", "index": true },
"created_unix": { "type": "integer", "index": true },
"deadline_unix": { "type": "integer", "index": true },
"comment_count": { "type": "integer", "index": true }
"created_unix": { "type": "long", "index": true },
"deadline_unix": { "type": "long", "index": true },
"comment_count": { "type": "long", "index": true }
}
}
}
@ -197,8 +197,8 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (
if options.ProjectID.Has() {
query.Must(elastic.NewTermQuery("project_id", options.ProjectID.Value()))
}
if options.ProjectBoardID.Has() {
query.Must(elastic.NewTermQuery("project_board_id", options.ProjectBoardID.Value()))
if options.ProjectColumnID.Has() {
query.Must(elastic.NewTermQuery("project_board_id", options.ProjectColumnID.Value()))
}
if options.PosterID.Has() {

View file

@ -14,8 +14,7 @@ import (
)
func TestElasticsearchIndexer(t *testing.T) {
t.Skip("elasticsearch not found in Forgejo test yet")
// The elasticsearch instance started by pull-db-tests.yml > test-unit > services > elasticsearch
// The elasticsearch instance started by testing.yml > test-unit > services > elasticsearch
url := "http://elastic:changeme@elasticsearch:9200"
if os.Getenv("CI") == "" {

View file

@ -369,13 +369,13 @@ func searchIssueInProject(t *testing.T) {
},
{
SearchOptions{
ProjectBoardID: optional.Some(int64(1)),
ProjectColumnID: optional.Some(int64(1)),
},
[]int64{1},
},
{
SearchOptions{
ProjectBoardID: optional.Some(int64(0)), // issue with in default board
ProjectColumnID: optional.Some(int64(0)), // issue with in default column
},
[]int64{2},
},

View file

@ -27,7 +27,7 @@ type IndexerData struct {
NoLabel bool `json:"no_label"` // True if LabelIDs is empty
MilestoneID int64 `json:"milestone_id"`
ProjectID int64 `json:"project_id"`
ProjectBoardID int64 `json:"project_board_id"`
ProjectColumnID int64 `json:"project_board_id"` // the key should be kept as project_board_id to keep compatible
PosterID int64 `json:"poster_id"`
AssigneeID int64 `json:"assignee_id"`
MentionIDs []int64 `json:"mention_ids"`
@ -89,8 +89,8 @@ type SearchOptions struct {
MilestoneIDs []int64 // milestones the issues have
ProjectID optional.Option[int64] // project the issues belong to
ProjectBoardID optional.Option[int64] // project board the issues belong to
ProjectID optional.Option[int64] // project the issues belong to
ProjectColumnID optional.Option[int64] // project column the issues belong to
PosterID optional.Option[int64] // poster of the issues

View file

@ -352,38 +352,38 @@ var cases = []*testIndexerCase{
},
},
{
Name: "ProjectBoardID",
Name: "ProjectColumnID",
SearchOptions: &internal.SearchOptions{
Paginator: &db.ListOptions{
PageSize: 5,
},
ProjectBoardID: optional.Some(int64(1)),
ProjectColumnID: optional.Some(int64(1)),
},
Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) {
assert.Equal(t, 5, len(result.Hits))
for _, v := range result.Hits {
assert.Equal(t, int64(1), data[v.ID].ProjectBoardID)
assert.Equal(t, int64(1), data[v.ID].ProjectColumnID)
}
assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
return v.ProjectBoardID == 1
return v.ProjectColumnID == 1
}), result.Total)
},
},
{
Name: "no ProjectBoardID",
Name: "no ProjectColumnID",
SearchOptions: &internal.SearchOptions{
Paginator: &db.ListOptions{
PageSize: 5,
},
ProjectBoardID: optional.Some(int64(0)),
ProjectColumnID: optional.Some(int64(0)),
},
Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) {
assert.Equal(t, 5, len(result.Hits))
for _, v := range result.Hits {
assert.Equal(t, int64(0), data[v.ID].ProjectBoardID)
assert.Equal(t, int64(0), data[v.ID].ProjectColumnID)
}
assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
return v.ProjectBoardID == 0
return v.ProjectColumnID == 0
}), result.Total)
},
},
@ -720,7 +720,7 @@ func generateDefaultIndexerData() []*internal.IndexerData {
NoLabel: len(labelIDs) == 0,
MilestoneID: issueIndex % 4,
ProjectID: issueIndex % 5,
ProjectBoardID: issueIndex % 6,
ProjectColumnID: issueIndex % 6,
PosterID: id%10 + 1, // PosterID should not be 0
AssigneeID: issueIndex % 10,
MentionIDs: mentionIDs,

View file

@ -174,8 +174,8 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (
if options.ProjectID.Has() {
query.And(inner_meilisearch.NewFilterEq("project_id", options.ProjectID.Value()))
}
if options.ProjectBoardID.Has() {
query.And(inner_meilisearch.NewFilterEq("project_board_id", options.ProjectBoardID.Value()))
if options.ProjectColumnID.Has() {
query.And(inner_meilisearch.NewFilterEq("project_board_id", options.ProjectColumnID.Value()))
}
if options.PosterID.Has() {

View file

@ -105,7 +105,7 @@ func getIssueIndexerData(ctx context.Context, issueID int64) (*internal.IndexerD
NoLabel: len(labels) == 0,
MilestoneID: issue.MilestoneID,
ProjectID: projectID,
ProjectBoardID: issue.ProjectBoardID(ctx),
ProjectColumnID: issue.ProjectColumnID(ctx),
PosterID: issue.PosterID,
AssigneeID: issue.AssigneeID,
MentionIDs: mentionIDs,

View file

@ -36,7 +36,7 @@ type Collector struct {
Oauths *prometheus.Desc
Organizations *prometheus.Desc
Projects *prometheus.Desc
ProjectBoards *prometheus.Desc
ProjectColumns *prometheus.Desc
PublicKeys *prometheus.Desc
Releases *prometheus.Desc
Repositories *prometheus.Desc
@ -146,9 +146,9 @@ func NewCollector() Collector {
"Number of projects",
nil, nil,
),
ProjectBoards: prometheus.NewDesc(
namespace+"projects_boards",
"Number of project boards",
ProjectColumns: prometheus.NewDesc(
namespace+"projects_boards", // TODO: change the key name will affect the consume's result history
"Number of project columns",
nil, nil,
),
PublicKeys: prometheus.NewDesc(
@ -219,7 +219,7 @@ func (c Collector) Describe(ch chan<- *prometheus.Desc) {
ch <- c.Oauths
ch <- c.Organizations
ch <- c.Projects
ch <- c.ProjectBoards
ch <- c.ProjectColumns
ch <- c.PublicKeys
ch <- c.Releases
ch <- c.Repositories
@ -336,9 +336,9 @@ func (c Collector) Collect(ch chan<- prometheus.Metric) {
float64(stats.Counter.Project),
)
ch <- prometheus.MustNewConstMetric(
c.ProjectBoards,
c.ProjectColumns,
prometheus.GaugeValue,
float64(stats.Counter.ProjectBoard),
float64(stats.Counter.ProjectColumn),
)
ch <- prometheus.MustNewConstMetric(
c.PublicKeys,

View file

@ -598,6 +598,25 @@ func (mr *MockUniversalClientMockRecorder) BitField(arg0, arg1 any, arg2 ...any)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BitField", reflect.TypeOf((*MockUniversalClient)(nil).BitField), varargs...)
}
// BitFieldRO mocks base method.
func (m *MockUniversalClient) BitFieldRO(arg0 context.Context, arg1 string, arg2 ...any) *redis.IntSliceCmd {
m.ctrl.T.Helper()
varargs := []any{arg0, arg1}
for _, a := range arg2 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "BitFieldRO", varargs...)
ret0, _ := ret[0].(*redis.IntSliceCmd)
return ret0
}
// BitFieldRO indicates an expected call of BitFieldRO.
func (mr *MockUniversalClientMockRecorder) BitFieldRO(arg0, arg1 any, arg2 ...any) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]any{arg0, arg1}, arg2...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BitFieldRO", reflect.TypeOf((*MockUniversalClient)(nil).BitFieldRO), varargs...)
}
// BitOpAnd mocks base method.
func (m *MockUniversalClient) BitOpAnd(arg0 context.Context, arg1 string, arg2 ...string) *redis.IntCmd {
m.ctrl.T.Helper()
@ -3638,6 +3657,20 @@ func (mr *MockUniversalClientMockRecorder) ObjectEncoding(arg0, arg1 any) *gomoc
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ObjectEncoding", reflect.TypeOf((*MockUniversalClient)(nil).ObjectEncoding), arg0, arg1)
}
// ObjectFreq mocks base method.
func (m *MockUniversalClient) ObjectFreq(arg0 context.Context, arg1 string) *redis.IntCmd {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ObjectFreq", arg0, arg1)
ret0, _ := ret[0].(*redis.IntCmd)
return ret0
}
// ObjectFreq indicates an expected call of ObjectFreq.
func (mr *MockUniversalClientMockRecorder) ObjectFreq(arg0, arg1 any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ObjectFreq", reflect.TypeOf((*MockUniversalClient)(nil).ObjectFreq), arg0, arg1)
}
// ObjectIdleTime mocks base method.
func (m *MockUniversalClient) ObjectIdleTime(arg0 context.Context, arg1 string) *redis.DurationCmd {
m.ctrl.T.Helper()

View file

@ -10,7 +10,7 @@ import (
"os"
)
var uninitializedStorage = discardStorage("uninitialized storage")
var UninitializedStorage = discardStorage("uninitialized storage")
type discardStorage string

View file

@ -12,7 +12,7 @@ import (
func Test_discardStorage(t *testing.T) {
tests := []discardStorage{
uninitializedStorage,
UninitializedStorage,
discardStorage("empty"),
}
for _, tt := range tests {

View file

@ -97,7 +97,7 @@ func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage,
log.Info("Creating Minio storage at %s:%s with base path %s", config.Endpoint, config.Bucket, config.BasePath)
minioClient, err := minio.New(config.Endpoint, &minio.Options{
Creds: credentials.NewStaticV4(config.AccessKeyID, config.SecretAccessKey, ""),
Creds: buildMinioCredentials(config, credentials.DefaultIAMRoleEndpoint),
Secure: config.UseSSL,
Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: config.InsecureSkipVerify}},
Region: config.Location,
@ -164,6 +164,35 @@ func (m *MinioStorage) buildMinioDirPrefix(p string) string {
return p
}
func buildMinioCredentials(config setting.MinioStorageConfig, iamEndpoint string) *credentials.Credentials {
// If static credentials are provided, use those
if config.AccessKeyID != "" {
return credentials.NewStaticV4(config.AccessKeyID, config.SecretAccessKey, "")
}
// Otherwise, fallback to a credentials chain for S3 access
chain := []credentials.Provider{
// configure based upon MINIO_ prefixed environment variables
&credentials.EnvMinio{},
// configure based upon AWS_ prefixed environment variables
&credentials.EnvAWS{},
// read credentials from MINIO_SHARED_CREDENTIALS_FILE
// environment variable, or default json config files
&credentials.FileMinioClient{},
// read credentials from AWS_SHARED_CREDENTIALS_FILE
// environment variable, or default credentials file
&credentials.FileAWSCredentials{},
// read IAM role from EC2 metadata endpoint if available
&credentials.IAM{
Endpoint: iamEndpoint,
Client: &http.Client{
Transport: http.DefaultTransport,
},
},
}
return credentials.NewChainCredentials(chain)
}
// Open opens a file
func (m *MinioStorage) Open(path string) (Object, error) {
opts := minio.GetObjectOptions{}

View file

@ -6,6 +6,7 @@ package storage
import (
"context"
"net/http"
"net/http/httptest"
"os"
"testing"
@ -109,3 +110,106 @@ func TestS3StorageBadRequest(t *testing.T) {
_, err := NewStorage(setting.MinioStorageType, cfg)
assert.ErrorContains(t, err, message)
}
func TestMinioCredentials(t *testing.T) {
const (
ExpectedAccessKey = "ExampleAccessKeyID"
ExpectedSecretAccessKey = "ExampleSecretAccessKeyID"
// Use a FakeEndpoint for IAM credentials to avoid logging any
// potential real IAM credentials when running in EC2.
FakeEndpoint = "http://localhost"
)
t.Run("Static Credentials", func(t *testing.T) {
cfg := setting.MinioStorageConfig{
AccessKeyID: ExpectedAccessKey,
SecretAccessKey: ExpectedSecretAccessKey,
}
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
assert.NoError(t, err)
assert.Equal(t, ExpectedAccessKey, v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey, v.SecretAccessKey)
})
t.Run("Chain", func(t *testing.T) {
cfg := setting.MinioStorageConfig{}
t.Run("EnvMinio", func(t *testing.T) {
t.Setenv("MINIO_ACCESS_KEY", ExpectedAccessKey+"Minio")
t.Setenv("MINIO_SECRET_KEY", ExpectedSecretAccessKey+"Minio")
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
assert.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"Minio", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"Minio", v.SecretAccessKey)
})
t.Run("EnvAWS", func(t *testing.T) {
t.Setenv("AWS_ACCESS_KEY", ExpectedAccessKey+"AWS")
t.Setenv("AWS_SECRET_KEY", ExpectedSecretAccessKey+"AWS")
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
assert.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"AWS", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"AWS", v.SecretAccessKey)
})
t.Run("FileMinio", func(t *testing.T) {
t.Setenv("MINIO_SHARED_CREDENTIALS_FILE", "testdata/minio.json")
// prevent loading any actual credentials files from the user
t.Setenv("AWS_SHARED_CREDENTIALS_FILE", "testdata/fake")
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
assert.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"MinioFile", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"MinioFile", v.SecretAccessKey)
})
t.Run("FileAWS", func(t *testing.T) {
// prevent loading any actual credentials files from the user
t.Setenv("MINIO_SHARED_CREDENTIALS_FILE", "testdata/fake.json")
t.Setenv("AWS_SHARED_CREDENTIALS_FILE", "testdata/aws_credentials")
creds := buildMinioCredentials(cfg, FakeEndpoint)
v, err := creds.Get()
assert.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"AWSFile", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"AWSFile", v.SecretAccessKey)
})
t.Run("IAM", func(t *testing.T) {
// prevent loading any actual credentials files from the user
t.Setenv("MINIO_SHARED_CREDENTIALS_FILE", "testdata/fake.json")
t.Setenv("AWS_SHARED_CREDENTIALS_FILE", "testdata/fake")
// Spawn a server to emulate the EC2 Instance Metadata
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// The client will actually make 3 requests here,
// first will be to get the IMDSv2 token, second to
// get the role, and third for the actual
// credentials. However, we can return credentials
// every request since we're not emulating a full
// IMDSv2 flow.
w.Write([]byte(`{"Code":"Success","AccessKeyId":"ExampleAccessKeyIDIAM","SecretAccessKey":"ExampleSecretAccessKeyIDIAM"}`))
}))
defer server.Close()
// Use the provided EC2 Instance Metadata server
creds := buildMinioCredentials(cfg, server.URL)
v, err := creds.Get()
assert.NoError(t, err)
assert.Equal(t, ExpectedAccessKey+"IAM", v.AccessKeyID)
assert.Equal(t, ExpectedSecretAccessKey+"IAM", v.SecretAccessKey)
})
})
}

View file

@ -109,26 +109,26 @@ func SaveFrom(objStorage ObjectStorage, p string, callback func(w io.Writer) err
var (
// Attachments represents attachments storage
Attachments ObjectStorage = uninitializedStorage
Attachments ObjectStorage = UninitializedStorage
// LFS represents lfs storage
LFS ObjectStorage = uninitializedStorage
LFS ObjectStorage = UninitializedStorage
// Avatars represents user avatars storage
Avatars ObjectStorage = uninitializedStorage
Avatars ObjectStorage = UninitializedStorage
// RepoAvatars represents repository avatars storage
RepoAvatars ObjectStorage = uninitializedStorage
RepoAvatars ObjectStorage = UninitializedStorage
// RepoArchives represents repository archives storage
RepoArchives ObjectStorage = uninitializedStorage
RepoArchives ObjectStorage = UninitializedStorage
// Packages represents packages storage
Packages ObjectStorage = uninitializedStorage
Packages ObjectStorage = UninitializedStorage
// Actions represents actions storage
Actions ObjectStorage = uninitializedStorage
Actions ObjectStorage = UninitializedStorage
// Actions Artifacts represents actions artifacts storage
ActionsArtifacts ObjectStorage = uninitializedStorage
ActionsArtifacts ObjectStorage = UninitializedStorage
)
// Init init the stoarge

View file

@ -0,0 +1,3 @@
[default]
aws_access_key_id=ExampleAccessKeyIDAWSFile
aws_secret_access_key=ExampleSecretAccessKeyIDAWSFile

12
modules/storage/testdata/minio.json vendored Normal file
View file

@ -0,0 +1,12 @@
{
"version": "10",
"aliases": {
"s3": {
"url": "https://s3.amazonaws.com",
"accessKey": "ExampleAccessKeyIDMinioFile",
"secretKey": "ExampleSecretAccessKeyIDMinioFile",
"api": "S3v4",
"path": "dns"
}
}
}

View file

@ -114,6 +114,7 @@ type Repository struct {
// swagger:strfmt date-time
MirrorUpdated time.Time `json:"mirror_updated,omitempty"`
RepoTransfer *RepoTransfer `json:"repo_transfer"`
Topics []string `json:"topics"`
}
// GetName implements the gitrepo.Repository interface

View file

@ -34,8 +34,15 @@ func IsNormalPageCompleted(s string) bool {
return strings.Contains(s, `<footer class="page-footer"`) && strings.Contains(s, `</html>`)
}
// use for global variables only
func MockVariableValue[T any](p *T, v T) (reset func()) {
old := *p
*p = v
return func() { *p = old }
}
// use for global variables only
func MockProtect[T any](p *T) (reset func()) {
old := *p
return func() { *p = old }
}

View file

@ -0,0 +1,18 @@
// Copyright 2024 The Forgejo Authors
// SPDX-License-Identifier: MIT
package test
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestMockProtect(t *testing.T) {
mockable := "original"
restore := MockProtect(&mockable)
mockable = "tainted"
restore()
assert.Equal(t, "original", mockable)
}

2
options/license/Gutmann Normal file
View file

@ -0,0 +1,2 @@
You can use this code in whatever way you want, as long as you don't try
to claim you wrote it.

View file

@ -0,0 +1,21 @@
Copyright 2004-2008 Apple Inc. All Rights Reserved.
Export of this software from the United States of America may
require a specific license from the United States Government.
It is the responsibility of any person or organization
contemplating export to obtain such a license before exporting.
WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
distribute this software and its documentation for any purpose and
without fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright notice and
this permission notice appear in supporting documentation, and that
the name of Apple Inc. not be used in advertising or publicity
pertaining to distribution of the software without specific,
written prior permission. Apple Inc. makes no representations
about the suitability of this software for any purpose. It is
provided "as is" without express or implied warranty.
THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

View file

@ -0,0 +1,9 @@
Copyright (C) 2004 Christian Groessler <chris@groessler.org>
Permission to use, copy, modify, and distribute this file
for any purpose is hereby granted without fee, provided that
the above copyright notice and this notice appears in all
copies.
This file is distributed WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

View file

@ -0,0 +1,66 @@
FLOSS License Exception
=======================
(Adapted from http://www.mysql.com/company/legal/licensing/foss-exception.html)
I want specified Free/Libre and Open Source Software ("FLOSS")
applications to be able to use specified GPL-licensed RRDtool
libraries (the "Program") despite the fact that not all FLOSS licenses are
compatible with version 2 of the GNU General Public License (the "GPL").
As a special exception to the terms and conditions of version 2.0 of the GPL:
You are free to distribute a Derivative Work that is formed entirely from
the Program and one or more works (each, a "FLOSS Work") licensed under one
or more of the licenses listed below, as long as:
1. You obey the GPL in all respects for the Program and the Derivative
Work, except for identifiable sections of the Derivative Work which are
not derived from the Program, and which can reasonably be considered
independent and separate works in themselves,
2. all identifiable sections of the Derivative Work which are not derived
from the Program, and which can reasonably be considered independent and
separate works in themselves,
1. are distributed subject to one of the FLOSS licenses listed
below, and
2. the object code or executable form of those sections are
accompanied by the complete corresponding machine-readable source
code for those sections on the same medium and under the same FLOSS
license as the corresponding object code or executable forms of
those sections, and
3. any works which are aggregated with the Program or with a Derivative
Work on a volume of a storage or distribution medium in accordance with
the GPL, can reasonably be considered independent and separate works in
themselves which are not derivatives of either the Program, a Derivative
Work or a FLOSS Work.
If the above conditions are not met, then the Program may only be copied,
modified, distributed or used under the terms and conditions of the GPL.
FLOSS License List
==================
License name Version(s)/Copyright Date
Academic Free License 2.0
Apache Software License 1.0/1.1/2.0
Apple Public Source License 2.0
Artistic license From Perl 5.8.0
BSD license "July 22 1999"
Common Public License 1.0
GNU Library or "Lesser" General Public License (LGPL) 2.0/2.1
IBM Public License, Version 1.0
Jabber Open Source License 1.0
MIT License (As listed in file MIT-License.txt) -
Mozilla Public License (MPL) 1.0/1.1
Open Software License 2.0
OpenSSL license (with original SSLeay license) "2003" ("1998")
PHP License 3.01
Python license (CNRI Python License) -
Python Software Foundation License 2.1.1
Sleepycat License "1999"
W3C License "2001"
X11 License "2001"
Zlib/libpng License -
Zope Public License 2.0/2.1

View file

@ -174,8 +174,8 @@ smtp_port = منفذ SMTP
mailer_password = كلمة مرور SMTP
app_url_helper = العنوان الأساسي لاستنساخ عناوين URL HTTP(S) وإشعارات البريد الإلكتروني.
mailer_user = اسم مستخدم SMTP
disable_gravatar_popup = عطل جرافاتار والجهات الخارجية للصور الرمزية. ستُستخدم صورة رمزية مبدئية حتى يرفع المستخدم صورة.
offline_mode_popup = عطل خدمات توصيل المحتوى من الجهات الخارجية، واخدم كل المحتوى محلياً.
disable_gravatar.description = عطل جرافاتار والجهات الخارجية للصور الرمزية. ستُستخدم صورة رمزية مبدئية حتى يرفع المستخدم صورة.
offline_mode.description = عطل خدمات توصيل المحتوى من الجهات الخارجية، واخدم كل المحتوى محلياً.
run_user_helper = اسم مستخدم نظام التشغيل الذي يشغل فورجيو. ملاحظة: هذا المستخدم يجب أن يكون له حق الوصول إلى المسار الجذري للمستودع.
domain = نطاق الخادم
disable_gravatar = عطل جرافاتار
@ -194,19 +194,19 @@ email_title = إعدادات البريد الإلكتروني
offline_mode = فعل الوضع المحلي
server_service_title = إعدادات الخادم وخدمات الجهات الخارجية
register_confirm = الزم تأكيد البريد الإلكتروني للتسجيل
allow_only_external_registration_popup = لا يسمح بالتسجيل إلا من خلال الخدمات الخارجية
allow_only_external_registration.description = لا يسمح بالتسجيل إلا من خلال الخدمات الخارجية
disable_registration = عطّل التسجيل الذاتي
federated_avatar_lookup_popup = تفعيل الصور الرمزية الاتحادية باستخدام ليبرافاتار.
federated_avatar_lookup.description = تفعيل الصور الرمزية الاتحادية باستخدام ليبرافاتار.
openid_signup = فعّل التسجيل الذاتي عبر OpenID
disable_registration_popup = عطل التسجيل الذاتي. المديرون فقط سيكونون قادرين على إنشاء حسابات جديدة للمستخدمين.
disable_registration.description = عطل التسجيل الذاتي. المديرون فقط سيكونون قادرين على إنشاء حسابات جديدة للمستخدمين.
openid_signin = فعّل تسجيل الدخول عبر OpenID
openid_signin_popup = فعّل تسجيل دخول المستخدمين عبر OpenID.
openid_signin.description = فعّل تسجيل دخول المستخدمين عبر OpenID.
enable_captcha = فعّل كابتشا التسجيل
enable_captcha_popup = الزم وجود كابتشا للتسجيل الذاتي للمستخدمين.
openid_signup_popup = فعّل التسجيل الذاتي للمستخدمين عبر OpenID.
enable_captcha.description = الزم وجود كابتشا للتسجيل الذاتي للمستخدمين.
openid_signup.description = فعّل التسجيل الذاتي للمستخدمين عبر OpenID.
require_sign_in_view = الزم تسجيل الدخول لعرض الصفحات
require_sign_in_view_popup = مكّن وصول الصفحات للمستخدمين فقط. لن يرى الزائرون سوى صفحات التسجيل والتسجيل.
admin_setting_desc = إنشاء حساب إداري هو اختياري. أول مستخدم مُسجل سيصبح تلقائيا مديرا.
require_sign_in_view.description = مكّن وصول الصفحات للمستخدمين فقط. لن يرى الزائرون سوى صفحات التسجيل والتسجيل.
admin_setting.description = إنشاء حساب إداري هو اختياري. أول مستخدم مُسجل سيصبح تلقائيا مديرا.
admin_password = كلمة المرور
admin_email = عنوان البريد الإلكتروني
install_btn_confirm = تثبت فورجيو
@ -222,11 +222,11 @@ env_config_keys_prompt = ستطبق المتغيرات البيئية التال
admin_title = إعدادات حساب المدير
no_reply_address_helper = النطاق للمستخدمين بعنوان بريد إلكتروني مخفي. مثلاً، اسم المستخدم "sarah" سوف يسجل في جِت كـ"sarah@noreply.example.org" لو كان نطاق البريد الإلكتروني الخفي مدخل كـ"noreply.example.org".
enable_update_checker = فعل فحص التحديثات
default_enable_timetracking_popup = فعل تتبع الوقت للمستودعات الجديدة مبدئيا.
default_enable_timetracking.description = فعل تتبع الوقت للمستودعات الجديدة مبدئيا.
run_user_not_match = مستخدم التشغيل غير مطابق لأسم المستخدم الحالي: %s -> %s
invalid_db_setting = إعدادات قاعدة البيانات غير صالحة: %v
invalid_db_table = جدول قاعدة البيانات "%s" غير صالح: %v
default_keep_email_private_popup = أخفِ عناوين البريد الإلكتروني للحسابات الجديدة مبدئيا.
default_keep_email_private.description = أخفِ عناوين البريد الإلكتروني للحسابات الجديدة مبدئيا.
env_config_keys = إعدادات بيئية
default_allow_create_organization = اسمح بإنشاء المنظمات مبدئيا
invalid_app_data_path = مسار بيانات التطبيق غير صالح: %v
@ -236,7 +236,7 @@ internal_token_failed = فشل توليد الرمز الداخلي: %v
no_reply_address = نطاقات البريد الإلكتروني المخفية
default_keep_email_private = أخفِ عناوين البريد الإلكتروني مبدئيا
admin_name = اسم مستخدم المدير
default_allow_create_organization_popup = اسمح بحسابات المستخدمين الجديدة بإنشاء المنظمات مبدئيا.
default_allow_create_organization.description = اسمح بحسابات المستخدمين الجديدة بإنشاء المنظمات مبدئيا.
password_algorithm = خوارزمية تجزئة كلمة المرور
invalid_password_algorithm = خوارزمية بصمة كلمة المرور غير صالحة
password_algorithm_helper = اختر خوارزمية بصمة كلمة المرور. تختلف الخوارزميات في متطلباتها وقوتها. خوارزمية argon2 آمنة لكن تتطلب الكثير من الذاكرة ولذلك قد تكون غير ملائمة للأنظمة الصغيرة.

View file

@ -35,11 +35,11 @@ re_type=Potvrzení hesla
captcha=CAPTCHA
twofa=Dvoufaktorové ověřování
twofa_scratch=Dvoufaktorový kód
passcode=Passcode
passcode=Přístupový kód
webauthn_insert_key=Vložte svůj bezpečnostní klíč
webauthn_sign_in=Stiskněte tlačítko na svém bezpečnostním klíči. Pokud bezpečnostní klíč nemá žádné tlačítko, vložte jej znovu.
webauthn_press_button=Stiskněte prosím tlačítko na bezpečnostním klíči…
webauthn_press_button=Stiskněte tlačítko na bezpečnostním klíči…
webauthn_use_twofa=Použít dvoufaktorový kód z vašeho telefonu
webauthn_error=Nepodařilo se přečíst váš bezpečnostní klíč.
webauthn_unsupported_browser=Váš prohlížeč momentálně nepodporuje WebAuthn.
@ -187,7 +187,7 @@ buttons.list.unordered.tooltip=Přidat odrážkový seznam
buttons.list.ordered.tooltip=Přidat číslovaný seznam
buttons.list.task.tooltip=Přidat seznam úkolů
buttons.mention.tooltip=Zmínit uživatele nebo tým
buttons.ref.tooltip=Odkaz na problém nebo žádost o sloučení
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
@ -206,7 +206,7 @@ network_error=Chyba sítě
server_internal = Interní chyba serveru
[startpage]
app_desc=Snadno přístupná vlastní Git služba
app_desc=Bezproblémová samostatně hostovatelná služba Git
install=Jednoduché na instalaci
install_desc=Jednoduše <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#installation-from-binary">spusťte binární soubor</a> pro vaši platformu, nasaďte jej pomocí <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#container-image">Dockeru</a> nebo si jej stáhněte jako <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download">balíček</a>.
platform=Multiplatformní
@ -277,23 +277,23 @@ register_confirm=Pro registraci vyžadovat potvrzení e-mailu
mail_notify=Zapnout e-mailová oznámení
server_service_title=Nastavení serveru a služeb třetích stran
offline_mode=Povolit místní režim
offline_mode_popup=Zakázat sítě třetích stran pro doručování obsahu a poskytovat veškerý obsah lokálně.
offline_mode.description=Zakázat sítě třetích stran pro doručování obsahu a poskytovat veškerý obsah lokálně.
disable_gravatar=Zakázat Gravatar
disable_gravatar_popup=Zakázat Gravatar a jiné zdroje avatarů třetích stran. Pokud uživatel nenahraje avatar, bude použit výchozí.
disable_gravatar.description=Zakázat Gravatar a jiné zdroje avatarů třetích stran. Pokud uživatel nenahraje avatar, bude použit výchozí.
federated_avatar_lookup=Povolit federované avatary
federated_avatar_lookup_popup=Povolit federované vyhledání avatarů pomocí služby Libravatar.
federated_avatar_lookup.description=Povolit federované vyhledání avatarů pomocí služby Libravatar.
disable_registration=Zakázat uživatelské registrace
disable_registration_popup=Zakázat možnost registrace. Pouze administrátoři budou moci vytvářet nové uživatelské účty.
allow_only_external_registration_popup=Povolit registraci pouze prostřednictvím externích služeb
disable_registration.description=Zakázat možnost registrace. Pouze administrátoři budou moci vytvářet nové uživatelské účty.
allow_only_external_registration.description=Povolit registraci pouze prostřednictvím externích služeb
openid_signin=Povolit přihlášení pomocí OpenID
openid_signin_popup=Povolit přihlášení pomocí služby OpenID.
openid_signin.description=Povolit přihlášení pomocí služby OpenID.
openid_signup=Povolit uživatelskou registraci pomocí OpenID
openid_signup_popup=Povolit uživatelům registrovat se pomocí OpenID.
openid_signup.description=Povolit uživatelům registrovat se pomocí OpenID.
enable_captcha=Povolit CAPTCHA při registraci
enable_captcha_popup=Vyžadovat CAPTCHA při uživatelské registraci.
enable_captcha.description=Vyžadovat CAPTCHA při uživatelské registraci.
require_sign_in_view=Vyžadovat přihlášení pro zobrazení obsahu instance
require_sign_in_view_popup=Povolit přístup ke stránkám jen přihlášeným uživatelům. Návštěvníci uvidí jen stránky přihlášení a registrace.
admin_setting_desc=Vytvoření administrátorského účtu je nepovinné. První zaregistrovaný uživatel se automaticky stane administrátorem.
require_sign_in_view.description=Povolit přístup ke stránkám jen přihlášeným uživatelům. Návštěvníci uvidí jen stránky přihlášení a registrace.
admin_setting.description=Vytvoření administrátorského účtu je nepovinné. První zaregistrovaný uživatel se automaticky stane administrátorem.
admin_title=Nastavení administrátorského účtu
admin_name=Uživatelské jméno administrátora
admin_password=Heslo
@ -313,11 +313,11 @@ save_config_failed=Nepodařilo se uložit konfiguraci: %v
invalid_admin_setting=Nastavení administrátorského účtu je neplatné: %v
invalid_log_root_path=Kořenový adresář protokolů je neplatný: %v
default_keep_email_private=Ve výchozím nastavení skrýt e-mailové adresy
default_keep_email_private_popup=Ve výchozím nastavení skrýt e-mailové adresy nových uživatelských účtů.
default_keep_email_private.description=Ve výchozím nastavení skrýt e-mailové adresy nových uživatelských účtů.
default_allow_create_organization=Povolit novým uživatelům zakládat organizace
default_allow_create_organization_popup=Ve výchozím nastavení povolit novým uživatelským účtům vytvářet organizace.
default_allow_create_organization.description=Ve výchozím nastavení povolit novým uživatelským účtům vytvářet organizace.
default_enable_timetracking=Povolit ve výchozím nastavení sledování času
default_enable_timetracking_popup=Ve výchozím nastavení povolit u nových repozitářů sledovat čas.
default_enable_timetracking.description=Ve výchozím nastavení povolit u nových repozitářů sledovat čas.
no_reply_address=Skrytá e-mailová doména
no_reply_address_helper=Název domény pro uživatele se skrytou e-mailovou adresou. Příklad: pokud je název skryté e-mailové domény nastaven na „noreply.example.org“, uživatelské jméno „joe“ bude zaznamenáno v Gitu jako „joe@noreply.example.org“.
password_algorithm=Hashovací algoritmus hesla
@ -334,7 +334,7 @@ config_location_hint = Tyto konfigurační možnosti budou uloženy do:
[home]
uname_holder=Uživatelské jméno nebo e-mailová adresa
password_holder=Heslo
switch_dashboard_context=Přepnout kontext přehledu
switch_dashboard_context=Přepnout kontext nástěnky
my_repos=Repozitáře
show_more_repos=Zobrazit více repozitářů…
collaborative_repos=Společné repozitáře
@ -409,7 +409,7 @@ resent_limit_prompt=Omlouváme se, ale nedávno jste již požádali o zaslání
has_unconfirmed_mail=Zdravíme, %s, máte nepotvrzenou e-mailovou adresu (<b>%s</b>). 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
email_not_associate=Tato e-mailová adresa není spojena s žádným účtem.
send_reset_mail=Zaslat e-mail pro obnovení účtu
send_reset_mail=Zaslat obnovovací e-mail
reset_password=Obnovení účtu
invalid_code=Tento potvrzovací kód je neplatný nebo mu vypršela platnost.
invalid_code_forgot_password=Váš potvrzovací kód je neplatný nebo mu vypršela platnost. <a href="%s">Klikněte zde</a> pro vytvoření nového kódu.
@ -1588,7 +1588,7 @@ issues.role.collaborator=Spolupracovník
issues.role.collaborator_helper=Tento uživatel byl pozván ke spolupráci v repozitáři.
issues.role.first_time_contributor_helper=Toto je první příspěvek tohoto uživatele do repozitáře.
issues.role.contributor=Přispěvatel
issues.role.contributor_helper=Tento uživatel již dříve přispíval do repozitáře.
issues.role.contributor_helper=Tento uživatel již dříve přispíval do tohoto repozitáře.
issues.re_request_review=Znovu požádat o posouzení
issues.is_stale=Od tohoto posouzení došlo v této žádosti ke změnám
issues.remove_request_review=Odstranit žádost o posouzení
@ -2759,6 +2759,8 @@ settings.transfer.button = Převést vlastnictví
settings.transfer.modal.title = Převést vlastnictví
wiki.search = Hledat na wiki
wiki.no_search_results = Žádné výsledky
n_release_one = %s vydání
n_release_few = %s vydání
[graphs]
component_loading_info = Tohle může chvíli trvat…

View file

@ -275,23 +275,23 @@ register_confirm=E-Mail-Bestätigung benötigt zum Registrieren
mail_notify=E-Mail-Benachrichtigungen aktivieren
server_service_title=Sonstige Server- und Drittserviceeinstellungen
offline_mode=Offline-Modus aktivieren
offline_mode_popup=Drittanbieter-CDNs deaktivieren und alle Ressourcen lokal zustellen.
offline_mode.description=Drittanbieter-CDNs deaktivieren und alle Ressourcen lokal zustellen.
disable_gravatar=Gravatar deaktivieren
disable_gravatar_popup=Gravatar und Drittanbieter-Avatar-Quellen deaktivieren. Ein Standardavatar wird verwendet, bis der Nutzer einen eigenen Avatar hochlädt.
disable_gravatar.description=Gravatar und Drittanbieter-Avatar-Quellen deaktivieren. Ein Standardavatar wird verwendet, bis der Nutzer einen eigenen Avatar hochlädt.
federated_avatar_lookup=Föderierte Profilbilder einschalten
federated_avatar_lookup_popup=Föderierte Profilbilder via Libravatar aktivieren.
federated_avatar_lookup.description=Föderierte Profilbilder via Libravatar aktivieren.
disable_registration=Registrierung deaktivieren
disable_registration_popup=Registrierung neuer Benutzer deaktivieren. Nur Administratoren werden neue Benutzerkonten anlegen können.
allow_only_external_registration_popup=Registrierung nur über externe Services erlauben
disable_registration.description=Registrierung neuer Benutzer deaktivieren. Nur Administratoren werden neue Benutzerkonten anlegen können.
allow_only_external_registration.description=Registrierung nur über externe Services erlauben
openid_signin=OpenID-Anmeldung aktivieren
openid_signin_popup=Benutzeranmeldung via OpenID aktivieren.
openid_signin.description=Benutzeranmeldung via OpenID aktivieren.
openid_signup=OpenID-Selbstregistrierung aktivieren
openid_signup_popup=OpenID-basierte Selbstregistrierung aktivieren.
openid_signup.description=OpenID-basierte Selbstregistrierung aktivieren.
enable_captcha=Registrierungs-Captcha aktivieren
enable_captcha_popup=Eine Captcha-Eingabe bei der Benutzerselbstregistrierung verlangen.
enable_captcha.description=Eine Captcha-Eingabe bei der Benutzerselbstregistrierung verlangen.
require_sign_in_view=Ansehen erfordert Anmeldung
require_sign_in_view_popup=Seitenzugriff auf angemeldete Benutzer beschränken. Besucher sehen nur die Anmelde- und Registrierungsseite.
admin_setting_desc=Das Erstellen eines Administrator-Kontos ist optional. Der erste registrierte Benutzer wird automatisch Administrator.
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_name=Administrator-Benutzername
admin_password=Passwort
@ -311,11 +311,11 @@ save_config_failed=Fehler beim Speichern der Konfiguration: %v
invalid_admin_setting=Administrator-Konto Einstellungen sind ungültig: %v
invalid_log_root_path=Pfad zum Log-Verzeichnis ist ungültig: %v
default_keep_email_private=E-Mail-Adressen standardmäßig verbergen
default_keep_email_private_popup=E-Mail-Adressen von neuen Benutzern standardmäßig verbergen.
default_keep_email_private.description=E-Mail-Adressen von neuen Benutzern standardmäßig verbergen.
default_allow_create_organization=Erstellen von Organisationen standardmäßig erlauben
default_allow_create_organization_popup=Neuen Nutzern das Erstellen von Organisationen standardmäßig erlauben.
default_allow_create_organization.description=Neuen Nutzern das Erstellen von Organisationen standardmäßig erlauben.
default_enable_timetracking=Zeiterfassung standardmäßig aktivieren
default_enable_timetracking_popup=Zeiterfassung standardmäßig für neue Repositorys aktivieren.
default_enable_timetracking.description=Zeiterfassung standardmäßig für neue Repositorys aktivieren.
no_reply_address=Versteckte E-Mail-Domain
no_reply_address_helper=Domain-Name für Benutzer mit einer versteckten Emailadresse. Zum Beispiel wird der Benutzername „Joe“ in Git als „joe@noreply.example.org“ protokolliert, wenn die versteckte E-Mail-Domain „noreply.example.org“ festgelegt ist.
password_algorithm=Passwort Hashing Algorithmus
@ -330,7 +330,7 @@ smtp_from_invalid = Die „Sende E-Mail Als“-Adresse ist ungültig
config_location_hint = Diese Konfigurationsoptionen werden gespeichert in:
[home]
uname_holder=E-Mail-Adresse oder Benutzername
uname_holder=Benutzername oder E-Mail-Adresse
password_holder=Passwort
switch_dashboard_context=Kontext der Übersichtsseite wechseln
my_repos=Repositorys
@ -383,7 +383,7 @@ forks_one = %d Fork
forks_few = %d Forks
[auth]
create_new_account=Konto anlegen
create_new_account=Konto registrieren
register_helper_msg=Hast du bereits ein Konto? Jetzt anmelden!
social_register_helper_msg=Hast du bereits ein Konto? Jetzt verknüpfen!
disable_register_prompt=Die Registrierung ist deaktiviert. Bitte wende dich an den Administrator.
@ -424,7 +424,7 @@ twofa_scratch_token_incorrect=Das Einmalpasswort ist falsch.
login_userpass=Anmelden
tab_openid=OpenID
oauth_signup_tab=Neues Konto registrieren
oauth_signup_title=Neuen Account fertigstellen
oauth_signup_title=Neues Konto fertigstellen
oauth_signup_submit=Konto vervollständigen
oauth_signin_tab=Mit einem existierenden Konto verbinden
oauth_signin_title=Anmelden um verbundenes Konto zu autorisieren
@ -2743,6 +2743,13 @@ 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_few = %s Veröffentlichungen
form.string_too_long = Die Zeichenkette ist länger als %d Zeichen.
settings.federation_settings = Föderationseinstellungen
settings.federation_following_repos = URLs folgender Repositorys. Durch „;“ getrennt, keine Leerzeichen.
settings.federation_not_enabled = Föderation ist auf deiner Instanz nicht aktiviert.
settings.federation_apapiurl = Föderations-URL dieses Repositorys. Kopiere sie und füge sie in die Föderationseinstellungen eines anderen Repositorys als URL eines folgenden Repositorys ein.
[graphs]

View file

@ -274,23 +274,23 @@ register_confirm=Να απαιτείται η επιβεβαίωση της δι
mail_notify=Ενεργοποίηση ειδοποιήσεων email
server_service_title=Ρυθμίσεις διακομιστή και υπηρεσιών τρίτων
offline_mode=Ενεργοποίηση τοπικής λειτουργίας
offline_mode_popup=Απενεργοποιήση των δικτύων διανομής περιεχομένου τρίτων και σερβίρετε όλων των πόρων τοπικά.
offline_mode.description=Απενεργοποιήση των δικτύων διανομής περιεχομένου τρίτων και σερβίρετε όλων των πόρων τοπικά.
disable_gravatar=Απενεργοποίηση Gravatar
disable_gravatar_popup=Το Gravatar και άλλες εξωτερικές πηγές εικόνων προφίλ θα απενεργοποιηθούν. Θα χρησιμοποιηθεί μία προεπιλεγμένη εικόνα προφίλ, εκτός αν ο χρήστης ανεβάσει από μόνος του ένα avatar.
disable_gravatar.description=Το Gravatar και άλλες εξωτερικές πηγές εικόνων προφίλ θα απενεργοποιηθούν. Θα χρησιμοποιηθεί μία προεπιλεγμένη εικόνα προφίλ, εκτός αν ο χρήστης ανεβάσει από μόνος του ένα avatar.
federated_avatar_lookup=Ενεργοποίηση αποκεντρωμένων εικόνων προφίλ
federated_avatar_lookup_popup=Ενεργοποίηση αποκεντρωμένης αναζήτησης εικόνων προφίλ μέσω Libravatar.
federated_avatar_lookup.description=Ενεργοποίηση αποκεντρωμένης αναζήτησης εικόνων προφίλ μέσω Libravatar.
disable_registration=Απενεργοποίηση αυτοεγγραφής
disable_registration_popup=Απενεργοποίηση αυτοεγγραφής χρήστη. Μόνο οι διαχειριστές θα μπορούν να δημιουργήσουν νέους λογαριασμούς χρηστών.
allow_only_external_registration_popup=Να επιτρέπεται η εγγραφή μόνο μέσω εξωτερικών υπηρεσιών
disable_registration.description=Απενεργοποίηση αυτοεγγραφής χρήστη. Μόνο οι διαχειριστές θα μπορούν να δημιουργήσουν νέους λογαριασμούς χρηστών.
allow_only_external_registration.description=Να επιτρέπεται η εγγραφή μόνο μέσω εξωτερικών υπηρεσιών
openid_signin=Ενεργοποίηση σύνδεσης μέσω OpenID
openid_signin_popup=Ενεργοποίηση σύνδεσης χρήστη μέσω OpenID.
openid_signin.description=Ενεργοποίηση σύνδεσης χρήστη μέσω OpenID.
openid_signup=Ενεργοποίηση εγγραφών μέσω OpenID
openid_signup_popup=Ενεργοποίηση ιδιοεγγραφής χρηστών με βάση το OpenID.
openid_signup.description=Ενεργοποίηση ιδιοεγγραφής χρηστών με βάση το OpenID.
enable_captcha=Ενεργοποίηση CAPTCHA στην εγγραφή
enable_captcha_popup=Να απαιτείται CAPTCHA για την δημιουργία λογαριασμού.
enable_captcha.description=Να απαιτείται CAPTCHA για την δημιουργία λογαριασμού.
require_sign_in_view=Να απαιτείται είσοδος για την προβολή περιεχομένων
require_sign_in_view_popup=Περιορισμός της πρόσβασης σε συνδεδεμένους χρήστες. Οι επισκέπτες θα μπορούν μόνο να δουν τις σελίδες εισόδου και εγγραφής.
admin_setting_desc=Η δημιουργία ενός λογαριασμού διαχειριστή είναι προαιρετική. Ο πρώτος εγγεγραμμένος χρήστης θα γίνει αυτόματα διαχειριστής.
require_sign_in_view.description=Περιορισμός της πρόσβασης σε συνδεδεμένους χρήστες. Οι επισκέπτες θα μπορούν μόνο να δουν τις σελίδες εισόδου και εγγραφής.
admin_setting.description=Η δημιουργία ενός λογαριασμού διαχειριστή είναι προαιρετική. Ο πρώτος εγγεγραμμένος χρήστης θα γίνει αυτόματα διαχειριστής.
admin_title=Ρυθμίσεις λογαριασμού διαχειριστή
admin_name=Όνομα χρήστη διαχειριστή
admin_password=Κωδικός Πρόσβασης
@ -310,11 +310,11 @@ save_config_failed=Αποτυχία αποθήκευσης ρυθμίσεων: %
invalid_admin_setting=Η ρύθμιση λογαριασμού διαχειριστή δεν είναι έγκυρη: %v
invalid_log_root_path=Η τοποθεσία αρχείων καταγραφής δεν είναι έγκυρη: %v
default_keep_email_private=Απόκρυψη διευθύνσεων email από προεπιλογή
default_keep_email_private_popup=Απόκρυψη διευθύνσεων email των νέων λογαριασμών χρήστη σαν προεπιλογή.
default_keep_email_private.description=Απόκρυψη διευθύνσεων email των νέων λογαριασμών χρήστη σαν προεπιλογή.
default_allow_create_organization=Να επιτρέπεται η δημιουργία οργανισμών από προεπιλογή
default_allow_create_organization_popup=Επιτρέψτε σε νέους λογαριασμούς χρηστών να δημιουργούν οργανισμούς σαν προεπιλογή.
default_allow_create_organization.description=Επιτρέψτε σε νέους λογαριασμούς χρηστών να δημιουργούν οργανισμούς σαν προεπιλογή.
default_enable_timetracking=Ενεργοποίηση καταγραφής χρόνου από προεπιλογή
default_enable_timetracking_popup=Ενεργοποίηση καταγραφής χρόνου για νέα αποθετήρια σαν προεπιλογή.
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 για κωδικούς

View file

@ -297,24 +297,31 @@ register_confirm = Require email confirmation to register
mail_notify = Enable email notifications
server_service_title = Server and third-party service settings
offline_mode = Enable local mode
offline_mode_popup = Disable third-party content delivery networks and serve all resources locally.
offline_mode.description = Disable third-party content delivery networks and serve all resources locally.
disable_gravatar = Disable Gravatar
disable_gravatar_popup = Disable Gravatar and third-party avatar sources. A default avatar will be used unless a user locally uploads an avatar.
disable_gravatar.description = Disable usage of Gravatar or other third-party avatar sources. Default images will be used for user avatars unless they upload their own avatar to the instance.
federated_avatar_lookup = Enable federated avatars
federated_avatar_lookup_popup = Enable federated avatar lookup using Libravatar.
federated_avatar_lookup.description = Look up avatars using Libravatar.
disable_registration = Disable self-registration
disable_registration_popup = Disable user self-registration. Only administrators will be able to create new user accounts.
allow_only_external_registration_popup = Allow registration only through external services
disable_registration.description = Only instance administrators will be able to create new user accounts. It is highly recommended to keep registration disabled unless you intend to host a public instance for everyone and ready to deal with large amounts of spam accounts.
allow_only_external_registration = Allow registration only via external services
allow_only_external_registration.description = Users will only be able to create new accounts by using configured external services.
openid_signin = Enable OpenID sign-in
openid_signin_popup = Enable user sign-in via OpenID.
openid_signin.description = Allow users to sign in via OpenID.
openid_signup = Enable OpenID self-registration
openid_signup_popup = Enable OpenID-based user self-registration.
openid_signup.description = Allow users to create accounts via OpenID if self-registration is enabled.
enable_captcha = Enable registration CAPTCHA
enable_captcha_popup = Require a CAPTCHA for user self-registration.
enable_captcha.description = Require users to pass CAPTCHA in order to create accounts.
require_sign_in_view = Require to sign-in to view instance content
require_sign_in_view_popup = Limit page access to signed-in users. Visitors will only see the sign-in and registration pages.
admin_setting_desc = Creating an administrator account is optional. The first registered user will automatically become an administrator.
require_sign_in_view.description = Limit content access to signed-in users. Guests will only be able to visit the authentication pages.
default_keep_email_private = Hide email addresses by default
default_keep_email_private.description = Enable email address hiding for new users by default so that this information is not leaked immediately after signing up.
default_allow_create_organization = Allow creation of organizations by default
default_allow_create_organization.description = Allow new users to create organizations by default. When this option is disabled, an admin will have to grant a permission for creating organizations to new users.
default_enable_timetracking = Enable time tracking by default
default_enable_timetracking.description = Allow usage of time tracking feature for new repositories by default.
admin_title = Administrator account settings
admin_setting.description = Creating an administrator account is optional. The first registered user will automatically become an administrator.
admin_name = Administrator username
admin_password = Password
confirm_password = Confirm password
@ -334,12 +341,6 @@ save_config_failed = Failed to save configuration: %v
enable_update_checker_helper_forgejo = It will periodically check for new Forgejo versions by checking a TXT DNS record at release.forgejo.org.
invalid_admin_setting = Administrator account setting is invalid: %v
invalid_log_root_path = The log path is invalid: %v
default_keep_email_private = Hide email addresses by default
default_keep_email_private_popup = Hide email addresses of new user accounts by default.
default_allow_create_organization = Allow creation of organizations by default
default_allow_create_organization_popup = Allow new user accounts to create organizations by default.
default_enable_timetracking = Enable time tracking by default
default_enable_timetracking_popup = Enable time tracking for new repositories by default.
allow_dots_in_usernames = Allow users to use dots in their usernames. Doesn't affect existing accounts.
no_reply_address = Hidden email domain
no_reply_address_helper = Domain name for users with a hidden email address. For example, the username "joe" will be logged in Git as "joe@noreply.example.org" if the hidden email domain is set to "noreply.example.org".
@ -1237,7 +1238,7 @@ tag = Tag
tags = Tags
issues = Issues
pulls = Pull requests
project_board = Projects
project = Projects
packages = Packages
actions = Actions
release = Release
@ -1474,6 +1475,7 @@ issues.new.assignees = Assignees
issues.new.clear_assignees = Clear assignees
issues.new.no_assignees = No assignees
issues.new.no_reviewers = No reviewers
issues.edit.already_changed = Unable to save changes to the issue. It appears the content has already been changed by another user. Please refresh the page and try editing again to avoid overwriting their changes
issues.choose.get_started = Get started
issues.choose.open_external_link = Open
issues.choose.blank = Default
@ -1791,6 +1793,7 @@ compare.compare_head = compare
pulls.desc = Enable pull requests and code reviews.
pulls.new = New pull request
pulls.view = View pull request
pulls.edit.already_changed = Unable to save changes to the pull request. It appears the content has already been changed by another user. Please refresh the page and try editing again to avoid overwriting their changes
pulls.compare_changes = New pull request
pulls.allow_edits_from_maintainers = Allow edits from maintainers
pulls.allow_edits_from_maintainers_desc = Users with write access to the base branch can also push to this branch
@ -1946,6 +1949,8 @@ pulls.recently_pushed_new_branches = You pushed on branch <a href="%[3]s"><stron
pull.deleted_branch = (deleted):%s
comments.edit.already_changed = Unable to save changes to the comment. It appears the content has already been changed by another user. Please refresh the page and try editing again to avoid overwriting their changes
milestones.new = New milestone
milestones.closed = Closed %s
milestones.update_ago = Updated %s
@ -3249,7 +3254,7 @@ config.service_config = Service configuration
config.register_email_confirm = Require email confirmation to register
config.disable_register = Disable self-registration
config.allow_only_internal_registration = Allow registration only through Forgejo itself
config.allow_only_external_registration = Allow registration only through external Services
config.allow_only_external_registration = Allow registration only through external services
config.enable_openid_signup = Enable OpenID self-registration
config.enable_openid_signin = Enable OpenID sign-in
config.show_registration_button = Show register button
@ -3724,6 +3729,7 @@ runs.workflow = Workflow
runs.invalid_workflow_helper = Workflow config file is invalid. Please check your config file: %s
runs.no_matching_online_runner_helper = No matching online runner with label: %s
runs.no_job_without_needs = The workflow must contain at least one job without dependencies.
runs.no_job = The workflow must contain at least one job
runs.actor = Actor
runs.status = Status
runs.actors_no_select = All actors

View file

@ -196,13 +196,13 @@ run_user = Rulu kiel uzanto
log_root_path = Protokola dosiervojo
err_admin_name_is_invalid = Uzantonomo de administranto malvalidas
log_root_path_helper = Protokoloj skribiĝos en ĉi tiun dosierujon.
allow_only_external_registration_popup = Permesi registriĝojn sole per fremdaj servoj
allow_only_external_registration.description = Permesi registriĝojn sole per fremdaj servoj
user = Uzantonomo
smtp_addr = SMTP adreso
smtp_port = SMTP adrespordo
disable_registration = Malŝalti registriĝon
reinstall_confirm_check_3 = Vi asertas ke vi plencertas ke tiu ĉi Forgejo ruliĝas per la ĝusta app.ini, kaj ke vi certas ke devas reinstali. Vi asertas ke vi bone komprenas la supre menciitajn danĝerojn.
federated_avatar_lookup_popup = Ŝaltas serĉadon de profilbildoj el federaj fontoj per Libravatar.
federated_avatar_lookup.description = Ŝaltas serĉadon de profilbildoj el federaj fontoj per Libravatar.
mailer_password = SMTP pasvorto
repo_path = Deponeja dosiervojo
err_empty_admin_email = La retpoŝtadreso de administranto ne malplenu.
@ -212,13 +212,13 @@ openid_signup = Ŝalti registriĝon per OpenID
reinstall_confirm_check_2 = Deponejoj kaj agordoj eble devos re-interakordiĝi. Ŝaltinte tiun ĉi skatolon, vi asertas ke vi permane interakordigos kaj la hokojn por la deponejoj kaj authorized_keys. Vi asertas, ke deponejaj kaj spegulaj agordoj pravas.
path = Vojo
no_admin_and_disable_registration = Neeblas malŝalti memregistradon sen kreiĝo de administranta konto.
disable_gravatar_popup = Malŝaltas Gravatar kaj fremdajn fontojn de profilbildoj. Implicita profilbildo uziĝos, krom se la uzanto alŝutus loke profilbildon.
offline_mode_popup = Malŝaltas uzon de fremdaj serviloj por datumosendoj, ĉio datumo sendiĝos deloke.
disable_gravatar.description = Malŝaltas Gravatar kaj fremdajn fontojn de profilbildoj. Implicita profilbildo uziĝos, krom se la uzanto alŝutus loke profilbildon.
offline_mode.description = Malŝaltas uzon de fremdaj serviloj por datumosendoj, ĉio datumo sendiĝos deloke.
reinstall_confirm_message = Reinstalado al jamekzistanta Forgejo-datumbazo povas okazigi plurajn problemojn. Vi kredeble anstataŭe rulu Forgejon kun via jama «app.ini». Sed se vi certas, ke vi komprenas kion vi faras, asertu jene:
run_user_helper = Forgejo ruliĝos sub tiu ĉi uzanto de via operaciumo. Sciu, ke tiu ĉi uzanto bezonos aliron al la dosiervojon de deponejoj.
domain = Retnomo
err_admin_name_pattern_not_allowed = Uzantonomo de administranto malvalidas, ĉar la nomo akordas rezervan ŝablonon
disable_registration_popup = Malŝaltas registriĝojn. Sole administrantoj rajtos krei novajn kontojn.
disable_registration.description = Malŝaltas registriĝojn. Sole administrantoj rajtos krei novajn kontojn.
db_schema = Skemo
reinstall_error = Vi provas instali al jamekzistanta Forgejo-datumbazo
err_empty_admin_password = La pasvorto de administranto ne malplenu.
@ -242,9 +242,9 @@ app_url = Forgejo Baza URL
ssl_mode = SSL
db_title = Datumbazaj agordoj
err_empty_db_path = La datumbazovojo de SQLite3 ne malplenu.
openid_signin_popup = Ŝaltas salutadon per OpenID.
openid_signin.description = Ŝaltas salutadon per OpenID.
smtp_from_helper = Retpoŝtadreson kiun uzos Forgejo. Enmetu ordinaran adreson aŭ laŭ la formo «"Name" <email@example.com>».
enable_captcha_popup = Postulas teston de homeco dum registriĝoj.
enable_captcha.description = Postulas teston de homeco dum registriĝoj.
ssh_port_helper = Adresporda numero kiun atentas via SSH-servilo. Lasu malplena por malŝalti.
lfs_path = Git LFS dosiervojo
app_name_helper = Vi povas enmeti la nomon de via kompanio ĉi tien.
@ -253,7 +253,7 @@ http_port = Forgejo HTTP adrespordo
db_schema_helper = Lasu malplena por implicita («public»).
ssh_port = SSH adrespordo
err_admin_name_is_reserved = Uzantonomo de administranto malvalidas, tiu uzantonomo estas rezerva
openid_signup_popup = Ŝaltas uzantregistriĝon per OpenID.
openid_signup.description = Ŝaltas uzantregistriĝon per OpenID.
db_type = Datumbazospeco
email_title = Retpoŝtaj agordoj
offline_mode = Ŝalti lokan reĝimon
@ -266,7 +266,7 @@ admin_password = Pasvorto
admin_title = Administrantaj kontagordoj
admin_email = Retpoŝtadreso
install_btn_confirm = Instali Forgejon
require_sign_in_view_popup = Kaŝi paĝon de ajna nesalutinto. Vizitantoj sole vidos salutajn kaj registriĝajn paĝojn.
require_sign_in_view.description = Kaŝi paĝon de ajna nesalutinto. Vizitantoj sole vidos salutajn kaj registriĝajn paĝojn.
invalid_db_setting = La datumbazaj agordoj malvalidas: %v
invalid_db_table = La datumbaza tabelo «%s» malvalidas: %v
sqlite3_not_available = Ĉi tiu versio de Forgejo ne subtenas SQLite3. Bonvolu elŝuti la oficialan ruldosieron de %s (ne la version «gobuild»).
@ -275,7 +275,7 @@ test_git_failed = Ne povis testi programon «git»: %v
confirm_password = Konfirmi pasvorton
invalid_repo_path = La deponeja dosiervojo malvalidas: %v
admin_name = Administranto uzantonomo
admin_setting_desc = Krei administranton estas malnepra. La unue registrota uzanto memage iĝos administranto.
admin_setting.description = Krei administranton estas malnepra. La unue registrota uzanto memage iĝos administranto.
run_user_not_match = La «rulu kiel» uzantonomo ne samas al la nuna uzantonomo: %s -> %s
secret_key_failed = Malsukcesis kreante sekretan ŝlosilon: %v
save_config_failed = Malsukcesis konservante agordojn: %v
@ -283,13 +283,13 @@ invalid_admin_setting = Agordoj de administranta konto malvalidas: %v
enable_update_checker_helper_forgejo = Foje serĉas novajn versiojn de Forgejo per kontrolado de DNS TXT registraĵo ĉe release.forgejo.org.
invalid_log_root_path = La protokola dosiervojo malvalidas: %v
default_enable_timetracking = Ŝalti tempospuradon implicite
default_enable_timetracking_popup = Ŝaltus tempospuradon por novaj deponejoj implicite.
default_keep_email_private_popup = Kaŝus retpoŝtadresojn de novaj kontoj implicite.
default_enable_timetracking.description = Ŝaltus tempospuradon por novaj deponejoj implicite.
default_keep_email_private.description = Kaŝus retpoŝtadresojn de novaj kontoj implicite.
default_allow_create_organization = Permesi kreadon de organizaĵoj implicite
allow_dots_in_usernames = Permesi ĉeeston de punktoj en uzantonomoj. Ne efikas je jamaj kontoj.
no_reply_address = Retnomo de retpoŝtaj kaŝadresoj
default_keep_email_private = Kaŝi retpoŝtadresojn implicite
default_allow_create_organization_popup = Permesus novajn uzantojn krei organizaĵojn implicite.
default_allow_create_organization.description = Permesus novajn uzantojn krei organizaĵojn implicite.
env_config_keys_prompt = La jenaj mediaj variantoj ankaŭ fandiĝos kun via agordodosiero:
no_reply_address_helper = Retnomo kiu uziĝus por uzantoj kun kaŝita retpoŝtadreso. Ekzemple, la uzanto «adamo» protokoliĝus je Git kiel «adamo@nerespondu.ekzemplo.org» se la adreskaŝa retnomo estus «nerespondu.ekzemplo.org».
enable_update_checker = Ŝalti novversian kontrolanton

View file

@ -267,23 +267,23 @@ 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_popup=Deshabilitar redes de distribución de contenido de terceros y servir todos los recursos localmente.
offline_mode.description=Deshabilitar redes de distribución de contenido de terceros y servir todos los recursos localmente.
disable_gravatar=Desactivar Gravatar
disable_gravatar_popup=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 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_popup=Habilitar búsqueda de avatares federador para usar el servicio federado de código abierto basado en libravatar.
federated_avatar_lookup.description=Habilitar búsqueda de avatares federador para usar el servicio federado de código abierto basado en libravatar.
disable_registration=Deshabilitar auto-registro
disable_registration_popup=Deshabilitar auto-registro de usuarios. Sólo los administradores podrán crear nuevas cuentas de usuario.
allow_only_external_registration_popup=Permitir el registro únicamente a través de servicios externos
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
openid_signin=Habilitar el inicio de sesión con OpenID
openid_signin_popup=Habilitar el inicio de sesión de usuarios con OpenID.
openid_signin.description=Habilitar el inicio de sesión de usuarios con OpenID.
openid_signup=Habilitar el auto-registro con OpenID
openid_signup_popup=Habilitar autorregistro de usuario basado en OpenID.
openid_signup.description=Habilitar autorregistro de usuario basado en OpenID.
enable_captcha=Requerir CAPTCHA durante el registro
enable_captcha_popup=Requerir CAPTCHA para auto-registro de usuario.
enable_captcha.description=Requerir CAPTCHA para auto-registro de usuario.
require_sign_in_view=Requerir inicio de sesión para ver páginas
require_sign_in_view_popup=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_desc=Crear una cuenta de administrador es opcional. El primer usuario registrado se convertirá automáticamente en administrador.
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
@ -303,11 +303,11 @@ 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_popup=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 de usuario por defecto.
default_allow_create_organization=Permitir la creación de organizaciones por defecto
default_allow_create_organization_popup=Permitir que las nuevas cuentas de usuario creen organizaciones por defecto.
default_allow_create_organization.description=Permitir que las nuevas cuentas de usuario creen organizaciones por defecto.
default_enable_timetracking=Activar el seguimiento de tiempo por defecto
default_enable_timetracking_popup=Activar el seguimiento de tiempo para nuevos repositorios 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

View file

@ -200,22 +200,22 @@ register_confirm=نیاز به تایید ایمیل ثبت نام
mail_notify=فعال‌سازی اعلان‌های ایمیل
server_service_title=تنظیمات سرور و سرویس‌های شخص ثالث
offline_mode=فعال کردن حالت محلی
offline_mode_popup=غیر فعال کردن شبکه های شخص ثالث تحویل محتوا و استفاده از تمام منابع به صورت محلی.
offline_mode.description=غیر فعال کردن شبکه های شخص ثالث تحویل محتوا و استفاده از تمام منابع به صورت محلی.
disable_gravatar=غیر فعال کردن Gravatar
disable_gravatar_popup=غیر فعال کردن کلیک و منابع آواتار شخص ثالث. مگر در مواردی که کاربر محلی بارگزاری آواتار پیش فرض استفاده خواهد شد.
disable_gravatar.description=غیر فعال کردن کلیک و منابع آواتار شخص ثالث. مگر در مواردی که کاربر محلی بارگزاری آواتار پیش فرض استفاده خواهد شد.
federated_avatar_lookup=فعال سازی آواتار مشترک
federated_avatar_lookup_popup=مراجعه مشترک آواتار با استفاده از Libravatar را قادر می سازد.
federated_avatar_lookup.description=مراجعه مشترک آواتار با استفاده از Libravatar را قادر می سازد.
disable_registration=غیرفعال‌کردن خود ثبت نامی
disable_registration_popup=غیرفعال کردن ثبت نام کاربر. تنها مدیر ها قادر خواهند بود حساب کاربری جدید اضافه کنند.
allow_only_external_registration_popup=اجازه ثبت نام فقط از طریق خدمات خارجی
disable_registration.description=غیرفعال کردن ثبت نام کاربر. تنها مدیر ها قادر خواهند بود حساب کاربری جدید اضافه کنند.
allow_only_external_registration.description=اجازه ثبت نام فقط از طریق خدمات خارجی
openid_signin=فعالسازی ورود با OpenID
openid_signin_popup=فعالسازی ورود کاربر با OpenID.
openid_signin.description=فعالسازی ورود کاربر با OpenID.
openid_signup=فعالسازی ثبت نام با OpenID
openid_signup_popup=فعال سازی ثبت نام با استفاده از OpenID.
openid_signup.description=فعال سازی ثبت نام با استفاده از OpenID.
enable_captcha=فعالسازی CAPTCHA برای ثبت نام
enable_captcha_popup=عضویت افراد نیازمند کپچا است.
enable_captcha.description=عضویت افراد نیازمند کپچا است.
require_sign_in_view=فعال‌سازی نیازمند به ورود در هنگام مشاهده صفحات
admin_setting_desc=ساخت حساب مدیر اختیاری است. اولین کاربری که ثبت‌نام میکنید مدیر خواهد بود.
admin_setting.description=ساخت حساب مدیر اختیاری است. اولین کاربری که ثبت‌نام میکنید مدیر خواهد بود.
admin_title=تنظیمات حساب مدیر
admin_name=نام کاربری مدیر
admin_password=گذرواژه
@ -234,11 +234,11 @@ save_config_failed=تنظیمات ذخیره نشد: %v
invalid_admin_setting=تنظیمات حساب مدیر نامعتبر است: %v
invalid_log_root_path=مسیر گزارش معتبر نیست: %v
default_keep_email_private=مخفی کردن نشانی های ایمیل به صورت پیش فرض
default_keep_email_private_popup=مخفی کردن نشانی های ایمیل از حساب های کاربر جدید به صورت پیش فرض.
default_keep_email_private.description=مخفی کردن نشانی های ایمیل از حساب های کاربر جدید به صورت پیش فرض.
default_allow_create_organization=اجازه ایجاد سازمان به صورت پیش فرض
default_allow_create_organization_popup=اجازه به کاربران جدید برای ایجاد سازمان به صورت پیش‌فرض.
default_allow_create_organization.description=اجازه به کاربران جدید برای ایجاد سازمان به صورت پیش‌فرض.
default_enable_timetracking=فعال سازی پیگیری زمان به صورت پیش فرض
default_enable_timetracking_popup=فعالسازی پیگیری زمان برای سازمان‌های جدید به صورت پیش‌فرض.
default_enable_timetracking.description=فعالسازی پیگیری زمان برای سازمان‌های جدید به صورت پیش‌فرض.
no_reply_address=مخفی کردن دامنه ایمیل
no_reply_address_helper=نام دامنه برای کاربران دارای آدرس ایمیل پنهان است. به عنوان مثال ، اگر نام دامنه ایمیل مخفی روی "noreply.example.org" تنظیم شده باشد ، نام کاربری "joe" در Git به عنوان "joe@noreply.example.org" وارد می شود
password_algorithm=الگوریتم درهم‌ساز گذرواژه

View file

@ -223,22 +223,22 @@ register_confirm=Vaadi sähköpostin vahvistaminen rekisteröintiin
mail_notify=Ota käyttöön sähköpostiilmoitukset
server_service_title=Palvelin ja kolmansien osapuolten palveluiden asetukset
offline_mode=Ota käyttöön lokaali tila
offline_mode_popup=Poista kolmannen osapuolen sisällöstä jakeluverkot ja tarjoa kaikki resurssit paikallisesti.
offline_mode.description=Poista kolmannen osapuolen sisällöstä jakeluverkot ja tarjoa kaikki resurssit paikallisesti.
disable_gravatar=Poista Gravatar käytöstä
disable_gravatar_popup=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa.
disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa.
federated_avatar_lookup=Käytä ulkopuolisia profiilikuvia
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar.
federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar.
disable_registration=Poista rekisteröinti käytöstä
disable_registration_popup=Poista käyttäjän itse-rekisteröinti, vain ylläpito voi luoda tilejä.
allow_only_external_registration_popup=Salli rekisteröinti vain ulkopuolisista palveluista
disable_registration.description=Poista käyttäjän itse-rekisteröinti, vain ylläpito voi luoda tilejä.
allow_only_external_registration.description=Salli rekisteröinti vain ulkopuolisista palveluista
openid_signin=Ota OpenID kirjautuminen käyttöön
openid_signin_popup=Ota käyttöön kirjautuminen OpenID:n kautta.
openid_signin.description=Ota käyttöön kirjautuminen OpenID:n kautta.
openid_signup=Ota käyttöön OpenID itse-rekisteröinti
openid_signup_popup=Ota käyttöön OpenID-pohjainen käyttäjän itse-rekisteröinti.
openid_signup.description=Ota käyttöön OpenID-pohjainen käyttäjän itse-rekisteröinti.
enable_captcha=Ota käyttöön CAPTCHA rekisteröityessä
enable_captcha_popup=Pakollinen captcha käyttäjän itse rekisteröityessä.
enable_captcha.description=Pakollinen captcha käyttäjän itse rekisteröityessä.
require_sign_in_view=Vaadi sisäänkirjautuminen sivujen näkemiseksi
admin_setting_desc=Ylläpitotilin luominen on valinnaista. Ensimmäisestä rekisteröityneestä käyttäjästä tulee automaattisesti ylläpitäjä.
admin_setting.description=Ylläpitotilin luominen on valinnaista. Ensimmäisestä rekisteröityneestä käyttäjästä tulee automaattisesti ylläpitäjä.
admin_title=Ylläpitotilin asetukset
admin_name=Ylläpitäjän käyttäjätunnus
admin_password=Salasana
@ -253,9 +253,9 @@ invalid_app_data_path=Sovelluksen datapolku on virheellinen: %v
internal_token_failed=Sisäisen pääsymerkin luonti epäonnistui: %v
save_config_failed=Asetusten tallentaminen epäonnistui: %v
default_keep_email_private=Piilota sähköpostiosoitteet oletuksena
default_keep_email_private_popup=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet.
default_keep_email_private.description=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet.
default_enable_timetracking=Ota ajan seuranta oletusarvoisesti käyttöön
default_enable_timetracking_popup=Ota käyttöön uusien repojen aikaseuranta oletusarvoisesti.
default_enable_timetracking.description=Ota käyttöön uusien repojen aikaseuranta oletusarvoisesti.
no_reply_address=Piilotettu sähköpostin verkkotunnus
no_reply_address_helper=Verkkotunnuksen nimi käyttäjille, joilla on piilotettu sähköpostiosoite. Esimerkiksi käyttäjätunnus 'joe' kirjataan Git nimellä 'joe@noreply.example.org' jos piilotettu sähköpostiosoite on asetettu 'noreply.example.org'.
password_algorithm=Salasanan hajautusalgoritmi

View file

@ -144,16 +144,16 @@ copy_generic = Kopyahin sa clipboard
[home]
search_repos = Maghanap ng Repository…
switch_dashboard_context = Palitan ang Dashboard Context
switch_dashboard_context = Palitan ang dashboard context
show_only_unarchived = Pinapakita lang ang hindi naka-archive
password_holder = Password
my_repos = Mga Repositoryo
show_more_repos = Magpakita ng higit pang mga repositoryo…
collaborative_repos = Mga Collaboritive na Repositoryo
collaborative_repos = Mga pagtutulungan na repositoryo
my_orgs = Mga Organisasyon
my_mirrors = Aking Mga Mirror
view_home = Itignan ang %s
filter = Iba pang Mga Filter
filter = Iba pang mga filter
filter_by_team_repositories = I-filter sa mga repositoryo ng koponan
feed_of = Feed ng "%s"
show_archived = Naka-archive
@ -164,7 +164,7 @@ show_both_private_public = Pinapakita ang publiko at pribado
show_only_private = Pinapakita lang ang pribado
show_only_public = Pinapakita lang ang publiko
issues.in_your_repos = Sa iyong mga repositoryo
uname_holder = Username o Email address
uname_holder = Username o email address
[explore]
organizations = Mga Organisasyon
@ -199,13 +199,13 @@ footer = Footer
footer.links = Mga Link
[error]
report_message = Kung naniniwala kang ito ay isang bug ng Forgejo, mangyaring maghanap ng mga isyu sa <a href="https://codeberg.org/forgejo/forgejo/issues" target="_blank">Codeberg</a> magbukas ng bagong isyu kapag kailangan.
report_message = Kung naniniwala ka na ito ay isang bug ng Forgejo, mangyaring maghanap ng mga isyu sa <a href="https://codeberg.org/forgejo/forgejo/issues" target="_blank">Codeberg</a> o magbukas ng bagong isyu kapag kailangan.
occurred = May nangyaring error
missing_csrf = Masamang Kahilingan: walang CSRF token
invalid_csrf = Masamang Kahilingan: hindi angkop na CSRF token
not_found = Hindi mahanap ang target.
network_error = Error sa network
server_internal = Panloob na pakgamali sa serbiro
server_internal = Panloob na error sa server
[install]
reinstall_error = Sinusubukan mong mag-install sa umiiral na Forgejo database
@ -269,16 +269,16 @@ register_confirm = Kailanganin ang kumpirmasyon sa email para magrehistro
mail_notify = Paganahin ang mga email notification
disable_gravatar = I-disable ang Gravatar
federated_avatar_lookup = I-enable ang mga naka-federate na avatar
federated_avatar_lookup_popup = I-enable ang naka-federate na paghahanap ng avatar gamit ng Libravatar.
federated_avatar_lookup.description = I-enable ang naka-federate na paghahanap ng avatar gamit ng Libravatar.
disable_registration = I-disable ang pansariling pagrehistro
allow_only_external_registration_popup = Payagan lang ang pagrehistro sa pamamagitan ng mga external na serbisyo
allow_only_external_registration.description = Payagan lang ang pagrehistro sa pamamagitan ng mga external na serbisyo
openid_signin = I-enable ang OpenID sign-in
openid_signin_popup = I-enable ang pag-sign in ng user gamit ng OpenID.
openid_signin.description = I-enable ang pag-sign in ng user gamit ng OpenID.
openid_signup = I-enable ang OpenID na pansariling pagrehistro
openid_signup_popup = I-enable ang OpenID-based na pansariling pagrehistro ng user.
openid_signup.description = I-enable ang OpenID-based na pansariling pagrehistro ng user.
enable_captcha = I-enable ang CAPTCHA sa pagrehistro
enable_captcha_popup = Kailanganin ang CAPTCHA sa pansariling pagrehistro ng user.
require_sign_in_view_popup = Limitahan ang access ng pahina sa mga naka-sign in na user. Makikita lang ng mga bisita ang sign-in at pagrehistro na mga pahina.
enable_captcha.description = Kailanganin ang CAPTCHA sa pansariling pagrehistro ng user.
require_sign_in_view.description = Limitahan ang access ng pahina sa mga naka-sign in na user. Makikita lang ng mga bisita ang sign-in at pagrehistro na mga pahina.
admin_title = Mga setting ng account ng tagapangasiwa
admin_name = Username ng tagapangasiwa
admin_password = Password
@ -298,10 +298,10 @@ save_config_failed = Nabigong i-save ang configuration: %v
invalid_admin_setting = Hindi angkop ang setting ng account ng tagapangasiwa: %v
invalid_log_root_path = Hindi angkop ang log path: %v
default_keep_email_private = Itago ang mga email address bilang default
default_keep_email_private_popup = Itago ang mga email address ng mga bagong user account bilang default.
default_allow_create_organization_popup = Payagan ang mga bagong user account ng gumawa ng mga organisasyon bilang default.
default_keep_email_private.description = Itago ang mga email address ng mga bagong user account bilang default.
default_allow_create_organization.description = Payagan ang mga bagong user account ng gumawa ng mga organisasyon bilang default.
default_enable_timetracking = I-enable ang pagsubaybay ng oras bilang default
default_enable_timetracking_popup = I-enable ang pagsubaybay ng oras sa mga bagong repositoryo bilang default.
default_enable_timetracking.description = I-enable ang pagsubaybay ng oras sa mga bagong repositoryo bilang default.
allow_dots_in_usernames = Payagan ang mga user na gamitin ang mga tuldok sa kanilang username. Hindi inaapektuhan ang mga umiiral na account.
no_reply_address = Domain ng nakatagong email
no_reply_address_helper = Domain name para sa mga user na may nakatagong email address. Halimbawa, ang username na "kita" ay mala-log sa Git bilang "kita@noreply.example.org" kapag ang nakatagong email domain ay nakatakda sa "noreply.example.org".
@ -311,14 +311,14 @@ password_algorithm_helper = Itakda ang password hashing algorithm. Ang mga algor
enable_update_checker = I-enable ang tagasuri ng update
env_config_keys = Configuration ng Environment
env_config_keys_prompt = Ang mga sumusunod na mga environment variable ay ia-apply rin sa iyong configuration file:
offline_mode_popup = I-disable ang lahat ng mga third-party na content delivery network at ibahagi ang lahat ng mga resources ng locally.
offline_mode.description = I-disable ang lahat ng mga third-party na content delivery network at ibahagi ang lahat ng mga resources ng locally.
require_sign_in_view = Kailanganin ang pag-sign in para tignan ang nilalaman ng instansya
enable_update_checker_helper_forgejo = Pansamantalang susuriin ito para sa mga bagong bersyon ng Forgejo sa pamamagitan ng pagsuri sa isang tala ng TXT DNS sa release.forgejo.org.
sqlite3_not_available = Ang itong bersyon ng Forgejo ay hindi sinusuportahan ang SQLite3. Paki-download ang opisyal na bersyon ng binary sa %s (hindi ang "gobuild" na bersyon).
default_allow_create_organization = Payagan ang paggawa ng mga organisasyon bilang default
disable_registration_popup = I-disable ang pansariling pagrehistro ng user. Ang mga tagapangasiwa lamang ang makakagawa ng mga bagong user account.
disable_gravatar_popup = I-disable ang Gravatar at mga third-party na avatar source. Ang isang default na avatar ay gagamitin maliban kung maga-upload ng avatar ang user.
admin_setting_desc = Ang paggawa ng administrator account ay opsyonal. Ang pinakaunang nakarehistro na user ay awtomatikong magiging tagapangasiwa.
disable_registration.description = I-disable ang pansariling pagrehistro ng user. Ang mga tagapangasiwa lamang ang makakagawa ng mga bagong user account.
disable_gravatar.description = I-disable ang Gravatar at mga third-party na avatar source. Ang isang default na avatar ay gagamitin maliban kung maga-upload ng avatar ang user.
admin_setting.description = Ang paggawa ng administrator account ay opsyonal. Ang pinakaunang nakarehistro na user ay awtomatikong magiging tagapangasiwa.
[heatmap]
number_of_contributions_in_the_last_12_months = %s mga kontribusyon sa nakalipas na 12 buwan
@ -362,20 +362,20 @@ install_desc = <a target="_blank" rel="noopener noreferrer" href="https://forgej
license_desc = Kunin ang <a target="_blank" rel="noopener noreferrer" href="https://codeberg.org/forgejo/forgejo">Forgejo</a>! Sumali ka sa pamamagitan ng <a target="_blank" rel="noopener noreferrer" href="https://codeberg.org/forgejo/forgejo">pag-contribute</a> para gawing mas mahusay ang proyekto. Wag kang mahiya para maging isang contributor!
[auth]
create_new_account = Magrehistro ng Account
create_new_account = Magrehistro ng account
register_helper_msg = May account ka na? Mag-sign in ngayon!
social_register_helper_msg = May account ka na? I-link ngayon!
disable_register_prompt = Naka-disable ang pagrehistro. Mangyaring makipag-ugnayan sa tagapangasiwa ng site.
disable_register_mail = Ang kumpirmasyon sa pamamagitan ng Email sa pagrehistro ay naka-disable.
remember_me = Tandaan ang device na ito
forgot_password_title = Nakalimutan ang Password
forgot_password_title = Nakalimutan ang password
forgot_password = Nakalimutan ang password?
sign_up_now = Kailangan ng isang account? Magrehistro ngayon.
sign_up_successful = Matagumpay na nagawa ang account. Maligayang pagdating!
must_change_password = Baguhin ang iyong password
allow_password_change = Kailanganin ang user na palitan ang password (inirerekomenda)
reset_password_mail_sent_prompt = Ang isang bagong email pang-kumpirma ay ipinadala sa <b>%s</b>. Pakisuri ang iyong inbox sa loob ng %s para tapusin ang proseso ng pag-recover ng account.
active_your_account = Aktibahin Ang Iyong 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.
@ -385,8 +385,8 @@ change_unconfirmed_email = Kung nagbigay ka ng maling email address habang nagpa
change_unconfirmed_email_error = Hindi mapalitan ang email address: %v
resend_mail = Pindutin dito para ipadala muli ang activation email
email_not_associate = Ang email address ay hindi nauugnay sa anumang account.
send_reset_mail = Magpadala ng Account Recovery Email
reset_password = Pag-recover ng Account
send_reset_mail = Magpadala ng recovery email
reset_password = Pag-recover ng account
reset_password_helper = I-recover ang Account
reset_password_wrong_user = Naka-sign in ka bilang %s, pero ang account recovery link ay para kay %s
password_too_short = Ang haba ng password ay hindi maaaring mas mababa sa %d character.
@ -398,11 +398,11 @@ twofa_passcode_incorrect = Mali ang iyong passcode. Kung nawala mo ang iyong dev
twofa_scratch_token_incorrect = Mali ang iyong scratch code.
login_userpass = Mag-Sign In
login_openid = OpenID
oauth_signup_tab = Mag-rehistro ng Bagong Account
oauth_signup_title = Kumpletuhin ang Bagong Account
oauth_signup_submit = Kumpletuhin ang Account
oauth_signup_tab = Mag-rehistro ng bagong account
oauth_signup_title = Kumpletuhin ang bagong account
oauth_signup_submit = Kumpletuhin ang account
oauth_signin_tab = Mag-link sa umiiral na account
oauth_signin_submit = I-link ang Account
oauth_signin_submit = I-link ang account
oauth.signin.error.access_denied = Tinanggihan ang hiling ng pahintulutan.
oauth.signin.error.temporarily_unavailable = Nabigo ang awtorisasyon dahil pansamantalang hindi available ang authentication server. Mangyaring subukan muli sa ibang pagkakataon.
openid_connect_submit = Kumonekta
@ -1078,7 +1078,7 @@ archive.pull.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa
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.
pulls = Mga hiling sa paghila
activity.merged_prs_count_n = Mga naisamang hiling sa paghatak
activity.merged_prs_count_n = Mga naisamang hiling sa paghila
wiki.last_updated = Huling binago %s
file.title = %s sa %s
file_view_raw = Tingnan ng raw
@ -1365,7 +1365,7 @@ editor.push_rejected_summary = Buong mensahe ng pagtanggi:
commitstatus.success = Tagumpay
commitstatus.failure = Nabigo
projects.type.none = Wala
issues.label_edit =
issues.label_edit =Baguhin
issues.deleted_milestone = `(binura)`
issues.add_time_hours = Oras
projects.column.color = Kulay
@ -1379,8 +1379,8 @@ pulls.new = Bagong hiling sa paghila
issues.ref_reopened_from = `<a href="%[3]s">binuksang muli ang isyung %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
settings.event_issues_desc = Binuksan, sinara, muling binuksan, o binago ang isyu.
activity.new_issue_label = Nabuksan
activity.merged_prs_count_1 = Naisamang hiling sa paghatak
activity.opened_prs_count_1 = Inimungkahing hiling sa paghatak
activity.merged_prs_count_1 = Naisamang hiling sa paghila
activity.opened_prs_count_1 = Inimungkahing hiling sa paghila
activity.opened_prs_label = Inimungkahi
pulls.reopened_at = `nabuksang muli ang hiling sa paghatak na <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.opened_by_fake = binuksan ang %[1]s ni/ng %[2]s
@ -1393,7 +1393,7 @@ 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.
issues.new = Bagong isyu
issues.commented_at = `iniwan ang komento <a href="#%s">%s</a>`
issues.commented_at = `nagkomento <a href="#%s">%s</a>`
editor.patch = Ilapat ang patch
editor.new_patch = Bagong patch
editor.create_new_branch = Gumawa ng <strong>bagong branch</strong> para sa commit na ito at simulan ang hiling sa paghatak.
@ -1443,7 +1443,7 @@ editor.file_editing_no_longer_exists = Ang file na ine-edit, "%s", ay hindi na u
editor.filename_is_a_directory = Ang pangalan ng file "%s" ay ginagamit na bilang pangalan ng direktoryo sa repositoryo na ito.
editor.file_is_a_symlink = `Ang %s ay isang symbolink link. Hindi mae-edit ang mga symbolic link sa web editor`
editor.directory_is_a_file = Ang pangalan ng direktoryo "%s" ay ginagamit na bilang pangalan ng file sa repositoryo na ito.
pulls.merged_by =
pulls.merged_by =ni/ng <a href="%[2]s">%[3]s</a> ay naisama %[1]s
commitstatus.pending = Nakabinbin
issues.review.pending = Nakabinbin
pulls.status_checking = Nakabinbin ang ilang mga [pagsusuri]
@ -1459,8 +1459,8 @@ activity.period.quarterly = 3 buwan
issues.review.left_comment = iniwan ang [comment]
pulls.compare_base = isama sa
activity.git_stats_additions = at mayroong
issues.reopen_comment_issue = [Comment] at buksang muli
issues.close_comment_issue = [Comment] at isara
issues.reopen_comment_issue = Magkomento at buksang muli
issues.close_comment_issue = Magkomento at isara
pulls.compare_compare = hilain mula sa
pulls.waiting_count_n = %d mga hinihintay na pagsusuri
pulls.waiting_count_1 = %d hinihintay na pagsusuri
@ -1543,8 +1543,189 @@ issues.force_push_codes = `puwersahang itinulak ang %[1]s mula <a class="ui sha"
issues.push_commit_1 = idinagdag ang %d [commit] %s
issues.push_commits_n = idinagdag ang %d mga [commit] %s
issues.new.no_reviewers = Walang mga tagasuri
pulls.title_desc_one = nais na isama ang %[1]d [commit] mula <code>%[2]s</code> hanggang <code id="branch_target">%[3]s</code>
pulls.title_desc_few = nais na isama ang %[1]d mga [commit] mula <code>%[2]s</code> hanggang <code id="branch_target">%[3]s</code>
pulls.title_desc_one = hinihiling na isama ang %[1]d [commit] mula <code>%[2]s</code> hanggang <code id="branch_target">%[3]s</code>
pulls.title_desc_few = hiniling na isama ang %[1]d mga [commit] mula sa <code>%[2]s</code> patungong <code id="branch_target">%[3]s</code>
issues.review.add_review_request = hiniling ang pagsuri mula kay %s %s
pulls.status_checks_details = Mga detalye
activity.git_stats_author_n = %d mga may-akda
issues.change_title_at = `binago ang pamagat mula <b><strike>%s</strike></b> sa <b>%s</b> %s`
activity.git_stats_author_1 = %d may-akda
diff.review.header = Isumite ang pagsusuri
issues.review.comment = sinusuri ang %s
pulls.approve_count_1 = %d pag-apruba
pulls.viewed_files_label = %[1]d / %[2]d tinitingnang mga file
pulls.approve_count_n = %d mga pag-apruba
pulls.push_rejected = Nabigo ang pagtulak: Tinatanggi ang pagtulak. Suriin ang [Git hooks] para sa [repositoryong] ito.
diff.review.reject = Hilingin ang mga pagbago
diff.whitespace_show_everything = Ipakita lahat ng pagbago
issues.review.approve = [inaprubahan] ang mga pagbabagong ito %s
diff.review.approve = Aprubahin
settings.event_pull_request_review_desc = Inapruba, tinatanggihan o [komento ng pagsuri] ang [pull request].
settings.event_pull_request_review = Sinusuri na ang [pull request]
diff.whitespace_button = Puting espasyo
diff.review.self_reject = Hindi makakahiling ng nga pagbago ang mga may-akda ng [pull request] sa kanilang sariling [pull request]
diff.review.self_approve = Hindi maka-apruba ang mga may-akda ng [pull request] sa kanilang sariling [pull request]
pulls.has_viewed_file = Tinitingnan na
diff.review.placeholder = Komento ng pagsusuri
diff.review = Tapusin ang pagsusuri
pulls.push_rejected_no_message = Nabigo ang pagtulak: Tinatanggi ang pagtulak ngunit walang [remote] mensahe doon. Suriin ang [Git hooks] para sa [repositoriyong] ito
pulls.reject_count_1 = %d hiling sa pagbago
pulls.reject_count_n = %d mga hiling sa pagbago
projects.desc = Ipamahala ang mga isyu at mga paghila sa mga board ng proyekto.
issues.new.clear_projects = I-clear ang mga proyekto
issues.new_label_placeholder = Pangalan ng label
issues.create_label = Gumawa ng label
issues.choose.get_started = Magsimula
issues.choose.blank = Default
issues.choose.blank_about = Gumawa ng isyu mula sa default template.
issues.choose.ignore_invalid_templates = Hindi pinapansin ang mga hindi wastong template
issues.choose.invalid_templates = Nakahanap ng %v (mga) hindi wastong template
issues.no_ref = Walang tinukoy na Branch/Tag
issues.new_label = Bagong label
issues.label_templates.title = Mag-load ng isang label preset
issues.new.clear_milestone = I-clear ang milestone
issues.new.open_milestone = Mga bukas na milestone
issues.filter_milestones = I-filter ang Milestone
issues.filter_projects = I-filter ang Proyekto
issues.filter_labels = I-filter ang Label
issues.filter_reviewers = I-filter ang Tagasuri
issues.remove_labels = tinanggal ang mga label na %s %s
issues.add_remove_labels = dinagdag ang %s at tinanggal ang %s na mga label %s
issues.add_milestone_at = `dinagdag ito sa <b>%s</b> na milestone %s`
issues.label_templates.helper = Pumili ng label preset
issues.label_templates.use = Gamitin ang label preset
issues.label_templates.fail_to_load_file = Nabigong i-load ang label template file na "%s": %v
issues.add_label = dinagdag ang %s na label %s
issues.add_labels = dinagdag ang mga label na %s %s
issues.remove_label = tinanggal ang %s na label %s
issues.desc = Ayusin ang mga ulat ng bug, gawain, at milestone.
issues.filter_assignees = I-filter ang Mangangasiwa
issues.new.labels = Mga label
issues.new.no_label = Walang mga label
issues.new.clear_labels = I-clear ang mga label
issues.new.no_items = Walang mga item
issues.new.milestone = Milestone
issues.new.no_milestone = Walang milestone
issues.new.closed_milestone = Mga nakasarang milestone
issues.new.assignees = Mga Mangangasiwa
issues.new.clear_assignees = I-clear ang mga mangangasiwa
issues.new.no_assignees = Walang mga mangangasiwa
issues.choose.invalid_config = Ang config ng isyu ay naglalaman ng mga error:
issues.label_templates.info = Walang pang mga umiiral na label. Gumawa ng label gamit ang "Bagong label" o gumamit ng label preset:
n_release_one = %s release
issues.action_label = Label
issues.action_milestone = Milestone
issues.action_milestone_no_select = Walang milestone
issues.delete_branch_at = `binura ang branch na <b>%s</b> %s`
issues.filter_label = Label
issues.filter_label_exclude = `Gamitin ang <code>alt</code> + <code>click/enter</code> para hindi isama ang mga label`
issues.filter_label_no_select = Lahat ng mga label
issues.filter_milestone_closed = Mga nakasarang milestone
issues.filter_assignee = Mangangasiwa
issues.filter_assginee_no_select = Lahat ng mga mangangasiwa
issues.filter_assginee_no_assignee = Walang mangangasiwa
issues.add_project_at = `dinagdag ito sa <b>%s</b> na proyekto %s`
issues.filter_sort.mostcomment = Pinakanakomento
issues.filter_sort.leastcomment = Hindi gaanong nakomento
issues.filter_sort.farduedate = Pinakamalayong takdang petsa
issues.filter_sort.moststars = Pinakamaraming bitwin
issues.filter_sort.nearduedate = Pinakamalapit na takdang petsa
issues.filter_sort.feweststars = Pinakakaunting bitwin
issues.action_assignee_no_select = Walang mangangasiwa
issues.action_check = I-check/I-uncheck
issues.action_check_all = I-check/I-uncheck ang lahat ng mga item
pulls.merged_by_fake = ni/ng %[2]s ay naisama %[1]s
issues.filter_milestone_none = Walang mga milestone
issues.filter_milestone_open = Mga bukas na milestone
issues.remove_milestone_at = `tinanggal ito mula sa <b>%s</b> na milestone %s`
issues.remove_assignee_at = `ay hindi itinalaga ni/ng <b>%s</b> %s`
issues.remove_self_assignment = `tinanggal ang kanilang trabaho %s`
issues.change_milestone_at = `binago ang milestone mula <b>%s</b> sa <b>%s</b> %s`
issues.change_project_at = `binago ang proyekto mula <b>%s</b> sa <b>%s</b> %s`
issues.remove_project_at = `tinanggal ito mula sa <b>%s</b> na proyekto %s`
issues.filter_label_select_no_label = Walang label
issues.filter_sort.fewestforks = Pinakakaunting fork
issues.add_assignee_at = `ay itinalaga ni/ng <b>%s</b> %s`
n_release_few = %s mga release
issues.remove_ref_at = `tinanggal ang sangguni na <b>%s</b> %s`
issues.add_ref_at = `dinagdag ang sangguni na <b>%s</b> %s`
issues.filter_milestone = Milestone
issues.filter_milestone_all = Lahat ng mga milestone
issues.filter_sort.mostforks = Pinakamaraming fork
issues.action_assignee = Mangangasiwa
issues.change_ref_at = `binago ang sangguni mula <b><strike>%s</strike></b> sa <b>%s</b> %s`
pulls.cmd_instruction_merge_desc = Isama ang mga pagbago at [update] sa Forgejo.
issues.dependency.issue_close_blocks = Hinarangan ng isyung ito mula sa pagsara ng mga sumusunod na isyu
issues.dependency.issue_closing_blockedby = Hinarangan mula sa pagsara ng isyung ito ng mga sumusunod na isyu
pulls.status_checks_requested = Kinakailangan
issues.label_deletion = Burahin ang label
issues.add_time_cancel = Kanselahin
issues.dependency.blocks_short = Hinarang ang
issues.dependency.issue_close_blocked = Kinailangan mong isara ang lahat na mga isyu na humaharang sa isyung ito bago mo ito isara.
pulls.cmd_instruction_merge_title = Isama
milestones.filter_sort.most_issues = Pinakamaraming mga isyu
form.string_too_long = Ang ibinigay na string ay mas mahaba sa %d character.
issues.num_comments_1 = %d komento
issues.context.reference_issue = Isangguni sa bagong isyu
issues.role.first_time_contributor_helper = Ito ang pinakaunang kontribusyon ng user na ito sa repositoryo.
issues.dismiss_review = I-dismiss ang pagsuri
issues.dismiss_review_warning = Sigurado ka bang gusto mong i-dismiss ang pagsusuri na ito?
issues.label_archive = Naka-archive na label
issues.label_exclusive_desc = Pangalanan ang label na <code>scope/item</code> upang gawin itong kapwa eksklusibo sa iba pang mga <code>scope/</code> na label.
issues.archived_label_description = (Naka-archive) %s
issues.label.filter_sort.alphabetically = Ayon sa alpabeto
issues.subscribe = Mag-subscribe
issues.max_pinned = Hindi ka maaring mag-pin ng higit pang mga isyu
issues.pin_comment = na-pin ito %s
issues.unpin_comment = na-unpin ito %s
issues.lock = I-lock ang usapan
issues.unlock = I-unlock ang usapan
issues.unlock_comment = na-unlock ang usapang ito %s
issues.unlock.notice_1 = - Makakakomento muli ang lahat ng mga tao sa isyung ito.
issues.unlock.notice_2 = - Maari mong i-lock muli ang isyung ito sa hinaharap.
issues.comment_on_locked = Hindi ka makakakomento sa naka-lock na isyu.
issues.closed_by_fake = ni/ng %[2]s ay isinara %[1]s
issues.comment_manually_pull_merged_at = manwal na isinama ang commit %[1]s sa %[2]s %[3]s
issues.label_exclusive_warning = Aalisin ang anumang magkasalungat na saklaw na label kapag nag-e-edit ng mga label ng isang isyu o hiling ng paghila.
issues.label_count = %d mga label
issues.label_open_issues = %d mga nakabukas na isyu/hiling sa paghila
issues.lock.unknown_reason = Hindi mala-lock ang isyu na may hindi kilalang dahilan.
issues.lock_duplicate = Hindi mala-lock ang isang isyu ng dalawang beses.
issues.unlock_error = Hindi maa-unlock ang isang isyu na hindi naka-lock.
issues.lock.notice_2 = - Makakaiwan ka pa at mga ibang mga tagatulong na may access sa repositoryo na ito ng mga komento na ang mga ibang tao ay makakakita.
issues.draft_title = Draft
issues.label_archive_tooltip = Ang mga naka-archive na label ay hindi isasama bilang default mula sa mga mungkahi kapag naghahanap mula sa label.
issues.is_stale = May mga pagbabago sa PR na ito mula sa pagsuri na ito
issues.role.first_time_contributor = Unang-beses na contributor
issues.lock.notice_1 = - Hindi makakadagdag ng mga bagong komento ang mga ibang user sa isyu na ito.
issues.lock.notice_3 = - Maari mong i-unlock muli ang isyung ito sa hinaharap.
issues.label_deletion_desc = Ang pagbura ng label ay tatanggalin ito sa lahat ng mga isyu. Magpatuloy?
issues.commit_ref_at = `sinangguni ang isyu na ito mula sa commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_issue_from = `<a href="%[3]s">sinangguni ang isyu %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.num_participants_one = %d kasali
issues.attachment.download = `I-click para i-download ang "%s" `
issues.num_participants_few = %d mga kasali
issues.unsubscribe = Mag-unsubscribe
issues.unpin_issue = I-unpin ang isyu
issues.role.member_helper = Ang user na ito ay miyembro ng organisasyon na minamay-ari ang repositoryo na ito.
issues.label_modify = I-edit ang label
issues.label_deletion_success = Binura na ang label.
issues.role.collaborator = Tagatulong
issues.role.collaborator_helper = Inimbita ang user na ito na makipagtulungan sa repositoryo.
issues.role.contributor = Contributor
issues.create_comment = Magkomento
issues.closed_by = ni/ng <a href="%[2]s">%[3]s</a> ay isinara %[1]s
issues.context.quote_reply = Mag-quote reply
issues.context.copy_link = Kopyahin ang link
issues.label_exclusive = Exclusive
issues.label_archived_filter = Ipakita ang mga naka-archive na label
issues.label.filter_sort.reverse_alphabetically = Ayon sa alpabeto pabaliktad
issues.attachment.open_tab = `I-click para itignan ang "%s" sa bagong tab`
issues.delete.text = Gusto mo ba talagang tanggalin ang isyung ito? (Permanente nitong aalisin ang lahat ng nilalaman. Isaalang-alang sa halip na isara ito, kung balak mong panatilihin itong naka-archive)
issues.sign_in_require_desc = <a href="%s">Mag-sign in</a> upang sumali sa usapan na ito.
issues.num_comments = %d mga komento
issues.role.contributor_helper = Nakaraang nag-commit ang user na ito sa repositoryo na ito.
issues.comment_pull_merged_at = sinama ang commit %[1]s sa %[2]s %[3]s
[search]
commit_kind = Maghanap ng mga commit...
@ -1634,7 +1815,7 @@ dashboard.bootstrap_stack_usage = Paggamit ng bootstrap stack
dashboard.stack_memory_obtained = Nakuhang stack memory
dashboard.profiling_bucket_hash_table_obtained = Mga nakuhang profiling bucket hash table
dashboard.gc_metadata_obtained = Nakuhang GC metadata
dashboard.delete_old_actions = Burahin ang lahat ng mga lumang aksyon mula sa database
dashboard.delete_old_actions = Burahin ang lahat ng mga lumang aktibidad mula sa database
dashboard.stop_endless_tasks = Tigilan ang mga hindi natatapos na task
dashboard.cancel_abandoned_jobs = Kanselahin ang mga naiwang job
dashboard.start_schedule_tasks = Simulan ang mga iskedyul task
@ -1643,7 +1824,7 @@ dashboard.rebuild_issue_indexer = Gawin muli ang indexef ng isyu
users.restricted = Pinaghihigpitan
users.2fa = 2FA
users.repos = Mga Repo
users.send_register_notify = Ipadala ang notification ng pagrehistro ng user
users.send_register_notify = Abisuhan tungkol sa pagrehistro sa pamamagitan ng email
users.is_admin = Ay tagapangasiwa
users.is_restricted = Ay pinaghihigpitan
users.allow_import_local = Maaring mag-import ng mga lokal na repositoryo
@ -1717,7 +1898,7 @@ dashboard.mspan_structures_obtained = Mga nakuhang MSpan structure
dashboard.mcache_structures_usage = Paggamit ng MCache structure
dashboard.next_gc_recycle = Susunod na GC recycle
dashboard.mcache_structures_obtained = Mga nakuhang MCache structure
dashboard.delete_old_actions.started = Nasimula na ang burahin ang lahat ng mga lumang aksyon mula sa database.
dashboard.delete_old_actions.started = Nasimula na ang burahin ang lahat ng mga lumang aktibidad mula sa database.
dashboard.update_checker = Tagasuri ng update
dashboard.delete_old_system_notices = Burahin ang lahat ng mga lumang paunawa ng sistema mula sa database
dashboard.gc_lfs = I-garbage collect ang mga LFS meta object
@ -1725,7 +1906,7 @@ dashboard.stop_zombie_tasks = Tigilan ang mga zombie task
users.user_manage_panel = Ipamahala ang mga user account
users.new_account = Gumawa ng User Account
users.auth_login_name = Pangalan ng sign-in authentication
users.password_helper = Iwanang walang laman ang password upang panatilihing hindi nabago
users.password_helper = Iwanang walang laman ang password upang panatilihing hindi nabago.
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
@ -1831,6 +2012,32 @@ config.ssh_start_builtin_server = Gamitin ang built-in server
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_internal_registration = Payagan lamang ang pagrehistro sa pamamagitan ng Forgejo
auths.search_page_size = Laki ng pahina
auths.filter = Filter ng user
auths.group_search_base = Group search base DN
config.db_type = Uri
auths.restricted_filter_helper = Iwanang walang laman para hindi itakda ang mga user bilang pinahihigpitan. Gamitin ang asterisk ("*") para itakda ang lahat ng mga user na hindi tumutugma sa Admin filter bilang pinahihigpitan.
auths.admin_filter = Filter ng admin
auths.restricted_filter = Pinahigpit na filter
config.lfs_enabled = Naka-enable
config.db_user = Username
auths.use_paged_search = Gamitin ang naka-pahinang paghahanap
config.lfs_http_auth_expiry = Oras ng pag-expire ng LFS HTTP auth
config.db_config = Configuration ng database
config.db_host = Host
config.lfs_config = Configuration ng LFS
config.lfs_content_path = Content path ng LFS
auths.attributes_in_bind = Kunin ang mga attribute sa bind DN context
config.db_name = Pangalan
config.db_schema = Schema
config.service_config = Configuration ng serbisyo
config.register_email_confirm = Kailanganin ang pagkumpirma ng email upang magrehistro
config.disable_register = I-disable ang pansariling pagrehistro
auths.default_domain_name = Default domain name na gagamitin para sa email address
auths.allow_deactivate_all = Pinapayagan ang walang laman na resulta ng paghahanap para i-deactivate ang lahat ng mga user
[org]
repo_updated = Binago %s
@ -1882,7 +2089,7 @@ registry.documentation = Para sa higit pang impormasyon tungkol sa %s registry,
published_by = Na-publish ang %[1]s ni/ng <a href="%[2]s">%[3]s</a>
requirements = Mga kinakailangan
dependencies = Mga dependency
details.author = Autor
details.author = May-akda
details.project_site = Website ng proyekto
details.license = Lisensya
versions.view_all = Tignan lahat
@ -1923,6 +2130,9 @@ starred_repo = na-star ang <a href="%[1]s">%[2]s</a>
watched_repo = ay sinimulang panoorin ang <a href="%[1]s">%[2]s</a>
compare_commits_general = Ikumpara ang mga [commit]
compare_commits = Ikumpara ang %d mga [commit]
merge_pull_request = `isinama ang [pull request] <a href="%[1]s">%[3]s#%[2]s</a>`
auto_merge_pull_request = `[automatikong] isinama ang [pull request] <a href="%[1]s">%[3]s#%[2]s</a>`
approve_pull_request = `inaprubahan ang <a href="%[1]s">%[3]s#%[2]s</a>`
[tool]
1m = 1 minuto

View file

@ -276,23 +276,23 @@ register_confirm=Exiger la confirmation du courriel lors de l'inscription
mail_notify=Activer les notifications par courriel
server_service_title=Paramètres serveur et tierce parties
offline_mode=Activer le mode hors-ligne
offline_mode_popup=Désactiver l'utilisation de CDNs, et servir toutes les ressources localement.
offline_mode.description=Désactiver l'utilisation de CDNs, et servir toutes les ressources localement.
disable_gravatar=Désactiver Gravatar
disable_gravatar_popup=Désactiver Gravatar et les autres sources d'avatars tierces. Un avatar par défaut sera utilisé pour les utilisateurs n'ayant pas téléversé un avatar personnalisé.
disable_gravatar.description=Désactiver Gravatar et les autres sources d'avatars tierces. Un avatar par défaut sera utilisé pour les utilisateurs n'ayant pas téléversé un avatar personnalisé.
federated_avatar_lookup=Activer les avatars fédérés
federated_avatar_lookup_popup=Activer la recherche unifiée d'avatars en utilisant le service open source unifié basé sur libravatar.
federated_avatar_lookup.description=Activer la recherche unifiée d'avatars en utilisant le service open source unifié basé sur libravatar.
disable_registration=Désactiver la création de compte
disable_registration_popup=Désactiver les nouvelles inscriptions. Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs.
allow_only_external_registration_popup=N'autoriser l'inscription qu'à partir des services externes
disable_registration.description=Désactiver les nouvelles inscriptions. Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs.
allow_only_external_registration.description=N'autoriser l'inscription qu'à partir des services externes
openid_signin=Activer l'authentification OpenID
openid_signin_popup=Activer l'authentification via OpenID.
openid_signin.description=Activer l'authentification via OpenID.
openid_signup=Activer l'inscription OpenID
openid_signup_popup=Activer l'inscription avec OpenID.
openid_signup.description=Activer l'inscription avec OpenID.
enable_captcha=Activer le CAPTCHA d'inscription
enable_captcha_popup=Demander un CAPTCHA à l'inscription.
enable_captcha.description=Demander un CAPTCHA à l'inscription.
require_sign_in_view=Exiger la connexion à un compte pour afficher les pages
require_sign_in_view_popup=Limiter laccès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et dinscription.
admin_setting_desc=La création d'un compte administrateur est facultative. Le premier utilisateur enregistré deviendra automatiquement un administrateur le cas échéant.
require_sign_in_view.description=Limiter laccès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et dinscription.
admin_setting.description=La création d'un compte administrateur est facultative. Le premier utilisateur enregistré deviendra automatiquement un administrateur le cas échéant.
admin_title=Paramètres de compte administrateur
admin_name=Nom dutilisateur administrateur
admin_password=Mot de passe
@ -312,11 +312,11 @@ save_config_failed=L'enregistrement de la configuration %v a échoué
invalid_admin_setting=Paramètres du compte administrateur invalides : %v
invalid_log_root_path=Le répertoire des fichiers de journalisation est invalide : %v
default_keep_email_private=Masquer les adresses courriels par défaut
default_keep_email_private_popup=Masquer par défaut les adresses courriels des nouveaux utilisateurs.
default_keep_email_private.description=Masquer par défaut les adresses courriels des nouveaux utilisateurs.
default_allow_create_organization=Autoriser la création d'organisations par défaut
default_allow_create_organization_popup=Permettre aux nouveaux comptes utilisateurs de créer des organisations par défaut.
default_allow_create_organization.description=Permettre aux nouveaux comptes utilisateurs de créer des organisations par défaut.
default_enable_timetracking=Activer le suivi de temps par défaut
default_enable_timetracking_popup=Activer le suivi du temps pour les nouveaux dépôts par défaut.
default_enable_timetracking.description=Activer le suivi du temps pour les nouveaux dépôts par défaut.
no_reply_address=Domaine pour les courriels cachés
no_reply_address_helper=Nom de domaine pour les utilisateurs ayant une adresse courriel cachée. Par exemple, lutilisateur « fred » sera associé à « fred@noreply.example.org » par Git si le domaine est « noreply.example.org ».
password_algorithm=Algorithme de hachage du mot de passe
@ -1002,7 +1002,7 @@ update_hints = Mettre à jour les suggestions
update_hints_success = Les suggestions ont été mises à jour.
pronouns_custom = Personnalisés
pronouns = Pronoms
pronouns_unspecified = Non spécifié
pronouns_unspecified = Non spécifiés
language.title = Langue par défaut
[repo]
@ -1589,7 +1589,7 @@ issues.role.collaborator_helper=Cet utilisateur a été invité à collaborer su
issues.role.first_time_contributor=Première contribution
issues.role.first_time_contributor_helper=C'est la première contribution de cet utilisateur au dépôt.
issues.role.contributor=Contributeur
issues.role.contributor_helper=Cet utilisateur a déjà des révisions dans le dépôt.
issues.role.contributor_helper=Cet utilisateur a déjà des révisions dans ce dépôt.
issues.re_request_review=Redemander une évaluation
issues.is_stale=Cette demande dajout a été corrigée depuis sa dernière évaluation
issues.remove_request_review=Retirer la demande dévaluation
@ -1865,7 +1865,7 @@ pulls.head_out_of_date=Fusion échouée: Len-tête a été mis à jour pen
pulls.has_merged=Échec : La demande dajout est déjà fusionnée, vous ne pouvez plus la fusionner, ni modifier sa branche cible.
pulls.push_rejected=Échec du push : la soumission a été rejetée. Revoyez les Git hook pour ce dépôt.
pulls.push_rejected_summary=Message de rejet complet
pulls.push_rejected_no_message=Échec du push : la soumission a été rejetée sans raison. Revoyez les Git hook pour ce dépôt
pulls.push_rejected_no_message=Échec du push : la soumission a été rejetée sans raison. Revoyez les Git hooks pour ce dépôt
pulls.open_unmerged_pull_exists=`Vous ne pouvez pas rouvrir ceci car la demande dajout #%d, en attente, a des propriétés identiques.`
pulls.status_checking=Certains contrôles sont en attente
pulls.status_checks_success=Tous les contrôles ont réussi
@ -2758,6 +2758,8 @@ settings.transfer.button = Changer de propriétaire
settings.transfer.modal.title = Changer de propriétaire
wiki.search = Recherche dans le wiki
wiki.no_search_results = Pas de résultats
form.string_too_long = La chaîne de caractère fournie fait plus de %d caractères.
settings.federation_settings = Paramètres de féderation
[graphs]
component_loading=Chargement de %s…

View file

@ -160,21 +160,21 @@ register_confirm=A regisztrációhoz e-mail visszaigazolás szükséges
mail_notify=Email értesítés engedélyezése
server_service_title=Szerver és egyéb szolgáltatások beállítása
offline_mode=Helyi mód bekapcsolása
offline_mode_popup=Gravatar és egyedi források kikapcsolása, minden avatárt a felhasználók töltenek fel.
offline_mode.description=Gravatar és egyedi források kikapcsolása, minden avatárt a felhasználók töltenek fel.
disable_gravatar=Gravatar Kikapcsolása
disable_gravatar_popup=Gravatar és a harmadik féltől származó avatar források letoltása. Alapértelmezett avatárt fog használni, kivéve, ha a felhasználó helyileg tölt fel avatárt.
disable_gravatar.description=Gravatar és a harmadik féltől származó avatar források letoltása. Alapértelmezett avatárt fog használni, kivéve, ha a felhasználó helyileg tölt fel avatárt.
federated_avatar_lookup=Összevont profilkép lekérés engedélyezése
federated_avatar_lookup_popup=Összevont profilkép lekérés engedélyezése a libravatar használatával.
federated_avatar_lookup.description=Összevont profilkép lekérés engedélyezése a libravatar használatával.
disable_registration=Ön-regisztráció kikapcsolása
disable_registration_popup=Regisztráció kikapcsolása, csak a rendszergazda hozhat létre fiókokat.
allow_only_external_registration_popup=Regisztráció engedélyezése csak külső forrásokból
disable_registration.description=Regisztráció kikapcsolása, csak a rendszergazda hozhat létre fiókokat.
allow_only_external_registration.description=Regisztráció engedélyezése csak külső forrásokból
openid_signin=OpenID bejelentkezés engedélyezése
openid_signin_popup=Felhasználói bejelentkezés engedélyezése OpenID-val.
openid_signin.description=Felhasználói bejelentkezés engedélyezése OpenID-val.
openid_signup=Regisztráció engedélyezése OpenID alapon
openid_signup_popup=Regisztráció engedélyezése OpenID alapon.
enable_captcha_popup=CAPTCHA megkövetelése amikor egy felhasználó regisztrál.
openid_signup.description=Regisztráció engedélyezése OpenID alapon.
enable_captcha.description=CAPTCHA megkövetelése amikor egy felhasználó regisztrál.
require_sign_in_view=Bejelentkezés megkövetelése az oldalak megtekintéséhez
admin_setting_desc=Nem szükséges most beállítania rendszergazdai fiókot, mert az első felhasználó automatikusan rendszergazdai jogokat kap.
admin_setting.description=Nem szükséges most beállítania rendszergazdai fiókot, mert az első felhasználó automatikusan rendszergazdai jogokat kap.
admin_title=Rendszergazda fiók beállításai
admin_name=Rendszergazda felhasználóneve
admin_password=Jelszó
@ -190,11 +190,11 @@ save_config_failed=Hiba történt a konfiguráció mentése közben: %v
invalid_admin_setting=Hibás a rendszergazdai fiók beállítása: %v
invalid_log_root_path=Naplózás gyökérmappa érvénytelen: %v
default_keep_email_private=E-mail címek elrejtése alapértelmezetten
default_keep_email_private_popup=Az új felhasználói fiókok e-mail címeinek elrejtése alapértelmezetten.
default_keep_email_private.description=Az új felhasználói fiókok e-mail címeinek elrejtése alapértelmezetten.
default_allow_create_organization=Alapértelmezés szerint a szervezetek létrehozásának engedélyezése
default_allow_create_organization_popup=Alapértelmezés szerint az új felhasználók is hoszhatnak létre szervezeteket.
default_allow_create_organization.description=Alapértelmezés szerint az új felhasználók is hoszhatnak létre szervezeteket.
default_enable_timetracking=Időmérés bekapcsolása alapértelmezetten
default_enable_timetracking_popup=Időmérés bekapcsolása az új tárolókra 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.

View file

@ -197,12 +197,12 @@ register_confirm=Krefjast Staðfestingar Tölvupósts Til Að Nýskrá
mail_notify=Virkja Tölvupósttilkynningar
server_service_title=Stillingar Netþjóns og Þriðja Aðila
offline_mode=Virkjaðu Staðbundin Ham
offline_mode_popup=Slökktu á efnisafhendingarnetum þriðja aðila og þjónaðu öllum gögnum á staðnum.
offline_mode.description=Slökktu á efnisafhendingarnetum þriðja aðila og þjónaðu öllum gögnum á staðnum.
disable_gravatar=Óvirkja Gravatar
disable_gravatar_popup=Slökkva á Gravatar og notandamyndar þjónustum. Sjálfgefin notandamynd verður notuð ef notandi hleður ekki upp sína eigin.
disable_gravatar.description=Slökkva á Gravatar og notandamyndar þjónustum. Sjálfgefin notandamynd verður notuð ef notandi hleður ekki upp sína eigin.
federated_avatar_lookup=Virkja Samtök Notandamyndar
openid_signin=Virkja OpenID Innskráningu
openid_signin_popup=Virkja OpenID innskráningu notenda.
openid_signin.description=Virkja OpenID innskráningu notenda.
enable_captcha=Virkja CAPTCHA innskráningu
admin_name=Notandanafn Stjórnanda
admin_password=Lykilorð
@ -214,7 +214,7 @@ sqlite3_not_available=Þessi Forgejo útgáfa styður ekki SQLite3. Vinsamlegast
invalid_db_setting=Gagnagrunnsstillingarnar eru ógildar: %v
invalid_repo_path=Grunnsslóð hugbúnaðarsafns er ógild: %v
invalid_log_root_path=Slóð annáls er ógild: %v
default_keep_email_private_popup=Fela sjálfgefið netföng nýrra notendareikninga.
default_keep_email_private.description=Fela sjálfgefið netföng nýrra notendareikninga.
no_reply_address_helper=Lén fyrir notendur með falið netfang. Til dæmis notandanafnið „joe“ verður skráð í Git sem „joe@noreply.example.org“ ef falið tölvupóstlén er stillt á „noreply.example.org“.
[home]

View file

@ -273,22 +273,22 @@ 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_popup=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 fornisci tutte le risorse localmente.
disable_gravatar=Disattiva Gravatar
disable_gravatar_popup=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=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.
federated_avatar_lookup=Attiva le immagini profilo federate
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar.
federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar.
disable_registration=Disattiva auto-registrazione
disable_registration_popup=Disattiva la user self-registration. Solo gli amministratori saranno in grado di creare account.
allow_only_external_registration_popup=Attiva la registrazione solo tramite servizi esterni
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
openid_signin=Attiva l'accesso con OpenID
openid_signin_popup=Attiva registrazione utente via OpenID.
openid_signin.description=Attiva registrazione utente via OpenID.
openid_signup=Attiva auto-registrazione con OpenID
openid_signup_popup=Attiva OpenID-based user self-registration.
openid_signup.description=Attiva OpenID-based user self-registration.
enable_captcha=Abilita CAPTCHA per registrazione
enable_captcha_popup=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_desc=Creare un account amministratore è opzionale. Il primo utente registrato sarà automaticamente un amministratore.
admin_setting.description=Creare un account amministratore è opzionale. Il primo utente registrato sarà automaticamente un amministratore.
admin_title=Impostazioni profilo amministratore
admin_name=Nome utente dell'amministratorə
admin_password=Password
@ -307,11 +307,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_popup=Nasconi l'indirizzo email dei nuovi account utente di default.
default_keep_email_private.description=Nasconi l'indirizzo email dei nuovi account utente di default.
default_allow_create_organization=Consenti la creazione di organizzazioni come impostazione predefinita
default_allow_create_organization_popup=Consenti ai nuovi account utente di creare organizzazioni di default.
default_allow_create_organization.description=Consenti ai nuovi account utente di creare organizzazioni di default.
default_enable_timetracking=Attiva il cronografo come impostazione predefinita
default_enable_timetracking_popup=Attiva il cronografo per le nuove repositories di default.
default_enable_timetracking.description=Attiva il cronografo per le nuove repositories di default.
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,7 +324,7 @@ 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_popup = Limita l'accesso ad utenti autenticati. I visitatori vedranno solo le pagine di accesso e registrazione.
require_sign_in_view.description = Limita l'accesso ad 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:

View file

@ -275,23 +275,23 @@ register_confirm=登録にはメールによる確認が必要
mail_notify=メール通知を有効にする
server_service_title=サーバーと外部サービスの設定
offline_mode=ローカルモードを有効にする
offline_mode_popup=外のCDNサービスを使わず、すべてのリソースを自前で提供します。
offline_mode.description=外のCDNサービスを使わず、すべてのリソースを自前で提供します。
disable_gravatar=Gravatarを無効にする
disable_gravatar_popup=Gravatarと外のアバターソースを無効にします。 アバターをローカルにアップロードしていないユーザーには、デフォルトのアバターが使用されます。
disable_gravatar.description=Gravatarと外のアバターソースを無効にします。 アバターをローカルにアップロードしていないユーザーには、デフォルトのアバターが使用されます。
federated_avatar_lookup=フェデレーテッド・アバターを有効にする
federated_avatar_lookup_popup=Libravatarを使用したフェデレーテッド・アバター検索を有効にします。
federated_avatar_lookup.description=Libravatarを使用したフェデレーテッド・アバター検索を有効にします。
disable_registration=セルフ登録を無効にする
disable_registration_popup=ユーザーのセルフ登録を無効にします。 新しいユーザーアカウントを作成できるのは管理者だけとなります。
allow_only_external_registration_popup=外部サービスを使用した登録のみを許可
disable_registration.description=ユーザーのセルフ登録を無効にします。 新しいユーザーアカウントを作成できるのは管理者だけとなります。
allow_only_external_registration.description=外部サービスを使用した登録のみを許可
openid_signin=OpenIDを使ったサインインを有効にする
openid_signin_popup=OpenIDを使ったユーザーのサインインを有効にします。
openid_signin.description=OpenIDを使ったユーザーのサインインを有効にします。
openid_signup=OpenIDを使ったセルフ登録を有効にする
openid_signup_popup=OpenIDベースでのユーザーのセルフ登録を有効にします。
openid_signup.description=OpenIDベースでのユーザーのセルフ登録を有効にします。
enable_captcha=登録時のCAPTCHAを有効にする
enable_captcha_popup=ユーザーのセルフ登録時にCAPTCHAを必須にします。
require_sign_in_view=ページ閲覧にサインインが必要
require_sign_in_view_popup=ページアクセスをサインイン済みユーザーに限定します。 訪問者はサインインページと登録ページだけ見ることができます。
admin_setting_desc=管理者アカウントの作成は任意です。 最初に登録したユーザーは自動的に管理者になります。
enable_captcha.description=ユーザーのセルフ登録時にCAPTCHAを必須にします。
require_sign_in_view=インスタンス内ページ閲覧にサインインが必要
require_sign_in_view.description=ページアクセスをサインイン済みユーザーに限定します。 訪問者はサインインページと登録ページだけ見ることができます。
admin_setting.description=管理者アカウントの作成は任意です。 最初に登録したユーザーは自動的に管理者になります。
admin_title=管理者アカウントの設定
admin_name=管理者ユーザー名
admin_password=パスワード
@ -311,11 +311,11 @@ save_config_failed=設定ファイルの保存に失敗しました: %v
invalid_admin_setting=管理者アカウントの設定が無効です: %v
invalid_log_root_path=ログの保存先パスが無効です: %v
default_keep_email_private=デフォルトでメールアドレスを隠す
default_keep_email_private_popup=新しいユーザーアカウントで、デフォルトでメールアドレスを隠す設定にします。
default_keep_email_private.description=新しいユーザーアカウントで、デフォルトでメールアドレスを隠す設定にします。
default_allow_create_organization=デフォルトで組織の作成を許可
default_allow_create_organization_popup=新しいユーザーアカウントに組織の作成をデフォルトで許可します。
default_allow_create_organization.description=新しいユーザーアカウントに組織の作成をデフォルトで許可します。
default_enable_timetracking=デフォルトでタイムトラッキング有効
default_enable_timetracking_popup=新しいリポジトリのタイムトラッキングをデフォルトで有効にします。
default_enable_timetracking.description=新しいリポジトリのタイムトラッキングをデフォルトで有効にします。
no_reply_address=メールを隠すときのドメイン
no_reply_address_helper=メールアドレスを隠しているユーザーに使用するドメイン名。 例えば "noreply.example.org" と設定した場合、ユーザー名 "joe" はGitに "joe@noreply.example.org" としてログインすることになります。
password_algorithm=パスワードハッシュアルゴリズム
@ -686,7 +686,7 @@ avatar=アバター
ssh_gpg_keys=SSH / GPGキー
social=ソーシャルアカウント
applications=アプリケーション
orgs=組織の管理
orgs=組織
repos=リポジトリ
delete=アカウントを削除
twofa=2要素認証 (TOTP)
@ -737,7 +737,7 @@ comment_type_group_issue_ref=イシューの参照先
saved_successfully=設定は正常に保存されました。
privacy=プライバシー
keep_activity_private=プロフィールページのアクティビティ表示を隠す
keep_activity_private_popup=アクティビティを、あなたと管理者にのみ表示します
keep_activity_private_popup=アクティビティを、あなたとインスタンス管理者にのみ表示します
lookup_avatar_by_mail=メールアドレスでアバターを見つける
federated_avatar_lookup=フェデレーテッド・アバター検索
@ -760,8 +760,8 @@ password_change_disabled=ローカルユーザーでない場合は、Forgejoの
emails=メールアドレス
manage_emails=メールアドレスの管理
manage_themes=デフォルトテーマを選択
manage_openid=OpenIDアドレスの管理
manage_themes=デフォルトテーマ
manage_openid=OpenIDアドレス
email_desc=プライマリメールアドレスは、通知、パスワードの回復、さらにメールアドレスを隠さない場合は、WebベースのGit操作にも使用されます。
theme_desc=この設定がサイト全体のデフォルトのテーマとなります。
primary=プライマリー
@ -1001,6 +1001,7 @@ additional_repo_units_hint_description = 利用可能なすべての機能が有
update_hints_success = ヒントが更新されました。
hints = ヒント
additional_repo_units_hint = リポジトリでより多くの機能を有効にすることを推奨する
language.title = 既定の言語
[repo]
new_repo_helper=リポジトリには、プロジェクトのすべてのファイルとリビジョン履歴が入ります。 すでにほかの場所でホストしていますか? <a href="%s">リポジトリを移行</a> もどうぞ。
@ -2730,6 +2731,15 @@ commits.search_branch = このブランチ
size_format = %[1]s: %[2]s, %[3]s: %[4]s
editor.push_out_of_date = このpushはもう古いようです。
issues.archived_label_description = (アーカイブ済) %s
settings.web_hook_name_sourcehut_builds = SourceHut Builds
settings.matrix.room_id_helper = ルームIDは、Element web clientのRoom Settings > Advanced > Internal room IDから取得できます。例%s。
pulls.merged_title_desc_one = %[4]s の <code>%[2]s</code> から %[1]d 件のコミットを <code>%[3]s</code> へマージした
pulls.title_desc_one = <code id="branch_target">%[3]s</code> から %[1]d 件のコミットを <code>%[2]s</code> へマージしたい
pulls.ready_for_review = レビューの準備ができていますか?
settings.transfer.button = 所有権を移送する
settings.transfer.modal.title = 所有権を移送
wiki.search = Wikiを検索
wiki.no_search_results = 結果がありませんでした
[graphs]
component_loading = %s の読み込み中...
@ -2864,6 +2874,7 @@ teams.invite.title=あなたは組織 <strong>%[2]s</strong> 内のチーム <st
teams.invite.by=%s からの招待
teams.invite.description=下のボタンをクリックしてチームに参加してください。
follow_blocked_user = この組織によってブロックされているため、この組織をフォローすることはできません。
open_dashboard = ダッシュボードを開く
[admin]
dashboard=ダッシュボード
@ -3399,6 +3410,12 @@ self_check = セルフチェック
auths.tips.gmail_settings = Gmail設定:
self_check.no_problem_found = まだ問題は見つかりません。
auths.tip.gitlab_new = https://gitlab.com/-/profile/applications で新しいアプリケーションを登録します
auths.default_domain_name = メールアドレスのために使われるデフォルトのドメイン名
self_check.database_collation_mismatch = データベースが使うと期待されるcollation: %s
self_check.database_collation_case_insensitive = データベースは %s という collation を用いていますが、これは大文字小文字を区別しません。Forgejoは動作できますが、期待通りに動かない場合が稀に発生する場合があります。
config_settings = 設定
config_summary = 概要
self_check.database_inconsistent_collation_columns = データベースは %s という collation を用いていますが、これらのカラムは別のcollationを用いています。これは想定外の問題を引き起こす可能性があります。
[action]
@ -3642,6 +3659,7 @@ owner.settings.chef.keypair=キーペアを生成
owner.settings.chef.keypair.description=Chefレジストリの認証にはキーペアが必要です。 すでにキーペアを生成していた場合、新しいキーペアを生成すると古いキーペアは破棄されます。
rpm.repository.multiple_groups = このパッケージは複数のグループで利用できます。
owner.settings.cargo.rebuild.no_index = 再構築できません、インデックスが初期化されていません。
npm.dependencies.bundle = バンドルされた依存関係
[secrets]
secrets=シークレット
@ -3805,3 +3823,4 @@ b = B
[markup]
filepreview.lines = %[3]s の %[1]d 行目から %[2]d 行目
filepreview.line = %[2]s の %[1]d 行目
filepreview.truncated = プレビューは途中から省略されています

View file

@ -54,7 +54,7 @@ forks=포크
activities=활동
pull_requests=풀 리퀘스트
issues=이슈
issues=이슈
milestones=마일스톤
cancel=취소
@ -165,8 +165,8 @@ footer.software = 소프트웨어에 대하여
[heatmap]
number_of_contributions_in_the_last_12_months = 지난 12달간 %s 명의 기여자
contributions_zero = 기여 없음
contributions_format = {year}년 {month} {day}일에 {contributions}개의 기여
contributions_zero = 기여 없음
contributions_format = {year}년 {month} {day}일에 {contributions}
contributions_one = 기여
contributions_few = 기여
less = 적은
@ -235,21 +235,21 @@ register_confirm=가입시 이메일 확인 필수
mail_notify=이메일 알림 켜기
server_service_title=서버 및 기타 서비스 설정
offline_mode=로컬 모드 켜기
offline_mode_popup=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬로 제공하십시오.
offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬로 제공하십시오.
disable_gravatar=Gravatar 사용안함
disable_gravatar_popup=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다.
disable_gravatar.description=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다.
federated_avatar_lookup=탈중앙화 아바타 사용
federated_avatar_lookup_popup=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다.
federated_avatar_lookup.description=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다.
disable_registration=사용자 등록 비활성화
disable_registration_popup=사용자가 직접 등록할 수 없게 합니다. 관리자만이 추가할 수 있습니다.
allow_only_external_registration_popup=외부 서비스를 통한 등록을 허용
disable_registration.description=사용자가 직접 등록할 수 없게 합니다. 관리자만이 추가할 수 있습니다.
allow_only_external_registration.description=외부 서비스를 통한 등록을 허용
openid_signin=OpenID 로그인 사용
openid_signin_popup=OpenID 를 이용한 로그인을 허용합니다.
openid_signin.description=OpenID 를 이용한 로그인을 허용합니다.
openid_signup=OpenID 가입 허용
openid_signup_popup=OpenID를 통한 가입을 허용합니다.
enable_captcha_popup=사용자 등록시 캡차를 요구합니다.
openid_signup.description=OpenID를 통한 가입을 허용합니다.
enable_captcha.description=사용자 등록시 캡차를 요구합니다.
require_sign_in_view=인스턴스의 콘텐츠를 볼때 로그인 요구
admin_setting_desc=관리자 계정을 만드는 것은 선택사항입니다. 첫번째로 등록된 사용자는 자동적으로 관리자로 지정됩니다.
admin_setting.description=관리자 계정을 만드는 것은 선택사항입니다. 첫번째로 등록된 사용자는 자동적으로 관리자로 지정됩니다.
admin_title=관리자 계정 설정
admin_name=관리자 이름
admin_password=비밀번호
@ -265,11 +265,11 @@ save_config_failed=설정을 저장할 수 없습니다: %v
invalid_admin_setting=관리자 계정 설정이 올바르지 않습니다: %v
invalid_log_root_path=로그(Log) 의 경로가 올바르지 않습니다: %v
default_keep_email_private=이메일 주소 숨김처리를 기본값으로 설정
default_keep_email_private_popup=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정합니다.
default_keep_email_private.description=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정합니다.
default_allow_create_organization=조직 생성 허용을 기본값으로 설정
default_allow_create_organization_popup=신규 사용자 생성시 조직 생성을 기본값으로 설정합니다.
default_allow_create_organization.description=신규 사용자 생성시 조직 생성을 기본값으로 설정합니다.
default_enable_timetracking=시간 추적 사용을 기본값으로 설정
default_enable_timetracking_popup=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다.
default_enable_timetracking.description=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다.
no_reply_address=가려진 이메일 도메인
no_reply_address_helper=가려진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 가려잔 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 처리 됩니다.
@ -280,7 +280,7 @@ switch_dashboard_context=대시보드 컨텍스트 바꾸기
my_repos=저장소
show_more_repos=더 많은 저장소 보기…
collaborative_repos=협업 저장소
my_orgs=조직
my_orgs=조직
my_mirrors=내 미러 저장소들
view_home=%s 보기
search_repos=저장소 찾기..
@ -337,7 +337,7 @@ login_userpass=로그인
tab_openid=OpenID
oauth_signup_tab=새 계정 등록하기
oauth_signup_submit=등록 완료
oauth_signin_tab=기존 계정으로 연결하기
oauth_signin_tab=기존 계정 연결하기
oauth_signin_title=로그인하여 연결된 계정 검증하기
oauth_signin_submit=계정 연결
openid_connect_submit=연결
@ -401,8 +401,8 @@ SSPISeparatorReplacement=구분자
SSPIDefaultLanguage=기본 언어
require_error=` 비어 있을 수 없습니다.`
alpha_dash_error=' 영문자, 숫자, 대시('-') 와 밑줄('_') 만 입력해주십시오.'
alpha_dash_dot_error=' 영문자, 숫자, 대시('-'), 밑줄('_') 과 점('.') 만 입력해주십시오.'
alpha_dash_error=` 영문, 대시('-')와 밑줄('_') 만 입력해주십시오.`
alpha_dash_dot_error=` 영문, 숫자, 대시('-'), 밑줄('_')과 점('.') 만 입력해주십시오.`
git_ref_name_error=` 유효한 git 레퍼런스명이어야 합니다.`
size_error=` %s 글자여야 합니다.`
min_size_error=` 최소 %s 글자여야 합니다.`
@ -459,7 +459,7 @@ avatar=아바타
ssh_gpg_keys=SSH / GPG 키
social=소셜 계정
applications=어플리케이션
orgs=조직 관리
orgs=조직
repos=저장소
delete=계정 삭제
twofa=2단계 인증
@ -471,7 +471,7 @@ password_username_disabled=로컬 사용자가 아닌 경우 사용자 이름
full_name=성명
website=웹 사이트
location=위치
update_theme=테마 갱신
update_theme=테마 변경
update_profile=프로필 업데이트
update_profile_success=프로필이 업데이트 되었습니다.
change_username=사용자 이름 변경 되었습니다.
@ -482,8 +482,8 @@ ui=테마
comment_type_group_title=제목
lookup_avatar_by_mail=이메일 주소로 아바타 찾기
federated_avatar_lookup=연합 아바타 조회
enable_custom_avatar=사용자정의 아바타를 사용
federated_avatar_lookup=분산 아바타 조회하기
enable_custom_avatar=커스텀 아바타를 사용하기
choose_new_avatar=새로운 아바타 선택
update_avatar=아바타 변경하기
delete_current_avatar=현재 아바타 삭제
@ -526,8 +526,8 @@ openid_desc=OpenID를 사용하면 외부 서비스 제공자에게 인증을
manage_ssh_keys=SSH 키 관리
manage_gpg_keys=GPG 키 관리
add_key=키 추가
ssh_desc=러한 SSH 공용 키는 귀하의 계정과 연결되어 있습니다. 해당 개인 키는 당신의 저장소에 대한 전체 액세스를 가능하게 합니다.
gpg_desc=러한 GPG 공개키는 당신의 계정과 연결되어있습니다. 커밋이 검증될 수 있도록 당신의 개인 키를 안전하게 유지하십시오.
ssh_desc= SSH 공개키들은 귀하의 계정과 연결되어 있습니다. 연결된 개인키는 당신의 저장소에 대한 전체 액세스를 가능하게 합니다.
gpg_desc= GPG 공개키들은 당신의 계정과 연결되어있습니다. 커밋이 검증될 수 있도록 당신의 개인키들을 안전하게 유지하십시오.
ssh_helper=<strong>도움이 필요하세요?</strong> <a href="%s">SSH 키 생성하기</a> 또는 <a href="%s">SSH를 사용할 때의 일반적인 문제</a>에 관한 GitHub의 설명서를 참조하시기 바랍니다.
gpg_helper=<strong>도움이 필요하세요?</strong> <a href="%s">GPG키에 대한 GitHub 문서</a>를 참조하시기 바랍니다.
add_new_key=SSH 키 추가
@ -656,7 +656,7 @@ mirror_prune_desc=불필요하게된 원격 트래킹 참조 삭제
mirror_interval_invalid=미러 간격이 올바르지 않습니다.
mirror_address=URL로 부터 클론
mirror_last_synced=마지막 동기화
watchers=주시하고 있는 사람들
watchers=이 저장소를 주시하고 있는 사람들
stargazers=별을 준 사람들
forks=포크
reactions_more=그리고 %d 더
@ -723,8 +723,8 @@ file_view_raw=원본 보기
file_permalink=고유링크
file_too_large=보여주기에는 파일이 너무 큽니다.
video_not_supported_in_browser=당신의 브라우저가 HTML5 'video' 태그를 지원하지 않습니다.
audio_not_supported_in_browser=당신의 브라우저가 HTML5 'audio' 태그를 지원하지 않습니다.
video_not_supported_in_browser=당신의 브라우저가 HTML5의 "video" 태그를 지원하지 않습니다.
audio_not_supported_in_browser=당신의 브라우저가 HTML5의 "audio" 태그를 지원하지 않습니다.
stored_lfs=Git LFS에 저장되어 있습니다
commit_graph=커밋 그래프
@ -788,12 +788,12 @@ issues.new.clear_assignees=담당자 초기화
issues.new.no_assignees=담당자 없음
issues.no_ref=Branch/Tag 가 지정되어 있지 않음
issues.create=이슈 생성
issues.new_label=로운 레이블
issues.new_label= 레이블
issues.new_label_placeholder=레이블 이름
issues.new_label_desc_placeholder=설명
issues.create_label=레이블 만들기
issues.label_templates.title=사전정의 라벨 로드
issues.label_templates.info=아직 레이블이 없습니다. 레이블 'New Label'을 만들거나 미리 정의된 레이블 셋을 사용하십시오:
issues.label_templates.info=아직 레이블이 없습니다. "새 레이블"을 눌러 만들거나 미리 정의된 레이블 세트를 사용하십시오:
issues.label_templates.helper=라벨 세트 선택
issues.label_templates.use=레이블 세트 사용
issues.add_milestone_at=`<b>%s</b> %s 마일스톤을 추가하였습니다.`
@ -1049,7 +1049,7 @@ search.code_no_results=검색어와 일치하는 소스코드가 없습니다.
settings=설정
settings.desc=설정에서 저장소 설정을 관리할 수 있음
settings.options=저장소
settings.collaboration=협업
settings.collaboration=협업
settings.collaboration.admin=관리자
settings.collaboration.write=쓰기
settings.collaboration.read=읽기
@ -1197,7 +1197,7 @@ settings.archive.success=저장소가 성공적으로 아카이브 되었습니
diff.browse_source=소스 검색
diff.parent=부모
diff.commit=커밋
diff.data_not_available=변경 데이터를 사용할 수 없습니다.
diff.data_not_available=변경 데이터를 사용할 수 없
diff.show_split_view=분할 보기
diff.show_unified_view=통합 보기
diff.whitespace_button=공백
@ -1289,6 +1289,8 @@ issues.closed_by = <a href="%[2]s">%[3]s</a>님이 %[1]s에 닫음
issues.closed_at = `<a id="%[1]s" href="#%[1]s">%[2]s</a>`에 이 이슈를 닫음
issues.filter_milestone_closed = 닫힌 마일스톤
issues.opened_by_fake = %[2]s님이 %[1]s에 열음
issues.filter_project_none = 프로젝트 없음
issues.new.no_projects = 프로젝트 없음
@ -1699,7 +1701,7 @@ pin=알림 고정
mark_as_read=읽음으로 표시
mark_as_unread=읽지 않음으로 표시
mark_all_as_read=모두 읽음으로 표시
subscriptions = 구독 알림
subscriptions = 구독 알림
no_subscriptions = 알림이 없음
watching = 주시중

View file

@ -254,23 +254,23 @@ register_confirm=Reģistrējoties pieprasīt apstiprināt e-pastu
mail_notify=Iespējot e-pasta paziņojumus
server_service_title=Servera un citu servisu iestatījumi
offline_mode=Iespējot bezsaistes režīmu
offline_mode_popup=Atspējot ārējos satura piegādes tīklus, lai visi resursi tiktu piegādāti lokāli.
offline_mode.description=Atspējot ārējos satura piegādes tīklus, lai visi resursi tiktu piegādāti lokāli.
disable_gravatar=Atspējot Gravatar
disable_gravatar_popup=Atspējot Gravatar un citus avotus, visus avatarus augšupielādēs lietotāji vai izmantos noklusēto attēlu.
disable_gravatar.description=Atspējot Gravatar un citus avotus, visus avatarus augšupielādēs lietotāji vai izmantos noklusēto attēlu.
federated_avatar_lookup=Iespējot apvienotās profila bildes
federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz Libravatar.
federated_avatar_lookup.description=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz Libravatar.
disable_registration=Atspējot lietotāju reģistrāciju
disable_registration_popup=Atspējot iespēju reģistrēties. Tikai administratori varēs izveidot jaunus kontus.
allow_only_external_registration_popup=Atļaut reģistrēties tikai ar ārējiem servisiem
disable_registration.description=Atspējot iespēju reģistrēties. Tikai administratori varēs izveidot jaunus kontus.
allow_only_external_registration.description=Atļaut reģistrēties tikai ar ārējiem servisiem
openid_signin=Iespējot pieteikšanos ar OpenID
openid_signin_popup=Iespējot lietotāju pieteikšanos ar OpenID.
openid_signin.description=Iespējot lietotāju pieteikšanos ar OpenID.
openid_signup=Iespējot reģistrāciju, izmantojot OpenID
openid_signup_popup=Iespējot lietotāju reģistrāciju pirms tam autorizējoties ar OpenID.
openid_signup.description=Iespējot lietotāju reģistrāciju pirms tam autorizējoties ar OpenID.
enable_captcha=Pieprasīt drošības kodu lietotāju reģistrācijā
enable_captcha_popup=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu.
enable_captcha.description=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu.
require_sign_in_view=Pieprasīt pieteikšanos, lai aplūkotu lapas
require_sign_in_view_popup=Ierobežot piekļuvi lapām tikai lietotājiem, kuri ir pieteikušies. Apmeklētāji redzēs tikai pieteikšanās un reģistrēšanās lapu.
admin_setting_desc=Nav nepieciešams izveidot administratora kontu uzreiz, pirmais reģistrētais lietotājs saņems administratora tiesības automātiski.
require_sign_in_view.description=Ierobežot piekļuvi lapām tikai lietotājiem, kuri ir pieteikušies. Apmeklētāji redzēs tikai pieteikšanās un reģistrēšanās lapu.
admin_setting.description=Nav nepieciešams izveidot administratora kontu uzreiz, pirmais reģistrētais lietotājs saņems administratora tiesības automātiski.
admin_title=Administratora konta iestatījumi
admin_name=Administratora lietotājvārds
admin_password=Parole
@ -290,11 +290,11 @@ save_config_failed=Neizdevās saglabāt konfigurāciju: %v
invalid_admin_setting=Nederīgs administratora iestatījums: %v
invalid_log_root_path=Nederīgs žurnalizēšanas ceļš: %v
default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses
default_keep_email_private_popup=Šī ir noklusētā pazīme, lai noteiktu lietotāja e-pasta adreses redzamību. Atzīmējot to e-pasta adrese visiem jaunajiem lietotājiem nebūs redzama līdz lietotājs neizmainīs to savos iestatījumos.
default_keep_email_private.description=Šī ir noklusētā pazīme, lai noteiktu lietotāja e-pasta adreses redzamību. Atzīmējot to e-pasta adrese visiem jaunajiem lietotājiem nebūs redzama līdz lietotājs neizmainīs to savos iestatījumos.
default_allow_create_organization=Pēc noklusējuma ļaut veidot organizācijas
default_allow_create_organization_popup=Atzīmējiet šo pazīmi, ja vēlaties, lai jauniem lietotājiem pēc noklusējuma tiek piešķirtas tiesības veidot organizācijas.
default_allow_create_organization.description=Atzīmējiet šo pazīmi, ja vēlaties, lai jauniem lietotājiem pēc noklusējuma tiek piešķirtas tiesības veidot organizācijas.
default_enable_timetracking=Pēc noklusējuma iespējot laika uzskaiti
default_enable_timetracking_popup=Repozitorijiem pēc noklusējuma tiks iespējota laika uzskaite atkarībā no šī iestatījuma.
default_enable_timetracking.description=Repozitorijiem pēc noklusējuma tiks iespējota laika uzskaite atkarībā no šī iestatījuma.
no_reply_address=Neatbildēt e-pasta adreses domēns
no_reply_address_helper=Domēns lietotāja e-pasta adresei git žurnālos, ja lietotājs izvēlas paturēt savu e-pasta adresi privātu. Piemēram, ja lietotājs ir 'janis' un domēns 'neatbildet.piemers.lv', tad e-pasta adrese būs 'janis@neatbildet.piemers.lv'.
password_algorithm=Paroles jaucējsummas algoritms

View file

@ -274,22 +274,22 @@ 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_popup=Schakel third-party content uit en gebruik alleen lokale middelen.
offline_mode.description=Schakel third-party content uit en gebruik alleen lokale middelen.
disable_gravatar=Gravatar uitschakelen
disable_gravatar_popup=Gravatar en derden avatar bronnen uitschakelen. Een standaard avatar zal worden gebruikt, tenzij een gebruiker een lokale avatar uploadt.
disable_gravatar.description=Gravatar en derden avatar bronnen uitschakelen. Een standaard avatar zal worden gebruikt, tenzij een gebruiker een lokale avatar uploadt.
federated_avatar_lookup=Federated avatars toestaan
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar.
federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar.
disable_registration=Schakel zelf registratie uit
disable_registration_popup=Schakel zelfregistratie uit, alleen admins kunnen accounts maken.
allow_only_external_registration_popup=Registratie alleen via externe diensten toestaan
disable_registration.description=Schakel zelfregistratie uit, alleen admins kunnen accounts maken.
allow_only_external_registration.description=Registratie alleen via externe diensten toestaan
openid_signin=OpenID-inloggen inschakelen
openid_signin_popup=Gebruikerslogin via OpenID inschakelen.
openid_signin.description=Gebruikerslogin via OpenID inschakelen.
openid_signup=OpenID zelf-registratie inschakelen
openid_signup_popup=OpenID zelfregistratie inschakelen.
openid_signup.description=OpenID zelfregistratie inschakelen.
enable_captcha=Registratie CAPTCHA inschakelen
enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker.
enable_captcha.description=Vereis captcha validatie voor zelf-registratie van gebruiker.
require_sign_in_view=Aanmelden vereist om inhoud van instantie te bekijken
admin_setting_desc=Het creëren van een administrator-account is optioneel. De eerste geregistreerde gebruiker wordt automatisch de beheerder.
admin_setting.description=Het creëren van een administrator-account is optioneel. De eerste geregistreerde gebruiker wordt automatisch de beheerder.
admin_title=Instellingen beheerdersaccount
admin_name=Admin gebruikersnaam
admin_password=Wachtwoord
@ -308,11 +308,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_popup=Verberg standaard de email-adressen van nieuwe gebruikers.
default_keep_email_private.description=Verberg standaard de email-adressen van nieuwe gebruikers.
default_allow_create_organization=Standaard toestaan om organisaties aan te maken
default_allow_create_organization_popup=Standaard toestaan dat nieuwe gebruikers organisaties kunnen aanmaken.
default_allow_create_organization.description=Standaard toestaan dat nieuwe gebruikers organisaties kunnen aanmaken.
default_enable_timetracking=Tijdregistratie standaard inschakelen
default_enable_timetracking_popup=Tijdsregistratie voor nieuwe repositories standaard inschakelen.
default_enable_timetracking.description=Tijdsregistratie voor nieuwe repositories standaard inschakelen.
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 +324,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_popup = 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 toegang tot de pagina's tot ingelogde gebruikers. Bezoekers zien alleen de aanmeldings- en registratiepagina's.
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:

View file

@ -273,22 +273,22 @@ register_confirm=Wymagaj potwierdzenia e-mail przy rejestracji
mail_notify=Włącz powiadomienia e-mail
server_service_title=Ustawienia serwera i innych usług
offline_mode=Włącz tryb lokalny
offline_mode_popup=Wyłącz zewnętrzne usługi dostarczania i dostarczaj wszystkie zasoby lokalnie.
offline_mode.description=Wyłącz zewnętrzne usługi dostarczania i dostarczaj wszystkie zasoby lokalnie.
disable_gravatar=Wyłącz Gravatar
disable_gravatar_popup=Wyłącz Gravatar i inne usługi zewnętrzne awatarów. Zostanie zastosowany domyślny awatar, chyba że użytkownik prześle swój własny.
disable_gravatar.description=Wyłącz Gravatar i inne usługi zewnętrzne awatarów. Zostanie zastosowany domyślny awatar, chyba że użytkownik prześle swój własny.
federated_avatar_lookup=Włącz zewnętrzne awatary
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar.
federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar.
disable_registration=Wyłącz samodzielną rejestrację
disable_registration_popup=Wyłącz samodzielną rejestrację użytkowników. Tylko administratorzy będą w stanie tworzyć nowe konta.
allow_only_external_registration_popup=Włącz rejestrację wyłącznie za pomocą zewnętrznych usług
disable_registration.description=Wyłącz samodzielną rejestrację użytkowników. Tylko administratorzy będą w stanie tworzyć nowe konta.
allow_only_external_registration.description=Włącz rejestrację wyłącznie za pomocą zewnętrznych usług
openid_signin=Włącz logowanie za pomocą OpenID
openid_signin_popup=Włącz logowanie użytkowników za pomocą OpenID.
openid_signin.description=Włącz logowanie użytkowników za pomocą OpenID.
openid_signup=Włącz samodzielną rejestrację za pomocą OpenID
openid_signup_popup=Włącz samodzielną rejestrację opartą o OpenID.
openid_signup.description=Włącz samodzielną rejestrację opartą o OpenID.
enable_captcha=Włącz CAPTCHA przy rejestracji
enable_captcha_popup=Wymagaj walidacji CAPTCHA przy samodzielnej rejestracji użytkownika.
enable_captcha.description=Wymagaj walidacji CAPTCHA przy samodzielnej rejestracji użytkownika.
require_sign_in_view=Wymagaj zalogowania się, aby wyświetlić zawartość instancji
admin_setting_desc=Tworzenie konta administratora jest opcjonalne. Pierwszy zarejestrowany użytkownik automatycznie zostanie administratorem.
admin_setting.description=Tworzenie konta administratora jest opcjonalne. Pierwszy zarejestrowany użytkownik automatycznie zostanie administratorem.
admin_title=Ustawienia konta administratora
admin_name=Nazwa użytkownika administratora
admin_password=Hasło
@ -307,11 +307,11 @@ save_config_failed=Nie udało się zapisać konfiguracji: %v
invalid_admin_setting=Nieprawidłowe ustawienia konta administratora: %v
invalid_log_root_path=Ścieżka dla logów jest niepoprawna: %v
default_keep_email_private=Domyślne ukrywanie adresów e-mail
default_keep_email_private_popup=Domyślnie ukrywaj adresy e-mail nowych kont użytkowników.
default_keep_email_private.description=Domyślnie ukrywaj adresy e-mail nowych kont użytkowników.
default_allow_create_organization=Domyślne zezwolenie na tworzenie organizacji
default_allow_create_organization_popup=Domyślnie zezwalaj nowym kontom na tworzenie organizacji.
default_allow_create_organization.description=Domyślnie zezwalaj nowym kontom na tworzenie organizacji.
default_enable_timetracking=Domyślnie włącz śledzenie czasu
default_enable_timetracking_popup=Domyślnie włącz śledzenie czasu dla nowych repozytoriów.
default_enable_timetracking.description=Domyślnie włącz śledzenie czasu dla nowych repozytoriów.
no_reply_address=Ukryta domena e-mail
no_reply_address_helper=Nazwa domeny dla użytkowników z ukrytym adresem e-mail. Przykładowo, użytkownik "jan" będzie zalogowany na Git'cie jako "jan@noreply.example.org", jeśli domena ukrytego adresu e-mail jest ustawiona na "noreply.example.org".
password_algorithm=Algorytm hashowania haseł
@ -326,7 +326,7 @@ password_algorithm_helper = Ustaw algorytm haszowania haseł. Algorytmy mają r
enable_update_checker = Włącz sprawdzanie aktualizacji
env_config_keys = Konfiguracja środowiska
run_user_helper = Nazwa użytkownika systemu operacyjnego, pod którą działa Forgejo. Należy pamiętać, że ten użytkownik musi mieć dostęp do ścieżki głównej repozytorium.
require_sign_in_view_popup = Ogranicz dostęp do strony jedynie do zalogowanych użytkowników. Odwiedzający zobaczą tylko strony logowania i rejestracji.
require_sign_in_view.description = Ogranicz dostęp do strony jedynie do zalogowanych użytkowników. Odwiedzający zobaczą tylko strony logowania i rejestracji.
[home]
uname_holder=Nazwa użytkownika lub adres e-mail

View file

@ -275,23 +275,23 @@ register_confirm=Exigir confirmação de e-mail para cadastros
mail_notify=Habilitar notificações por e-mail
server_service_title=Configurações do servidor e serviços de terceiros
offline_mode=Habilitar modo local
offline_mode_popup=Desabilitar redes de entrega de conteúdo de terceiros e entregar todos os recursos localmente.
offline_mode.description=Desabilitar redes de entrega de conteúdo de terceiros e entregar todos os recursos localmente.
disable_gravatar=Desabilitar o gravatar
disable_gravatar_popup=Desabilitar o gravatar e avatar de fontes de terceiros. Um avatar padrão será usado a menos que um usuário localmente carrega um avatar.
disable_gravatar.description=Desabilitar o gravatar e avatar de fontes de terceiros. Um avatar padrão será usado a menos que um usuário localmente carrega um avatar.
federated_avatar_lookup=Habilitar avatares federados
federated_avatar_lookup_popup=Habilitar a busca federativa de avatares a usar o serviço federativo de código aberto baseado no libravatar.
federated_avatar_lookup.description=Habilitar a busca federativa de avatares a usar o serviço federativo de código aberto baseado no libravatar.
disable_registration=Somente administradores podem criar novas contas
disable_registration_popup=Desabilitar auto-cadastro de usuário. Somente os administradores serão capazes de criar novas contas de usuário.
allow_only_external_registration_popup=Permitir cadastro somente por meio de serviços externos
disable_registration.description=Desabilitar auto-cadastro de usuário. Somente os administradores serão capazes de criar novas contas de usuário.
allow_only_external_registration.description=Permitir cadastro somente por meio de serviços externos
openid_signin=Habilitar acesso via OpenID
openid_signin_popup=Habilitar o acesso de usuários via OpenID.
openid_signin.description=Habilitar o acesso de usuários via OpenID.
openid_signup=Habilitar cadastros via OpenID
openid_signup_popup=Habilitar o auto-cadastro com base no OpenID.
openid_signup.description=Habilitar o auto-cadastro com base no OpenID.
enable_captcha=Habilitar CAPTCHA ao registrar
enable_captcha_popup=Obrigar validação por CAPTCHA para auto-cadastro de usuários.
enable_captcha.description=Obrigar validação por CAPTCHA para auto-cadastro de usuários.
require_sign_in_view=Apenas usuários logados podem visualizar páginas
require_sign_in_view_popup=Limitar o acesso de página aos usuários autenticados. Os visitantes só verão as páginas de autenticação e cadastro.
admin_setting_desc=Criar uma conta de administrador é opcional. O primeiro usuário cadastrado automaticamente se tornará um administrador.
require_sign_in_view.description=Limitar o acesso de página aos usuários autenticados. Os visitantes só verão as páginas de autenticação e cadastro.
admin_setting.description=Criar uma conta de administrador é opcional. O primeiro usuário cadastrado automaticamente se tornará um administrador.
admin_title=Configurações da conta de administrador
admin_name=Usuário
admin_password=Senha
@ -311,11 +311,11 @@ save_config_failed=Falha ao salvar a configuração: %v
invalid_admin_setting=Configuração da conta de administrador está inválida: %v
invalid_log_root_path=Pasta raíz do log está inválida: %v
default_keep_email_private=Ocultar endereços de e-mail por padrão
default_keep_email_private_popup=Ocultar endereços de e-mail de novas contas de usuário por padrão.
default_keep_email_private.description=Ocultar endereços de e-mail de novas contas de usuário por padrão.
default_allow_create_organization=Permitir a criação de organizações
default_allow_create_organization_popup=Permitir que novas contas de usuários criem organizações por padrão.
default_allow_create_organization.description=Permitir que novas contas de usuários criem organizações por padrão.
default_enable_timetracking=Habilitar o cronômetro por padrão
default_enable_timetracking_popup=Habilitar o cronômetro para novos repositórios por padrão.
default_enable_timetracking.description=Habilitar o cronômetro para novos repositórios por padrão.
no_reply_address=Domínio de e-mail oculto
no_reply_address_helper=Nome de domínio para usuários com endereço de e-mail oculto. Por exemplo, o nome de usuário "joe" será registrado no Git como "joe@noreply.example.org" se o domínio de e-mail oculto estiver definido como "noreply.example.org".
password_algorithm=Algoritmo de hash de senhas

View file

@ -275,23 +275,23 @@ register_confirm=Exigir confirmação de email para se inscrever
mail_notify=Habilitar notificações por email
server_service_title=Configurações do servidor e de terceiros
offline_mode=Habilitar o modo local
offline_mode_popup=Desabilitar redes de entrega de conteúdos de terceiros e servir localmente todos os recursos.
offline_mode.description=Desabilitar redes de entrega de conteúdos de terceiros e servir localmente todos os recursos.
disable_gravatar=Desabilitar o Gravatar
disable_gravatar_popup=Desabilitar o Gravatar e fontes de avatares de terceiros. Será usado um avatar padrão, a não ser que o utilizador carregue um avatar localmente.
disable_gravatar.description=Desabilitar o Gravatar e fontes de avatares de terceiros. Será usado um avatar padrão, a não ser que o utilizador carregue um avatar localmente.
federated_avatar_lookup=Habilitar avatares federados
federated_avatar_lookup_popup=Habilitar pesquisa de avatares federada usando o Libravatar.
federated_avatar_lookup.description=Habilitar pesquisa de avatares federada usando o Libravatar.
disable_registration=Desabilitar a auto-inscrição
disable_registration_popup=Desabilitar a auto-inscrição do utilizador. Somente os administradores poderão criar novas contas de utilizador.
allow_only_external_registration_popup=Permitir a inscrição somente por meio de serviços externos
disable_registration.description=Desabilitar a auto-inscrição do utilizador. Somente os administradores poderão criar novas contas de utilizador.
allow_only_external_registration.description=Permitir a inscrição somente por meio de serviços externos
openid_signin=Habilitar início de sessão com OpenID
openid_signin_popup=Habilitar o início de sessão do utilizador usando o OpenID.
openid_signin.description=Habilitar o início de sessão do utilizador usando o OpenID.
openid_signup=Habilitar a auto-inscrição com OpenID
openid_signup_popup=Habilitar a utilização do OpenID para fazer auto-inscrições.
openid_signup.description=Habilitar a utilização do OpenID para fazer auto-inscrições.
enable_captcha=Habilitar CAPTCHA na inscrição
enable_captcha_popup=Exigir CAPTCHA na auto-inscrição de utilizadores.
enable_captcha.description=Exigir CAPTCHA na auto-inscrição de utilizadores.
require_sign_in_view=Exigir sessão iniciada para visualizar conteúdo da instância
require_sign_in_view_popup=Limitar o acesso às páginas aos utilizadores com sessão iniciada. Os visitantes só poderão visualizar as páginas de início de sessão e de inscrição.
admin_setting_desc=A criação de uma conta de administração é opcional. O primeiro utilizador inscrito tornar-se-á automaticamente num administrador.
require_sign_in_view.description=Limitar o acesso às páginas aos utilizadores com sessão iniciada. Os visitantes só poderão visualizar as páginas de início de sessão e de inscrição.
admin_setting.description=A criação de uma conta de administração é opcional. O primeiro utilizador inscrito tornar-se-á automaticamente num administrador.
admin_title=Configurações da conta de administração
admin_name=Nome de utilizador do administrador
admin_password=Senha
@ -311,11 +311,11 @@ save_config_failed=Falhou ao guardar a configuração: %v
invalid_admin_setting=A configuração da conta de administrador é inválida: %v
invalid_log_root_path=A localização dos registos é inválida: %v
default_keep_email_private=Esconder, por norma, os endereços de email
default_keep_email_private_popup=Esconder, por norma, os endereços de email de novos utilizadores.
default_keep_email_private.description=Esconder, por norma, os endereços de email de novos utilizadores.
default_allow_create_organization=Permitir, por norma, a criação de organizações
default_allow_create_organization_popup=Permitir, por norma, que os novos utilizadores criem organizações.
default_allow_create_organization.description=Permitir, por norma, que os novos utilizadores criem organizações.
default_enable_timetracking=Habilitar, por norma, a contagem do tempo
default_enable_timetracking_popup=Habilitar, por norma, a contagem do tempo nos novos repositórios.
default_enable_timetracking.description=Habilitar, por norma, a contagem do tempo nos novos repositórios.
no_reply_address=Domínio dos emails ocultos
no_reply_address_helper=Nome de domínio para utilizadores com um endereço de email oculto. Por exemplo, o nome de utilizador "silva" será registado no Git como "silva@semresposta.exemplo.org" se o domínio de email oculto estiver definido como "semresposta.exemplo.org".
password_algorithm=Algoritmo de Hash da Senha

View file

@ -275,23 +275,23 @@ register_confirm=Требовать подтверждение по эл. поч
mail_notify=Уведомления по эл. почте
server_service_title=Настройки сервера и внешних служб
offline_mode=Локальный режим
offline_mode_popup=Отключить сторонние сети доставки контента и передавать все ресурсы из их локальных копий.
offline_mode.description=Отключить сторонние сети доставки контента и передавать все ресурсы из их локальных копий.
disable_gravatar=Отключить Gravatar
disable_gravatar_popup=Отключить Gravatar и сторонние источники аватаров. Если у пользователя нет локально установленного аватара, будет использоваться аватар по умолчанию.
disable_gravatar.description=Отключить Gravatar и сторонние источники аватаров. Если у пользователя нет локально установленного аватара, будет использоваться аватар по умолчанию.
federated_avatar_lookup=Федерированные аватары
federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar.
federated_avatar_lookup.description=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar.
disable_registration=Отключить самостоятельную регистрацию
disable_registration_popup=Отключить самостоятельную регистрацию. Только администраторы смогут создавать новые учётные записи пользователей.
allow_only_external_registration_popup=Разрешить регистрацию только через сторонние службы
disable_registration.description=Отключить самостоятельную регистрацию. Только администраторы смогут создавать новые учётные записи пользователей.
allow_only_external_registration.description=Разрешить регистрацию только через сторонние службы
openid_signin=Включить вход через OpenID
openid_signin_popup=Включить вход через OpenID.
openid_signin.description=Включить вход через OpenID.
openid_signup=Включить саморегистрацию через OpenID
openid_signup_popup=Включить регистрацию пользователей через OpenID.
openid_signup.description=Включить регистрацию пользователей через OpenID.
enable_captcha=Включить CAPTCHA при регистрации
enable_captcha_popup=Запрашивать капчу при регистрации пользователя.
enable_captcha.description=Запрашивать капчу при регистрации пользователя.
require_sign_in_view=Требовать авторизацию для просмотра содержимого
require_sign_in_view_popup=Ограничить доступ к странице только вошедшими пользователями. Посетители увидят лишь страницы входа и регистрации.
admin_setting_desc=Создание учётной записи администратора необязательно. Первый зарегистрированный пользователь автоматически становится администратором.
require_sign_in_view.description=Ограничить доступ к странице только вошедшими пользователями. Посетители увидят лишь страницы входа и регистрации.
admin_setting.description=Создание учётной записи администратора необязательно. Первый зарегистрированный пользователь автоматически становится администратором.
admin_title=Учётная запись администратора
admin_name=Логин администратора
admin_password=Пароль
@ -311,11 +311,11 @@ save_config_failed=Не удалось сохранить конфигураци
invalid_admin_setting=Некорректные настройки учётной записи администратора: %v
invalid_log_root_path=Недопустимый путь для логов: %v
default_keep_email_private=Скрывать адреса эл. почты по умолчанию
default_keep_email_private_popup=Скрывать адреса эл. почты новых учётных записей по умолчанию.
default_keep_email_private.description=Скрывать адреса эл. почты новых учётных записей по умолчанию.
default_allow_create_organization=Разрешить создание организаций по умолчанию
default_allow_create_organization_popup=Разрешить новым учётным записям пользователей создавать организации по умолчанию.
default_allow_create_organization.description=Разрешить новым учётным записям пользователей создавать организации по умолчанию.
default_enable_timetracking=Включить отслеживание времени по умолчанию
default_enable_timetracking_popup=Включить отслеживание времени для новых репозиториев по умолчанию.
default_enable_timetracking.description=Включить отслеживание времени для новых репозиториев по умолчанию.
no_reply_address=Домен скрытых адресов почты
no_reply_address_helper=Доменное имя для пользователей со скрытым адресом эл. почты. Например, пользователь «joe» будет зарегистрирован в Git как «joe@noreply.example.org», если скрытый домен эл. почты задан как «noreply.example.org».
password_algorithm=Алгоритм хеширования паролей
@ -505,7 +505,7 @@ issue.action.new=<b>@%[1]s</b> создал(а) #%[2]d.
issue.in_tree_path=В %s:
release.new.subject=%s выпущено в %s
release.new.text=<b>@%[1]s</b> выпустил(а) %[2]s в %[3]s
release.new.text=<b>@%[1]s</b> выпуск %[2]s опубликован в %[3]s
release.title=Название: %s
release.note=Примечание:
release.downloads=Загрузки:
@ -1181,10 +1181,10 @@ generated_from=создано из
fork_from_self=Вы не можете создать ответвление собственного репозитория.
fork_guest_user=Войдите, чтобы создать ответвление репозитория.
watch_guest_user=Войдите, чтобы отслеживать этот репозиторий.
star_guest_user=Войдите, чтобы добавить в избранное этот репозиторий.
unwatch=Не отслеживать
star_guest_user=Войдите, чтобы добавить этот репозиторий в избранное.
unwatch=Отслеживается
watch=Отслеживать
unstar=Убр. из избранного
unstar=В избранном
star=В избранное
fork=Ответвление
download_archive=Скачать репозиторий
@ -1223,7 +1223,7 @@ commit=коммит
release=Выпуск
releases=Выпуски
tag=тег
released_this=выпустил(-а) это
released_this=выпуск опубликован
tagged_this=добавил(а) тег
file.title=%s в %s
file_raw=Исходный
@ -1532,7 +1532,7 @@ issues.closed_title=Закрыто
issues.draft_title=Черновик
issues.num_comments_1=%d комментарий
issues.num_comments=комментариев: %d
issues.commented_at=`оставлен комментарий в <a href="#%s"> %s</a>`
issues.commented_at=`оставлен комментарий <a href="#%s"> %s</a>`
issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий?
issues.context.copy_link=Копировать ссылку
issues.context.quote_reply=Цитировать ответ
@ -1730,9 +1730,9 @@ issues.review.un_resolve_conversation=Пометить как неразрешё
issues.review.resolved_by=пометить это обсуждение как разрешённое
issues.assignee.error=Не все назначения были добавлены из-за непредвиденной ошибки.
issues.reference_issue.body=Тело
issues.content_history.deleted=удалено
issues.content_history.edited=отредактировано
issues.content_history.created=создано
issues.content_history.deleted=удалён
issues.content_history.edited=изменён
issues.content_history.created=создан
issues.content_history.delete_from_history=Удалить из истории
issues.content_history.delete_from_history_confirm=Удалить из истории?
issues.content_history.options=Настройки
@ -1959,11 +1959,11 @@ activity.period.quarterly=3 месяца
activity.period.semiyearly=6 месяцев
activity.period.yearly=1 год
activity.overview=Обзор
activity.active_prs_count_1=<strong>%d</strong> активный запрос на слияние
activity.active_prs_count_n=<strong>%d</strong> активных запросов на слияние
activity.merged_prs_count_1=Принятый запрос на слияние
activity.merged_prs_count_n=Принятых запросов на слияние
activity.opened_prs_count_1=Новый запрос на слияние
activity.active_prs_count_1=<strong>%d</strong> активный запрос слияния
activity.active_prs_count_n=<strong>%d</strong> активных запросов слияния
activity.merged_prs_count_1=Принятый запрос слияния
activity.merged_prs_count_n=Принятых запросов слияния
activity.opened_prs_count_1=Новый запрос слияния
activity.opened_prs_count_n=Новых запросов на слияние
activity.title.user_1=%d пользователем
activity.title.user_n=%d пользователями
@ -1973,8 +1973,8 @@ activity.title.prs_merged_by=%s приняты %s
activity.title.prs_opened_by=%s предложены %s
activity.merged_prs_label=Принято
activity.opened_prs_label=Предложено
activity.active_issues_count_1=<strong>%d</strong> Активная задача
activity.active_issues_count_n=<strong>%d</strong> Активных задач
activity.active_issues_count_1=<strong>%d</strong> активная задача
activity.active_issues_count_n=<strong>%d</strong> активных задач
activity.closed_issues_count_1=Закрытая задача
activity.closed_issues_count_n=Закрытых задач
activity.title.issues_1=%d задача
@ -2103,7 +2103,7 @@ settings.pulls.default_allow_edits_from_maintainers=По умолчанию ра
settings.releases_desc=Включить выпуски
settings.packages_desc=Включить реестр пакетов
settings.projects_desc=Включить проекты репозитория
settings.actions_desc=Включить действия
settings.actions_desc=Включить интеграцию конвейеров CI/CD с Forgejo Actions
settings.admin_settings=Настройки администратора
settings.admin_enable_health_check=Проверять целостность этого репозитория (git fsck)
settings.admin_code_indexer=Индексатор кода
@ -3441,7 +3441,7 @@ mirror_sync_create=синхронизировал(а) новую ссылку <a
mirror_sync_delete=синхронизированные и удалённые ссылки <code>%[2]s</code> на <a href="%[1]s">%[3]s</a> из зеркала
approve_pull_request=`одобрен <a href="%[1]s">%[3]s#%[2]s</a>`
reject_pull_request=`предложил(а) изменения для <a href="%[1]s">%[3]s#%[2]s</a>`
publish_release=`выпустил(а) <a href="%[2]s"> %[4]s </a> в <a href="%[1]s">%[3]s</a>`
publish_release=`выпуск <a href="%[2]s">%[4]s</a> опубликован в <a href="%[1]s">%[3]s</a>`
review_dismissed=`отклонён отзыв от <b>%[4]s</b> для <a href="%[1]s">%[3]s#%[2]s</a>`
review_dismissed_reason=Причина:
create_branch=создана ветка <a href="%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a>
@ -3740,9 +3740,9 @@ runs.commit=коммит
runs.scheduled=Запланировано
runs.pushed_by=отправлено
runs.invalid_workflow_helper=Файл конфигурации рабочего потока некорректен. Пожалуйста, проверьте конфигурационный файл: %s
runs.actor=Актор
runs.status=Статус
runs.actors_no_select=Все акторы
runs.actor=Автор
runs.status=Состояние
runs.actors_no_select=Все авторы
runs.no_results=Ничего не найдено.
runs.no_workflows=Пока нет рабочих потоков.
runs.no_runs=Рабочий поток ещё не запускался.
@ -3774,7 +3774,7 @@ variables.id_not_exist = Переменная с идентификатором
runs.no_workflows.quick_start = Не знаете, как начать использовать Действия Forgejo? Читайте <a target="_blank" rel="noopener noreferrer" href="%s">руководство по быстрому старту</a>.
runs.no_workflows.documentation = Чтобы узнать больше о Действиях Forgejo, читайте <a target="_blank" rel="noopener noreferrer" href="%s">документацию</a>.
runs.workflow = Рабочий поток
runs.status_no_select = Любой статус
runs.status_no_select = Любое состояние
runs.no_matching_online_runner_helper = Нет работающего исполнителя с меткой: %s
runs.no_job_without_needs = Рабочий процесс должен содержать хотя бы одну задачу без зависимостей.

View file

@ -174,22 +174,22 @@ register_confirm=ලියාපදිංචි වීමට විද්යු
mail_notify=වි-තැපැල් දැනුම්දීම් සබල කරන්න
server_service_title=සේවාදායකය සහ තෙවන පාර්ශවීය සේවා සැකසුම්
offline_mode=දේශීය ප්රකාරය සක්රීය කරන්න
offline_mode_popup=තෙවන පාර්ශවීය අන්තර්ගත බෙදාහැරීමේ ජාල අක්රීය කර දේශීයව සියලු සම්පත් සේවය කරන්න.
offline_mode.description=තෙවන පාර්ශවීය අන්තර්ගත බෙදාහැරීමේ ජාල අක්රීය කර දේශීයව සියලු සම්පත් සේවය කරන්න.
disable_gravatar=ග්‍රැවටාර් අබල කරන්න
disable_gravatar_popup=Gravatar සහ තෙවන පාර්ශවීය avatar ප්රභවයන් අක්රීය කරන්න. පරිශීලකයෙකු දේශීයව අවතාරයක් උඩුගත නොකරන්නේ නම් පෙරනිමි අවතාරයක් භාවිතා කරනු ඇත.
disable_gravatar.description=Gravatar සහ තෙවන පාර්ශවීය avatar ප්රභවයන් අක්රීය කරන්න. පරිශීලකයෙකු දේශීයව අවතාරයක් උඩුගත නොකරන්නේ නම් පෙරනිමි අවතාරයක් භාවිතා කරනු ඇත.
federated_avatar_lookup=ෆෙඩරල් අවතාර් සක්රීය කරන්න
federated_avatar_lookup_popup=Libravatar භාවිතා ෆෙඩරල් අවතාර් විමසිම සක්රීය කරන්න.
federated_avatar_lookup.description=Libravatar භාවිතා ෆෙඩරල් අවතාර් විමසිම සක්රීය කරන්න.
disable_registration=ස්වයං ලියාපදිංචිය අක්රීය කරන්න
disable_registration_popup=පරිශීලක ස්වයං ලියාපදිංචිය අක්රීය කරන්න. නව පරිශීලක ගිණුම් නිර්මාණය කිරීමට හැක්කේ පරිපාලකයින්ට පමණි.
allow_only_external_registration_popup=විදේශ සේවා මගින් පමණක් ලියාපදිංචි වීමට ඉඩ දෙන්න
disable_registration.description=පරිශීලක ස්වයං ලියාපදිංචිය අක්රීය කරන්න. නව පරිශීලක ගිණුම් නිර්මාණය කිරීමට හැක්කේ පරිපාලකයින්ට පමණි.
allow_only_external_registration.description=විදේශ සේවා මගින් පමණක් ලියාපදිංචි වීමට ඉඩ දෙන්න
openid_signin=OpenID සංඥා සක්රීය කරන්න
openid_signin_popup=OpenID හරහා පරිශීලක සං in ා සක්රීය කරන්න.
openid_signin.description=OpenID හරහා පරිශීලක සං in ා සක්රීය කරන්න.
openid_signup=OpenID ස්වයං ලියාපදිංචිය සක්රීය කරන්න
openid_signup_popup=Openid-මත පදනම් පරිශීලක ස්වයං ලියාපදිංචිය සක්රීය කරන්න.
openid_signup.description=Openid-මත පදනම් පරිශීලක ස්වයං ලියාපදිංචිය සක්රීය කරන්න.
enable_captcha=ලියාපදිංචි CAPTCHA සක්රීය කරන්න
enable_captcha_popup=පරිශීලක ස්වයං ලියාපදිංචිය සඳහා CAPTCHA අවශ්ය වේ.
enable_captcha.description=පරිශීලක ස්වයං ලියාපදිංචිය සඳහා CAPTCHA අවශ්ය වේ.
require_sign_in_view=පිටු බැලීම සඳහා සිග්න්-දී අවශ්ය
admin_setting_desc=පරිපාලක ගිණුමක් නිර්මාණය කිරීම අත්යවශ්ය නොවේ. පළමු ලියාපදිංචි පරිශීලකයා ස්වයංක්රීයව පරිපාලකයෙකු බවට පත්වනු ඇත.
admin_setting.description=පරිපාලක ගිණුමක් නිර්මාණය කිරීම අත්යවශ්ය නොවේ. පළමු ලියාපදිංචි පරිශීලකයා ස්වයංක්රීයව පරිපාලකයෙකු බවට පත්වනු ඇත.
admin_title=පරිපාලක ගිණුමේ සැකසුම්
admin_name=පරිපාලක පරිශීලක නාමය
admin_password=මුරපදය
@ -205,11 +205,11 @@ save_config_failed=වින්යාසය සුරැකීමට අසම
invalid_admin_setting=පරිපාලක ගිණුම් සැකසුම අවලංගුයි: %v
invalid_log_root_path=ලොග් මාර්ගය අවලංගුයි: %v
default_keep_email_private=පෙරනිමියෙන් ඊමේල් ලිපින සඟවන්න
default_keep_email_private_popup=පෙරනිමියෙන් නව පරිශීලක ගිණුම්වල විද්යුත් තැපැල් ලිපින සඟවන්න.
default_keep_email_private.description=පෙරනිමියෙන් නව පරිශීලක ගිණුම්වල විද්යුත් තැපැල් ලිපින සඟවන්න.
default_allow_create_organization=පෙරනිමියෙන් සංවිධාන නිර්මාණය කිරීමට ඉඩ දෙන්න
default_allow_create_organization_popup=පෙරනිමියෙන් සංවිධාන නිර්මාණය කිරීමට නව පරිශීලක ගිණුම් වලට ඉඩ දෙන්න.
default_allow_create_organization.description=පෙරනිමියෙන් සංවිධාන නිර්මාණය කිරීමට නව පරිශීලක ගිණුම් වලට ඉඩ දෙන්න.
default_enable_timetracking=පෙරනිමියෙන් කාල ට්රැකින් සක්රීය කරන්න
default_enable_timetracking_popup=පෙරනිමියෙන් නව ගබඩාවක් සඳහා කාලය සොයා ගැනීම සක්රීය කරන්න.
default_enable_timetracking.description=පෙරනිමියෙන් නව ගබඩාවක් සඳහා කාලය සොයා ගැනීම සක්රීය කරන්න.
no_reply_address=සැඟවුණු වි-තැපැල් වසම
no_reply_address_helper=සැඟවුණු විද්යුත් තැපැල් ලිපිනයක් සහිත පරිශීලකයින් සඳහා ඩොමේන් නාමය. උදාහරණයක් ලෙස, සැඟවුණු විද්යුත් තැපැල් වසම 'no.example.org' ලෙස සකසා තිබේ නම්, 'ජෝ' යන පරිශීලක නාමය ගිට් 'joe@noreply.example.org' ලෙස ලොගින් වනු ලැබේ.
password_algorithm=මුරපදය හැෂ් ඇල්ගොරිතම

View file

@ -253,23 +253,23 @@ register_confirm=Registrácia vyžaduje potvrdenie e-mailu
mail_notify=Povoliť e-mailové upozornenia
server_service_title=Nastavenia servera a ostatných služieb
offline_mode=Povoliť miestny režim
offline_mode_popup=Zakázať siete doručovania obsahu tretích strán a poskytovať celý obsah lokálne.
offline_mode.description=Zakázať siete doručovania obsahu tretích strán a poskytovať celý obsah lokálne.
disable_gravatar=Zakázať Gravatar
disable_gravatar_popup=Zakázať Gravatar a cudzie zdroje avatarov. Ak používateľ nenahrá avatara, použije sa predvolený.
disable_gravatar.description=Zakázať Gravatar a cudzie zdroje avatarov. Ak používateľ nenahrá avatara, použije sa predvolený.
federated_avatar_lookup=Povoliť avatary z verejných zdrojov
federated_avatar_lookup_popup=Povoliť Libavatar na vyhľadávanie avatarov z verejných zdrojov.
federated_avatar_lookup.description=Povoliť Libavatar na vyhľadávanie avatarov z verejných zdrojov.
disable_registration=Zakázať registráciu
disable_registration_popup=Zakázať registráciu. Nové používateľské účty budú môcť vytvárať iba správci.
allow_only_external_registration_popup=Povoliť registráciu iba skrze externé služby
disable_registration.description=Zakázať registráciu. Nové používateľské účty budú môcť vytvárať iba správci.
allow_only_external_registration.description=Povoliť registráciu iba skrze externé služby
openid_signin=Povoliť prihlásenie pomocou OpenID
openid_signin_popup=Povoliť používateľovi prihlásenie pomocou OpenID.
openid_signin.description=Povoliť používateľovi prihlásenie pomocou OpenID.
openid_signup=Povoliť registráciu pomocou OpenID
openid_signup_popup=Povoliť používateľskú registráciu založenú na OpenID.
openid_signup.description=Povoliť používateľskú registráciu založenú na OpenID.
enable_captcha=Povoliť CAPTCHA pri registrácii
enable_captcha_popup=Vyžadovať CAPTCHA validáciu pri registrácii používateľa.
enable_captcha.description=Vyžadovať CAPTCHA validáciu pri registrácii používateľa.
require_sign_in_view=Vyžadovať prihlásenie na prezeranie stránok
require_sign_in_view_popup=Povoliť prístup k stránkam iba pre prihlásených používateľov. Návštevníci uvidia iba prihlasovaciu a registračnú stránku.
admin_setting_desc=Vytvorenie správcovského účtu je nepovinné. Prvý zaregistrovaný používateľ sa stane automaticky správcom.
require_sign_in_view.description=Povoliť prístup k stránkam iba pre prihlásených používateľov. Návštevníci uvidia iba prihlasovaciu a registračnú stránku.
admin_setting.description=Vytvorenie správcovského účtu je nepovinné. Prvý zaregistrovaný používateľ sa stane automaticky správcom.
admin_title=Nastavenia administrátorského účtu
admin_name=Používateľské meno administrátora
admin_password=Heslo
@ -288,11 +288,11 @@ save_config_failed=Nepodarilo sa uložiť konfiguráciu: %v
invalid_admin_setting=Nastavenie administrátorského účtu je neplatné: %v
invalid_log_root_path=Cesta k logom je neplatná: %v
default_keep_email_private=Skrývanie e-mail adries ako predvolené
default_keep_email_private_popup=Predvolene skryť e-mailové adresy nových používateľských účtov.
default_keep_email_private.description=Predvolene skryť e-mailové adresy nových používateľských účtov.
default_allow_create_organization=Predvolene povoliť vytváranie organizácií
default_allow_create_organization_popup=V predvolenom nastavení povoľte novým používateľským účtom vytvárať organizácie.
default_allow_create_organization.description=V predvolenom nastavení povoľte novým používateľským účtom vytvárať organizácie.
default_enable_timetracking=Predvolene povoliť sledovanie času
default_enable_timetracking_popup=Predvolene povoliť sledovanie času pre nové repozitáre.
default_enable_timetracking.description=Predvolene povoliť sledovanie času pre nové repozitáre.
no_reply_address=Skrytá e-mailová doména
no_reply_address_helper=Doménové meno pre používateľov so skrytou e-mailovou adresou. Napríklad, používateľ s menom 'joe' bude zalogovaný v Git-e ako 'joe@noreply.example.org' ak je skrytá e-mailová doména nastavená na 'noreply.example.org'.
password_algorithm=Hašovací algoritmus hesla

View file

@ -137,7 +137,7 @@ require_db_desc = Forgejo zahteva MySQL, PostgreSQL, SQLite3 ali TiDB (protokol
password_algorithm_helper = Nastavite algoritem za stiskanje gesla. Algoritmi imajo različne zahteve in moč. Algoritem argon2 je precej varen, vendar porabi veliko pomnilnika in je lahko neprimeren za majhne sisteme.
reinstall_confirm_message = Ponovna namestitev z obstoječo zbirko podatkov Forgejo lahko povzroči več težav. V večini primerov morate za zagon programa Forgejo uporabiti obstoječi "app.ini". Če veste, kaj počnete, potrdite naslednje:
err_admin_name_is_reserved = Administrator Uporabniško ime je neveljavno, uporabniško ime je rezervirano
disable_gravatar_popup = Onemogočite vire avatarjev Gravatar in avatarje tretjih oseb. Uporabi se privzeti avatar, razen če uporabnik lokalno naloži avatar.
disable_gravatar.description = Onemogočite vire avatarjev Gravatar in avatarje tretjih oseb. Uporabi se privzeti avatar, razen če uporabnik lokalno naloži avatar.
install = Namestitev
title = Začetna nastavitev
db_title = Nastavitve podatkovne zbirke
@ -176,19 +176,19 @@ mailer_user = Uporabniško ime SMTP
mailer_password = Geslo SMTP
server_service_title = Nastavitve strežnika in storitve tretje osebe
offline_mode = Omogoči lokalni način
offline_mode_popup = Onemogočite omrežja za dostavo vsebine tretjih oseb in vse vire ponudite lokalno.
offline_mode.description = Onemogočite omrežja za dostavo vsebine tretjih oseb in vse vire ponudite lokalno.
disable_gravatar = Onemogočite Gravatar
allow_only_external_registration_popup = Dovolite registracijo samo prek zunanjih storitev
federated_avatar_lookup_popup = Omogočite združeno iskanje avatarja z uporabo Libravatar.
allow_only_external_registration.description = Dovolite registracijo samo prek zunanjih storitev
federated_avatar_lookup.description = Omogočite združeno iskanje avatarja z uporabo Libravatar.
enable_captcha = Omogoči registracijo CAPTCHA
enable_captcha_popup = Zahtevajte CAPTCHA za samoprijavo uporabnika.
admin_setting_desc = Ustvarjanje skrbniškega računa ni obvezno. Prvi registrirani uporabnik bo samodejno postal skrbnik.
enable_captcha.description = Zahtevajte CAPTCHA za samoprijavo uporabnika.
admin_setting.description = Ustvarjanje skrbniškega računa ni obvezno. Prvi registrirani uporabnik bo samodejno postal skrbnik.
allow_dots_in_usernames = Uporabnikom dovolite uporabo pik v uporabniških imenih. Ne vpliva na obstoječe račune.
default_keep_email_private = Privzeto skrivanje e-poštnih naslovov
no_reply_address_helper = Ime domene za uporabnike s skritim e-poštnim naslovom. Na primer, uporabniško ime "joe" bo prijavljeno v Git kot "joe@noreply.example.org", če je skrita e-poštna domena nastavljena na "noreply.example.org".
password_algorithm = Algoritem šifriranja gesel
no_reply_address = Skrita e-poštna domena
default_allow_create_organization_popup = Novim uporabniškim računom privzeto dovolite ustvarjanje organizacij.
default_allow_create_organization.description = Novim uporabniškim računom privzeto dovolite ustvarjanje organizacij.
reinstall_confirm_check_1 = Podatki, šifrirani s SECRET_KEY v app.ini, se lahko izgubijo: uporabniki se morda ne bodo mogli prijaviti z 2FA/OTP in ogledala morda ne bodo delovala pravilno. S potrditvijo tega polja potrdite, da trenutna datoteka app.ini vsebuje pravilen SECRET_KEY.
reinstall_confirm_check_2 = Morda bo treba ponovno sinhronizirati skladišča in nastavitve. S potrditvijo tega polja potrdite, da boste kljuke za skladišča in datoteko authorized_keys ponovno sinhronizirali ročno. Potrjujete, da boste zagotovili, da so nastavitve skladišča in zrcala pravilne.
repo_path = Korenska pot repozitorija
@ -203,13 +203,13 @@ register_confirm = Zahtevajte e-poštno potrditev za registracijo
mail_notify = Omogočite e-poštna obvestila
federated_avatar_lookup = Omogočanje združenih avatarjev
disable_registration = Onemogočite samoprijavo
disable_registration_popup = Onemogočite samoprijavo uporabnika. Nove uporabniške račune bodo lahko ustvarjali samo skrbniki.
disable_registration.description = Onemogočite samoprijavo uporabnika. Nove uporabniške račune bodo lahko ustvarjali samo skrbniki.
openid_signin = Omogočanje prijave OpenID
openid_signin_popup = Omogočite prijavo uporabnika prek OpenID.
openid_signin.description = Omogočite prijavo uporabnika prek OpenID.
openid_signup = Omogočanje samoprijave OpenID
openid_signup_popup = Omogočite samoprijavo uporabnikov na podlagi OpenID.
openid_signup.description = Omogočite samoprijavo uporabnikov na podlagi OpenID.
require_sign_in_view = Zahtevajte prijavo za ogled strani
require_sign_in_view_popup = Omejite dostop do strani na prijavljene uporabnike. Obiskovalci bodo videli samo strani za prijavo in registracijo.
require_sign_in_view.description = Omejite dostop do strani na prijavljene uporabnike. Obiskovalci bodo videli samo strani za prijavo in registracijo.
admin_title = Nastavitve administratorskega računa
admin_name = Uporabniško ime administratorja
admin_password = Geslo
@ -229,10 +229,10 @@ save_config_failed = Ni uspelo shraniti konfiguracije: %v
enable_update_checker_helper_forgejo = Redno preverja nove različice programa Forgejo s preverjanjem zapisa DNS TXT na naslovu release.forgejo.org.
invalid_admin_setting = Nastavitev skrbniškega računa je neveljavna: %v
invalid_log_root_path = Pot do dnevnika je neveljavna: %v
default_keep_email_private_popup = Privzeto skrijte e-poštne naslove novih uporabniških računov.
default_keep_email_private.description = Privzeto skrijte e-poštne naslove novih uporabniških računov.
default_allow_create_organization = Privzeto omogočanje ustvarjanja organizacij
default_enable_timetracking = Privzeto omogočite sledenje času
default_enable_timetracking_popup = Privzeto omogočite sledenje času za nove shrambe.
default_enable_timetracking.description = Privzeto omogočite sledenje času za nove shrambe.
invalid_password_algorithm = Nepravilen algoritem za stiskanje gesla
enable_update_checker = Omogočite preverjanje posodobitev
env_config_keys = Konfiguracija okolja

View file

@ -91,6 +91,9 @@ concept_user_organization=Organisation
name=Namn
logo = Logotyp
sign_in_with_provider = Logga in med %s
enable_javascript = Denna webbplats kräver JavaScript.
[aria]
@ -164,22 +167,22 @@ register_confirm=Kräv Bekräftelse Via Mejl För Att Registrera
mail_notify=Aktivera Mejlnotifikationer
server_service_title=Inställningar för Server- och Tredjepartstjänster
offline_mode=Aktivera Lokalt Läge
offline_mode_popup=Inaktivera CDN från tredjepart och distribuera samtliga resurser lokalt istället.
offline_mode.description=Inaktivera CDN från tredjepart och distribuera samtliga resurser lokalt istället.
disable_gravatar=Inaktivera Gravatar
disable_gravatar_popup=Inaktivera Gravatar- och avatarskällor från tredjepart. Om användaren inte laddar upp en avatar så kommer en standardavatar att användas.
disable_gravatar.description=Inaktivera Gravatar- och avatarskällor från tredjepart. Om användaren inte laddar upp en avatar så kommer en standardavatar att användas.
federated_avatar_lookup=Aktivera Federerade Avatarer
federated_avatar_lookup_popup=Använd libravatar vid förenad uppslagning av avatarer.
federated_avatar_lookup.description=Använd libravatar vid förenad uppslagning av avatarer.
disable_registration=Inaktivera Självregistrering
disable_registration_popup=Inaktivera självregistrering av användare. Endast administratörer kommer kunna skapa nya konton.
allow_only_external_registration_popup=Tillåt registrering endast via externa tjänster
disable_registration.description=Inaktivera självregistrering av användare. Endast administratörer kommer kunna skapa nya konton.
allow_only_external_registration.description=Tillåt registrering endast via externa tjänster
openid_signin=Aktivera OpenID-inloggning
openid_signin_popup=Aktivera användarinloggning via OpenID.
openid_signin.description=Aktivera användarinloggning via OpenID.
openid_signup=Aktivera självregistrering genom OpenID
openid_signup_popup=Aktivera OpenID-baserad självregistrering av användare.
openid_signup.description=Aktivera OpenID-baserad självregistrering av användare.
enable_captcha=Aktivera CAPTCHA registrering
enable_captcha_popup=Kräv captcha för användarregistrering.
enable_captcha.description=Kräv captcha för användarregistrering.
require_sign_in_view=Kräv Inloggning För Att Visa Sidor
admin_setting_desc=Skapandet av administratörskonto är frivilligt. Den första användaren som registreras blir automatiskt administratör.
admin_setting.description=Skapandet av administratörskonto är frivilligt. Den första användaren som registreras blir automatiskt administratör.
admin_title=Inställningar för Administratörskonto
admin_name=Användarnamn för Administratör
admin_password=Lösenord
@ -195,11 +198,11 @@ save_config_failed=Misslyckades att spara konfigurationen: %v
invalid_admin_setting=Inställning för administartörskontot är ogiltig: %v
invalid_log_root_path=Sökvägen för loggar är ogiltig: %v
default_keep_email_private=Dölj mailadresser som standard
default_keep_email_private_popup=Dölj mailadresser för nya användarkonton som standard.
default_keep_email_private.description=Dölj mailadresser för nya användarkonton som standard.
default_allow_create_organization=Tillåt skapandet utav organisationer som standard
default_allow_create_organization_popup=Tillåt nya användarkonton att skapa organisationer som standard.
default_allow_create_organization.description=Tillåt nya användarkonton att skapa organisationer som standard.
default_enable_timetracking=Aktivera tidredovisning som Standard
default_enable_timetracking_popup=Aktivera tidsredovisning för nya utvecklingskataloger som standard.
default_enable_timetracking.description=Aktivera tidsredovisning för nya utvecklingskataloger som standard.
no_reply_address=Dold mejldomän
no_reply_address_helper=Domännamn för användare med en dold mailadress. Exempelvis kommer användarnamnet 'joe' att loggas i Git som 'joe@noreply.example.org' om dold maildomän är satt till 'noreply.example.org'.

View file

@ -269,23 +269,23 @@ register_confirm=Kayıt için E-posta Doğrulaması Gereksin
mail_notify=E-Posta Bildirimlerini Etkinleştir
server_service_title=Sunucu ve Diğer Servis Ayarları
offline_mode=Yerel Kipi Etkinleştir
offline_mode_popup=Üçüncü parti içerik teslim ağlarını etkisizleştirin ve bütün kaynakları yerelden sunun.
offline_mode.description=Üçüncü parti içerik teslim ağlarını etkisizleştirin ve bütün kaynakları yerelden sunun.
disable_gravatar=Gravatar'ı Devre Dışı Bırak
disable_gravatar_popup=Gravatar ve üçüncü parti avatar kaynaklarını iptal edin. Kullanıcı bir avatar yüklemediği zaman varsayılan bir avatar kullanılacaktır.
disable_gravatar.description=Gravatar ve üçüncü parti avatar kaynaklarını iptal edin. Kullanıcı bir avatar yüklemediği zaman varsayılan bir avatar kullanılacaktır.
federated_avatar_lookup=Birleştirilmiş Avatarları Etkinleştir
federated_avatar_lookup_popup=Libravatar kullanarak federe avatar aramasını etkinleştirin.
federated_avatar_lookup.description=Libravatar kullanarak federe avatar aramasını etkinleştirin.
disable_registration=Kendi Kendine Kaydolmayı Devre Dışı Bırak
disable_registration_popup=Kullanıcının kendi kendine kaydolmasını devre dışı bırak. Yalnızca yöneticiler yeni hesaplar oluşturabilecek.
allow_only_external_registration_popup=Sadece dış hizmetler aracılığıyla kullanıcı kaydına izin ver
disable_registration.description=Kullanıcının kendi kendine kaydolmasını devre dışı bırak. Yalnızca yöneticiler yeni hesaplar oluşturabilecek.
allow_only_external_registration.description=Sadece dış hizmetler aracılığıyla kullanıcı kaydına izin ver
openid_signin=OpenID Oturum Açmayı Etkinleştiriniz
openid_signin_popup=OpenID ile kullanıcı girişini etkinleştir.
openid_signin.description=OpenID ile kullanıcı girişini etkinleştir.
openid_signup=OpenID ile Kendi Kendine Kaydı Etkinleştir
openid_signup_popup=OpenID Tabanlı Kendi Kendi Kullanıcı Kaydını Etkinleştir.
openid_signup.description=OpenID Tabanlı Kendi Kendi Kullanıcı Kaydını Etkinleştir.
enable_captcha=CAPTCHA kaydını etkinleştir
enable_captcha_popup=Kullanıcının kendi kendine kaydolması için captcha doğrulaması gereksin.
enable_captcha.description=Kullanıcının kendi kendine kaydolması için captcha doğrulaması gereksin.
require_sign_in_view=Sayfaları Görüntülemek için Giriş Yapmak Gereksin
require_sign_in_view_popup=Sayfa erişimini giriş yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir.
admin_setting_desc=Bir yönetici hesabı açmak isteğe bağlıdır. İlk kayıtlı kullanıcı kendiliğinden yönetici olmaktadır.
require_sign_in_view.description=Sayfa erişimini giriş yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir.
admin_setting.description=Bir yönetici hesabı açmak isteğe bağlıdır. İlk kayıtlı kullanıcı kendiliğinden yönetici olmaktadır.
admin_title=Yönetici Hesabı Ayarları
admin_name=Yönetici Kullanıcı Adı
admin_password=Parola
@ -305,11 +305,11 @@ save_config_failed=%v Yapılandırması kaydedilirken hata oluştu
invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v
invalid_log_root_path=Log dosya yolu geçersiz: %v
default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
default_keep_email_private_popup=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
default_keep_email_private.description=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
default_allow_create_organization=Varsayılan Olarak Organizasyon Oluşturmaya İzin Ver
default_allow_create_organization_popup=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluşturmasına izin ver.
default_allow_create_organization.description=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluşturmasına izin ver.
default_enable_timetracking=Varsayılan Olarak Zaman Takibini Etkinleştir
default_enable_timetracking_popup=Yeni depolar için zaman takibini varsayılan olarak etkinleştir.
default_enable_timetracking.description=Yeni depolar için zaman takibini varsayılan olarak etkinleştir.
no_reply_address=Gizlenecek E-Posta Alan Adı
no_reply_address_helper=Gizlenmiş e-posta adresine sahip kullanıcılar için alan adı. Örneğin 'ali' kullanıcı adı, gizlenmiş e-postalar için alan adı 'yanityok.ornek.org' olarak ayarlandığında Git günlüğüne 'ali@yanityok.ornek.org' olarak kaydedilecektir.
password_algorithm=Parola Hash Algoritması

View file

@ -233,22 +233,22 @@ register_confirm=Потрібно підтвердити електронну п
mail_notify=Увімкнути сповіщення електронною поштою
server_service_title=Сервер і налаштування зовнішніх служб
offline_mode=Увімкнути локальний режим
offline_mode_popup=Відключити сторонні мережі доставки контенту і обслуговувати всі ресурси локально.
offline_mode.description=Відключити сторонні мережі доставки контенту і обслуговувати всі ресурси локально.
disable_gravatar=Вимкнути Gravatar
disable_gravatar_popup=Відключити Gravatar і сторонні джерела аватарів. Якщо користувач не завантажить аватар локально то за замовчуванням буде використовуватися стандартний аватар.
disable_gravatar.description=Відключити Gravatar і сторонні джерела аватарів. Якщо користувач не завантажить аватар локально то за замовчуванням буде використовуватися стандартний аватар.
federated_avatar_lookup=Увімкнути федеративні аватари
federated_avatar_lookup_popup=Увімкнути зовнішний Аватар за допомогою Libravatar.
federated_avatar_lookup.description=Увімкнути зовнішний Аватар за допомогою Libravatar.
disable_registration=Вимкнути самостійну реєстрацію
disable_registration_popup=Вимкнути самостійну реєстрацію користувачів, тільки адміністратор може створювати нові облікові записи.
allow_only_external_registration_popup=Дозволити реєстрацію тільки через сторонні сервіси
disable_registration.description=Вимкнути самостійну реєстрацію користувачів, тільки адміністратор може створювати нові облікові записи.
allow_only_external_registration.description=Дозволити реєстрацію тільки через сторонні сервіси
openid_signin=Увімкнути реєстрацію за допомогою OpenID
openid_signin_popup=Увімкнути вхід за допомогою OpenID.
openid_signin.description=Увімкнути вхід за допомогою OpenID.
openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID
openid_signup_popup=Увімкнути самореєстрацію користувачів на основі OpenID.
openid_signup.description=Увімкнути самореєстрацію користувачів на основі OpenID.
enable_captcha=Увімкнути CAPTCHA при реєстрації
enable_captcha_popup=Вимагати перевірку CAPTCHA при самостійній реєстрації користувача.
enable_captcha.description=Вимагати перевірку CAPTCHA при самостійній реєстрації користувача.
require_sign_in_view=Вимагати авторизації для перегляду сторінок
admin_setting_desc=Створення облікового запису адміністратора необов'язково. Перший зареєстрований користувач автоматично стає адміністратором.
admin_setting.description=Створення облікового запису адміністратора необов'язково. Перший зареєстрований користувач автоматично стає адміністратором.
admin_title=Налаштування облікового запису адміністратора
admin_name=Ім'я кристувача Адміністратора
admin_password=Пароль
@ -267,11 +267,11 @@ save_config_failed=Не в змозі зберегти конфігурацію:
invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v
invalid_log_root_path=Неприпустимий шлях для логів: %v
default_keep_email_private=Приховати адресу електронної пошти за замовчуванням
default_keep_email_private_popup=Приховати адресу електронної пошти нових облікових записів за замовчуванням.
default_keep_email_private.description=Приховати адресу електронної пошти нових облікових записів за замовчуванням.
default_allow_create_organization=Дозволити створення організацій за замовчуванням
default_allow_create_organization_popup=Дозволити новим обліковим записам користувачів створювати організації за замовчуванням.
default_allow_create_organization.description=Дозволити новим обліковим записам користувачів створювати організації за замовчуванням.
default_enable_timetracking=Увімкнути відстеження часу за замовчуванням
default_enable_timetracking_popup=Включити відстеження часу для нових репозиторіїв за замовчуванням.
default_enable_timetracking.description=Включити відстеження часу для нових репозиторіїв за замовчуванням.
no_reply_address=Прихований поштовий домен
no_reply_address_helper=Доменне ім'я для користувачів із прихованою електронною адресою. Наприклад, ім'я користувача 'joe' буде входити в Git як 'joe@noreply.example.org', якщо для прихованого домену електронної пошти встановлено 'noreply.example.org'.
password_algorithm=Алгоритм хешування пароля

View file

@ -275,23 +275,23 @@ register_confirm=需要发电子邮件确认注册
mail_notify=启用邮件通知提醒
server_service_title=服务器和第三方服务设置
offline_mode=启用本地模式
offline_mode_popup=禁用第三方 CDN 并在本地服务所有资源。
offline_mode.description=禁用第三方 CDN 并在本地服务所有资源。
disable_gravatar=禁用 Gravatar 头像
disable_gravatar_popup=禁用 Gravatar 和第三方头像源。除非用户在本地上传头像, 否则将使用默认的头像。
disable_gravatar.description=禁用 Gravatar 和第三方头像源。除非用户在本地上传头像, 否则将使用默认的头像。
federated_avatar_lookup=启用 Federated 头像
federated_avatar_lookup_popup=启用 Federated Avatars 查找以使用开源的 Libravatar 服务。
federated_avatar_lookup.description=启用 Federated Avatars 查找以使用开源的 Libravatar 服务。
disable_registration=禁止用户自助注册
disable_registration_popup=禁用用户自助注册。只有管理员才能创建新的用户帐户。
allow_only_external_registration_popup=仅允许通过外部服务注册
disable_registration.description=禁用用户自助注册。只有管理员才能创建新的用户帐户。
allow_only_external_registration.description=仅允许通过外部服务注册
openid_signin=启用 OpenID 登录
openid_signin_popup=启用通过 OpenID 登录
openid_signin.description=启用通过 OpenID 登录
openid_signup=启用 OpenID 自助注册
openid_signup_popup=启用基于 OpenID 的用户自助注册。
openid_signup.description=启用基于 OpenID 的用户自助注册。
enable_captcha=启用注册验证码
enable_captcha_popup=要求在用户注册时输入预验证码
enable_captcha.description=要求在用户注册时输入预验证码
require_sign_in_view=启用页面访问限制
require_sign_in_view_popup=仅允许已登录用户访问页面。访客只能看到注册和登录页。
admin_setting_desc=创建管理员帐户是可选的。第一个注册用户将自动成为管理员。
require_sign_in_view.description=仅允许已登录用户访问页面。访客只能看到注册和登录页。
admin_setting.description=创建管理员帐户是可选的。第一个注册用户将自动成为管理员。
admin_title=管理员帐号设置
admin_name=管理员用户名
admin_password=管理员密码
@ -311,11 +311,11 @@ save_config_failed=应用配置保存失败:%v
invalid_admin_setting=管理员帐户设置无效: %v
invalid_log_root_path=日志路径无效: %v
default_keep_email_private=默认情况下隐藏电子邮件地址
default_keep_email_private_popup=默认情况下, 隐藏新用户帐户的电子邮件地址。
default_keep_email_private.description=默认情况下, 隐藏新用户帐户的电子邮件地址。
default_allow_create_organization=默认情况下允许创建组织
default_allow_create_organization_popup=默认情况下, 允许新用户帐户创建组织。
default_allow_create_organization.description=默认情况下, 允许新用户帐户创建组织。
default_enable_timetracking=默认情况下启用时间跟踪
default_enable_timetracking_popup=默认情况下启用新仓库的时间跟踪。
default_enable_timetracking.description=默认情况下启用新仓库的时间跟踪。
no_reply_address=隐藏电子邮件
no_reply_address_helper=用于设置隐藏电子邮件地址的用户使用的电子邮件域名。例如如果用于隐藏电子邮件地址的域名设为“noreply.example.org”则用户名 “joe” 在 Git 中将以 “joe@noreply.example.org” 表示。
password_algorithm=密码哈希算法

View file

@ -118,8 +118,8 @@ smtp_addr=SMTP 主機地址
smtp_port=SMTP 主機端口
disable_gravatar=禁用 Gravatar 頭像
federated_avatar_lookup=開啟聯合頭像
federated_avatar_lookup_popup=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務
enable_captcha_popup=要求在用戶註冊時輸入驗證碼
federated_avatar_lookup.description=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務
enable_captcha.description=要求在用戶註冊時輸入驗證碼
admin_password=管理員密碼
confirm_password=確認密碼
install_btn_confirm=立即安裝

View file

@ -16,7 +16,7 @@ page=頁面
template=模板
language=語言
notifications=通知
active_stopwatch=進行的時間追蹤
active_stopwatch=正在進行的時間追蹤
create_new=建立…
user_profile_and_more=個人資料和設定…
signed_in_as=已登入為
@ -112,8 +112,8 @@ unknown=未知
rss_feed=RSS 摘要
pin=固定
unpin=取消固定
pin=釘選
unpin=取消釘選
archived=已封存
@ -127,7 +127,7 @@ name=名稱
value=
go_back = 返回
sign_in_with_provider = 使用 %s 登入
tracked_time_summary = 基於 issue 清單篩選器的追蹤時間摘要
tracked_time_summary = 問題清單篩選器的追蹤時間摘要
locked = 已鎖定
rerun = 重新執行
rerun_all = 重新執行所有作業
@ -168,10 +168,10 @@ footer.links=連結
[heatmap]
number_of_contributions_in_the_last_12_months=過去十二個月內有 %s 項貢獻
contributions_zero=沒有貢獻
less=
more=
contributions_format = {year} {month} {day} 有 {contributions}
contributions_one = 貢獻
less=
more=
contributions_format = {year}年{month}{day}日 有 {contributions}
contributions_one = 貢獻
contributions_few = 項貢獻
[editor]
@ -200,7 +200,7 @@ missing_csrf=錯誤的請求:未提供 CSRF 符記
invalid_csrf=錯誤的請求:無效的 CSRF 符記
not_found=找不到目標。
network_error=網路錯誤
report_message = 如果您確定這是一個 Forgejo 的錯誤,請在 <a href="https://codeberg.org/forgejo/forgejo/issues" target="_blank">Codeberg</a> 上搜尋相關問題,或在必要時提出一個問題。
report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 <a href="https://codeberg.org/forgejo/forgejo/issues" target="_blank">Codeberg</a> 上搜尋相關問題,或在必要時提出一個問題。
server_internal = 伺服器內部錯誤
[startpage]
@ -216,7 +216,7 @@ install_desc = 輕鬆使用您平台的<a target="_blank" rel="noopener noreferr
[install]
install=安裝頁面
title=初組態
title=組態
docker_helper=如果您在 Docker 中執行 Forgejo請先閱讀<a target="_blank" rel="noopener noreferrer" href="%s">安裝指南</a>再來調整設定。
require_db_desc=Forgejo 需要 MySQL、PostgreSQL、SQLite3 或 TiDB (MySQL 協定)。
db_title=資料庫設定
@ -240,13 +240,13 @@ no_admin_and_disable_registration=您不能夠在未建立管理員帳號的情
err_empty_admin_password=管理員密碼不能為空。
err_empty_admin_email=管理員信箱不能為空。
err_admin_name_is_reserved=無效的管理員帳號名稱,帳號名稱已被保留
err_admin_name_pattern_not_allowed=無效的管理員帳號名稱,該帳號符合被保留式樣
err_admin_name_pattern_not_allowed=無效的管理員帳號名稱,該名稱符合被保留式樣
err_admin_name_is_invalid=無效的管理員帳號名稱
general_title=一般設定
app_name=站點標題
app_name_helper=您可以在此輸入您的公司名稱。
repo_path=儲存庫根目錄
repo_path=儲存庫根目錄
repo_path_helper=所有遠端 Git 儲存庫會儲存到此目錄。
lfs_path=Git LFS 根目錄
lfs_path_helper=以 Git LFS 儲存檔案時會被儲存在此目錄中。請留空以停用 LFS 功能。
@ -256,13 +256,13 @@ domain_helper=伺服器的域名或主機位置。
ssh_port=SSH 伺服器埠
ssh_port_helper=SSH 伺服器使用的埠號,留空以停用 SSH 伺服器。
http_port=HTTP 埠
http_port_helper=Forgejo 網頁伺服器使用的埠號。
http_port_helper=Forgejo 網頁伺服器使用的埠號。
app_url=基底 URL
app_url_helper=用於 HTTP(S) Clone 和電子郵件通知的基底 URL。
app_url_helper=用於 HTTP(S) 拓製和電子郵件通知的基底 URL。
log_root_path=日誌路徑
log_root_path_helper=日誌檔將寫入此目錄。
optional_title=選填設定
optional_title=選填設定
email_title=電子郵件設定
smtp_addr=SMTP 主機位址
smtp_port=SMTP 連接埠
@ -274,23 +274,23 @@ register_confirm=要求註冊時確認電子郵件
mail_notify=啟用郵件通知
server_service_title=伺服器和第三方服務設定
offline_mode=啟用本地模式
offline_mode_popup=停用其他服務並在本地提供所有資源。
offline_mode.description=停用其他服務並在本地提供所有資源。
disable_gravatar=停用 Gravatar
disable_gravatar_popup=停用 Gravatar 和第三方大頭貼服務。若使用者在未本地上傳大頭貼,將使用預設的大頭貼。
disable_gravatar.description=停用 Gravatar 和第三方大頭貼服務。若使用者在未本地上傳大頭貼,將使用預設的大頭貼。
federated_avatar_lookup=啟用聯邦式大頭貼
federated_avatar_lookup_popup=啟用 Libravatar 提供的聯邦式大頭貼查詢服務。
federated_avatar_lookup.description=啟用 Libravatar 提供的聯邦式大頭貼查詢服務。
disable_registration=停用自助註冊
disable_registration_popup=禁止使用者自助註冊,只有管理員可以新增帳號。
allow_only_external_registration_popup=只允許從外部服務註冊
disable_registration.description=禁止使用者自助註冊,只有管理員可以新增帳號。
allow_only_external_registration.description=只允許從外部服務註冊
openid_signin=啟用 OpenID 登入
openid_signin_popup=啟用 OpenID 登入。
openid_signin.description=啟用 OpenID 登入。
openid_signup=啟用 OpenID 自助註冊
openid_signup_popup=啟用使用 OpenID 的自助註冊。
openid_signup.description=啟用使用 OpenID 的自助註冊。
enable_captcha=啟用註冊驗證碼
enable_captcha_popup=要求在用戶註冊時輸入驗證碼。
enable_captcha.description=要求在用戶註冊時輸入驗證碼。
require_sign_in_view=需要登入才能瀏覽站點內容
require_sign_in_view_popup=僅有已登入的使用者能存取頁面。訪客只會看到登入和註冊頁面。
admin_setting_desc=您不需要建立管理員帳號。 第一個註冊的使用者將自動成為管理員。
require_sign_in_view.description=僅有已登入的使用者能存取頁面。訪客只會看到登入和註冊頁面。
admin_setting.description=您不需要建立管理員帳號。 第一個註冊的使用者將自動成為管理員。
admin_title=管理員帳號設定
admin_name=管理員帳號名稱
admin_password=密碼
@ -310,18 +310,18 @@ save_config_failed=儲存設定失敗:%v
invalid_admin_setting=管理員帳號設定無效:%v
invalid_log_root_path=日誌根目錄設定無效:%v
default_keep_email_private=預設隱藏電子信箱
default_keep_email_private_popup=預設隱藏新使用者帳號的電子信箱。
default_keep_email_private.description=預設隱藏新使用者帳號的電子信箱。
default_allow_create_organization=預設允許建立組織
default_allow_create_organization_popup=預設允許新使用者帳號建立組織。
default_allow_create_organization.description=預設允許新使用者帳號建立組織。
default_enable_timetracking=預設啟用時間追蹤
default_enable_timetracking_popup=預設啟用新存儲庫的時間追蹤。
default_enable_timetracking.description=預設啟用新存儲庫的時間追蹤。
no_reply_address=隱藏電子信箱域名
no_reply_address_helper=隱藏電子信箱的域名。例如如果隱藏的電子信箱域名設定為「noreply.example.org」帳號「joe」將以「joe@noreply.example.org」的身分登入到 Git 中。
password_algorithm=密碼雜湊演算法
invalid_password_algorithm=無效的密碼雜湊演算法
password_algorithm_helper=設定密碼雜湊演算法。演算法有不同的需求與強度。argon2 演算法雖然較安全但會使用大量記憶體,可能不適用於小型系統。
enable_update_checker=啟用更新檢查
run_user_helper = 輸入 Forgejo 執行的作業系統使用者名稱。請注意,此使用者必須具有對儲存庫根路徑的訪問許可權
run_user_helper = 執行 Forgejo 的作業系統使用者名稱。請注意,此使用者必須有存取儲存庫根路徑之權限
env_config_keys_prompt = 以下的環境變數也會被套用於您的設定檔:
env_config_keys = 環境設定
smtp_from_invalid = 郵件寄件人的地址無效
@ -330,9 +330,9 @@ allow_dots_in_usernames = 允許使用者在使用者名稱中使用英文句點
enable_update_checker_helper_forgejo = 透過檢查 release.forgejo.org 的 DNS TXT 記錄來定期檢查新的 Forgejo 版本。
[home]
uname_holder=帳號或電子信箱
uname_holder=帳號名稱或電子信箱
password_holder=密碼
switch_dashboard_context=切換資訊主頁帳號
switch_dashboard_context=切換儀錶版帳號
my_repos=儲存庫
show_more_repos=顯示更多儲存庫…
collaborative_repos=參與協作的儲存庫
@ -380,7 +380,7 @@ stars_few = %d 顆星星
stars_one = %d 顆星星
forks_one = %d 個分叉
forks_few = %d 個分叉
go_to = 前往
go_to = 造訪
[auth]
create_new_account=註冊帳號
@ -404,10 +404,10 @@ resent_limit_prompt=您剛剛已經請求發送驗證電子郵件,請等待 3
has_unconfirmed_mail=%s 您好,您有一個尚未被確認的信箱地址(<b>%s</b>)。如果您還沒收到確認信或需要一封新的,請點擊下方的按鈕。
resend_mail=點擊此處來重新發送確認郵件
email_not_associate=此電子信箱未與任何帳號連結。
send_reset_mail=送帳號復原信
send_reset_mail=送帳號復原信
reset_password=帳號復原
invalid_code=您的確認代碼無效或已過期。
invalid_password=您的密碼用來建立帳號的不符。
invalid_password=您的密碼用來建立帳號的不符。
reset_password_helper=帳號復原
password_too_short=密碼長度不能少於 %d 個英數字母。
non_local_account=非本地帳號無法透過 Forgejo 的網頁介面更改其密碼。
@ -423,14 +423,14 @@ oauth_signup_tab=註冊新帳號
oauth_signup_title=完成新帳號
oauth_signup_submit=完成帳號
oauth_signin_tab=連結至既有帳號
oauth_signin_title=登入以授權連結帳號
oauth_signin_title=登入來授權連結的帳號
oauth_signin_submit=連結帳號
oauth.signin.error=處理授權請求時發生錯誤。如果這個問題持續發生,請聯絡網站管理員。
oauth.signin.error.access_denied=授權請求被拒絕。
oauth.signin.error.temporarily_unavailable=授權失敗,因為認證伺服器暫時無法使用。請稍後再試。
openid_connect_submit=連接
openid_connect_title=連接至既有帳號
openid_connect_desc=所選的 OpenID URI 未知。在這裡連結一個新帳號。
openid_connect_desc=所選的 OpenID URI 未知。在這裡連結一個新帳號。
openid_register_title=建立新帳號
openid_register_desc=所選的 OpenID URI 是未知的。在這裡連結一個新帳號。
disable_forgot_password_mail=由於未設定電子郵件功能,帳號復原功能已被停用。請與網站管理員聯絡。
@ -462,7 +462,7 @@ remember_me.compromised = 此登入符記已經無效,這可能是因為您的
[mail]
view_it_on=在 %s 上查看
reply=或是直接回覆此電子郵件
link_not_working_do_paste=無法開啟?試試複製超連結到瀏覽器貼上。
link_not_working_do_paste=連結沒有用嗎?試試將其複製並於瀏覽器貼上。
hi_user_x=<b>%s</b> 您好,
activate_account=請啟用您的帳號
@ -629,7 +629,7 @@ unsupported_login_type = 該帳號的登入類型使它無法被刪除。
To = 分支名稱
FullName = 全名
Description = 說明
Pronouns = 代名詞
Pronouns = 稱謂語
Biography = 個人簡介
Website = 網站
Location = 地區
@ -975,7 +975,7 @@ visibility.limited_tooltip = 只有已登入的使用者能看見
visibility.private_tooltip = 只有您加入的組織之成員能看見
keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被修改。在提交中使用 %s 來將其連結至您的帳號。
ssh_signonly = 因為目前 SSH 已被停用,這個金鑰只被用來校驗提交簽署。
email_desc = 您的主要電子信箱將被用於通知、密碼復原、網頁 Git 操作(如果您的信箱不是隱藏的)。
email_desc = 您的主要電子信箱將被用於通知、密碼復原、網頁 Git 操作(如果您的信箱不是隱藏的)。
pronouns_custom = 自訂
oauth2_client_secret_hint = 這把密鑰在您離開或重新整理此頁面後將不再被顯示。請確保您已儲存它。
additional_repo_units_hint_description = 在沒有啟用所有模組的儲存庫中顯示「新增更多模組…」按鈕。
@ -997,6 +997,10 @@ webauthn_key_loss_warning = 如果您弄丟了您的安全金鑰,您將無法
user_unblock_success = 已成功解除對此使用者的封鎖。
webauthn_alternative_tip = 您可能想新增一個額外的驗證方法。
user_block_success = 已成功封鎖此使用者。
access_token_desc = 已選擇的符記僅授權相對應的 API 路徑。請參閱<a %s>文件</a>來了解更多。
oauth2_application_locked = 可以在組態中設定 Forgejo 預先註冊一些 OAuth2 應用程式。為了避免不可預料的情況,它們無法被編輯或是移除。請參閱 OAuth2 文件來了解更多。
hidden_comment_types_description = 在這裡選取的留言種類將不會顯示於問題頁面中。舉例來說,核取「標籤」將隱藏所有「使用者新增/移除了<標籤>」留言。
authorized_oauth2_applications_description = 您已授權給這些第三方應用程式取用您的 Forgejo 個人帳號的權限。請撤銷您不再使用的應用程式的權限。
[repo]
owner=所有者
@ -1046,7 +1050,7 @@ trust_model_helper_collaborator_committer=協作者 + 提交者: 信任協作者
trust_model_helper_default=預設: 使用此 Forgejo 的預設儲存庫信任模式
create_repo=建立儲存庫
default_branch=預設分支
default_branch_helper=預設分支是合併請求和提交程式碼的基分支。
default_branch_helper=預設分支是合併請求和提交程式碼的基分支。
mirror_prune=裁減
mirror_prune_desc=刪除過時的遠端追蹤參考
mirror_interval=鏡像週期有效時間單位為「h」、「m」、「s」設為 0 以停用定期同步。(最小值為:%s
@ -1056,7 +1060,7 @@ mirror_address=從 URL Clone
mirror_address_desc=在授權資訊中填入必要的資料。
mirror_lfs=Large File Storage (LFS)
mirror_lfs_desc=啟動 LFS 檔案的鏡像功能。
mirror_lfs_endpoint=LFS
mirror_lfs_endpoint=LFS
mirror_lfs_endpoint_desc=同步將會嘗試使用 Clone URL 來<a target="_blank" rel="noopener noreferrer" href="%s">確認 LFS 伺服器</a>。如果存儲庫的 LFS 資料放在其他地方,您也可以指定自訂的端點。
mirror_last_synced=上次同步
mirror_password_placeholder=(未變更)
@ -1116,7 +1120,7 @@ migrate_service=遷移服務
migrate_options_mirror_helper=將此儲存庫設定為鏡像
migrate_options_lfs=遷移 LFS 檔案
migrate_options_lfs_endpoint.label=LFS 端點
migrate_options_lfs_endpoint.description=遷移將會嘗試使用您的 Git Remote 來<a target="_blank" rel="noopener noreferrer" href="%s">確認 LFS 伺服器</a>。如果存儲庫的 LFS 資料放在其他地方,您也可以指定自訂的端點。
migrate_options_lfs_endpoint.description=遷移將會嘗試使用您的 Git 遠端來<a target="_blank" rel="noopener noreferrer" href="%s">確認 LFS 伺服器</a>。如果存儲庫的 LFS 資料放在其他地方,您也可以指定自訂的端點。
migrate_options_lfs_endpoint.description.local=同時也支援本地伺服器路徑。
migrate_items=遷移項目
migrate_items_wiki=Wiki
@ -1265,10 +1269,10 @@ editor.add_tmpl=新增「<filename>」
editor.add=新增 %s
editor.update=更新 %s
editor.delete=刪除 %s
editor.patch=套用補
editor.patching=正在 Patch:
editor.fail_to_apply_patch=無法套用 Patch「%s」
editor.new_patch=新增補
editor.patch=套用補
editor.patching=正在套用補綴:
editor.fail_to_apply_patch=無法套用補綴「%s」
editor.new_patch=新增補
editor.commit_message_desc=(選填)加入詳細說明…
editor.signoff_desc=在提交訊息底部加入提交者的「Signed-off-by」資訊。
editor.commit_directly_to_this_branch=直接提交到 <strong class="branch-name">%s</strong> 分支。
@ -1368,7 +1372,7 @@ projects.column.new=新增欄位
projects.column.set_default=設為預設
projects.column.set_default_desc=將此欄位設定為未分類問題及合併請求的預設預設值
projects.column.delete=刪除欄位
projects.column.deletion_desc=刪除專案欄位會將所有相關的問題移動到「未分類」,是否繼續
projects.column.deletion_desc=刪除專案欄位會將所有相關的問題移至預設欄位,要繼續嗎
projects.column.color=顏色
projects.open=開啟
projects.close=關閉
@ -1691,7 +1695,7 @@ pulls.new=建立合併請求
pulls.view=檢視合併請求
pulls.compare_changes=建立合併請求
pulls.allow_edits_from_maintainers=允許維護者編輯
pulls.allow_edits_from_maintainers_desc=對基分支有寫入權限的使用者也可以推送到此分支
pulls.allow_edits_from_maintainers_desc=對基分支有寫入權限的使用者也可以推送到此分支
pulls.allow_edits_from_maintainers_err=更新失敗
pulls.compare_changes_desc=選擇合併的目標分支和來源分支。
pulls.has_viewed_file=已檢視
@ -1752,8 +1756,8 @@ pulls.no_merge_wip=無法進行合併,因為它被標記為還在進行中。
pulls.no_merge_not_ready=此合併請求還沒準備好被合併,請檢查審核狀態和狀態檢查。
pulls.no_merge_access=您未被授權合併此合併請求。
pulls.merge_pull_request=建立合併提交
pulls.rebase_merge_pull_request=Rebase 後快轉
pulls.rebase_merge_commit_pull_request=Rebase 後建立合併提交
pulls.rebase_merge_pull_request=變基後快轉
pulls.rebase_merge_commit_pull_request=變基後建立合併提交
pulls.squash_merge_pull_request=建立 Squash 提交
pulls.merge_manually=手動合併
pulls.merge_commit_id=合併提交 ID
@ -1769,7 +1773,7 @@ pulls.merge_out_of_date=合併失敗:產生合併時,基底已被更新。
pulls.head_out_of_date=合併失敗產生合併時head 已被更新。提示:再試一次。
pulls.push_rejected=合併失敗:此推送被拒絕。請檢查此儲存庫的 Git Hook。
pulls.push_rejected_summary=完整的拒絕訊息
pulls.push_rejected_no_message=合併失敗:此推送被拒絕但未提供其他資訊。請檢查此儲存庫的 Git Hook
pulls.push_rejected_no_message=推送失敗:此推送被拒絕但未提供其他資訊。請檢查此儲存庫的 Git Hook
pulls.open_unmerged_pull_exists=`您不能重新開放,因為目前有相同的合併請求 (#%d) 正在進行中。`
pulls.status_checking=還在進行一些檢查
pulls.status_checks_success=已通過所有檢查
@ -1779,7 +1783,7 @@ pulls.status_checks_error=一些檢查回報了錯誤
pulls.status_checks_requested=必要
pulls.status_checks_details=詳情
pulls.update_branch=以合併更新分支
pulls.update_branch_rebase= Rebase 更新分支
pulls.update_branch_rebase=變基更新分支
pulls.update_branch_success=分支更新成功
pulls.update_not_allowed=您無權更新分支
pulls.outdated_with_base_branch=相對於基底分支,此分支已過時
@ -1922,7 +1926,7 @@ activity.git_stats_file_1=%d 個檔案
activity.git_stats_file_n=%d 個檔案
activity.git_stats_files_changed_1=已變更
activity.git_stats_files_changed_n=已變更
activity.git_stats_additions=
activity.git_stats_additions=而且
activity.git_stats_addition_1=新增 %d 行
activity.git_stats_addition_n=新增 %d 行
activity.git_stats_and_deletions=
@ -1996,7 +2000,7 @@ 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.allow_rebase_update=啟用透過變基更新合併請求分支
settings.pulls.default_delete_branch_after_merge=預設在合併後刪除合併請求分支
settings.pulls.default_allow_edits_from_maintainers=預設允許維護者進行編輯
settings.releases_desc=啟用儲存庫版本發佈
@ -2044,13 +2048,13 @@ settings.trust_model=簽署信任模式
settings.trust_model.default=預設信任模式
settings.trust_model.default.desc=使用此 Forgejo 的預設儲存庫信任模式。
settings.trust_model.collaborator=協作者
settings.trust_model.collaborator.long=協作者: 信任協作者的簽署
settings.trust_model.collaborator.long=協作者信任協作者的簽署
settings.trust_model.collaborator.desc=此儲存庫協作者的有效簽署將被標記為「受信任」(無論它們是否符合提交者),簽署只符合提交者時將標記為「不受信任」,都不符合時標記為「不符合」。
settings.trust_model.committer=提交者
settings.trust_model.committer.long=提交者: 信任與提交者相符的簽署 (此選項與 GitHub 相同,這會強制 Forgejo 簽署提交並以 Forgejo 作為提交者)
settings.trust_model.committer.long=提交者信任與提交者相符的簽署 (此選項與 GitHub 相同,這會強制 Forgejo 簽署提交並以 Forgejo 作為提交者)
settings.trust_model.committer.desc=提交者的有效簽署將被標記為「受信任」,否則將被標記為「不符合」。這將會強制 Forgejo 成為受簽署提交的提交者實際的提交者將於提交訊息結尾被標記為「Co-authored-by:」和「Co-committed-by:」。預設的 Forgejo 金鑰必須符合資料庫中的一位使用者。
settings.trust_model.collaboratorcommitter=協作者+提交者
settings.trust_model.collaboratorcommitter.long=協作者 + 提交者: 信任協作者同時是提交者的簽署
settings.trust_model.collaboratorcommitter=協作者 + 提交者
settings.trust_model.collaboratorcommitter.long=協作者 + 提交者信任協作者同時是提交者的簽署
settings.trust_model.collaboratorcommitter.desc=此儲存庫協作者的有效簽署在他同時是提交者時將被標記為「受信任」,簽署只符合提交者時將標記為「不受信任」,都不符合時標記為「不符合」。這會強制 Forgejo 成為受簽署提交的提交者實際的提交者將於提交訊息結尾被標記為「Co-Authored-By:」和「Co-Committed-By:」。預設的 Forgejo 金鑰必須符合資料庫中的一位使用者。
settings.wiki_delete=刪除 Wiki 資料
settings.wiki_delete_desc=刪除儲存庫 Wiki 資料是永久的且不可還原。
@ -2335,7 +2339,7 @@ diff.git-notes=備註
diff.data_not_available=沒有內容比較可以使用
diff.options_button=差異選項
diff.show_diff_stats=顯示統計資料
diff.download_patch=下載 Patch 檔
diff.download_patch=下載補綴檔案
diff.download_diff=下載差異檔
diff.show_split_view=分割檢視
diff.show_unified_view=合併檢視
@ -2359,7 +2363,7 @@ diff.file_suppressed_line_too_long=檔案差異因為一行或多行太長而無
diff.too_many_files=本差異變更的檔案數量過多導致部分檔案未顯示
diff.show_more=顯示更多
diff.load=載入差異
diff.generated=generated
diff.generated=自動產生的
diff.vendored=vendored
diff.comment.placeholder=留言
diff.comment.markdown_info=支援 markdown 格式。
@ -2525,7 +2529,7 @@ object_format = 物件格式
open_with_editor = 用 %s 打開
stars = 星星
n_tag_few = %s 個標籤
migrate_options_lfs_endpoint.placeholder =
migrate_options_lfs_endpoint.placeholder =如果留空,將利用拓製 URL 推導出 endpoint
signing.wont_sign.nokey = 這個站點沒有可以用來簽署的金鑰。
n_branch_few = %s 條分支
n_tag_one = %s 個標籤
@ -2548,6 +2552,102 @@ issues.role.owner_helper = 此使用者是這個儲存庫的所有者。
issues.filter_milestone_all = 所有里程碑
issues.author_helper = 此使用者是作者。
pulls.blocked_by_approvals = 此合併請求還沒有足夠的核可。已有 %d 個,總共需要 %d 個核可。
wiki.search = 搜尋百科
settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定您的儲存庫以自動推送提交、標簽、和分支至另一個儲存庫。Pull 鏡像已被您的管理員停用。
settings.mirror_settings.docs = 設定您的儲存庫以自動與另一個儲存庫同步提交、標籤、和分支。
settings.mirror_settings.docs.disabled_push_mirror.info = 推送鏡像已被您的網站管理員停用。
settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個 pull 鏡像,請參閱:
blame.ignore_revs = <a href="%s">.git-blame-ignore-revs</a> 中的修訂已被忽略。點擊<a href="%s">這裡</a>來檢視一般的責任歸屬界面。
editor.file_is_a_symlink = `「%s」是一個符號連結。網頁編輯器無法編輯符號連結`
issues.label_archive = 封存標籤
pulls.nothing_to_compare_have_tag = 所選的分支/標籤是相等的。
pulls.select_commit_hold_shift_for_range = 選則一個提交。按住 shift 並點擊來選擇一個範圍
pulls.review_only_possible_for_full_diff = 只有在檢視完整 diff 時才能進行審閱
pulls.filter_changes_by_commit = 以提交來篩選
pulls.showing_only_single_commit = 只顯示提交 %[1]s 的變更
pulls.cmd_instruction_merge_desc = 合併更改並在 Forgejo 上更新。
signing.wont_sign.pubkey = 無法簽署該提交,因為您沒有與您帳號連結的公鑰。
signing.wont_sign.twofa = 您必須啟用兩步驟認證才能簽署提交。
signing.wont_sign.basesigned = 因為 base 提交沒有被簽署,無法簽署該提交。
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = 目前,這個操作只能在「新的遷移」目錄完成。如需更多資訊,請參閱:
settings.mirror_settings.docs.disabled_push_mirror.instructions = 設定您的儲存庫以自動從另一個儲存庫拉取提交、標籤和分支。
issues.role.contributor_helper = 該使用者過去曾經提交至此儲存庫。
pulls.fast_forward_only_merge_pull_request = 僅快轉
milestones.filter_sort.latest_due_date = 最晚到期日
signing.wont_sign.parentsigned = 因為該提交的上個提交沒有被簽署,無法簽署該提交。
pulls.show_all_commits = 顯示所有提交
pull.deleted_branch = (已刪除):%s
signing.wont_sign.error = 在檢查是否能簽署提交時發生錯誤。
issues.num_participants_one = %d 位參與者
pulls.showing_specified_commit_range = 只顯示 %[1]s 至 %[2]s 之間的變更
blame.ignore_revs.failed = 忽略 <a href="%s">.git-blame-ignore-revs</a> 中的修訂失敗。
issues.blocked_by_user = 因為您被該儲存庫的所有者封鎖,您不能提出一個新的問題。
pulls.blocked_by_user = 因為您被這個儲存庫的所有者封鎖,您不能在這裡開啟一個合併請求。
pulls.has_merged = 失敗:該合併請求已被合併,您無法再合併一次或更改目標分支。
wiki.cancel = 取消
activity.navbar.code_frequency = 寫程式頻率
settings.mirror_settings.docs.no_new_mirrors = 您的儲存庫目前是另一個儲存庫的鏡像。請記住,您目前不能建立新的鏡像。
settings.mirror_settings.docs.can_still_use = 雖然您不能建立新的鏡像,您還是可以使用既有的鏡像。
pulls.reopen_failed.base_branch = 因為這個合併請求的 base 分支不存在,它無法被開啟。
issues.label_archive_tooltip = 在預設情況下,標籤搜尋時會排除被封存的標籤。
signing.wont_sign.approved = 因為合併請求沒有被核可,這個合併不會被簽署。
activity.navbar.recent_commits = 最近的提交
issues.comment.blocked_by_user = 因為您被該儲存庫的所有者或問題的提出者封鎖,您不能在這則問題上留言。
pulls.closed = 合併請求已關閉
pulls.title_desc_one = 想從 <code>%[2]s</code> 合併 %[1]d 個提交至 <code id="branch_target">%[3]s</code>
pulls.merged_title_desc_one = 於 %[4]s 自 <code>%[2]s</code> 合併了 %[1]d 個提交至 <code>%[3]s</code>
issues.archived_label_description = (已封存)%s
signing.wont_sign.always = 永遠簽署提交。
signing.wont_sign.never = 永不簽署提交。
editor.push_out_of_date = 該推送似乎過期了。
issues.cancel_tracking_history = `已取消時間追蹤 %s`
issues.due_date_not_writer = 您需要有寫入這個儲存庫的權限才能更新其問題的到期日。
pulls.commit_ref_at = `在提交 <a id="%[1]s" href="#%[1]s">%[2]s</a> 引用了這個合併請求`
pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫 checkout 一個新的分支來測試這些更改。
pulls.cmd_instruction_merge_title = 合併
pulls.ready_for_review = 可以開始審閱了嗎?
pulls.cmd_instruction_hint = `檢視<a class="show-instruction">命令列指示</a>`
file_follow = 跟隨象徵式連結
milestones.filter_sort.earliest_due_data = 最早到期日
size_format = %[1]s%[2]s%[3]s%[4]s
invisible_runes_description = `這個檔案內含不可見的 Unicode 字元。電腦可能會把這些人眼無法分辨的字元視作不同的字元處理。如果您覺得作者是有意這麼做的,您可以安全的忽略這則訊息。使用退出鍵來顯示這些字元。`
issues.comment_pull_merged_at = 於 %[3]s 將提交 %[1]s 合併至 %[2]s
issues.comment_manually_pull_merged_at = 於 %[3]s 手動將提交 %[1]s 合併至 %[2]s
issues.role.member_helper = 此使用者是擁有這個儲存庫的組織的成員。
issues.role.collaborator = 協作者
issues.role.first_time_contributor = 第一次貢獻者
issues.role.first_time_contributor_helper = 這是該使用者第一次貢獻至這個儲存庫。
issues.role.contributor = 貢獻者
issues.label_archived_filter = 顯示封存的標籤
issues.review.outdated_description = 內容在這則留言發佈後已被更改
issues.review.option.hide_outdated_comments = 隱藏過期的留言
pulls.merged_success = 已合併並關閉該請求
pulls.merged_info_text = 現在可以刪除分支 %s 了。
pulls.blocked_by_outdated_branch = 因為這個合併請求已過期,它已被暫止。
pulls.blocked_by_changed_protected_files_1 = 這個合併請求被暫止,因為它更改了一個受保護的檔案:
pulls.blocked_by_changed_protected_files_n = 這個合併請求被暫止,因為它更改了這些受保護的檔案:
pulls.status_checks_hide_all = 隱藏所有檢查
pulls.status_checks_show_all = 顯示所有檢查
pulls.reopen_failed.head_branch = 因為這個合併請求的 head 分支不存在,它無法被開啟。
activity.navbar.pulse = 脈搏
signing.will_sign = 將以金鑰「%s」簽署這個提交。
signing.wont_sign.headsigned = 因為 head 提交沒有被簽署,這個合併不會被簽署。
signing.wont_sign.commitssigned = 因為所有相關的提交都沒有被簽署,這個合併不會被簽署。
signing.wont_sign.not_signed_in = 您尚未登入。
wiki.no_search_results = 沒有結果
activity.navbar.contributors = 貢獻者
contributors.contribution_type.filter_label = 貢獻種類:
contributors.contribution_type.additions = 新增
contributors.contribution_type.deletions = 刪除
issues.role.collaborator_helper = 已邀請該使用者在此儲存庫上協作。
issues.review.option.show_outdated_comments = 顯示過期留言
pulls.show_changes_since_your_last_review = 顯示自您上次審閱的變更
pulls.blocked_by_rejection = 這個合併請求有正式審閱者所請求的更改。
pulls.blocked_by_official_review_requests = 因為這個合併請求還缺少至少一個正式審閱者的核可,它已被暫止。
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 = 從遠端儲存庫拉取
[graphs]

30
package-lock.json generated
View file

@ -11,7 +11,7 @@
"@citation-js/plugin-software-formats": "0.6.1",
"@github/markdown-toolbar-element": "2.2.3",
"@github/relative-time-element": "4.4.0",
"@github/text-expander-element": "2.7.0",
"@github/text-expander-element": "2.7.1",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.9.0",
"add-asset-webpack-plugin": "2.0.1",
@ -94,7 +94,6 @@
"stylelint-declaration-strict-value": "1.10.4",
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
"updates": "16.1.1",
"vite-string-plugin": "1.3.1",
"vitest": "1.6.0"
},
@ -1007,13 +1006,13 @@
"integrity": "sha512-CrI6oAecoahG7PF5dsgjdvlF5kCtusVMjg810EULD81TvnDsP+k/FRi/ClFubWLgBo4EGpr2EfvmumtqQFo7ow=="
},
"node_modules/@github/text-expander-element": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.7.0.tgz",
"integrity": "sha512-zeo7l2L91o6yuGHJfA1Xtpg6UgDuZGq0WCgplDwd+54pVIsNzwsynIo6oTjE03cCtqLQpdYRe1wSQxyKYZOoGw==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.7.1.tgz",
"integrity": "sha512-CWxfYxJRkeWVCUhJveproLs6pHsPrWtK8TsjL8ByYVcSCs8CJmNzF8b7ZawrUgfai0F2jb4aIdw2FoBTykj9XA==",
"license": "MIT",
"dependencies": {
"@github/combobox-nav": "^2.0.2",
"dom-input-range": "^1.1.3"
"dom-input-range": "^1.1.6"
}
},
"node_modules/@humanwhocodes/config-array": {
@ -4818,9 +4817,9 @@
}
},
"node_modules/dom-input-range": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/dom-input-range/-/dom-input-range-1.1.5.tgz",
"integrity": "sha512-ITURvugfDoy8Wk8JC6NoI4dKyLPR4qbFnXJ+V+qVpQtTmDgT8HZjH2iNUIMiEU1kkdWEMLgDxYTSXJnPz9aeiA==",
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/dom-input-range/-/dom-input-range-1.1.6.tgz",
"integrity": "sha512-4o/SkTpscD0n81BeErrrtmE58lG8vTks++92vk//ld0NmkQTb4AVJ2rexh2yor6rtBf5IMte26u+fF3EgCppPQ==",
"license": "MIT",
"workspaces": [
"demos"
@ -12184,19 +12183,6 @@
"browserslist": ">= 4.21.0"
}
},
"node_modules/updates": {
"version": "16.1.1",
"resolved": "https://registry.npmjs.org/updates/-/updates-16.1.1.tgz",
"integrity": "sha512-h0Qtbmd9RCi6+99D5o7ACq4h7GxdYjeHFlxd4s0iO3lUOUDo1VnOsbNNIyjHpieVEctaEm/zoEjVggCgAcO/vg==",
"dev": true,
"license": "BSD-2-Clause",
"bin": {
"updates": "dist/updates.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",

View file

@ -10,7 +10,7 @@
"@citation-js/plugin-software-formats": "0.6.1",
"@github/markdown-toolbar-element": "2.2.3",
"@github/relative-time-element": "4.4.0",
"@github/text-expander-element": "2.7.0",
"@github/text-expander-element": "2.7.1",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.9.0",
"add-asset-webpack-plugin": "2.0.1",
@ -93,7 +93,6 @@
"stylelint-declaration-strict-value": "1.10.4",
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
"updates": "16.1.1",
"vite-string-plugin": "1.3.1",
"vitest": "1.6.0"
},

View file

@ -0,0 +1 @@
- [CSRF validation errors when OAuth is not enabled](https://codeberg.org/forgejo/forgejo/commit/193ac67176afc72e9d108bc1730c354bfbf9a442)

View file

@ -0,0 +1 @@
- "Git hooks of this repository seem to be broken." [warning when pushing more than one branch at a time](https://codeberg.org/forgejo/forgejo/commit/62448bfb931882859388b2fd472cb89428c25323)

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