mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-26 13:43:55 +03:00
Merge branch 'forgejo' into forgejo-federated-star
This commit is contained in:
commit
81236bc9ef
173 changed files with 3165 additions and 1753 deletions
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" \
|
||||
|
|
|
@ -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" \
|
||||
|
|
24
Makefile
24
Makefile
|
@ -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
|
||||
|
|
|
@ -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
2
go.mod
|
@ -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
4
go.sum
|
@ -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=
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
1
models/fixtures/push_mirror.yml
Normal file
1
models/fixtures/push_mirror.yml
Normal file
|
@ -0,0 +1 @@
|
|||
[] # empty
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
18
models/migrations/v1_23/v299.go
Normal file
18
models/migrations/v1_23/v299.go
Normal 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))
|
||||
}
|
|
@ -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
359
models/project/column.go
Normal 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
|
||||
})
|
||||
}
|
|
@ -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)
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
45
models/project/template.go
Normal file
45
models/project/template.go
Normal 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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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").
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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") == "" {
|
||||
|
|
|
@ -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},
|
||||
},
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -10,7 +10,7 @@ import (
|
|||
"os"
|
||||
)
|
||||
|
||||
var uninitializedStorage = discardStorage("uninitialized storage")
|
||||
var UninitializedStorage = discardStorage("uninitialized storage")
|
||||
|
||||
type discardStorage string
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import (
|
|||
|
||||
func Test_discardStorage(t *testing.T) {
|
||||
tests := []discardStorage{
|
||||
uninitializedStorage,
|
||||
UninitializedStorage,
|
||||
discardStorage("empty"),
|
||||
}
|
||||
for _, tt := range tests {
|
||||
|
|
|
@ -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{}
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
3
modules/storage/testdata/aws_credentials
vendored
Normal file
3
modules/storage/testdata/aws_credentials
vendored
Normal 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
12
modules/storage/testdata/minio.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"version": "10",
|
||||
"aliases": {
|
||||
"s3": {
|
||||
"url": "https://s3.amazonaws.com",
|
||||
"accessKey": "ExampleAccessKeyIDMinioFile",
|
||||
"secretKey": "ExampleSecretAccessKeyIDMinioFile",
|
||||
"api": "S3v4",
|
||||
"path": "dns"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
}
|
||||
|
|
18
modules/test/utils_test.go
Normal file
18
modules/test/utils_test.go
Normal 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
2
options/license/Gutmann
Normal 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.
|
21
options/license/HPND-export2-US
Normal file
21
options/license/HPND-export2-US
Normal 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.
|
9
options/license/HPND-merchantability-variant
Normal file
9
options/license/HPND-merchantability-variant
Normal 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.
|
66
options/license/RRDtool-FLOSS-exception-2.0
Normal file
66
options/license/RRDtool-FLOSS-exception-2.0
Normal 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
|
|
@ -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 آمنة لكن تتطلب الكثير من الذاكرة ولذلك قد تكون غير ملائمة للأنظمة الصغيرة.
|
||||
|
|
|
@ -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…
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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 για κωδικούς
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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=الگوریتم درهمساز گذرواژه
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 l’accès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et d’inscription.
|
||||
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 l’accès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et d’inscription.
|
||||
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 d’utilisateur 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, l’utilisateur « 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 d’ajout 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 : L’en-tête a été mis à jour pen
|
|||
pulls.has_merged=Échec : La demande d’ajout est déjà fusionnée, vous ne pouvez plus la fusionner, ni modifier sa branche cible.
|
||||
pulls.push_rejected=Échec du push : la soumission a été rejetée. Revoyez les Git hook pour ce dépôt.
|
||||
pulls.push_rejected_summary=Message de rejet complet
|
||||
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 d’ajout #%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…
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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=シークレット
|
||||
|
@ -3804,4 +3822,5 @@ b = B
|
|||
|
||||
[markup]
|
||||
filepreview.lines = %[3]s の %[1]d 行目から %[2]d 行目
|
||||
filepreview.line = %[2]s の %[1]d 行目
|
||||
filepreview.line = %[2]s の %[1]d 行目
|
||||
filepreview.truncated = プレビューは途中から省略されています
|
|
@ -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 = 주시중
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = Рабочий процесс должен содержать хотя бы одну задачу без зависимостей.
|
||||
|
||||
|
|
|
@ -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=මුරපදය හැෂ් ඇල්ගොරිතම
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'.
|
||||
|
||||
|
|
|
@ -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ı
|
||||
|
|
|
@ -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=Алгоритм хешування пароля
|
||||
|
|
|
@ -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=密码哈希算法
|
||||
|
|
|
@ -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=立即安裝
|
||||
|
|
|
@ -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
30
package-lock.json
generated
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
1
release-notes/7.0.4/3859.md
Normal file
1
release-notes/7.0.4/3859.md
Normal file
|
@ -0,0 +1 @@
|
|||
- [CSRF validation errors when OAuth is not enabled](https://codeberg.org/forgejo/forgejo/commit/193ac67176afc72e9d108bc1730c354bfbf9a442)
|
1
release-notes/7.0.4/fix/4004.md
Normal file
1
release-notes/7.0.4/fix/4004.md
Normal 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
Loading…
Reference in a new issue