mirror of
https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo.git
synced 2025-07-08 23:00:03 +02:00
Compare commits
240 commits
forgejo
...
v9.0.2-git
Author | SHA1 | Date | |
---|---|---|---|
![]() |
91b20844de | ||
![]() |
c36e3afd90 | ||
![]() |
24374515df | ||
![]() |
2968668ec2 | ||
![]() |
a1ad8bd1d3 | ||
![]() |
4f16132d91 | ||
![]() |
cadc1a6f79 | ||
![]() |
befbf9aee6 | ||
![]() |
539ce93aa1 | ||
![]() |
d242cbc6ec | ||
![]() |
4fe3ddd33a | ||
![]() |
205c577fa1 | ||
![]() |
871c8534dd | ||
![]() |
4ae4a6e23e | ||
![]() |
ef39cbeed5 | ||
![]() |
1df075d4a5 | ||
![]() |
e42358e4ea | ||
![]() |
f5baf30dae | ||
![]() |
452a1a2fe5 | ||
![]() |
29c12dabf4 | ||
![]() |
d8bf741ad2 | ||
![]() |
de82aebbe9 | ||
![]() |
57bd15293b | ||
![]() |
0875844f7c | ||
![]() |
82dae7785b | ||
![]() |
2d10f09126 | ||
![]() |
173fdc653d | ||
![]() |
b06d18905d | ||
![]() |
9630aef2f1 | ||
![]() |
95d07793a5 | ||
![]() |
e4a59076c9 | ||
![]() |
f3619263b6 | ||
![]() |
519b7d3177 | ||
![]() |
8753d928df | ||
![]() |
fc11d65a4d | ||
![]() |
59921fe17b | ||
![]() |
abcd775431 | ||
![]() |
a48173f14a | ||
![]() |
bb74756879 | ||
![]() |
7842386287 | ||
![]() |
f796004d5c | ||
![]() |
6569f1f25f | ||
![]() |
2f72bec100 | ||
![]() |
42f3644409 | ||
![]() |
1770117178 | ||
![]() |
1379914c45 | ||
![]() |
254bded75e | ||
![]() |
a88e3e6ac0 | ||
![]() |
6c75d1a504 | ||
![]() |
36300be94e | ||
![]() |
c8c8377acb | ||
![]() |
fd4a68b4de | ||
![]() |
78f69040fc | ||
![]() |
3465f73e2c | ||
![]() |
86496d701d | ||
![]() |
de389f2ecc | ||
![]() |
e43533cd1b | ||
![]() |
2a78dba95b | ||
![]() |
e9cd753b98 | ||
![]() |
dac13b7fc3 | ||
![]() |
0db515dfec | ||
![]() |
336ccf45c8 | ||
![]() |
70aefc810c | ||
![]() |
6025b93664 | ||
![]() |
e823122f19 | ||
![]() |
ef9df01cd2 | ||
![]() |
2e114bcaa0 | ||
![]() |
91a12abdaf | ||
![]() |
79bc6e8c35 | ||
![]() |
770fa89dc8 | ||
![]() |
9a7b0c3f02 | ||
![]() |
8c51053739 | ||
![]() |
3a4612cb2b | ||
![]() |
c0113bfbbe | ||
![]() |
08396d566b | ||
![]() |
66b6917923 | ||
![]() |
397b3cf88f | ||
![]() |
bcb72df356 | ||
![]() |
ed2d5f6b73 | ||
![]() |
eda6b436dc | ||
![]() |
09a35a7cb8 | ||
![]() |
a68a37f59c | ||
![]() |
2b86ff6768 | ||
![]() |
8a65c4d28d | ||
![]() |
d624a5edd6 | ||
![]() |
11f71dcb09 | ||
![]() |
7ec30b6ee9 | ||
![]() |
13a5d9f3af | ||
![]() |
a429dbad98 | ||
![]() |
0c0fd333f3 | ||
![]() |
d96cef1ac4 | ||
![]() |
3f58b8d1bd | ||
![]() |
908bd64238 | ||
![]() |
be36f91bb7 | ||
![]() |
8e4536fd98 | ||
![]() |
f043fb4495 | ||
![]() |
1dc03cc1c3 | ||
![]() |
e4dac6a6ab | ||
![]() |
ff585d0a20 | ||
![]() |
5f9a2ad1db | ||
![]() |
618eb8e72a | ||
![]() |
d763886dae | ||
![]() |
768402c884 | ||
![]() |
9c6f2a132d | ||
![]() |
d77096071d | ||
![]() |
f0abba3eef | ||
![]() |
5d211c101f | ||
![]() |
01e9ac0561 | ||
![]() |
a4e5b1b6bc | ||
![]() |
1f62fe8ae0 | ||
![]() |
96f0c76648 | ||
![]() |
e37a344ce5 | ||
![]() |
887a9576b8 | ||
![]() |
edd468323f | ||
![]() |
4b7f369290 | ||
![]() |
ef8f366734 | ||
![]() |
c5e4694327 | ||
![]() |
9471083571 | ||
![]() |
804051b9dd | ||
![]() |
893d0941a8 | ||
![]() |
1913399d81 | ||
![]() |
4fe311e7c0 | ||
![]() |
b8ffb88d1d | ||
![]() |
fd8565c91a | ||
![]() |
c87ff7dc1d | ||
![]() |
7d3d8ef142 | ||
![]() |
032bb17899 | ||
![]() |
fa307f06ac | ||
![]() |
d5c6036c53 | ||
![]() |
f3b16e1363 | ||
![]() |
240fbc2661 | ||
![]() |
642dd61446 | ||
![]() |
c7e52852bb | ||
![]() |
5d85dc2d91 | ||
![]() |
b692da7f6f | ||
![]() |
2c5d47ec1f | ||
![]() |
e740aa05a4 | ||
![]() |
fb21899097 | ||
![]() |
0f7020cbef | ||
![]() |
e491b05935 | ||
![]() |
7845659322 | ||
![]() |
9011f73da3 | ||
![]() |
b1ffd0f58f | ||
![]() |
f5d83f395f | ||
![]() |
348e083227 | ||
![]() |
704910c7e9 | ||
![]() |
12a277ed65 | ||
![]() |
e43b9edc36 | ||
![]() |
acd7e57295 | ||
![]() |
c131de73a5 | ||
![]() |
b8fc56885e | ||
![]() |
7f4efb1c34 | ||
![]() |
779ed6cf3f | ||
![]() |
11bb77313e | ||
![]() |
c2f99a5a1f | ||
![]() |
d1c4670e45 | ||
![]() |
fe35a17dbe | ||
![]() |
d66a184f45 | ||
![]() |
932801ae18 | ||
![]() |
d6d6561295 | ||
![]() |
18b60db6ae | ||
![]() |
1b36e34fc4 | ||
![]() |
d2d161ad28 | ||
![]() |
f2f2d7dab2 | ||
![]() |
1667fece88 | ||
![]() |
044cd5cf7e | ||
![]() |
dfd1b2fdcd | ||
![]() |
bf1839aed3 | ||
![]() |
26f0a7e779 | ||
![]() |
a7f4346f5e | ||
![]() |
d2ee58fb2a | ||
![]() |
aec4a0dd59 | ||
![]() |
5ffa1ee883 | ||
![]() |
3cd20d7d37 | ||
![]() |
d8c8fa9bae | ||
![]() |
d7e2fd555c | ||
![]() |
1f9104d96f | ||
![]() |
ea5a8c7809 | ||
![]() |
5ae3b81f3c | ||
![]() |
6d2c29ae85 | ||
![]() |
0496e72d15 | ||
![]() |
e90a48fd4b | ||
![]() |
e2ffe12e50 | ||
![]() |
2c0c6f408e | ||
![]() |
092cb967b0 | ||
![]() |
d62cbfe923 | ||
![]() |
43bad93715 | ||
![]() |
eb80c9429e | ||
![]() |
946a10a8d5 | ||
![]() |
a7165d1fb0 | ||
![]() |
47b67fcafc | ||
![]() |
7d3a013e5e | ||
![]() |
4cb10ff28a | ||
![]() |
00e5c68060 | ||
![]() |
700e9f027b | ||
![]() |
9ee88e965e | ||
![]() |
0ae05e1000 | ||
![]() |
2ff9e77dba | ||
![]() |
4ddf4a8fd3 | ||
![]() |
4c7fef22f6 | ||
![]() |
01e7095968 | ||
![]() |
f1e413eb7c | ||
![]() |
67b9b0c76e | ||
![]() |
56f9ddc9af | ||
![]() |
00749b3a8f | ||
![]() |
8da48fead3 | ||
![]() |
b835f0a1b0 | ||
![]() |
f8c0a352ab | ||
![]() |
859fa4e489 | ||
![]() |
e8a67571a1 | ||
![]() |
28c8a889bb | ||
![]() |
3003195ad7 | ||
![]() |
c400f26e6c | ||
![]() |
0a0a3cea1b | ||
![]() |
cb88d55837 | ||
![]() |
e1e7299bd9 | ||
![]() |
d8ae7d9e96 | ||
![]() |
b28a070a52 | ||
![]() |
b2483b2ae0 | ||
![]() |
14c7055494 | ||
![]() |
81b9977540 | ||
![]() |
a75862bd7d | ||
![]() |
99baeb47e5 | ||
![]() |
7d45c1c6c7 | ||
![]() |
5442b0a6b1 | ||
![]() |
da0c4ab199 | ||
![]() |
658ed564cb | ||
![]() |
eb4f1de8ec | ||
![]() |
ba7da0af31 | ||
![]() |
74712e3400 | ||
![]() |
6c16834d28 | ||
![]() |
81308159fd | ||
![]() |
2f1a737769 | ||
![]() |
5b6d8a303d | ||
![]() |
d26b7902ec | ||
![]() |
1a8f1482af | ||
![]() |
84718e7b17 | ||
![]() |
232179aa3d | ||
![]() |
300e01f733 | ||
![]() |
d727757cfb |
275 changed files with 16075 additions and 3209 deletions
2
.forgejo/testdata/build-release/Dockerfile
vendored
2
.forgejo/testdata/build-release/Dockerfile
vendored
|
@ -3,4 +3,4 @@ ARG RELEASE_VERSION=unkown
|
||||||
LABEL maintainer="contact@forgejo.org" \
|
LABEL maintainer="contact@forgejo.org" \
|
||||||
org.opencontainers.image.version="${RELEASE_VERSION}"
|
org.opencontainers.image.version="${RELEASE_VERSION}"
|
||||||
RUN mkdir -p /app/gitea
|
RUN mkdir -p /app/gitea
|
||||||
RUN ( echo '#!/bin/sh' ; echo "echo forgejo v$RELEASE_VERSION" ) > /app/gitea/forgejo-cli ; chmod +x /app/gitea/forgejo-cli
|
RUN ( echo '#!/bin/sh' ; echo "echo forgejo v$RELEASE_VERSION" ) > /app/gitea/gitea ; chmod +x /app/gitea/gitea
|
||||||
|
|
2
.forgejo/testdata/build-release/go.mod
vendored
2
.forgejo/testdata/build-release/go.mod
vendored
|
@ -1,3 +1,3 @@
|
||||||
module code.gitea.io/gitea
|
module code.gitea.io/gitea
|
||||||
|
|
||||||
go 1.23.1
|
go 1.23.2
|
||||||
|
|
|
@ -31,7 +31,7 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
backporting:
|
backporting:
|
||||||
if: >
|
if: >
|
||||||
!startsWith(vars.ROLE, 'forgejo-') && (
|
( vars.ROLE == 'forgejo-coding' ) && (
|
||||||
github.event.pull_request.merged
|
github.event.pull_request.merged
|
||||||
&&
|
&&
|
||||||
contains(toJSON(github.event.pull_request.labels), 'backport/v')
|
contains(toJSON(github.event.pull_request.labels), 'backport/v')
|
||||||
|
|
41
.forgejo/workflows/build-oci-image.yml
Normal file
41
.forgejo/workflows/build-oci-image.yml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'forgejo'
|
||||||
|
tags:
|
||||||
|
- '*-git-annex*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-oci-image:
|
||||||
|
runs-on: docker
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
type: ["rootful", "rootless"]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # fetch the full history so that the Forgejo version is determined properly
|
||||||
|
- name: Determine registry and username
|
||||||
|
id: determine-registry-and-username
|
||||||
|
run: |
|
||||||
|
echo "registry=${GITHUB_SERVER_URL#https://}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "username=${GITHUB_REPOSITORY%/*}" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: Install Docker
|
||||||
|
run: curl -fsSL https://get.docker.com | sh
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ steps.determine-registry-and-username.outputs.registry }}
|
||||||
|
username: ${{ steps.determine-registry-and-username.outputs.username }}
|
||||||
|
password: ${{ secrets.REGISTRY_TOKEN }}
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ${{ (matrix.type == 'rootful' && 'Dockerfile') || (matrix.type == 'rootless' && 'Dockerfile.rootless') }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.determine-registry-and-username.outputs.registry }}/${{ github.repository }}:${{ github.ref_name }}${{ (matrix.type == 'rootful' && ' ') || (matrix.type == 'rootless' && '-rootless') }}
|
|
@ -22,10 +22,10 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-simulation:
|
release-simulation:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding'
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- id: forgejo
|
- id: forgejo
|
||||||
uses: https://code.forgejo.org/actions/setup-forgejo@v1
|
uses: https://code.forgejo.org/actions/setup-forgejo@v1
|
||||||
|
|
|
@ -27,7 +27,7 @@ jobs:
|
||||||
# root is used for testing, allow it
|
# root is used for testing, allow it
|
||||||
if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root'
|
if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ jobs:
|
||||||
repository="${{ github.repository }}"
|
repository="${{ github.repository }}"
|
||||||
echo "value=${repository##*/}" >> "$GITHUB_OUTPUT"
|
echo "value=${repository##*/}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- uses: https://code.forgejo.org/actions/setup-node@v3
|
- uses: https://code.forgejo.org/actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ jobs:
|
||||||
|
|
||||||
- name: cache node_modules
|
- name: cache node_modules
|
||||||
id: node
|
id: node
|
||||||
uses: https://code.forgejo.org/actions/cache@v3
|
uses: https://code.forgejo.org/actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
node_modules
|
node_modules
|
||||||
|
@ -170,7 +170,7 @@ jobs:
|
||||||
platforms: linux/amd64,linux/arm64,linux/arm/v6
|
platforms: linux/amd64,linux/arm64,linux/arm/v6
|
||||||
release-notes: "${{ steps.release-notes.outputs.value }}"
|
release-notes: "${{ steps.release-notes.outputs.value }}"
|
||||||
binary-name: forgejo
|
binary-name: forgejo
|
||||||
binary-path: /app/gitea/forgejo-cli
|
binary-path: /app/gitea/gitea
|
||||||
override: "${{ steps.release-info.outputs.override }}"
|
override: "${{ steps.release-info.outputs.override }}"
|
||||||
verify-labels: "maintainer=contact@forgejo.org,org.opencontainers.image.version=${{ steps.release-info.outputs.version }}"
|
verify-labels: "maintainer=contact@forgejo.org,org.opencontainers.image.version=${{ steps.release-info.outputs.version }}"
|
||||||
verbose: ${{ vars.VERBOSE || secrets.VERBOSE || 'false' }}
|
verbose: ${{ vars.VERBOSE || secrets.VERBOSE || 'false' }}
|
||||||
|
@ -194,7 +194,7 @@ jobs:
|
||||||
verbose: ${{ vars.VERBOSE || secrets.VERBOSE || 'false' }}
|
verbose: ${{ vars.VERBOSE || secrets.VERBOSE || 'false' }}
|
||||||
|
|
||||||
- name: end-to-end tests
|
- name: end-to-end tests
|
||||||
if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' }}
|
if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' && vars.SKIP_END_TO_END != 'true' }}
|
||||||
uses: https://code.forgejo.org/actions/cascading-pr@v2
|
uses: https://code.forgejo.org/actions/cascading-pr@v2
|
||||||
with:
|
with:
|
||||||
origin-url: ${{ env.GITHUB_SERVER_URL }}
|
origin-url: ${{ env.GITHUB_SERVER_URL }}
|
||||||
|
|
|
@ -24,7 +24,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
info:
|
info:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: code.forgejo.org/oci/node:20-bookworm
|
image: code.forgejo.org/oci/node:20-bookworm
|
||||||
|
@ -44,7 +44,7 @@ jobs:
|
||||||
|
|
||||||
cascade:
|
cascade:
|
||||||
if: >
|
if: >
|
||||||
!startsWith(vars.ROLE, 'forgejo-') && (
|
vars.ROLE == 'forgejo-coding' && (
|
||||||
github.event_name == 'push' ||
|
github.event_name == 'push' ||
|
||||||
(
|
(
|
||||||
github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests')
|
github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests')
|
||||||
|
|
|
@ -14,7 +14,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test-e2e:
|
test-e2e:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/playwright:latest'
|
image: 'code.forgejo.org/oci/playwright:latest'
|
||||||
|
|
|
@ -39,7 +39,7 @@ jobs:
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != ''
|
if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != ''
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: copy & sign
|
- name: copy & sign
|
||||||
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/publish@v5
|
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/publish@v5
|
||||||
|
@ -59,16 +59,31 @@ jobs:
|
||||||
gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||||
verbose: ${{ vars.VERBOSE }}
|
verbose: ${{ vars.VERBOSE }}
|
||||||
|
|
||||||
|
- name: get trigger mirror issue
|
||||||
|
id: mirror
|
||||||
|
uses: https://code.forgejo.org/infrastructure/issue-action/get@v1.1.0
|
||||||
|
with:
|
||||||
|
forgejo: https://code.forgejo.org
|
||||||
|
repository: forgejo/forgejo
|
||||||
|
labels: mirror-trigger
|
||||||
|
|
||||||
|
- name: trigger the mirror
|
||||||
|
uses: https://code.forgejo.org/infrastructure/issue-action/set@v1.1.0
|
||||||
|
with:
|
||||||
|
forgejo: https://code.forgejo.org
|
||||||
|
repository: forgejo/forgejo
|
||||||
|
token: ${{ secrets.LABEL_ISSUE_FORGEJO_MIRROR_TOKEN }}
|
||||||
|
numbers: ${{ steps.mirror.outputs.numbers }}
|
||||||
|
label-wait-if-exists: 3600
|
||||||
|
label: trigger
|
||||||
|
|
||||||
- name: upgrade v*.next.forgejo.org
|
- name: upgrade v*.next.forgejo.org
|
||||||
run: |
|
uses: https://code.forgejo.org/infrastructure/next-digest@v1.1.0
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
with:
|
||||||
apt-get update -qq
|
url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@code.forgejo.org/infrastructure/next-digest
|
||||||
apt-get -q install -y -qq curl
|
ref_name: '${{ github.ref_name }}'
|
||||||
version="${{ github.ref_name }}"
|
image: 'codeberg.org/forgejo-experimental/forgejo'
|
||||||
version=${version##*v}
|
tag_suffix: '-rootless'
|
||||||
major=$(echo $version | sed -E -e 's/^([0-9]+).*/\1/')
|
|
||||||
# https://forgejo.org/docs/next/developer/infrastructure
|
|
||||||
curl -o /dev/null -sS https://v$major.next.forgejo.org/.well-known/wakeup-on-logs/forgejo-v$major
|
|
||||||
|
|
||||||
- name: set up go for the DNS update below
|
- name: set up go for the DNS update below
|
||||||
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
|
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
|
||||||
|
|
|
@ -6,12 +6,12 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-notes:
|
release-notes:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-')
|
if: vars.ROLE == 'forgejo-coding'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
|
|
|
@ -7,12 +7,12 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-notes:
|
release-notes:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') && contains(github.event.pull_request.labels.*.name, 'worth a release-note') }}
|
if: ( vars.ROLE == 'forgejo-coding' ) && contains(github.event.pull_request.labels.*.name, 'worth a release-note')
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
|
||||||
- name: event
|
- name: event
|
||||||
run: |
|
run: |
|
||||||
|
|
|
@ -8,7 +8,9 @@ name: renovate
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- 'renovate/**' # self-test updates
|
- renovate/** # self-test updates
|
||||||
|
paths:
|
||||||
|
- .forgejo/workflows/renovate.yml
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0/2 * * *'
|
- cron: '0 0/2 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
@ -19,7 +21,7 @@ env:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
renovate:
|
renovate:
|
||||||
if: ${{ secrets.RENOVATE_TOKEN != '' }}
|
if: vars.ROLE == 'forgejo-coding' && secrets.RENOVATE_TOKEN != ''
|
||||||
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
|
|
|
@ -9,7 +9,6 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
backend-checks:
|
backend-checks:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
|
@ -19,7 +18,7 @@ jobs:
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
${{ toJSON(github) }}
|
${{ toJSON(github) }}
|
||||||
EOF
|
EOF
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
@ -34,19 +33,17 @@ jobs:
|
||||||
path: '/workspace/forgejo/forgejo/gitea'
|
path: '/workspace/forgejo/forgejo/gitea'
|
||||||
key: backend-build-${{ github.sha }}
|
key: backend-build-${{ github.sha }}
|
||||||
frontend-checks:
|
frontend-checks:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- run: make deps-frontend
|
- run: make deps-frontend
|
||||||
- run: make lint-frontend
|
- run: make lint-frontend
|
||||||
- run: make checks-frontend
|
- run: make checks-frontend
|
||||||
- run: make test-frontend-coverage
|
- run: make test-frontend-coverage
|
||||||
- run: make frontend
|
- run: make frontend
|
||||||
test-unit:
|
test-unit:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -66,7 +63,7 @@ jobs:
|
||||||
MINIO_ROOT_USER: 123456
|
MINIO_ROOT_USER: 123456
|
||||||
MINIO_ROOT_PASSWORD: 12345678
|
MINIO_ROOT_PASSWORD: 12345678
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
@ -106,7 +103,6 @@ jobs:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
|
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
|
||||||
test-remote-cacher:
|
test-remote-cacher:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -131,7 +127,7 @@ jobs:
|
||||||
image: ${{ matrix.cacher.image }}
|
image: ${{ matrix.cacher.image }}
|
||||||
options: ${{ matrix.cacher.options }}
|
options: ${{ matrix.cacher.options }}
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
@ -167,7 +163,6 @@ jobs:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
|
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
|
||||||
test-mysql:
|
test-mysql:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -183,7 +178,7 @@ jobs:
|
||||||
#
|
#
|
||||||
MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000
|
MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
@ -195,6 +190,16 @@ jobs:
|
||||||
apt-get install --no-install-recommends -qq -y git git-lfs
|
apt-get install --no-install-recommends -qq -y git git-lfs
|
||||||
rm /etc/apt/sources.list.d/testing.list
|
rm /etc/apt/sources.list.d/testing.list
|
||||||
apt-get update -qq
|
apt-get update -qq
|
||||||
|
cd /
|
||||||
|
wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz
|
||||||
|
tar xzvf git-annex-standalone-amd64.tar.gz
|
||||||
|
ln -s \
|
||||||
|
/git-annex.linux/git-annex \
|
||||||
|
/git-annex.linux/git-annex-shell \
|
||||||
|
/git-annex.linux/git-annex-webapp \
|
||||||
|
/git-annex.linux/git-remote-annex \
|
||||||
|
bin
|
||||||
|
cd -
|
||||||
- name: setup user and permissions
|
- name: setup user and permissions
|
||||||
run: |
|
run: |
|
||||||
git config --add safe.directory '*'
|
git config --add safe.directory '*'
|
||||||
|
@ -214,11 +219,9 @@ jobs:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
- run: |
|
- run: |
|
||||||
su forgejo -c 'make test-mysql-migration test-mysql'
|
su forgejo -c 'make test-mysql-migration test-mysql'
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
env:
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
test-pgsql:
|
test-pgsql:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -237,7 +240,7 @@ jobs:
|
||||||
POSTGRES_DB: test
|
POSTGRES_DB: test
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
@ -249,6 +252,16 @@ jobs:
|
||||||
apt-get install --no-install-recommends -qq -y git git-lfs
|
apt-get install --no-install-recommends -qq -y git git-lfs
|
||||||
rm /etc/apt/sources.list.d/testing.list
|
rm /etc/apt/sources.list.d/testing.list
|
||||||
apt-get update -qq
|
apt-get update -qq
|
||||||
|
cd /
|
||||||
|
wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz
|
||||||
|
tar xzvf git-annex-standalone-amd64.tar.gz
|
||||||
|
ln -s \
|
||||||
|
/git-annex.linux/git-annex \
|
||||||
|
/git-annex.linux/git-annex-shell \
|
||||||
|
/git-annex.linux/git-annex-webapp \
|
||||||
|
/git-annex.linux/git-remote-annex \
|
||||||
|
bin
|
||||||
|
cd -
|
||||||
- name: setup user and permissions
|
- name: setup user and permissions
|
||||||
run: |
|
run: |
|
||||||
git config --add safe.directory '*'
|
git config --add safe.directory '*'
|
||||||
|
@ -268,19 +281,17 @@ jobs:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
- run: |
|
- run: |
|
||||||
su forgejo -c 'make test-pgsql-migration test-pgsql'
|
su forgejo -c 'make test-pgsql-migration test-pgsql'
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
env:
|
||||||
RACE_ENABLED: true
|
RACE_ENABLED: true
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
TEST_LDAP: 1
|
TEST_LDAP: 1
|
||||||
test-sqlite:
|
test-sqlite:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
@ -292,6 +303,16 @@ jobs:
|
||||||
apt-get install --no-install-recommends -qq -y git git-lfs
|
apt-get install --no-install-recommends -qq -y git git-lfs
|
||||||
rm /etc/apt/sources.list.d/testing.list
|
rm /etc/apt/sources.list.d/testing.list
|
||||||
apt-get update -qq
|
apt-get update -qq
|
||||||
|
cd /
|
||||||
|
wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz
|
||||||
|
tar xzvf git-annex-standalone-amd64.tar.gz
|
||||||
|
ln -s \
|
||||||
|
/git-annex.linux/git-annex \
|
||||||
|
/git-annex.linux/git-annex-shell \
|
||||||
|
/git-annex.linux/git-annex-webapp \
|
||||||
|
/git-annex.linux/git-remote-annex \
|
||||||
|
bin
|
||||||
|
cd -
|
||||||
- name: setup user and permissions
|
- name: setup user and permissions
|
||||||
run: |
|
run: |
|
||||||
git config --add safe.directory '*'
|
git config --add safe.directory '*'
|
||||||
|
@ -311,14 +332,12 @@ jobs:
|
||||||
TAGS: bindata sqlite sqlite_unlock_notify
|
TAGS: bindata sqlite sqlite_unlock_notify
|
||||||
- run: |
|
- run: |
|
||||||
su forgejo -c 'make test-sqlite-migration test-sqlite'
|
su forgejo -c 'make test-sqlite-migration test-sqlite'
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
env:
|
||||||
TAGS: sqlite sqlite_unlock_notify
|
TAGS: sqlite sqlite_unlock_notify
|
||||||
RACE_ENABLED: true
|
RACE_ENABLED: true
|
||||||
TEST_TAGS: sqlite sqlite_unlock_notify
|
TEST_TAGS: sqlite sqlite_unlock_notify
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
security-check:
|
security-check:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs:
|
needs:
|
||||||
- test-sqlite
|
- test-sqlite
|
||||||
|
@ -329,7 +348,7 @@ jobs:
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
|
|
@ -51,7 +51,7 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \
|
||||||
/go/src/code.gitea.io/gitea/environment-to-ini
|
/go/src/code.gitea.io/gitea/environment-to-ini
|
||||||
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
||||||
|
|
||||||
FROM code.forgejo.org/oci/golang:1.23-alpine3.20
|
FROM code.forgejo.org/oci/alpine:3.20
|
||||||
ARG RELEASE_VERSION
|
ARG RELEASE_VERSION
|
||||||
LABEL maintainer="contact@forgejo.org" \
|
LABEL maintainer="contact@forgejo.org" \
|
||||||
org.opencontainers.image.authors="Forgejo" \
|
org.opencontainers.image.authors="Forgejo" \
|
||||||
|
@ -78,6 +78,7 @@ RUN apk --no-cache add \
|
||||||
sqlite \
|
sqlite \
|
||||||
su-exec \
|
su-exec \
|
||||||
gnupg \
|
gnupg \
|
||||||
|
git-annex \
|
||||||
&& rm -rf /var/cache/apk/*
|
&& rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
RUN addgroup \
|
RUN addgroup \
|
||||||
|
@ -103,6 +104,6 @@ CMD ["/bin/s6-svscan", "/etc/s6"]
|
||||||
COPY --from=build-env /tmp/local /
|
COPY --from=build-env /tmp/local /
|
||||||
RUN cd /usr/local/bin ; ln -s gitea forgejo
|
RUN cd /usr/local/bin ; ln -s gitea forgejo
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
||||||
RUN ln /app/gitea/gitea /app/gitea/forgejo-cli
|
RUN ln -s /app/gitea/gitea /app/gitea/forgejo-cli
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
|
|
|
@ -49,7 +49,7 @@ RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \
|
||||||
/go/src/code.gitea.io/gitea/environment-to-ini
|
/go/src/code.gitea.io/gitea/environment-to-ini
|
||||||
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
||||||
|
|
||||||
FROM code.forgejo.org/oci/golang:1.23-alpine3.20
|
FROM code.forgejo.org/oci/alpine:3.20
|
||||||
LABEL maintainer="contact@forgejo.org" \
|
LABEL maintainer="contact@forgejo.org" \
|
||||||
org.opencontainers.image.authors="Forgejo" \
|
org.opencontainers.image.authors="Forgejo" \
|
||||||
org.opencontainers.image.url="https://forgejo.org" \
|
org.opencontainers.image.url="https://forgejo.org" \
|
||||||
|
@ -71,6 +71,7 @@ RUN apk --no-cache add \
|
||||||
git \
|
git \
|
||||||
curl \
|
curl \
|
||||||
gnupg \
|
gnupg \
|
||||||
|
git-annex \
|
||||||
&& rm -rf /var/cache/apk/*
|
&& rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
RUN addgroup \
|
RUN addgroup \
|
||||||
|
@ -90,7 +91,7 @@ RUN chown git:git /var/lib/gitea /etc/gitea
|
||||||
COPY --from=build-env /tmp/local /
|
COPY --from=build-env /tmp/local /
|
||||||
RUN cd /usr/local/bin ; ln -s gitea forgejo
|
RUN cd /usr/local/bin ; ln -s gitea forgejo
|
||||||
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
||||||
RUN ln /app/gitea/gitea /app/gitea/forgejo-cli
|
RUN ln -s /app/gitea/gitea /app/gitea/forgejo-cli
|
||||||
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
|
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -8,7 +8,7 @@ self := $(location)
|
||||||
@tmpdir=`mktemp --tmpdir -d` ; \
|
@tmpdir=`mktemp --tmpdir -d` ; \
|
||||||
echo Using temporary directory $$tmpdir for test repositories ; \
|
echo Using temporary directory $$tmpdir for test repositories ; \
|
||||||
USE_REPO_TEST_DIR= $(MAKE) -f $(self) --no-print-directory REPO_TEST_DIR=$$tmpdir/ $@ ; \
|
USE_REPO_TEST_DIR= $(MAKE) -f $(self) --no-print-directory REPO_TEST_DIR=$$tmpdir/ $@ ; \
|
||||||
STATUS=$$? ; rm -r "$$tmpdir" ; exit $$STATUS
|
STATUS=$$? ; chmod -R +w "$$tmpdir" && rm -r "$$tmpdir" ; exit $$STATUS
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ else
|
||||||
FORGEJO_VERSION_API ?= $(GITEA_VERSION)+${GITEA_COMPATIBILITY}
|
FORGEJO_VERSION_API ?= $(GITEA_VERSION)+${GITEA_COMPATIBILITY}
|
||||||
else
|
else
|
||||||
# drop the "g" prefix prepended by git describe to the commit hash
|
# drop the "g" prefix prepended by git describe to the commit hash
|
||||||
FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/')+${GITEA_COMPATIBILITY}
|
FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/2')+${GITEA_COMPATIBILITY}
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
FORGEJO_VERSION_MAJOR=$(shell echo $(FORGEJO_VERSION) | sed -e 's/\..*//')
|
FORGEJO_VERSION_MAJOR=$(shell echo $(FORGEJO_VERSION) | sed -e 's/\..*//')
|
||||||
|
|
87
cmd/serv.go
87
cmd/serv.go
|
@ -38,6 +38,7 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
lfsAuthenticateVerb = "git-lfs-authenticate"
|
lfsAuthenticateVerb = "git-lfs-authenticate"
|
||||||
|
gitAnnexShellVerb = "git-annex-shell"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CmdServ represents the available serv sub-command.
|
// CmdServ represents the available serv sub-command.
|
||||||
|
@ -79,6 +80,7 @@ var (
|
||||||
"git-upload-archive": perm.AccessModeRead,
|
"git-upload-archive": perm.AccessModeRead,
|
||||||
"git-receive-pack": perm.AccessModeWrite,
|
"git-receive-pack": perm.AccessModeWrite,
|
||||||
lfsAuthenticateVerb: perm.AccessModeNone,
|
lfsAuthenticateVerb: perm.AccessModeNone,
|
||||||
|
gitAnnexShellVerb: perm.AccessModeNone, // annex permissions are enforced by GIT_ANNEX_SHELL_READONLY, rather than the Gitea API
|
||||||
}
|
}
|
||||||
alphaDashDotPattern = regexp.MustCompile(`[^\w-\.]`)
|
alphaDashDotPattern = regexp.MustCompile(`[^\w-\.]`)
|
||||||
)
|
)
|
||||||
|
@ -147,6 +149,12 @@ func runServ(c *cli.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
_ = fail(ctx, "Internal Server Error", "Panic: %v\n%s", err, log.Stack(2))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
keys := strings.Split(c.Args().First(), "-")
|
keys := strings.Split(c.Args().First(), "-")
|
||||||
if len(keys) != 2 || keys[0] != "key" {
|
if len(keys) != 2 || keys[0] != "key" {
|
||||||
return fail(ctx, "Key ID format error", "Invalid key argument: %s", c.Args().First())
|
return fail(ctx, "Key ID format error", "Invalid key argument: %s", c.Args().First())
|
||||||
|
@ -193,10 +201,7 @@ func runServ(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
verb := words[0]
|
verb := words[0]
|
||||||
repoPath := words[1]
|
repoPath := strings.TrimPrefix(words[1], "/")
|
||||||
if repoPath[0] == '/' {
|
|
||||||
repoPath = repoPath[1:]
|
|
||||||
}
|
|
||||||
|
|
||||||
var lfsVerb string
|
var lfsVerb string
|
||||||
if verb == lfsAuthenticateVerb {
|
if verb == lfsAuthenticateVerb {
|
||||||
|
@ -209,6 +214,28 @@ func runServ(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if verb == gitAnnexShellVerb {
|
||||||
|
if !setting.Annex.Enabled {
|
||||||
|
return fail(ctx, "Unknown git command", "git-annex request over SSH denied, git-annex support is disabled")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(words) < 3 {
|
||||||
|
return fail(ctx, "Too few arguments", "Too few arguments in cmd: %s", cmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
// git-annex always puts the repo in words[2], unlike most other
|
||||||
|
// git subcommands; and it sometimes names repos like /~/, as if
|
||||||
|
// $HOME should get expanded while also being rooted. e.g.:
|
||||||
|
// git-annex-shell 'configlist' '/~/user/repo'
|
||||||
|
// git-annex-shell 'sendkey' '/user/repo 'key'
|
||||||
|
repoPath = words[2]
|
||||||
|
repoPath = strings.TrimPrefix(repoPath, "/")
|
||||||
|
repoPath = strings.TrimPrefix(repoPath, "~/")
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent directory traversal attacks
|
||||||
|
repoPath = filepath.Clean("/" + repoPath)[1:]
|
||||||
|
|
||||||
rr := strings.SplitN(repoPath, "/", 2)
|
rr := strings.SplitN(repoPath, "/", 2)
|
||||||
if len(rr) != 2 {
|
if len(rr) != 2 {
|
||||||
return fail(ctx, "Invalid repository path", "Invalid repository path: %v", repoPath)
|
return fail(ctx, "Invalid repository path", "Invalid repository path: %v", repoPath)
|
||||||
|
@ -222,6 +249,18 @@ func runServ(c *cli.Context) error {
|
||||||
// so that username and reponame are not affected.
|
// so that username and reponame are not affected.
|
||||||
repoPath = strings.ToLower(strings.TrimSpace(repoPath))
|
repoPath = strings.ToLower(strings.TrimSpace(repoPath))
|
||||||
|
|
||||||
|
// put the sanitized repoPath back into the argument list for later
|
||||||
|
if verb == gitAnnexShellVerb {
|
||||||
|
// git-annex-shell demands an absolute path
|
||||||
|
absRepoPath, err := filepath.Abs(filepath.Join(setting.RepoRootPath, repoPath))
|
||||||
|
if err != nil {
|
||||||
|
return fail(ctx, "Error locating repoPath", "%v", err)
|
||||||
|
}
|
||||||
|
words[2] = absRepoPath
|
||||||
|
} else {
|
||||||
|
words[1] = repoPath
|
||||||
|
}
|
||||||
|
|
||||||
if alphaDashDotPattern.MatchString(reponame) {
|
if alphaDashDotPattern.MatchString(reponame) {
|
||||||
return fail(ctx, "Invalid repo name", "Invalid repo name: %s", reponame)
|
return fail(ctx, "Invalid repo name", "Invalid repo name: %s", reponame)
|
||||||
}
|
}
|
||||||
|
@ -300,21 +339,45 @@ func runServ(c *cli.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var gitcmd *exec.Cmd
|
gitBinVerb, err := exec.LookPath(verb)
|
||||||
gitBinPath := filepath.Dir(git.GitExecutable) // e.g. /usr/bin
|
if err != nil {
|
||||||
gitBinVerb := filepath.Join(gitBinPath, verb) // e.g. /usr/bin/git-upload-pack
|
|
||||||
if _, err := os.Stat(gitBinVerb); err != nil {
|
|
||||||
// if the command "git-upload-pack" doesn't exist, try to split "git-upload-pack" to use the sub-command with git
|
// if the command "git-upload-pack" doesn't exist, try to split "git-upload-pack" to use the sub-command with git
|
||||||
// ps: Windows only has "git.exe" in the bin path, so Windows always uses this way
|
// ps: Windows only has "git.exe" in the bin path, so Windows always uses this way
|
||||||
|
// ps: git-annex-shell and other extensions may not necessarily be in gitBinPath,
|
||||||
|
// but '{gitBinPath}/git annex-shell' should be able to find them on $PATH.
|
||||||
verbFields := strings.SplitN(verb, "-", 2)
|
verbFields := strings.SplitN(verb, "-", 2)
|
||||||
if len(verbFields) == 2 {
|
if len(verbFields) == 2 {
|
||||||
// use git binary with the sub-command part: "C:\...\bin\git.exe", "upload-pack", ...
|
// use git binary with the sub-command part: "C:\...\bin\git.exe", "upload-pack", ...
|
||||||
gitcmd = exec.CommandContext(ctx, git.GitExecutable, verbFields[1], repoPath)
|
gitBinVerb = git.GitExecutable
|
||||||
|
words = append([]string{verbFields[1]}, words...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if gitcmd == nil {
|
|
||||||
// by default, use the verb (it has been checked above by allowedCommands)
|
// by default, use the verb (it has been checked above by allowedCommands)
|
||||||
gitcmd = exec.CommandContext(ctx, gitBinVerb, repoPath)
|
gitcmd := exec.CommandContext(ctx, gitBinVerb, words[1:]...)
|
||||||
|
|
||||||
|
if verb == gitAnnexShellVerb {
|
||||||
|
// This doesn't get its own isolated section like LFS does, because LFS
|
||||||
|
// is handled by internal Gitea routines, but git-annex has to be shelled out
|
||||||
|
// to like other git subcommands, so we need to build up gitcmd.
|
||||||
|
|
||||||
|
// TODO: does this work on Windows?
|
||||||
|
gitcmd.Env = append(gitcmd.Env,
|
||||||
|
// "If set, disallows running git-shell to handle unknown commands."
|
||||||
|
// - git-annex-shell(1)
|
||||||
|
"GIT_ANNEX_SHELL_LIMITED=True",
|
||||||
|
// "If set, git-annex-shell will refuse to run commands
|
||||||
|
// that do not operate on the specified directory."
|
||||||
|
// - git-annex-shell(1)
|
||||||
|
fmt.Sprintf("GIT_ANNEX_SHELL_DIRECTORY=%s", words[2]),
|
||||||
|
)
|
||||||
|
if results.UserMode < perm.AccessModeWrite {
|
||||||
|
// "If set, disallows any action that could modify the git-annex repository."
|
||||||
|
// - git-annex-shell(1)
|
||||||
|
// We set this when the backend API has told us that we don't have write permission to this repo.
|
||||||
|
log.Debug("Setting GIT_ANNEX_SHELL_READONLY=True")
|
||||||
|
gitcmd.Env = append(gitcmd.Env, "GIT_ANNEX_SHELL_READONLY=True")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
process.SetSysProcAttribute(gitcmd)
|
process.SetSysProcAttribute(gitcmd)
|
||||||
|
|
11
cmd/web.go
11
cmd/web.go
|
@ -9,6 +9,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -247,6 +248,12 @@ func runWeb(ctx *cli.Context) error {
|
||||||
createPIDFile(ctx.String("pid"))
|
createPIDFile(ctx.String("pid"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if setting.Annex.Enabled {
|
||||||
|
if _, err := exec.LookPath("git-annex"); err != nil {
|
||||||
|
log.Fatal("You have enabled git-annex support but git-annex is not installed. Please make sure that Forgejo's PATH contains the git-annex executable.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if !setting.InstallLock {
|
if !setting.InstallLock {
|
||||||
if err := serveInstall(ctx); err != nil {
|
if err := serveInstall(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -311,6 +318,10 @@ func listen(m http.Handler, handleRedirector bool) error {
|
||||||
log.Info("LFS server enabled")
|
log.Info("LFS server enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if setting.Annex.Enabled {
|
||||||
|
log.Info("git-annex enabled")
|
||||||
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
switch setting.Protocol {
|
switch setting.Protocol {
|
||||||
case setting.HTTP:
|
case setting.HTTP:
|
||||||
|
|
|
@ -529,7 +529,8 @@ INTERNAL_TOKEN =
|
||||||
;; HMAC to encode urls with, it **is required** if camo is enabled.
|
;; HMAC to encode urls with, it **is required** if camo is enabled.
|
||||||
;HMAC_KEY =
|
;HMAC_KEY =
|
||||||
;; Set to true to use camo for https too lese only non https urls are proxyed
|
;; Set to true to use camo for https too lese only non https urls are proxyed
|
||||||
;ALLWAYS = false
|
;; ALLWAYS is deprecated and will be removed in the future
|
||||||
|
;ALWAYS = false
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -2653,6 +2654,17 @@ LEVEL = Info
|
||||||
;; override the minio base path if storage type is minio
|
;; override the minio base path if storage type is minio
|
||||||
;MINIO_BASE_PATH = lfs/
|
;MINIO_BASE_PATH = lfs/
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;[annex]
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;;
|
||||||
|
;; Whether git-annex is enabled; defaults to false
|
||||||
|
;ENABLED = false
|
||||||
|
;; Whether to disable p2phttp support; default is the same as repository.DISABLE_HTTP_GIT
|
||||||
|
;DISABLE_P2PHTTP = false
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; settings for packages, will override storage setting
|
;; settings for packages, will override storage setting
|
||||||
|
|
6
go.mod
6
go.mod
|
@ -1,6 +1,6 @@
|
||||||
module code.gitea.io/gitea
|
module code.gitea.io/gitea
|
||||||
|
|
||||||
go 1.23.1
|
go 1.23.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
code.forgejo.org/f3/gof3/v3 v3.7.0
|
code.forgejo.org/f3/gof3/v3 v3.7.0
|
||||||
|
@ -75,7 +75,7 @@ require (
|
||||||
github.com/meilisearch/meilisearch-go v0.28.0
|
github.com/meilisearch/meilisearch-go v0.28.0
|
||||||
github.com/mholt/archiver/v3 v3.5.1
|
github.com/mholt/archiver/v3 v3.5.1
|
||||||
github.com/microcosm-cc/bluemonday v1.0.27
|
github.com/microcosm-cc/bluemonday v1.0.27
|
||||||
github.com/minio/minio-go/v7 v7.0.74
|
github.com/minio/minio-go/v7 v7.0.77
|
||||||
github.com/msteinert/pam v1.2.0
|
github.com/msteinert/pam v1.2.0
|
||||||
github.com/nektos/act v0.2.52
|
github.com/nektos/act v0.2.52
|
||||||
github.com/niklasfasching/go-org v1.7.0
|
github.com/niklasfasching/go-org v1.7.0
|
||||||
|
@ -250,7 +250,7 @@ require (
|
||||||
github.com/rhysd/actionlint v1.6.27 // indirect
|
github.com/rhysd/actionlint v1.6.27 // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
||||||
github.com/rs/xid v1.5.0 // indirect
|
github.com/rs/xid v1.6.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||||
|
|
8
go.sum
8
go.sum
|
@ -502,8 +502,8 @@ github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs=
|
||||||
github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk=
|
github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk=
|
||||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
||||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
||||||
github.com/minio/minio-go/v7 v7.0.74 h1:fTo/XlPBTSpo3BAMshlwKL5RspXRv9us5UeHEGYCFe0=
|
github.com/minio/minio-go/v7 v7.0.77 h1:GaGghJRg9nwDVlNbwYjSDJT1rqltQkBFDsypWX1v3Bw=
|
||||||
github.com/minio/minio-go/v7 v7.0.74/go.mod h1:qydcVzV8Hqtj1VtEocfxbmVFa2siu6HGa+LDEPogjD8=
|
github.com/minio/minio-go/v7 v7.0.77/go.mod h1:AVM3IUN6WwKzmwBxVdjzhH8xq+f57JSbbvzqvUzR6eg=
|
||||||
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
||||||
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
||||||
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
||||||
|
@ -599,8 +599,8 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4
|
||||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||||
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
|
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
||||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
|
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
|
||||||
|
|
|
@ -69,7 +69,7 @@ func CreateArtifact(ctx context.Context, t *ActionTask, artifactName, artifactPa
|
||||||
OwnerID: t.OwnerID,
|
OwnerID: t.OwnerID,
|
||||||
CommitSHA: t.CommitSHA,
|
CommitSHA: t.CommitSHA,
|
||||||
Status: int64(ArtifactStatusUploadPending),
|
Status: int64(ArtifactStatusUploadPending),
|
||||||
ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + 3600*24*expiredDays),
|
ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + timeutil.Day*expiredDays),
|
||||||
}
|
}
|
||||||
if _, err := db.GetEngine(ctx).Insert(artifact); err != nil {
|
if _, err := db.GetEngine(ctx).Insert(artifact); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -78,6 +78,13 @@ func CreateArtifact(ctx context.Context, t *ActionTask, artifactName, artifactPa
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, err := db.GetEngine(ctx).ID(artifact.ID).Cols("expired_unix").Update(&ActionArtifact{
|
||||||
|
ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + timeutil.Day*expiredDays),
|
||||||
|
}); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return artifact, nil
|
return artifact, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -146,7 +146,11 @@ func (run *ActionRun) GetPushEventPayload() (*api.PushPayload, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (run *ActionRun) GetPullRequestEventPayload() (*api.PullRequestPayload, error) {
|
func (run *ActionRun) GetPullRequestEventPayload() (*api.PullRequestPayload, error) {
|
||||||
if run.Event == webhook_module.HookEventPullRequest || run.Event == webhook_module.HookEventPullRequestSync {
|
if run.Event == webhook_module.HookEventPullRequest ||
|
||||||
|
run.Event == webhook_module.HookEventPullRequestSync ||
|
||||||
|
run.Event == webhook_module.HookEventPullRequestAssign ||
|
||||||
|
run.Event == webhook_module.HookEventPullRequestMilestone ||
|
||||||
|
run.Event == webhook_module.HookEventPullRequestLabel {
|
||||||
var payload api.PullRequestPayload
|
var payload api.PullRequestPayload
|
||||||
if err := json.Unmarshal([]byte(run.EventPayload), &payload); err != nil {
|
if err := json.Unmarshal([]byte(run.EventPayload), &payload); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -118,21 +118,23 @@ func DeleteScheduleTaskByRepo(ctx context.Context, id int64) error {
|
||||||
return committer.Commit()
|
return committer.Commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository) error {
|
func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository, cancelPreviousJobs bool) error {
|
||||||
// If actions disabled when there is schedule task, this will remove the outdated schedule tasks
|
// If actions disabled when there is schedule task, this will remove the outdated schedule tasks
|
||||||
// There is no other place we can do this because the app.ini will be changed manually
|
// There is no other place we can do this because the app.ini will be changed manually
|
||||||
if err := DeleteScheduleTaskByRepo(ctx, repo.ID); err != nil {
|
if err := DeleteScheduleTaskByRepo(ctx, repo.ID); err != nil {
|
||||||
return fmt.Errorf("DeleteCronTaskByRepo: %v", err)
|
return fmt.Errorf("DeleteCronTaskByRepo: %v", err)
|
||||||
}
|
}
|
||||||
// cancel running cron jobs of this repository and delete old schedules
|
if cancelPreviousJobs {
|
||||||
if err := CancelPreviousJobs(
|
// cancel running cron jobs of this repository and delete old schedules
|
||||||
ctx,
|
if err := CancelPreviousJobs(
|
||||||
repo.ID,
|
ctx,
|
||||||
repo.DefaultBranch,
|
repo.ID,
|
||||||
"",
|
repo.DefaultBranch,
|
||||||
webhook_module.HookEventSchedule,
|
"",
|
||||||
); err != nil {
|
webhook_module.HookEventSchedule,
|
||||||
return fmt.Errorf("CancelPreviousJobs: %v", err)
|
); err != nil {
|
||||||
|
return fmt.Errorf("CancelPreviousJobs: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ type ActivityStats struct {
|
||||||
OpenedPRAuthorCount int64
|
OpenedPRAuthorCount int64
|
||||||
MergedPRs issues_model.PullRequestList
|
MergedPRs issues_model.PullRequestList
|
||||||
MergedPRAuthorCount int64
|
MergedPRAuthorCount int64
|
||||||
|
ActiveIssues issues_model.IssueList
|
||||||
OpenedIssues issues_model.IssueList
|
OpenedIssues issues_model.IssueList
|
||||||
OpenedIssueAuthorCount int64
|
OpenedIssueAuthorCount int64
|
||||||
ClosedIssues issues_model.IssueList
|
ClosedIssues issues_model.IssueList
|
||||||
|
@ -172,7 +173,7 @@ func (stats *ActivityStats) MergedPRPerc() int {
|
||||||
|
|
||||||
// ActiveIssueCount returns total active issue count
|
// ActiveIssueCount returns total active issue count
|
||||||
func (stats *ActivityStats) ActiveIssueCount() int {
|
func (stats *ActivityStats) ActiveIssueCount() int {
|
||||||
return stats.OpenedIssueCount() + stats.ClosedIssueCount()
|
return len(stats.ActiveIssues)
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenedIssueCount returns open issue count
|
// OpenedIssueCount returns open issue count
|
||||||
|
@ -285,13 +286,21 @@ func (stats *ActivityStats) FillIssues(ctx context.Context, repoID int64, fromTi
|
||||||
stats.ClosedIssueAuthorCount = count
|
stats.ClosedIssueAuthorCount = count
|
||||||
|
|
||||||
// New issues
|
// New issues
|
||||||
sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false)
|
sess = newlyCreatedIssues(ctx, repoID, fromTime)
|
||||||
sess.OrderBy("issue.created_unix ASC")
|
sess.OrderBy("issue.created_unix ASC")
|
||||||
stats.OpenedIssues = make(issues_model.IssueList, 0)
|
stats.OpenedIssues = make(issues_model.IssueList, 0)
|
||||||
if err = sess.Find(&stats.OpenedIssues); err != nil {
|
if err = sess.Find(&stats.OpenedIssues); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Active issues
|
||||||
|
sess = activeIssues(ctx, repoID, fromTime)
|
||||||
|
sess.OrderBy("issue.created_unix ASC")
|
||||||
|
stats.ActiveIssues = make(issues_model.IssueList, 0)
|
||||||
|
if err = sess.Find(&stats.ActiveIssues); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Opened issue authors
|
// Opened issue authors
|
||||||
sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false)
|
sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false)
|
||||||
if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("issue").Get(&count); err != nil {
|
if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("issue").Get(&count); err != nil {
|
||||||
|
@ -317,6 +326,22 @@ func (stats *ActivityStats) FillUnresolvedIssues(ctx context.Context, repoID int
|
||||||
return sess.Find(&stats.UnresolvedIssues)
|
return sess.Find(&stats.UnresolvedIssues)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newlyCreatedIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session {
|
||||||
|
sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
|
||||||
|
And("issue.is_pull = ?", false). // Retain the is_pull check to exclude pull requests
|
||||||
|
And("issue.created_unix >= ?", fromTime.Unix()) // Include all issues created after fromTime
|
||||||
|
|
||||||
|
return sess
|
||||||
|
}
|
||||||
|
|
||||||
|
func activeIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session {
|
||||||
|
sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
|
||||||
|
And("issue.is_pull = ?", false).
|
||||||
|
And("issue.created_unix >= ? OR issue.closed_unix >= ?", fromTime.Unix(), fromTime.Unix())
|
||||||
|
|
||||||
|
return sess
|
||||||
|
}
|
||||||
|
|
||||||
func issuesForActivityStatement(ctx context.Context, repoID int64, fromTime time.Time, closed, unresolved bool) *xorm.Session {
|
func issuesForActivityStatement(ctx context.Context, repoID int64, fromTime time.Time, closed, unresolved bool) *xorm.Session {
|
||||||
sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
|
sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
|
||||||
And("issue.is_closed = ?", closed)
|
And("issue.is_closed = ?", closed)
|
||||||
|
|
30
models/activities/repo_activity_test.go
Normal file
30
models/activities/repo_activity_test.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package activities
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
|
"code.gitea.io/gitea/models/unittest"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetActivityStats(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
||||||
|
|
||||||
|
stats, err := GetActivityStats(db.DefaultContext, repo, time.Unix(0, 0), true, true, true, true)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.EqualValues(t, 2, stats.ActiveIssueCount())
|
||||||
|
assert.EqualValues(t, 2, stats.OpenedIssueCount())
|
||||||
|
assert.EqualValues(t, 0, stats.ClosedIssueCount())
|
||||||
|
assert.EqualValues(t, 3, stats.ActivePRCount())
|
||||||
|
}
|
|
@ -15,12 +15,31 @@ import (
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type AuthorizationPurpose string
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Used to store long term authorization tokens.
|
||||||
|
LongTermAuthorization AuthorizationPurpose = "long_term_authorization"
|
||||||
|
|
||||||
|
// Used to activate a user account.
|
||||||
|
UserActivation AuthorizationPurpose = "user_activation"
|
||||||
|
|
||||||
|
// Used to reset the password.
|
||||||
|
PasswordReset AuthorizationPurpose = "password_reset"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Used to activate the specified email address for a user.
|
||||||
|
func EmailActivation(email string) AuthorizationPurpose {
|
||||||
|
return AuthorizationPurpose("email_activation:" + email)
|
||||||
|
}
|
||||||
|
|
||||||
// AuthorizationToken represents a authorization token to a user.
|
// AuthorizationToken represents a authorization token to a user.
|
||||||
type AuthorizationToken struct {
|
type AuthorizationToken struct {
|
||||||
ID int64 `xorm:"pk autoincr"`
|
ID int64 `xorm:"pk autoincr"`
|
||||||
UID int64 `xorm:"INDEX"`
|
UID int64 `xorm:"INDEX"`
|
||||||
LookupKey string `xorm:"INDEX UNIQUE"`
|
LookupKey string `xorm:"INDEX UNIQUE"`
|
||||||
HashedValidator string
|
HashedValidator string
|
||||||
|
Purpose AuthorizationPurpose `xorm:"NOT NULL DEFAULT 'long_term_authorization'"`
|
||||||
Expiry timeutil.TimeStamp
|
Expiry timeutil.TimeStamp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +60,7 @@ func (authToken *AuthorizationToken) IsExpired() bool {
|
||||||
// GenerateAuthToken generates a new authentication token for the given user.
|
// GenerateAuthToken generates a new authentication token for the given user.
|
||||||
// It returns the lookup key and validator values that should be passed to the
|
// It returns the lookup key and validator values that should be passed to the
|
||||||
// user via a long-term cookie.
|
// user via a long-term cookie.
|
||||||
func GenerateAuthToken(ctx context.Context, userID int64, expiry timeutil.TimeStamp) (lookupKey, validator string, err error) {
|
func GenerateAuthToken(ctx context.Context, userID int64, expiry timeutil.TimeStamp, purpose AuthorizationPurpose) (lookupKey, validator string, err error) {
|
||||||
// Request 64 random bytes. The first 32 bytes will be used for the lookupKey
|
// Request 64 random bytes. The first 32 bytes will be used for the lookupKey
|
||||||
// and the other 32 bytes will be used for the validator.
|
// and the other 32 bytes will be used for the validator.
|
||||||
rBytes, err := util.CryptoRandomBytes(64)
|
rBytes, err := util.CryptoRandomBytes(64)
|
||||||
|
@ -56,14 +75,15 @@ func GenerateAuthToken(ctx context.Context, userID int64, expiry timeutil.TimeSt
|
||||||
Expiry: expiry,
|
Expiry: expiry,
|
||||||
LookupKey: lookupKey,
|
LookupKey: lookupKey,
|
||||||
HashedValidator: HashValidator(rBytes[32:]),
|
HashedValidator: HashValidator(rBytes[32:]),
|
||||||
|
Purpose: purpose,
|
||||||
})
|
})
|
||||||
return lookupKey, validator, err
|
return lookupKey, validator, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindAuthToken will find a authorization token via the lookup key.
|
// FindAuthToken will find a authorization token via the lookup key.
|
||||||
func FindAuthToken(ctx context.Context, lookupKey string) (*AuthorizationToken, error) {
|
func FindAuthToken(ctx context.Context, lookupKey string, purpose AuthorizationPurpose) (*AuthorizationToken, error) {
|
||||||
var authToken AuthorizationToken
|
var authToken AuthorizationToken
|
||||||
has, err := db.GetEngine(ctx).Where("lookup_key = ?", lookupKey).Get(&authToken)
|
has, err := db.GetEngine(ctx).Where("lookup_key = ? AND purpose = ?", lookupKey, purpose).Get(&authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else if !has {
|
} else if !has {
|
||||||
|
|
|
@ -94,3 +94,22 @@
|
||||||
content: "test markup light/dark-mode-only "
|
content: "test markup light/dark-mode-only "
|
||||||
created_unix: 946684813
|
created_unix: 946684813
|
||||||
updated_unix: 946684813
|
updated_unix: 946684813
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 11
|
||||||
|
type: 22 # review
|
||||||
|
poster_id: 5
|
||||||
|
issue_id: 3 # in repo_id 1
|
||||||
|
content: "reviewed by user5"
|
||||||
|
review_id: 21
|
||||||
|
created_unix: 946684816
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 12
|
||||||
|
type: 27 # review request
|
||||||
|
poster_id: 2
|
||||||
|
issue_id: 3 # in repo_id 1
|
||||||
|
content: "review request for user5"
|
||||||
|
review_id: 22
|
||||||
|
assignee_id: 5
|
||||||
|
created_unix: 946684817
|
||||||
|
|
|
@ -91,6 +91,8 @@
|
||||||
size: 0
|
size: 0
|
||||||
is_fsck_enabled: true
|
is_fsck_enabled: true
|
||||||
close_issues_via_commit_in_any_branch: false
|
close_issues_via_commit_in_any_branch: false
|
||||||
|
created_unix: 1700000001
|
||||||
|
updated_unix: 1700000001
|
||||||
|
|
||||||
-
|
-
|
||||||
id: 4
|
id: 4
|
||||||
|
@ -152,6 +154,8 @@
|
||||||
size: 0
|
size: 0
|
||||||
is_fsck_enabled: true
|
is_fsck_enabled: true
|
||||||
close_issues_via_commit_in_any_branch: false
|
close_issues_via_commit_in_any_branch: false
|
||||||
|
created_unix: 1700000002
|
||||||
|
updated_unix: 1700000002
|
||||||
|
|
||||||
-
|
-
|
||||||
id: 6
|
id: 6
|
||||||
|
@ -182,6 +186,8 @@
|
||||||
size: 0
|
size: 0
|
||||||
is_fsck_enabled: true
|
is_fsck_enabled: true
|
||||||
close_issues_via_commit_in_any_branch: false
|
close_issues_via_commit_in_any_branch: false
|
||||||
|
created_unix: 1710000001
|
||||||
|
updated_unix: 1710000001
|
||||||
|
|
||||||
-
|
-
|
||||||
id: 7
|
id: 7
|
||||||
|
@ -212,6 +218,8 @@
|
||||||
size: 0
|
size: 0
|
||||||
is_fsck_enabled: true
|
is_fsck_enabled: true
|
||||||
close_issues_via_commit_in_any_branch: false
|
close_issues_via_commit_in_any_branch: false
|
||||||
|
created_unix: 1710000003
|
||||||
|
updated_unix: 1710000003
|
||||||
|
|
||||||
-
|
-
|
||||||
id: 8
|
id: 8
|
||||||
|
@ -242,6 +250,8 @@
|
||||||
size: 0
|
size: 0
|
||||||
is_fsck_enabled: true
|
is_fsck_enabled: true
|
||||||
close_issues_via_commit_in_any_branch: false
|
close_issues_via_commit_in_any_branch: false
|
||||||
|
created_unix: 1710000002
|
||||||
|
updated_unix: 1710000002
|
||||||
|
|
||||||
-
|
-
|
||||||
id: 9
|
id: 9
|
||||||
|
@ -968,6 +978,8 @@
|
||||||
size: 0
|
size: 0
|
||||||
is_fsck_enabled: true
|
is_fsck_enabled: true
|
||||||
close_issues_via_commit_in_any_branch: false
|
close_issues_via_commit_in_any_branch: false
|
||||||
|
created_unix: 1700000003
|
||||||
|
updated_unix: 1700000003
|
||||||
|
|
||||||
-
|
-
|
||||||
id: 33
|
id: 33
|
||||||
|
@ -1811,4 +1823,4 @@
|
||||||
template_id: 0
|
template_id: 0
|
||||||
size: 0
|
size: 0
|
||||||
is_fsck_enabled: true
|
is_fsck_enabled: true
|
||||||
close_issues_via_commit_in_any_branch: false
|
close_issues_via_commit_in_any_branch: false
|
||||||
|
|
|
@ -179,3 +179,22 @@
|
||||||
content: "Review Comment"
|
content: "Review Comment"
|
||||||
updated_unix: 946684810
|
updated_unix: 946684810
|
||||||
created_unix: 946684810
|
created_unix: 946684810
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 21
|
||||||
|
type: 2
|
||||||
|
reviewer_id: 5
|
||||||
|
issue_id: 3
|
||||||
|
content: "reviewed by user5"
|
||||||
|
commit_id: 4a357436d925b5c974181ff12a994538ddc5a269
|
||||||
|
updated_unix: 946684816
|
||||||
|
created_unix: 946684816
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 22
|
||||||
|
type: 4
|
||||||
|
reviewer_id: 5
|
||||||
|
issue_id: 3
|
||||||
|
content: "review request for user5"
|
||||||
|
updated_unix: 946684817
|
||||||
|
created_unix: 946684817
|
||||||
|
|
|
@ -111,9 +111,7 @@ func NewIssueLabel(ctx context.Context, issue *Issue, label *Label, doer *user_m
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
issue.isLabelsLoaded = false
|
if err = issue.ReloadLabels(ctx); err != nil {
|
||||||
issue.Labels = nil
|
|
||||||
if err = issue.LoadLabels(ctx); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,10 +159,7 @@ func NewIssueLabels(ctx context.Context, issue *Issue, labels []*Label, doer *us
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// reload all labels
|
if err = issue.ReloadLabels(ctx); err != nil {
|
||||||
issue.isLabelsLoaded = false
|
|
||||||
issue.Labels = nil
|
|
||||||
if err = issue.LoadLabels(ctx); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,8 +200,7 @@ func DeleteIssueLabel(ctx context.Context, issue *Issue, label *Label, doer *use
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
issue.Labels = nil
|
return issue.ReloadLabels(ctx)
|
||||||
return issue.LoadLabels(ctx)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteLabelsByRepoID deletes labels of some repository
|
// DeleteLabelsByRepoID deletes labels of some repository
|
||||||
|
@ -326,14 +320,23 @@ func FixIssueLabelWithOutsideLabels(ctx context.Context) (int64, error) {
|
||||||
return res.RowsAffected()
|
return res.RowsAffected()
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadLabels loads labels
|
// LoadLabels only if they are not already set
|
||||||
func (issue *Issue) LoadLabels(ctx context.Context) (err error) {
|
func (issue *Issue) LoadLabels(ctx context.Context) (err error) {
|
||||||
if !issue.isLabelsLoaded && issue.Labels == nil && issue.ID != 0 {
|
if !issue.isLabelsLoaded && issue.Labels == nil {
|
||||||
|
if err := issue.ReloadLabels(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
issue.isLabelsLoaded = true
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (issue *Issue) ReloadLabels(ctx context.Context) (err error) {
|
||||||
|
if issue.ID != 0 {
|
||||||
issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID)
|
issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("getLabelsByIssueID [%d]: %w", issue.ID, err)
|
return fmt.Errorf("getLabelsByIssueID [%d]: %w", issue.ID, err)
|
||||||
}
|
}
|
||||||
issue.isLabelsLoaded = true
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -496,8 +499,7 @@ func ReplaceIssueLabels(ctx context.Context, issue *Issue, labels []*Label, doer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue.Labels = nil
|
if err = issue.ReloadLabels(ctx); err != nil {
|
||||||
if err = issue.LoadLabels(ctx); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,114 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestIssueNewIssueLabels(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
|
||||||
|
label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
|
||||||
|
label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4})
|
||||||
|
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
|
||||||
|
label3 := &issues_model.Label{RepoID: 1, Name: "label3", Color: "#123"}
|
||||||
|
require.NoError(t, issues_model.NewLabel(db.DefaultContext, label3))
|
||||||
|
|
||||||
|
// label1 is already set, do nothing
|
||||||
|
// label3 is new, add it
|
||||||
|
require.NoError(t, issues_model.NewIssueLabels(db.DefaultContext, issue, []*issues_model.Label{label1, label3}, doer))
|
||||||
|
|
||||||
|
assert.Len(t, issue.Labels, 3)
|
||||||
|
// check that the pre-existing label1 is still present
|
||||||
|
assert.Equal(t, label1.ID, issue.Labels[0].ID)
|
||||||
|
// check that new label3 was added
|
||||||
|
assert.Equal(t, label3.ID, issue.Labels[1].ID)
|
||||||
|
// check that pre-existing label2 was not removed
|
||||||
|
assert.Equal(t, label2.ID, issue.Labels[2].ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIssueNewIssueLabel(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 3})
|
||||||
|
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
|
||||||
|
label := &issues_model.Label{RepoID: 1, Name: "label3", Color: "#123"}
|
||||||
|
require.NoError(t, issues_model.NewLabel(db.DefaultContext, label))
|
||||||
|
|
||||||
|
require.NoError(t, issues_model.NewIssueLabel(db.DefaultContext, issue, label, doer))
|
||||||
|
|
||||||
|
assert.Len(t, issue.Labels, 1)
|
||||||
|
assert.Equal(t, label.ID, issue.Labels[0].ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIssueReplaceIssueLabels(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
|
||||||
|
label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
|
||||||
|
label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4})
|
||||||
|
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
|
||||||
|
label3 := &issues_model.Label{RepoID: 1, Name: "label3", Color: "#123"}
|
||||||
|
require.NoError(t, issues_model.NewLabel(db.DefaultContext, label3))
|
||||||
|
|
||||||
|
issue.LoadLabels(db.DefaultContext)
|
||||||
|
assert.Len(t, issue.Labels, 2)
|
||||||
|
assert.Equal(t, label1.ID, issue.Labels[0].ID)
|
||||||
|
assert.Equal(t, label2.ID, issue.Labels[1].ID)
|
||||||
|
|
||||||
|
// label1 is already set, do nothing
|
||||||
|
// label3 is new, add it
|
||||||
|
// label2 is not in the list but already set, remove it
|
||||||
|
require.NoError(t, issues_model.ReplaceIssueLabels(db.DefaultContext, issue, []*issues_model.Label{label1, label3}, doer))
|
||||||
|
|
||||||
|
assert.Len(t, issue.Labels, 2)
|
||||||
|
assert.Equal(t, label1.ID, issue.Labels[0].ID)
|
||||||
|
assert.Equal(t, label3.ID, issue.Labels[1].ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIssueDeleteIssueLabel(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
|
||||||
|
label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
|
||||||
|
label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4})
|
||||||
|
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
|
||||||
|
issue.LoadLabels(db.DefaultContext)
|
||||||
|
assert.Len(t, issue.Labels, 2)
|
||||||
|
assert.Equal(t, label1.ID, issue.Labels[0].ID)
|
||||||
|
assert.Equal(t, label2.ID, issue.Labels[1].ID)
|
||||||
|
|
||||||
|
require.NoError(t, issues_model.DeleteIssueLabel(db.DefaultContext, issue, label2, doer))
|
||||||
|
|
||||||
|
assert.Len(t, issue.Labels, 1)
|
||||||
|
assert.Equal(t, label1.ID, issue.Labels[0].ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIssueLoadLabels(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
|
||||||
|
label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
|
||||||
|
label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4})
|
||||||
|
|
||||||
|
assert.Empty(t, issue.Labels)
|
||||||
|
issue.LoadLabels(db.DefaultContext)
|
||||||
|
assert.Len(t, issue.Labels, 2)
|
||||||
|
assert.Equal(t, label1.ID, issue.Labels[0].ID)
|
||||||
|
assert.Equal(t, label2.ID, issue.Labels[1].ID)
|
||||||
|
|
||||||
|
unittest.AssertSuccessfulDelete(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label2.ID})
|
||||||
|
|
||||||
|
// the database change is not noticed because the labels are cached
|
||||||
|
issue.LoadLabels(db.DefaultContext)
|
||||||
|
assert.Len(t, issue.Labels, 2)
|
||||||
|
|
||||||
|
issue.ReloadLabels(db.DefaultContext)
|
||||||
|
assert.Len(t, issue.Labels, 1)
|
||||||
|
assert.Equal(t, label1.ID, issue.Labels[0].ID)
|
||||||
|
}
|
||||||
|
|
||||||
func TestNewIssueLabelsScope(t *testing.T) {
|
func TestNewIssueLabelsScope(t *testing.T) {
|
||||||
require.NoError(t, unittest.PrepareTestDatabase())
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
|
|
@ -408,7 +408,7 @@ func (pr *PullRequest) getReviewedByLines(ctx context.Context, writer io.Writer)
|
||||||
|
|
||||||
// Note: This doesn't page as we only expect a very limited number of reviews
|
// Note: This doesn't page as we only expect a very limited number of reviews
|
||||||
reviews, err := FindLatestReviews(ctx, FindReviewOptions{
|
reviews, err := FindLatestReviews(ctx, FindReviewOptions{
|
||||||
Type: ReviewTypeApprove,
|
Types: []ReviewType{ReviewTypeApprove},
|
||||||
IssueID: pr.IssueID,
|
IssueID: pr.IssueID,
|
||||||
OfficialOnly: setting.Repository.PullRequest.DefaultMergeMessageOfficialApproversOnly,
|
OfficialOnly: setting.Repository.PullRequest.DefaultMergeMessageOfficialApproversOnly,
|
||||||
})
|
})
|
||||||
|
|
|
@ -364,7 +364,7 @@ func GetCurrentReview(ctx context.Context, reviewer *user_model.User, issue *Iss
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
reviews, err := FindReviews(ctx, FindReviewOptions{
|
reviews, err := FindReviews(ctx, FindReviewOptions{
|
||||||
Type: ReviewTypePending,
|
Types: []ReviewType{ReviewTypePending},
|
||||||
IssueID: issue.ID,
|
IssueID: issue.ID,
|
||||||
ReviewerID: reviewer.ID,
|
ReviewerID: reviewer.ID,
|
||||||
})
|
})
|
||||||
|
|
|
@ -92,7 +92,7 @@ func (reviews ReviewList) LoadIssues(ctx context.Context) error {
|
||||||
// FindReviewOptions represent possible filters to find reviews
|
// FindReviewOptions represent possible filters to find reviews
|
||||||
type FindReviewOptions struct {
|
type FindReviewOptions struct {
|
||||||
db.ListOptions
|
db.ListOptions
|
||||||
Type ReviewType
|
Types []ReviewType
|
||||||
IssueID int64
|
IssueID int64
|
||||||
ReviewerID int64
|
ReviewerID int64
|
||||||
OfficialOnly bool
|
OfficialOnly bool
|
||||||
|
@ -107,8 +107,8 @@ func (opts *FindReviewOptions) toCond() builder.Cond {
|
||||||
if opts.ReviewerID > 0 {
|
if opts.ReviewerID > 0 {
|
||||||
cond = cond.And(builder.Eq{"reviewer_id": opts.ReviewerID})
|
cond = cond.And(builder.Eq{"reviewer_id": opts.ReviewerID})
|
||||||
}
|
}
|
||||||
if opts.Type != ReviewTypeUnknown {
|
if len(opts.Types) > 0 {
|
||||||
cond = cond.And(builder.Eq{"type": opts.Type})
|
cond = cond.And(builder.In("type", opts.Types))
|
||||||
}
|
}
|
||||||
if opts.OfficialOnly {
|
if opts.OfficialOnly {
|
||||||
cond = cond.And(builder.Eq{"official": true})
|
cond = cond.And(builder.Eq{"official": true})
|
||||||
|
|
|
@ -64,7 +64,7 @@ func TestReviewType_Icon(t *testing.T) {
|
||||||
func TestFindReviews(t *testing.T) {
|
func TestFindReviews(t *testing.T) {
|
||||||
require.NoError(t, unittest.PrepareTestDatabase())
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
reviews, err := issues_model.FindReviews(db.DefaultContext, issues_model.FindReviewOptions{
|
reviews, err := issues_model.FindReviews(db.DefaultContext, issues_model.FindReviewOptions{
|
||||||
Type: issues_model.ReviewTypeApprove,
|
Types: []issues_model.ReviewType{issues_model.ReviewTypeApprove},
|
||||||
IssueID: 2,
|
IssueID: 2,
|
||||||
ReviewerID: 1,
|
ReviewerID: 1,
|
||||||
})
|
})
|
||||||
|
@ -76,7 +76,7 @@ func TestFindReviews(t *testing.T) {
|
||||||
func TestFindLatestReviews(t *testing.T) {
|
func TestFindLatestReviews(t *testing.T) {
|
||||||
require.NoError(t, unittest.PrepareTestDatabase())
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
reviews, err := issues_model.FindLatestReviews(db.DefaultContext, issues_model.FindReviewOptions{
|
reviews, err := issues_model.FindLatestReviews(db.DefaultContext, issues_model.FindReviewOptions{
|
||||||
Type: issues_model.ReviewTypeApprove,
|
Types: []issues_model.ReviewType{issues_model.ReviewTypeApprove},
|
||||||
IssueID: 11,
|
IssueID: 11,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
10
models/organization/TestInconsistentOwnerTeam/team.yml
Normal file
10
models/organization/TestInconsistentOwnerTeam/team.yml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
-
|
||||||
|
id: 1000
|
||||||
|
org_id: 1000
|
||||||
|
lower_name: owners
|
||||||
|
name: Owners
|
||||||
|
authorize: 4 # owner
|
||||||
|
num_repos: 0
|
||||||
|
num_members: 0
|
||||||
|
includes_all_repositories: true
|
||||||
|
can_create_org_repo: true
|
59
models/organization/TestInconsistentOwnerTeam/team_unit.yml
Normal file
59
models/organization/TestInconsistentOwnerTeam/team_unit.yml
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
-
|
||||||
|
id: 1000
|
||||||
|
team_id: 1000
|
||||||
|
type: 1
|
||||||
|
access_mode: 0 # None
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1001
|
||||||
|
team_id: 1000
|
||||||
|
type: 2
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1002
|
||||||
|
team_id: 1000
|
||||||
|
type: 3
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1003
|
||||||
|
team_id: 1000
|
||||||
|
type: 4
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1004
|
||||||
|
team_id: 1000
|
||||||
|
type: 5
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1005
|
||||||
|
team_id: 1000
|
||||||
|
type: 6
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1006
|
||||||
|
team_id: 1000
|
||||||
|
type: 7
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1007
|
||||||
|
team_id: 1000
|
||||||
|
type: 8
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1008
|
||||||
|
team_id: 1000
|
||||||
|
type: 9
|
||||||
|
access_mode: 0
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 1009
|
||||||
|
team_id: 1000
|
||||||
|
type: 10
|
||||||
|
access_mode: 0
|
|
@ -299,8 +299,8 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, expectedRepoIDs, repoIDs)
|
assert.Equal(t, expectedRepoIDs, repoIDs)
|
||||||
}
|
}
|
||||||
testSuccess(2, []int64{3, 5, 32})
|
testSuccess(2, []int64{32, 5, 3})
|
||||||
testSuccess(4, []int64{3, 32})
|
testSuccess(4, []int64{32, 3})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAccessibleReposEnv_Repos(t *testing.T) {
|
func TestAccessibleReposEnv_Repos(t *testing.T) {
|
||||||
|
@ -318,8 +318,8 @@ func TestAccessibleReposEnv_Repos(t *testing.T) {
|
||||||
}
|
}
|
||||||
assert.Equal(t, expectedRepos, repos)
|
assert.Equal(t, expectedRepos, repos)
|
||||||
}
|
}
|
||||||
testSuccess(2, []int64{3, 5, 32})
|
testSuccess(2, []int64{32, 5, 3})
|
||||||
testSuccess(4, []int64{3, 32})
|
testSuccess(4, []int64{32, 3})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
|
func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
|
||||||
|
|
|
@ -268,3 +268,43 @@ func IncrTeamRepoNum(ctx context.Context, teamID int64) error {
|
||||||
_, err := db.GetEngine(ctx).Incr("num_repos").ID(teamID).Update(new(Team))
|
_, err := db.GetEngine(ctx).Incr("num_repos").ID(teamID).Update(new(Team))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CountInconsistentOwnerTeams returns the amount of owner teams that have all of
|
||||||
|
// their access modes set to "None".
|
||||||
|
func CountInconsistentOwnerTeams(ctx context.Context) (int64, error) {
|
||||||
|
return db.GetEngine(ctx).Table("team").
|
||||||
|
Join("INNER", "team_unit", "`team`.id = `team_unit`.team_id").
|
||||||
|
Where("`team`.lower_name = ?", strings.ToLower(OwnerTeamName)).
|
||||||
|
GroupBy("`team_unit`.team_id").
|
||||||
|
Having("SUM(`team_unit`.access_mode) = 0").
|
||||||
|
Count()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FixInconsistentOwnerTeams fixes inconsistent owner teams that have all of
|
||||||
|
// their access modes set to "None", it sets it back to "Owner".
|
||||||
|
func FixInconsistentOwnerTeams(ctx context.Context) (int64, error) {
|
||||||
|
teamIDs := []int64{}
|
||||||
|
if err := db.GetEngine(ctx).Table("team").
|
||||||
|
Select("`team`.id").
|
||||||
|
Join("INNER", "team_unit", "`team`.id = `team_unit`.team_id").
|
||||||
|
Where("`team`.lower_name = ?", strings.ToLower(OwnerTeamName)).
|
||||||
|
GroupBy("`team_unit`.team_id").
|
||||||
|
Having("SUM(`team_unit`.access_mode) = 0").
|
||||||
|
Find(&teamIDs); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := db.Iterate(ctx, builder.In("team_id", teamIDs), func(ctx context.Context, bean *TeamUnit) error {
|
||||||
|
if bean.Type == unit.TypeExternalTracker || bean.Type == unit.TypeExternalWiki {
|
||||||
|
bean.AccessMode = perm.AccessModeRead
|
||||||
|
} else {
|
||||||
|
bean.AccessMode = perm.AccessModeOwner
|
||||||
|
}
|
||||||
|
_, err := db.GetEngine(ctx).ID(bean.ID).Table("team_unit").Cols("access_mode").Update(bean)
|
||||||
|
return err
|
||||||
|
}); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return int64(len(teamIDs)), nil
|
||||||
|
}
|
||||||
|
|
|
@ -4,11 +4,14 @@
|
||||||
package organization_test
|
package organization_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/models/organization"
|
"code.gitea.io/gitea/models/organization"
|
||||||
|
"code.gitea.io/gitea/models/perm"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.gitea.io/gitea/models/unittest"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -198,3 +201,50 @@ func TestUsersInTeamsCount(t *testing.T) {
|
||||||
test([]int64{1, 2, 3, 4, 5}, []int64{2, 5}, 2) // userid 2,4
|
test([]int64{1, 2, 3, 4, 5}, []int64{2, 5}, 2) // userid 2,4
|
||||||
test([]int64{1, 2, 3, 4, 5}, []int64{2, 3, 5}, 3) // userid 2,4,5
|
test([]int64{1, 2, 3, 4, 5}, []int64{2, 3, 5}, 3) // userid 2,4,5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInconsistentOwnerTeam(t *testing.T) {
|
||||||
|
defer unittest.OverrideFixtures(
|
||||||
|
unittest.FixturesOptions{
|
||||||
|
Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"),
|
||||||
|
Base: setting.AppWorkPath,
|
||||||
|
Dirs: []string{"models/organization/TestInconsistentOwnerTeam/"},
|
||||||
|
},
|
||||||
|
)()
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1000, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1001, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1002, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1003, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1004, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1005, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1006, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1007, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1008, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1009, TeamID: 1000, AccessMode: perm.AccessModeNone})
|
||||||
|
|
||||||
|
count, err := organization.CountInconsistentOwnerTeams(db.DefaultContext)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.EqualValues(t, 1, count)
|
||||||
|
|
||||||
|
count, err = organization.FixInconsistentOwnerTeams(db.DefaultContext)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.EqualValues(t, 1, count)
|
||||||
|
|
||||||
|
count, err = organization.CountInconsistentOwnerTeams(db.DefaultContext)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.EqualValues(t, 0, count)
|
||||||
|
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1000, AccessMode: perm.AccessModeOwner})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1001, AccessMode: perm.AccessModeOwner})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1002, AccessMode: perm.AccessModeOwner})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1003, AccessMode: perm.AccessModeOwner})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1004, AccessMode: perm.AccessModeOwner})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1007, AccessMode: perm.AccessModeOwner})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1008, AccessMode: perm.AccessModeOwner})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1009, AccessMode: perm.AccessModeOwner})
|
||||||
|
|
||||||
|
// External wiki and issue
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1005, AccessMode: perm.AccessModeRead})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1006, AccessMode: perm.AccessModeRead})
|
||||||
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/models/packages"
|
"code.gitea.io/gitea/models/packages"
|
||||||
debian_module "code.gitea.io/gitea/modules/packages/debian"
|
debian_module "code.gitea.io/gitea/modules/packages/debian"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
|
||||||
"xorm.io/builder"
|
"xorm.io/builder"
|
||||||
)
|
)
|
||||||
|
@ -76,25 +77,41 @@ func ExistPackages(ctx context.Context, opts *PackageSearchOptions) (bool, error
|
||||||
|
|
||||||
// SearchPackages gets the packages matching the search options
|
// SearchPackages gets the packages matching the search options
|
||||||
func SearchPackages(ctx context.Context, opts *PackageSearchOptions, iter func(*packages.PackageFileDescriptor)) error {
|
func SearchPackages(ctx context.Context, opts *PackageSearchOptions, iter func(*packages.PackageFileDescriptor)) error {
|
||||||
return db.GetEngine(ctx).
|
var start int
|
||||||
Table("package_file").
|
batchSize := setting.Database.IterateBufferSize
|
||||||
Select("package_file.*").
|
for {
|
||||||
Join("INNER", "package_version", "package_version.id = package_file.version_id").
|
select {
|
||||||
Join("INNER", "package", "package.id = package_version.package_id").
|
case <-ctx.Done():
|
||||||
Where(opts.toCond()).
|
return ctx.Err()
|
||||||
Asc("package.lower_name", "package_version.created_unix").
|
default:
|
||||||
Iterate(new(packages.PackageFile), func(_ int, bean any) error {
|
beans := make([]*packages.PackageFile, 0, batchSize)
|
||||||
pf := bean.(*packages.PackageFile)
|
|
||||||
|
|
||||||
pfd, err := packages.GetPackageFileDescriptor(ctx, pf)
|
if err := db.GetEngine(ctx).
|
||||||
if err != nil {
|
Table("package_file").
|
||||||
|
Select("package_file.*").
|
||||||
|
Join("INNER", "package_version", "package_version.id = package_file.version_id").
|
||||||
|
Join("INNER", "package", "package.id = package_version.package_id").
|
||||||
|
Where(opts.toCond()).
|
||||||
|
Asc("package.lower_name", "package_version.created_unix").
|
||||||
|
Limit(batchSize, start).
|
||||||
|
Find(&beans); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if len(beans) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
start += len(beans)
|
||||||
|
|
||||||
iter(pfd)
|
for _, bean := range beans {
|
||||||
|
pfd, err := packages.GetPackageFileDescriptor(ctx, bean)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
iter(pfd)
|
||||||
})
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDistributions gets all available distributions
|
// GetDistributions gets all available distributions
|
||||||
|
|
93
models/packages/debian/search_test.go
Normal file
93
models/packages/debian/search_test.go
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
package debian
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
|
packages_model "code.gitea.io/gitea/models/packages"
|
||||||
|
"code.gitea.io/gitea/models/unittest"
|
||||||
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
|
"code.gitea.io/gitea/modules/packages"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/modules/test"
|
||||||
|
packages_service "code.gitea.io/gitea/services/packages"
|
||||||
|
|
||||||
|
_ "code.gitea.io/gitea/models"
|
||||||
|
_ "code.gitea.io/gitea/models/actions"
|
||||||
|
_ "code.gitea.io/gitea/models/activities"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
unittest.MainTest(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func preparePackage(t *testing.T, owner *user_model.User, name string) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
data, err := packages.CreateHashedBufferFromReader(strings.NewReader("data"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, _, err = packages_service.CreatePackageOrAddFileToExisting(
|
||||||
|
db.DefaultContext,
|
||||||
|
&packages_service.PackageCreationInfo{
|
||||||
|
PackageInfo: packages_service.PackageInfo{
|
||||||
|
Owner: owner,
|
||||||
|
PackageType: packages_model.TypeDebian,
|
||||||
|
Name: name,
|
||||||
|
},
|
||||||
|
Creator: owner,
|
||||||
|
},
|
||||||
|
&packages_service.PackageFileCreationInfo{
|
||||||
|
PackageFileInfo: packages_service.PackageFileInfo{
|
||||||
|
Filename: name,
|
||||||
|
},
|
||||||
|
Data: data,
|
||||||
|
Creator: owner,
|
||||||
|
IsLead: true,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSearchPackages(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
defer test.MockVariableValue(&setting.Database.IterateBufferSize, 1)()
|
||||||
|
|
||||||
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
|
||||||
|
|
||||||
|
preparePackage(t, user2, "debian-1")
|
||||||
|
preparePackage(t, user2, "debian-2")
|
||||||
|
preparePackage(t, user3, "debian-1")
|
||||||
|
|
||||||
|
packageFiles := []string{}
|
||||||
|
require.NoError(t, SearchPackages(db.DefaultContext, &PackageSearchOptions{
|
||||||
|
OwnerID: user2.ID,
|
||||||
|
}, func(pfd *packages_model.PackageFileDescriptor) {
|
||||||
|
assert.NotNil(t, pfd)
|
||||||
|
packageFiles = append(packageFiles, pfd.File.Name)
|
||||||
|
}))
|
||||||
|
|
||||||
|
assert.Len(t, packageFiles, 2)
|
||||||
|
assert.Contains(t, packageFiles, "debian-1")
|
||||||
|
assert.Contains(t, packageFiles, "debian-2")
|
||||||
|
|
||||||
|
packageFiles = []string{}
|
||||||
|
require.NoError(t, SearchPackages(db.DefaultContext, &PackageSearchOptions{
|
||||||
|
OwnerID: user3.ID,
|
||||||
|
}, func(pfd *packages_model.PackageFileDescriptor) {
|
||||||
|
assert.NotNil(t, pfd)
|
||||||
|
packageFiles = append(packageFiles, pfd.File.Name)
|
||||||
|
}))
|
||||||
|
|
||||||
|
assert.Len(t, packageFiles, 1)
|
||||||
|
assert.Contains(t, packageFiles, "debian-1")
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
-
|
||||||
|
id: 1001
|
||||||
|
owner_id: 33
|
||||||
|
owner_name: user33
|
||||||
|
lower_name: repo1001
|
||||||
|
name: repo1001
|
||||||
|
default_branch: main
|
||||||
|
num_watches: 0
|
||||||
|
num_stars: 0
|
||||||
|
num_forks: 0
|
||||||
|
num_issues: 0
|
||||||
|
num_closed_issues: 0
|
||||||
|
num_pulls: 0
|
||||||
|
num_closed_pulls: 0
|
||||||
|
num_milestones: 0
|
||||||
|
num_closed_milestones: 0
|
||||||
|
num_projects: 0
|
||||||
|
num_closed_projects: 0
|
||||||
|
is_private: false
|
||||||
|
is_empty: false
|
||||||
|
is_archived: false
|
||||||
|
is_mirror: false
|
||||||
|
status: 0
|
||||||
|
is_fork: false
|
||||||
|
fork_id: 0
|
||||||
|
is_template: false
|
||||||
|
template_id: 0
|
||||||
|
size: 0
|
||||||
|
is_fsck_enabled: true
|
||||||
|
close_issues_via_commit_in_any_branch: false
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
|
"code.gitea.io/gitea/models/unit"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
|
|
||||||
"xorm.io/builder"
|
"xorm.io/builder"
|
||||||
|
@ -54,9 +55,9 @@ func GetUserFork(ctx context.Context, repoID, userID int64) (*Repository, error)
|
||||||
return &forkedRepo, nil
|
return &forkedRepo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetForks returns all the forks of the repository
|
// GetForks returns all the forks of the repository that are visible to the user.
|
||||||
func GetForks(ctx context.Context, repo *Repository, listOptions db.ListOptions) ([]*Repository, error) {
|
func GetForks(ctx context.Context, repo *Repository, user *user_model.User, listOptions db.ListOptions) ([]*Repository, int64, error) {
|
||||||
sess := db.GetEngine(ctx)
|
sess := db.GetEngine(ctx).Where(AccessibleRepositoryCondition(user, unit.TypeInvalid))
|
||||||
|
|
||||||
var forks []*Repository
|
var forks []*Repository
|
||||||
if listOptions.Page == 0 {
|
if listOptions.Page == 0 {
|
||||||
|
@ -66,7 +67,8 @@ func GetForks(ctx context.Context, repo *Repository, listOptions db.ListOptions)
|
||||||
sess = db.SetSessionPagination(sess, &listOptions)
|
sess = db.SetSessionPagination(sess, &listOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
return forks, sess.Find(&forks, &Repository{ForkID: repo.ID})
|
count, err := sess.FindAndCount(&forks, &Repository{ForkID: repo.ID})
|
||||||
|
return forks, count, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// IncrementRepoForkNum increment repository fork number
|
// IncrementRepoForkNum increment repository fork number
|
||||||
|
|
|
@ -641,12 +641,9 @@ func AccessibleRepositoryCondition(user *user_model.User, unitType unit.Type) bu
|
||||||
// 1. Be able to see all non-private repositories that either:
|
// 1. Be able to see all non-private repositories that either:
|
||||||
cond = cond.Or(builder.And(
|
cond = cond.Or(builder.And(
|
||||||
builder.Eq{"`repository`.is_private": false},
|
builder.Eq{"`repository`.is_private": false},
|
||||||
// 2. Aren't in an private organisation or limited organisation if we're not logged in
|
// 2. Aren't in an private organisation/user or limited organisation/user if the doer is not logged in.
|
||||||
builder.NotIn("`repository`.owner_id", builder.Select("id").From("`user`").Where(
|
builder.NotIn("`repository`.owner_id", builder.Select("id").From("`user`").Where(
|
||||||
builder.And(
|
builder.In("visibility", orgVisibilityLimit)))))
|
||||||
builder.Eq{"type": user_model.UserTypeOrganization},
|
|
||||||
builder.In("visibility", orgVisibilityLimit)),
|
|
||||||
))))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if user != nil {
|
if user != nil {
|
||||||
|
|
|
@ -4,13 +4,18 @@
|
||||||
package repo_test
|
package repo_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.gitea.io/gitea/models/unittest"
|
||||||
|
"code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/optional"
|
"code.gitea.io/gitea/modules/optional"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/modules/structs"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -403,3 +408,43 @@ func TestSearchRepositoryByTopicName(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSearchRepositoryIDsByCondition(t *testing.T) {
|
||||||
|
defer unittest.OverrideFixtures(
|
||||||
|
unittest.FixturesOptions{
|
||||||
|
Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"),
|
||||||
|
Base: setting.AppWorkPath,
|
||||||
|
Dirs: []string{"models/repo/TestSearchRepositoryIDsByCondition/"},
|
||||||
|
},
|
||||||
|
)()
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
// Sanity check of the database
|
||||||
|
limitedUser := unittest.AssertExistsAndLoadBean(t, &user.User{ID: 33, Visibility: structs.VisibleTypeLimited})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1001, OwnerID: limitedUser.ID})
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
user *user.User
|
||||||
|
repoIDs []int64
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
user: nil,
|
||||||
|
repoIDs: []int64{1, 4, 8, 9, 10, 11, 12, 14, 17, 18, 21, 23, 25, 27, 29, 32, 33, 34, 35, 36, 37, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 57, 58, 60, 61, 62, 1059},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
user: unittest.AssertExistsAndLoadBean(t, &user.User{ID: 4}),
|
||||||
|
repoIDs: []int64{1, 3, 4, 8, 9, 10, 11, 12, 14, 17, 18, 21, 23, 25, 27, 29, 32, 33, 34, 35, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 57, 58, 60, 61, 62, 1001, 1059},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
user: unittest.AssertExistsAndLoadBean(t, &user.User{ID: 5}),
|
||||||
|
repoIDs: []int64{1, 4, 8, 9, 10, 11, 12, 14, 17, 18, 21, 23, 25, 27, 29, 32, 33, 34, 35, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 57, 58, 60, 61, 62, 1001, 1059},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, testCase := range testCases {
|
||||||
|
repoIDs, err := repo_model.FindUserCodeAccessibleRepoIDs(db.DefaultContext, testCase.user)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
slices.Sort(repoIDs)
|
||||||
|
assert.EqualValues(t, testCase.repoIDs, repoIDs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ var OrderByMap = map[string]map[string]db.SearchOrderBy{
|
||||||
var OrderByFlatMap = map[string]db.SearchOrderBy{
|
var OrderByFlatMap = map[string]db.SearchOrderBy{
|
||||||
"newest": OrderByMap["desc"]["created"],
|
"newest": OrderByMap["desc"]["created"],
|
||||||
"oldest": OrderByMap["asc"]["created"],
|
"oldest": OrderByMap["asc"]["created"],
|
||||||
|
"recentupdate": OrderByMap["desc"]["updated"],
|
||||||
"leastupdate": OrderByMap["asc"]["updated"],
|
"leastupdate": OrderByMap["asc"]["updated"],
|
||||||
"reversealphabetically": OrderByMap["desc"]["alpha"],
|
"reversealphabetically": OrderByMap["desc"]["alpha"],
|
||||||
"alphabetically": OrderByMap["asc"]["alpha"],
|
"alphabetically": OrderByMap["asc"]["alpha"],
|
||||||
|
|
|
@ -10,10 +10,8 @@ import (
|
||||||
"net/mail"
|
"net/mail"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/modules/base"
|
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/optional"
|
"code.gitea.io/gitea/modules/optional"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
@ -307,23 +305,6 @@ func updateActivation(ctx context.Context, email *EmailAddress, activate bool) e
|
||||||
return UpdateUserCols(ctx, user, "rands")
|
return UpdateUserCols(ctx, user, "rands")
|
||||||
}
|
}
|
||||||
|
|
||||||
// VerifyActiveEmailCode verifies active email code when active account
|
|
||||||
func VerifyActiveEmailCode(ctx context.Context, code, email string) *EmailAddress {
|
|
||||||
if user := GetVerifyUser(ctx, code); user != nil {
|
|
||||||
// time limit code
|
|
||||||
prefix := code[:base.TimeLimitCodeLength]
|
|
||||||
data := fmt.Sprintf("%d%s%s%s%s", user.ID, email, user.LowerName, user.Passwd, user.Rands)
|
|
||||||
|
|
||||||
if base.VerifyTimeLimitCode(time.Now(), data, setting.Service.ActiveCodeLives, prefix) {
|
|
||||||
emailAddress := &EmailAddress{UID: user.ID, Email: email}
|
|
||||||
if has, _ := db.GetEngine(ctx).Get(emailAddress); has {
|
|
||||||
return emailAddress
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SearchEmailOrderBy is used to sort the results from SearchEmails()
|
// SearchEmailOrderBy is used to sort the results from SearchEmails()
|
||||||
type SearchEmailOrderBy string
|
type SearchEmailOrderBy string
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,9 @@ package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/subtle"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/mail"
|
"net/mail"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -318,15 +320,14 @@ func (u *User) OrganisationLink() string {
|
||||||
return setting.AppSubURL + "/org/" + url.PathEscape(u.Name)
|
return setting.AppSubURL + "/org/" + url.PathEscape(u.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateEmailActivateCode generates an activate code based on user information and given e-mail.
|
// GenerateEmailAuthorizationCode generates an activation code based for the user for the specified purpose.
|
||||||
func (u *User) GenerateEmailActivateCode(email string) string {
|
// The standard expiry is ActiveCodeLives minutes.
|
||||||
code := base.CreateTimeLimitCode(
|
func (u *User) GenerateEmailAuthorizationCode(ctx context.Context, purpose auth.AuthorizationPurpose) (string, error) {
|
||||||
fmt.Sprintf("%d%s%s%s%s", u.ID, email, u.LowerName, u.Passwd, u.Rands),
|
lookup, validator, err := auth.GenerateAuthToken(ctx, u.ID, timeutil.TimeStampNow().Add(int64(setting.Service.ActiveCodeLives)*60), purpose)
|
||||||
setting.Service.ActiveCodeLives, time.Now(), nil)
|
if err != nil {
|
||||||
|
return "", err
|
||||||
// Add tail hex username
|
}
|
||||||
code += hex.EncodeToString([]byte(u.LowerName))
|
return lookup + ":" + validator, nil
|
||||||
return code
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUserFollowers returns range of user's followers.
|
// GetUserFollowers returns range of user's followers.
|
||||||
|
@ -421,6 +422,10 @@ func (u *User) IsIndividual() bool {
|
||||||
return u.Type == UserTypeIndividual
|
return u.Type == UserTypeIndividual
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *User) IsUser() bool {
|
||||||
|
return u.Type == UserTypeIndividual || u.Type == UserTypeBot
|
||||||
|
}
|
||||||
|
|
||||||
// IsBot returns whether or not the user is of type bot
|
// IsBot returns whether or not the user is of type bot
|
||||||
func (u *User) IsBot() bool {
|
func (u *User) IsBot() bool {
|
||||||
return u.Type == UserTypeBot
|
return u.Type == UserTypeBot
|
||||||
|
@ -832,35 +837,50 @@ func countUsers(ctx context.Context, opts *CountUserFilter) int64 {
|
||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetVerifyUser get user by verify code
|
// VerifyUserActiveCode verifies that the code is valid for the given purpose for this user.
|
||||||
func GetVerifyUser(ctx context.Context, code string) (user *User) {
|
// If delete is specified, the token will be deleted.
|
||||||
if len(code) <= base.TimeLimitCodeLength {
|
func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose, delete bool) (*User, error) {
|
||||||
return nil
|
lookupKey, validator, found := strings.Cut(code, ":")
|
||||||
|
if !found {
|
||||||
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// use tail hex username query user
|
authToken, err := auth.FindAuthToken(ctx, lookupKey, purpose)
|
||||||
hexStr := code[base.TimeLimitCodeLength:]
|
if err != nil {
|
||||||
if b, err := hex.DecodeString(hexStr); err == nil {
|
if errors.Is(err, util.ErrNotExist) {
|
||||||
if user, err = GetUserByName(ctx, string(b)); user != nil {
|
return nil, nil
|
||||||
return user
|
|
||||||
}
|
}
|
||||||
log.Error("user.getVerifyUser: %v", err)
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
if authToken.IsExpired() {
|
||||||
}
|
return nil, auth.DeleteAuthToken(ctx, authToken)
|
||||||
|
}
|
||||||
|
|
||||||
// VerifyUserActiveCode verifies active code when active account
|
rawValidator, err := hex.DecodeString(validator)
|
||||||
func VerifyUserActiveCode(ctx context.Context, code string) (user *User) {
|
if err != nil {
|
||||||
if user = GetVerifyUser(ctx, code); user != nil {
|
return nil, err
|
||||||
// time limit code
|
}
|
||||||
prefix := code[:base.TimeLimitCodeLength]
|
|
||||||
data := fmt.Sprintf("%d%s%s%s%s", user.ID, user.Email, user.LowerName, user.Passwd, user.Rands)
|
if subtle.ConstantTimeCompare([]byte(authToken.HashedValidator), []byte(auth.HashValidator(rawValidator))) == 0 {
|
||||||
if base.VerifyTimeLimitCode(time.Now(), data, setting.Service.ActiveCodeLives, prefix) {
|
return nil, errors.New("validator doesn't match")
|
||||||
return user
|
}
|
||||||
|
|
||||||
|
u, err := GetUserByID(ctx, authToken.UID)
|
||||||
|
if err != nil {
|
||||||
|
if IsErrUserNotExist(err) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if delete {
|
||||||
|
if err := auth.DeleteAuthToken(ctx, authToken); err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
return u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateUser check if user is valid to insert / update into database
|
// ValidateUser check if user is valid to insert / update into database
|
||||||
|
|
|
@ -7,6 +7,7 @@ package user_test
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -21,7 +22,9 @@ import (
|
||||||
"code.gitea.io/gitea/modules/optional"
|
"code.gitea.io/gitea/modules/optional"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/structs"
|
"code.gitea.io/gitea/modules/structs"
|
||||||
|
"code.gitea.io/gitea/modules/test"
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
"code.gitea.io/gitea/tests"
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -699,3 +702,66 @@ func TestDisabledUserFeatures(t *testing.T) {
|
||||||
assert.True(t, user_model.IsFeatureDisabledWithLoginType(user, f))
|
assert.True(t, user_model.IsFeatureDisabledWithLoginType(user, f))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGenerateEmailAuthorizationCode(t *testing.T) {
|
||||||
|
defer test.MockVariableValue(&setting.Service.ActiveCodeLives, 2)()
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
|
||||||
|
code, err := user.GenerateEmailAuthorizationCode(db.DefaultContext, auth.UserActivation)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
lookupKey, validator, ok := strings.Cut(code, ":")
|
||||||
|
assert.True(t, ok)
|
||||||
|
|
||||||
|
rawValidator, err := hex.DecodeString(validator)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.False(t, authToken.IsExpired())
|
||||||
|
assert.EqualValues(t, authToken.HashedValidator, auth.HashValidator(rawValidator))
|
||||||
|
|
||||||
|
authToken.Expiry = authToken.Expiry.Add(-int64(setting.Service.ActiveCodeLives) * 60)
|
||||||
|
assert.True(t, authToken.IsExpired())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVerifyUserAuthorizationToken(t *testing.T) {
|
||||||
|
defer test.MockVariableValue(&setting.Service.ActiveCodeLives, 2)()
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
|
||||||
|
code, err := user.GenerateEmailAuthorizationCode(db.DefaultContext, auth.UserActivation)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
lookupKey, _, ok := strings.Cut(code, ":")
|
||||||
|
assert.True(t, ok)
|
||||||
|
|
||||||
|
t.Run("Wrong purpose", func(t *testing.T) {
|
||||||
|
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset, false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Nil(t, u)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("No delete", func(t *testing.T) {
|
||||||
|
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.EqualValues(t, user.ID, u.ID)
|
||||||
|
|
||||||
|
authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.NotNil(t, authToken)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Delete", func(t *testing.T) {
|
||||||
|
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, true)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.EqualValues(t, user.ID, u.ID)
|
||||||
|
|
||||||
|
authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation)
|
||||||
|
require.ErrorIs(t, err, util.ErrNotExist)
|
||||||
|
assert.Nil(t, authToken)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -18,8 +18,32 @@ func FullSteps(task *actions_model.ActionTask) []*actions_model.ActionTaskStep {
|
||||||
return fullStepsOfEmptySteps(task)
|
return fullStepsOfEmptySteps(task)
|
||||||
}
|
}
|
||||||
|
|
||||||
firstStep := task.Steps[0]
|
// firstStep is the first step that has run or running, not include preStep.
|
||||||
|
// For example,
|
||||||
|
// 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): firstStep is step1.
|
||||||
|
// 2. preStep(Success) -> step1(Skipped) -> step2(Success) -> postStep(Success): firstStep is step2.
|
||||||
|
// 3. preStep(Success) -> step1(Running) -> step2(Waiting) -> postStep(Waiting): firstStep is step1.
|
||||||
|
// 4. preStep(Success) -> step1(Skipped) -> step2(Skipped) -> postStep(Skipped): firstStep is nil.
|
||||||
|
// 5. preStep(Success) -> step1(Cancelled) -> step2(Cancelled) -> postStep(Cancelled): firstStep is nil.
|
||||||
|
var firstStep *actions_model.ActionTaskStep
|
||||||
|
// lastHasRunStep is the last step that has run.
|
||||||
|
// For example,
|
||||||
|
// 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): lastHasRunStep is step1.
|
||||||
|
// 2. preStep(Success) -> step1(Success) -> step2(Success) -> step3(Success) -> postStep(Success): lastHasRunStep is step3.
|
||||||
|
// 3. preStep(Success) -> step1(Success) -> step2(Failure) -> step3 -> postStep(Waiting): lastHasRunStep is step2.
|
||||||
|
// So its Stopped is the Started of postStep when there are no more steps to run.
|
||||||
|
var lastHasRunStep *actions_model.ActionTaskStep
|
||||||
|
|
||||||
var logIndex int64
|
var logIndex int64
|
||||||
|
for _, step := range task.Steps {
|
||||||
|
if firstStep == nil && (step.Status.HasRun() || step.Status.IsRunning()) {
|
||||||
|
firstStep = step
|
||||||
|
}
|
||||||
|
if step.Status.HasRun() {
|
||||||
|
lastHasRunStep = step
|
||||||
|
}
|
||||||
|
logIndex += step.LogLength
|
||||||
|
}
|
||||||
|
|
||||||
preStep := &actions_model.ActionTaskStep{
|
preStep := &actions_model.ActionTaskStep{
|
||||||
Name: preStepName,
|
Name: preStepName,
|
||||||
|
@ -28,32 +52,17 @@ func FullSteps(task *actions_model.ActionTask) []*actions_model.ActionTaskStep {
|
||||||
Status: actions_model.StatusRunning,
|
Status: actions_model.StatusRunning,
|
||||||
}
|
}
|
||||||
|
|
||||||
if firstStep.Status.HasRun() || firstStep.Status.IsRunning() {
|
// No step has run or is running, so preStep is equal to the task
|
||||||
|
if firstStep == nil {
|
||||||
|
preStep.Stopped = task.Stopped
|
||||||
|
preStep.Status = task.Status
|
||||||
|
} else {
|
||||||
preStep.LogLength = firstStep.LogIndex
|
preStep.LogLength = firstStep.LogIndex
|
||||||
preStep.Stopped = firstStep.Started
|
preStep.Stopped = firstStep.Started
|
||||||
preStep.Status = actions_model.StatusSuccess
|
preStep.Status = actions_model.StatusSuccess
|
||||||
} else if task.Status.IsDone() {
|
|
||||||
preStep.Stopped = task.Stopped
|
|
||||||
preStep.Status = actions_model.StatusFailure
|
|
||||||
if task.Status.IsSkipped() {
|
|
||||||
preStep.Status = actions_model.StatusSkipped
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
logIndex += preStep.LogLength
|
logIndex += preStep.LogLength
|
||||||
|
|
||||||
// lastHasRunStep is the last step that has run.
|
|
||||||
// For example,
|
|
||||||
// 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): lastHasRunStep is step1.
|
|
||||||
// 2. preStep(Success) -> step1(Success) -> step2(Success) -> step3(Success) -> postStep(Success): lastHasRunStep is step3.
|
|
||||||
// 3. preStep(Success) -> step1(Success) -> step2(Failure) -> step3 -> postStep(Waiting): lastHasRunStep is step2.
|
|
||||||
// So its Stopped is the Started of postStep when there are no more steps to run.
|
|
||||||
var lastHasRunStep *actions_model.ActionTaskStep
|
|
||||||
for _, step := range task.Steps {
|
|
||||||
if step.Status.HasRun() {
|
|
||||||
lastHasRunStep = step
|
|
||||||
}
|
|
||||||
logIndex += step.LogLength
|
|
||||||
}
|
|
||||||
if lastHasRunStep == nil {
|
if lastHasRunStep == nil {
|
||||||
lastHasRunStep = preStep
|
lastHasRunStep = preStep
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,6 +137,25 @@ func TestFullSteps(t *testing.T) {
|
||||||
{Name: postStepName, Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0},
|
{Name: postStepName, Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "first step is skipped",
|
||||||
|
task: &actions_model.ActionTask{
|
||||||
|
Steps: []*actions_model.ActionTaskStep{
|
||||||
|
{Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0},
|
||||||
|
{Status: actions_model.StatusSuccess, LogIndex: 10, LogLength: 80, Started: 10010, Stopped: 10090},
|
||||||
|
},
|
||||||
|
Status: actions_model.StatusSuccess,
|
||||||
|
Started: 10000,
|
||||||
|
Stopped: 10100,
|
||||||
|
LogLength: 100,
|
||||||
|
},
|
||||||
|
want: []*actions_model.ActionTaskStep{
|
||||||
|
{Name: preStepName, Status: actions_model.StatusSuccess, LogIndex: 0, LogLength: 10, Started: 10000, Stopped: 10010},
|
||||||
|
{Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0},
|
||||||
|
{Status: actions_model.StatusSuccess, LogIndex: 10, LogLength: 80, Started: 10010, Stopped: 10090},
|
||||||
|
{Name: postStepName, Status: actions_model.StatusSuccess, LogIndex: 90, LogLength: 10, Started: 10090, Stopped: 10100},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
|
137
modules/annex/annex.go
Normal file
137
modules/annex/annex.go
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
// Copyright 2022 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
// Unlike modules/lfs, which operates mainly on git.Blobs, this operates on git.TreeEntrys.
|
||||||
|
// The motivation for this is that TreeEntrys have an easy pointer to the on-disk repo path,
|
||||||
|
// while blobs do not (in fact, if building with TAGS=gogit, blobs might exist only in a mock
|
||||||
|
// filesystem, living only in process RAM). We must have the on-disk path to do anything
|
||||||
|
// useful with git-annex because all of its interesting data is on-disk under .git/annex/.
|
||||||
|
|
||||||
|
package annex
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/git"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrBlobIsNotAnnexed occurs if a blob does not contain a valid annex key
|
||||||
|
var ErrBlobIsNotAnnexed = errors.New("not a git-annex pointer")
|
||||||
|
|
||||||
|
func LookupKey(blob *git.Blob) (string, error) {
|
||||||
|
stdout, _, err := git.NewCommand(git.DefaultContext, "annex", "lookupkey", "--ref").AddDynamicArguments(blob.ID.String()).RunStdString(&git.RunOpts{Dir: blob.Repo().Path})
|
||||||
|
if err != nil {
|
||||||
|
return "", ErrBlobIsNotAnnexed
|
||||||
|
}
|
||||||
|
key := strings.TrimSpace(stdout)
|
||||||
|
return key, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ContentLocationFromKey(repoPath, key string) (string, error) {
|
||||||
|
contentLocation, _, err := git.NewCommandContextNoGlobals(git.DefaultContext, "annex", "contentlocation").AddDynamicArguments(key).RunStdString(&git.RunOpts{Dir: repoPath})
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("in %s: %s does not seem to be a valid annexed file: %w", repoPath, key, err)
|
||||||
|
}
|
||||||
|
contentLocation = strings.TrimSpace(contentLocation)
|
||||||
|
contentLocation = path.Clean("/" + contentLocation)[1:] // prevent directory traversals
|
||||||
|
contentLocation = path.Join(repoPath, contentLocation)
|
||||||
|
|
||||||
|
return contentLocation, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the absolute path of the content pointed to by the annex pointer stored in the git object
|
||||||
|
// errors if the content is not found in this repo
|
||||||
|
func ContentLocation(blob *git.Blob) (string, error) {
|
||||||
|
key, err := LookupKey(blob)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return ContentLocationFromKey(blob.Repo().Path, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns a stream open to the annex content
|
||||||
|
func Content(blob *git.Blob) (*os.File, error) {
|
||||||
|
contentLocation, err := ContentLocation(blob)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.Open(contentLocation)
|
||||||
|
}
|
||||||
|
|
||||||
|
// whether the object appears to be a valid annex pointer
|
||||||
|
// does *not* verify if the content is actually in this repo;
|
||||||
|
// for that, use ContentLocation()
|
||||||
|
func IsAnnexed(blob *git.Blob) (bool, error) {
|
||||||
|
if !setting.Annex.Enabled {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LookupKey is written to only return well-formed keys
|
||||||
|
// so the test is just to see if it errors
|
||||||
|
_, err := LookupKey(blob)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, ErrBlobIsNotAnnexed) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsAnnexRepo determines if repo is a git-annex enabled repository
|
||||||
|
func IsAnnexRepo(repo *git.Repository) bool {
|
||||||
|
_, _, err := git.NewCommand(repo.Ctx, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repo.Path})
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var repoConfigFileRe = regexp.MustCompile("[^/]+/[^/]+.git/config$")
|
||||||
|
|
||||||
|
var (
|
||||||
|
uuid2repoPathCache = make(map[string]string)
|
||||||
|
repoPath2uuidCache = make(map[string]string)
|
||||||
|
)
|
||||||
|
|
||||||
|
func updateUUID2RepoPathCache() error {
|
||||||
|
return filepath.WalkDir(setting.RepoRootPath, func(path string, d fs.DirEntry, err error) error {
|
||||||
|
if err == nil && repoConfigFileRe.MatchString(path) {
|
||||||
|
thisRepoPath := strings.TrimSuffix(path, "/config")
|
||||||
|
_, ok := repoPath2uuidCache[thisRepoPath]
|
||||||
|
if ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: thisRepoPath})
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
repoUUID := strings.TrimSpace(stdout)
|
||||||
|
if repoUUID != "" {
|
||||||
|
uuid2repoPathCache[repoUUID] = thisRepoPath
|
||||||
|
repoPath2uuidCache[thisRepoPath] = repoUUID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func UUID2RepoPath(uuid string) (string, error) {
|
||||||
|
if repoPath, ok := uuid2repoPathCache[uuid]; ok {
|
||||||
|
return repoPath, nil
|
||||||
|
}
|
||||||
|
// If the cache didn't contain an entry for the UUID then update the cache and try again
|
||||||
|
if err := updateUUID2RepoPathCache(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if repoPath, ok := uuid2repoPathCache[uuid]; ok {
|
||||||
|
return repoPath, nil
|
||||||
|
}
|
||||||
|
return "", fmt.Errorf("no repository known for UUID '%s'", uuid)
|
||||||
|
}
|
|
@ -4,26 +4,21 @@
|
||||||
package base
|
package base
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/hmac"
|
|
||||||
"crypto/sha1"
|
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"crypto/subtle"
|
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"hash"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/annex"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
|
||||||
|
|
||||||
"github.com/dustin/go-humanize"
|
"github.com/dustin/go-humanize"
|
||||||
)
|
)
|
||||||
|
@ -54,66 +49,6 @@ func BasicAuthDecode(encoded string) (string, string, error) {
|
||||||
return "", "", errors.New("invalid basic authentication")
|
return "", "", errors.New("invalid basic authentication")
|
||||||
}
|
}
|
||||||
|
|
||||||
// VerifyTimeLimitCode verify time limit code
|
|
||||||
func VerifyTimeLimitCode(now time.Time, data string, minutes int, code string) bool {
|
|
||||||
if len(code) <= 18 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
startTimeStr := code[:12]
|
|
||||||
aliveTimeStr := code[12:18]
|
|
||||||
aliveTime, _ := strconv.Atoi(aliveTimeStr) // no need to check err, if anything wrong, the following code check will fail soon
|
|
||||||
|
|
||||||
// check code
|
|
||||||
retCode := CreateTimeLimitCode(data, aliveTime, startTimeStr, nil)
|
|
||||||
if subtle.ConstantTimeCompare([]byte(retCode), []byte(code)) != 1 {
|
|
||||||
retCode = CreateTimeLimitCode(data, aliveTime, startTimeStr, sha1.New()) // TODO: this is only for the support of legacy codes, remove this in/after 1.23
|
|
||||||
if subtle.ConstantTimeCompare([]byte(retCode), []byte(code)) != 1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check time is expired or not: startTime <= now && now < startTime + minutes
|
|
||||||
startTime, _ := time.ParseInLocation("200601021504", startTimeStr, time.Local)
|
|
||||||
return (startTime.Before(now) || startTime.Equal(now)) && now.Before(startTime.Add(time.Minute*time.Duration(minutes)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// TimeLimitCodeLength default value for time limit code
|
|
||||||
const TimeLimitCodeLength = 12 + 6 + 40
|
|
||||||
|
|
||||||
// CreateTimeLimitCode create a time-limited code.
|
|
||||||
// Format: 12 length date time string + 6 minutes string (not used) + 40 hash string, some other code depends on this fixed length
|
|
||||||
// If h is nil, then use the default hmac hash.
|
|
||||||
func CreateTimeLimitCode[T time.Time | string](data string, minutes int, startTimeGeneric T, h hash.Hash) string {
|
|
||||||
const format = "200601021504"
|
|
||||||
|
|
||||||
var start time.Time
|
|
||||||
var startTimeAny any = startTimeGeneric
|
|
||||||
if t, ok := startTimeAny.(time.Time); ok {
|
|
||||||
start = t
|
|
||||||
} else {
|
|
||||||
var err error
|
|
||||||
start, err = time.ParseInLocation(format, startTimeAny.(string), time.Local)
|
|
||||||
if err != nil {
|
|
||||||
return "" // return an invalid code because the "parse" failed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
startStr := start.Format(format)
|
|
||||||
end := start.Add(time.Minute * time.Duration(minutes))
|
|
||||||
|
|
||||||
if h == nil {
|
|
||||||
h = hmac.New(sha1.New, setting.GetGeneralTokenSigningSecret())
|
|
||||||
}
|
|
||||||
_, _ = fmt.Fprintf(h, "%s%s%s%s%d", data, hex.EncodeToString(setting.GetGeneralTokenSigningSecret()), startStr, end.Format(format), minutes)
|
|
||||||
encoded := hex.EncodeToString(h.Sum(nil))
|
|
||||||
|
|
||||||
code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded)
|
|
||||||
if len(code) != TimeLimitCodeLength {
|
|
||||||
panic("there is a hard requirement for the length of time-limited code") // it shouldn't happen
|
|
||||||
}
|
|
||||||
return code
|
|
||||||
}
|
|
||||||
|
|
||||||
// FileSize calculates the file size and generate user-friendly string.
|
// FileSize calculates the file size and generate user-friendly string.
|
||||||
func FileSize(s int64) string {
|
func FileSize(s int64) string {
|
||||||
return humanize.IBytes(uint64(s))
|
return humanize.IBytes(uint64(s))
|
||||||
|
@ -167,6 +102,12 @@ func Int64sToStrings(ints []int64) []string {
|
||||||
|
|
||||||
// EntryIcon returns the octicon class for displaying files/directories
|
// EntryIcon returns the octicon class for displaying files/directories
|
||||||
func EntryIcon(entry *git.TreeEntry) string {
|
func EntryIcon(entry *git.TreeEntry) string {
|
||||||
|
isAnnexed, _ := annex.IsAnnexed(entry.Blob())
|
||||||
|
if isAnnexed {
|
||||||
|
// Show git-annex files as binary files to differentiate them from non-annexed files
|
||||||
|
// TODO: find a more suitable icon, maybe something related to git-annex
|
||||||
|
return "file-binary"
|
||||||
|
}
|
||||||
switch {
|
switch {
|
||||||
case entry.IsLink():
|
case entry.IsLink():
|
||||||
te, _, err := entry.FollowLink()
|
te, _, err := entry.FollowLink()
|
||||||
|
|
|
@ -4,13 +4,7 @@
|
||||||
package base
|
package base
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha1"
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/setting"
|
|
||||||
"code.gitea.io/gitea/modules/test"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -46,57 +40,6 @@ func TestBasicAuthDecode(t *testing.T) {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestVerifyTimeLimitCode(t *testing.T) {
|
|
||||||
defer test.MockVariableValue(&setting.InstallLock, true)()
|
|
||||||
initGeneralSecret := func(secret string) {
|
|
||||||
setting.InstallLock = true
|
|
||||||
setting.CfgProvider, _ = setting.NewConfigProviderFromData(fmt.Sprintf(`
|
|
||||||
[oauth2]
|
|
||||||
JWT_SECRET = %s
|
|
||||||
`, secret))
|
|
||||||
setting.LoadCommonSettings()
|
|
||||||
}
|
|
||||||
|
|
||||||
initGeneralSecret("KZb_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko")
|
|
||||||
now := time.Now()
|
|
||||||
|
|
||||||
t.Run("TestGenericParameter", func(t *testing.T) {
|
|
||||||
time2000 := time.Date(2000, 1, 2, 3, 4, 5, 0, time.Local)
|
|
||||||
assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, time2000, sha1.New()))
|
|
||||||
assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, "200001020304", sha1.New()))
|
|
||||||
assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, time2000, nil))
|
|
||||||
assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, "200001020304", nil))
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("TestInvalidCode", func(t *testing.T) {
|
|
||||||
assert.False(t, VerifyTimeLimitCode(now, "data", 2, ""))
|
|
||||||
assert.False(t, VerifyTimeLimitCode(now, "data", 2, "invalid code"))
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("TestCreateAndVerify", func(t *testing.T) {
|
|
||||||
code := CreateTimeLimitCode("data", 2, now, nil)
|
|
||||||
assert.False(t, VerifyTimeLimitCode(now.Add(-time.Minute), "data", 2, code)) // not started yet
|
|
||||||
assert.True(t, VerifyTimeLimitCode(now, "data", 2, code))
|
|
||||||
assert.True(t, VerifyTimeLimitCode(now.Add(time.Minute), "data", 2, code))
|
|
||||||
assert.False(t, VerifyTimeLimitCode(now.Add(time.Minute), "DATA", 2, code)) // invalid data
|
|
||||||
assert.False(t, VerifyTimeLimitCode(now.Add(2*time.Minute), "data", 2, code)) // expired
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("TestDifferentSecret", func(t *testing.T) {
|
|
||||||
// use another secret to ensure the code is invalid for different secret
|
|
||||||
verifyDataCode := func(c string) bool {
|
|
||||||
return VerifyTimeLimitCode(now, "data", 2, c)
|
|
||||||
}
|
|
||||||
code1 := CreateTimeLimitCode("data", 2, now, sha1.New())
|
|
||||||
code2 := CreateTimeLimitCode("data", 2, now, nil)
|
|
||||||
assert.True(t, verifyDataCode(code1))
|
|
||||||
assert.True(t, verifyDataCode(code2))
|
|
||||||
initGeneralSecret("000_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko")
|
|
||||||
assert.False(t, verifyDataCode(code1))
|
|
||||||
assert.False(t, verifyDataCode(code2))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFileSize(t *testing.T) {
|
func TestFileSize(t *testing.T) {
|
||||||
var size int64 = 512
|
var size int64 = 512
|
||||||
assert.Equal(t, "512 B", FileSize(size))
|
assert.Equal(t, "512 B", FileSize(size))
|
||||||
|
|
|
@ -126,6 +126,10 @@ func (b *blobReader) Close() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Blob) Repo() *Repository {
|
||||||
|
return b.repo
|
||||||
|
}
|
||||||
|
|
||||||
// Name returns name of the tree entry this blob object was created from (or empty string)
|
// Name returns name of the tree entry this blob object was created from (or empty string)
|
||||||
func (b *Blob) Name() string {
|
func (b *Blob) Name() string {
|
||||||
return b.name
|
return b.name
|
||||||
|
|
|
@ -457,12 +457,13 @@ func (c *Command) RunStdBytes(opts *RunOpts) (stdout, stderr []byte, runErr RunS
|
||||||
}
|
}
|
||||||
|
|
||||||
// AllowLFSFiltersArgs return globalCommandArgs with lfs filter, it should only be used for tests
|
// AllowLFSFiltersArgs return globalCommandArgs with lfs filter, it should only be used for tests
|
||||||
|
// It also re-enables git-credential(1), which is used to test git-annex's HTTP support
|
||||||
func AllowLFSFiltersArgs() TrustedCmdArgs {
|
func AllowLFSFiltersArgs() TrustedCmdArgs {
|
||||||
// Now here we should explicitly allow lfs filters to run
|
// Now here we should explicitly allow lfs filters to run
|
||||||
filteredLFSGlobalArgs := make(TrustedCmdArgs, len(globalCommandArgs))
|
filteredLFSGlobalArgs := make(TrustedCmdArgs, len(globalCommandArgs))
|
||||||
j := 0
|
j := 0
|
||||||
for _, arg := range globalCommandArgs {
|
for _, arg := range globalCommandArgs {
|
||||||
if strings.Contains(string(arg), "lfs") {
|
if strings.Contains(string(arg), "lfs") || strings.Contains(string(arg), "credential") {
|
||||||
j--
|
j--
|
||||||
} else {
|
} else {
|
||||||
filteredLFSGlobalArgs[j] = arg
|
filteredLFSGlobalArgs[j] = arg
|
||||||
|
|
|
@ -272,6 +272,17 @@ func CutDiffAroundLine(originalDiff io.Reader, line int64, old bool, numbersOfLi
|
||||||
|
|
||||||
// GetAffectedFiles returns the affected files between two commits
|
// GetAffectedFiles returns the affected files between two commits
|
||||||
func GetAffectedFiles(repo *Repository, oldCommitID, newCommitID string, env []string) ([]string, error) {
|
func GetAffectedFiles(repo *Repository, oldCommitID, newCommitID string, env []string) ([]string, error) {
|
||||||
|
objectFormat, err := repo.GetObjectFormat()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the oldCommitID is empty, then we must assume its a new branch, so diff
|
||||||
|
// against the empty tree. So all changes of this new branch are included.
|
||||||
|
if oldCommitID == objectFormat.EmptyObjectID().String() {
|
||||||
|
oldCommitID = objectFormat.EmptyTree().String()
|
||||||
|
}
|
||||||
|
|
||||||
stdoutReader, stdoutWriter, err := os.Pipe()
|
stdoutReader, stdoutWriter, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Unable to create os.Pipe for %s", repo.Path)
|
log.Error("Unable to create os.Pipe for %s", repo.Path)
|
||||||
|
|
|
@ -97,12 +97,12 @@ func SetExecutablePath(path string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if gitVersion.LessThan(versionRequired) {
|
if gitVersion.LessThan(versionRequired) {
|
||||||
moreHint := "get git: https://git-scm.com/download/"
|
moreHint := "get git: https://git-scm.com/downloads"
|
||||||
if runtime.GOOS == "linux" {
|
if runtime.GOOS == "linux" {
|
||||||
// there are a lot of CentOS/RHEL users using old git, so we add a special hint for them
|
// there are a lot of CentOS/RHEL users using old git, so we add a special hint for them
|
||||||
if _, err = os.Stat("/etc/redhat-release"); err == nil {
|
if _, err = os.Stat("/etc/redhat-release"); err == nil {
|
||||||
// ius.io is the recommended official(git-scm.com) method to install git
|
// ius.io is the recommended official(git-scm.com) method to install git
|
||||||
moreHint = "get git: https://git-scm.com/download/linux and https://ius.io"
|
moreHint = "get git: https://git-scm.com/downloads/linux and https://ius.io"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fmt.Errorf("installed git version %q is not supported, Gitea requires git version >= %q, %s", gitVersion.Original(), RequiredVersion, moreHint)
|
return fmt.Errorf("installed git version %q is not supported, Gitea requires git version >= %q, %s", gitVersion.Original(), RequiredVersion, moreHint)
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ type GrepResult struct {
|
||||||
type GrepOptions struct {
|
type GrepOptions struct {
|
||||||
RefName string
|
RefName string
|
||||||
MaxResultLimit int
|
MaxResultLimit int
|
||||||
MatchesPerFile int
|
MatchesPerFile int // >= git 2.38
|
||||||
ContextLineNumber int
|
ContextLineNumber int
|
||||||
IsFuzzy bool
|
IsFuzzy bool
|
||||||
PathSpec []setting.Glob
|
PathSpec []setting.Glob
|
||||||
|
@ -77,7 +78,14 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
|
||||||
"-I", "--null", "--break", "--heading", "--column",
|
"-I", "--null", "--break", "--heading", "--column",
|
||||||
"--fixed-strings", "--line-number", "--ignore-case", "--full-name")
|
"--fixed-strings", "--line-number", "--ignore-case", "--full-name")
|
||||||
cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber))
|
cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber))
|
||||||
cmd.AddOptionValues("--max-count", fmt.Sprint(opts.MatchesPerFile))
|
|
||||||
|
// --max-count requires at least git 2.38
|
||||||
|
if CheckGitVersionAtLeast("2.38.0") == nil {
|
||||||
|
cmd.AddOptionValues("--max-count", fmt.Sprint(opts.MatchesPerFile))
|
||||||
|
} else {
|
||||||
|
log.Warn("git-grep: --max-count requires at least git 2.38")
|
||||||
|
}
|
||||||
|
|
||||||
words := []string{search}
|
words := []string{search}
|
||||||
if opts.IsFuzzy {
|
if opts.IsFuzzy {
|
||||||
words = strings.Fields(search)
|
words = strings.Fields(search)
|
||||||
|
|
|
@ -96,7 +96,7 @@ func Code(fileName, language, code string) (output template.HTML, lexerName stri
|
||||||
}
|
}
|
||||||
|
|
||||||
if lexer == nil {
|
if lexer == nil {
|
||||||
lexer = lexers.Match(fileName)
|
lexer = lexers.Match(strings.ToLower(fileName))
|
||||||
if lexer == nil {
|
if lexer == nil {
|
||||||
lexer = lexers.Fallback
|
lexer = lexers.Fallback
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ func File(fileName, language string, code []byte) ([]template.HTML, string, erro
|
||||||
|
|
||||||
lexer = lexers.Get(guessLanguage)
|
lexer = lexers.Get(guessLanguage)
|
||||||
if lexer == nil {
|
if lexer == nil {
|
||||||
lexer = lexers.Match(fileName)
|
lexer = lexers.Match(strings.ToLower(fileName))
|
||||||
if lexer == nil {
|
if lexer == nil {
|
||||||
lexer = lexers.Fallback
|
lexer = lexers.Fallback
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,12 @@ c=2
|
||||||
),
|
),
|
||||||
lexerName: "Python",
|
lexerName: "Python",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "DOS.PAS",
|
||||||
|
code: "",
|
||||||
|
want: lines(""),
|
||||||
|
lexerName: "ObjectPascal",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
|
|
@ -76,7 +76,8 @@ func HandleGenericETagTimeCache(req *http.Request, w http.ResponseWriter, etag s
|
||||||
w.Header().Set("Etag", etag)
|
w.Header().Set("Etag", etag)
|
||||||
}
|
}
|
||||||
if lastModified != nil && !lastModified.IsZero() {
|
if lastModified != nil && !lastModified.IsZero() {
|
||||||
w.Header().Set("Last-Modified", lastModified.Format(http.TimeFormat))
|
// http.TimeFormat required a UTC time, refer to https://pkg.go.dev/net/http#TimeFormat
|
||||||
|
w.Header().Set("Last-Modified", lastModified.UTC().Format(http.TimeFormat))
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(etag) > 0 {
|
if len(etag) > 0 {
|
||||||
|
|
|
@ -79,6 +79,7 @@ func ServeSetHeaders(w http.ResponseWriter, opts *ServeHeaderOptions) {
|
||||||
httpcache.SetCacheControlInHeader(header, duration)
|
httpcache.SetCacheControlInHeader(header, duration)
|
||||||
|
|
||||||
if !opts.LastModified.IsZero() {
|
if !opts.LastModified.IsZero() {
|
||||||
|
// http.TimeFormat required a UTC time, refer to https://pkg.go.dev/net/http#TimeFormat
|
||||||
header.Set("Last-Modified", opts.LastModified.UTC().Format(http.TimeFormat))
|
header.Set("Last-Modified", opts.LastModified.UTC().Format(http.TimeFormat))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
indexer_internal "code.gitea.io/gitea/modules/indexer/internal"
|
indexer_internal "code.gitea.io/gitea/modules/indexer/internal"
|
||||||
inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch"
|
inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch"
|
||||||
"code.gitea.io/gitea/modules/json"
|
"code.gitea.io/gitea/modules/json"
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
"code.gitea.io/gitea/modules/typesniffer"
|
"code.gitea.io/gitea/modules/typesniffer"
|
||||||
|
@ -197,8 +198,33 @@ func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha st
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete deletes indexes by ids
|
// Delete entries by repoId
|
||||||
func (b *Indexer) Delete(ctx context.Context, repoID int64) error {
|
func (b *Indexer) Delete(ctx context.Context, repoID int64) error {
|
||||||
|
if err := b.doDelete(ctx, repoID); err != nil {
|
||||||
|
// Maybe there is a conflict during the delete operation, so we should retry after a refresh
|
||||||
|
log.Warn("Deletion of entries of repo %v within index %v was erroneus. Trying to refresh index before trying again", repoID, b.inner.VersionedIndexName(), err)
|
||||||
|
if err := b.refreshIndex(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := b.doDelete(ctx, repoID); err != nil {
|
||||||
|
log.Error("Could not delete entries of repo %v within index %v", repoID, b.inner.VersionedIndexName())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Indexer) refreshIndex(ctx context.Context) error {
|
||||||
|
if _, err := b.inner.Client.Refresh(b.inner.VersionedIndexName()).Do(ctx); err != nil {
|
||||||
|
log.Error("Error while trying to refresh index %v", b.inner.VersionedIndexName(), err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete entries by repoId
|
||||||
|
func (b *Indexer) doDelete(ctx context.Context, repoID int64) error {
|
||||||
_, err := b.inner.Client.DeleteByQuery(b.inner.VersionedIndexName()).
|
_, err := b.inner.Client.DeleteByQuery(b.inner.VersionedIndexName()).
|
||||||
Query(elastic.NewTermsQuery("repo_id", repoID)).
|
Query(elastic.NewTermsQuery("repo_id", repoID)).
|
||||||
Do(ctx)
|
Do(ctx)
|
||||||
|
|
|
@ -38,7 +38,7 @@ func camoHandleLink(link string) string {
|
||||||
if setting.Camo.Enabled {
|
if setting.Camo.Enabled {
|
||||||
lnkURL, err := url.Parse(link)
|
lnkURL, err := url.Parse(link)
|
||||||
if err == nil && lnkURL.IsAbs() && !strings.HasPrefix(link, setting.AppURL) &&
|
if err == nil && lnkURL.IsAbs() && !strings.HasPrefix(link, setting.AppURL) &&
|
||||||
(setting.Camo.Allways || lnkURL.Scheme != "https") {
|
(setting.Camo.Always || lnkURL.Scheme != "https") {
|
||||||
return CamoEncode(link)
|
return CamoEncode(link)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ func TestCamoHandleLink(t *testing.T) {
|
||||||
"https://image.proxy/eivin43gJwGVIjR9MiYYtFIk0mw/aHR0cDovL3Rlc3RpbWFnZXMub3JnL2ltZy5qcGc",
|
"https://image.proxy/eivin43gJwGVIjR9MiYYtFIk0mw/aHR0cDovL3Rlc3RpbWFnZXMub3JnL2ltZy5qcGc",
|
||||||
camoHandleLink("http://testimages.org/img.jpg"))
|
camoHandleLink("http://testimages.org/img.jpg"))
|
||||||
|
|
||||||
setting.Camo.Allways = true
|
setting.Camo.Always = true
|
||||||
assert.Equal(t,
|
assert.Equal(t,
|
||||||
"https://gitea.com/img.jpg",
|
"https://gitea.com/img.jpg",
|
||||||
camoHandleLink("https://gitea.com/img.jpg"))
|
camoHandleLink("https://gitea.com/img.jpg"))
|
||||||
|
|
25
modules/markup/external/external.go
vendored
25
modules/markup/external/external.go
vendored
|
@ -12,6 +12,7 @@ import (
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/annex"
|
||||||
"code.gitea.io/gitea/modules/graceful"
|
"code.gitea.io/gitea/modules/graceful"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/markup"
|
"code.gitea.io/gitea/modules/markup"
|
||||||
|
@ -86,8 +87,22 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
|
||||||
commands = strings.Fields(command)
|
commands = strings.Fields(command)
|
||||||
args = commands[1:]
|
args = commands[1:]
|
||||||
)
|
)
|
||||||
|
isAnnexed, _ := annex.IsAnnexed(ctx.Blob)
|
||||||
if p.IsInputFile {
|
// if a renderer wants to read a file, and we have annexed content, we can
|
||||||
|
// provide the annex key file location directly to the renderer. git-annex
|
||||||
|
// takes care of having that location be read-only, so no critical
|
||||||
|
// protection layer is needed. Moreover, the file readily exists, and
|
||||||
|
// expensive temporary files can be avoided, also allowing an operator
|
||||||
|
// to raise MAX_DISPLAY_FILE_SIZE without much negative impact.
|
||||||
|
if p.IsInputFile && isAnnexed {
|
||||||
|
// look for annexed content, will be empty, if there is none
|
||||||
|
annexContentLocation, _ := annex.ContentLocation(ctx.Blob)
|
||||||
|
// we call the renderer, even if there is no annex content present.
|
||||||
|
// showing the pointer file content is not much use, and a topical
|
||||||
|
// renderer might be able to produce something useful from the
|
||||||
|
// filename alone (present in ENV)
|
||||||
|
args = append(args, annexContentLocation)
|
||||||
|
} else if p.IsInputFile {
|
||||||
// write to temp file
|
// write to temp file
|
||||||
f, err := os.CreateTemp("", "gitea_input")
|
f, err := os.CreateTemp("", "gitea_input")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -130,6 +145,12 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
|
||||||
os.Environ(),
|
os.Environ(),
|
||||||
"GITEA_PREFIX_SRC="+ctx.Links.SrcLink(),
|
"GITEA_PREFIX_SRC="+ctx.Links.SrcLink(),
|
||||||
"GITEA_PREFIX_RAW="+ctx.Links.RawLink(),
|
"GITEA_PREFIX_RAW="+ctx.Links.RawLink(),
|
||||||
|
// also communicate the relative path of the to-be-rendered item.
|
||||||
|
// this enables the renderer to make use of the original file name
|
||||||
|
// and path, e.g., to make rendering or dtype-detection decisions
|
||||||
|
// that go beyond the originally matched extension. Even if the
|
||||||
|
// content is directly streamed to STDIN
|
||||||
|
"GITEA_RELATIVE_PATH="+ctx.RelativePath,
|
||||||
)
|
)
|
||||||
if !p.IsInputFile {
|
if !p.IsInputFile {
|
||||||
cmd.Stdin = input
|
cmd.Stdin = input
|
||||||
|
|
|
@ -67,14 +67,18 @@ type Header struct {
|
||||||
|
|
||||||
// RenderContext represents a render context
|
// RenderContext represents a render context
|
||||||
type RenderContext struct {
|
type RenderContext struct {
|
||||||
Ctx context.Context
|
Ctx context.Context
|
||||||
RelativePath string // relative path from tree root of the branch
|
RelativePath string // relative path from tree root of the branch
|
||||||
Type string
|
Type string
|
||||||
IsWiki bool
|
IsWiki bool
|
||||||
Links Links
|
Links Links
|
||||||
Metas map[string]string
|
Metas map[string]string
|
||||||
DefaultLink string
|
DefaultLink string
|
||||||
GitRepo *git.Repository
|
GitRepo *git.Repository
|
||||||
|
// reporting the target blob that is to-be-rendered enables
|
||||||
|
// deeper inspection in the handler for external renderer
|
||||||
|
// (i.e., more targeted handling of annexed files)
|
||||||
|
Blob *git.Blob
|
||||||
ShaExistCache map[string]bool
|
ShaExistCache map[string]bool
|
||||||
cancelFn func()
|
cancelFn func()
|
||||||
SidebarTocNode ast.Node
|
SidebarTocNode ast.Node
|
||||||
|
|
|
@ -94,10 +94,10 @@ func createDefaultPolicy() *bluemonday.Policy {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow classes for anchors
|
// Allow classes for anchors
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`ref-issue( ref-external-issue)?`)).OnElements("a")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^ref-issue( ref-external-issue)?$`)).OnElements("a")
|
||||||
|
|
||||||
// Allow classes for task lists
|
// Allow classes for task lists
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`task-list-item`)).OnElements("li")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^task-list-item$`)).OnElements("li")
|
||||||
|
|
||||||
// Allow classes for org mode list item status.
|
// Allow classes for org mode list item status.
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^(unchecked|checked|indeterminate)$`)).OnElements("li")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^(unchecked|checked|indeterminate)$`)).OnElements("li")
|
||||||
|
@ -106,7 +106,7 @@ func createDefaultPolicy() *bluemonday.Policy {
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^icon(\s+[\p{L}\p{N}_-]+)+$`)).OnElements("i")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^icon(\s+[\p{L}\p{N}_-]+)+$`)).OnElements("i")
|
||||||
|
|
||||||
// Allow classes for emojis
|
// Allow classes for emojis
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`emoji`)).OnElements("img")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^emoji$`)).OnElements("img")
|
||||||
|
|
||||||
// Allow icons, emojis, chroma syntax and keyword markup on span
|
// Allow icons, emojis, chroma syntax and keyword markup on span
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span")
|
||||||
|
@ -122,13 +122,13 @@ func createDefaultPolicy() *bluemonday.Policy {
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("^header$")).OnElements("div")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^header$")).OnElements("div")
|
||||||
policy.AllowAttrs("data-line-number").Matching(regexp.MustCompile("^[0-9]+$")).OnElements("span")
|
policy.AllowAttrs("data-line-number").Matching(regexp.MustCompile("^[0-9]+$")).OnElements("span")
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("^text small grey$")).OnElements("span")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^text small grey$")).OnElements("span")
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("^file-preview*")).OnElements("table")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^file-preview$")).OnElements("table")
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("^lines-escape$")).OnElements("td")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^lines-escape$")).OnElements("td")
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("^toggle-escape-button btn interact-bg$")).OnElements("button")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^toggle-escape-button btn interact-bg$")).OnElements("button")
|
||||||
policy.AllowAttrs("title").OnElements("button")
|
policy.AllowAttrs("title").OnElements("button")
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("^ambiguous-code-point$")).OnElements("span")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^ambiguous-code-point$")).OnElements("span")
|
||||||
policy.AllowAttrs("data-tooltip-content").OnElements("span")
|
policy.AllowAttrs("data-tooltip-content").OnElements("span")
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("muted|(text black)")).OnElements("a")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^muted|(text black)$")).OnElements("a")
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile("^ui warning message tw-text-left$")).OnElements("div")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile("^ui warning message tw-text-left$")).OnElements("div")
|
||||||
|
|
||||||
// Allow generally safe attributes
|
// Allow generally safe attributes
|
||||||
|
|
|
@ -39,8 +39,8 @@ const (
|
||||||
var (
|
var (
|
||||||
reName = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+$`)
|
reName = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+$`)
|
||||||
reVer = regexp.MustCompile(`^[a-zA-Z0-9:_.+]+-+[0-9]+$`)
|
reVer = regexp.MustCompile(`^[a-zA-Z0-9:_.+]+-+[0-9]+$`)
|
||||||
reOptDep = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?[a-zA-Z0-9@._+-]+)?(:.*)?$`)
|
reOptDep = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?(:.*)?$`)
|
||||||
rePkgVer = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?[a-zA-Z0-9@._+-]+)?$`)
|
rePkgVer = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?$`)
|
||||||
|
|
||||||
magicZSTD = []byte{0x28, 0xB5, 0x2F, 0xFD}
|
magicZSTD = []byte{0x28, 0xB5, 0x2F, 0xFD}
|
||||||
magicXZ = []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A}
|
magicXZ = []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A}
|
||||||
|
@ -71,7 +71,7 @@ type VersionMetadata struct {
|
||||||
Conflicts []string `json:"conflicts,omitempty"`
|
Conflicts []string `json:"conflicts,omitempty"`
|
||||||
Replaces []string `json:"replaces,omitempty"`
|
Replaces []string `json:"replaces,omitempty"`
|
||||||
Backup []string `json:"backup,omitempty"`
|
Backup []string `json:"backup,omitempty"`
|
||||||
Xdata []string `json:"xdata,omitempty"`
|
XData []string `json:"xdata,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileMetadata Metadata related to specific package file.
|
// FileMetadata Metadata related to specific package file.
|
||||||
|
@ -125,7 +125,7 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
|
||||||
defer tarball.Close()
|
defer tarball.Close()
|
||||||
|
|
||||||
var pkg *Package
|
var pkg *Package
|
||||||
var mtree bool
|
var mTree bool
|
||||||
|
|
||||||
for {
|
for {
|
||||||
f, err := tarball.Read()
|
f, err := tarball.Read()
|
||||||
|
@ -135,24 +135,24 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
switch f.Name() {
|
switch f.Name() {
|
||||||
case ".PKGINFO":
|
case ".PKGINFO":
|
||||||
pkg, err = ParsePackageInfo(tarballType, f)
|
pkg, err = ParsePackageInfo(tarballType, f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
_ = f.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
case ".MTREE":
|
case ".MTREE":
|
||||||
mtree = true
|
mTree = true
|
||||||
}
|
}
|
||||||
|
_ = f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
if pkg == nil {
|
if pkg == nil {
|
||||||
return nil, util.NewInvalidArgumentErrorf(".PKGINFO file not found")
|
return nil, util.NewInvalidArgumentErrorf(".PKGINFO file not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !mtree {
|
if !mTree {
|
||||||
return nil, util.NewInvalidArgumentErrorf(".MTREE file not found")
|
return nil, util.NewInvalidArgumentErrorf(".MTREE file not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ func ParsePackageInfo(compressType string, r io.Reader) (*Package, error) {
|
||||||
case "replaces":
|
case "replaces":
|
||||||
p.VersionMetadata.Replaces = append(p.VersionMetadata.Replaces, value)
|
p.VersionMetadata.Replaces = append(p.VersionMetadata.Replaces, value)
|
||||||
case "xdata":
|
case "xdata":
|
||||||
p.VersionMetadata.Xdata = append(p.VersionMetadata.Xdata, value)
|
p.VersionMetadata.XData = append(p.VersionMetadata.XData, value)
|
||||||
case "builddate":
|
case "builddate":
|
||||||
bd, err := strconv.ParseInt(value, 10, 64)
|
bd, err := strconv.ParseInt(value, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -260,48 +260,43 @@ func ValidatePackageSpec(p *Package) error {
|
||||||
return util.NewInvalidArgumentErrorf("invalid project URL")
|
return util.NewInvalidArgumentErrorf("invalid project URL")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, cd := range p.VersionMetadata.CheckDepends {
|
for _, checkDepend := range p.VersionMetadata.CheckDepends {
|
||||||
if !rePkgVer.MatchString(cd) {
|
if !rePkgVer.MatchString(checkDepend) {
|
||||||
return util.NewInvalidArgumentErrorf("invalid check dependency: %s", cd)
|
return util.NewInvalidArgumentErrorf("invalid check dependency: %s", checkDepend)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, d := range p.VersionMetadata.Depends {
|
for _, depend := range p.VersionMetadata.Depends {
|
||||||
if !rePkgVer.MatchString(d) {
|
if !rePkgVer.MatchString(depend) {
|
||||||
return util.NewInvalidArgumentErrorf("invalid dependency: %s", d)
|
return util.NewInvalidArgumentErrorf("invalid dependency: %s", depend)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, md := range p.VersionMetadata.MakeDepends {
|
for _, makeDepend := range p.VersionMetadata.MakeDepends {
|
||||||
if !rePkgVer.MatchString(md) {
|
if !rePkgVer.MatchString(makeDepend) {
|
||||||
return util.NewInvalidArgumentErrorf("invalid make dependency: %s", md)
|
return util.NewInvalidArgumentErrorf("invalid make dependency: %s", makeDepend)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, p := range p.VersionMetadata.Provides {
|
for _, provide := range p.VersionMetadata.Provides {
|
||||||
if !rePkgVer.MatchString(p) {
|
if !rePkgVer.MatchString(provide) {
|
||||||
return util.NewInvalidArgumentErrorf("invalid provides: %s", p)
|
return util.NewInvalidArgumentErrorf("invalid provides: %s", provide)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, p := range p.VersionMetadata.Conflicts {
|
for _, conflict := range p.VersionMetadata.Conflicts {
|
||||||
if !rePkgVer.MatchString(p) {
|
if !rePkgVer.MatchString(conflict) {
|
||||||
return util.NewInvalidArgumentErrorf("invalid conflicts: %s", p)
|
return util.NewInvalidArgumentErrorf("invalid conflicts: %s", conflict)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, p := range p.VersionMetadata.Replaces {
|
for _, replace := range p.VersionMetadata.Replaces {
|
||||||
if !rePkgVer.MatchString(p) {
|
if !rePkgVer.MatchString(replace) {
|
||||||
return util.NewInvalidArgumentErrorf("invalid replaces: %s", p)
|
return util.NewInvalidArgumentErrorf("invalid replaces: %s", replace)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, p := range p.VersionMetadata.Replaces {
|
for _, optDepend := range p.VersionMetadata.OptDepends {
|
||||||
if !rePkgVer.MatchString(p) {
|
if !reOptDep.MatchString(optDepend) {
|
||||||
return util.NewInvalidArgumentErrorf("invalid xdata: %s", p)
|
return util.NewInvalidArgumentErrorf("invalid optional dependency: %s", optDepend)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, od := range p.VersionMetadata.OptDepends {
|
for _, b := range p.VersionMetadata.Backup {
|
||||||
if !reOptDep.MatchString(od) {
|
if strings.HasPrefix(b, "/") {
|
||||||
return util.NewInvalidArgumentErrorf("invalid optional dependency: %s", od)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, bf := range p.VersionMetadata.Backup {
|
|
||||||
if strings.HasPrefix(bf, "/") {
|
|
||||||
return util.NewInvalidArgumentErrorf("backup file contains leading forward slash")
|
return util.NewInvalidArgumentErrorf("backup file contains leading forward slash")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,7 @@ func parsePackage(r io.Reader) (*Package, error) {
|
||||||
Target *string `json:"target"`
|
Target *string `json:"target"`
|
||||||
Kind string `json:"kind"`
|
Kind string `json:"kind"`
|
||||||
Registry *string `json:"registry"`
|
Registry *string `json:"registry"`
|
||||||
ExplicitNameInToml string `json:"explicit_name_in_toml"`
|
ExplicitNameInToml *string `json:"explicit_name_in_toml"`
|
||||||
} `json:"deps"`
|
} `json:"deps"`
|
||||||
Features map[string][]string `json:"features"`
|
Features map[string][]string `json:"features"`
|
||||||
Authors []string `json:"authors"`
|
Authors []string `json:"authors"`
|
||||||
|
@ -136,8 +136,16 @@ func parsePackage(r io.Reader) (*Package, error) {
|
||||||
|
|
||||||
dependencies := make([]*Dependency, 0, len(meta.Deps))
|
dependencies := make([]*Dependency, 0, len(meta.Deps))
|
||||||
for _, dep := range meta.Deps {
|
for _, dep := range meta.Deps {
|
||||||
|
name := dep.Name
|
||||||
|
packageName := dep.ExplicitNameInToml
|
||||||
|
// If the explicit_name_in_toml field is set, the package is renamed and
|
||||||
|
// should be set accordingly.
|
||||||
|
if dep.ExplicitNameInToml != nil {
|
||||||
|
name = *dep.ExplicitNameInToml
|
||||||
|
packageName = &dep.Name
|
||||||
|
}
|
||||||
dependencies = append(dependencies, &Dependency{
|
dependencies = append(dependencies, &Dependency{
|
||||||
Name: dep.Name,
|
Name: name,
|
||||||
Req: dep.VersionReq,
|
Req: dep.VersionReq,
|
||||||
Features: dep.Features,
|
Features: dep.Features,
|
||||||
Optional: dep.Optional,
|
Optional: dep.Optional,
|
||||||
|
@ -145,6 +153,7 @@ func parsePackage(r io.Reader) (*Package, error) {
|
||||||
Target: dep.Target,
|
Target: dep.Target,
|
||||||
Kind: dep.Kind,
|
Kind: dep.Kind,
|
||||||
Registry: dep.Registry,
|
Registry: dep.Registry,
|
||||||
|
Package: packageName,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestParsePackage(t *testing.T) {
|
func TestParsePackage(t *testing.T) {
|
||||||
createPackage := func(name, version string) io.Reader {
|
createPackage := func(name, version, dependency string) io.Reader {
|
||||||
metadata := `{
|
metadata := `{
|
||||||
"name":"` + name + `",
|
"name":"` + name + `",
|
||||||
"vers":"` + version + `",
|
"vers":"` + version + `",
|
||||||
|
@ -32,7 +32,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
{
|
{
|
||||||
"name":"dep",
|
"name":"dep",
|
||||||
"version_req":"1.0"
|
"version_req":"1.0"
|
||||||
}
|
}` + dependency + `
|
||||||
],
|
],
|
||||||
"homepage":"` + homepage + `",
|
"homepage":"` + homepage + `",
|
||||||
"license":"` + license + `"
|
"license":"` + license + `"
|
||||||
|
@ -48,7 +48,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
|
|
||||||
t.Run("InvalidName", func(t *testing.T) {
|
t.Run("InvalidName", func(t *testing.T) {
|
||||||
for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} {
|
for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} {
|
||||||
data := createPackage(name, "1.0.0")
|
data := createPackage(name, "1.0.0", "")
|
||||||
|
|
||||||
cp, err := ParsePackage(data)
|
cp, err := ParsePackage(data)
|
||||||
assert.Nil(t, cp)
|
assert.Nil(t, cp)
|
||||||
|
@ -58,7 +58,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
|
|
||||||
t.Run("InvalidVersion", func(t *testing.T) {
|
t.Run("InvalidVersion", func(t *testing.T) {
|
||||||
for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} {
|
for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} {
|
||||||
data := createPackage("test", version)
|
data := createPackage("test", version, "")
|
||||||
|
|
||||||
cp, err := ParsePackage(data)
|
cp, err := ParsePackage(data)
|
||||||
assert.Nil(t, cp)
|
assert.Nil(t, cp)
|
||||||
|
@ -67,7 +67,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Valid", func(t *testing.T) {
|
t.Run("Valid", func(t *testing.T) {
|
||||||
data := createPackage("test", "1.0.0")
|
data := createPackage("test", "1.0.0", "")
|
||||||
|
|
||||||
cp, err := ParsePackage(data)
|
cp, err := ParsePackage(data)
|
||||||
assert.NotNil(t, cp)
|
assert.NotNil(t, cp)
|
||||||
|
@ -84,4 +84,25 @@ func TestParsePackage(t *testing.T) {
|
||||||
content, _ := io.ReadAll(cp.Content)
|
content, _ := io.ReadAll(cp.Content)
|
||||||
assert.Equal(t, "test", string(content))
|
assert.Equal(t, "test", string(content))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("Renamed dependency", func(t *testing.T) {
|
||||||
|
data := createPackage("test", "1.0.0", `, {"name":"v4l2-sys", "version":"0.3.0", "explicit_name_in_toml":"v4l2-sys-mit"}`)
|
||||||
|
|
||||||
|
cp, err := ParsePackage(data)
|
||||||
|
assert.NotNil(t, cp)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, "test", cp.Name)
|
||||||
|
assert.Equal(t, "1.0.0", cp.Version)
|
||||||
|
assert.Equal(t, description, cp.Metadata.Description)
|
||||||
|
assert.Equal(t, []string{author}, cp.Metadata.Authors)
|
||||||
|
assert.Len(t, cp.Metadata.Dependencies, 2)
|
||||||
|
assert.Equal(t, "dep", cp.Metadata.Dependencies[0].Name)
|
||||||
|
assert.EqualValues(t, "v4l2-sys-mit", cp.Metadata.Dependencies[1].Name)
|
||||||
|
assert.EqualValues(t, "v4l2-sys", *cp.Metadata.Dependencies[1].Package)
|
||||||
|
assert.Equal(t, homepage, cp.Metadata.ProjectURL)
|
||||||
|
assert.Equal(t, license, cp.Metadata.License)
|
||||||
|
content, _ := io.ReadAll(cp.Content)
|
||||||
|
assert.Equal(t, "test", string(content))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ type Metadata struct {
|
||||||
Homepage string `json:"homepage,omitempty"`
|
Homepage string `json:"homepage,omitempty"`
|
||||||
License Licenses `json:"license,omitempty"`
|
License Licenses `json:"license,omitempty"`
|
||||||
Authors []Author `json:"authors,omitempty"`
|
Authors []Author `json:"authors,omitempty"`
|
||||||
|
Bin []string `json:"bin,omitempty"`
|
||||||
Autoload map[string]any `json:"autoload,omitempty"`
|
Autoload map[string]any `json:"autoload,omitempty"`
|
||||||
AutoloadDev map[string]any `json:"autoload-dev,omitempty"`
|
AutoloadDev map[string]any `json:"autoload-dev,omitempty"`
|
||||||
Extra map[string]any `json:"extra,omitempty"`
|
Extra map[string]any `json:"extra,omitempty"`
|
||||||
|
|
|
@ -40,6 +40,7 @@ type ServCommandResults struct {
|
||||||
UserName string
|
UserName string
|
||||||
UserEmail string
|
UserEmail string
|
||||||
UserID int64
|
UserID int64
|
||||||
|
UserMode perm.AccessMode
|
||||||
OwnerName string
|
OwnerName string
|
||||||
RepoName string
|
RepoName string
|
||||||
RepoID int64
|
RepoID int64
|
||||||
|
|
25
modules/setting/annex.go
Normal file
25
modules/setting/annex.go
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Annex represents the configuration for git-annex
|
||||||
|
var Annex = struct {
|
||||||
|
Enabled bool `ini:"ENABLED"`
|
||||||
|
DisableP2PHTTP bool `ini:"DISABLE_P2PHTTP"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
func loadAnnexFrom(rootCfg ConfigProvider) {
|
||||||
|
sec := rootCfg.Section("annex")
|
||||||
|
if err := sec.MapTo(&Annex); err != nil {
|
||||||
|
log.Fatal("Failed to map Annex settings: %v", err)
|
||||||
|
}
|
||||||
|
if !sec.HasKey("DISABLE_P2PHTTP") {
|
||||||
|
// If DisableP2PHTTP is not explicitly set then use DisableHTTPGit as its default
|
||||||
|
Annex.DisableP2PHTTP = Repository.DisableHTTPGit
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,18 +3,28 @@
|
||||||
|
|
||||||
package setting
|
package setting
|
||||||
|
|
||||||
import "code.gitea.io/gitea/modules/log"
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
)
|
||||||
|
|
||||||
var Camo = struct {
|
var Camo = struct {
|
||||||
Enabled bool
|
Enabled bool
|
||||||
ServerURL string `ini:"SERVER_URL"`
|
ServerURL string `ini:"SERVER_URL"`
|
||||||
HMACKey string `ini:"HMAC_KEY"`
|
HMACKey string `ini:"HMAC_KEY"`
|
||||||
Allways bool
|
Always bool
|
||||||
}{}
|
}{}
|
||||||
|
|
||||||
func loadCamoFrom(rootCfg ConfigProvider) {
|
func loadCamoFrom(rootCfg ConfigProvider) {
|
||||||
mustMapSetting(rootCfg, "camo", &Camo)
|
mustMapSetting(rootCfg, "camo", &Camo)
|
||||||
if Camo.Enabled {
|
if Camo.Enabled {
|
||||||
|
oldValue := rootCfg.Section("camo").Key("ALLWAYS").MustString("")
|
||||||
|
if oldValue != "" {
|
||||||
|
log.Warn("camo.ALLWAYS is deprecated, use camo.ALWAYS instead")
|
||||||
|
Camo.Always, _ = strconv.ParseBool(oldValue)
|
||||||
|
}
|
||||||
|
|
||||||
if Camo.ServerURL == "" || Camo.HMACKey == "" {
|
if Camo.ServerURL == "" || Camo.HMACKey == "" {
|
||||||
log.Fatal(`Camo settings require "SERVER_URL" and HMAC_KEY`)
|
log.Fatal(`Camo settings require "SERVER_URL" and HMAC_KEY`)
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,6 +153,7 @@ func loadCommonSettingsFrom(cfg ConfigProvider) error {
|
||||||
loadCamoFrom(cfg)
|
loadCamoFrom(cfg)
|
||||||
loadI18nFrom(cfg)
|
loadI18nFrom(cfg)
|
||||||
loadGitFrom(cfg)
|
loadGitFrom(cfg)
|
||||||
|
loadAnnexFrom(cfg)
|
||||||
loadMirrorFrom(cfg)
|
loadMirrorFrom(cfg)
|
||||||
loadMarkupFrom(cfg)
|
loadMarkupFrom(cfg)
|
||||||
loadQuotaFrom(cfg)
|
loadQuotaFrom(cfg)
|
||||||
|
|
|
@ -88,6 +88,7 @@ var UI = struct {
|
||||||
Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
|
Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
|
||||||
CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`},
|
CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`},
|
||||||
CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"},
|
CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"},
|
||||||
|
ExploreDefaultSort: "recentupdate",
|
||||||
PreferredTimestampTense: "mixed",
|
PreferredTimestampTense: "mixed",
|
||||||
|
|
||||||
AmbiguousUnicodeDetection: true,
|
AmbiguousUnicodeDetection: true,
|
||||||
|
|
|
@ -362,6 +362,7 @@ type IssuePayload struct {
|
||||||
Repository *Repository `json:"repository"`
|
Repository *Repository `json:"repository"`
|
||||||
Sender *User `json:"sender"`
|
Sender *User `json:"sender"`
|
||||||
CommitID string `json:"commit_id"`
|
CommitID string `json:"commit_id"`
|
||||||
|
Label *Label `json:"label,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// JSONPayload encodes the IssuePayload to JSON, with an indentation of two spaces.
|
// JSONPayload encodes the IssuePayload to JSON, with an indentation of two spaces.
|
||||||
|
@ -399,6 +400,7 @@ type PullRequestPayload struct {
|
||||||
Sender *User `json:"sender"`
|
Sender *User `json:"sender"`
|
||||||
CommitID string `json:"commit_id"`
|
CommitID string `json:"commit_id"`
|
||||||
Review *ReviewPayload `json:"review"`
|
Review *ReviewPayload `json:"review"`
|
||||||
|
Label *Label `json:"label,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// JSONPayload FIXME
|
// JSONPayload FIXME
|
||||||
|
|
|
@ -34,7 +34,7 @@ func AvatarHTML(src string, size int, class, name string) template.HTML {
|
||||||
name = "avatar"
|
name = "avatar"
|
||||||
}
|
}
|
||||||
|
|
||||||
return template.HTML(`<img class="` + class + `" src="` + src + `" title="` + html.EscapeString(name) + `" width="` + sizeStr + `" height="` + sizeStr + `"/>`)
|
return template.HTML(`<img loading="lazy" class="` + class + `" src="` + src + `" title="` + html.EscapeString(name) + `" width="` + sizeStr + `" height="` + sizeStr + `"/>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avatar renders user avatars. args: user, size (int), class (string)
|
// Avatar renders user avatars. args: user, size (int), class (string)
|
||||||
|
|
|
@ -131,6 +131,8 @@ var ignoredErrorMessage = []string{
|
||||||
`:SSHLog() [E] ssh: Not allowed to push to protected branch protected. HookPreReceive(last) failed: internal API error response, status=403`,
|
`:SSHLog() [E] ssh: Not allowed to push to protected branch protected. HookPreReceive(last) failed: internal API error response, status=403`,
|
||||||
// TestGit/HTTP/BranchProtectMerge
|
// TestGit/HTTP/BranchProtectMerge
|
||||||
`:SSHLog() [E] ssh: branch protected is protected from force push. HookPreReceive(last) failed: internal API error response, status=403`,
|
`:SSHLog() [E] ssh: branch protected is protected from force push. HookPreReceive(last) failed: internal API error response, status=403`,
|
||||||
|
// TestGit/HTTP/BranchProtect
|
||||||
|
`:SSHLog() [E] ssh: branch before-create-2 is protected from changing file protected-file-data-`,
|
||||||
// TestGit/HTTP/MergeFork/CreatePRAndMerge
|
// TestGit/HTTP/MergeFork/CreatePRAndMerge
|
||||||
`:DeleteBranchPost() [E] DeleteBranch: GetBranch: branch does not exist [repo_id: 1099 name: user2:master]`, // sqlite
|
`:DeleteBranchPost() [E] DeleteBranch: GetBranch: branch does not exist [repo_id: 1099 name: user2:master]`, // sqlite
|
||||||
"s/web/repo/branch.go:108:DeleteBranchPost() [E] DeleteBranch: GetBranch: branch does not exist [repo_id: 10000 name: user2:master]", // mysql
|
"s/web/repo/branch.go:108:DeleteBranchPost() [E] DeleteBranch: GetBranch: branch does not exist [repo_id: 10000 name: user2:master]", // mysql
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
@ -41,10 +43,43 @@ func Remove(name string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveAll removes the named file or (empty) directory with at most 5 attempts.
|
// RemoveAll removes the named file or directory with at most 5 attempts.
|
||||||
func RemoveAll(name string) error {
|
func RemoveAll(name string) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
for i := 0; i < 5; i++ {
|
for i := 0; i < 5; i++ {
|
||||||
|
// Do chmod -R +w to help ensure the removal succeeds.
|
||||||
|
// In particular, in the git-annex case, this handles
|
||||||
|
// https://git-annex.branchable.com/internals/lockdown/ :
|
||||||
|
//
|
||||||
|
// > (The only bad consequence of this is that rm -rf .git
|
||||||
|
// > doesn't work unless you first run chmod -R +w .git)
|
||||||
|
|
||||||
|
err = filepath.WalkDir(name, func(path string, d fs.DirEntry, err error) error {
|
||||||
|
// NB: this is called WalkDir but it works on a single file too
|
||||||
|
if err == nil {
|
||||||
|
info, err := d.Info()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't try chmod'ing symlinks (will fail with broken symlinks)
|
||||||
|
if info.Mode()&os.ModeSymlink != os.ModeSymlink {
|
||||||
|
// 0200 == u+w, in octal unix permission notation
|
||||||
|
err = os.Chmod(path, info.Mode()|0o200)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
// try again
|
||||||
|
<-time.After(100 * time.Millisecond)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
err = os.RemoveAll(name)
|
err = os.RemoveAll(name)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
break
|
break
|
||||||
|
|
|
@ -225,6 +225,15 @@ func Iif[T any](condition bool, trueVal, falseVal T) T {
|
||||||
return falseVal
|
return falseVal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IfZero returns "def" if "v" is a zero value, otherwise "v"
|
||||||
|
func IfZero[T comparable](v, def T) T {
|
||||||
|
var zero T
|
||||||
|
if v == zero {
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
func ReserveLineBreakForTextarea(input string) string {
|
func ReserveLineBreakForTextarea(input string) string {
|
||||||
// Since the content is from a form which is a textarea, the line endings are \r\n.
|
// Since the content is from a form which is a textarea, the line endings are \r\n.
|
||||||
// It's a standard behavior of HTML.
|
// It's a standard behavior of HTML.
|
||||||
|
|
|
@ -142,6 +142,11 @@ filter.not_fork = ليست اشتقاقات
|
||||||
filter.not_archived = ليس مؤرشف
|
filter.not_archived = ليس مؤرشف
|
||||||
filter.public = علني
|
filter.public = علني
|
||||||
filter.private = خاص
|
filter.private = خاص
|
||||||
|
new_repo.title = مستودع جديد
|
||||||
|
new_migrate.title = انتقال جديد
|
||||||
|
new_org.title = منظمة جديدة
|
||||||
|
new_repo.link = مستودع جديد
|
||||||
|
new_migrate.link = انتقال جديد
|
||||||
|
|
||||||
[install]
|
[install]
|
||||||
db_name = اسم قاعدة البيانات
|
db_name = اسم قاعدة البيانات
|
||||||
|
@ -1982,4 +1987,10 @@ match_tooltip = قم بتضمين النتائج التي تطابق مصطلح
|
||||||
repo_kind = بحث في المستودعات...
|
repo_kind = بحث في المستودعات...
|
||||||
user_kind = بحث عن المستخدمين...
|
user_kind = بحث عن المستخدمين...
|
||||||
team_kind = بحث عن الفرق ...
|
team_kind = بحث عن الفرق ...
|
||||||
code_kind = بحث في الكود...
|
code_kind = بحث في الكود...
|
||||||
|
project_kind = البحث ضمن المشاريع...
|
||||||
|
branch_kind = البحث ضمن الفروع...
|
||||||
|
no_results = لا توجد نتائج مطابقة.
|
||||||
|
issue_kind = البحث ضمن الأعطال...
|
||||||
|
pull_kind = البحث ضمن طلبات السحب...
|
||||||
|
keyword_search_unavailable = البحث من خلال الكلمات المفتاحية ليس متوفر حالياً. رجاءاً تواصل مع مشرف الموقع.
|
|
@ -168,6 +168,7 @@ versions.view_all = Вижте всички
|
||||||
dependencies = Зависимости
|
dependencies = Зависимости
|
||||||
published_by_in = Публикуван %[1]s от <a href="%[2]s">%[3]s</a> в <a href="%[4]s"><strong>%[5]s</strong></a>
|
published_by_in = Публикуван %[1]s от <a href="%[2]s">%[3]s</a> в <a href="%[4]s"><strong>%[5]s</strong></a>
|
||||||
published_by = Публикуван %[1]s от <a href="%[2]s">%[3]s</a>
|
published_by = Публикуван %[1]s от <a href="%[2]s">%[3]s</a>
|
||||||
|
generic.download = Изтеглете пакета от командния ред:
|
||||||
|
|
||||||
[tool]
|
[tool]
|
||||||
hours = %d часа
|
hours = %d часа
|
||||||
|
@ -632,9 +633,9 @@ editor.file_delete_success = Файлът „%s“ е изтрит.
|
||||||
projects.type.uncategorized = Некатегоризирано
|
projects.type.uncategorized = Некатегоризирано
|
||||||
projects.column.set_default = Задаване по подразбиране
|
projects.column.set_default = Задаване по подразбиране
|
||||||
projects.column.assigned_to = Възложено на
|
projects.column.assigned_to = Възложено на
|
||||||
issues.reopen_comment_issue = Коментиране и отваряне
|
issues.reopen_comment_issue = Отваряне наново с коментар
|
||||||
issues.reopen_issue = Отваряне наново
|
issues.reopen_issue = Отваряне наново
|
||||||
issues.close_comment_issue = Коментиране и Затваряне
|
issues.close_comment_issue = Затваряне с коментар
|
||||||
milestones.filter_sort.latest_due_date = Най-далечен краен срок
|
milestones.filter_sort.latest_due_date = Най-далечен краен срок
|
||||||
diff.view_file = Преглед на файла
|
diff.view_file = Преглед на файла
|
||||||
release.deletion_success = Изданието е изтрито.
|
release.deletion_success = Изданието е изтрито.
|
||||||
|
@ -940,7 +941,7 @@ pulls.approve_count_1 = %d одобрение
|
||||||
pulls.can_auto_merge_desc = Тази заявка за сливане може да бъде слята автоматично.
|
pulls.can_auto_merge_desc = Тази заявка за сливане може да бъде слята автоматично.
|
||||||
pulls.num_conflicting_files_1 = %d конфликтен файл
|
pulls.num_conflicting_files_1 = %d конфликтен файл
|
||||||
activity.git_stats_commit_n = %d подавания
|
activity.git_stats_commit_n = %d подавания
|
||||||
settings.event_issues = Задачи
|
settings.event_issues = Модификация
|
||||||
branch.delete_head = Изтриване
|
branch.delete_head = Изтриване
|
||||||
branch.delete = Изтриване на клона „%s“
|
branch.delete = Изтриване на клона „%s“
|
||||||
branch.delete_html = Изтриване на клона
|
branch.delete_html = Изтриване на клона
|
||||||
|
@ -1020,7 +1021,7 @@ pulls.title_desc_one = иска да слее %[1]d подаване от <code>
|
||||||
pulls.showing_specified_commit_range = Показани са само промените между %[1]s..%[2]s
|
pulls.showing_specified_commit_range = Показани са само промените между %[1]s..%[2]s
|
||||||
pulls.merged_title_desc_one = сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s
|
pulls.merged_title_desc_one = сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s
|
||||||
pulls.no_merge_access = Не сте упълномощени за сливане на тази заявка за сливане.
|
pulls.no_merge_access = Не сте упълномощени за сливане на тази заявка за сливане.
|
||||||
activity.navbar.code_frequency = Честота на кода
|
activity.navbar.code_frequency = Честота на промените
|
||||||
activity.git_stats_pushed_1 = е изтласкал
|
activity.git_stats_pushed_1 = е изтласкал
|
||||||
activity.git_stats_push_to_branch = към %s и
|
activity.git_stats_push_to_branch = към %s и
|
||||||
contributors.contribution_type.commits = Подавания
|
contributors.contribution_type.commits = Подавания
|
||||||
|
@ -1081,11 +1082,11 @@ pulls.commit_ref_at = `спомена тази заявка за сливане
|
||||||
issues.change_ref_at = `промени препратката от <b><strike>%s</strike></b> на <b>%s</b> %s`
|
issues.change_ref_at = `промени препратката от <b><strike>%s</strike></b> на <b>%s</b> %s`
|
||||||
diff.review.reject = Поискване на промени
|
diff.review.reject = Поискване на промени
|
||||||
diff.bin_not_shown = Двоичният файл не е показан.
|
diff.bin_not_shown = Двоичният файл не е показан.
|
||||||
settings.units.units = Елементи на хранилището
|
settings.units.units = Елементи
|
||||||
settings.delete_notices_fork_1 = - Разклоненията на това хранилище ще станат независими след изтриване.
|
settings.delete_notices_fork_1 = - Разклоненията на това хранилище ще станат независими след изтриване.
|
||||||
settings.actions_desc = Включване на интегрираните CI/CD pipelines с Forgejo Actions
|
settings.actions_desc = Включване на интегрираните CI/CD pipelines с Forgejo Actions
|
||||||
settings.packages_desc = Включване на регистъра на пакетите за хранилището
|
settings.packages_desc = Включване на регистъра на пакетите за хранилището
|
||||||
settings.units.add_more = Добавяне...
|
settings.units.add_more = Включване на повече
|
||||||
settings.use_external_issue_tracker = Използване на външен тракер за задачи
|
settings.use_external_issue_tracker = Използване на външен тракер за задачи
|
||||||
settings.releases_desc = Включване на изданията за хранилището
|
settings.releases_desc = Включване на изданията за хранилището
|
||||||
settings.projects_desc = Включване на проектите за хранилището
|
settings.projects_desc = Включване на проектите за хранилището
|
||||||
|
@ -1183,6 +1184,19 @@ diff.hide_file_tree = Скриване на файловото дърво
|
||||||
tag.ahead.target = в %s след този маркер
|
tag.ahead.target = в %s след този маркер
|
||||||
diff.file_image_width = Широчина
|
diff.file_image_width = Широчина
|
||||||
activity.unresolved_conv_label = Отворено
|
activity.unresolved_conv_label = Отворено
|
||||||
|
invisible_runes_line = `Този ред съдържа невидими Уникод знаци`
|
||||||
|
code.desc = Достъп до програмния код, файловете, подаванията и клоновете.
|
||||||
|
settings.branches.update_default_branch = Обновяване на стандартния клон
|
||||||
|
settings.default_branch_desc = Изберете стандартен клон за хранилището, за заявки за сливане и подавания на код:
|
||||||
|
settings.transfer.button = Прехвърляне на притежанието
|
||||||
|
settings.transfer.modal.title = Прехвърляне на притежанието
|
||||||
|
ambiguous_runes_line = `Този ред съдържа двусмислени Уникод знаци`
|
||||||
|
ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан с %[2]c [U+%04[2]X]`
|
||||||
|
invisible_runes_header = `Този файл съдържа невидими Уникод знаци`
|
||||||
|
issues.all_title = Общо
|
||||||
|
issues.new.assign_to_me = Възлагане на мен
|
||||||
|
ext_wiki = Външно уики
|
||||||
|
ext_issues = Външни задачи
|
||||||
|
|
||||||
[modal]
|
[modal]
|
||||||
confirm = Потвърждаване
|
confirm = Потвърждаване
|
||||||
|
@ -1279,6 +1293,7 @@ members.member = Участник
|
||||||
members.private_helper = Да е видим
|
members.private_helper = Да е видим
|
||||||
teams.no_desc = Този екип няма описание
|
teams.no_desc = Този екип няма описание
|
||||||
settings.delete_org_desc = Тази организация ще бъде изтрита перманентно. Продължаване?
|
settings.delete_org_desc = Тази организация ще бъде изтрита перманентно. Продължаване?
|
||||||
|
open_dashboard = Отваряне на таблото
|
||||||
|
|
||||||
[install]
|
[install]
|
||||||
admin_password = Парола
|
admin_password = Парола
|
||||||
|
@ -1378,6 +1393,7 @@ followers.title.few = Последователи
|
||||||
followers.title.one = Последовател
|
followers.title.one = Последовател
|
||||||
following.title.one = Следван
|
following.title.one = Следван
|
||||||
following.title.few = Следвани
|
following.title.few = Следвани
|
||||||
|
public_activity.visibility_hint.self_public = Вашата дейност е видима за всички, с изключение на взаимодействията в частни пространства. <a href="%s">Конфигуриране</a>.
|
||||||
|
|
||||||
[home]
|
[home]
|
||||||
filter = Други филтри
|
filter = Други филтри
|
||||||
|
@ -1544,6 +1560,8 @@ push_tag = изтласка маркер <a href="%[2]s">%[3]s</a> към <a hre
|
||||||
approve_pull_request = `одобри <a href="%[1]s">%[3]s#%[2]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>`
|
reject_pull_request = `предложи промени за <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
compare_branch = Сравняване
|
compare_branch = Сравняване
|
||||||
|
compare_commits_general = Сравняване на подавания
|
||||||
|
compare_commits = Сравнете %d подавания
|
||||||
|
|
||||||
[auth]
|
[auth]
|
||||||
tab_openid = OpenID
|
tab_openid = OpenID
|
||||||
|
@ -1572,6 +1590,12 @@ tab_signin = Влизане
|
||||||
tab_signup = Регистриране
|
tab_signup = Регистриране
|
||||||
password_pwned = Паролата, която сте избрали, е в <a target="_blank" rel="noopener noreferrer" href="%s">списък с откраднати пароли</a>, разкрити преди това при публични пробиви на данни. Моля, опитайте отново с различна парола.
|
password_pwned = Паролата, която сте избрали, е в <a target="_blank" rel="noopener noreferrer" href="%s">списък с откраднати пароли</a>, разкрити преди това при публични пробиви на данни. Моля, опитайте отново с различна парола.
|
||||||
confirmation_mail_sent_prompt = Ново ел. писмо за потвърждение е изпратено до <b>%s</b>. За да завършите процеса на регистрация, моля, проверете входящата си кутия и последвайте предоставената връзка в рамките на следващите %s. Ако адресът за ел. поща е неправилен, можете да влезете и да поискате друго ел. писмо за потвърждение да бъде изпратено на различен адрес.
|
confirmation_mail_sent_prompt = Ново ел. писмо за потвърждение е изпратено до <b>%s</b>. За да завършите процеса на регистрация, моля, проверете входящата си кутия и последвайте предоставената връзка в рамките на следващите %s. Ако адресът за ел. поща е неправилен, можете да влезете и да поискате друго ел. писмо за потвърждение да бъде изпратено на различен адрес.
|
||||||
|
hint_login = Вече имате акаунт? <a href="%s">Влезте!</a>
|
||||||
|
hint_register = Нуждаете се от акаунт? <a href="%s">Регистрирайте се.</a>
|
||||||
|
sign_up_button = Регистрирайте се.
|
||||||
|
back_to_sign_in = Назад към Вход
|
||||||
|
sign_in_openid = Продължаване с OpenID
|
||||||
|
send_reset_mail = Изпращане на ел. писмо за възстановяване
|
||||||
|
|
||||||
[aria]
|
[aria]
|
||||||
footer.software = Относно този софтуер
|
footer.software = Относно този софтуер
|
||||||
|
@ -1582,7 +1606,7 @@ footer = Долен колонтитул
|
||||||
install = Лесен за инсталиране
|
install = Лесен за инсталиране
|
||||||
lightweight = Лек
|
lightweight = Лек
|
||||||
license = Отворен код
|
license = Отворен код
|
||||||
install_desc = Просто <a target="_blank" rel="noopener noreferrer" href="%[1]s">стартирайте двоичния файл</a> за вашата платформа, използвайте <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>, или го получете <a target="_blank" rel="noopener noreferrer" href="%[3]s">пакетирано</a>.
|
install_desc = Просто <a target="_blank" rel="noopener noreferrer" href="%[1]s">стартирайте двоичния файл</a> за вашата платформа, използвайте <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>, или го получете <a target="_blank" rel="noopener noreferrer" href="%[3]s">пакетиран</a>.
|
||||||
app_desc = Безпроблемна Git услуга със самостоятелен хостинг
|
app_desc = Безпроблемна Git услуга със самостоятелен хостинг
|
||||||
platform = Междуплатформен
|
platform = Междуплатформен
|
||||||
lightweight_desc = Forgejo има ниски минимални изисквания и може да работи на икономичен Raspberry Pi. Спестете енергията на вашата машина!
|
lightweight_desc = Forgejo има ниски минимални изисквания и може да работи на икономичен Raspberry Pi. Спестете енергията на вашата машина!
|
||||||
|
@ -1670,6 +1694,7 @@ contributors.what = приноси
|
||||||
recent_commits.what = скорошни подавания
|
recent_commits.what = скорошни подавания
|
||||||
component_loading = Зареждане на %s...
|
component_loading = Зареждане на %s...
|
||||||
component_loading_info = Това може да отнеме известно време…
|
component_loading_info = Това може да отнеме известно време…
|
||||||
|
code_frequency.what = честота на промените
|
||||||
|
|
||||||
[projects]
|
[projects]
|
||||||
type-1.display_name = Индивидуален проект
|
type-1.display_name = Индивидуален проект
|
||||||
|
|
|
@ -33,7 +33,7 @@ password=Heslo
|
||||||
access_token=Přístupový token
|
access_token=Přístupový token
|
||||||
re_type=Potvrzení hesla
|
re_type=Potvrzení hesla
|
||||||
captcha=CAPTCHA
|
captcha=CAPTCHA
|
||||||
twofa=Dvoufaktorové ověřování
|
twofa=Dvoufázové ověření
|
||||||
twofa_scratch=Dvoufaktorový kód
|
twofa_scratch=Dvoufaktorový kód
|
||||||
passcode=Přístupový kód
|
passcode=Přístupový kód
|
||||||
|
|
||||||
|
@ -434,7 +434,7 @@ non_local_account=Externě ověřovaní uživatelé nemohou změnit své heslo p
|
||||||
verify=Ověřit
|
verify=Ověřit
|
||||||
scratch_code=Záložní kód
|
scratch_code=Záložní kód
|
||||||
use_scratch_code=Použít záložní kód
|
use_scratch_code=Použít záložní kód
|
||||||
twofa_scratch_used=Použili jste váš záložní kód. Byli jste přesměrování na stránku s nastavením dvoufaktorového ověřování, kde můžete odstranit registraci vašeho zařízení nebo vygenerovat nový záložní kód.
|
twofa_scratch_used=Použili jste svůj záložní kód. Byli jste přesměrování na stránku s nastavením dvoufázového ověření, kde můžete odstranit registraci vašeho zařízení nebo vygenerovat nový záložní kód.
|
||||||
twofa_passcode_incorrect=Vaše heslo je neplatné. Pokud jste ztratili vaše zařízení, použijte záložní kód k přihlášení.
|
twofa_passcode_incorrect=Vaše heslo je neplatné. Pokud jste ztratili vaše zařízení, použijte záložní kód k přihlášení.
|
||||||
twofa_scratch_token_incorrect=Váš záložní kód není správný.
|
twofa_scratch_token_incorrect=Váš záložní kód není správný.
|
||||||
login_userpass=Přihlásit se
|
login_userpass=Přihlásit se
|
||||||
|
@ -478,6 +478,8 @@ hint_register = Nemáte účet? <a href="%s">Zaregistrujte se nyní.</a>
|
||||||
sign_up_button = Zaregistrujte se nyní.
|
sign_up_button = Zaregistrujte se nyní.
|
||||||
back_to_sign_in = Zpět na přihlášení
|
back_to_sign_in = Zpět na přihlášení
|
||||||
sign_in_openid = Pokračovat s OpenID
|
sign_in_openid = Pokračovat s OpenID
|
||||||
|
unauthorized_credentials = Údaje jsou nesprávné nebo vypršely. Opakujte svůj příkaz nebo se podívejte na %s pro více informací
|
||||||
|
use_onetime_code = Použít jednorázový kód
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Zobrazit na %s
|
view_it_on=Zobrazit na %s
|
||||||
|
@ -488,11 +490,11 @@ hi_user_x=Ahoj <b>%s</b>,
|
||||||
activate_account=Prosíme, aktivujte si váš účet
|
activate_account=Prosíme, aktivujte si váš účet
|
||||||
activate_account.title=%s, prosím aktivujte si váš účet
|
activate_account.title=%s, prosím aktivujte si váš účet
|
||||||
activate_account.text_1=Ahoj <b>%[1]s</b>, děkujeme za registraci na %[2]s!
|
activate_account.text_1=Ahoj <b>%[1]s</b>, děkujeme za registraci na %[2]s!
|
||||||
activate_account.text_2=Pro aktivaci vašeho účtu do <b>%s</b> klikněte na následující odkaz:
|
activate_account.text_2=Pro aktivaci vašeho účtu klikněte <b>%s</b> na následující odkaz :
|
||||||
|
|
||||||
activate_email=Ověřte vaši e-mailovou adresu
|
activate_email=Ověřte vaši e-mailovou adresu
|
||||||
activate_email.title=%s, prosím ověřte vaši e-mailovou adresu
|
activate_email.title=%s, prosím ověřte vaši e-mailovou adresu
|
||||||
activate_email.text=Pro aktivaci vašeho účtu do <b>%s</b> klikněte na následující odkaz:
|
activate_email.text=Pro ověření vaší e-mailové adresy klikněte <b>%s</b> na následující odkaz:
|
||||||
|
|
||||||
register_notify=Vítejte v %s
|
register_notify=Vítejte v %s
|
||||||
register_notify.title=%[1]s vítejte v %[2]s
|
register_notify.title=%[1]s vítejte v %[2]s
|
||||||
|
@ -622,7 +624,7 @@ repository_files_already_exist.adopt=Soubory pro tento repozitář již existuj
|
||||||
repository_files_already_exist.delete=Soubory pro tento repozitář již existují. Musíte je odstranit.
|
repository_files_already_exist.delete=Soubory pro tento repozitář již existují. Musíte je odstranit.
|
||||||
repository_files_already_exist.adopt_or_delete=Soubory pro tento repozitář již existují. Přijměte je, nebo je odstraňte.
|
repository_files_already_exist.adopt_or_delete=Soubory pro tento repozitář již existují. Přijměte je, nebo je odstraňte.
|
||||||
visit_rate_limit=Dosaženo limitu rychlosti dotazů při vzdáleném přístupu.
|
visit_rate_limit=Dosaženo limitu rychlosti dotazů při vzdáleném přístupu.
|
||||||
2fa_auth_required=Vzdálený přístup vyžaduje dvoufaktorové ověřování.
|
2fa_auth_required=Vzdálený přístup vyžaduje dvoufázové ověření.
|
||||||
org_name_been_taken=Název organizace je již použit.
|
org_name_been_taken=Název organizace je již použit.
|
||||||
team_name_been_taken=Název týmu je již použit.
|
team_name_been_taken=Název týmu je již použit.
|
||||||
team_no_units_error=Povolit přístup alespoň do jedné sekce repozitáře.
|
team_no_units_error=Povolit přístup alespoň do jedné sekce repozitáře.
|
||||||
|
@ -718,6 +720,7 @@ public_activity.visibility_hint.self_private = Vaše aktivita je viditelná pouz
|
||||||
public_activity.visibility_hint.admin_private = Tato aktivita je pro vás viditelná, protože jste administrátor, ale uživatel chce, aby zůstala soukromá.
|
public_activity.visibility_hint.admin_private = Tato aktivita je pro vás viditelná, protože jste administrátor, ale uživatel chce, aby zůstala soukromá.
|
||||||
public_activity.visibility_hint.self_public = Vaše aktivita je viditelná všem, mimo interakcí v soukromých prostorech. <a href="%s">Nastavení</a>.
|
public_activity.visibility_hint.self_public = Vaše aktivita je viditelná všem, mimo interakcí v soukromých prostorech. <a href="%s">Nastavení</a>.
|
||||||
public_activity.visibility_hint.admin_public = Tato aktivita je viditelná všem, ale jako administrátor také můžete vidět interakce v soukromých prostorech.
|
public_activity.visibility_hint.admin_public = Tato aktivita je viditelná všem, ale jako administrátor také můžete vidět interakce v soukromých prostorech.
|
||||||
|
public_activity.visibility_hint.self_private_profile = Vaše aktivita je viditelná pouze vám a správcům instance, protože váš profil je soukromý. <a href="%s">Nastavit</a>.
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
profile=Profil
|
profile=Profil
|
||||||
|
@ -732,11 +735,11 @@ applications=Aplikace
|
||||||
orgs=Organizace
|
orgs=Organizace
|
||||||
repos=Repozitáře
|
repos=Repozitáře
|
||||||
delete=Smazat účet
|
delete=Smazat účet
|
||||||
twofa=Dvoufaktorové ověřování (TOTP)
|
twofa=Dvoufázové ověření (TOTP)
|
||||||
account_link=Propojené účty
|
account_link=Propojené účty
|
||||||
organization=Organizace
|
organization=Organizace
|
||||||
uid=UID
|
uid=UID
|
||||||
webauthn=Dvoufaktorové ověřování (bezpečnostní klíče)
|
webauthn=Dvoufázové ověření (bezpečnostní klíče)
|
||||||
|
|
||||||
public_profile=Veřejný profil
|
public_profile=Veřejný profil
|
||||||
biography_placeholder=Řekněte nám něco o sobě! (Můžete použít Markdown)
|
biography_placeholder=Řekněte nám něco o sobě! (Můžete použít Markdown)
|
||||||
|
@ -806,7 +809,7 @@ manage_emails=Správa e-mailových adres
|
||||||
manage_themes=Výchozí motiv
|
manage_themes=Výchozí motiv
|
||||||
manage_openid=Adresy OpenID
|
manage_openid=Adresy OpenID
|
||||||
email_desc=Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla, a pokud není skrytá, pro operace Gitu.
|
email_desc=Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla, a pokud není skrytá, pro operace Gitu.
|
||||||
theme_desc=Toto bude váš výchozí motiv vzhledu napříč stránkou.
|
theme_desc=Toto bude váš výchozí motiv vzhledu na tomto webu.
|
||||||
primary=Hlavní
|
primary=Hlavní
|
||||||
activated=Aktivován
|
activated=Aktivován
|
||||||
requires_activation=Vyžaduje aktivaci
|
requires_activation=Vyžaduje aktivaci
|
||||||
|
@ -842,8 +845,8 @@ add_key=Přidat klíč
|
||||||
ssh_desc=Tyto veřejné klíče SSH jsou propojeny s vaším účtem. Odpovídající soukromé klíče umožní plný přístup k vašim repozitářům. Klíče SSH, které byly ověřeny, mohou být použity pro ověření Git commitů podepsaných přes SSH.
|
ssh_desc=Tyto veřejné klíče SSH jsou propojeny s vaším účtem. Odpovídající soukromé klíče umožní plný přístup k vašim repozitářům. Klíče SSH, které byly ověřeny, mohou být použity pro ověření Git commitů podepsaných přes SSH.
|
||||||
principal_desc=Tyto SSH Principal certifikáty jsou přidruženy k vašemu účtu a umožňují plný přístup do vašich repozitářů.
|
principal_desc=Tyto SSH Principal certifikáty jsou přidruženy k vašemu účtu a umožňují plný přístup do vašich repozitářů.
|
||||||
gpg_desc=Tyto veřejné klíče GPG jsou propojeny s vaším účtem a používají se k ověření vašich commitů. Uložte je na bezpečné místo, jelikož umožňují podepsat commity vaší identitou.
|
gpg_desc=Tyto veřejné klíče GPG jsou propojeny s vaším účtem a používají se k ověření vašich commitů. Uložte je na bezpečné místo, jelikož umožňují podepsat commity vaší identitou.
|
||||||
ssh_helper=<strong>Potřebujete pomoct?</strong> Podívejte se do příručky GitHubu na to <a href="%s">vytvoření vlastních klíčů SSH</a> nebo vyřešte <a href="%s">běžné problémy</a>, se kterými se můžete potkat při použití SSH.
|
ssh_helper=<strong>Potřebujete pomoct?</strong> Podívejte se do příručky, jak <a href="%s">vytvořit vlastní klíče SSH</a> nebo vyřešte <a href="%s">běžné problémy</a>, se kterými se můžete potkat při použití SSH.
|
||||||
gpg_helper=<strong>Potřebujete pomoct?</strong> Podívejte se do příručky GitHubu <a href="%s">o GPG</a>.
|
gpg_helper=<strong>Potřebujete pomoct?</strong> Podívejte se do příručky <a href="%s">o GPG</a>.
|
||||||
add_new_key=Přidat klíč SSH
|
add_new_key=Přidat klíč SSH
|
||||||
add_new_gpg_key=Přidat klíč GPG
|
add_new_gpg_key=Přidat klíč GPG
|
||||||
key_content_ssh_placeholder=Začíná s „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“ nebo „sk-ssh-ed25519@openssh.com“
|
key_content_ssh_placeholder=Začíná s „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“ nebo „sk-ssh-ed25519@openssh.com“
|
||||||
|
@ -898,7 +901,7 @@ ssh_principal_deletion_success=SSH Principal certifikát byl odstraněn.
|
||||||
added_on=Přidáno %s
|
added_on=Přidáno %s
|
||||||
valid_until_date=Platné do %s
|
valid_until_date=Platné do %s
|
||||||
valid_forever=Platné navždy
|
valid_forever=Platné navždy
|
||||||
last_used=Naposledy použito dne
|
last_used=Naposledy použito
|
||||||
no_activity=Žádná aktuální aktivita
|
no_activity=Žádná aktuální aktivita
|
||||||
can_read_info=Čtení
|
can_read_info=Čtení
|
||||||
can_write_info=Zápis
|
can_write_info=Zápis
|
||||||
|
@ -928,17 +931,17 @@ access_token_deletion_cancel_action=Zrušit
|
||||||
access_token_deletion_confirm_action=Smazat
|
access_token_deletion_confirm_action=Smazat
|
||||||
access_token_deletion_desc=Smazání tokenu zruší přístup k vašemu účtu pro aplikace, které jej používají. Tuto akci nelze vrátit. Pokračovat?
|
access_token_deletion_desc=Smazání tokenu zruší přístup k vašemu účtu pro aplikace, které jej používají. Tuto akci nelze vrátit. Pokračovat?
|
||||||
delete_token_success=Token byl odstraněn. Aplikace, které jej používají již nemají přístup k vašemu účtu.
|
delete_token_success=Token byl odstraněn. Aplikace, které jej používají již nemají přístup k vašemu účtu.
|
||||||
repo_and_org_access=Repozitář a přístup organizace
|
repo_and_org_access=Přístup k repozitářům a organizacím
|
||||||
permissions_public_only=Pouze veřejnost
|
permissions_public_only=Pouze veřejné
|
||||||
permissions_access_all=Vše (veřejné, soukromé a omezené)
|
permissions_access_all=Vše (veřejné, soukromé a omezené)
|
||||||
select_permissions=Vyberte oprávnění
|
select_permissions=Vyberte oprávnění
|
||||||
permission_no_access=Bez přístupu
|
permission_no_access=Žádný přístup
|
||||||
permission_read=Přečtené
|
permission_read=Čtení
|
||||||
permission_write=Čtení a zápis
|
permission_write=Čtení a zápis
|
||||||
at_least_one_permission=Musíte vybrat alespoň jedno oprávnění pro vytvoření tokenu
|
at_least_one_permission=Musíte vybrat alespoň jedno oprávnění pro vytvoření tokenu
|
||||||
permissions_list=Oprávnění:
|
permissions_list=Oprávnění:
|
||||||
|
|
||||||
manage_oauth2_applications=Spravovat aplikace OAuth2
|
manage_oauth2_applications=Správa aplikací OAuth2
|
||||||
edit_oauth2_application=Upravit OAuth2 aplikaci
|
edit_oauth2_application=Upravit OAuth2 aplikaci
|
||||||
oauth2_applications_desc=OAuth2 aplikace umožní aplikacím třetích stran bezpečně ověřit uživatele v této instanci Forgejo.
|
oauth2_applications_desc=OAuth2 aplikace umožní aplikacím třetích stran bezpečně ověřit uživatele v této instanci Forgejo.
|
||||||
remove_oauth2_application=Odstranit OAuth2 aplikaci
|
remove_oauth2_application=Odstranit OAuth2 aplikaci
|
||||||
|
@ -949,8 +952,8 @@ create_oauth2_application_button=Vytvořit aplikaci
|
||||||
create_oauth2_application_success=Úspěšně jste vytvořili novou OAuth2 aplikaci.
|
create_oauth2_application_success=Úspěšně jste vytvořili novou OAuth2 aplikaci.
|
||||||
update_oauth2_application_success=Úspěšně jste aktualizovali OAuth2 aplikaci.
|
update_oauth2_application_success=Úspěšně jste aktualizovali OAuth2 aplikaci.
|
||||||
oauth2_application_name=Název aplikace
|
oauth2_application_name=Název aplikace
|
||||||
oauth2_confidential_client=Důvěrný klient. Zvolte jej pro aplikace, které ukládají soubor secret, například webové aplikace. Nevybírejte jej pro nativní aplikace včetně aplikací pro počítače a mobilní zařízení.
|
oauth2_confidential_client=Důvěrný klient. Vyberte pro aplikace, které udržují tajný klíč v bezpečí, například webové aplikace. Nevybírejte pro nativní aplikace včetně aplikací pro počítače a mobilní zařízení.
|
||||||
oauth2_redirect_uris=Přesměrování URI. Použijte nový řádek pro každou URI.
|
oauth2_redirect_uris=Přesměrování URI. Zadejte každou URI na vlastní řádek.
|
||||||
save_application=Uložit
|
save_application=Uložit
|
||||||
oauth2_client_id=ID klienta
|
oauth2_client_id=ID klienta
|
||||||
oauth2_client_secret=Tajný klíč klienta
|
oauth2_client_secret=Tajný klíč klienta
|
||||||
|
@ -958,12 +961,12 @@ oauth2_regenerate_secret=Obnovit tajný klíč
|
||||||
oauth2_regenerate_secret_hint=Ztratili jste svůj tajný klíč?
|
oauth2_regenerate_secret_hint=Ztratili jste svůj tajný klíč?
|
||||||
oauth2_client_secret_hint=Tajný klíč se znovu nezobrazí po opuštění nebo obnovení této stránky. Ujistěte se, že jste si jej uložili.
|
oauth2_client_secret_hint=Tajný klíč se znovu nezobrazí po opuštění nebo obnovení této stránky. Ujistěte se, že jste si jej uložili.
|
||||||
oauth2_application_edit=Upravit
|
oauth2_application_edit=Upravit
|
||||||
oauth2_application_create_description=OAuth2 aplikace poskytuje přístup aplikacím třetích stran k uživatelským účtům na této instanci.
|
oauth2_application_create_description=Aplikace OAuth2 poskytují přístup vašim aplikacím třetích stran k uživatelským účtům na této instanci.
|
||||||
oauth2_application_remove_description=Odebráním OAuth2 aplikace zabrání přístupu ověřeným uživatelům na této instanci. Pokračovat?
|
oauth2_application_remove_description=Odebráním OAuth2 aplikace zabrání přístupu ověřeným uživatelům na této instanci. Pokračovat?
|
||||||
oauth2_application_locked=Gitea předregistruje některé OAuth2 aplikace při spuštění, pokud je to povoleno v konfiguraci. Aby se zabránilo neočekávanému chování, nelze je upravovat ani odstranit. Více informací naleznete v dokumentaci OAuth2.
|
oauth2_application_locked=Gitea předregistruje některé OAuth2 aplikace při spuštění, pokud je to povoleno v konfiguraci. Aby se zabránilo neočekávanému chování, nelze je upravovat ani odstranit. Více informací naleznete v dokumentaci OAuth2.
|
||||||
|
|
||||||
authorized_oauth2_applications=Autorizovat aplikaci OAuth2
|
authorized_oauth2_applications=Autorizované aplikace OAuth2
|
||||||
authorized_oauth2_applications_description=Úspěšně jste povolili přístup k vašemu osobnímu účtu této aplikaci třetí strany. Zrušte prosím přístup aplikacím, které již nejsou používány.
|
authorized_oauth2_applications_description=Těmto aplikacím třetích stran jste udělili přístup ke svému osobnímu účtu Forgejo. Zrušte prosím přístup aplikacím, které již nejsou používány.
|
||||||
revoke_key=Zrušit
|
revoke_key=Zrušit
|
||||||
revoke_oauth2_grant=Zrušit přístup
|
revoke_oauth2_grant=Zrušit přístup
|
||||||
revoke_oauth2_grant_description=Zrušením přístupu této aplikaci třetí strany ji zabráníte v přístupu k vašim datům. Jste si jisti?
|
revoke_oauth2_grant_description=Zrušením přístupu této aplikaci třetí strany ji zabráníte v přístupu k vašim datům. Jste si jisti?
|
||||||
|
@ -971,24 +974,24 @@ revoke_oauth2_grant_success=Přístup byl úspěšně zrušen.
|
||||||
|
|
||||||
twofa_desc=Dvoufaktorový způsob ověřování zvýší zabezpečení vašeho účtu.
|
twofa_desc=Dvoufaktorový způsob ověřování zvýší zabezpečení vašeho účtu.
|
||||||
twofa_recovery_tip=Pokud ztratíte své zařízení, budete moci použít jednorázový obnovovací klíč k získání přístupu k vašemu účtu.
|
twofa_recovery_tip=Pokud ztratíte své zařízení, budete moci použít jednorázový obnovovací klíč k získání přístupu k vašemu účtu.
|
||||||
twofa_is_enrolled=Váš účet aktuálně <strong>používá</strong> dvoufaktorové ověřování.
|
twofa_is_enrolled=Váš účet aktuálně <strong>používá</strong> dvoufázové ověření.
|
||||||
twofa_not_enrolled=Váš účet aktuálně nepoužívá dvoufaktorové ověřování.
|
twofa_not_enrolled=Váš účet aktuálně nepoužívá dvoufázové ověření.
|
||||||
twofa_disable=Zakázat dvoufaktorové ověřování
|
twofa_disable=Zakázat dvoufázové ověření
|
||||||
twofa_scratch_token_regenerate=Znovu vygenerovat jednorázový klíč pro obnovení
|
twofa_scratch_token_regenerate=Znovu vygenerovat jednorázový klíč pro obnovení
|
||||||
twofa_scratch_token_regenerated=Váš jednorázový klíč pro obnovení je nyní %s. Uložte jej na bezpečné místo, protože se znovu nezobrazí.
|
twofa_scratch_token_regenerated=Váš jednorázový klíč pro obnovení je nyní %s. Uložte jej na bezpečné místo, protože se znovu nezobrazí.
|
||||||
twofa_enroll=Povolit dvoufaktorové ověřování
|
twofa_enroll=Povolit dvoufázové ověření
|
||||||
twofa_disable_note=Dvoufaktorové ověřování můžete zakázat, když bude potřeba.
|
twofa_disable_note=Dvoufázové ověření můžete v případě potřeby zakázat.
|
||||||
twofa_disable_desc=Zakážete-li dvoufaktorové ověřování, bude váš účet méně zabezpečený. Pokračovat?
|
twofa_disable_desc=Zakázáním dvoufázového ověření bude váš účet méně bezpečný. Pokračovat?
|
||||||
regenerate_scratch_token_desc=Pokud jste ztratili svůj klíč pro obnovení nebo jste jej již použili k přihlášení, můžete jej resetovat zde.
|
regenerate_scratch_token_desc=Pokud jste ztratili svůj klíč pro obnovení nebo jste jej již použili k přihlášení, můžete jej resetovat zde.
|
||||||
twofa_disabled=Dvoufaktorové ověřování bylo zakázáno.
|
twofa_disabled=Dvoufázové ověření bylo zakázáno.
|
||||||
scan_this_image=Naskenujte tento obrázek s vaší ověřovací aplikací:
|
scan_this_image=Naskenujte tento obrázek s vaší ověřovací aplikací:
|
||||||
or_enter_secret=Nebo zadejte tajný kód: %s
|
or_enter_secret=Nebo zadejte tajný kód: %s
|
||||||
then_enter_passcode=A zadejte přístupový kód zobrazený ve vaší aplikaci:
|
then_enter_passcode=A zadejte přístupový kód zobrazený ve vaší aplikaci:
|
||||||
passcode_invalid=Přístupový kód není platný. Zkuste to znovu.
|
passcode_invalid=Přístupový kód není platný. Zkuste to znovu.
|
||||||
twofa_enrolled=Ve vašem účtu bylo povoleno dvoufaktorové ověřování. Uložte si jednorázový obnovovací klíč (%s) na bezpečné místo, jelikož již nebude znovu zobrazen.
|
twofa_enrolled=Ve vašem účtu bylo povoleno dvoufázové ověření. Uložte si jednorázový obnovovací klíč (%s) na bezpečné místo, jelikož již nebude znovu zobrazen.
|
||||||
twofa_failed_get_secret=Nepodařilo se získat tajemství.
|
twofa_failed_get_secret=Nepodařilo se získat tajemství.
|
||||||
|
|
||||||
webauthn_desc=Bezpečnostní klíče jsou hardwarová zařízení obsahující kryptografické klíče. Mohou být použity pro dvoufaktorové ověřování. Bezpečnostní klíče musí podporovat <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a> standard.
|
webauthn_desc=Bezpečnostní klíče jsou hardwarová zařízení obsahující kryptografické klíče. Mohou být použity pro dvoufázové ověření. Bezpečnostní klíče musí podporovat standard <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a>.
|
||||||
webauthn_register_key=Přidat bezpečnostní klíč
|
webauthn_register_key=Přidat bezpečnostní klíč
|
||||||
webauthn_nickname=Přezdívka
|
webauthn_nickname=Přezdívka
|
||||||
webauthn_delete_key=Odebrat bezpečnostní klíč
|
webauthn_delete_key=Odebrat bezpečnostní klíč
|
||||||
|
@ -997,7 +1000,7 @@ webauthn_key_loss_warning=Pokud ztratíte své bezpečnostní klíče, ztratíte
|
||||||
webauthn_alternative_tip=Možná budete chtít nakonfigurovat další metodu ověřování.
|
webauthn_alternative_tip=Možná budete chtít nakonfigurovat další metodu ověřování.
|
||||||
|
|
||||||
manage_account_links=Propojené účty
|
manage_account_links=Propojené účty
|
||||||
manage_account_links_desc=Tyto externí účty jsou propojeny s vaším Forgejo účtem.
|
manage_account_links_desc=Tyto externí účty jsou propojeny s vaším účtem Forgejo.
|
||||||
account_links_not_available=K vašemu Forgejo účtu nejsou aktuálně připojené žádné externí účty.
|
account_links_not_available=K vašemu Forgejo účtu nejsou aktuálně připojené žádné externí účty.
|
||||||
link_account=Propojit účet
|
link_account=Propojit účet
|
||||||
remove_account_link=Odstranit propojený účet
|
remove_account_link=Odstranit propojený účet
|
||||||
|
@ -1009,7 +1012,7 @@ hooks.desc=Přidat webhooky, které budou spouštěny pro <strong>všechny repoz
|
||||||
orgs_none=Nejste členem žádné organizace.
|
orgs_none=Nejste členem žádné organizace.
|
||||||
repos_none=Nevlastníte žádné repozitáře.
|
repos_none=Nevlastníte žádné repozitáře.
|
||||||
|
|
||||||
delete_account=Odstranit svůj účet
|
delete_account=Odstranit účet
|
||||||
delete_prompt=Tato operace natrvalo odstraní váš uživatelský účet. <strong>NELZE</strong> ji vrátit zpět.
|
delete_prompt=Tato operace natrvalo odstraní váš uživatelský účet. <strong>NELZE</strong> ji vrátit zpět.
|
||||||
delete_with_all_comments=Váš účet je mladší než %s. Pro zabránění fantomovým komentářům budou společně s ním odstraněny všechny komentáře u problémů a ŽS.
|
delete_with_all_comments=Váš účet je mladší než %s. Pro zabránění fantomovým komentářům budou společně s ním odstraněny všechny komentáře u problémů a ŽS.
|
||||||
confirm_delete_account=Potvrdit odstranění
|
confirm_delete_account=Potvrdit odstranění
|
||||||
|
@ -1037,10 +1040,10 @@ access_token_desc = Oprávnění vybraného tokenu omezují autorizaci pouze na
|
||||||
blocked_users_none = Nemáte žádné zablokované uživatele.
|
blocked_users_none = Nemáte žádné zablokované uživatele.
|
||||||
blocked_since = Zablokován od %s
|
blocked_since = Zablokován od %s
|
||||||
hints = Nápovědy
|
hints = Nápovědy
|
||||||
additional_repo_units_hint = Navrhnout povolení dalších jednotek úložiště
|
additional_repo_units_hint = Navrhnout povolení dalších jednotek repozitáře
|
||||||
update_hints = Aktualizovat nápovědy
|
update_hints = Aktualizovat nápovědy
|
||||||
update_hints_success = Nápovědy byly aktualizovány.
|
update_hints_success = Nápovědy byly aktualizovány.
|
||||||
additional_repo_units_hint_description = Zobrazit tlačítko „Přidat další jednotky...“ u repozitářů, které nemají povolené všechny dostupné jednotky.
|
additional_repo_units_hint_description = Zobrazit tip „Povolit další“ u repozitářů, které nemají povolené všechny dostupné jednotky.
|
||||||
pronouns = Zájmena
|
pronouns = Zájmena
|
||||||
pronouns_custom = Vlastní
|
pronouns_custom = Vlastní
|
||||||
pronouns_unspecified = Neurčená
|
pronouns_unspecified = Neurčená
|
||||||
|
@ -1058,7 +1061,7 @@ repo_name_helper=Dobrý název repozitáře většinou používá krátká, zapa
|
||||||
repo_size=Velikost repozitáře
|
repo_size=Velikost repozitáře
|
||||||
template=Šablona
|
template=Šablona
|
||||||
template_select=Vyberte šablonu
|
template_select=Vyberte šablonu
|
||||||
template_helper=Z repozitáře vytvořit šablonu
|
template_helper=Nastavit repozitář jako šablonu
|
||||||
template_description=Šablony repozitářů umožňují uživatelům generovat nové repositáře se stejnou strukturou, soubory a volitelnými nastaveními.
|
template_description=Šablony repozitářů umožňují uživatelům generovat nové repositáře se stejnou strukturou, soubory a volitelnými nastaveními.
|
||||||
visibility=Viditelnost
|
visibility=Viditelnost
|
||||||
visibility_description=Pouze majitelé nebo členové organizace to budou moci vidět, pokud mají práva.
|
visibility_description=Pouze majitelé nebo členové organizace to budou moci vidět, pokud mají práva.
|
||||||
|
@ -1069,7 +1072,7 @@ clone_helper=Potřebujete pomoci s klonováním? Navštivte <a target="_blank" r
|
||||||
fork_repo=Fork repozitáře
|
fork_repo=Fork repozitáře
|
||||||
fork_from=Fork z
|
fork_from=Fork z
|
||||||
already_forked=Již jsi rozštěpil %s
|
already_forked=Již jsi rozštěpil %s
|
||||||
fork_to_different_account=Rozštěpit na jiný účet
|
fork_to_different_account=Vytvořit fork na jiném účtu
|
||||||
fork_visibility_helper=Viditelnost rozštěpeného repozitáře nemůže být změněna.
|
fork_visibility_helper=Viditelnost rozštěpeného repozitáře nemůže být změněna.
|
||||||
fork_branch=Větev, která má být klonována pro fork
|
fork_branch=Větev, která má být klonována pro fork
|
||||||
all_branches=Všechny větve
|
all_branches=Všechny větve
|
||||||
|
@ -1165,7 +1168,7 @@ template.items=Položky šablony
|
||||||
template.git_content=Obsah Gitu (výchozí větev)
|
template.git_content=Obsah Gitu (výchozí větev)
|
||||||
template.git_hooks=Git hooks
|
template.git_hooks=Git hooks
|
||||||
template.git_hooks_tooltip=Momentálně nemůžete po přidání upravovat nebo odebírat Git hooky. Vyberte pouze v případě, že důvěřujete šabloně repozitáře.
|
template.git_hooks_tooltip=Momentálně nemůžete po přidání upravovat nebo odebírat Git hooky. Vyberte pouze v případě, že důvěřujete šabloně repozitáře.
|
||||||
template.webhooks=Webové háčky
|
template.webhooks=Webhooky
|
||||||
template.topics=Témata
|
template.topics=Témata
|
||||||
template.avatar=Avatar
|
template.avatar=Avatar
|
||||||
template.issue_labels=Štítky problémů
|
template.issue_labels=Štítky problémů
|
||||||
|
@ -1238,7 +1241,7 @@ migrate.cancel_migrating_confirm=Chcete zrušit tuto migraci?
|
||||||
mirror_from=zrcadlo
|
mirror_from=zrcadlo
|
||||||
forked_from=rozštěpen z
|
forked_from=rozštěpen z
|
||||||
generated_from=generováno z
|
generated_from=generováno z
|
||||||
fork_from_self=Nemůžete rozštěpit váš vlastní repozitář.
|
fork_from_self=Nemůžete vytvořit fork vašeho vlastního repozitáře.
|
||||||
fork_guest_user=Přihlaste se pro vytvoření forku tohoto repozitáře.
|
fork_guest_user=Přihlaste se pro vytvoření forku tohoto repozitáře.
|
||||||
watch_guest_user=Pro sledování tohoto repozitáře se přihlaste.
|
watch_guest_user=Pro sledování tohoto repozitáře se přihlaste.
|
||||||
star_guest_user=Pro hodnocení tohoto repozitáře se přihlaste.
|
star_guest_user=Pro hodnocení tohoto repozitáře se přihlaste.
|
||||||
|
@ -1246,7 +1249,7 @@ unwatch=Přestat sledovat
|
||||||
watch=Sledovat
|
watch=Sledovat
|
||||||
unstar=Oblíbené
|
unstar=Oblíbené
|
||||||
star=Oblíbit
|
star=Oblíbit
|
||||||
fork=Rozštěpit
|
fork=Fork
|
||||||
download_archive=Stáhnout repozitář
|
download_archive=Stáhnout repozitář
|
||||||
more_operations=Další operace
|
more_operations=Další operace
|
||||||
|
|
||||||
|
@ -1308,6 +1311,7 @@ view_git_blame=Zobrazit git blame
|
||||||
video_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „video“.
|
video_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „video“.
|
||||||
audio_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „audio“.
|
audio_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „audio“.
|
||||||
stored_lfs=Uloženo pomocí Git LFS
|
stored_lfs=Uloženo pomocí Git LFS
|
||||||
|
stored_annex=Uloženo pomocí Git Annex
|
||||||
symbolic_link=Symbolický odkaz
|
symbolic_link=Symbolický odkaz
|
||||||
executable_file=Spustitelný soubor
|
executable_file=Spustitelný soubor
|
||||||
vendored=Vendorováno
|
vendored=Vendorováno
|
||||||
|
@ -1333,11 +1337,12 @@ editor.upload_file=Nahrát soubor
|
||||||
editor.edit_file=Upravit soubor
|
editor.edit_file=Upravit soubor
|
||||||
editor.preview_changes=Náhled změn
|
editor.preview_changes=Náhled změn
|
||||||
editor.cannot_edit_lfs_files=LFS soubory nemohou být upravovány přes webové rozhraní.
|
editor.cannot_edit_lfs_files=LFS soubory nemohou být upravovány přes webové rozhraní.
|
||||||
|
editor.cannot_edit_annex_files=Annex soubory nemohou být upravovány přes webové rozhraní.
|
||||||
editor.cannot_edit_non_text_files=Binární soubory nemohou být upravovány přes webové rozhraní.
|
editor.cannot_edit_non_text_files=Binární soubory nemohou být upravovány přes webové rozhraní.
|
||||||
editor.edit_this_file=Upravit soubor
|
editor.edit_this_file=Upravit soubor
|
||||||
editor.this_file_locked=Soubor je uzamčen
|
editor.this_file_locked=Soubor je uzamčen
|
||||||
editor.must_be_on_a_branch=Musíte mít zvolenu větev pro úpravu či návrh změn tohoto souboru.
|
editor.must_be_on_a_branch=Musíte mít zvolenu větev pro úpravu či návrh změn tohoto souboru.
|
||||||
editor.fork_before_edit=Musíte rozštěpit tento repozitář pro vytvoření nebo navržení změny tohoto souboru.
|
editor.fork_before_edit=Pro vytvoření nebo navržení změn v tomto souboru musíte vytvořit fork tohoto repozitáře.
|
||||||
editor.delete_this_file=Odstranit soubor
|
editor.delete_this_file=Odstranit soubor
|
||||||
editor.must_have_write_access=Musíte mít přístup pro zápis pro dělání či navrhování změn tohoto souboru.
|
editor.must_have_write_access=Musíte mít přístup pro zápis pro dělání či navrhování změn tohoto souboru.
|
||||||
editor.file_delete_success=Soubor „%s“ byl odstraněn.
|
editor.file_delete_success=Soubor „%s“ byl odstraněn.
|
||||||
|
@ -1345,9 +1350,9 @@ editor.name_your_file=Pojmenujte váš soubor…
|
||||||
editor.filename_help=Přidejte adresář zapsáním jeho jména následovaného lomítkem („/“). Adresář odeberete stiskem backspace na začátku vstupního pole.
|
editor.filename_help=Přidejte adresář zapsáním jeho jména následovaného lomítkem („/“). Adresář odeberete stiskem backspace na začátku vstupního pole.
|
||||||
editor.or=nebo
|
editor.or=nebo
|
||||||
editor.cancel_lower=Zrušit
|
editor.cancel_lower=Zrušit
|
||||||
editor.commit_signed_changes=Commitnout podepsané změny
|
editor.commit_signed_changes=Odeslat podepsané změny
|
||||||
editor.commit_changes=Commitnout změny
|
editor.commit_changes=Odeslat změny
|
||||||
editor.add_tmpl=Přidat „<nazevsouboru>“
|
editor.add_tmpl=Přidán „<filename>“
|
||||||
editor.add=Přidat %s
|
editor.add=Přidat %s
|
||||||
editor.update=Aktualizovat %s
|
editor.update=Aktualizovat %s
|
||||||
editor.delete=Odstranit %s
|
editor.delete=Odstranit %s
|
||||||
|
@ -1357,7 +1362,7 @@ editor.fail_to_apply_patch=Nelze použít záplatu „%s“
|
||||||
editor.new_patch=Nová záplata
|
editor.new_patch=Nová záplata
|
||||||
editor.commit_message_desc=Přidat volitelný rozšířený popis…
|
editor.commit_message_desc=Přidat volitelný rozšířený popis…
|
||||||
editor.signoff_desc=Přidat Signed-off-by podpis přispěvatele na konec zprávy o commitu.
|
editor.signoff_desc=Přidat Signed-off-by podpis přispěvatele na konec zprávy o commitu.
|
||||||
editor.commit_directly_to_this_branch=Odevzdat přímo do větve <strong class="branch-name">%s</strong>.
|
editor.commit_directly_to_this_branch=Odeslat přímo do větve <strong class="branch-name">%s</strong>.
|
||||||
editor.create_new_branch=Vytvořit <strong>novou větev</strong> pro tento commit a vytvořit žádost o sloučení.
|
editor.create_new_branch=Vytvořit <strong>novou větev</strong> pro tento commit a vytvořit žádost o sloučení.
|
||||||
editor.create_new_branch_np=Vytvořte <strong>novou větev</strong> z tohoto commitu.
|
editor.create_new_branch_np=Vytvořte <strong>novou větev</strong> z tohoto commitu.
|
||||||
editor.propose_file_change=Navrhnout změnu souboru
|
editor.propose_file_change=Navrhnout změnu souboru
|
||||||
|
@ -1375,8 +1380,8 @@ editor.file_editing_no_longer_exists=Upravovaný soubor „%s“ již není sou
|
||||||
editor.file_deleting_no_longer_exists=Odstraňovaný soubor „%s“ již není součástí tohoto repozitáře.
|
editor.file_deleting_no_longer_exists=Odstraňovaný soubor „%s“ již není součástí tohoto repozitáře.
|
||||||
editor.file_changed_while_editing=Obsah souboru se od zahájení úprav změnil. <a target="_blank" rel="noopener noreferrer" href="%s">Klikněte sem</a> pro jejich zobrazení nebo <strong>proveďte commit změn ještě jednou</strong> pro jejich přepsání.
|
editor.file_changed_while_editing=Obsah souboru se od zahájení úprav změnil. <a target="_blank" rel="noopener noreferrer" href="%s">Klikněte sem</a> pro jejich zobrazení nebo <strong>proveďte commit změn ještě jednou</strong> pro jejich přepsání.
|
||||||
editor.file_already_exists=Soubor „%s“ již existuje v tomto repozitáři.
|
editor.file_already_exists=Soubor „%s“ již existuje v tomto repozitáři.
|
||||||
editor.commit_empty_file_header=Odevzdat prázdný soubor
|
editor.commit_empty_file_header=Odeslat prázdný soubor
|
||||||
editor.commit_empty_file_text=Soubor, který se chystáte odevzdat, je prázdný. Pokračovat?
|
editor.commit_empty_file_text=Soubor, který se chystáte odeslat, je prázdný. Pokračovat?
|
||||||
editor.no_changes_to_show=Žádné změny k zobrazení.
|
editor.no_changes_to_show=Žádné změny k zobrazení.
|
||||||
editor.fail_to_update_file=Nepodařilo se aktualizovat/vytvořit soubor „%s“.
|
editor.fail_to_update_file=Nepodařilo se aktualizovat/vytvořit soubor „%s“.
|
||||||
editor.fail_to_update_file_summary=Chybová zpráva:
|
editor.fail_to_update_file_summary=Chybová zpráva:
|
||||||
|
@ -1386,9 +1391,9 @@ editor.push_rejected_summary=Úplná zpráva o zamítnutí:
|
||||||
editor.add_subdir=Přidat adresář…
|
editor.add_subdir=Přidat adresář…
|
||||||
editor.unable_to_upload_files=Nepodařilo se nahrát soubory do „%s“. Chyba: %v
|
editor.unable_to_upload_files=Nepodařilo se nahrát soubory do „%s“. Chyba: %v
|
||||||
editor.upload_file_is_locked=Soubor „%s“ je uzamčen uživatelem %s.
|
editor.upload_file_is_locked=Soubor „%s“ je uzamčen uživatelem %s.
|
||||||
editor.upload_files_to_dir=Nahrát soubory do „%s“
|
editor.upload_files_to_dir=Nahrány soubory do „%s“
|
||||||
editor.cannot_commit_to_protected_branch=Nelze vytvořit commit v chráněné větvi „%s“.
|
editor.cannot_commit_to_protected_branch=Nelze vytvořit commit v chráněné větvi „%s“.
|
||||||
editor.no_commit_to_branch=Nelze odevzdat přímo do větve, protože:
|
editor.no_commit_to_branch=Nepodařilo se odeslat přímo do větve:
|
||||||
editor.user_no_push_to_branch=Uživatel nemůže nahrávat do větve
|
editor.user_no_push_to_branch=Uživatel nemůže nahrávat do větve
|
||||||
editor.require_signed_commit=Větev vyžaduje podepsaný commit
|
editor.require_signed_commit=Větev vyžaduje podepsaný commit
|
||||||
editor.cherry_pick=Cherry-pick %s na:
|
editor.cherry_pick=Cherry-pick %s na:
|
||||||
|
@ -1427,7 +1432,7 @@ commitstatus.failure=Chyba
|
||||||
commitstatus.pending=Čekající
|
commitstatus.pending=Čekající
|
||||||
commitstatus.success=Úspěch
|
commitstatus.success=Úspěch
|
||||||
|
|
||||||
ext_issues=Přístup k externím problémům
|
ext_issues=Externí problémy
|
||||||
ext_issues.desc=Odkaz na externí systém problémů.
|
ext_issues.desc=Odkaz na externí systém problémů.
|
||||||
|
|
||||||
projects=Projekty
|
projects=Projekty
|
||||||
|
@ -1608,9 +1613,9 @@ issues.no_content=K dispozici není žádný popis.
|
||||||
issues.close=Zavřít problém
|
issues.close=Zavřít problém
|
||||||
issues.comment_pull_merged_at=sloučený commit %[1]s do %[2]s %[3]s
|
issues.comment_pull_merged_at=sloučený commit %[1]s do %[2]s %[3]s
|
||||||
issues.comment_manually_pull_merged_at=ručně sloučený commit %[1]s do %[2]s %[3]s
|
issues.comment_manually_pull_merged_at=ručně sloučený commit %[1]s do %[2]s %[3]s
|
||||||
issues.close_comment_issue=Okomentovat a zavřít
|
issues.close_comment_issue=Zavřít s komentářem
|
||||||
issues.reopen_issue=Znovu otevřít
|
issues.reopen_issue=Znovu otevřít
|
||||||
issues.reopen_comment_issue=Okomentovat a znovu otevřít
|
issues.reopen_comment_issue=Znovu otevřít s komentářem
|
||||||
issues.create_comment=Okomentovat
|
issues.create_comment=Okomentovat
|
||||||
issues.closed_at=`uzavřel/a tento problém <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at=`uzavřel/a tento problém <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.reopened_at=`znovu otevřel/a tento problém <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at=`znovu otevřel/a tento problém <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
|
@ -1776,8 +1781,8 @@ issues.review.left_comment=zanechal komentář
|
||||||
issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn).
|
issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn).
|
||||||
issues.review.reject=požádal/a o změny %s
|
issues.review.reject=požádal/a o změny %s
|
||||||
issues.review.wait=byl/a požádán/a o posouzení %s
|
issues.review.wait=byl/a požádán/a o posouzení %s
|
||||||
issues.review.add_review_request=požádal/a o posouzení od %s %s
|
issues.review.add_review_request=požádal/a o kontrolu od %[1]s %[2]s
|
||||||
issues.review.remove_review_request=odstranil/a žádost o posouzení na %s %s
|
issues.review.remove_review_request=odstranil/a žádost o kontrolu u %[1]s %[2]s
|
||||||
issues.review.remove_review_request_self=odmítl/a posoudit %s
|
issues.review.remove_review_request_self=odmítl/a posoudit %s
|
||||||
issues.review.pending=Čekající
|
issues.review.pending=Čekající
|
||||||
issues.review.pending.tooltip=Tento komentář není momentálně viditelný pro ostatní uživatele. Chcete-li odeslat Vaše čekající komentáře, vyberte „%s“ → „%s/%s/%s“ v horní části stránky.
|
issues.review.pending.tooltip=Tento komentář není momentálně viditelný pro ostatní uživatele. Chcete-li odeslat Vaše čekající komentáře, vyberte „%s“ → „%s/%s/%s“ v horní části stránky.
|
||||||
|
@ -1909,7 +1914,7 @@ pulls.has_merged=Chyba: žádost byla sloučena, nelze ji znovu sloučit nebo zm
|
||||||
pulls.push_rejected=Push selhal: nahrání bylo zamítnuto. Zkontrolujte Git hooky pro tento repozitář.
|
pulls.push_rejected=Push selhal: nahrání bylo zamítnuto. Zkontrolujte Git hooky pro tento repozitář.
|
||||||
pulls.push_rejected_summary=Úplná zpráva o zamítnutí
|
pulls.push_rejected_summary=Úplná zpráva o zamítnutí
|
||||||
pulls.push_rejected_no_message=Push selhal: nahrání bylo odmítnuto, ale nebyla nalezena žádná vzdálená zpráva. Zkontrolujte Git hooky pro tento repozitář
|
pulls.push_rejected_no_message=Push selhal: nahrání bylo odmítnuto, ale nebyla nalezena žádná vzdálená zpráva. Zkontrolujte Git hooky pro tento repozitář
|
||||||
pulls.open_unmerged_pull_exists=`Nemůžete provést operaci znovuotevření protože je tu čekající požadavek na natažení (#%d) s identickými vlastnostmi.`
|
pulls.open_unmerged_pull_exists=`Nemůžete provést operaci opětovného otevření, protože máte čekající žádost o sloučení (#%d) s identickými vlastnostmi.`
|
||||||
pulls.status_checking=Některé kontroly jsou nedořešeny
|
pulls.status_checking=Některé kontroly jsou nedořešeny
|
||||||
pulls.status_checks_success=Všechny kontroly byly úspěšné
|
pulls.status_checks_success=Všechny kontroly byly úspěšné
|
||||||
pulls.status_checks_warning=Některé kontroly nahlásily varování
|
pulls.status_checks_warning=Některé kontroly nahlásily varování
|
||||||
|
@ -1925,8 +1930,8 @@ pulls.update_branch_success=Aktualizace větve byla úspěšná
|
||||||
pulls.update_not_allowed=Nemáte oprávnění aktualizovat větev
|
pulls.update_not_allowed=Nemáte oprávnění aktualizovat větev
|
||||||
pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní větvi
|
pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní větvi
|
||||||
pulls.close=Zavřít žádost o sloučení
|
pulls.close=Zavřít žádost o sloučení
|
||||||
pulls.closed_at=`uzavřel/a tento požadavek na natažení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at=`uzavřel/a tuto žádost o sloučení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
pulls.reopened_at=`znovuotevřel/a tento požadavek na natažení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
pulls.cmd_instruction_hint=Zobrazit instrukce příkazové řádky
|
pulls.cmd_instruction_hint=Zobrazit instrukce příkazové řádky
|
||||||
pulls.cmd_instruction_checkout_desc=Z vašeho repositáře projektu se podívejte na novou větev a vyzkoušejte změny.
|
pulls.cmd_instruction_checkout_desc=Z vašeho repositáře projektu se podívejte na novou větev a vyzkoušejte změny.
|
||||||
pulls.cmd_instruction_merge_title=Sloučit
|
pulls.cmd_instruction_merge_title=Sloučit
|
||||||
|
@ -1935,18 +1940,18 @@ pulls.clear_merge_message=Vymazat zprávu o sloučení
|
||||||
|
|
||||||
pulls.auto_merge_button_when_succeed=(Když kontroly uspějí)
|
pulls.auto_merge_button_when_succeed=(Když kontroly uspějí)
|
||||||
pulls.auto_merge_when_succeed=Automaticky sloučit, když všechny kontroly uspějí
|
pulls.auto_merge_when_succeed=Automaticky sloučit, když všechny kontroly uspějí
|
||||||
pulls.auto_merge_newly_scheduled=Požadavek na natažení byl naplánován na sloučení, jakmile všechny kontroly uspějí.
|
pulls.auto_merge_newly_scheduled=Žádost o sloučení bude sloučena, jakmile budou všechny kontroly úspěšné.
|
||||||
pulls.auto_merge_has_pending_schedule=%[1]s naplánoval/a tento požadavek na natažení pro automatické sloučení, když všechny kontroly uspějí v %[2]s.
|
pulls.auto_merge_has_pending_schedule=%[1]s naplánoval/a tuto žádost o sloučení na automatické sloučení, jakmile budou všechny kontroly úspěšné %[2]s.
|
||||||
|
|
||||||
pulls.auto_merge_cancel_schedule=Zrušit automatické sloučení
|
pulls.auto_merge_cancel_schedule=Zrušit automatické sloučení
|
||||||
pulls.auto_merge_not_scheduled=Tento požadavek na natažení není naplánován na automatické sloučení.
|
pulls.auto_merge_not_scheduled=Tato žádost o sloučení nebude automaticky sloučena.
|
||||||
pulls.auto_merge_canceled_schedule=Automatické sloučení bylo zrušeno pro tento požadavek na natažení.
|
pulls.auto_merge_canceled_schedule=Automatické sloučení bylo u této žádosti o sloučení zrušeno.
|
||||||
|
|
||||||
pulls.auto_merge_newly_scheduled_comment=`požadavek na automatické sloučení tohoto požadavku na natažení je naplánován, když všechny kontroly uspějí %[1]s`
|
pulls.auto_merge_newly_scheduled_comment=`naplánoval/a tuto žádost o sloučení na automatické sloučení, jakmile budou všechny kontroly úspěšné %[1]s`
|
||||||
pulls.auto_merge_canceled_schedule_comment=`zrušil/a automatické sloučení tohoto požadavku na natažení, když všechny kontroly uspějí %[1]s`
|
pulls.auto_merge_canceled_schedule_comment=`zrušil/a automatické sloučení této žádosti o sloučení, jakmile budou všechny kontroly úspěšné %[1]s`
|
||||||
|
|
||||||
pulls.delete.title=Odstranit tento požadavek na natažení?
|
pulls.delete.title=Odstranit tuto žádost o sloučení?
|
||||||
pulls.delete.text=Opravdu chcete tento požadavek na natažení smazat? (Tím se trvale odstraní veškerý obsah. Pokud jej hodláte archivovat, zvažte raději jeho uzavření.)
|
pulls.delete.text=Opravdu chcete odstranit tuto žádost o sloučení? (Tímto trvale odstraníte všechen obsah. Pokud jej chcete archivovat, zvažte raději jeho uzavření)
|
||||||
|
|
||||||
|
|
||||||
pull.deleted_branch=(odstraněno):%s
|
pull.deleted_branch=(odstraněno):%s
|
||||||
|
@ -1987,15 +1992,15 @@ signing.wont_sign.nokey=Tato instance nemá žádný klíč k podepsání tohoto
|
||||||
signing.wont_sign.never=Commity nejsou nikdy podepsány.
|
signing.wont_sign.never=Commity nejsou nikdy podepsány.
|
||||||
signing.wont_sign.always=Commity jsou vždy podepsány.
|
signing.wont_sign.always=Commity jsou vždy podepsány.
|
||||||
signing.wont_sign.pubkey=Commit nebude podepsán, protože nemáte veřejný klíč spojený s vaším účtem.
|
signing.wont_sign.pubkey=Commit nebude podepsán, protože nemáte veřejný klíč spojený s vaším účtem.
|
||||||
signing.wont_sign.twofa=Pro podepsání commitů musíte mít povoleno dvoufaktorové ověření.
|
signing.wont_sign.twofa=Pro podepisování commitů musíte mít zapnuto dvoufázové ověření.
|
||||||
signing.wont_sign.parentsigned=Commit nebude podepsán, protože nadřazený commit není podepsán.
|
signing.wont_sign.parentsigned=Commit nebude podepsán, protože nadřazený commit není podepsán.
|
||||||
signing.wont_sign.basesigned=Sloučení nebude podepsáno, protože základní commit není podepsaný.
|
signing.wont_sign.basesigned=Sloučení nebude podepsáno, protože základní commit není podepsaný.
|
||||||
signing.wont_sign.headsigned=Sloučení nebude podepsáno, protože hlavní revize není podepsána.
|
signing.wont_sign.headsigned=Sloučení nebude podepsáno, protože hlavní revize není podepsána.
|
||||||
signing.wont_sign.commitssigned=Sloučení nebude podepsáno, protože všechny přidružené revize nejsou podepsány.
|
signing.wont_sign.commitssigned=Sloučení nebude podepsáno, protože všechny přidružené revize nejsou podepsány.
|
||||||
signing.wont_sign.approved=Sloučení nebude podepsáno, protože požadavek na natažení není schválen.
|
signing.wont_sign.approved=Sloučení nebude podepsáno, protože žádost o sloučení není schválena.
|
||||||
signing.wont_sign.not_signed_in=Nejste přihlášeni.
|
signing.wont_sign.not_signed_in=Nejste přihlášeni.
|
||||||
|
|
||||||
ext_wiki=Přístup k externí Wiki
|
ext_wiki=Externí wiki
|
||||||
ext_wiki.desc=Odkaz do externí Wiki.
|
ext_wiki.desc=Odkaz do externí Wiki.
|
||||||
|
|
||||||
wiki=Wiki
|
wiki=Wiki
|
||||||
|
@ -2114,7 +2119,7 @@ settings.collaboration.write=Zápis
|
||||||
settings.collaboration.read=Čtení
|
settings.collaboration.read=Čtení
|
||||||
settings.collaboration.owner=Vlastník
|
settings.collaboration.owner=Vlastník
|
||||||
settings.collaboration.undefined=Neurčeno
|
settings.collaboration.undefined=Neurčeno
|
||||||
settings.hooks=Webové háčky
|
settings.hooks=Webhooky
|
||||||
settings.githooks=Git hooky
|
settings.githooks=Git hooky
|
||||||
settings.basic_settings=Základní nastavení
|
settings.basic_settings=Základní nastavení
|
||||||
settings.mirror_settings=Nastavení zrcadla
|
settings.mirror_settings=Nastavení zrcadla
|
||||||
|
@ -2125,7 +2130,7 @@ settings.mirror_settings.docs.no_new_mirrors=Váš repozitář zrcadlí změny d
|
||||||
settings.mirror_settings.docs.can_still_use=I když nemůžete upravit stávající zrcadla nebo vytvořit nová, stále můžete použít své stávající zrcadlo.
|
settings.mirror_settings.docs.can_still_use=I když nemůžete upravit stávající zrcadla nebo vytvořit nová, stále můžete použít své stávající zrcadlo.
|
||||||
settings.mirror_settings.docs.more_information_if_disabled=Více informací o zrcadlech pro nahrání a natažení naleznete zde:
|
settings.mirror_settings.docs.more_information_if_disabled=Více informací o zrcadlech pro nahrání a natažení naleznete zde:
|
||||||
settings.mirror_settings.docs.doc_link_title=Jak mohu zrcadlit repozitáře?
|
settings.mirror_settings.docs.doc_link_title=Jak mohu zrcadlit repozitáře?
|
||||||
settings.mirror_settings.docs.pulling_remote_title=Stažení ze vzdáleného úložiště
|
settings.mirror_settings.docs.pulling_remote_title=Stahování ze vzdáleného repozitáře
|
||||||
settings.mirror_settings.mirrored_repository=Zrcadlený repozitář
|
settings.mirror_settings.mirrored_repository=Zrcadlený repozitář
|
||||||
settings.mirror_settings.direction=Směr
|
settings.mirror_settings.direction=Směr
|
||||||
settings.mirror_settings.direction.pull=Natáhnout
|
settings.mirror_settings.direction.pull=Natáhnout
|
||||||
|
@ -2264,23 +2269,23 @@ settings.delete_team_tip=Tento tým má přístup ke všem repositářům a nem
|
||||||
settings.remove_team_success=Přístup týmu k repozitáři byl odstraněn.
|
settings.remove_team_success=Přístup týmu k repozitáři byl odstraněn.
|
||||||
settings.add_webhook=Přidat webhook
|
settings.add_webhook=Přidat webhook
|
||||||
settings.add_webhook.invalid_channel_name=Kanál webového háčku nemůže být prázdný a nemůže obsahovat pouze znak #.
|
settings.add_webhook.invalid_channel_name=Kanál webového háčku nemůže být prázdný a nemůže obsahovat pouze znak #.
|
||||||
settings.hooks_desc=Webové háčky automaticky vytvářejí dotazy HTTP POST na server, když nastane určitá událost v Forgejo. Čtěte více v <a target="_blank" rel="noopener noreferrer" href="%s">příručce webových háčků</a>.
|
settings.hooks_desc=Webhooky automaticky vytvářejí dotazy HTTP POST na server, když nastane určitá událost ve Forgejo. Více informací v <a target="_blank" rel="noopener noreferrer" href="%s">příručce webhooků</a>.
|
||||||
settings.webhook_deletion=Odstranit webhook
|
settings.webhook_deletion=Odstranit webhook
|
||||||
settings.webhook_deletion_desc=Odstranění webového háčku smaže jeho nastavení a historii doručení. Pokračovat?
|
settings.webhook_deletion_desc=Odstranění webového háčku smaže jeho nastavení a historii doručení. Pokračovat?
|
||||||
settings.webhook_deletion_success=Webový háček byl smazán.
|
settings.webhook_deletion_success=Webhook byl smazán.
|
||||||
settings.webhook.test_delivery=Test doručitelnosti
|
settings.webhook.test_delivery=Test doručitelnosti
|
||||||
settings.webhook.test_delivery_desc=Vyzkoušet tento webový háček pomocí falešné události.
|
settings.webhook.test_delivery_desc=Otestovat tento webhook pomocí falešné události.
|
||||||
settings.webhook.test_delivery_desc_disabled=Chcete-li tento webový háček otestovat s falešnou událostí, aktivujte ho.
|
settings.webhook.test_delivery_desc_disabled=Chcete-li pomocí falešné události otestovat tento webhook, aktivujte ho.
|
||||||
settings.webhook.request=Požadavek
|
settings.webhook.request=Požadavek
|
||||||
settings.webhook.response=Odpověď
|
settings.webhook.response=Odpověď
|
||||||
settings.webhook.headers=Hlavičky
|
settings.webhook.headers=Hlavičky
|
||||||
settings.webhook.payload=Obsah
|
settings.webhook.payload=Obsah
|
||||||
settings.webhook.body=Tělo zprávy
|
settings.webhook.body=Tělo zprávy
|
||||||
settings.webhook.replay.description=Zopakovat tento webový háček.
|
settings.webhook.replay.description=Zopakovat tento webhook.
|
||||||
settings.webhook.replay.description_disabled=Chcete-li znovu spustit tento webový háček, aktivujte jej.
|
settings.webhook.replay.description_disabled=Chcete-li zopakovat tento webhook, aktivujte jej.
|
||||||
settings.webhook.delivery.success=Událost byla přidána do fronty doručení. Může to trvat několik sekund, než se zobrazí v historii doručení.
|
settings.webhook.delivery.success=Událost byla přidána do fronty doručení. Může to trvat několik sekund, než se zobrazí v historii doručení.
|
||||||
settings.githooks_desc=Git hooks jsou spravovány samotným Gitem. Níže můžete upravit soubory hooků pro nastavení vlastních operací.
|
settings.githooks_desc=Git hooks jsou spravovány samotným Gitem. Níže můžete upravit soubory hooků pro nastavení vlastních operací.
|
||||||
settings.githook_edit_desc=Je-li háček neaktivní, bude zobrazen vzorový obsah. Nebude-li zadán žádný obsah, háček bude vypnut.
|
settings.githook_edit_desc=Je-li webhook neaktivní, bude zobrazen vzorový obsah. Ponechte prázdné pro zakázání tohoto webhooku.
|
||||||
settings.githook_name=Název hooku
|
settings.githook_name=Název hooku
|
||||||
settings.githook_content=Obsah hooku
|
settings.githook_content=Obsah hooku
|
||||||
settings.update_githook=Upravit hook
|
settings.update_githook=Upravit hook
|
||||||
|
@ -2303,7 +2308,7 @@ settings.event_create=Vytvořit
|
||||||
settings.event_create_desc=Větev nebo značka vytvořena.
|
settings.event_create_desc=Větev nebo značka vytvořena.
|
||||||
settings.event_delete=Smazat
|
settings.event_delete=Smazat
|
||||||
settings.event_delete_desc=Větev nebo značka smazána.
|
settings.event_delete_desc=Větev nebo značka smazána.
|
||||||
settings.event_fork=Rozštěpit
|
settings.event_fork=Fork
|
||||||
settings.event_fork_desc=Repozitář rozštěpen.
|
settings.event_fork_desc=Repozitář rozštěpen.
|
||||||
settings.event_wiki=Wiki
|
settings.event_wiki=Wiki
|
||||||
settings.event_wiki_desc=Wiki stránka vytvořena, přejmenována nebo smazána.
|
settings.event_wiki_desc=Wiki stránka vytvořena, přejmenována nebo smazána.
|
||||||
|
@ -2314,32 +2319,32 @@ settings.event_push_desc=Nahrání pomocí Gitu do repozitáře.
|
||||||
settings.event_repository=Repozitář
|
settings.event_repository=Repozitář
|
||||||
settings.event_repository_desc=Repozitář vytvořen nebo smazán.
|
settings.event_repository_desc=Repozitář vytvořen nebo smazán.
|
||||||
settings.event_header_issue=Události problémů
|
settings.event_header_issue=Události problémů
|
||||||
settings.event_issues=Problémy
|
settings.event_issues=Úprava
|
||||||
settings.event_issues_desc=Problém otevřen, uzavřen, znovu otevřen nebo upraven.
|
settings.event_issues_desc=Problém otevřen, uzavřen, znovu otevřen nebo upraven.
|
||||||
settings.event_issue_assign=Problém přiřazen
|
settings.event_issue_assign=Přiřazení
|
||||||
settings.event_issue_assign_desc=Problém přiřazen nebo nepřiřazen.
|
settings.event_issue_assign_desc=Problém přiřazen nebo nepřiřazen.
|
||||||
settings.event_issue_label=Problém označen
|
settings.event_issue_label=Štítky
|
||||||
settings.event_issue_label_desc=Štítky problému upraveny nebo vymazány.
|
settings.event_issue_label_desc=Štítky problému přidány nebo odstraněny.
|
||||||
settings.event_issue_milestone=K problému přidán milník
|
settings.event_issue_milestone=Milníky
|
||||||
settings.event_issue_milestone_desc=K problému přidán nebo odebrán milník.
|
settings.event_issue_milestone_desc=Milník přidán, odstraněn nebo upraven.
|
||||||
settings.event_issue_comment=Komentář k problému
|
settings.event_issue_comment=Komentáře
|
||||||
settings.event_issue_comment_desc=Přidán, upraven nebo smazán komentář problému.
|
settings.event_issue_comment_desc=Přidán, upraven nebo smazán komentář problému.
|
||||||
settings.event_header_pull_request=Události žádosti o sloučení
|
settings.event_header_pull_request=Události žádosti o sloučení
|
||||||
settings.event_pull_request=Žádost o sloučení
|
settings.event_pull_request=Úprava
|
||||||
settings.event_pull_request_desc=Požadavek na natažení otevřen, uzavřen, znovu otevřen nebo upraven.
|
settings.event_pull_request_desc=Požadavek na natažení otevřen, uzavřen, znovu otevřen nebo upraven.
|
||||||
settings.event_pull_request_assign=Žádost o sloučení přiřazena
|
settings.event_pull_request_assign=Přiřazení
|
||||||
settings.event_pull_request_assign_desc=Požadavek na natažení přiřazen nebo nepřiřazen.
|
settings.event_pull_request_assign_desc=Požadavek na natažení přiřazen nebo nepřiřazen.
|
||||||
settings.event_pull_request_label=Žádost o sloučení označena
|
settings.event_pull_request_label=Štítky
|
||||||
settings.event_pull_request_label_desc=Štítky požadavku na natažení aktualizovány nebo vymazány.
|
settings.event_pull_request_label_desc=Štítky žádosti o sloučení přidány nebo odstraněny.
|
||||||
settings.event_pull_request_milestone=K žádosti o sloučení přidán milník
|
settings.event_pull_request_milestone=Milníky
|
||||||
settings.event_pull_request_milestone_desc=Požadavku na natažení přidán nebo odebrán milník.
|
settings.event_pull_request_milestone_desc=Milník přidán, odstraněn nebo upraven.
|
||||||
settings.event_pull_request_comment=Žádost o sloučení okomentována
|
settings.event_pull_request_comment=Komentáře
|
||||||
settings.event_pull_request_comment_desc=Komentář požadavku na natažení vytvořen, upraven nebo odstraněn.
|
settings.event_pull_request_comment_desc=Komentář požadavku na natažení vytvořen, upraven nebo odstraněn.
|
||||||
settings.event_pull_request_review=Žádost o sloučení zkontrolována
|
settings.event_pull_request_review=Kontroly
|
||||||
settings.event_pull_request_review_desc=Požadavek na natažení schválen, odmítnut nebo zkontrolován.
|
settings.event_pull_request_review_desc=Žádost o sloučení schválena, zamítnuta nebo byl přidán komentář kontroly.
|
||||||
settings.event_pull_request_sync=Žádost o sloučení synchronizována
|
settings.event_pull_request_sync=Synchronizováno
|
||||||
settings.event_pull_request_sync_desc=Požadavek na natažení synchronizován.
|
settings.event_pull_request_sync_desc=Větev automaticky aktualizována s cílovou větví.
|
||||||
settings.event_pull_request_review_request=Vyžádána kontrola žádosti o sloučení
|
settings.event_pull_request_review_request=Žádosti o kontrolu
|
||||||
settings.event_package=Balíček
|
settings.event_package=Balíček
|
||||||
settings.event_package_desc=Balíček vytvořen nebo odstraněn v repozitáři.
|
settings.event_package_desc=Balíček vytvořen nebo odstraněn v repozitáři.
|
||||||
settings.branch_filter=Filtr větví
|
settings.branch_filter=Filtr větví
|
||||||
|
@ -2348,9 +2353,9 @@ settings.authorization_header=Autorizační hlavička
|
||||||
settings.authorization_header_desc=Pokud vyplněno, bude připojeno k požadavkům jako autorizační hlavička. Příklady: %s.
|
settings.authorization_header_desc=Pokud vyplněno, bude připojeno k požadavkům jako autorizační hlavička. Příklady: %s.
|
||||||
settings.active=Aktivní
|
settings.active=Aktivní
|
||||||
settings.active_helper=Informace o spuštěných událostech budou odeslány na URL webového háčku.
|
settings.active_helper=Informace o spuštěných událostech budou odeslány na URL webového háčku.
|
||||||
settings.add_hook_success=Webový háček byl přidán.
|
settings.add_hook_success=Webhook byl přidán.
|
||||||
settings.update_webhook=Upravit webhook
|
settings.update_webhook=Upravit webhook
|
||||||
settings.update_hook_success=Webový háček byl aktualizován.
|
settings.update_hook_success=Webhook byl aktualizován.
|
||||||
settings.delete_webhook=Odstranit webhook
|
settings.delete_webhook=Odstranit webhook
|
||||||
settings.recent_deliveries=Nedávná doručení
|
settings.recent_deliveries=Nedávná doručení
|
||||||
settings.hook_type=Typ hooku
|
settings.hook_type=Typ hooku
|
||||||
|
@ -2436,7 +2441,7 @@ settings.protect_branch_name_pattern=Vzor jména chráněné větve
|
||||||
settings.protect_branch_name_pattern_desc=Vzory názvů chráněných větví. Pro vzorovou syntaxi viz <a href="%s">dokumentace</a>. Příklady: main, release/**
|
settings.protect_branch_name_pattern_desc=Vzory názvů chráněných větví. Pro vzorovou syntaxi viz <a href="%s">dokumentace</a>. Příklady: main, release/**
|
||||||
settings.protect_patterns=Vzory
|
settings.protect_patterns=Vzory
|
||||||
settings.protect_protected_file_patterns=Vzory chráněných souborů (oddělené středníkem „;“)
|
settings.protect_protected_file_patterns=Vzory chráněných souborů (oddělené středníkem „;“)
|
||||||
settings.protect_protected_file_patterns_desc=Chráněné soubory, které nemají povoleno být měněny přímo, i když uživatel má právo přidávat, upravovat nebo mazat soubory v této větvi. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na <a href="%s">github.com/gobwas/glob</a> dokumentaci pro syntaxi vzoru. Příklady: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_protected_file_patterns_desc=Chráněné soubory, které nemají povoleno být měněny přímo, i když uživatel má právo přidávat, upravovat nebo mazat soubory v této větvi. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na dokumentaci <a href="%[1]s">%[2]s</a> pro syntaxi vzoru. Příklady: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.protect_unprotected_file_patterns=Vzory nechráněných souborů (oddělené středníkem „;“)
|
settings.protect_unprotected_file_patterns=Vzory nechráněných souborů (oddělené středníkem „;“)
|
||||||
settings.protect_unprotected_file_patterns_desc=Nechráněné soubory, které je možné měnit přímo, pokud má uživatel právo zápisu, čímž se obejde omezení push. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na <a href="%[1]s">%[2]s</a> dokumentaci pro syntaxi vzoru. Příklady: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_unprotected_file_patterns_desc=Nechráněné soubory, které je možné měnit přímo, pokud má uživatel právo zápisu, čímž se obejde omezení push. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na <a href="%[1]s">%[2]s</a> dokumentaci pro syntaxi vzoru. Příklady: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.add_protected_branch=Zapnout ochranu
|
settings.add_protected_branch=Zapnout ochranu
|
||||||
|
@ -2582,14 +2587,14 @@ diff.hide_file_tree=Skrýt souborový strom
|
||||||
|
|
||||||
releases.desc=Sledování verzí projektu a souborů ke stažení.
|
releases.desc=Sledování verzí projektu a souborů ke stažení.
|
||||||
release.releases=Vydání
|
release.releases=Vydání
|
||||||
release.detail=Podrobnosti vydání
|
release.detail=Podrobnosti o vydání
|
||||||
release.tags=Značky
|
release.tags=Značky
|
||||||
release.new_release=Nové vydání
|
release.new_release=Nové vydání
|
||||||
release.draft=Koncept
|
release.draft=Koncept
|
||||||
release.prerelease=Předběžná verze
|
release.prerelease=Předběžná verze
|
||||||
release.stable=Stabilní
|
release.stable=Stabilní
|
||||||
release.compare=Porovnat
|
release.compare=Porovnat
|
||||||
release.edit=upravit
|
release.edit=Upravit
|
||||||
release.ahead.commits=<strong>%d</strong> revizí
|
release.ahead.commits=<strong>%d</strong> revizí
|
||||||
release.ahead.target=do %s od tohoto vydání
|
release.ahead.target=do %s od tohoto vydání
|
||||||
tag.ahead.target=do %s od této značky
|
tag.ahead.target=do %s od této značky
|
||||||
|
@ -2718,7 +2723,7 @@ issues.label_archive = Štítek archivu
|
||||||
milestones.new_subheader = Milníky vám pomohou zorganizovat problémy a sledovat jejich pokrok.
|
milestones.new_subheader = Milníky vám pomohou zorganizovat problémy a sledovat jejich pokrok.
|
||||||
pulls.nothing_to_compare_have_tag = Vybraná větev a značka jsou shodné.
|
pulls.nothing_to_compare_have_tag = Vybraná větev a značka jsou shodné.
|
||||||
activity.navbar.recent_commits = Nedávné commity
|
activity.navbar.recent_commits = Nedávné commity
|
||||||
settings.units.units = Jednotky repozitáře
|
settings.units.units = Jednotky
|
||||||
pulls.blocked_by_user = V tomto repozitáři nemůžete vytvořit žádost o sloučení, protože jste byli zablokováni jeho majitelem.
|
pulls.blocked_by_user = V tomto repozitáři nemůžete vytvořit žádost o sloučení, protože jste byli zablokováni jeho majitelem.
|
||||||
pulls.clear_merge_message_hint = Vymazáním zprávy o sloučení pouze odstraníte obsah zprávy commitu a ponecháte vygenerované git trailery, jako „Co-Authored-By …“.
|
pulls.clear_merge_message_hint = Vymazáním zprávy o sloučení pouze odstraníte obsah zprávy commitu a ponecháte vygenerované git trailery, jako „Co-Authored-By …“.
|
||||||
pulls.agit_explanation = Vytvořeno pomocí workflow AGit. AGit umožňuje přispěvatelům navrhovat změny pomocí „git push“ bez vytváření forku nebo nové větve.
|
pulls.agit_explanation = Vytvořeno pomocí workflow AGit. AGit umožňuje přispěvatelům navrhovat změny pomocí „git push“ bez vytváření forku nebo nové větve.
|
||||||
|
@ -2727,7 +2732,7 @@ settings.pull_mirror_sync_in_progress = Probíhá načítání změn ze vzdálen
|
||||||
settings.enter_repo_name = Zadejte majitele a repozitář přesně tak, jak je vidíte níže:
|
settings.enter_repo_name = Zadejte majitele a repozitář přesně tak, jak je vidíte níže:
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto akci lze v současné chvíli provést pouze v nabídce „Nová migrace“. Pro více informací viz:
|
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto akci lze v současné chvíli provést pouze v nabídce „Nová migrace“. Pro více informací viz:
|
||||||
settings.new_owner_blocked_doer = Nový majitel vás zablokoval.
|
settings.new_owner_blocked_doer = Nový majitel vás zablokoval.
|
||||||
settings.mirror_settings.pushed_repository = Pushnutý repozitář
|
settings.mirror_settings.pushed_repository = Odeslaný repozitář
|
||||||
settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře.
|
settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře.
|
||||||
pulls.commit_ref_at = `se odkázal na tuto žádost o sloučení z commitu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `se odkázal na tuto žádost o sloučení z commitu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
settings.wiki_rename_branch_main = Normalizovat název větve Wiki
|
settings.wiki_rename_branch_main = Normalizovat název větve Wiki
|
||||||
|
@ -2744,7 +2749,7 @@ activity.navbar.contributors = Přispěvatelé
|
||||||
settings.mirror_settings.docs.pull_mirror_instructions = Pro nastavení pull zrcadla viz:
|
settings.mirror_settings.docs.pull_mirror_instructions = Pro nastavení pull zrcadla viz:
|
||||||
settings.mirror_settings.docs.doc_link_pull_section = sekci „Pulling from a remote repository“ v dokumentaci.
|
settings.mirror_settings.docs.doc_link_pull_section = sekci „Pulling from a remote repository“ v dokumentaci.
|
||||||
settings.units.overview = Přehled
|
settings.units.overview = Přehled
|
||||||
settings.units.add_more = Přidat další...
|
settings.units.add_more = Povolit další
|
||||||
settings.push_mirror_sync_in_progress = Probíhá odesílání změn na vzdálený %s.
|
settings.push_mirror_sync_in_progress = Probíhá odesílání změn na vzdálený %s.
|
||||||
settings.wiki_globally_editable = Umožnit komukoli editovat wiki
|
settings.wiki_globally_editable = Umožnit komukoli editovat wiki
|
||||||
settings.confirmation_string = Potvrzovací řetězec
|
settings.confirmation_string = Potvrzovací řetězec
|
||||||
|
@ -2783,8 +2788,8 @@ settings.enforce_on_admins_desc = Správci repozitáře nemohou obejít toto pra
|
||||||
issues.num_participants_one = %d účastník
|
issues.num_participants_one = %d účastník
|
||||||
size_format = %[1]s: %[2]s, %[3]s: %[4]s
|
size_format = %[1]s: %[2]s, %[3]s: %[4]s
|
||||||
issues.archived_label_description = (Archivován) %s
|
issues.archived_label_description = (Archivován) %s
|
||||||
release.download_count_one = %d stažení
|
release.download_count_one = %s stažení
|
||||||
release.download_count_few = %d stažení
|
release.download_count_few = %s stažení
|
||||||
release.system_generated = Tato příloha byla automaticky vygenerována.
|
release.system_generated = Tato příloha byla automaticky vygenerována.
|
||||||
settings.add_webhook.invalid_path = Cesta nesmí obsahovat část, která je „.“ nebo „..“ nebo prázdný řetězec. Nesmí začínat ani končit lomítkem.
|
settings.add_webhook.invalid_path = Cesta nesmí obsahovat část, která je „.“ nebo „..“ nebo prázdný řetězec. Nesmí začínat ani končit lomítkem.
|
||||||
settings.web_hook_name_sourcehut_builds = Sestavení SourceHut
|
settings.web_hook_name_sourcehut_builds = Sestavení SourceHut
|
||||||
|
@ -2841,6 +2846,15 @@ mirror_denied_combination = Nelze použít kombinaci ověřování pomocí veře
|
||||||
mirror_public_key = Veřejný klíč SSH
|
mirror_public_key = Veřejný klíč SSH
|
||||||
settings.mirror_settings.push_mirror.none_ssh = Žádné
|
settings.mirror_settings.push_mirror.none_ssh = Žádné
|
||||||
mirror_use_ssh.not_available = Ověřování SSH není dostupné.
|
mirror_use_ssh.not_available = Ověřování SSH není dostupné.
|
||||||
|
issues.new.assign_to_me = Přiřadit mně
|
||||||
|
issues.all_title = Vše
|
||||||
|
settings.discord_icon_url.exceeds_max_length = Adresa URL ikony musí mít méně než 2048 znaků
|
||||||
|
issues.review.add_review_requests = požádal/a o kontroly od %[1]s %[2]s
|
||||||
|
issues.review.remove_review_requests = odstranil/a žádosti o kontrolu u %[1]s %[2]s
|
||||||
|
issues.review.add_remove_review_requests = požádal/a o kontroly od %[1]s a odstranil/a žádosti u %[2]s %[3]s
|
||||||
|
pulls.delete_after_merge.head_branch.is_default = Větev hlavy, kterou chcete odstranit, je výchozí větví a nelze ji odstranit.
|
||||||
|
pulls.delete_after_merge.head_branch.is_protected = Větev hlavy, kterou chcete odstranit, je chráněnou větví a nelze ji odstranit.
|
||||||
|
pulls.delete_after_merge.head_branch.insufficient_branch = Nemáte oprávnění k odstranění větve hlavy.
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
component_loading_info = Tohle může chvíli trvat…
|
component_loading_info = Tohle může chvíli trvat…
|
||||||
|
@ -2885,7 +2899,7 @@ settings.email=Kontaktní e-mail
|
||||||
settings.website=Webové stránky
|
settings.website=Webové stránky
|
||||||
settings.location=Umístění
|
settings.location=Umístění
|
||||||
settings.permission=Oprávnění
|
settings.permission=Oprávnění
|
||||||
settings.repoadminchangeteam=Správce úložišť může týmům přidávat a odebírat přístup
|
settings.repoadminchangeteam=Správce repozitářů může týmům přidávat a odebírat přístup
|
||||||
settings.visibility=Viditelnost
|
settings.visibility=Viditelnost
|
||||||
settings.visibility.public=Veřejná
|
settings.visibility.public=Veřejná
|
||||||
settings.visibility.limited=Omezená (viditelné pouze pro ověřené uživatele)
|
settings.visibility.limited=Omezená (viditelné pouze pro ověřené uživatele)
|
||||||
|
@ -2904,7 +2918,7 @@ settings.delete_prompt=Organizace bude trvale odstraněna. Tato změna <strong>N
|
||||||
settings.confirm_delete_account=Potvrdit odstranění
|
settings.confirm_delete_account=Potvrdit odstranění
|
||||||
settings.delete_org_title=Odstranit organizaci
|
settings.delete_org_title=Odstranit organizaci
|
||||||
settings.delete_org_desc=Tato organizace bude trvale smazána. Pokračovat?
|
settings.delete_org_desc=Tato organizace bude trvale smazána. Pokračovat?
|
||||||
settings.hooks_desc=Přidat webové háčky, které budou spouštěny pro <strong>všechny repozitáře</strong> v této organizaci.
|
settings.hooks_desc=Přidat webhooky, které budou spouštěny pro <strong>všechny repozitáře</strong> v této organizaci.
|
||||||
|
|
||||||
settings.labels_desc=Přidejte štítky, které mohou být použity pro problémy <strong>všech repozitářů</strong> v rámci této organizace.
|
settings.labels_desc=Přidejte štítky, které mohou být použity pro problémy <strong>všech repozitářů</strong> v rámci této organizace.
|
||||||
|
|
||||||
|
@ -2983,7 +2997,7 @@ identity_access=Identita a přístup
|
||||||
users=Uživatelské účty
|
users=Uživatelské účty
|
||||||
organizations=Organizace
|
organizations=Organizace
|
||||||
repositories=Repozitáře
|
repositories=Repozitáře
|
||||||
hooks=Webové háčky
|
hooks=Webhooky
|
||||||
integrations=Integrace
|
integrations=Integrace
|
||||||
authentication=Zdroje ověření
|
authentication=Zdroje ověření
|
||||||
emails=Uživatelské e-maily
|
emails=Uživatelské e-maily
|
||||||
|
@ -3183,12 +3197,12 @@ packages.size=Velikost
|
||||||
packages.published=Publikováno
|
packages.published=Publikováno
|
||||||
|
|
||||||
defaulthooks=Výchozí webhooky
|
defaulthooks=Výchozí webhooky
|
||||||
defaulthooks.add_webhook=Přidat výchozí webový háček
|
defaulthooks.add_webhook=Přidat výchozí webhook
|
||||||
defaulthooks.update_webhook=Aktualizovat výchozí webový háček
|
defaulthooks.update_webhook=Aktualizovat výchozí webhook
|
||||||
|
|
||||||
systemhooks=Systémové webhooky
|
systemhooks=Systémové webhooky
|
||||||
systemhooks.add_webhook=Přidat systémový webový háček
|
systemhooks.add_webhook=Přidat systémový webhook
|
||||||
systemhooks.update_webhook=Aktualizovat systémový webový háček
|
systemhooks.update_webhook=Aktualizovat systémový webhook
|
||||||
|
|
||||||
auths.auth_manage_panel=Správa zdrojů ověřování
|
auths.auth_manage_panel=Správa zdrojů ověřování
|
||||||
auths.new=Přidat zdroj ověřování
|
auths.new=Přidat zdroj ověřování
|
||||||
|
@ -3589,7 +3603,7 @@ future=budoucí
|
||||||
1y=1 rokem
|
1y=1 rokem
|
||||||
seconds=%d sekundami
|
seconds=%d sekundami
|
||||||
minutes=%d minutami
|
minutes=%d minutami
|
||||||
hours=%d hodinami
|
hours=%d hodin
|
||||||
days=%d dny
|
days=%d dny
|
||||||
weeks=%d týdny
|
weeks=%d týdny
|
||||||
months=%d měsíci
|
months=%d měsíci
|
||||||
|
@ -3636,7 +3650,7 @@ error.unit_not_allowed=Nejste oprávněni přistupovat k této části repozitá
|
||||||
[packages]
|
[packages]
|
||||||
title=Balíčky
|
title=Balíčky
|
||||||
desc=Správa balíčků repozitáře.
|
desc=Správa balíčků repozitáře.
|
||||||
empty=Zatím nejsou žádné balíčky.
|
empty=Zatím zde nejsou žádné balíčky.
|
||||||
empty.documentation=Další informace o registru balíčků naleznete v <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>.
|
empty.documentation=Další informace o registru balíčků naleznete v <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>.
|
||||||
empty.repo=Nahráli jste balíček, ale nezobrazil se zde? Přejděte na <a href="%[1]s">nastavení balíčku</a> a propojte jej s tímto repozitářem.
|
empty.repo=Nahráli jste balíček, ale nezobrazil se zde? Přejděte na <a href="%[1]s">nastavení balíčku</a> a propojte jej s tímto repozitářem.
|
||||||
registry.documentation=Další informace o registru %s naleznete v <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>.
|
registry.documentation=Další informace o registru %s naleznete v <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>.
|
||||||
|
@ -3754,7 +3768,7 @@ settings.delete.success=Balíček byl odstraněn.
|
||||||
settings.delete.error=Nepodařilo se odstranit balíček.
|
settings.delete.error=Nepodařilo se odstranit balíček.
|
||||||
owner.settings.cargo.title=Index registru Cargo
|
owner.settings.cargo.title=Index registru Cargo
|
||||||
owner.settings.cargo.initialize=Inicializovat index
|
owner.settings.cargo.initialize=Inicializovat index
|
||||||
owner.settings.cargo.initialize.description=Pro použití Cargo registru je zapotřebí speciální index Git. Použití této možnosti (znovu)vytvoří repozitář a automaticky jej nastaví.
|
owner.settings.cargo.initialize.description=Pro použití registru Cargo je zapotřebí speciální index Git. Použití této možnosti (znovu) vytvoří repozitář a automaticky jej nastaví.
|
||||||
owner.settings.cargo.initialize.error=Nepodařilo se inicializovat Cargo index: %v
|
owner.settings.cargo.initialize.error=Nepodařilo se inicializovat Cargo index: %v
|
||||||
owner.settings.cargo.initialize.success=Index Cargo byl úspěšně vytvořen.
|
owner.settings.cargo.initialize.success=Index Cargo byl úspěšně vytvořen.
|
||||||
owner.settings.cargo.rebuild=Znovu vytvořit index
|
owner.settings.cargo.rebuild=Znovu vytvořit index
|
||||||
|
@ -3822,7 +3836,7 @@ management=Správa tajných klíčů
|
||||||
[actions]
|
[actions]
|
||||||
actions=Akce
|
actions=Akce
|
||||||
|
|
||||||
unit.desc=Spravovat integrované pipeliny CI/CD pomocí funkce Forgejo Actions
|
unit.desc=Spravovat integrované pipeliny CI/CD pomocí funkce Forgejo Actions.
|
||||||
|
|
||||||
status.unknown=Neznámý
|
status.unknown=Neznámý
|
||||||
status.waiting=Čekání
|
status.waiting=Čekání
|
||||||
|
@ -3893,7 +3907,7 @@ workflow.disabled=Pracovní postup je zakázán.
|
||||||
variables=Proměnné
|
variables=Proměnné
|
||||||
variables.management=Správa proměnných
|
variables.management=Správa proměnných
|
||||||
variables.creation=Přidat proměnnou
|
variables.creation=Přidat proměnnou
|
||||||
variables.none=Zatím nejsou žádné proměnné.
|
variables.none=Zatím zde nejsou žádné proměnné.
|
||||||
variables.deletion=Odstranit proměnnou
|
variables.deletion=Odstranit proměnnou
|
||||||
variables.deletion.description=Odstranění proměnné je trvalé a nelze jej vrátit zpět. Pokračovat?
|
variables.deletion.description=Odstranění proměnné je trvalé a nelze jej vrátit zpět. Pokračovat?
|
||||||
variables.description=Proměnné budou předány určitým akcím a nelze je přečíst jinak.
|
variables.description=Proměnné budou předány určitým akcím a nelze je přečíst jinak.
|
||||||
|
@ -3970,6 +3984,8 @@ pull_kind = Hledat pully...
|
||||||
union = Sdružené
|
union = Sdružené
|
||||||
union_tooltip = Zahrnout výsledky, které odpovídají jakýmkoli slovům odděleným mezerami
|
union_tooltip = Zahrnout výsledky, které odpovídají jakýmkoli slovům odděleným mezerami
|
||||||
milestone_kind = Hledat milníky...
|
milestone_kind = Hledat milníky...
|
||||||
|
regexp = RegExp
|
||||||
|
regexp_tooltip = Interpretovat hledaný výraz jako regulární výraz
|
||||||
|
|
||||||
[markup]
|
[markup]
|
||||||
filepreview.lines = Řádky %[1]d až %[2]d v souboru %[3]s
|
filepreview.lines = Řádky %[1]d až %[2]d v souboru %[3]s
|
||||||
|
@ -3987,4 +4003,24 @@ eib = EiB
|
||||||
|
|
||||||
|
|
||||||
[translation_meta]
|
[translation_meta]
|
||||||
test = diky vsem za pomoc :)
|
test = diky vsem za pomoc :)
|
||||||
|
|
||||||
|
[repo.permissions]
|
||||||
|
pulls.write = <b>Zapisovat:</b> Zavírat žádosti o sloučení a spravovat metadata jako štítky, milníky, zpracovatele, data dokončení a závislosti.
|
||||||
|
packages.write = <b>Zapisovat:</b> Zveřejňovat a mazat balíčky připojené k repozitáři.
|
||||||
|
projects.read = <b>Číst:</b> Přístup k projektovým nástěnkám repozitáře.
|
||||||
|
code.write = <b>Zapisovat:</b> Odesílat změny do repozitáře, vytvářet větve a značky.
|
||||||
|
issues.write = <b>Zapisovat:</b> Zavírat problémy a spravovat metadata jako štítky, milníky, zpracovatele, data dokončení a závislosti.
|
||||||
|
pulls.read = <b>Číst:</b> Číst a vytvářet žádosti o sloučení.
|
||||||
|
releases.read = <b>Číst:</b> Zobrazovat a stahovat vydání.
|
||||||
|
releases.write = <b>Zapisovat:</b> Zveřejňovat, upravovat a mazat vydání a jejich soubory.
|
||||||
|
wiki.read = <b>Číst:</b> Číst integrovanou wiki a její historii.
|
||||||
|
wiki.write = <b>Zapisovat:</b> Vytvářet, aktualizovat a mazat stránky v integrované wiki.
|
||||||
|
projects.write = <b>Zapisovat:</b> Vytvářet projekty a sloupce a upravovat je.
|
||||||
|
packages.read = <b>Číst:</b> Zobrazovat a stahovat balíčky připojené k repozitáři.
|
||||||
|
actions.read = <b>Číst:</b> Zobrazovat integrované pipeliny CI/CD a jejich protokoly.
|
||||||
|
actions.write = <b>Zapisovat:</b> Ručně spouštět, restartovat, rušit nebo schvalovat čekající pipeliny CI/CD.
|
||||||
|
ext_wiki = Přístup k odkazu v externí wiki. Oprávnění jsou spravována externě.
|
||||||
|
code.read = <b>Číst:</b> Přístup a klonování kódu v repozitáři.
|
||||||
|
issues.read = <b>Číst:</b> Číst a vytvářet problémy a komentáře.
|
||||||
|
ext_issues = Přístup k odkazu v externím sledovacím systému problémů. Oprávnění jsou spravována externě.
|
|
@ -318,7 +318,7 @@ run_user_not_match=Der „Ausführen als“-Benutzername ist nicht der aktuelle
|
||||||
internal_token_failed=Fehler beim Generieren des internen Tokens: %v
|
internal_token_failed=Fehler beim Generieren des internen Tokens: %v
|
||||||
secret_key_failed=Fehler beim Generieren des geheimen Schlüssels: %v
|
secret_key_failed=Fehler beim Generieren des geheimen Schlüssels: %v
|
||||||
save_config_failed=Fehler beim Speichern der Konfiguration: %v
|
save_config_failed=Fehler beim Speichern der Konfiguration: %v
|
||||||
invalid_admin_setting=Administrator-Konto Einstellungen sind ungültig: %v
|
invalid_admin_setting=Die Administratorkonto-Einstellungen sind ungültig: %v
|
||||||
invalid_log_root_path=Pfad zum Log-Verzeichnis ist 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=E-Mail-Adressen standardmäßig verbergen
|
||||||
default_keep_email_private.description=E-Mail-Adressen von neuen Benutzern standardmäßig verbergen, damit diese nicht direkt nach der Registrierung öffentlich wird.
|
default_keep_email_private.description=E-Mail-Adressen von neuen Benutzern standardmäßig verbergen, damit diese nicht direkt nach der Registrierung öffentlich wird.
|
||||||
|
@ -476,6 +476,8 @@ back_to_sign_in = Zurück zur Anmeldung
|
||||||
sign_in_openid = Mit OpenID fortfahren
|
sign_in_openid = Mit OpenID fortfahren
|
||||||
hint_login = Hast du bereits ein Konto? <a href="%s">Jetzt anmelden!</a>
|
hint_login = Hast du bereits ein Konto? <a href="%s">Jetzt anmelden!</a>
|
||||||
hint_register = Brauchst du ein Konto? <a href="%s">Jetzt registrieren.</a>
|
hint_register = Brauchst du ein Konto? <a href="%s">Jetzt registrieren.</a>
|
||||||
|
unauthorized_credentials = Die Zugangsdaten sind inkorrekt oder abgelaufen. Versuchen es erneut oder siehe %s für mehr Informationen
|
||||||
|
use_onetime_code = Einen One-Time-Code benutzen
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Auf %s ansehen
|
view_it_on=Auf %s ansehen
|
||||||
|
@ -716,6 +718,7 @@ public_activity.visibility_hint.self_public = Deine Aktivität ist sichtbar für
|
||||||
public_activity.visibility_hint.admin_public = Diese Aktivität ist sichtbar für alle, aber als Administrator kannst du außerdem Interaktionen in privaten Räumen sehen.
|
public_activity.visibility_hint.admin_public = Diese Aktivität ist sichtbar für alle, aber als Administrator kannst du außerdem Interaktionen in privaten Räumen sehen.
|
||||||
public_activity.visibility_hint.self_private = Deine Aktivität ist nur sichtbar für dich und den Instanzadministratoren. <a href="%s">Konfigurieren</a>.
|
public_activity.visibility_hint.self_private = Deine Aktivität ist nur sichtbar für dich und den Instanzadministratoren. <a href="%s">Konfigurieren</a>.
|
||||||
public_activity.visibility_hint.admin_private = Diese Aktivität ist sichtbar für dich, weil du ein Administrator bist, aber der Benutzer will sie privat halten.
|
public_activity.visibility_hint.admin_private = Diese Aktivität ist sichtbar für dich, weil du ein Administrator bist, aber der Benutzer will sie privat halten.
|
||||||
|
public_activity.visibility_hint.self_private_profile = Deine Aktivität ist nur für dich und die Instanzadministratoren sichtbar, weil den Profil privat ist. <a href="%s">Konfigurieren</a>.
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
profile=Profil
|
profile=Profil
|
||||||
|
@ -1038,7 +1041,7 @@ hints = Hinweise
|
||||||
additional_repo_units_hint = Aktivierung zusätzlicher Repository-Einheiten vorschlagen
|
additional_repo_units_hint = Aktivierung zusätzlicher Repository-Einheiten vorschlagen
|
||||||
update_hints = Hinweise aktualisieren
|
update_hints = Hinweise aktualisieren
|
||||||
update_hints_success = Hinweise wurden aktualisiert.
|
update_hints_success = Hinweise wurden aktualisiert.
|
||||||
additional_repo_units_hint_description = Einen „Mehr Einheiten hinzufügen …“-Button für Repositorys, welche nicht alle verfügbaren Einheiten aktiviert haben, anzeigen.
|
additional_repo_units_hint_description = Einen „Mehr aktivieren“-Hinweis für Repositories, welche nicht alle verfügbaren Einheiten aktiviert haben, anzeigen.
|
||||||
pronouns = Pronomen
|
pronouns = Pronomen
|
||||||
pronouns_custom = Eigene
|
pronouns_custom = Eigene
|
||||||
pronouns_unspecified = Nicht spezifiziert
|
pronouns_unspecified = Nicht spezifiziert
|
||||||
|
@ -1208,12 +1211,12 @@ migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elem
|
||||||
migrated_from=Migriert von <a href="%[1]s">%[2]s</a>
|
migrated_from=Migriert von <a href="%[1]s">%[2]s</a>
|
||||||
migrated_from_fake=Migriert von %[1]s
|
migrated_from_fake=Migriert von %[1]s
|
||||||
migrate.migrate=Migrieren von %s
|
migrate.migrate=Migrieren von %s
|
||||||
migrate.migrating=Migriere von <b>%s</b> ...
|
migrate.migrating=Migriere von <b>%s</b> …
|
||||||
migrate.migrating_failed=Migrieren von <b>%s</b> fehlgeschlagen.
|
migrate.migrating_failed=Migrieren von <b>%s</b> fehlgeschlagen.
|
||||||
migrate.migrating_failed.error=Migration fehlgeschlagen: %s
|
migrate.migrating_failed.error=Migration fehlgeschlagen: %s
|
||||||
migrate.migrating_failed_no_addr=Migration fehlgeschlagen.
|
migrate.migrating_failed_no_addr=Migration fehlgeschlagen.
|
||||||
migrate.github.description=Daten von github.com oder GitHub-Enterprise-Server migrieren.
|
migrate.github.description=Daten von github.com oder GitHub-Enterprise-Server migrieren.
|
||||||
migrate.git.description=Ein Repository von einem beliebigen Git Service klonen.
|
migrate.git.description=Ein Repository von einem beliebigen Git-Service klonen.
|
||||||
migrate.gitlab.description=Daten von gitlab.com oder anderen GitLab-Instanzen migrieren.
|
migrate.gitlab.description=Daten von gitlab.com oder anderen GitLab-Instanzen migrieren.
|
||||||
migrate.gitea.description=Daten von gitea.com oder anderen Gitea-Instanzen migrieren.
|
migrate.gitea.description=Daten von gitea.com oder anderen Gitea-Instanzen migrieren.
|
||||||
migrate.gogs.description=Daten von notabug.org oder anderen Gogs-Instanzen migrieren.
|
migrate.gogs.description=Daten von notabug.org oder anderen Gogs-Instanzen migrieren.
|
||||||
|
@ -1275,7 +1278,7 @@ org_labels_desc_manage=verwalten
|
||||||
milestones=Meilensteine
|
milestones=Meilensteine
|
||||||
commits=Commits
|
commits=Commits
|
||||||
commit=Commit
|
commit=Commit
|
||||||
release=Erscheinungsdatum
|
release=Release
|
||||||
releases=Releases
|
releases=Releases
|
||||||
tag=Tag
|
tag=Tag
|
||||||
released_this=hat released
|
released_this=hat released
|
||||||
|
@ -1299,10 +1302,12 @@ ambiguous_character=`%[1]c [U+%04[1]X] kann mit %[2]c [U+%04[2]X] verwechselt we
|
||||||
escape_control_characters=Escapen
|
escape_control_characters=Escapen
|
||||||
unescape_control_characters=Unescapen
|
unescape_control_characters=Unescapen
|
||||||
file_copy_permalink=Permalink kopieren
|
file_copy_permalink=Permalink kopieren
|
||||||
view_git_blame=Git Blame ansehen
|
view_git_blame=„git blame“ ansehen
|
||||||
video_not_supported_in_browser=Dein Browser unterstützt das HTML5-„video“-Tag nicht.
|
video_not_supported_in_browser=Dein Browser unterstützt das HTML5-„video“-Tag nicht.
|
||||||
audio_not_supported_in_browser=Dein Browser unterstützt das HTML5-„audio“-Tag nicht.
|
audio_not_supported_in_browser=Dein Browser unterstützt das HTML5-„audio“-Tag nicht.
|
||||||
stored_lfs=Gespeichert mit Git LFS
|
stored_lfs=Gespeichert mit Git LFS
|
||||||
|
stored_annex=Gespeichert mit Git Annex
|
||||||
|
stored_annex_not_present = hier nicht vorhanden, versuche git annex whereis
|
||||||
symbolic_link=Softlink
|
symbolic_link=Softlink
|
||||||
executable_file=Ausführbare Datei
|
executable_file=Ausführbare Datei
|
||||||
commit_graph=Commit-Graph
|
commit_graph=Commit-Graph
|
||||||
|
@ -1316,7 +1321,7 @@ commit.load_referencing_branches_and_tags=Lade Branches und Tags, die diesen Com
|
||||||
blame=Blame
|
blame=Blame
|
||||||
download_file=Datei herunterladen
|
download_file=Datei herunterladen
|
||||||
normal_view=Normale Ansicht
|
normal_view=Normale Ansicht
|
||||||
line=zeile
|
line=Zeile
|
||||||
lines=Zeilen
|
lines=Zeilen
|
||||||
from_comment=(Kommentar)
|
from_comment=(Kommentar)
|
||||||
|
|
||||||
|
@ -1326,6 +1331,7 @@ editor.upload_file=Datei hochladen
|
||||||
editor.edit_file=Datei bearbeiten
|
editor.edit_file=Datei bearbeiten
|
||||||
editor.preview_changes=Vorschau der Änderungen
|
editor.preview_changes=Vorschau der Änderungen
|
||||||
editor.cannot_edit_lfs_files=LFS-Dateien können im Webinterface nicht bearbeitet werden.
|
editor.cannot_edit_lfs_files=LFS-Dateien können im Webinterface nicht bearbeitet werden.
|
||||||
|
editor.cannot_edit_annex_files=Annex-Dateien können im Webinterface nicht bearbeitet werden.
|
||||||
editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden.
|
editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden.
|
||||||
editor.edit_this_file=Datei bearbeiten
|
editor.edit_this_file=Datei bearbeiten
|
||||||
editor.this_file_locked=Datei ist gesperrt
|
editor.this_file_locked=Datei ist gesperrt
|
||||||
|
@ -1420,7 +1426,7 @@ commitstatus.failure=Fehler
|
||||||
commitstatus.pending=Ausstehend
|
commitstatus.pending=Ausstehend
|
||||||
commitstatus.success=Erfolg
|
commitstatus.success=Erfolg
|
||||||
|
|
||||||
ext_issues=Zugriff auf Externe Issues
|
ext_issues=Externe Issues
|
||||||
ext_issues.desc=Link zu externem Issuetracker.
|
ext_issues.desc=Link zu externem Issuetracker.
|
||||||
|
|
||||||
projects=Projekte
|
projects=Projekte
|
||||||
|
@ -1521,7 +1527,7 @@ issues.remove_milestone_at=`hat dieses Issue %[2]s vom <b>%[1]s</b> Meilenstein
|
||||||
issues.remove_project_at=`hat dies vom Projekt <b>%s</b> %s entfernt`
|
issues.remove_project_at=`hat dies vom Projekt <b>%s</b> %s entfernt`
|
||||||
issues.deleted_milestone=`(gelöscht)`
|
issues.deleted_milestone=`(gelöscht)`
|
||||||
issues.deleted_project=`(gelöscht)`
|
issues.deleted_project=`(gelöscht)`
|
||||||
issues.self_assign_at=`hat sich das Issue %s selbst zugewiesen`
|
issues.self_assign_at=`hat sich %s selbst zugewiesen`
|
||||||
issues.add_assignee_at=`wurde von <b>%s</b> %s zugewiesen`
|
issues.add_assignee_at=`wurde von <b>%s</b> %s zugewiesen`
|
||||||
issues.remove_assignee_at=`wurde von <b>%s</b> von der Zuweisung %s befreit`
|
issues.remove_assignee_at=`wurde von <b>%s</b> von der Zuweisung %s befreit`
|
||||||
issues.remove_self_assignment=`hat die Selbstzuweisung %s entfernt`
|
issues.remove_self_assignment=`hat die Selbstzuweisung %s entfernt`
|
||||||
|
@ -1601,9 +1607,9 @@ issues.no_content=Keine Beschreibung angegeben.
|
||||||
issues.close=Issue schließen
|
issues.close=Issue schließen
|
||||||
issues.comment_pull_merged_at=hat Commit %[1]s in %[2]s %[3]s zusammengeführt
|
issues.comment_pull_merged_at=hat Commit %[1]s in %[2]s %[3]s zusammengeführt
|
||||||
issues.comment_manually_pull_merged_at=hat Commit %[1]s in %[2]s %[3]s manuell zusammengeführt
|
issues.comment_manually_pull_merged_at=hat Commit %[1]s in %[2]s %[3]s manuell zusammengeführt
|
||||||
issues.close_comment_issue=Kommentieren und schließen
|
issues.close_comment_issue=Mit Kommentar schließen
|
||||||
issues.reopen_issue=Wieder öffnen
|
issues.reopen_issue=Wieder öffnen
|
||||||
issues.reopen_comment_issue=Kommentieren und wieder öffnen
|
issues.reopen_comment_issue=Mit Kommentar wieder öffnen
|
||||||
issues.create_comment=Kommentieren
|
issues.create_comment=Kommentieren
|
||||||
issues.closed_at=`hat diesen Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> geschlossen`
|
issues.closed_at=`hat diesen Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> geschlossen`
|
||||||
issues.reopened_at=`hat dieses Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> wieder geöffnet`
|
issues.reopened_at=`hat dieses Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> wieder geöffnet`
|
||||||
|
@ -1647,7 +1653,7 @@ issues.label_archive_tooltip=Archivierte Labels werden bei der Suche nach Labels
|
||||||
issues.label_exclusive_desc=Nenn das Label <code>Bereich/Element</code>, um es gegenseitig ausschließend mit anderen <code>Bereich/</code>-Labels zu machen.
|
issues.label_exclusive_desc=Nenn das Label <code>Bereich/Element</code>, um es gegenseitig ausschließend mit anderen <code>Bereich/</code>-Labels zu machen.
|
||||||
issues.label_exclusive_warning=Alle im Konflikt stehenden Labels werden beim Bearbeiten der Labels eines Issues oder eines Pull-Requests entfernt.
|
issues.label_exclusive_warning=Alle im Konflikt stehenden Labels werden beim Bearbeiten der Labels eines Issues oder eines Pull-Requests entfernt.
|
||||||
issues.label_count=%d Labels
|
issues.label_count=%d Labels
|
||||||
issues.label_open_issues=%d offene Issues
|
issues.label_open_issues=%d offene Issues/Pull-Requests
|
||||||
issues.label_edit=Bearbeiten
|
issues.label_edit=Bearbeiten
|
||||||
issues.label_delete=Löschen
|
issues.label_delete=Löschen
|
||||||
issues.label_modify=Label bearbeiten
|
issues.label_modify=Label bearbeiten
|
||||||
|
@ -1770,8 +1776,8 @@ issues.review.left_comment=hat einen Kommentar hinterlassen
|
||||||
issues.review.content.empty=Du musst einen Kommentar hinterlassen, der die gewünschte(n) Änderung(en) beschreibt.
|
issues.review.content.empty=Du musst einen Kommentar hinterlassen, der die gewünschte(n) Änderung(en) beschreibt.
|
||||||
issues.review.reject=hat %s Änderungen angefragt
|
issues.review.reject=hat %s Änderungen angefragt
|
||||||
issues.review.wait=wurde für ein Review %s angefragt
|
issues.review.wait=wurde für ein Review %s angefragt
|
||||||
issues.review.add_review_request=hat ein Review von %s %s angefragt
|
issues.review.add_review_request=hat ein Review von %[1]s %[2]s angefragt
|
||||||
issues.review.remove_review_request=hat die Aufforderung zum Review an %s %s entfernt
|
issues.review.remove_review_request=hat die Aufforderung zum Review an %[1]s %[2]s entfernt
|
||||||
issues.review.remove_review_request_self=hat das Review verweigert %s
|
issues.review.remove_review_request_self=hat das Review verweigert %s
|
||||||
issues.review.pending=Ausstehend
|
issues.review.pending=Ausstehend
|
||||||
issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite.
|
issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite.
|
||||||
|
@ -1851,7 +1857,7 @@ pulls.still_in_progress=Noch in Bearbeitung?
|
||||||
pulls.add_prefix=Präfix „<strong>%s</strong>“ hinzufügen
|
pulls.add_prefix=Präfix „<strong>%s</strong>“ hinzufügen
|
||||||
pulls.remove_prefix=Präfix „<strong>%s</strong>“ entfernen
|
pulls.remove_prefix=Präfix „<strong>%s</strong>“ entfernen
|
||||||
pulls.data_broken=Dieser Pull-Requests ist kaputt, da Fork-Informationen gelöscht wurden.
|
pulls.data_broken=Dieser Pull-Requests ist kaputt, da Fork-Informationen gelöscht wurden.
|
||||||
pulls.files_conflicted=Dieser Pull-Request hat Änderungen, die im Widerspruch zum Ziel-Branch stehen.
|
pulls.files_conflicted=Dieser Pull-Request hat Änderungen, die Konflikte mit dem Ziel-Branch haben.
|
||||||
pulls.is_checking=Die Merge-Konfliktprüfung läuft noch. Bitte aktualisiere die Seite in wenigen Augenblicken.
|
pulls.is_checking=Die Merge-Konfliktprüfung läuft noch. Bitte aktualisiere die Seite in wenigen Augenblicken.
|
||||||
pulls.is_ancestor=Dieser Branch ist bereits im Zielbranch enthalten. Es existiert nichts zusammenzuführen.
|
pulls.is_ancestor=Dieser Branch ist bereits im Zielbranch enthalten. Es existiert nichts zusammenzuführen.
|
||||||
pulls.is_empty=Die Änderungen an diesem Branch sind bereits auf dem Zielbranch. Dies wird ein leerer Commit sein.
|
pulls.is_empty=Die Änderungen an diesem Branch sind bereits auf dem Zielbranch. Dies wird ein leerer Commit sein.
|
||||||
|
@ -1984,7 +1990,7 @@ signing.wont_sign.commitssigned=Der Merge-Commit wird nicht signiert werden, da
|
||||||
signing.wont_sign.approved=Der Merge-Commit wird nicht signiert werden, da der Pull-Request nicht genehmigt wurde.
|
signing.wont_sign.approved=Der Merge-Commit wird nicht signiert werden, da der Pull-Request nicht genehmigt wurde.
|
||||||
signing.wont_sign.not_signed_in=Du bist nicht eingeloggt.
|
signing.wont_sign.not_signed_in=Du bist nicht eingeloggt.
|
||||||
|
|
||||||
ext_wiki=Zugriff auf externes Wiki
|
ext_wiki=Externes Wiki
|
||||||
ext_wiki.desc=Verweis auf externes Wiki.
|
ext_wiki.desc=Verweis auf externes Wiki.
|
||||||
|
|
||||||
wiki=Wiki
|
wiki=Wiki
|
||||||
|
@ -2308,32 +2314,32 @@ settings.event_push_desc=Git push in ein Repository.
|
||||||
settings.event_repository=Repository
|
settings.event_repository=Repository
|
||||||
settings.event_repository_desc=Repository erstellt oder gelöscht.
|
settings.event_repository_desc=Repository erstellt oder gelöscht.
|
||||||
settings.event_header_issue=Issue-Ereignisse
|
settings.event_header_issue=Issue-Ereignisse
|
||||||
settings.event_issues=Issues
|
settings.event_issues=Änderung
|
||||||
settings.event_issues_desc=Issue geöffnet, geschlossen, wieder geöffnet oder bearbeitet.
|
settings.event_issues_desc=Issue geöffnet, geschlossen, wieder geöffnet oder bearbeitet.
|
||||||
settings.event_issue_assign=Issue zugewiesen
|
settings.event_issue_assign=Zuweisung
|
||||||
settings.event_issue_assign_desc=Issue zugewiesen oder Zuweisung entfernt.
|
settings.event_issue_assign_desc=Issue zugewiesen oder Zuweisung entfernt.
|
||||||
settings.event_issue_label=Issue mit Label versehen
|
settings.event_issue_label=Labels
|
||||||
settings.event_issue_label_desc=Issue-Labels aktualisiert oder geleert.
|
settings.event_issue_label_desc=Issue-Labels hinzugefügt oder entfernt.
|
||||||
settings.event_issue_milestone=Meilenstein einem Issue zugewiesen
|
settings.event_issue_milestone=Meilensteine
|
||||||
settings.event_issue_milestone_desc=Meilenstein zu Issue hinzugefügt oder entfernt.
|
settings.event_issue_milestone_desc=Meilenstein hinzugefügt, entfernt oder verändert.
|
||||||
settings.event_issue_comment=Issue-Kommentar
|
settings.event_issue_comment=Kommentare
|
||||||
settings.event_issue_comment_desc=Issue-Kommentar angelegt, geändert oder gelöscht.
|
settings.event_issue_comment_desc=Issue-Kommentar angelegt, geändert oder gelöscht.
|
||||||
settings.event_header_pull_request=Pull-Request-Ereignisse
|
settings.event_header_pull_request=Pull-Request-Ereignisse
|
||||||
settings.event_pull_request=Pull-Request
|
settings.event_pull_request=Änderung
|
||||||
settings.event_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder geöffnet oder bearbeitet.
|
settings.event_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder geöffnet oder bearbeitet.
|
||||||
settings.event_pull_request_assign=Pull-Request zugewiesen
|
settings.event_pull_request_assign=Zuweisung
|
||||||
settings.event_pull_request_assign_desc=Pull-Request zugewiesen oder Zuweisung entfernt.
|
settings.event_pull_request_assign_desc=Pull-Request zugewiesen oder Zuweisung entfernt.
|
||||||
settings.event_pull_request_label=Pull-Request mit Label versehen
|
settings.event_pull_request_label=Labels
|
||||||
settings.event_pull_request_label_desc=Pull-Request-Labels aktualisiert oder geleert.
|
settings.event_pull_request_label_desc=Pull-Request-Labels hinzugefügt oder entfernt.
|
||||||
settings.event_pull_request_milestone=Pull-Request zum Meilenstein hinzugefügt
|
settings.event_pull_request_milestone=Meilensteine
|
||||||
settings.event_pull_request_milestone_desc=Pull-Request zum Meilenstein hinzugefügt oder entfernt.
|
settings.event_pull_request_milestone_desc=Meilenstein hinzugefügt, entfernt oder bearbeitet.
|
||||||
settings.event_pull_request_comment=Pull-Request-Kommentar
|
settings.event_pull_request_comment=Kommentare
|
||||||
settings.event_pull_request_comment_desc=Pull-Request-Kommentar angelegt, geändert oder gelöscht.
|
settings.event_pull_request_comment_desc=Pull-Request-Kommentar angelegt, geändert oder gelöscht.
|
||||||
settings.event_pull_request_review=Pull-Request überprüft
|
settings.event_pull_request_review=Reviews
|
||||||
settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Kommentar hinterlassen.
|
settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Review-Kommentare hinterlassen.
|
||||||
settings.event_pull_request_sync=Pull-Request synchronisiert
|
settings.event_pull_request_sync=Synchronisiert
|
||||||
settings.event_pull_request_sync_desc=Pull-Request synchronisiert.
|
settings.event_pull_request_sync_desc=Branch automatisch mit Zielbranch aktualisiert.
|
||||||
settings.event_pull_request_review_request=Überprüfung des Pull-Requests angefragt
|
settings.event_pull_request_review_request=Review-Anfragen
|
||||||
settings.event_pull_request_review_request_desc=Überprüfung des Pull-Requests angefragt oder die Anfrage entfernt.
|
settings.event_pull_request_review_request_desc=Überprüfung des Pull-Requests angefragt oder die Anfrage entfernt.
|
||||||
settings.event_pull_request_approvals=Genehmigungen zum Pull-Request
|
settings.event_pull_request_approvals=Genehmigungen zum Pull-Request
|
||||||
settings.event_pull_request_merge=Pull-Request-Merge
|
settings.event_pull_request_merge=Pull-Request-Merge
|
||||||
|
@ -2434,7 +2440,7 @@ settings.require_signed_commits_desc=Pushes auf diesen Branch ablehnen, wenn Com
|
||||||
settings.protect_branch_name_pattern=Muster für geschützte Branchnamen
|
settings.protect_branch_name_pattern=Muster für geschützte Branchnamen
|
||||||
settings.protect_patterns=Muster
|
settings.protect_patterns=Muster
|
||||||
settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolon „;“ getrennt)
|
settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolon „;“ getrennt)
|
||||||
settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe <a href="%s">github.com/gobwas/glob</a> Dokumentation zur Mustersyntax. Beispiele: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe <a href="%s">%s</a> Dokumentation zur Mustersyntax. Beispiele: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon „;“ getrennt)
|
settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon „;“ getrennt)
|
||||||
settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe <a href="%[1]s">%[2]s</a> Dokumentation zur Mustersyntax. Beispiele: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe <a href="%[1]s">%[2]s</a> Dokumentation zur Mustersyntax. Beispiele: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.add_protected_branch=Schutz aktivieren
|
settings.add_protected_branch=Schutz aktivieren
|
||||||
|
@ -2503,7 +2509,7 @@ settings.lfs_invalid_locking_path=Ungültiger Pfad: %s
|
||||||
settings.lfs_invalid_lock_directory=Verzeichnis kann nicht gesperrt werden: %s
|
settings.lfs_invalid_lock_directory=Verzeichnis kann nicht gesperrt werden: %s
|
||||||
settings.lfs_lock_already_exists=Sperre existiert bereits: %s
|
settings.lfs_lock_already_exists=Sperre existiert bereits: %s
|
||||||
settings.lfs_lock=Sperren
|
settings.lfs_lock=Sperren
|
||||||
settings.lfs_lock_path=Zu sperrender Dateipfad...
|
settings.lfs_lock_path=Zu sperrender Dateipfad …
|
||||||
settings.lfs_locks_no_locks=Keine Sperren
|
settings.lfs_locks_no_locks=Keine Sperren
|
||||||
settings.lfs_lock_file_no_exist=Gesperrte Datei existiert nicht im Standard-Branch
|
settings.lfs_lock_file_no_exist=Gesperrte Datei existiert nicht im Standard-Branch
|
||||||
settings.lfs_force_unlock=Freigabe erzwingen
|
settings.lfs_force_unlock=Freigabe erzwingen
|
||||||
|
@ -2587,7 +2593,7 @@ release.draft=Entwurf
|
||||||
release.prerelease=Pre-Release
|
release.prerelease=Pre-Release
|
||||||
release.stable=Stabil
|
release.stable=Stabil
|
||||||
release.compare=Vergleichen
|
release.compare=Vergleichen
|
||||||
release.edit=bearbeiten
|
release.edit=Bearbeiten
|
||||||
release.ahead.commits=<strong>%d</strong> Commits
|
release.ahead.commits=<strong>%d</strong> Commits
|
||||||
release.ahead.target=zu %s seit dieser Version
|
release.ahead.target=zu %s seit dieser Version
|
||||||
tag.ahead.target=auf %s seit diesem Tag
|
tag.ahead.target=auf %s seit diesem Tag
|
||||||
|
@ -2684,7 +2690,7 @@ rss.must_be_on_branch = Du musst auf einem Branch sein, um einen RSS-Feed zu hab
|
||||||
new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? <a href="%s">Repository migrieren.</a>
|
new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? <a href="%s">Repository migrieren.</a>
|
||||||
issues.comment.blocked_by_user = Du kannst kein Kommentar für dieses Issue erstellen, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest.
|
issues.comment.blocked_by_user = Du kannst kein Kommentar für dieses Issue erstellen, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest.
|
||||||
clone_in_vscodium = In VSCodium klonen
|
clone_in_vscodium = In VSCodium klonen
|
||||||
settings.units.add_more = Mehr hinzufügen …
|
settings.units.add_more = Mehr aktivieren
|
||||||
settings.wiki_rename_branch_main_desc = Den Branch, der intern vom Wiki benutzt wird, zu „%s“ umbenennen. Dies ist permanent und kann nicht rückgängig gemacht werden.
|
settings.wiki_rename_branch_main_desc = Den Branch, der intern vom Wiki benutzt wird, zu „%s“ umbenennen. Dies ist permanent und kann nicht rückgängig gemacht werden.
|
||||||
desc.sha256 = SHA256
|
desc.sha256 = SHA256
|
||||||
object_format_helper = Objektformat des Repositorys. Kann später nicht geändert werden. SHA1 ist am kompatibelsten.
|
object_format_helper = Objektformat des Repositorys. Kann später nicht geändert werden. SHA1 ist am kompatibelsten.
|
||||||
|
@ -2727,7 +2733,7 @@ pulls.fast_forward_only_merge_pull_request = Nur Fast-forward
|
||||||
pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen.
|
pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen.
|
||||||
pulls.cmd_instruction_merge_title = Zusammenführen
|
pulls.cmd_instruction_merge_title = Zusammenführen
|
||||||
pulls.cmd_instruction_merge_desc = Die Änderungen zusammenführen und auf Forgejo aktualisieren.
|
pulls.cmd_instruction_merge_desc = Die Änderungen zusammenführen und auf Forgejo aktualisieren.
|
||||||
settings.units.units = Repository-Einheiten
|
settings.units.units = Einheiten
|
||||||
settings.units.overview = Übersicht
|
settings.units.overview = Übersicht
|
||||||
settings.wiki_rename_branch_main_notices_1 = Diese Aktion <strong>KANN NICHT</strong> rückgängig gemacht werden.
|
settings.wiki_rename_branch_main_notices_1 = Diese Aktion <strong>KANN NICHT</strong> rückgängig gemacht werden.
|
||||||
settings.wiki_rename_branch_main_notices_2 = Dies wird den internen Branch des Repository-Wikis von %s permanent umbenennen. Existierende Checkouts müssen aktualisiert werden.
|
settings.wiki_rename_branch_main_notices_2 = Dies wird den internen Branch des Repository-Wikis von %s permanent umbenennen. Existierende Checkouts müssen aktualisiert werden.
|
||||||
|
@ -2826,6 +2832,15 @@ mirror_denied_combination = Authentifizierung mittels öffentlichem Schlüssel u
|
||||||
settings.mirror_settings.push_mirror.none_ssh = Nichts
|
settings.mirror_settings.push_mirror.none_ssh = Nichts
|
||||||
settings.mirror_settings.push_mirror.copy_public_key = Öffentlichen Schlüssel kopieren
|
settings.mirror_settings.push_mirror.copy_public_key = Öffentlichen Schlüssel kopieren
|
||||||
mirror_use_ssh.not_available = SSH-Authentifizierung ist nicht verfügbar.
|
mirror_use_ssh.not_available = SSH-Authentifizierung ist nicht verfügbar.
|
||||||
|
issues.new.assign_to_me = Mir selbst zuweisen
|
||||||
|
issues.all_title = Alle
|
||||||
|
settings.discord_icon_url.exceeds_max_length = Die Icon-URL darf eine Länge von 2048 Zeichen nicht überschreiten
|
||||||
|
issues.review.add_review_requests = hat Reviews von %[1]s %[2]s angefragt
|
||||||
|
issues.review.remove_review_requests = hat Aufforderungen zum Review an %[1]s %[2]s entfernt
|
||||||
|
issues.review.add_remove_review_requests = hat Reviews von %[1]s angefragt und hat die Aufforderungen zum Review an %[2]s %[3]s entfernt
|
||||||
|
pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den Sie löschen wollen, ist der Standardbranch und kann nicht gelöscht werden.
|
||||||
|
pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den Sie löschen wollen, ist ein geschützter Branch und kann nicht gelöscht werden.
|
||||||
|
pulls.delete_after_merge.head_branch.insufficient_branch = Sie haben keine Erlaubnis, den Head-Branch zu löschen.
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
|
|
||||||
|
@ -3265,12 +3280,12 @@ auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter %s
|
||||||
auths.tip.nextcloud=Registriere einen neuen OAuth-Consumer auf deiner Instanz über das folgende Menü: „Settings -> Security -> OAuth 2.0 client“
|
auths.tip.nextcloud=Registriere einen neuen OAuth-Consumer auf deiner Instanz über das folgende Menü: „Settings -> Security -> OAuth 2.0 client“
|
||||||
auths.tip.dropbox=Erstelle eine neue App auf %s
|
auths.tip.dropbox=Erstelle eine neue App auf %s
|
||||||
auths.tip.facebook=Erstelle eine neue Anwendung auf %s und füge das Produkt „Facebook Login“ hinzu
|
auths.tip.facebook=Erstelle eine neue Anwendung auf %s und füge das Produkt „Facebook Login“ hinzu
|
||||||
auths.tip.github=Erstelle unter %s eine neue OAuth-Anwendung.
|
auths.tip.github=Registriere unter %s eine neue OAuth-Anwendung
|
||||||
auths.tip.gitlab=Erstelle unter https://gitlab.com/profile/applications eine neue Anwendung.
|
auths.tip.gitlab=Erstelle unter https://gitlab.com/profile/applications eine neue Anwendung.
|
||||||
auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter %s
|
auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter %s
|
||||||
auths.tip.openid_connect=Benutze die OpenID-Connect-Discovery-URL (<server>/.well-known/openid-configuration), um die Endpunkte zu spezifizieren
|
auths.tip.openid_connect=Benutze die OpenID-Connect-Discovery-URL (<server>/.well-known/openid-configuration), um die Endpunkte zu spezifizieren
|
||||||
auths.tip.twitter=Gehe auf %s, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist
|
auths.tip.twitter=Gehe auf %s, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist
|
||||||
auths.tip.discord=Erstelle unter %s eine neue Anwendung.
|
auths.tip.discord=Registriere unter %s eine neue Anwendung
|
||||||
auths.tip.gitea=Registriere eine neue OAuth2-Anwendung. Eine Anleitung findest du unter %s
|
auths.tip.gitea=Registriere eine neue OAuth2-Anwendung. Eine Anleitung findest du unter %s
|
||||||
auths.tip.yandex=`Erstelle eine neue Anwendung auf %s. Wähle folgende Berechtigungen aus dem Abschnitt „Yandex.Passport API“: „Zugriff auf E-Mail-Adresse“, „Zugriff auf Benutzeravatar“ und „Zugriff auf Benutzername, Vor- und Nachname, Geschlecht“`
|
auths.tip.yandex=`Erstelle eine neue Anwendung auf %s. Wähle folgende Berechtigungen aus dem Abschnitt „Yandex.Passport API“: „Zugriff auf E-Mail-Adresse“, „Zugriff auf Benutzeravatar“ und „Zugriff auf Benutzername, Vor- und Nachname, Geschlecht“`
|
||||||
auths.tip.mastodon=Gib eine benutzerdefinierte URL für die Mastodon-Instanz ein, mit der du dich authentifizieren möchtest (oder benutze die standardmäßige)
|
auths.tip.mastodon=Gib eine benutzerdefinierte URL für die Mastodon-Instanz ein, mit der du dich authentifizieren möchtest (oder benutze die standardmäßige)
|
||||||
|
@ -3792,7 +3807,7 @@ management=Secrets verwalten
|
||||||
[actions]
|
[actions]
|
||||||
actions=Actions
|
actions=Actions
|
||||||
|
|
||||||
unit.desc=Integrierte CI/CD-Pipelines mit Forgejo-Actions verwalten
|
unit.desc=Integrierte CI/CD-Pipelines mit Forgejo-Actions verwalten.
|
||||||
|
|
||||||
status.unknown=Unbekannt
|
status.unknown=Unbekannt
|
||||||
status.waiting=Wartend
|
status.waiting=Wartend
|
||||||
|
@ -3947,6 +3962,8 @@ pull_kind = Pulls durchsuchen …
|
||||||
union = Vereinigungsmenge
|
union = Vereinigungsmenge
|
||||||
union_tooltip = Ergebnisse, die auf ein beliebiges von den Whitespace getrennten Schlüsselwörtern passen, einbinden
|
union_tooltip = Ergebnisse, die auf ein beliebiges von den Whitespace getrennten Schlüsselwörtern passen, einbinden
|
||||||
milestone_kind = Meilensteine suchen …
|
milestone_kind = Meilensteine suchen …
|
||||||
|
regexp = RegExp
|
||||||
|
regexp_tooltip = Suchbegriff als regulären Ausdruck interpretieren
|
||||||
|
|
||||||
[markup]
|
[markup]
|
||||||
filepreview.line = Zeile %[1]d in %[2]s
|
filepreview.line = Zeile %[1]d in %[2]s
|
||||||
|
@ -3964,4 +3981,24 @@ eib = EiB
|
||||||
|
|
||||||
|
|
||||||
[translation_meta]
|
[translation_meta]
|
||||||
test = ok
|
test = ok
|
||||||
|
|
||||||
|
[repo.permissions]
|
||||||
|
code.write = <b>Schreiben:</b> In das Repository pushen, Branches und Tags erstellen.
|
||||||
|
code.read = <b>Lesen:</b> Zugriff auf das Repository und Klonen.
|
||||||
|
issues.read = <b>Lesen:</b> Issues und Kommentare lesen und erstellen.
|
||||||
|
issues.write = <b>Schreiben:</b> Issues schließen und Metadaten wie Labels, Meilensteine, Zuweisungen, Fälligkeitsdaten und Abhängigkeiten verwalten.
|
||||||
|
pulls.read = <b>Lesen:</b> Pull-Requests lesen und erstellen.
|
||||||
|
releases.read = <b>Lesen:</b> Releases ansehen und herunterladen.
|
||||||
|
releases.write = <b>Schreiben:</b> Releases und ihre Assets veröffentlichen, bearbeiten und löschen.
|
||||||
|
wiki.read = <b>Lesen:</b> Das integrierte Wiki und seine Historie lesen.
|
||||||
|
wiki.write = <b>Schreiben:</b> Seiten im integrierten Wiki erstellen, aktualisieren und löschen.
|
||||||
|
projects.read = <b>Lesen:</b> Zugriff auf Projektboards des Repositories.
|
||||||
|
projects.write = <b>Schreiben:</b> Projekte und Spalten erstellen und bearbeiten.
|
||||||
|
packages.read = <b>Lesen:</b> Pakete dieses Repositories betrachten und herunterladen.
|
||||||
|
packages.write = <b>Schreiben:</b> Pakete dieses Repositories veröffentlichen und löschen.
|
||||||
|
actions.read = <b>Lesen:</b> Integrierte CI/CD-Pipelines und ihre Logs betrachten.
|
||||||
|
actions.write = <b>Schreiben:</b> Ausstehende CI/CD-Pipelines manuell auslösen, neustarten, abbrechen oder genehmigen.
|
||||||
|
ext_issues = Zugriff auf den Link zu einem externen Issue-Tracker. Die Berechtigungen werden extern verwaltet.
|
||||||
|
ext_wiki = Zugriff auf den Link zu einem externen Wiki. Die Berechtigungen werden extern verwaltet.
|
||||||
|
pulls.write = <b>Schreiben:</b> Pull-Requests schließen und Metadaten wie Labels, Meilensteine, Zuweisungen, Fälligkeitsdaten und Abhängigkeiten verwalten.
|
|
@ -51,7 +51,7 @@ webauthn_error_empty=Πρέπει να ορίσετε ένα όνομα για
|
||||||
webauthn_error_timeout=Το χρονικό όριο έφτασε πριν το κλειδί να διαβαστεί. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.
|
webauthn_error_timeout=Το χρονικό όριο έφτασε πριν το κλειδί να διαβαστεί. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.
|
||||||
webauthn_reload=Ανανέωση
|
webauthn_reload=Ανανέωση
|
||||||
|
|
||||||
repository=Αποθετήριο
|
repository=Repository
|
||||||
organization=Οργανισμός
|
organization=Οργανισμός
|
||||||
mirror=Αντίγραφο
|
mirror=Αντίγραφο
|
||||||
new_repo=Νέο αποθετήριο
|
new_repo=Νέο αποθετήριο
|
||||||
|
@ -129,7 +129,7 @@ archived=Αρχειοθετήθηκε
|
||||||
|
|
||||||
concept_system_global=Γενικό
|
concept_system_global=Γενικό
|
||||||
concept_user_individual=Ατομικό
|
concept_user_individual=Ατομικό
|
||||||
concept_code_repository=Αποθετήριο
|
concept_code_repository=Repository
|
||||||
concept_user_organization=Οργανισμός
|
concept_user_organization=Οργανισμός
|
||||||
|
|
||||||
show_timestamps=Εμφάνιση χρονοσημάνσεων
|
show_timestamps=Εμφάνιση χρονοσημάνσεων
|
||||||
|
@ -160,11 +160,11 @@ invalid_data = Τα δεδομένα δεν είναι έγκυρα: %v
|
||||||
test = Τεστ
|
test = Τεστ
|
||||||
copy_generic = Αντιγραφή στο πρόχειρο
|
copy_generic = Αντιγραφή στο πρόχειρο
|
||||||
error413 = Έχετε εξαντλήσει τους διαθέσιμους πόρους σας.
|
error413 = Έχετε εξαντλήσει τους διαθέσιμους πόρους σας.
|
||||||
new_repo.link = Νέο αποθετήριο
|
new_repo.link = Νέο repository
|
||||||
new_migrate.link = Νέα μεταφορά
|
new_migrate.link = Νέα μεταφορά
|
||||||
new_org.link = Νέος οργανισμός
|
new_org.link = Νέος οργανισμός
|
||||||
new_migrate.title = Νέα μεταφορά
|
new_migrate.title = Νέα μεταφορά
|
||||||
new_repo.title = Νέο αποθετήριο
|
new_repo.title = Νέο repository
|
||||||
new_org.title = Νέος οργανισμός
|
new_org.title = Νέος οργανισμός
|
||||||
|
|
||||||
[aria]
|
[aria]
|
||||||
|
@ -504,8 +504,8 @@ reset_password.text=Εφόσον το αίτημα δημιουργήθηκε α
|
||||||
|
|
||||||
register_success=Η εγγραφή ολοκληρώθηκε επιτυχώς
|
register_success=Η εγγραφή ολοκληρώθηκε επιτυχώς
|
||||||
|
|
||||||
issue_assigned.pull=Ο/Η @%[1]s σας έχει αναθέσει στο pull request %[2]s στο αποθετήριο %[3]s.
|
issue_assigned.pull=Ο/Η @%[1]s σας έχει αναθέσει στο pull request %[2]s στο repository %[3]s.
|
||||||
issue_assigned.issue=Ο/Η @%[1]s σας ανέθεσε το ζήτημα %[2]s στο αποθετήριο %[3]s.
|
issue_assigned.issue=Ο/Η @%[1]s σας ανέθεσε το ζήτημα %[2]s στο repository %[3]s.
|
||||||
|
|
||||||
issue.x_mentioned_you=Ο/Η <b>@%s</b> σας ανέφερε:
|
issue.x_mentioned_you=Ο/Η <b>@%s</b> σας ανέφερε:
|
||||||
issue.action.force_push=Ο/Η <b>%[1]s</b> έκανε force-push το <b>%[2]s</b> από %[3]s σε %[4]s.
|
issue.action.force_push=Ο/Η <b>%[1]s</b> έκανε force-push το <b>%[2]s</b> από %[3]s σε %[4]s.
|
||||||
|
@ -530,13 +530,13 @@ release.downloads=Λήψεις:
|
||||||
release.download.zip=Πηγαίος Κώδικας (ZIP)
|
release.download.zip=Πηγαίος Κώδικας (ZIP)
|
||||||
release.download.targz=Πηγαίος Κώδικας (TAR.GZ)
|
release.download.targz=Πηγαίος Κώδικας (TAR.GZ)
|
||||||
|
|
||||||
repo.transfer.subject_to=Ο/Η %s θα ήθελε να μεταφέρει το αποθετήριο «%s» σε %s
|
repo.transfer.subject_to=Ο/Η %s θα ήθελε να μεταφέρει το repository «%s» στο %s
|
||||||
repo.transfer.subject_to_you=Ο/Η %s θα ήθελε να σας μεταφέρει το αποθετήριο «%s»
|
repo.transfer.subject_to_you=Ο/Η %s θα ήθελε να σας μεταφέρει το repository «%s»
|
||||||
repo.transfer.to_you=εσάς
|
repo.transfer.to_you=εσάς
|
||||||
repo.transfer.body=Για να αποδεχτείτε ή να απορρίψετε το αίτημα αυτό, επισκεφθείτε το %s ή απλά αγνοήστε το.
|
repo.transfer.body=Για να αποδεχτείτε ή να απορρίψετε το αίτημα αυτό, επισκεφθείτε το %s ή απλά αγνοήστε το.
|
||||||
|
|
||||||
repo.collaborator.added.subject=Ο/Η %s σας πρόσθεσε στο %s ως συνεργάτη
|
repo.collaborator.added.subject=Ο/Η %s σας πρόσθεσε στο %s ως συνεργάτη
|
||||||
repo.collaborator.added.text=Είστε πλέον συνεργάτης στο αποθετήριο:
|
repo.collaborator.added.text=Είστε πλέον συνεργάτης στο repository:
|
||||||
|
|
||||||
team_invite.subject=Ο/Η %[1]s σας προσκάλεσε να συμμετέχετε στον οργανισμό %[2]s
|
team_invite.subject=Ο/Η %[1]s σας προσκάλεσε να συμμετέχετε στον οργανισμό %[2]s
|
||||||
team_invite.text_1=Ο/Η %[1]s σας προσκάλεσε να συμμετέχετε στην ομάδα %[2]s του οργανισμού %[3]s.
|
team_invite.text_1=Ο/Η %[1]s σας προσκάλεσε να συμμετέχετε στην ομάδα %[2]s του οργανισμού %[3]s.
|
||||||
|
@ -615,10 +615,10 @@ username_change_not_local_user=Δεν επιτρέπεται στους μη τ
|
||||||
username_has_not_been_changed=Το όνομα χρήστη δεν άλλαξε
|
username_has_not_been_changed=Το όνομα χρήστη δεν άλλαξε
|
||||||
repo_name_been_taken=Το όνομα του αποθετηρίου χρησιμοποιείται ήδη.
|
repo_name_been_taken=Το όνομα του αποθετηρίου χρησιμοποιείται ήδη.
|
||||||
repository_force_private=Η επιλογή Μόνο Ιδιωτικά είναι ενεργοποιημένη: τα ιδιωτικά αποθετήρια δεν μπορούν να δημοσιευθούν.
|
repository_force_private=Η επιλογή Μόνο Ιδιωτικά είναι ενεργοποιημένη: τα ιδιωτικά αποθετήρια δεν μπορούν να δημοσιευθούν.
|
||||||
repository_files_already_exist=Αρχεία υπάρχουν ήδη για αυτό το αποθετήριο. Επικοινωνήστε με το διαχειριστή του συστήματος.
|
repository_files_already_exist=Αρχεία υπάρχουν ήδη για αυτό το repository. Επικοινωνήστε με το διαχειριστή του συστήματος.
|
||||||
repository_files_already_exist.adopt=Αρχεία υπάρχουν ήδη για αυτό το αποθετήριο και μπορούν να Υιοθετηθούν μόνο.
|
repository_files_already_exist.adopt=Αρχεία υπάρχουν ήδη για αυτό το repository και μπορούν μόνο να υιοθετηθούν.
|
||||||
repository_files_already_exist.delete=Τα αρχεία υπάρχουν ήδη για αυτόν το αποθετήριο. Πρέπει να τα διαγράψετε.
|
repository_files_already_exist.delete=Τα αρχεία υπάρχουν ήδη για αυτόν το repository. Πρέπει να τα διαγράψετε.
|
||||||
repository_files_already_exist.adopt_or_delete=Τα αρχεία υπάρχουν ήδη για αυτόν το αποθετήριο. Είτε υιοθετήστε τα είτε διαγράψτε τα.
|
repository_files_already_exist.adopt_or_delete=Υπάρχουν ήδη τα αρχεία για αυτό το repository. Πρέπει να τα υιοθετήσετε ή να τα διαγράψετε.
|
||||||
visit_rate_limit=Συναντήθηκε το όριο ρυθμού κατά την απομακρυσμένη πρόσβαση.
|
visit_rate_limit=Συναντήθηκε το όριο ρυθμού κατά την απομακρυσμένη πρόσβαση.
|
||||||
2fa_auth_required=Απαιτήθηκε ταυτοποίηση δύο παραγόντων κατά την απομακρυσμένη πρόσβαση.
|
2fa_auth_required=Απαιτήθηκε ταυτοποίηση δύο παραγόντων κατά την απομακρυσμένη πρόσβαση.
|
||||||
org_name_been_taken=Το όνομα του οργανισμού χρησιμοποιείται ήδη.
|
org_name_been_taken=Το όνομα του οργανισμού χρησιμοποιείται ήδη.
|
||||||
|
@ -925,7 +925,7 @@ access_token_deletion_cancel_action=Άκυρο
|
||||||
access_token_deletion_confirm_action=Διαγραφή
|
access_token_deletion_confirm_action=Διαγραφή
|
||||||
access_token_deletion_desc=Η διαγραφή ενός διακριτικού θα ανακαλέσει οριστικά την πρόσβαση στο λογαριασμό σας για εφαρμογές που το χρησιμοποιούν. Συνέχεια;
|
access_token_deletion_desc=Η διαγραφή ενός διακριτικού θα ανακαλέσει οριστικά την πρόσβαση στο λογαριασμό σας για εφαρμογές που το χρησιμοποιούν. Συνέχεια;
|
||||||
delete_token_success=Το διακριτικό έχει διαγραφεί. Οι εφαρμογές που το χρησιμοποιούν δεν έχουν πλέον πρόσβαση στο λογαριασμό σας.
|
delete_token_success=Το διακριτικό έχει διαγραφεί. Οι εφαρμογές που το χρησιμοποιούν δεν έχουν πλέον πρόσβαση στο λογαριασμό σας.
|
||||||
repo_and_org_access=Πρόσβαση στο Αποθετήριο και Οργανισμό
|
repo_and_org_access=Πρόσβαση στο repository και οργανισμό
|
||||||
permissions_public_only=Δημόσια μόνο
|
permissions_public_only=Δημόσια μόνο
|
||||||
permissions_access_all=Όλα (δημόσια, ιδιωτικά, και περιορισμένα)
|
permissions_access_all=Όλα (δημόσια, ιδιωτικά, και περιορισμένα)
|
||||||
select_permissions=Επιλογή δικαιωμάτων
|
select_permissions=Επιλογή δικαιωμάτων
|
||||||
|
@ -1005,7 +1005,7 @@ remove_account_link_success=Ο συνδεδεμένος λογαριασμός
|
||||||
hooks.desc=Προσθήκη webhooks που θα ενεργοποιούνται για <strong>όλα τα αποθετήρια</strong> που σας ανήκουν.
|
hooks.desc=Προσθήκη webhooks που θα ενεργοποιούνται για <strong>όλα τα αποθετήρια</strong> που σας ανήκουν.
|
||||||
|
|
||||||
orgs_none=Δεν είστε μέλος σε κάποιο οργανισμό.
|
orgs_none=Δεν είστε μέλος σε κάποιο οργανισμό.
|
||||||
repos_none=Δεν σας ανήκει κανένα κάποιο αποθετήριο.
|
repos_none=Δεν υπάρχει κάποιο repository που σας ανήκει.
|
||||||
|
|
||||||
delete_account=Διαγραφή του λογαριασμού σας
|
delete_account=Διαγραφή του λογαριασμού σας
|
||||||
delete_prompt=Αυτή η ενέργεια θα διαγράψει μόνιμα το λογαριασμό σας. <strong>ΔΕΝ ΘΑ ΜΠΟΡΕΙ</strong> να επανέλθει.
|
delete_prompt=Αυτή η ενέργεια θα διαγράψει μόνιμα το λογαριασμό σας. <strong>ΔΕΝ ΘΑ ΜΠΟΡΕΙ</strong> να επανέλθει.
|
||||||
|
@ -1047,7 +1047,7 @@ language.localization_project = Βοηθήστε μας να μεταφράσο
|
||||||
language.description = Από εδώ και στο εξής, αυτή η γλώσσα θα χρησιμοποιείται από προεπιλογή για τον λογαριασμό σας.
|
language.description = Από εδώ και στο εξής, αυτή η γλώσσα θα χρησιμοποιείται από προεπιλογή για τον λογαριασμό σας.
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
new_repo_helper=Ένα αποθετήριο περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Ήδη φιλοξενείται αλλού; <a href="%s">Μετεγκατάσταση αποθετηρίου.</a>
|
new_repo_helper=Ένα repository περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Έχετε ήδη ένα που φιλοξενείται κάπου αλλού; <a href="%s">Μεταφορά αποθετηρίου.</a>
|
||||||
owner=Ιδιοκτήτης
|
owner=Ιδιοκτήτης
|
||||||
owner_helper=Ορισμένοι οργανισμοί ενδέχεται να μην εμφανίζονται στο αναπτυσσόμενο μενού λόγω του μέγιστου αριθμού αποθετηρίων.
|
owner_helper=Ορισμένοι οργανισμοί ενδέχεται να μην εμφανίζονται στο αναπτυσσόμενο μενού λόγω του μέγιστου αριθμού αποθετηρίων.
|
||||||
repo_name=Όνομα αποθετηρίου
|
repo_name=Όνομα αποθετηρίου
|
||||||
|
@ -1055,7 +1055,7 @@ repo_name_helper=Τα καλά ονόματα αποθετηρίων χρησι
|
||||||
repo_size=Μέγεθος Αποθετηρίου
|
repo_size=Μέγεθος Αποθετηρίου
|
||||||
template=Πρότυπο
|
template=Πρότυπο
|
||||||
template_select=Επιλέξτε ένα πρότυπο
|
template_select=Επιλέξτε ένα πρότυπο
|
||||||
template_helper=Μετατροπή σε πρότυπο αποθετήριο
|
template_helper=Μετατροπή σε πρότυπο repository
|
||||||
template_description=Τα πρότυπα αποθετήρια επιτρέπουν στους χρήστες να δημιουργήσουν νέα αποθετήρια με την ίδια δομή, αρχεία και προαιρετικές ρυθμίσεις.
|
template_description=Τα πρότυπα αποθετήρια επιτρέπουν στους χρήστες να δημιουργήσουν νέα αποθετήρια με την ίδια δομή, αρχεία και προαιρετικές ρυθμίσεις.
|
||||||
visibility=Ορατότητα
|
visibility=Ορατότητα
|
||||||
visibility_description=Μόνο ο ιδιοκτήτης ή τα μέλη του οργανισμού εάν έχουν δικαιώματα, θα είναι σε θέση να το δουν.
|
visibility_description=Μόνο ο ιδιοκτήτης ή τα μέλη του οργανισμού εάν έχουν δικαιώματα, θα είναι σε θέση να το δουν.
|
||||||
|
@ -1070,7 +1070,7 @@ fork_to_different_account=Fork σε διαφορετικό λογαριασμό
|
||||||
fork_visibility_helper=Η ορατότητα ενός fork αποθετηρίου δεν μπορεί να αλλάξει.
|
fork_visibility_helper=Η ορατότητα ενός fork αποθετηρίου δεν μπορεί να αλλάξει.
|
||||||
fork_branch=Κλάδος που θα κλωνοποιηθεί στο fork
|
fork_branch=Κλάδος που θα κλωνοποιηθεί στο fork
|
||||||
all_branches=Όλοι οι κλάδοι
|
all_branches=Όλοι οι κλάδοι
|
||||||
fork_no_valid_owners=Αυτό το αποθετήριο δεν μπορεί να γίνει fork επειδή δεν υπάρχουν έγκυροι ιδιοκτήτες.
|
fork_no_valid_owners=Αυτό το repository δεν μπορεί να γίνει fork, επειδή δεν υπάρχουν έγκυροι ιδιοκτήτες.
|
||||||
use_template=Χρήση αυτού του πρότυπου
|
use_template=Χρήση αυτού του πρότυπου
|
||||||
clone_in_vsc=Κλωνοποίηση στο VS Code
|
clone_in_vsc=Κλωνοποίηση στο VS Code
|
||||||
download_zip=Λήψη ZIP
|
download_zip=Λήψη ZIP
|
||||||
|
@ -1120,7 +1120,7 @@ mirror_password_blank_placeholder=(Μη ορισμένο)
|
||||||
mirror_password_help=Αλλάξτε το όνομα χρήστη για να διαγράψετε έναν αποθηκευμένο κωδικό πρόσβασης.
|
mirror_password_help=Αλλάξτε το όνομα χρήστη για να διαγράψετε έναν αποθηκευμένο κωδικό πρόσβασης.
|
||||||
watchers=Παρατηρητές
|
watchers=Παρατηρητές
|
||||||
stargazers=Θαυμαστές
|
stargazers=Θαυμαστές
|
||||||
stars_remove_warning=Αυτό θα αφαιρέσει όλα τα αστέρια από αυτό το αποθετήριο.
|
stars_remove_warning=Αυτό θα αφαιρέσει όλα τα αστέρια από αυτό το repository.
|
||||||
forks=Forks
|
forks=Forks
|
||||||
reactions_more=και %d περισσότερα
|
reactions_more=και %d περισσότερα
|
||||||
unit_disabled=Ο διαχειριστής του ιστότοπου έχει απενεργοποιήσει αυτήν την ενότητα αποθετηρίου.
|
unit_disabled=Ο διαχειριστής του ιστότοπου έχει απενεργοποιήσει αυτήν την ενότητα αποθετηρίου.
|
||||||
|
@ -1129,7 +1129,7 @@ adopt_search=Εισάγετε όνομα χρήστη για αναζήτηση
|
||||||
adopt_preexisting_label=Υιοθέτηση αρχείων
|
adopt_preexisting_label=Υιοθέτηση αρχείων
|
||||||
adopt_preexisting=Υιοθετήστε τα προϋπάρχοντα αρχεία
|
adopt_preexisting=Υιοθετήστε τα προϋπάρχοντα αρχεία
|
||||||
adopt_preexisting_content=Δημιουργία αποθετηρίου από %s
|
adopt_preexisting_content=Δημιουργία αποθετηρίου από %s
|
||||||
adopt_preexisting_success=Υιοθετήθηκαν αρχεία και δημιουργήθηκε το αποθετήριο από %s
|
adopt_preexisting_success=Υιοθετήθηκαν αρχεία και δημιουργήθηκε το repository από %s
|
||||||
delete_preexisting_label=Διαγραφή
|
delete_preexisting_label=Διαγραφή
|
||||||
delete_preexisting=Διαγραφή αρχείων που προϋπήρχαν
|
delete_preexisting=Διαγραφή αρχείων που προϋπήρχαν
|
||||||
delete_preexisting_content=Διαγραφή αρχείων στο %s
|
delete_preexisting_content=Διαγραφή αρχείων στο %s
|
||||||
|
@ -1159,17 +1159,17 @@ desc.archived=Αρχειοθετημένο
|
||||||
template.items=Αντικείμενα προτύπου
|
template.items=Αντικείμενα προτύπου
|
||||||
template.git_content=Περιεχόμενο Git (Προεπιλεγμένος κλάδος)
|
template.git_content=Περιεχόμενο Git (Προεπιλεγμένος κλάδος)
|
||||||
template.git_hooks=Git hooks
|
template.git_hooks=Git hooks
|
||||||
template.git_hooks_tooltip=Δεν θα μπορέσετε να αφαιρέσετε ή να τροποποιήσετε τα Git hook αφού τα έχετε προσθέσει. Επιλέξτε την ρύθμιση αυτή μόνο αν εμπιστεύεστε το πρότυπο αποθετήριο.
|
template.git_hooks_tooltip=Δεν θα μπορέσετε να αφαιρέσετε ή να τροποποιήσετε τα Git hook αφού τα έχετε προσθέσει. Επιλέξτε την ρύθμιση αυτή μόνο αν εμπιστεύεστε το πρότυπο repository.
|
||||||
template.webhooks=Webhooks
|
template.webhooks=Webhooks
|
||||||
template.topics=Θέματα
|
template.topics=Θέματα
|
||||||
template.avatar=Εικόνα
|
template.avatar=Εικόνα
|
||||||
template.issue_labels=Ταμπέλες ζητημάτων
|
template.issue_labels=Ταμπέλες ζητημάτων
|
||||||
template.one_item=Πρέπει να επιλέξετε τουλάχιστον ένα αντικείμενο στο πρότυπο
|
template.one_item=Πρέπει να επιλέξετε τουλάχιστον ένα αντικείμενο στο πρότυπο
|
||||||
template.invalid=Πρέπει να επιλέξετε ένα πρότυπο αποθετήριο
|
template.invalid=Πρέπει να επιλέξετε ένα πρότυπο repository
|
||||||
|
|
||||||
archive.title=Αυτό το αποθετήρειο αρχειοθετήθηκε. Μπορείτε να προβάλετε αρχεία και να τα κλωνοποιήσετε, αλλά δεν μπορείτε να ωθήσετε ή να ανοίξετε ζητήματα ή pull requests.
|
archive.title=Αυτό το αποθετήρειο αρχειοθετήθηκε. Μπορείτε να προβάλετε αρχεία και να τα κλωνοποιήσετε, αλλά δεν μπορείτε να ωθήσετε ή να ανοίξετε ζητήματα ή pull requests.
|
||||||
archive.title_date=Αυτό το αποθετήριο έχει αρχειοθετηθεί στο %s. Μπορείτε να προβάλετε αρχεία και να κλωνοποιήσετε, αλλά δεν μπορείτε να ωθήσετε ή να ανοίξετε ζητήματα ή pull requests.
|
archive.title_date=Αυτό το repository αρχειοθετήθηκε στις %s. Μπορείτε να δείτε τα αρχεία του και να το κλωνοποιήσετε, αλλά δεν μπορείτε να κάνετε push, να ανοίξετε ζητήματα ή pull requests.
|
||||||
archive.issue.nocomment=Αυτό το αποθετήριο αρχειοθετήθηκε. Δεν μπορείτε να σχολιάσετε σε ζητήματα.
|
archive.issue.nocomment=Αυτό το repository έχει αρχειοθετηθεί. Δεν μπορείτε να σχολιάσετε σε ζητήματα.
|
||||||
archive.pull.nocomment=Αυτό το repo αρχειοθετήθηκε. Δεν μπορείτε να σχολιάσετε στα pull requests.
|
archive.pull.nocomment=Αυτό το repo αρχειοθετήθηκε. Δεν μπορείτε να σχολιάσετε στα pull requests.
|
||||||
|
|
||||||
form.reach_limit_of_creation_1=Έχετε ήδη συμπληρώσει το όριο του %d αποθετηρίου.
|
form.reach_limit_of_creation_1=Έχετε ήδη συμπληρώσει το όριο του %d αποθετηρίου.
|
||||||
|
@ -1180,7 +1180,7 @@ form.name_pattern_not_allowed=Το μοτίβο «%s» δεν επιτρέπετ
|
||||||
need_auth=Εξουσιοδότηση
|
need_auth=Εξουσιοδότηση
|
||||||
migrate_options=Ρυθμίσεις μεταφοράς
|
migrate_options=Ρυθμίσεις μεταφοράς
|
||||||
migrate_service=Υπηρεσία Μεταφοράς
|
migrate_service=Υπηρεσία Μεταφοράς
|
||||||
migrate_options_mirror_helper=Αυτό το αποθετήριο θα είναι είδωλο
|
migrate_options_mirror_helper=Αυτό το repository θα είναι είδωλο
|
||||||
migrate_options_lfs=Μεταφορά αρχείων LFS
|
migrate_options_lfs=Μεταφορά αρχείων LFS
|
||||||
migrate_options_lfs_endpoint.label=Άκρο LFS
|
migrate_options_lfs_endpoint.label=Άκρο LFS
|
||||||
migrate_options_lfs_endpoint.description=Η μεταφορά θα προσπαθήσει να χρησιμοποιήσει το Git remote για να <a target="_blank" rel="noopener noreferrer" href="%s">καθορίσει τον διακομιστή LFS</a>. Μπορείτε επίσης να καθορίσετε ένα δικό σας endpoint αν τα δεδομένα LFS του αποθετηρίου αποθηκεύονται κάπου αλλού.
|
migrate_options_lfs_endpoint.description=Η μεταφορά θα προσπαθήσει να χρησιμοποιήσει το Git remote για να <a target="_blank" rel="noopener noreferrer" href="%s">καθορίσει τον διακομιστή LFS</a>. Μπορείτε επίσης να καθορίσετε ένα δικό σας endpoint αν τα δεδομένα LFS του αποθετηρίου αποθηκεύονται κάπου αλλού.
|
||||||
|
@ -1233,10 +1233,10 @@ migrate.cancel_migrating_confirm=Θέλετε να ακυρώσετε αυτή
|
||||||
mirror_from=είδωλο του
|
mirror_from=είδωλο του
|
||||||
forked_from=forked από
|
forked_from=forked από
|
||||||
generated_from=παραγμένο από
|
generated_from=παραγμένο από
|
||||||
fork_from_self=Δεν μπορείτε να κάνετε fork σε ένα αποθετήριο που κατέχετε.
|
fork_from_self=Δεν μπορείτε να κάνετε fork ένα repository που σας ανήκει.
|
||||||
fork_guest_user=Συνδεθείτε για να κάνετε fork αυτό το αποθετήριο.
|
fork_guest_user=Συνδεθείτε για να κάνετε fork αυτό το repository.
|
||||||
watch_guest_user=Συνδεθείτε για να παρακολουθήσετε αυτό το αποθετήριο.
|
watch_guest_user=Συνδεθείτε για να παρακολουθήσετε αυτό το repository.
|
||||||
star_guest_user=Συνδεθείτε για να δώσετε ένα αστέρι σε αυτό το αποθετήριο.
|
star_guest_user=Συνδεθείτε για να δώσετε ένα αστέρι σε αυτό το repository.
|
||||||
unwatch=Παύση ακολούθησης
|
unwatch=Παύση ακολούθησης
|
||||||
watch=Παρακολούθηση
|
watch=Παρακολούθηση
|
||||||
unstar=Αφαίρεση αστεριού
|
unstar=Αφαίρεση αστεριού
|
||||||
|
@ -1248,11 +1248,11 @@ more_operations=Περισσότερες λειτουργίες
|
||||||
no_desc=Χωρίς περιγραφή
|
no_desc=Χωρίς περιγραφή
|
||||||
quick_guide=Γρήγορος οδηγός
|
quick_guide=Γρήγορος οδηγός
|
||||||
clone_this_repo=Κλωνοποίηση αυτού του αποθετηρίου
|
clone_this_repo=Κλωνοποίηση αυτού του αποθετηρίου
|
||||||
cite_this_repo=Αναφορά σε αυτό το αποθετήριο
|
cite_this_repo=Αναφορά σε αυτό το repository
|
||||||
create_new_repo_command=Δημιουργία νέου αποθετηρίου στη γραμμή εντολών
|
create_new_repo_command=Δημιουργία νέου αποθετηρίου στη γραμμή εντολών
|
||||||
push_exist_repo=Προώθηση ενός υπάρχοντος αποθετηρίου από τη γραμμή εντολών
|
push_exist_repo=Προώθηση ενός υπάρχοντος αποθετηρίου από τη γραμμή εντολών
|
||||||
empty_message=Αυτό το αποθετήριο δεν έχει περιεχόμενο.
|
empty_message=Αυτό το repository δεν έχει περιεχόμενο.
|
||||||
broken_message=Τα δεδομένα Git που διέπουν αυτό το αποθετήριο δεν μπορούν να διαβαστούν. Επικοινωνήστε με το διαχειριστή ή διαγράψτε αυτό το αποθετήριο.
|
broken_message=Τα δεδομένα Git που διέπουν αυτό το αποθετήριο δεν μπορούν να διαβαστούν. Επικοινωνήστε με το διαχειριστή ή διαγράψτε αυτό το repository.
|
||||||
|
|
||||||
code=Κώδικας
|
code=Κώδικας
|
||||||
code.desc=Πρόσβαση στον πηγαίο κώδικα, αρχεία, υποβολές και κλάδους.
|
code.desc=Πρόσβαση στον πηγαίο κώδικα, αρχεία, υποβολές και κλάδους.
|
||||||
|
@ -1303,6 +1303,7 @@ view_git_blame=Προβολή git blame
|
||||||
video_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «video».
|
video_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «video».
|
||||||
audio_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «audio».
|
audio_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «audio».
|
||||||
stored_lfs=Αποθηκεύτηκε με το Git LFS
|
stored_lfs=Αποθηκεύτηκε με το Git LFS
|
||||||
|
stored_annex=Αποθηκεύτηκε με το Git Annex
|
||||||
symbolic_link=Symbolic link
|
symbolic_link=Symbolic link
|
||||||
executable_file=Εκτελέσιμο αρχείο
|
executable_file=Εκτελέσιμο αρχείο
|
||||||
commit_graph=Γράφημα υποβολών
|
commit_graph=Γράφημα υποβολών
|
||||||
|
@ -1326,11 +1327,12 @@ editor.upload_file=Ανέβασμα αρχείου
|
||||||
editor.edit_file=Επεξεργασία αρχείου
|
editor.edit_file=Επεξεργασία αρχείου
|
||||||
editor.preview_changes=Προεπισκόπηση αλλαγών
|
editor.preview_changes=Προεπισκόπηση αλλαγών
|
||||||
editor.cannot_edit_lfs_files=Τα αρχεία LFS δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
editor.cannot_edit_lfs_files=Τα αρχεία LFS δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
||||||
|
editor.cannot_edit_annex_files=Τα αρχεία Annex δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
||||||
editor.cannot_edit_non_text_files=Τα δυαδικά αρχεία δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
editor.cannot_edit_non_text_files=Τα δυαδικά αρχεία δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
||||||
editor.edit_this_file=Επεξεργασία αρχείου
|
editor.edit_this_file=Επεξεργασία αρχείου
|
||||||
editor.this_file_locked=Το αρχείο είναι κλειδωμένο
|
editor.this_file_locked=Το αρχείο είναι κλειδωμένο
|
||||||
editor.must_be_on_a_branch=Πρέπει να βρίσκεστε σε έναν κλάδο για να κάνετε ή να προτείνετε αλλαγές σε αυτό το αρχείο.
|
editor.must_be_on_a_branch=Πρέπει να βρίσκεστε σε έναν κλάδο για να κάνετε ή να προτείνετε αλλαγές σε αυτό το αρχείο.
|
||||||
editor.fork_before_edit=Πρέπει να κάνετε fork αυτό το αποθετήριο για να κάνετε ή να προτείνετε αλλαγές σε αυτό το αρχείο.
|
editor.fork_before_edit=Πρέπει να κάνετε fork αυτό το repository για να κάνετε ή να προτείνετε αλλαγές σε αυτό το αρχείο.
|
||||||
editor.delete_this_file=Διαγραφή αρχείου
|
editor.delete_this_file=Διαγραφή αρχείου
|
||||||
editor.must_have_write_access=Πρέπει να έχετε πρόσβαση εγγραφής για να κάνετε ή να προτείνετε αλλαγές σε αυτό το αρχείο.
|
editor.must_have_write_access=Πρέπει να έχετε πρόσβαση εγγραφής για να κάνετε ή να προτείνετε αλλαγές σε αυτό το αρχείο.
|
||||||
editor.file_delete_success=Το αρχείο «%s» έχει διαγραφεί.
|
editor.file_delete_success=Το αρχείο «%s» έχει διαγραφεί.
|
||||||
|
@ -1359,15 +1361,15 @@ editor.new_branch_name_desc=Όνομα νέου κλάδου…
|
||||||
editor.cancel=Ακύρωση
|
editor.cancel=Ακύρωση
|
||||||
editor.filename_cannot_be_empty=Το όνομα αρχείου δεν μπορεί να είναι κενό.
|
editor.filename_cannot_be_empty=Το όνομα αρχείου δεν μπορεί να είναι κενό.
|
||||||
editor.filename_is_invalid=Το όνομα αρχείου δεν είναι έγκυρο: "%s".
|
editor.filename_is_invalid=Το όνομα αρχείου δεν είναι έγκυρο: "%s".
|
||||||
editor.branch_does_not_exist=Ο κλάδος "%s" δεν υπάρχει σε αυτό το αποθετήριο.
|
editor.branch_does_not_exist=Ο κλάδος "%s" δεν υπάρχει σε αυτό το repository.
|
||||||
editor.branch_already_exists=Ο κλάδος «%s» υπάρχει ήδη σε αυτό το αποθετήριο.
|
editor.branch_already_exists=Ο κλάδος «%s» υπάρχει ήδη σε αυτό το repository.
|
||||||
editor.directory_is_a_file=Το όνομα φακέλου «%s» χρησιμοποιείται ήδη ως όνομα αρχείου σε αυτό το αποθετήριο.
|
editor.directory_is_a_file=Το όνομα φακέλου «%s» χρησιμοποιείται ήδη ως όνομα αρχείου σε αυτό το repository.
|
||||||
editor.file_is_a_symlink=`Το «%s» είναι συμβολικός σύνδεσμος. Οι συμβολικοί σύνδεσμοι δεν μπορούν να επεξεργαστούν στην ενσωματωμένη εφαρμογή`
|
editor.file_is_a_symlink=`Το «%s» είναι συμβολικός σύνδεσμος. Οι συμβολικοί σύνδεσμοι δεν μπορούν να επεξεργαστούν στην ενσωματωμένη εφαρμογή`
|
||||||
editor.filename_is_a_directory=Το όνομα αρχείου «%s» χρησιμοποιείται ήδη ως όνομα φακέλου σε αυτό το αποθετήριο.
|
editor.filename_is_a_directory=Το όνομα αρχείου «%s» χρησιμοποιείται ήδη ως όνομα φακέλου σε αυτό το repository.
|
||||||
editor.file_editing_no_longer_exists=Το αρχείο «%s», το οποίο επεξεργάζεστε, δεν υπάρχει πλέον σε αυτό το αποθετήριο.
|
editor.file_editing_no_longer_exists=Το αρχείο «%s», το οποίο επεξεργάζεστε, δεν υπάρχει πλέον σε αυτό το repository.
|
||||||
editor.file_deleting_no_longer_exists=Το αρχείο «%s», το οποίο διαγράφεται, δεν υπάρχει πλέον σε αυτό το αποθετήριο.
|
editor.file_deleting_no_longer_exists=Το αρχείο «%s», το οποίο διαγράφεται, δεν υπάρχει πλέον σε αυτό το repository.
|
||||||
editor.file_changed_while_editing=Προέκυψαν κάποιες αλλαγές στα περιεχόμενα του αρχείου από τότε που ξεκινήσατε να τα επεξεργάζεστε. <a target="_blank" rel="noopener noreferrer" href="%s">Κάντε κλικ εδώ</a> για να τα δείτε ή <strong>ξανακάντε μία υποβολή των αλλαγών σας</strong> για να τις αντικαταστήσετε.
|
editor.file_changed_while_editing=Προέκυψαν κάποιες αλλαγές στα περιεχόμενα του αρχείου από τότε που ξεκινήσατε να τα επεξεργάζεστε. <a target="_blank" rel="noopener noreferrer" href="%s">Κάντε κλικ εδώ</a> για να τα δείτε ή <strong>ξανακάντε μία υποβολή των αλλαγών σας</strong> για να τις αντικαταστήσετε.
|
||||||
editor.file_already_exists=Υπάρχει ήδη ένα αρχείο με το όνομα «%s» σε αυτό το αποθετήριο.
|
editor.file_already_exists=Υπάρχει ήδη ένα αρχείο με το όνομα «%s» σε αυτό το repository.
|
||||||
editor.commit_empty_file_header=Υποβολή ενός κενού αρχείου
|
editor.commit_empty_file_header=Υποβολή ενός κενού αρχείου
|
||||||
editor.commit_empty_file_text=Το αρχείο που πρόκειται να υποβληθεί είναι κενό. Συνέχεια;
|
editor.commit_empty_file_text=Το αρχείο που πρόκειται να υποβληθεί είναι κενό. Συνέχεια;
|
||||||
editor.no_changes_to_show=Δεν υπάρχουν αλλαγές για εμφάνιση.
|
editor.no_changes_to_show=Δεν υπάρχουν αλλαγές για εμφάνιση.
|
||||||
|
@ -1620,13 +1622,13 @@ issues.author_helper=Αυτός ο χρήστης είναι ο συγγραφέ
|
||||||
issues.role.owner=Ιδιοκτήτης
|
issues.role.owner=Ιδιοκτήτης
|
||||||
issues.role.owner_helper=Αυτός ο χρήστης είναι ο ιδιοκτήτης αυτού του αποθετηρίου.
|
issues.role.owner_helper=Αυτός ο χρήστης είναι ο ιδιοκτήτης αυτού του αποθετηρίου.
|
||||||
issues.role.member=Μέλος
|
issues.role.member=Μέλος
|
||||||
issues.role.member_helper=Αυτός ο χρήστης είναι μέλος του οργανισμού, του οποίου ανήκει το αποθετήριο.
|
issues.role.member_helper=Αυτός ο χρήστης είναι μέλος του οργανισμού, του οποίου ανήκει το repository.
|
||||||
issues.role.collaborator=Συνεργάτης
|
issues.role.collaborator=Συνεργάτης
|
||||||
issues.role.collaborator_helper=Ο χρήστης έλαβε πρόσκληση συνεργασίας στο αποθετήριο.
|
issues.role.collaborator_helper=Ο χρήστης έλαβε πρόσκληση συνεργασίας στο repository.
|
||||||
issues.role.first_time_contributor=Συντελεστής για πρώτη φορά
|
issues.role.first_time_contributor=Συντελεστής για πρώτη φορά
|
||||||
issues.role.first_time_contributor_helper=Αυτή είναι η πρώτη συνεισφορά αυτού του χρήστη στο αποθετήριο.
|
issues.role.first_time_contributor_helper=Αυτή είναι η πρώτη συνεισφορά αυτού του χρήστη στο repository.
|
||||||
issues.role.contributor=Συντελεστής
|
issues.role.contributor=Συντελεστής
|
||||||
issues.role.contributor_helper=Αυτός ο χρήστης έχει προηγούμενές υποβολές (commits) στο αποθετήριο.
|
issues.role.contributor_helper=Αυτός ο χρήστης έχει προηγούμενές υποβολές (commits) στο repository.
|
||||||
issues.re_request_review=Επαναίτηση ανασκόπησης
|
issues.re_request_review=Επαναίτηση ανασκόπησης
|
||||||
issues.is_stale=Έχουν υπάρξει αλλαγές σε αυτό το PR από αυτή την αναθεώρηση
|
issues.is_stale=Έχουν υπάρξει αλλαγές σε αυτό το PR από αυτή την αναθεώρηση
|
||||||
issues.remove_request_review=Αφαίρεση αιτήματος αναθεώρησης
|
issues.remove_request_review=Αφαίρεση αιτήματος αναθεώρησης
|
||||||
|
@ -1678,7 +1680,7 @@ issues.unlock_comment=: ξεκλείδωσε αυτή τη συνομιλία %s
|
||||||
issues.lock_confirm=Κλείδωμα
|
issues.lock_confirm=Κλείδωμα
|
||||||
issues.unlock_confirm=Ξεκλείδωμα
|
issues.unlock_confirm=Ξεκλείδωμα
|
||||||
issues.lock.notice_1=- Άλλοι χρήστες δεν μπορούν να αφήσουν νέα σχόλια σε αυτό το ζήτημα.
|
issues.lock.notice_1=- Άλλοι χρήστες δεν μπορούν να αφήσουν νέα σχόλια σε αυτό το ζήτημα.
|
||||||
issues.lock.notice_2=- Εσείς και άλλοι συνεργάτες που έχουν πρόσβαση στο αποθετήριο θα μπορείτε ακόμα να αφήσετε σχόλια που θα είναι ορατά σε άλλους.
|
issues.lock.notice_2=- Εσείς, μαζί με τους συνεργάτες σας που έχουν πρόσβαση στο repository, θα μπορείτε ακόμα να αφήσετε σχόλια που θα μπορούν να βλέπουν και άλλοι.
|
||||||
issues.lock.notice_3=- Θα μπορείτε να ξεκλειδώσετε αυτό το ζήτημα πιο μετά.
|
issues.lock.notice_3=- Θα μπορείτε να ξεκλειδώσετε αυτό το ζήτημα πιο μετά.
|
||||||
issues.unlock.notice_1=- Όλοι θα βρίσκονται πάλι σε θέση να αφήσουν σχόλιο σε αυτό το ζήτημα.
|
issues.unlock.notice_1=- Όλοι θα βρίσκονται πάλι σε θέση να αφήσουν σχόλιο σε αυτό το ζήτημα.
|
||||||
issues.unlock.notice_2=- Θα μπορείτε πάντα να ξανακλειδώσετε αυτό το ζήτημα πιο μετά.
|
issues.unlock.notice_2=- Θα μπορείτε πάντα να ξανακλειδώσετε αυτό το ζήτημα πιο μετά.
|
||||||
|
@ -1759,7 +1761,7 @@ issues.dependency.add_error_dep_issue_not_exist=Εξαρτώμενο ζήτημ
|
||||||
issues.dependency.add_error_dep_not_exist=Δεν υπάρχει η Εξάρτηση.
|
issues.dependency.add_error_dep_not_exist=Δεν υπάρχει η Εξάρτηση.
|
||||||
issues.dependency.add_error_dep_exists=Η Εξάρτηση υπάρχει ήδη.
|
issues.dependency.add_error_dep_exists=Η Εξάρτηση υπάρχει ήδη.
|
||||||
issues.dependency.add_error_cannot_create_circular=Δεν μπορείτε να δημιουργήσετε μια εξάρτηση με δύο ζητήματα που μπλοκάρουν το ένα το άλλο.
|
issues.dependency.add_error_cannot_create_circular=Δεν μπορείτε να δημιουργήσετε μια εξάρτηση με δύο ζητήματα που μπλοκάρουν το ένα το άλλο.
|
||||||
issues.dependency.add_error_dep_not_same_repo=Και τα δύο ζητήματα πρέπει να βρίσκονται στο ίδιο αποθετήριο.
|
issues.dependency.add_error_dep_not_same_repo=Και τα δύο ζητήματα πρέπει να βρίσκονται στο ίδιο repository.
|
||||||
issues.review.self.approval=Δεν μπορείτε να εγκρίνετε το δικό σας pull request.
|
issues.review.self.approval=Δεν μπορείτε να εγκρίνετε το δικό σας pull request.
|
||||||
issues.review.self.rejection=Δεν μπορείτε να ζητήσετε αλλαγές στο δικό σας pull request.
|
issues.review.self.rejection=Δεν μπορείτε να ζητήσετε αλλαγές στο δικό σας pull request.
|
||||||
issues.review.approve=ενέκρινε τις αλλαγές %s
|
issues.review.approve=ενέκρινε τις αλλαγές %s
|
||||||
|
@ -1922,7 +1924,7 @@ pulls.closed_at=`έκλεισε αυτό το pull request <a id="%[1]s" href="#
|
||||||
pulls.reopened_at=`άνοιξε ξανά αυτό το pull request <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at=`άνοιξε ξανά αυτό το pull request <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντολών
|
pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντολών
|
||||||
pulls.cmd_instruction_checkout_title=Έλεγχος
|
pulls.cmd_instruction_checkout_title=Έλεγχος
|
||||||
pulls.cmd_instruction_checkout_desc=Από το αποθετήριο του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές.
|
pulls.cmd_instruction_checkout_desc=Από το repository του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές.
|
||||||
pulls.cmd_instruction_merge_title=Συγχώνευση
|
pulls.cmd_instruction_merge_title=Συγχώνευση
|
||||||
pulls.cmd_instruction_merge_desc=Συγχώνευση των αλλαγών και ενημέρωση στο Gitea.
|
pulls.cmd_instruction_merge_desc=Συγχώνευση των αλλαγών και ενημέρωση στο Gitea.
|
||||||
pulls.clear_merge_message=Εκκαθάριση μηνύματος συγχώνευσης
|
pulls.clear_merge_message=Εκκαθάριση μηνύματος συγχώνευσης
|
||||||
|
@ -2101,8 +2103,8 @@ search.code_no_results=Δεν βρέθηκε πηγαίος κώδικας πο
|
||||||
search.code_search_unavailable=Η αναζήτηση κώδικα δεν είναι διαθέσιμη αυτή τη στιγμή. Παρακαλώ επικοινωνήστε με το διαχειριστή.
|
search.code_search_unavailable=Η αναζήτηση κώδικα δεν είναι διαθέσιμη αυτή τη στιγμή. Παρακαλώ επικοινωνήστε με το διαχειριστή.
|
||||||
|
|
||||||
settings=Ρυθμίσεις
|
settings=Ρυθμίσεις
|
||||||
settings.desc=Στις Ρυθμίσεις μπορείτε να διαχειριστείτε τις ρυθμίσεις για το αποθετήριο
|
settings.desc=Στις Ρυθμίσεις μπορείτε να διαχειριστείτε τις ρυθμίσεις για το repository
|
||||||
settings.options=Αποθετήριο
|
settings.options=Repository
|
||||||
settings.collaboration=Συνεργάτες
|
settings.collaboration=Συνεργάτες
|
||||||
settings.collaboration.admin=Διαχειριστής
|
settings.collaboration.admin=Διαχειριστής
|
||||||
settings.collaboration.write=Εγγραφή
|
settings.collaboration.write=Εγγραφή
|
||||||
|
@ -2113,18 +2115,18 @@ settings.hooks=Webhooks
|
||||||
settings.githooks=Git hooks
|
settings.githooks=Git hooks
|
||||||
settings.basic_settings=Βασικές ρυθμίσεις
|
settings.basic_settings=Βασικές ρυθμίσεις
|
||||||
settings.mirror_settings=Ρυθμίσεις ειδώλου
|
settings.mirror_settings=Ρυθμίσεις ειδώλου
|
||||||
settings.mirror_settings.docs=Ρυθμίστε τον αυτόματο συγχρονισμό των υποβολών, ετικετών και κλάδων του αποθετηρίου σας σε ένα άλλο αποθετήριο.
|
settings.mirror_settings.docs=Ρυθμίστε τον αυτόματο συγχρονισμό των commit, ετικετών και κλάδων του αποθετηρίου σας σε ένα άλλο repository.
|
||||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Ρυθμίστε τον αυτόματο συγχρονισμό των υποβολών, ετικετών και κλάδων του έργου σας με ένα άλλο αποθετήριο. Τα είδωλα τύπου λήψης έχουν απενεργοποιηθεί από τον διαχειριστή σας.
|
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Ρυθμίστε τον αυτόματο συγχρονισμό των commit, ετικετών και κλάδων του έργου σας με ένα άλλο repository. Τα είδωλα τύπου λήψης έχουν απενεργοποιηθεί από τον διαχειριστή σας.
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.instructions=Ρυθμίστε την αυτόματη λήψη υποβολών, ετικετών και κλάδων από ένα άλλο αποθετήριο.
|
settings.mirror_settings.docs.disabled_push_mirror.instructions=Ρυθμίστε την αυτόματη λήψη υποβολών, ετικετών και κλάδων από ένα άλλο repository.
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Αυτή τη στιγμή, αυτό μπορεί να γίνει μόνο στο μενού "Νέα Μεταφορά". Για περισσότερες πληροφορίες, συμβουλευτείτε το:
|
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Αυτή τη στιγμή, αυτό μπορεί να γίνει μόνο στο μενού "Νέα Μεταφορά". Για περισσότερες πληροφορίες, συμβουλευτείτε το:
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.info=Τα είδωλα ώθησης έχουν απενεργοποιηθεί από το διαχειριστή σας.
|
settings.mirror_settings.docs.disabled_push_mirror.info=Τα είδωλα ώθησης έχουν απενεργοποιηθεί από το διαχειριστή σας.
|
||||||
settings.mirror_settings.docs.no_new_mirrors=Το αποθετήριο σας αντιγράφει τις αλλαγές προς ή από ένα άλλο αποθετήριο. Λάβετε υπόψη ότι δεν μπορείτε να δημιουργήσετε νέα είδωλα αυτή τη στιγμή.
|
settings.mirror_settings.docs.no_new_mirrors=Το repository σας αντιγράφει τις αλλαγές προς ή από ένα άλλο repository. Λάβετε υπόψη ότι δεν μπορείτε να δημιουργήσετε νέα είδωλα αυτή τη στιγμή.
|
||||||
settings.mirror_settings.docs.can_still_use=Αν και δεν μπορείτε να τροποποιήσετε τα υπάρχοντα είδωλα ή να δημιουργήσετε νέα, μπορείτε να χρησιμοποιείται ακόμα το υπάρχων είδωλο.
|
settings.mirror_settings.docs.can_still_use=Αν και δεν μπορείτε να τροποποιήσετε τα υπάρχοντα είδωλα ή να δημιουργήσετε νέα, μπορείτε να χρησιμοποιείται ακόμα το υπάρχων είδωλο.
|
||||||
settings.mirror_settings.docs.pull_mirror_instructions=Για να ορίσετε έναν είδωλο έλξης, παρακαλούμε συμβουλευθείτε:
|
settings.mirror_settings.docs.pull_mirror_instructions=Για να ορίσετε έναν είδωλο έλξης, παρακαλούμε συμβουλευθείτε:
|
||||||
settings.mirror_settings.docs.more_information_if_disabled=Μπορείτε να μάθετε περισσότερα για τα είδωλα ώθησης και έλξης εδώ:
|
settings.mirror_settings.docs.more_information_if_disabled=Μπορείτε να μάθετε περισσότερα για τα είδωλα ώθησης και έλξης εδώ:
|
||||||
settings.mirror_settings.docs.doc_link_title=Πώς μπορώ να αντιγράψω αποθετήρια;
|
settings.mirror_settings.docs.doc_link_title=Πώς μπορώ να αντιγράψω αποθετήρια;
|
||||||
settings.mirror_settings.docs.doc_link_pull_section=το κεφάλαιο "Pulling from a remote repository" της τεκμηρίωσης.
|
settings.mirror_settings.docs.doc_link_pull_section=το κεφάλαιο "Pulling from a remote repository" της τεκμηρίωσης.
|
||||||
settings.mirror_settings.docs.pulling_remote_title=Έλξη από ένα απομακρυσμένο αποθετήριο
|
settings.mirror_settings.docs.pulling_remote_title=Pull από ένα απομακρυσμένο repository
|
||||||
settings.mirror_settings.mirrored_repository=Είδωλο αποθετηρίου
|
settings.mirror_settings.mirrored_repository=Είδωλο αποθετηρίου
|
||||||
settings.mirror_settings.direction=Κατεύθυνση
|
settings.mirror_settings.direction=Κατεύθυνση
|
||||||
settings.mirror_settings.direction.pull=Pull
|
settings.mirror_settings.direction.pull=Pull
|
||||||
|
@ -2188,33 +2190,33 @@ settings.reindex_button=Προσθήκη στην ουρά Reindex
|
||||||
settings.reindex_requested=Αιτήθηκε reindex
|
settings.reindex_requested=Αιτήθηκε reindex
|
||||||
settings.admin_enable_close_issues_via_commit_in_any_branch=Κλείσιμο ενός ζητήματος μέσω μιας υποβολής που έγινε σε έναν μη προεπιλεγμένο κλάδο
|
settings.admin_enable_close_issues_via_commit_in_any_branch=Κλείσιμο ενός ζητήματος μέσω μιας υποβολής που έγινε σε έναν μη προεπιλεγμένο κλάδο
|
||||||
settings.danger_zone=Ζώνη κινδύνου
|
settings.danger_zone=Ζώνη κινδύνου
|
||||||
settings.new_owner_has_same_repo=Ο νέος ιδιοκτήτης έχει ήδη ένα αποθετήριο με το ίδιο όνομα. Παρακαλώ επιλέξτε ένα άλλο όνομα.
|
settings.new_owner_has_same_repo=Ο νέος ιδιοκτήτης έχει ήδη ένα repository με το ίδιο όνομα. Παρακαλώ επιλέξτε ένα άλλο όνομα.
|
||||||
settings.convert=Μετατροπή σε κανονικό αποθετήριο
|
settings.convert=Μετατροπή σε κανονικό repository
|
||||||
settings.convert_desc=Μπορείτε να μετατρέψετε αυτόν το είδωλο σε κανονικό αποθετήριο. Αυτό δεν μπορεί να αναιρεθεί.
|
settings.convert_desc=Μπορείτε να μετατρέψετε αυτόν το είδωλο σε κανονικό repository. Αυτό δεν μπορεί να αναιρεθεί.
|
||||||
settings.convert_notices_1=Αυτή η λειτουργία θα μετατρέψει το είδωλο σε ένα κανονικό αποθετήριο και δεν μπορεί να αναιρεθεί.
|
settings.convert_notices_1=Αυτή η λειτουργία θα μετατρέψει το είδωλο σε ένα κανονικό repository και δεν μπορεί να αναιρεθεί.
|
||||||
settings.convert_confirm=Μετατροπή αποθετηρίου
|
settings.convert_confirm=Μετατροπή αποθετηρίου
|
||||||
settings.convert_succeed=Το είδωλο έχει μετατραπεί σε κανονικό αποθετήριο.
|
settings.convert_succeed=Το είδωλο έχει μετατραπεί σε κανονικό repository.
|
||||||
settings.convert_fork=Μετατροπή σε κανονικό αποθετήριο
|
settings.convert_fork=Μετατροπή σε κανονικό repository
|
||||||
settings.convert_fork_desc=Μπορείτε να μετατρέψετε αυτό το fork σε κανονικό αποθετήριο. Αυτό δεν μπορεί να αναιρεθεί.
|
settings.convert_fork_desc=Μπορείτε να μετατρέψετε αυτό το fork σε κανονικό repository. Αυτό δεν μπορεί να αναιρεθεί.
|
||||||
settings.convert_fork_notices_1=Αυτή η λειτουργία θα μετατρέψει το fork σε ένα κανονικό αποθετήριο και δεν μπορεί να αναιρεθεί.
|
settings.convert_fork_notices_1=Αυτή η λειτουργία θα μετατρέψει το fork σε ένα κανονικό repository και δεν μπορεί να αναιρεθεί.
|
||||||
settings.convert_fork_confirm=Μετατροπή αποθετηρίου
|
settings.convert_fork_confirm=Μετατροπή αποθετηρίου
|
||||||
settings.convert_fork_succeed=Το fork έχει μετατραπεί σε κανονικό αποθετήριο.
|
settings.convert_fork_succeed=Το fork έχει μετατραπεί σε κανονικό repository.
|
||||||
settings.transfer.title=Μεταβίβαση ιδιοκτησίας
|
settings.transfer.title=Μεταβίβαση ιδιοκτησίας
|
||||||
settings.transfer.rejected=Η μεταβίβαση του αποθετηρίου απορρίφθηκε.
|
settings.transfer.rejected=Η μεταβίβαση του αποθετηρίου απορρίφθηκε.
|
||||||
settings.transfer.success=Η μεταβίβαση του αποθετηρίου ήταν επιτυχής.
|
settings.transfer.success=Η μεταβίβαση του αποθετηρίου ήταν επιτυχής.
|
||||||
settings.transfer_abort=Ακύρωση μεταβίβασης
|
settings.transfer_abort=Ακύρωση μεταβίβασης
|
||||||
settings.transfer_abort_invalid=Δεν μπορείτε να ακυρώσετε μια ανύπαρκτη μεταβίβαση αποθετηρίου.
|
settings.transfer_abort_invalid=Δεν μπορείτε να ακυρώσετε μια ανύπαρκτη μεταβίβαση αποθετηρίου.
|
||||||
settings.transfer_abort_success=Η μεταφορά αποθετηρίου στο %s ακυρώθηκε με επιτυχία.
|
settings.transfer_abort_success=Η μεταφορά αποθετηρίου στο %s ακυρώθηκε με επιτυχία.
|
||||||
settings.transfer_desc=Μεταβιβάστε αυτό το αποθετήριο σε έναν χρήστη ή σε έναν οργανισμό για τον οποίο έχετε δικαιώματα διαχειριστή.
|
settings.transfer_desc=Μεταβιβάστε αυτό το repository σε έναν χρήστη ή σε έναν οργανισμό για τον οποίο έχετε δικαιώματα διαχειριστή.
|
||||||
settings.transfer_form_title=Εισάγετε το όνομα του αποθετηρίου ως επιβεβαίωση:
|
settings.transfer_form_title=Εισάγετε το όνομα του αποθετηρίου ως επιβεβαίωση:
|
||||||
settings.transfer_in_progress=Αυτή τη στιγμή υπάρχει μια εν εξελίξει μεταβίβαση. Παρακαλούμε ακυρώστε την αν θέλετε να μεταβιβάσετε αυτό το αποθετήριο σε άλλο χρήστη.
|
settings.transfer_in_progress=Αυτή τη στιγμή υπάρχει μια εν εξελίξει μεταβίβαση. Παρακαλούμε ακυρώστε την αν θέλετε να μεταβιβάσετε αυτό το repository σε άλλο χρήστη.
|
||||||
settings.transfer_notices_1=- Θα χάσετε την πρόσβαση στο αποθετήριο αν το μεταβιβάσετε σε έναν μεμονωμένο χρήστη.
|
settings.transfer_notices_1=- Θα χάσετε την πρόσβαση στο repository αν το μεταβιβάσετε σε έναν μεμονωμένο χρήστη.
|
||||||
settings.transfer_notices_2=- Θα διατηρήσετε την πρόσβαση στο αποθετήριο αν το μεταβιβάσετε σε έναν οργανισμό που είστε (συν)ιδιοκτήτης.
|
settings.transfer_notices_2=- Θα διατηρήσετε την πρόσβαση στο repository αν το μεταβιβάσετε σε έναν οργανισμό που είστε (συν)ιδιοκτήτης.
|
||||||
settings.transfer_notices_3=- Εάν το αποθετήριο είναι ιδιωτικό και μεταβιβάζεται σε μεμονωμένο χρήστη, αυτή η ενέργεια εξασφαλίζει ότι ο χρήστης έχει τουλάχιστον άδεια ανάγνωσης (και αλλάζει τα δικαιώματα εάν είναι απαραίτητο).
|
settings.transfer_notices_3=- Εάν το repository είναι ιδιωτικό και μεταβιβάζεται σε μεμονωμένο χρήστη, αυτή η ενέργεια εξασφαλίζει ότι ο χρήστης έχει τουλάχιστον άδεια ανάγνωσης (και αλλάζει τα δικαιώματα εάν είναι απαραίτητο).
|
||||||
settings.transfer_owner=Νέος ιδιοκτήτης
|
settings.transfer_owner=Νέος ιδιοκτήτης
|
||||||
settings.transfer_perform=Εκτέλεση μεταφοράς
|
settings.transfer_perform=Εκτέλεση μεταφοράς
|
||||||
settings.transfer_started=`Αυτό το αποθετήριο έχει επισημανθεί για μεταφορά και αναμένει επιβεβαίωση από το "%s"`
|
settings.transfer_started=`Αυτό το repository έχει επισημανθεί για μεταφορά και αναμένει επιβεβαίωση από το "%s"`
|
||||||
settings.transfer_succeed=Το αποθετήριο έχει μεταφερθεί.
|
settings.transfer_succeed=Το repository έχει μεταφερθεί.
|
||||||
settings.signing_settings=Ρυθμίσεις επαλήθευσης υπογραφών
|
settings.signing_settings=Ρυθμίσεις επαλήθευσης υπογραφών
|
||||||
settings.trust_model=Μοντέλο εμπιστοσύνης υπογραφών
|
settings.trust_model=Μοντέλο εμπιστοσύνης υπογραφών
|
||||||
settings.trust_model.default=Προεπιλεγμένο μοντέλο εμπιστοσύνης
|
settings.trust_model.default=Προεπιλεγμένο μοντέλο εμπιστοσύνης
|
||||||
|
@ -2236,33 +2238,33 @@ settings.wiki_deletion_success=Τα δεδομένα wiki του αποθετη
|
||||||
settings.delete=Διαγραφή αυτόυ του αποθετηρίου
|
settings.delete=Διαγραφή αυτόυ του αποθετηρίου
|
||||||
settings.delete_desc=Η διαγραφή ενός αποθετηρίου είναι μόνιμη και δεν μπορεί να αναιρεθεί.
|
settings.delete_desc=Η διαγραφή ενός αποθετηρίου είναι μόνιμη και δεν μπορεί να αναιρεθεί.
|
||||||
settings.delete_notices_1=- Αυτή η ενέργεια <strong>ΔΕΝ ΜΠΟΡΕΙ</strong> να αναιρεθεί.
|
settings.delete_notices_1=- Αυτή η ενέργεια <strong>ΔΕΝ ΜΠΟΡΕΙ</strong> να αναιρεθεί.
|
||||||
settings.delete_notices_2=- Αυτή η ενέργεια θα διαγράψει μόνιμα το αποθετήριο <strong>%s</strong> μαζί με τον κώδικα, τα ζητημάτα, τα σχόλια, τα δεδομένα των wiki και τις ρυθμίσεις συνεργατών που βρίσκονται μέσα σε αυτό.
|
settings.delete_notices_2=- Αυτή η ενέργεια θα διαγράψει μόνιμα το repository <strong>%s</strong> μαζί με τον κώδικα, τα ζητημάτα, τα σχόλια, τα δεδομένα των wiki και τις ρυθμίσεις συνεργατών που βρίσκονται μέσα σε αυτό.
|
||||||
settings.delete_notices_fork_1=- Τα Forks αυτού του αποθετηρίου θα γίνουν ανεξάρτητα μετά τη διαγραφή.
|
settings.delete_notices_fork_1=- Τα Forks αυτού του αποθετηρίου θα γίνουν ανεξάρτητα μετά τη διαγραφή.
|
||||||
settings.deletion_success=Το αποθετήριο έχει διαγραφεί.
|
settings.deletion_success=Το repository έχει διαγραφεί.
|
||||||
settings.update_settings_success=Οι ρυθμίσεις του αποθετηρίου έχουν ενημερωθεί.
|
settings.update_settings_success=Οι ρυθμίσεις του αποθετηρίου έχουν ενημερωθεί.
|
||||||
settings.update_settings_no_unit=Το αποθετήριο θα πρέπει να επιτρέπει τουλάχιστον κάποιο είδος αλληλεπίδρασης.
|
settings.update_settings_no_unit=Το repository θα πρέπει να επιτρέπει τουλάχιστον κάποιο είδος αλληλεπίδρασης.
|
||||||
settings.confirm_delete=Διαγραφή αποθετηρίου
|
settings.confirm_delete=Διαγραφή αποθετηρίου
|
||||||
settings.add_collaborator=Προσθήκη συνεργάτη
|
settings.add_collaborator=Προσθήκη συνεργάτη
|
||||||
settings.add_collaborator_success=Ο συνεργάτης προστέθηκε.
|
settings.add_collaborator_success=Ο συνεργάτης προστέθηκε.
|
||||||
settings.add_collaborator_inactive_user=Δεν είναι δυνατή η προσθήκη ενός ανενεργού χρήστη ως συνεργάτη.
|
settings.add_collaborator_inactive_user=Δεν είναι δυνατή η προσθήκη ενός ανενεργού χρήστη ως συνεργάτη.
|
||||||
settings.add_collaborator_owner=Δεν είναι δυνατή η προσθήκη ενός ιδιοκτήτη σαν συνεργάτη.
|
settings.add_collaborator_owner=Δεν είναι δυνατή η προσθήκη ενός ιδιοκτήτη σαν συνεργάτη.
|
||||||
settings.add_collaborator_duplicate=Ο συνεργάτης έχει ήδη προστεθεί σε αυτό το αποθετήριο.
|
settings.add_collaborator_duplicate=Ο συνεργάτης έχει ήδη προστεθεί σε αυτό το repository.
|
||||||
settings.delete_collaborator=Κατάργηση
|
settings.delete_collaborator=Κατάργηση
|
||||||
settings.collaborator_deletion=Κατάργηση συνεργάτη
|
settings.collaborator_deletion=Κατάργηση συνεργάτη
|
||||||
settings.collaborator_deletion_desc=Η κατάργηση ενός συνεργάτη θα αφαιρέσει και την πρόσβασή του στο αποθετήριο. Είστε βέβαιοι;
|
settings.collaborator_deletion_desc=Η κατάργηση ενός συνεργάτη θα αφαιρέσει και την πρόσβασή του στο repository. Είστε βέβαιοι;
|
||||||
settings.remove_collaborator_success=Ο συνεργάτης έχει καταργηθεί.
|
settings.remove_collaborator_success=Ο συνεργάτης έχει καταργηθεί.
|
||||||
settings.search_user_placeholder=Αναζήτηση χρήστη…
|
settings.search_user_placeholder=Αναζήτηση χρήστη…
|
||||||
settings.org_not_allowed_to_be_collaborator=Δεν μπορείτε να προσθέσετε έναν οργανισμό ως συνεργάτη.
|
settings.org_not_allowed_to_be_collaborator=Δεν μπορείτε να προσθέσετε έναν οργανισμό ως συνεργάτη.
|
||||||
settings.change_team_access_not_allowed=Η αλλαγή της πρόσβασης ομάδας για το αποθετήριο έχει περιοριστεί στον ιδιοκτήτη του οργανισμού
|
settings.change_team_access_not_allowed=Η αλλαγή της πρόσβασης ομάδας για το repository έχει περιοριστεί στον ιδιοκτήτη του οργανισμού
|
||||||
settings.team_not_in_organization=Η ομάδα δεν είναι στον ίδιο οργανισμό με το αποθετήριο
|
settings.team_not_in_organization=Η ομάδα δεν είναι στον ίδιο οργανισμό με το repository
|
||||||
settings.teams=Ομάδες
|
settings.teams=Ομάδες
|
||||||
settings.add_team=Προσθήκη ομάδας
|
settings.add_team=Προσθήκη ομάδας
|
||||||
settings.add_team_duplicate=Η ομάδα έχει ήδη το αποθετήριο
|
settings.add_team_duplicate=Η ομάδα έχει ήδη το repository
|
||||||
settings.add_team_success=Η ομάδα έχει πλέον πρόσβαση στο αποθετήριο.
|
settings.add_team_success=Η ομάδα έχει πλέον πρόσβαση στο repository.
|
||||||
settings.search_team=Αναζήτηση Ομάδας…
|
settings.search_team=Αναζήτηση Ομάδας…
|
||||||
settings.change_team_permission_tip=Τα δικαιώματα της ομάδας έχουν οριστεί στη σελίδα ρυθμίσεων της ομάδας και δεν μπορούν να αλλάξουν ανά αποθετήριο
|
settings.change_team_permission_tip=Τα δικαιώματα της ομάδας έχουν οριστεί στη σελίδα ρυθμίσεων της ομάδας και δεν μπορούν να αλλάξουν ανά repository
|
||||||
settings.delete_team_tip=Αυτή η ομάδα έχει πρόσβαση σε όλα τα αποθετήρια και δεν μπορεί να αφαιρεθεί
|
settings.delete_team_tip=Αυτή η ομάδα έχει πρόσβαση σε όλα τα αποθετήρια και δεν μπορεί να αφαιρεθεί
|
||||||
settings.remove_team_success=Έχει αφαιρεθεί η πρόσβαση της ομάδας στο αποθετήριο.
|
settings.remove_team_success=Έχει αφαιρεθεί η πρόσβαση της ομάδας στο repository.
|
||||||
settings.add_webhook=Προσθήκη webhook
|
settings.add_webhook=Προσθήκη webhook
|
||||||
settings.add_webhook.invalid_channel_name=Το όνομα του καναλιού Webhook δεν μπορεί να είναι κενό και δεν μπορεί να περιέχει μόνο έναν χαρακτήρα #.
|
settings.add_webhook.invalid_channel_name=Το όνομα του καναλιού Webhook δεν μπορεί να είναι κενό και δεν μπορεί να περιέχει μόνο έναν χαρακτήρα #.
|
||||||
settings.hooks_desc=Τα Webhooks κάνουν αυτόματα αιτήσεις HTTP POST σε ένα διακομιστή όταν ενεργοποιούνται ορισμένα γεγονότα στο Forgejo. Διαβάστε περισσότερα στον <a target="_blank" rel="noopener noreferrer" href="%s">οδηγό webhooks</a>.
|
settings.hooks_desc=Τα Webhooks κάνουν αυτόματα αιτήσεις HTTP POST σε ένα διακομιστή όταν ενεργοποιούνται ορισμένα γεγονότα στο Forgejo. Διαβάστε περισσότερα στον <a target="_blank" rel="noopener noreferrer" href="%s">οδηγό webhooks</a>.
|
||||||
|
@ -2305,15 +2307,15 @@ settings.event_create_desc=Ο κλάδος ή η ετικέτα δημιουργ
|
||||||
settings.event_delete=Διαγραφή
|
settings.event_delete=Διαγραφή
|
||||||
settings.event_delete_desc=Ο κλάδος ή η ετικέτα διαγράφηκε.
|
settings.event_delete_desc=Ο κλάδος ή η ετικέτα διαγράφηκε.
|
||||||
settings.event_fork=Fork
|
settings.event_fork=Fork
|
||||||
settings.event_fork_desc=Το αποθετήριο έγινε fork.
|
settings.event_fork_desc=Το repository έγινε fork.
|
||||||
settings.event_wiki=Wiki
|
settings.event_wiki=Wiki
|
||||||
settings.event_wiki_desc=Η σελίδα Wiki δημιουργήθηκε, μετονομάστηκε, επεξεργάστηκε ή διαγράφηκε.
|
settings.event_wiki_desc=Η σελίδα Wiki δημιουργήθηκε, μετονομάστηκε, επεξεργάστηκε ή διαγράφηκε.
|
||||||
settings.event_release=Κυκλοφορία
|
settings.event_release=Κυκλοφορία
|
||||||
settings.event_release_desc=Η έκδοση δημοσιεύτηκε, ενημερώθηκε ή διαγράφηκε από ένα αποθετήριο.
|
settings.event_release_desc=Η έκδοση δημοσιεύτηκε, ενημερώθηκε ή διαγράφηκε από ένα αποθετήριο.
|
||||||
settings.event_push=Push
|
settings.event_push=Push
|
||||||
settings.event_push_desc=Git push σε ένα αποθετήριο.
|
settings.event_push_desc=Git push σε ένα repository.
|
||||||
settings.event_repository=Αποθετήριο
|
settings.event_repository=Repository
|
||||||
settings.event_repository_desc=Το αποθετήριο δημιουργήθηκε ή διαγράφηκε.
|
settings.event_repository_desc=Το repository δημιουργήθηκε ή διαγράφηκε.
|
||||||
settings.event_header_issue=Συμβάντα ζητημάτων
|
settings.event_header_issue=Συμβάντα ζητημάτων
|
||||||
settings.event_issues=Ζητήματα
|
settings.event_issues=Ζητήματα
|
||||||
settings.event_issues_desc=Το ζήτημα άνοιξε, έκλεισε, ανοίχθηκε εκ νέου ή επεξεργάστηκε.
|
settings.event_issues_desc=Το ζήτημα άνοιξε, έκλεισε, ανοίχθηκε εκ νέου ή επεξεργάστηκε.
|
||||||
|
@ -2345,7 +2347,7 @@ settings.event_pull_request_review_request_desc=Ζητήθηκε η αξιολό
|
||||||
settings.event_pull_request_approvals=Εγκρίσεις pull request
|
settings.event_pull_request_approvals=Εγκρίσεις pull request
|
||||||
settings.event_pull_request_merge=Συγχώνευση pull request
|
settings.event_pull_request_merge=Συγχώνευση pull request
|
||||||
settings.event_package=Πακέτο
|
settings.event_package=Πακέτο
|
||||||
settings.event_package_desc=Το πακέτο δημιουργήθηκε ή διαγράφηκε σε ένα αποθετήριο.
|
settings.event_package_desc=Το πακέτο δημιουργήθηκε ή διαγράφηκε σε ένα repository.
|
||||||
settings.branch_filter=Φίλτρο κλάδου
|
settings.branch_filter=Φίλτρο κλάδου
|
||||||
settings.branch_filter_desc=Λίστα επιτρεπόμενων κλάδων για ωθήσεις, δημιουργία κλάδων και γεγονότα διαγραφής κλάδων, που ορίζονται ως μοτίβο glob. Εάν είναι κενό ή <code>*</code>, αναφέρονται συμβάντα για όλους τους κλάδους. Δείτε τη τεκμηρίωση<a href="%[1]s">%[2]s</a> για σύνταξη. Παραδείγματα: <code>master</code>, <code>{master,release*}</code>.
|
settings.branch_filter_desc=Λίστα επιτρεπόμενων κλάδων για ωθήσεις, δημιουργία κλάδων και γεγονότα διαγραφής κλάδων, που ορίζονται ως μοτίβο glob. Εάν είναι κενό ή <code>*</code>, αναφέρονται συμβάντα για όλους τους κλάδους. Δείτε τη τεκμηρίωση<a href="%[1]s">%[2]s</a> για σύνταξη. Παραδείγματα: <code>master</code>, <code>{master,release*}</code>.
|
||||||
settings.authorization_header=Κεφαλίδα authorization
|
settings.authorization_header=Κεφαλίδα authorization
|
||||||
|
@ -2361,7 +2363,7 @@ settings.hook_type=Είδος hook
|
||||||
settings.slack_token=Διακριτικό
|
settings.slack_token=Διακριτικό
|
||||||
settings.slack_domain=Domain
|
settings.slack_domain=Domain
|
||||||
settings.slack_channel=Κανάλι
|
settings.slack_channel=Κανάλι
|
||||||
settings.add_web_hook_desc=Ενσωμάτωσε το <a target="_blank" rel="noreferrer" href="%s">%s</a> στο αποθετήριο σας.
|
settings.add_web_hook_desc=Ενσωμάτωσε το <a target="_blank" rel="noreferrer" href="%s">%s</a> στο repository σας.
|
||||||
settings.web_hook_name_gitea=Gitea
|
settings.web_hook_name_gitea=Gitea
|
||||||
settings.web_hook_name_forgejo = Forgejo
|
settings.web_hook_name_forgejo = Forgejo
|
||||||
settings.web_hook_name_gogs=Gogs
|
settings.web_hook_name_gogs=Gogs
|
||||||
|
@ -2381,9 +2383,9 @@ settings.packagist_api_token=Διακριτικό API
|
||||||
settings.packagist_package_url=URL πακέτων Packagist
|
settings.packagist_package_url=URL πακέτων Packagist
|
||||||
settings.deploy_keys=Κλειδιά διάθεσης
|
settings.deploy_keys=Κλειδιά διάθεσης
|
||||||
settings.add_deploy_key=Προσθήκη κλειδιού διάθεσης
|
settings.add_deploy_key=Προσθήκη κλειδιού διάθεσης
|
||||||
settings.deploy_key_desc=Τα κλειδιά διάθεσης έχουν πρόσβαση μόνο-ανάγνωσης στο αποθετήριο.
|
settings.deploy_key_desc=Τα κλειδιά διάθεσης έχουν πρόσβαση μόνο-ανάγνωσης στο repository.
|
||||||
settings.is_writable=Ενεργοποίηση πρόσβασης εγγραφής
|
settings.is_writable=Ενεργοποίηση πρόσβασης εγγραφής
|
||||||
settings.is_writable_info=Επιτρέψτε σε αυτό το κλειδί διάθεσης να <strong>ωθήσει</strong> στο αποθετήριο.
|
settings.is_writable_info=Επιτρέψτε σε αυτό το κλειδί διάθεσης να <strong>ωθήσει</strong> στο repository.
|
||||||
settings.no_deploy_keys=Δεν υπάρχουν ακόμα κλειδιά διάθεσης.
|
settings.no_deploy_keys=Δεν υπάρχουν ακόμα κλειδιά διάθεσης.
|
||||||
settings.title=Τίτλος
|
settings.title=Τίτλος
|
||||||
settings.deploy_key_content=Περιεχόμενο
|
settings.deploy_key_content=Περιεχόμενο
|
||||||
|
@ -2391,7 +2393,7 @@ settings.key_been_used=Ένα κλειδί διάθεσης με το ίδιο
|
||||||
settings.key_name_used=Ένα κλειδί διάθεσης με το ίδιο όνομα υπάρχει ήδη.
|
settings.key_name_used=Ένα κλειδί διάθεσης με το ίδιο όνομα υπάρχει ήδη.
|
||||||
settings.add_key_success=Το κλειδί διάθεσης «%s» προστέθηκε.
|
settings.add_key_success=Το κλειδί διάθεσης «%s» προστέθηκε.
|
||||||
settings.deploy_key_deletion=Αφαίρεση κλειδιού διάθεσης
|
settings.deploy_key_deletion=Αφαίρεση κλειδιού διάθεσης
|
||||||
settings.deploy_key_deletion_desc=Η κατάργηση ενός κλειδί διάθεσης θα ανακαλέσει την πρόσβασή του σε αυτό το αποθετήριο. Συνέχεια;
|
settings.deploy_key_deletion_desc=Η κατάργηση ενός κλειδί διάθεσης θα ανακαλέσει την πρόσβασή του σε αυτό το repository. Συνέχεια;
|
||||||
settings.deploy_key_deletion_success=Το κλειδί διάθεσης έχει αφαιρεθεί.
|
settings.deploy_key_deletion_success=Το κλειδί διάθεσης έχει αφαιρεθεί.
|
||||||
settings.branches=Κλάδοι
|
settings.branches=Κλάδοι
|
||||||
settings.protected_branch=Προστασία κλάδου
|
settings.protected_branch=Προστασία κλάδου
|
||||||
|
@ -2424,7 +2426,7 @@ settings.protect_check_status_contexts=Ενεργοποίηση ελέγχου
|
||||||
settings.protect_status_check_patterns=Μοτίβα ελέγχου κατάστασης:
|
settings.protect_status_check_patterns=Μοτίβα ελέγχου κατάστασης:
|
||||||
settings.protect_status_check_patterns_desc=Ορίστε μοτίβα για να καθορίσετε ποιοι έλεγχοι κατάστασης πρέπει να περάσουν πριν οι κλάδοι να μπορούν να συγχωνευτούν σε έναν κλάδο που ταιριάζει με αυτόν τον κανόνα. Κάθε γραμμή καθορίζει ένα μοτίβο. Τα μοτίβα δεν μπορούν να είναι κενά.
|
settings.protect_status_check_patterns_desc=Ορίστε μοτίβα για να καθορίσετε ποιοι έλεγχοι κατάστασης πρέπει να περάσουν πριν οι κλάδοι να μπορούν να συγχωνευτούν σε έναν κλάδο που ταιριάζει με αυτόν τον κανόνα. Κάθε γραμμή καθορίζει ένα μοτίβο. Τα μοτίβα δεν μπορούν να είναι κενά.
|
||||||
settings.protect_check_status_contexts_desc=Απαιτείται έλεγχος κατάστασης για να περάσει το pull request πριν από τη συγχώνευση. Επιλέξτε ποιοι έλεγχοι κατάστασης πρέπει να περάσουν πριν κλάδοι μπορούν να συγχωνευτούν σε έναν κλάδο που ταιριάζει με αυτόν τον κανόνα. Όταν είναι ενεργοποιημένο, οι υποβολές πρέπει πρώτα να γίνονται push σε άλλο κλάδο, στη συνέχεια, να συγχωνεύονται ή γίνονται push απευθείας σε ένα κλάδο που ταιριάζει με αυτόν τον κανόνα, αφού έχουν ολοκληρωθεί οι έλεγχοι κατάστασης. Αν δεν επιλεχθεί κανένα πλαίσιο, η τελευταία υποβολή πρέπει να είναι επιτυχής ανεξάρτητα από το πλαίσιο.
|
settings.protect_check_status_contexts_desc=Απαιτείται έλεγχος κατάστασης για να περάσει το pull request πριν από τη συγχώνευση. Επιλέξτε ποιοι έλεγχοι κατάστασης πρέπει να περάσουν πριν κλάδοι μπορούν να συγχωνευτούν σε έναν κλάδο που ταιριάζει με αυτόν τον κανόνα. Όταν είναι ενεργοποιημένο, οι υποβολές πρέπει πρώτα να γίνονται push σε άλλο κλάδο, στη συνέχεια, να συγχωνεύονται ή γίνονται push απευθείας σε ένα κλάδο που ταιριάζει με αυτόν τον κανόνα, αφού έχουν ολοκληρωθεί οι έλεγχοι κατάστασης. Αν δεν επιλεχθεί κανένα πλαίσιο, η τελευταία υποβολή πρέπει να είναι επιτυχής ανεξάρτητα από το πλαίσιο.
|
||||||
settings.protect_check_status_contexts_list=Έλεγχοι κατάστασης που βρέθηκαν την τελευταία εβδομάδα για αυτό το αποθετήριο
|
settings.protect_check_status_contexts_list=Έλεγχοι κατάστασης που βρέθηκαν την τελευταία εβδομάδα για αυτό το repository
|
||||||
settings.protect_status_check_matched=Ταιριάζει
|
settings.protect_status_check_matched=Ταιριάζει
|
||||||
settings.protect_invalid_status_check_pattern=Μη έγκυρο μοτίβο ελέγχου κατάστασης: "%s".
|
settings.protect_invalid_status_check_pattern=Μη έγκυρο μοτίβο ελέγχου κατάστασης: "%s".
|
||||||
settings.protect_no_valid_status_check_patterns=Μη έγκυρα μοτίβα ελέγχου κατάστασης.
|
settings.protect_no_valid_status_check_patterns=Μη έγκυρα μοτίβα ελέγχου κατάστασης.
|
||||||
|
@ -2442,7 +2444,7 @@ settings.protect_branch_name_pattern=Μοτίβο προστατευμένου
|
||||||
settings.protect_branch_name_pattern_desc=Μοτίβα ονόματος προστατευμένων κλάδων. Συμβολευτείτε <a href="%s">την τεκμηρίωση</a> για την σύνταξη ενός μοτίβου. Παραδείγματα: main, release/**
|
settings.protect_branch_name_pattern_desc=Μοτίβα ονόματος προστατευμένων κλάδων. Συμβολευτείτε <a href="%s">την τεκμηρίωση</a> για την σύνταξη ενός μοτίβου. Παραδείγματα: main, release/**
|
||||||
settings.protect_patterns=Μοτίβα
|
settings.protect_patterns=Μοτίβα
|
||||||
settings.protect_protected_file_patterns=Μοτίβα προστατευμένων αρχείων (διαχωρισμός με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
|
settings.protect_protected_file_patterns=Μοτίβα προστατευμένων αρχείων (διαχωρισμός με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
|
||||||
settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με semicolon («;») (ΟΧΙ ερωτηματικό). Για να συντάξετε μοτίβα, συμβουλευτείται την τεκμηρίωση <a href='%s'>github.com/gobwas/glob</a>. Παράδειγμα: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με semicolon («;») (ΟΧΙ ερωτηματικό). Για να συντάξετε μοτίβα, συμβουλευτείται την τεκμηρίωση <a href='%s'>%s</a>. Παράδειγμα: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.protect_unprotected_file_patterns=Μοτίβα μη προστατευμένων αρχείων (διαχωρισμένα με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
|
settings.protect_unprotected_file_patterns=Μοτίβα μη προστατευμένων αρχείων (διαχωρισμένα με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
|
||||||
settings.protect_unprotected_file_patterns_desc=Μη προστατευμένα αρχεία που επιτρέπεται να αλλάξουν απευθείας εάν ο χρήστης έχει πρόσβαση εγγραφής, παρακάμπτοντας τον περιορισμό ώθησης. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση <a href='%[1]s'>%[2]s</a> για τη σύνταξη του μοτίβου. Πχ: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_unprotected_file_patterns_desc=Μη προστατευμένα αρχεία που επιτρέπεται να αλλάξουν απευθείας εάν ο χρήστης έχει πρόσβαση εγγραφής, παρακάμπτοντας τον περιορισμό ώθησης. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση <a href='%[1]s'>%[2]s</a> για τη σύνταξη του μοτίβου. Πχ: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.add_protected_branch=Ενεργοποίηση προστασίας
|
settings.add_protected_branch=Ενεργοποίηση προστασίας
|
||||||
|
@ -2486,20 +2488,20 @@ settings.matrix.message_type=Είδος μηνύματος
|
||||||
settings.archive.button=Αρχειοθέτηση αποθετηρίου
|
settings.archive.button=Αρχειοθέτηση αποθετηρίου
|
||||||
settings.archive.header=Αρχειοθέτηση αποθετηρίου
|
settings.archive.header=Αρχειοθέτηση αποθετηρίου
|
||||||
settings.archive.text=Η αρχειοθέτηση του αποθετηρίου θα το αλλάξει σε μόνο για ανάγνωση. Δε θα φαίνεται στον αρχικό πίνακα. Κανείς (ακόμα και εσείς!) δε θα μπορεί να κάνει νέες υποβολές, ή να ανοίξει ζητήματα ή pull request.
|
settings.archive.text=Η αρχειοθέτηση του αποθετηρίου θα το αλλάξει σε μόνο για ανάγνωση. Δε θα φαίνεται στον αρχικό πίνακα. Κανείς (ακόμα και εσείς!) δε θα μπορεί να κάνει νέες υποβολές, ή να ανοίξει ζητήματα ή pull request.
|
||||||
settings.archive.success=Το αποθετήριο αρχειοθετήθηκε με επιτυχία.
|
settings.archive.success=Το repository αρχειοθετήθηκε με επιτυχία.
|
||||||
settings.archive.error=Παρουσιάστηκε σφάλμα κατά την προσπάθεια αρχειοθέτησης του αποθετηρίου. Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες.
|
settings.archive.error=Παρουσιάστηκε σφάλμα κατά την προσπάθεια αρχειοθέτησης του αποθετηρίου. Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες.
|
||||||
settings.archive.error_ismirror=Δε μπορείτε να αρχειοθετήσετε ένα είδωλο αποθετηρίου.
|
settings.archive.error_ismirror=Δε μπορείτε να αρχειοθετήσετε ένα είδωλο αποθετηρίου.
|
||||||
settings.archive.branchsettings_unavailable=Οι ρυθμίσεις του κλάδου δεν είναι διαθέσιμες αν το αποθετήριο είναι αρχειοθετημένο.
|
settings.archive.branchsettings_unavailable=Οι ρυθμίσεις του κλάδου δεν είναι διαθέσιμες αν το repository είναι αρχειοθετημένο.
|
||||||
settings.archive.tagsettings_unavailable=Οι ρυθμίσεις της ετικέτας δεν είναι διαθέσιμες αν το αποθετήριο είναι αρχειοθετημένο.
|
settings.archive.tagsettings_unavailable=Οι ρυθμίσεις της ετικέτας δεν είναι διαθέσιμες αν το repository είναι αρχειοθετημένο.
|
||||||
settings.unarchive.button=Αναίρεση αρχειοθέτησης αποθετηρίου
|
settings.unarchive.button=Αναίρεση αρχειοθέτησης αποθετηρίου
|
||||||
settings.unarchive.header=Απο-Αρχειοθέτηση του αποθετηρίου
|
settings.unarchive.header=Απο-Αρχειοθέτηση του αποθετηρίου
|
||||||
settings.unarchive.text=Η απο-αρχειοθέτηση του αποθετηρίου θα αποκαταστήσει την ικανότητά του να λαμβάνει υποβολές και ωθήσεις, καθώς και νέα ζητήματα και pull-requests.
|
settings.unarchive.text=Η απο-αρχειοθέτηση του αποθετηρίου θα αποκαταστήσει την ικανότητά του να λαμβάνει υποβολές και ωθήσεις, καθώς και νέα ζητήματα και pull-requests.
|
||||||
settings.unarchive.success=Το αποθετήριο απο-αρχειοθετήθηκε με επιτυχία.
|
settings.unarchive.success=Το repository απο-αρχειοθετήθηκε με επιτυχία.
|
||||||
settings.unarchive.error=Παρουσιάστηκε σφάλμα κατά την προσπάθεια απο-αρχειοθέτησης του αποθετηρίου. Δείτε τις καταγραφές για περισσότερες λεπτομέρειες.
|
settings.unarchive.error=Παρουσιάστηκε σφάλμα κατά την προσπάθεια απο-αρχειοθέτησης του αποθετηρίου. Δείτε τις καταγραφές για περισσότερες λεπτομέρειες.
|
||||||
settings.update_avatar_success=Η εικόνα του αποθετηρίου έχει ενημερωθεί.
|
settings.update_avatar_success=Η εικόνα του αποθετηρίου έχει ενημερωθεί.
|
||||||
settings.lfs=LFS
|
settings.lfs=LFS
|
||||||
settings.lfs_filelist=Αρχεία LFS σε αυτό το αποθετήριο
|
settings.lfs_filelist=Αρχεία LFS σε αυτό το repository
|
||||||
settings.lfs_no_lfs_files=Δεν υπάρχουν αρχεία LFS σε αυτό το αποθετήριο
|
settings.lfs_no_lfs_files=Δεν υπάρχουν αρχεία LFS σε αυτό το repository
|
||||||
settings.lfs_findcommits=Εύρεση υποβολών
|
settings.lfs_findcommits=Εύρεση υποβολών
|
||||||
settings.lfs_lfs_file_no_commits=Δεν βρέθηκαν υποβολές για αυτό το αρχείο LFS
|
settings.lfs_lfs_file_no_commits=Δεν βρέθηκαν υποβολές για αυτό το αρχείο LFS
|
||||||
settings.lfs_noattribute=Αυτή η διαδρομή δεν έχει λειτουργία κλειδώματος στον προεπιλεγμένο κλάδο
|
settings.lfs_noattribute=Αυτή η διαδρομή δεν έχει λειτουργία κλειδώματος στον προεπιλεγμένο κλάδο
|
||||||
|
@ -2518,7 +2520,7 @@ settings.lfs_force_unlock=Εξαγκαναστικό ξεκλείδωμα
|
||||||
settings.lfs_pointers.found=Βρέθηκαν %d δείκτης(ες) blob - %d συσχετίστηκαν, %d δεν συσχετίστηκαν (%d λείπουν από το χώρο αποθήκευσης)
|
settings.lfs_pointers.found=Βρέθηκαν %d δείκτης(ες) blob - %d συσχετίστηκαν, %d δεν συσχετίστηκαν (%d λείπουν από το χώρο αποθήκευσης)
|
||||||
settings.lfs_pointers.sha=Blob hash
|
settings.lfs_pointers.sha=Blob hash
|
||||||
settings.lfs_pointers.oid=OID
|
settings.lfs_pointers.oid=OID
|
||||||
settings.lfs_pointers.inRepo=Στο αποθετήριο
|
settings.lfs_pointers.inRepo=Στο repository
|
||||||
settings.lfs_pointers.exists=Υπάρχει στο χώρο αποθήκευσης
|
settings.lfs_pointers.exists=Υπάρχει στο χώρο αποθήκευσης
|
||||||
settings.lfs_pointers.accessible=Προσβάσιμο στον χρήστη
|
settings.lfs_pointers.accessible=Προσβάσιμο στον χρήστη
|
||||||
settings.lfs_pointers.associateAccessible=Συσχετισμός προσιτών %d OID
|
settings.lfs_pointers.associateAccessible=Συσχετισμός προσιτών %d OID
|
||||||
|
@ -2621,7 +2623,7 @@ release.delete_tag=Διαγραφή ετικέτας
|
||||||
release.deletion=Διαγραφή κυκλοφορίας
|
release.deletion=Διαγραφή κυκλοφορίας
|
||||||
release.deletion_desc=Διαγράφοντας μια κυκλοφορία, αυτή αφαιρείται μόνο από το Gitea. Δε θα επηρεάσει την ετικέτα Git, τα περιεχόμενα του αποθετηρίου σας ή το ιστορικό της. Συνέχεια;
|
release.deletion_desc=Διαγράφοντας μια κυκλοφορία, αυτή αφαιρείται μόνο από το Gitea. Δε θα επηρεάσει την ετικέτα Git, τα περιεχόμενα του αποθετηρίου σας ή το ιστορικό της. Συνέχεια;
|
||||||
release.deletion_success=Η κυκλοφορία έχει διαγραφεί.
|
release.deletion_success=Η κυκλοφορία έχει διαγραφεί.
|
||||||
release.deletion_tag_desc=Θα διαγράψει αυτή την ετικέτα από το αποθετήριο. Τα περιεχόμενα του αποθετηρίου και το ιστορικό παραμένουν αμετάβλητα. Συνέχεια;
|
release.deletion_tag_desc=Θα διαγράψει αυτή την ετικέτα από το repository. Τα περιεχόμενα του repository και το ιστορικό δεν θα πειραχτούν. Να γίνει συνέχεια;
|
||||||
release.deletion_tag_success=Η ετικέτα έχει διαγραφεί.
|
release.deletion_tag_success=Η ετικέτα έχει διαγραφεί.
|
||||||
release.tag_name_already_exist=Υπάρχει ήδη μια έκδοση με αυτό το όνομα ετικέτας.
|
release.tag_name_already_exist=Υπάρχει ήδη μια έκδοση με αυτό το όνομα ετικέτας.
|
||||||
release.tag_name_invalid=Το όνομα της ετικέτας δεν είναι έγκυρο.
|
release.tag_name_invalid=Το όνομα της ετικέτας δεν είναι έγκυρο.
|
||||||
|
@ -2646,7 +2648,7 @@ branch.delete_branch_has_new_commits=Ο κλάδος «%s» δεν μπορεί
|
||||||
branch.create_branch=Δημιουργία κλάδου %s
|
branch.create_branch=Δημιουργία κλάδου %s
|
||||||
branch.create_from=`από το «%s»`
|
branch.create_from=`από το «%s»`
|
||||||
branch.create_success=Ο κλάδος «%s» δημιουργήθηκε.
|
branch.create_success=Ο κλάδος «%s» δημιουργήθηκε.
|
||||||
branch.branch_already_exists=Ο κλάδος «%s» υπάρχει ήδη σε αυτό το αποθετήριο.
|
branch.branch_already_exists=Ο κλάδος «%s» υπάρχει ήδη σε αυτό το repository.
|
||||||
branch.branch_name_conflict=Το όνομα του κλάδου «%s» συγκρούεται με το ήδη υπάρχον κλάδο «%s».
|
branch.branch_name_conflict=Το όνομα του κλάδου «%s» συγκρούεται με το ήδη υπάρχον κλάδο «%s».
|
||||||
branch.tag_collision=Ο κλάδος «%s» δεν μπορεί να δημιουργηθεί επειδή μια ετικέτα με το ίδιο όνομα υπάρχει ήδη στο αποθετήριο.
|
branch.tag_collision=Ο κλάδος «%s» δεν μπορεί να δημιουργηθεί επειδή μια ετικέτα με το ίδιο όνομα υπάρχει ήδη στο αποθετήριο.
|
||||||
branch.deleted_by=Διαγράφηκε από %s
|
branch.deleted_by=Διαγράφηκε από %s
|
||||||
|
@ -2691,7 +2693,7 @@ error.csv.invalid_field_count=Δεν είναι δυνατή η απόδοση
|
||||||
commits.renamed_from = Μετονομάστηκε από %σ
|
commits.renamed_from = Μετονομάστηκε από %σ
|
||||||
settings.wiki_rename_branch_main_desc = Ο κλάδος, ο οποίος χρησιμοποιείται εσωτερικά από το wiki, θα μετονομαστεί (μόνιμα και μη αναστράψιμα) σε «%s».
|
settings.wiki_rename_branch_main_desc = Ο κλάδος, ο οποίος χρησιμοποιείται εσωτερικά από το wiki, θα μετονομαστεί (μόνιμα και μη αναστράψιμα) σε «%s».
|
||||||
issues.comment.blocked_by_user = Δεν μπορείτε να αφήσετε σχόλιο σε αυτό το ζήτημα, επειδή ο κάτοχος του αποθετηρίου ή το άτομο που δημιούργησε το ζήτημα σας έχει αποκλείσει.
|
issues.comment.blocked_by_user = Δεν μπορείτε να αφήσετε σχόλιο σε αυτό το ζήτημα, επειδή ο κάτοχος του αποθετηρίου ή το άτομο που δημιούργησε το ζήτημα σας έχει αποκλείσει.
|
||||||
pulls.blocked_by_user = Δεν μπορείτε να δημιουργήσετε pull request σε αυτό το αποθετήριο, επειδή ο κάτοχος του αποθετηρίου σας έχει αποκλείσει.
|
pulls.blocked_by_user = Δεν μπορείτε να δημιουργήσετε pull request σε αυτό το repository, επειδή ο κάτοχος του repository σας έχει αποκλείσει.
|
||||||
pulls.made_using_agit = AGit
|
pulls.made_using_agit = AGit
|
||||||
wiki.cancel = Ακύρωση
|
wiki.cancel = Ακύρωση
|
||||||
settings.units.add_more = Προσθήκη μονάδων...
|
settings.units.add_more = Προσθήκη μονάδων...
|
||||||
|
@ -2710,13 +2712,13 @@ rss.must_be_on_branch = Για να αποκτήσετε ένα RSS feed, πρέ
|
||||||
clone_in_vscodium = Κλωνοποίηση στο VSCodium
|
clone_in_vscodium = Κλωνοποίηση στο VSCodium
|
||||||
editor.invalid_commit_mail = Αυτή η διεύθυνση email δεν είναι έγκυρη για την δημιουργία μίας υποβολής.
|
editor.invalid_commit_mail = Αυτή η διεύθυνση email δεν είναι έγκυρη για την δημιουργία μίας υποβολής.
|
||||||
pulls.nothing_to_compare_have_tag = Ο επιλεγμένος κλάδος/tag είναι όμοιος.
|
pulls.nothing_to_compare_have_tag = Ο επιλεγμένος κλάδος/tag είναι όμοιος.
|
||||||
issues.blocked_by_user = Δεν μπορείτε να δημιουργήσετε ζητήματα σε αυτό το αποθετήριο, επειδή ο κάτοχος του αποθετηρίου σας έχει αποκλείσει.
|
issues.blocked_by_user = Δεν μπορείτε να δημιουργήσετε ζητήματα σε αυτό το repository, επειδή ο κάτοχος του repository σας έχει αποκλείσει.
|
||||||
pulls.agit_explanation = Δημιουργημένο μέσω του AGit. Το AGit επιτρέπει σε συνεισφέροντες να προτείνουν αλλαγές χρησιμοποιώντας την εντολή «git push», χωρίς την δημιουργία fork ή έναν νέο κλάδο.
|
pulls.agit_explanation = Δημιουργημένο μέσω του AGit. Το AGit επιτρέπει σε συνεισφέροντες να προτείνουν αλλαγές χρησιμοποιώντας την εντολή «git push», χωρίς την δημιουργία fork ή έναν νέο κλάδο.
|
||||||
activity.navbar.recent_commits = Πρόσφατες υποβολές
|
activity.navbar.recent_commits = Πρόσφατες υποβολές
|
||||||
settings.wiki_globally_editable = Να επιτρέπεται η επεξεργασία του wiki σε όλους
|
settings.wiki_globally_editable = Να επιτρέπεται η επεξεργασία του wiki σε όλους
|
||||||
admin.manage_flags = Διαχείριση σημάνσεων
|
admin.manage_flags = Διαχείριση σημάνσεων
|
||||||
admin.enabled_flags = Το αποθετήριο έχει τις εξής σημάνσεις:
|
admin.enabled_flags = Το repository έχει τις εξής σημάνσεις:
|
||||||
settings.mirror_settings.pushed_repository = Προοριζόμενο αποθετήριο
|
settings.mirror_settings.pushed_repository = Προοριζόμενο repository
|
||||||
admin.flags_replaced = Οι σημάνσεις του αποθετηρίου αντικαταστάθηκαν
|
admin.flags_replaced = Οι σημάνσεις του αποθετηρίου αντικαταστάθηκαν
|
||||||
activity.navbar.code_frequency = Συχνότητα κώδικα
|
activity.navbar.code_frequency = Συχνότητα κώδικα
|
||||||
settings.wiki_branch_rename_success = Το όνομα κλάδου wiki του αποθετηρίου κανονικοποιήθηκε επιτυχώς.
|
settings.wiki_branch_rename_success = Το όνομα κλάδου wiki του αποθετηρίου κανονικοποιήθηκε επιτυχώς.
|
||||||
|
@ -2767,7 +2769,7 @@ editor.commit_id_not_matching = Το αρχείο άλλαξε όσο το επ
|
||||||
settings.sourcehut_builds.visibility = Ορατότητα εργασιών
|
settings.sourcehut_builds.visibility = Ορατότητα εργασιών
|
||||||
object_format = Μορφή αντικειμένων («object format»)
|
object_format = Μορφή αντικειμένων («object format»)
|
||||||
settings.ignore_stale_approvals_desc = Οι εγκρίσεις, οι οποίες αναφέρονται σε παλαιότερες υποβολές, δεν θα προσμετρούνται στο σύνολο των απαιτούμενων εγκρίσεων του pull request. Εφόσον αυτές οι εγκρίσεις έχουν ήδη ανακληθεί, τότε αυτή η ρύθμιση δεν θα παίξει κάποιον ρόλο.
|
settings.ignore_stale_approvals_desc = Οι εγκρίσεις, οι οποίες αναφέρονται σε παλαιότερες υποβολές, δεν θα προσμετρούνται στο σύνολο των απαιτούμενων εγκρίσεων του pull request. Εφόσον αυτές οι εγκρίσεις έχουν ήδη ανακληθεί, τότε αυτή η ρύθμιση δεν θα παίξει κάποιον ρόλο.
|
||||||
settings.archive.mirrors_unavailable = Οι λειτουργίες ειδώλου δεν είναι διαθέσιμες εφόσον το αποθετήριο έχει αρχειοθετηθεί.
|
settings.archive.mirrors_unavailable = Οι λειτουργίες ειδώλου δεν είναι διαθέσιμες εφόσον το repository έχει αρχειοθετηθεί.
|
||||||
settings.web_hook_name_sourcehut_builds = SourceHut Builds
|
settings.web_hook_name_sourcehut_builds = SourceHut Builds
|
||||||
settings.enforce_on_admins = Εφαρμογή κανόνα σε διαχειριστές του αποθετηρίου
|
settings.enforce_on_admins = Εφαρμογή κανόνα σε διαχειριστές του αποθετηρίου
|
||||||
object_format_helper = Η μορφή αντικειμένων («object format») του αποθετηρίου. Δεν θα μπορείτε να το αλλάξετε μεταγενέστερα. Η πιο συμβατή μορφή είναι η SHA1.
|
object_format_helper = Η μορφή αντικειμένων («object format») του αποθετηρίου. Δεν θα μπορείτε να το αλλάξετε μεταγενέστερα. Η πιο συμβατή μορφή είναι η SHA1.
|
||||||
|
@ -2805,7 +2807,7 @@ release.type_attachment = Συνημμένο
|
||||||
activity.published_prerelease_label = Προδημοσίευση
|
activity.published_prerelease_label = Προδημοσίευση
|
||||||
activity.published_tag_label = Ετικέτα
|
activity.published_tag_label = Ετικέτα
|
||||||
settings.pull_mirror_sync_quota_exceeded = Έχετε υπερβεί τους διαθέσιμους πόρους σας, για αυτό δεν θα γίνει λήψη των πιο πρόσφατων αλλαγών.
|
settings.pull_mirror_sync_quota_exceeded = Έχετε υπερβεί τους διαθέσιμους πόρους σας, για αυτό δεν θα γίνει λήψη των πιο πρόσφατων αλλαγών.
|
||||||
settings.transfer_quota_exceeded = Ο νέος ιδιοκτήτης (%s) έχει υπερβεί τους διαθέσιμους πόρους του. Το αποθετήριο δεν μπορεί να μεταφερθεί.
|
settings.transfer_quota_exceeded = Ο νέος ιδιοκτήτης (%s) έχει υπερβεί τους διαθέσιμους πόρους του. Το repository δεν μπορεί να μεταφερθεί.
|
||||||
release.asset_name = Όνομα αρχείου
|
release.asset_name = Όνομα αρχείου
|
||||||
release.asset_external_url = Εξωτερικό URL
|
release.asset_external_url = Εξωτερικό URL
|
||||||
release.invalid_external_url = Μη έγκυρο εξωτερικό URL: «%s»
|
release.invalid_external_url = Μη έγκυρο εξωτερικό URL: «%s»
|
||||||
|
@ -2815,6 +2817,8 @@ no_eol.tooltip = Αυτό το αρχείο δεν περιέχει έναν χ
|
||||||
release.add_external_asset = Προσθήκη εξωτερικού αρχείου
|
release.add_external_asset = Προσθήκη εξωτερικού αρχείου
|
||||||
milestones.filter_sort.name = Όνομα
|
milestones.filter_sort.name = Όνομα
|
||||||
release.type_external_asset = Εξωτερικό αρχείο
|
release.type_external_asset = Εξωτερικό αρχείο
|
||||||
|
mirror_public_key = Δημόσιο κλειδί SSH
|
||||||
|
mirror_use_ssh.helper = το Forgejo θα κατοπτρίσει το αποθετήριο μέσω Git με τη χρήση SSH και θα δημιουργήσει ένα ζεύγος κλειδιών. Πρέπει να εξασφαλίσετε πως το δημιουργημένο κλειδί είναι εξουσιοδοτημένο να ωθεί στο αποθετήριο προορισμού. Εφόσον το έχετε επιλέξει, δε μπορείτε να χρησιμοποιήσετε εξουσιοδότηση συνθηματικού.
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
component_loading_failed = Δεν ήταν δυνατή η φόρτωση του %s
|
component_loading_failed = Δεν ήταν δυνατή η φόρτωση του %s
|
||||||
|
@ -2901,7 +2905,7 @@ teams.join=Συμμετοχή
|
||||||
teams.leave=Αποχώρηση
|
teams.leave=Αποχώρηση
|
||||||
teams.leave.detail=Σίγουρα θέλετε να αποχωρήσετε από την ομάδα %s;
|
teams.leave.detail=Σίγουρα θέλετε να αποχωρήσετε από την ομάδα %s;
|
||||||
teams.can_create_org_repo=Δημιουργία αποθετηρίων
|
teams.can_create_org_repo=Δημιουργία αποθετηρίων
|
||||||
teams.can_create_org_repo_helper=Τα μέλη μπορούν να δημιουργήσουν νέα αποθετήρια στον οργανισμό. Ο δημιουργός θα αποκτήσει πρόσβαση διαχειριστή στο νέο αποθετήριο.
|
teams.can_create_org_repo_helper=Τα μέλη μπορούν να δημιουργήσουν νέα αποθετήρια στον οργανισμό. Ο δημιουργός θα αποκτήσει πρόσβαση διαχειριστή στο νέο repository.
|
||||||
teams.none_access=Καμία πρόσβαση
|
teams.none_access=Καμία πρόσβαση
|
||||||
teams.none_access_helper=Τα μέλη δεν μπορούν να δουν ή να κάνουν οποιαδήποτε άλλη ενέργεια σε αυτή τη μονάδα.
|
teams.none_access_helper=Τα μέλη δεν μπορούν να δουν ή να κάνουν οποιαδήποτε άλλη ενέργεια σε αυτή τη μονάδα.
|
||||||
teams.general_access=Γενική πρόσβαση
|
teams.general_access=Γενική πρόσβαση
|
||||||
|
@ -2922,7 +2926,7 @@ teams.add_team_member=Προσθήκη μέλους ομάδας
|
||||||
teams.invite_team_member=Πρόσκληση στην ομάδα %s
|
teams.invite_team_member=Πρόσκληση στην ομάδα %s
|
||||||
teams.invite_team_member.list=Εκκρεμείς προσκλήσεις
|
teams.invite_team_member.list=Εκκρεμείς προσκλήσεις
|
||||||
teams.delete_team_title=Διαγραφή ομάδας
|
teams.delete_team_title=Διαγραφή ομάδας
|
||||||
teams.delete_team_desc=Η διαγραφή μιας ομάδας ανακαλεί τη πρόσβαση στο αποθετήριο από τα μέλη της. Συνέχεια;
|
teams.delete_team_desc=Η διαγραφή μιας ομάδας ανακαλεί τη πρόσβαση στο repository από τα μέλη της. Συνέχεια;
|
||||||
teams.delete_team_success=Η ομάδα έχει διαγραφεί.
|
teams.delete_team_success=Η ομάδα έχει διαγραφεί.
|
||||||
teams.read_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση <strong>Ανάγνωσης</strong>: τα μέλη μπορούν να δουν και να κλωνοποιήσουν τα αποθετήρια της ομάδας.
|
teams.read_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση <strong>Ανάγνωσης</strong>: τα μέλη μπορούν να δουν και να κλωνοποιήσουν τα αποθετήρια της ομάδας.
|
||||||
teams.write_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση <strong>Εγγραφής</strong>: τα μέλη μπορούν να διαβάσουν και να κάνουν push στα αποθετήρια της ομάδας.
|
teams.write_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση <strong>Εγγραφής</strong>: τα μέλη μπορούν να διαβάσουν και να κάνουν push στα αποθετήρια της ομάδας.
|
||||||
|
@ -2934,9 +2938,9 @@ teams.remove_all_repos_title=Αφαίρεση όλων των αποθετηρί
|
||||||
teams.remove_all_repos_desc=Αυτό θα αφαιρέσει όλα τα αποθετήρια από την ομάδα.
|
teams.remove_all_repos_desc=Αυτό θα αφαιρέσει όλα τα αποθετήρια από την ομάδα.
|
||||||
teams.add_all_repos_title=Προσθήκη όλων των αποθετηρίων
|
teams.add_all_repos_title=Προσθήκη όλων των αποθετηρίων
|
||||||
teams.add_all_repos_desc=Αυτό θα προσθέσει όλα τα αποθετήρια του οργανισμού στην ομάδα.
|
teams.add_all_repos_desc=Αυτό θα προσθέσει όλα τα αποθετήρια του οργανισμού στην ομάδα.
|
||||||
teams.add_nonexistent_repo=Το αποθετήριο που προσπαθείτε να προσθέσετε δεν υπάρχει, παρακαλώ δημιουργήστε το πρώτα.
|
teams.add_nonexistent_repo=Το repository που προσπαθείτε να προσθέσετε δεν υπάρχει, παρακαλώ δημιουργήστε το πρώτα.
|
||||||
teams.add_duplicate_users=Ο χρήστης είναι ήδη μέλος της ομάδας.
|
teams.add_duplicate_users=Ο χρήστης είναι ήδη μέλος της ομάδας.
|
||||||
teams.repos.none=Αυτή η ομάδα δεν έχει πρόσβαση σε κανένα αποθετήριο.
|
teams.repos.none=Αυτή η ομάδα δεν έχει πρόσβαση σε κανένα repository.
|
||||||
teams.members.none=Δεν υπάρχουν μέλη σε αυτήν την ομάδα.
|
teams.members.none=Δεν υπάρχουν μέλη σε αυτήν την ομάδα.
|
||||||
teams.specific_repositories=Συγκεκριμένα αποθετήρια
|
teams.specific_repositories=Συγκεκριμένα αποθετήρια
|
||||||
teams.specific_repositories_helper=Τα μέλη θα έχουν πρόσβαση μόνο σε αποθετήρια που προστίθενται ρητά στην ομάδα. Επιλέγοντας το <strong>δεν θα</strong> θα αφαιρεθούν αυτόματα τα αποθετήρια που έχουν ήδη προστεθεί με το <i>Όλα τα αποθετήρια</i>.
|
teams.specific_repositories_helper=Τα μέλη θα έχουν πρόσβαση μόνο σε αποθετήρια που προστίθενται ρητά στην ομάδα. Επιλέγοντας το <strong>δεν θα</strong> θα αφαιρεθούν αυτόματα τα αποθετήρια που έχουν ήδη προστεθεί με το <i>Όλα τα αποθετήρια</i>.
|
||||||
|
@ -3154,7 +3158,7 @@ packages.creator=Δημιουργός
|
||||||
packages.name=Όνομα
|
packages.name=Όνομα
|
||||||
packages.version=Έκδοση
|
packages.version=Έκδοση
|
||||||
packages.type=Τύπος
|
packages.type=Τύπος
|
||||||
packages.repository=Αποθετήριο
|
packages.repository=Repository
|
||||||
packages.size=Μέγεθος
|
packages.size=Μέγεθος
|
||||||
packages.published=Δημοσιευμένα
|
packages.published=Δημοσιευμένα
|
||||||
|
|
||||||
|
@ -3473,7 +3477,7 @@ notices.inverse_selection=Αντιστροφή επιλογής
|
||||||
notices.delete_selected=Διαγραφή επιλεγμένων
|
notices.delete_selected=Διαγραφή επιλεγμένων
|
||||||
notices.delete_all=Διαγραφή όλων των ειδοποιήσεων
|
notices.delete_all=Διαγραφή όλων των ειδοποιήσεων
|
||||||
notices.type=Τύπος
|
notices.type=Τύπος
|
||||||
notices.type_1=Αποθετήριο
|
notices.type_1=Repository
|
||||||
notices.type_2=Εργασία
|
notices.type_2=Εργασία
|
||||||
notices.desc=Περιγραφή
|
notices.desc=Περιγραφή
|
||||||
notices.op=Λειτ.
|
notices.op=Λειτ.
|
||||||
|
@ -3511,7 +3515,7 @@ users.organization_creation.description = Να επιτρέπεται η δημ
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
create_repo=δημιούργησε το αποθετήριο <a href="%s">%s</a>
|
create_repo=δημιούργησε το αποθετήριο <a href="%s">%s</a>
|
||||||
rename_repo=μετονόμασε το αποθετήριο από <code>%[1]s</code> σε <a href="%[2]s">%[3]s</a>
|
rename_repo=μετονόμασε το repository από <code>%[1]s</code> σε <a href="%[2]s">%[3]s</a>
|
||||||
commit_repo=έκανε push στο <a href="%[2]s">%[3]s</a> του <a href="%[1]s">%[4]s</a>
|
commit_repo=έκανε push στο <a href="%[2]s">%[3]s</a> του <a href="%[1]s">%[4]s</a>
|
||||||
create_issue=`άνοιξε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
|
create_issue=`άνοιξε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
close_issue=`έκλεισε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
|
close_issue=`έκλεισε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
|
@ -3523,7 +3527,7 @@ comment_issue=`άφησε σχόλιο στο ζήτημα <a href="%[1]s">%[3]s
|
||||||
comment_pull=`σχολίασε στο pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
comment_pull=`σχολίασε στο pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
merge_pull_request=`συγχώνευσε το pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
merge_pull_request=`συγχώνευσε το pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
auto_merge_pull_request=`αυτόματη συγχώνευση του pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
auto_merge_pull_request=`αυτόματη συγχώνευση του pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
transfer_repo=μετέφερε το αποθετήριο <code>%s</code> σε <a href="%s">%s</a>
|
transfer_repo=μετέφερε το repository <code>%s</code> σε <a href="%s">%s</a>
|
||||||
push_tag=ώθησε την ετικέτα <a href="%[2]s">%[3]s</a> σε <a href="%[1]s">%[4]s</a>
|
push_tag=ώθησε την ετικέτα <a href="%[2]s">%[3]s</a> σε <a href="%[1]s">%[4]s</a>
|
||||||
delete_tag=διέγραψε την ετικέτα %[2]s από <a href="%[1]s">%[3]s</a>
|
delete_tag=διέγραψε την ετικέτα %[2]s από <a href="%[1]s">%[3]s</a>
|
||||||
delete_branch=διέγραψε το κλάδο %[2]s από <a href="%[1]s">%[3]s</a>
|
delete_branch=διέγραψε το κλάδο %[2]s από <a href="%[1]s">%[3]s</a>
|
||||||
|
@ -3603,7 +3607,7 @@ title=Πακέτα
|
||||||
desc=Διαχείριση πακέτων μητρώου.
|
desc=Διαχείριση πακέτων μητρώου.
|
||||||
empty=Δεν υπάρχουν πακέτα ακόμα.
|
empty=Δεν υπάρχουν πακέτα ακόμα.
|
||||||
empty.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο πακέτων, συμβουλευτείτε <a target="_blank" rel="noopener noreferrer" href="%s">τον οδηγό</a>.
|
empty.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο πακέτων, συμβουλευτείτε <a target="_blank" rel="noopener noreferrer" href="%s">τον οδηγό</a>.
|
||||||
empty.repo=Μήπως ανεβάσατε ένα πακέτο, αλλά δεν εμφανίζεται εδώ; Πηγαίνετε στις <a href="%[1]s">ρυθμίσεις πακέτων</a> και συνδέστε το σε αυτό το αποθετήριο.
|
empty.repo=Μήπως ανεβάσατε ένα πακέτο, αλλά δεν εμφανίζεται εδώ; Πηγαίνετε στις <a href="%[1]s">ρυθμίσεις πακέτων</a> και συνδέστε το σε αυτό το repository.
|
||||||
registry.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο %s, συμβουλευτείτε τον <a target="_blank" rel="noopener noreferrer" href="%s">οδηγό</a>.
|
registry.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο %s, συμβουλευτείτε τον <a target="_blank" rel="noopener noreferrer" href="%s">οδηγό</a>.
|
||||||
filter.type=Τύπος
|
filter.type=Τύπος
|
||||||
filter.type.all=Όλα
|
filter.type.all=Όλα
|
||||||
|
@ -3644,10 +3648,10 @@ composer.registry=Ρυθμίστε αυτό το μητρώο στο αρχεί
|
||||||
composer.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Composer, εκτελέστε την ακόλουθη εντολή:
|
composer.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Composer, εκτελέστε την ακόλουθη εντολή:
|
||||||
composer.dependencies=Εξαρτήσεις
|
composer.dependencies=Εξαρτήσεις
|
||||||
composer.dependencies.development=Εξαρτήσεις Ανάπτυξης
|
composer.dependencies.development=Εξαρτήσεις Ανάπτυξης
|
||||||
conan.details.repository=Αποθετήριο
|
conan.details.repository=Repository
|
||||||
conan.registry=Ρυθμίστε αυτό το μητρώο από τη γραμμή εντολών:
|
conan.registry=Ρυθμίστε αυτό το μητρώο από τη γραμμή εντολών:
|
||||||
conan.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Conan, εκτελέστε την ακόλουθη εντολή:
|
conan.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Conan, εκτελέστε την ακόλουθη εντολή:
|
||||||
conda.registry=Ρυθμίστε αυτό το μητρώο ως αποθετήριο Conda στο αρχείο <code>.condarc</code>:
|
conda.registry=Ρυθμίστε αυτό το μητρώο ως repository Conda στο αρχείο <code>.condarc</code>:
|
||||||
conda.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Conda, εκτελέστε την ακόλουθη εντολή:
|
conda.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Conda, εκτελέστε την ακόλουθη εντολή:
|
||||||
container.details.type=Τύπος Εικόνας
|
container.details.type=Τύπος Εικόνας
|
||||||
container.details.platform=Πλατφόρμα
|
container.details.platform=Πλατφόρμα
|
||||||
|
@ -3705,8 +3709,8 @@ swift.registry=Ρυθμίστε αυτό το μητρώο από τη γραμ
|
||||||
swift.install=Προσθέστε το πακέτο στο αρχείο <code>Package.swift</code>:
|
swift.install=Προσθέστε το πακέτο στο αρχείο <code>Package.swift</code>:
|
||||||
swift.install2=και εκτελέστε την ακόλουθη εντολή:
|
swift.install2=και εκτελέστε την ακόλουθη εντολή:
|
||||||
vagrant.install=Για προσθήκη ενός κυτίου Vagrant, εκτελέστε την ακόλουθη εντολή:
|
vagrant.install=Για προσθήκη ενός κυτίου Vagrant, εκτελέστε την ακόλουθη εντολή:
|
||||||
settings.link=Σύνδεση αυτού του πακέτου με ένα αποθετήριο
|
settings.link=Σύνδεση αυτού του πακέτου με ένα repository
|
||||||
settings.link.description=Εάν συνδέσετε ένα πακέτο με ένα αποθετήριο, το πακέτο περιλαμβάνεται στη λίστα πακέτων του αποθετηρίου.
|
settings.link.description=Εάν συνδέσετε ένα πακέτο με ένα repository, το πακέτο περιλαμβάνεται στη λίστα πακέτων του repository.
|
||||||
settings.link.select=Επιλογή Αποθετηρίου
|
settings.link.select=Επιλογή Αποθετηρίου
|
||||||
settings.link.button=Ενημέρωση Συνδέσμου Αποθετηρίου
|
settings.link.button=Ενημέρωση Συνδέσμου Αποθετηρίου
|
||||||
settings.link.success=Ο σύνδεσμος αποθετηρίου ενημερώθηκε επιτυχώς.
|
settings.link.success=Ο σύνδεσμος αποθετηρίου ενημερώθηκε επιτυχώς.
|
||||||
|
@ -3718,7 +3722,7 @@ settings.delete.success=Το πακέτο έχει διαγραφεί.
|
||||||
settings.delete.error=Αποτυχία διαγραφής του πακέτου.
|
settings.delete.error=Αποτυχία διαγραφής του πακέτου.
|
||||||
owner.settings.cargo.title=Ευρετήριο μητρώου Cargo
|
owner.settings.cargo.title=Ευρετήριο μητρώου Cargo
|
||||||
owner.settings.cargo.initialize=Αρχικοποίηση ευρετηρίου
|
owner.settings.cargo.initialize=Αρχικοποίηση ευρετηρίου
|
||||||
owner.settings.cargo.initialize.description=Απαιτείται ένα ειδικό αποθετήριο ευρετηρίου Git για τη χρήση του μητρώου Cargo. Χρησιμοποιώντας αυτή την επιλογή θα δημιουργηθεί ξανά το αποθετήριο και θα ρυθμιστεί αυτόματα.
|
owner.settings.cargo.initialize.description=Απαιτείται ένα ειδικό repository ευρετηρίου Git για τη χρήση του μητρώου Cargo. Χρησιμοποιώντας αυτή την επιλογή θα δημιουργηθεί ξανά το repository και θα ρυθμιστεί αυτόματα.
|
||||||
owner.settings.cargo.initialize.error=Αποτυχία αρχικοποίησης ευρετηρίου Cargo: %v
|
owner.settings.cargo.initialize.error=Αποτυχία αρχικοποίησης ευρετηρίου Cargo: %v
|
||||||
owner.settings.cargo.initialize.success=Ο ευρετήριο Cargo δημιουργήθηκε με επιτυχία.
|
owner.settings.cargo.initialize.success=Ο ευρετήριο Cargo δημιουργήθηκε με επιτυχία.
|
||||||
owner.settings.cargo.rebuild=Ανανέωση ευρετηρίου
|
owner.settings.cargo.rebuild=Ανανέωση ευρετηρίου
|
||||||
|
@ -3811,7 +3815,7 @@ runners.task_list=Πρόσφατες εργασίες στον εκτελεστ
|
||||||
runners.task_list.no_tasks=Δεν υπάρχει καμία εργασία ακόμα.
|
runners.task_list.no_tasks=Δεν υπάρχει καμία εργασία ακόμα.
|
||||||
runners.task_list.run=Εκτέλεση
|
runners.task_list.run=Εκτέλεση
|
||||||
runners.task_list.status=Κατάσταση
|
runners.task_list.status=Κατάσταση
|
||||||
runners.task_list.repository=Αποθετήριο
|
runners.task_list.repository=Repository
|
||||||
runners.task_list.commit=Υποβολή
|
runners.task_list.commit=Υποβολή
|
||||||
runners.task_list.done_at=Ολοκλήρωσε Στις
|
runners.task_list.done_at=Ολοκλήρωσε Στις
|
||||||
runners.edit_runner=Επεξεργασία Εκτελεστή
|
runners.edit_runner=Επεξεργασία Εκτελεστή
|
||||||
|
|
|
@ -231,7 +231,6 @@ string.desc = Z - A
|
||||||
[error]
|
[error]
|
||||||
occurred = An error occurred
|
occurred = An error occurred
|
||||||
report_message = If you believe that this is a Forgejo bug, please search for issues on <a href="%s" target="_blank">Codeberg</a> or open a new issue if necessary.
|
report_message = If you believe that this is a Forgejo bug, please search for issues on <a href="%s" target="_blank">Codeberg</a> or open a new issue if necessary.
|
||||||
invalid_csrf = Bad Request: invalid CSRF token
|
|
||||||
not_found = The target couldn't be found.
|
not_found = The target couldn't be found.
|
||||||
network_error = Network error
|
network_error = Network error
|
||||||
server_internal = Internal server error
|
server_internal = Internal server error
|
||||||
|
@ -437,6 +436,8 @@ reset_password_wrong_user = You are signed in as %s, but the account recovery li
|
||||||
password_too_short = Password length cannot be less than %d characters.
|
password_too_short = Password length cannot be less than %d characters.
|
||||||
non_local_account = Non-local users cannot update their password through the Forgejo web interface.
|
non_local_account = Non-local users cannot update their password through the Forgejo web interface.
|
||||||
verify = Verify
|
verify = Verify
|
||||||
|
;As https://codeberg.org/forgejo/forgejo/issues/2809 progresses, please update this error message if possible
|
||||||
|
unauthorized_credentials = Credentials are incorrect or have expired. Retry your command or see %s for more information
|
||||||
scratch_code = Scratch code
|
scratch_code = Scratch code
|
||||||
use_scratch_code = Use a scratch code
|
use_scratch_code = Use a scratch code
|
||||||
twofa_scratch_used = You have used your scratch code. You have been redirected to the two-factor settings page so you may remove your device enrollment or generate a new scratch code.
|
twofa_scratch_used = You have used your scratch code. You have been redirected to the two-factor settings page so you may remove your device enrollment or generate a new scratch code.
|
||||||
|
@ -761,7 +762,7 @@ language.localization_project = Help us translate Forgejo into your language! <a
|
||||||
ui = Theme
|
ui = Theme
|
||||||
hints = Hints
|
hints = Hints
|
||||||
additional_repo_units_hint = Suggest to enable additional repository units
|
additional_repo_units_hint = Suggest to enable additional repository units
|
||||||
additional_repo_units_hint_description = Display an "Add more units..." button for repositories that do not have all available units enabled.
|
additional_repo_units_hint_description = Display an "Enable more" hint for repositories that do not have all available units enabled.
|
||||||
update_hints = Update hints
|
update_hints = Update hints
|
||||||
update_hints_success = Hints have been updated.
|
update_hints_success = Hints have been updated.
|
||||||
hidden_comment_types = Hidden comment types
|
hidden_comment_types = Hidden comment types
|
||||||
|
@ -1316,6 +1317,8 @@ view_git_blame = View git blame
|
||||||
video_not_supported_in_browser = Your browser does not support the HTML5 "video" tag.
|
video_not_supported_in_browser = Your browser does not support the HTML5 "video" tag.
|
||||||
audio_not_supported_in_browser = Your browser does not support the HTML5 "audio" tag.
|
audio_not_supported_in_browser = Your browser does not support the HTML5 "audio" tag.
|
||||||
stored_lfs = Stored with Git LFS
|
stored_lfs = Stored with Git LFS
|
||||||
|
stored_annex = Stored with Git Annex
|
||||||
|
stored_annex_not_present = not present here, try using git annex whereis
|
||||||
symbolic_link = Symbolic link
|
symbolic_link = Symbolic link
|
||||||
executable_file = Executable file
|
executable_file = Executable file
|
||||||
vendored = Vendored
|
vendored = Vendored
|
||||||
|
@ -1343,6 +1346,7 @@ editor.upload_file = Upload file
|
||||||
editor.edit_file = Edit file
|
editor.edit_file = Edit file
|
||||||
editor.preview_changes = Preview changes
|
editor.preview_changes = Preview changes
|
||||||
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
|
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
|
||||||
|
editor.cannot_edit_annex_files = Annex files cannot be edited in the web interface.
|
||||||
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
|
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
|
||||||
editor.edit_this_file = Edit file
|
editor.edit_this_file = Edit file
|
||||||
editor.this_file_locked = File is locked
|
editor.this_file_locked = File is locked
|
||||||
|
@ -1506,6 +1510,7 @@ issues.new.closed_milestone = Closed milestones
|
||||||
issues.new.assignees = Assignees
|
issues.new.assignees = Assignees
|
||||||
issues.new.clear_assignees = Clear assignees
|
issues.new.clear_assignees = Clear assignees
|
||||||
issues.new.no_assignees = No assignees
|
issues.new.no_assignees = No assignees
|
||||||
|
issues.new.assign_to_me = Assign to me
|
||||||
issues.new.no_reviewers = No reviewers
|
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.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.get_started = Get started
|
||||||
|
@ -1970,6 +1975,10 @@ pulls.auto_merge_canceled_schedule = The auto merge was canceled for this pull r
|
||||||
pulls.auto_merge_newly_scheduled_comment = `scheduled this pull request to auto merge when all checks succeed %[1]s`
|
pulls.auto_merge_newly_scheduled_comment = `scheduled this pull request to auto merge when all checks succeed %[1]s`
|
||||||
pulls.auto_merge_canceled_schedule_comment = `canceled auto merging this pull request when all checks succeed %[1]s`
|
pulls.auto_merge_canceled_schedule_comment = `canceled auto merging this pull request when all checks succeed %[1]s`
|
||||||
|
|
||||||
|
pulls.delete_after_merge.head_branch.is_default = The head branch you want to delete is the default branch and cannot be deleted.
|
||||||
|
pulls.delete_after_merge.head_branch.is_protected = The head branch you want to delete is a protected branch and cannot be deleted.
|
||||||
|
pulls.delete_after_merge.head_branch.insufficient_branch = You don't have permission to delete the head branch.
|
||||||
|
|
||||||
pulls.delete.title = Delete this pull request?
|
pulls.delete.title = Delete this pull request?
|
||||||
pulls.delete.text = Do you really want to delete this pull request? (This will permanently remove all content. Consider closing it instead, if you intend to keep it archived)
|
pulls.delete.text = Do you really want to delete this pull request? (This will permanently remove all content. Consider closing it instead, if you intend to keep it archived)
|
||||||
|
|
||||||
|
@ -2175,9 +2184,9 @@ settings.mirror_settings.push_mirror.add = Add push mirror
|
||||||
settings.mirror_settings.push_mirror.edit_sync_time = Edit mirror sync interval
|
settings.mirror_settings.push_mirror.edit_sync_time = Edit mirror sync interval
|
||||||
settings.mirror_settings.push_mirror.none_ssh = None
|
settings.mirror_settings.push_mirror.none_ssh = None
|
||||||
|
|
||||||
settings.units.units = Repository units
|
settings.units.units = Units
|
||||||
settings.units.overview = Overview
|
settings.units.overview = Overview
|
||||||
settings.units.add_more = Add more...
|
settings.units.add_more = Enable more
|
||||||
|
|
||||||
settings.sync_mirror = Synchronize now
|
settings.sync_mirror = Synchronize now
|
||||||
settings.mirror_settings.push_mirror.copy_public_key = Copy public key
|
settings.mirror_settings.push_mirror.copy_public_key = Copy public key
|
||||||
|
@ -2283,7 +2292,7 @@ settings.trust_model.collaboratorcommitter.desc = Valid signatures by collaborat
|
||||||
settings.wiki_rename_branch_main = Normalize the Wiki branch name
|
settings.wiki_rename_branch_main = Normalize the Wiki branch name
|
||||||
settings.wiki_rename_branch_main_desc = Rename the branch used internally by the Wiki to "%s". This change is permanent and cannot be undone.
|
settings.wiki_rename_branch_main_desc = Rename the branch used internally by the Wiki to "%s". This change is permanent and cannot be undone.
|
||||||
settings.wiki_rename_branch_main_notices_1 = This operation <strong>CANNOT</strong> be undone.
|
settings.wiki_rename_branch_main_notices_1 = This operation <strong>CANNOT</strong> be undone.
|
||||||
settings.wiki_rename_branch_main_notices_2 = This will permanently rename the the internal branch of %s's repository wiki. Existing checkouts will need to be updated.
|
settings.wiki_rename_branch_main_notices_2 = This will permanently rename the internal branch of %s's repository wiki. Existing checkouts will need to be updated.
|
||||||
settings.wiki_branch_rename_success = The repository wiki's branch name has been successfully normalized.
|
settings.wiki_branch_rename_success = The repository wiki's branch name has been successfully normalized.
|
||||||
settings.wiki_branch_rename_failure = Failed to normalize the repository wiki's branch name.
|
settings.wiki_branch_rename_failure = Failed to normalize the repository wiki's branch name.
|
||||||
settings.confirm_wiki_branch_rename = Rename the wiki branch
|
settings.confirm_wiki_branch_rename = Rename the wiki branch
|
||||||
|
@ -2355,6 +2364,7 @@ settings.slack_icon_url = Icon URL
|
||||||
settings.slack_color = Color
|
settings.slack_color = Color
|
||||||
settings.discord_username = Username
|
settings.discord_username = Username
|
||||||
settings.discord_icon_url = Icon URL
|
settings.discord_icon_url = Icon URL
|
||||||
|
settings.discord_icon_url.exceeds_max_length = Icon URL must be less than or equal to 2048 characters
|
||||||
settings.event_desc = Trigger on:
|
settings.event_desc = Trigger on:
|
||||||
settings.event_push_only = Push events
|
settings.event_push_only = Push events
|
||||||
settings.event_send_everything = All events
|
settings.event_send_everything = All events
|
||||||
|
@ -2375,32 +2385,32 @@ settings.event_push_desc = Git push to a repository.
|
||||||
settings.event_repository = Repository
|
settings.event_repository = Repository
|
||||||
settings.event_repository_desc = Repository created or deleted.
|
settings.event_repository_desc = Repository created or deleted.
|
||||||
settings.event_header_issue = Issue events
|
settings.event_header_issue = Issue events
|
||||||
settings.event_issues = Issues
|
settings.event_issues = Modification
|
||||||
settings.event_issues_desc = Issue opened, closed, reopened, or edited.
|
settings.event_issues_desc = Issue opened, closed, reopened, or edited.
|
||||||
settings.event_issue_assign = Issue assigned
|
settings.event_issue_assign = Assignment
|
||||||
settings.event_issue_assign_desc = Issue assigned or unassigned.
|
settings.event_issue_assign_desc = Issue assigned or unassigned.
|
||||||
settings.event_issue_label = Issue labeled
|
settings.event_issue_label = Labels
|
||||||
settings.event_issue_label_desc = Issue labels updated or cleared.
|
settings.event_issue_label_desc = Issue labels added or removed.
|
||||||
settings.event_issue_milestone = Issue milestoned
|
settings.event_issue_milestone = Milestones
|
||||||
settings.event_issue_milestone_desc = Issue milestoned or demilestoned.
|
settings.event_issue_milestone_desc = Milestone added, removed or modified.
|
||||||
settings.event_issue_comment = Issue comment
|
settings.event_issue_comment = Comments
|
||||||
settings.event_issue_comment_desc = Issue comment created, edited, or deleted.
|
settings.event_issue_comment_desc = Issue comment created, edited, or deleted.
|
||||||
settings.event_header_pull_request = Pull request events
|
settings.event_header_pull_request = Pull request events
|
||||||
settings.event_pull_request = Pull request
|
settings.event_pull_request = Modification
|
||||||
settings.event_pull_request_desc = Pull request opened, closed, reopened, or edited.
|
settings.event_pull_request_desc = Pull request opened, closed, reopened, or edited.
|
||||||
settings.event_pull_request_assign = Pull request assigned
|
settings.event_pull_request_assign = Assignment
|
||||||
settings.event_pull_request_assign_desc = Pull request assigned or unassigned.
|
settings.event_pull_request_assign_desc = Pull request assigned or unassigned.
|
||||||
settings.event_pull_request_label = Pull request labeled
|
settings.event_pull_request_label = Labels
|
||||||
settings.event_pull_request_label_desc = Pull request labels updated or cleared.
|
settings.event_pull_request_label_desc = Pull request labels added or removed.
|
||||||
settings.event_pull_request_milestone = Pull request milestoned
|
settings.event_pull_request_milestone = Milestones
|
||||||
settings.event_pull_request_milestone_desc = Pull request milestoned or demilestoned.
|
settings.event_pull_request_milestone_desc = Milestone added, removed or modified.
|
||||||
settings.event_pull_request_comment = Pull request comment
|
settings.event_pull_request_comment = Comments
|
||||||
settings.event_pull_request_comment_desc = Pull request comment created, edited, or deleted.
|
settings.event_pull_request_comment_desc = Pull request comment created, edited, or deleted.
|
||||||
settings.event_pull_request_review = Pull request reviewed
|
settings.event_pull_request_review = Reviews
|
||||||
settings.event_pull_request_review_desc = Pull request approved, rejected, or review comment.
|
settings.event_pull_request_review_desc = Pull request approved, rejected, or review comments added.
|
||||||
settings.event_pull_request_sync = Pull request synchronized
|
settings.event_pull_request_sync = Synchronized
|
||||||
settings.event_pull_request_sync_desc = Pull request synchronized.
|
settings.event_pull_request_sync_desc = Branch updated automatically with target branch.
|
||||||
settings.event_pull_request_review_request = Pull request review requested
|
settings.event_pull_request_review_request = Review requests
|
||||||
settings.event_pull_request_review_request_desc = Pull request review requested or review request removed.
|
settings.event_pull_request_review_request_desc = Pull request review requested or review request removed.
|
||||||
settings.event_pull_request_approvals = Pull request approvals
|
settings.event_pull_request_approvals = Pull request approvals
|
||||||
settings.event_pull_request_merge = Pull request merge
|
settings.event_pull_request_merge = Pull request merge
|
||||||
|
|
|
@ -29,7 +29,7 @@ your_profile = Profilo
|
||||||
sign_out = Adiaŭi
|
sign_out = Adiaŭi
|
||||||
settings = Agordoj
|
settings = Agordoj
|
||||||
logo = Emblemo
|
logo = Emblemo
|
||||||
toc = Listo de enhavo
|
toc = Enhavotabelo
|
||||||
admin_panel = Retejadministrado
|
admin_panel = Retejadministrado
|
||||||
webauthn_unsupported_browser = Via retfoliumilo ne jam subtenas la salutmanieron WebAuthn.
|
webauthn_unsupported_browser = Via retfoliumilo ne jam subtenas la salutmanieron WebAuthn.
|
||||||
new_org = Novan organizaĵon
|
new_org = Novan organizaĵon
|
||||||
|
@ -53,7 +53,7 @@ template = Ŝablono
|
||||||
webauthn_press_button = Bonvolu premi la butonon sur via sekurŝlosilo…
|
webauthn_press_button = Bonvolu premi la butonon sur via sekurŝlosilo…
|
||||||
signed_in_as = Salutinta kiel
|
signed_in_as = Salutinta kiel
|
||||||
sign_up = Registriĝi
|
sign_up = Registriĝi
|
||||||
enable_javascript = Ĉi tiu retejo bezonas JavaScript’on.
|
enable_javascript = Ĉi tiu retejo bezonas JavaSkripton.
|
||||||
home = Hejmo
|
home = Hejmo
|
||||||
email = Retpoŝtadreso
|
email = Retpoŝtadreso
|
||||||
your_settings = Agordoj
|
your_settings = Agordoj
|
||||||
|
@ -65,7 +65,7 @@ collaborative = Kunlaboraj
|
||||||
pull_requests = Tirpetoj
|
pull_requests = Tirpetoj
|
||||||
cancel = Nuligi
|
cancel = Nuligi
|
||||||
preview = Antaŭvido
|
preview = Antaŭvido
|
||||||
disabled = Malŝaltita
|
disabled = Malaktivigita
|
||||||
go_back = Reiri
|
go_back = Reiri
|
||||||
copy_content = Kopii enhavon
|
copy_content = Kopii enhavon
|
||||||
archived = Arĥivita
|
archived = Arĥivita
|
||||||
|
@ -108,12 +108,12 @@ unknown = Nekonata
|
||||||
issues = Eraroj
|
issues = Eraroj
|
||||||
error404 = Aŭ tiu ĉi paĝo <strong>ne ekzistas</strong> aŭ <strong>vi ne rajtas</strong> vidi ĝin.
|
error404 = Aŭ tiu ĉi paĝo <strong>ne ekzistas</strong> aŭ <strong>vi ne rajtas</strong> vidi ĝin.
|
||||||
retry = Reprovi
|
retry = Reprovi
|
||||||
activities = Agoj
|
activities = Aktivecoj
|
||||||
confirm_delete_selected = Konfirmi forigon de ĉiu elektito?
|
confirm_delete_selected = Konfirmi forigon de ĉiu elektito?
|
||||||
forks = Disbranĉiĝaj
|
forks = Disbranĉigoj
|
||||||
new_mirror = Novan spegulon
|
new_mirror = Novan spegulon
|
||||||
re_type = Retajpu pasvorton
|
re_type = Retajpu pasvorton
|
||||||
new_fork = Novan disbranĉiĝon de deponejo
|
new_fork = Novan disbranĉiĝo de deponejo
|
||||||
new_project_column = Novan kolumnon
|
new_project_column = Novan kolumnon
|
||||||
new_migrate = Novan enporton
|
new_migrate = Novan enporton
|
||||||
mirror = Spegulo
|
mirror = Spegulo
|
||||||
|
@ -122,12 +122,12 @@ remove = Forigi
|
||||||
filter = Filtri
|
filter = Filtri
|
||||||
filter.is_archived = Arĥivita
|
filter.is_archived = Arĥivita
|
||||||
filter.not_archived = Nearĥivita
|
filter.not_archived = Nearĥivita
|
||||||
filter.is_fork = Disbranĉigita
|
filter.is_fork = Disbranĉigoj
|
||||||
filter.not_fork = Nedisbranĉigita
|
filter.not_fork = Ne disbranĉigoj
|
||||||
filter.is_mirror = Spegulita
|
filter.is_mirror = Speguloj
|
||||||
filter.not_mirror = Nespegulita
|
filter.not_mirror = Ne speguloj
|
||||||
filter.is_template = Ŝablono
|
filter.is_template = Ŝablonoj
|
||||||
filter.not_template = Neŝablono
|
filter.not_template = Ne ŝablonoj
|
||||||
filter.public = Publika
|
filter.public = Publika
|
||||||
filter.private = Privata
|
filter.private = Privata
|
||||||
dashboard = Labortablo
|
dashboard = Labortablo
|
||||||
|
@ -142,6 +142,14 @@ copy_generic = Kopii al tondujo
|
||||||
confirm_delete_artifact = Ĉu vi certas, ke vi volas forigi la artefakton "%s"?
|
confirm_delete_artifact = Ĉu vi certas, ke vi volas forigi la artefakton "%s"?
|
||||||
artifacts = Artefaktoj
|
artifacts = Artefaktoj
|
||||||
new_repo.title = Novan deponejon
|
new_repo.title = Novan deponejon
|
||||||
|
filter.clear = Forigi filtrilojn
|
||||||
|
new_migrate.title = Novan migrigon
|
||||||
|
new_org.title = Novan organizaĵon
|
||||||
|
new_repo.link = Novan deponejon
|
||||||
|
new_migrate.link = Novan migrigon
|
||||||
|
new_org.link = Novan organizaĵon
|
||||||
|
error413 = Vi plenkonsumis vian kvoton.
|
||||||
|
twofa_scratch = Sukuranta kodo por duobla aŭtentikigo
|
||||||
|
|
||||||
[editor]
|
[editor]
|
||||||
buttons.list.ordered.tooltip = Aldoni nombran liston
|
buttons.list.ordered.tooltip = Aldoni nombran liston
|
||||||
|
@ -158,10 +166,12 @@ buttons.mention.tooltip = Mencii uzanton aŭ grupon
|
||||||
buttons.italic.tooltip = Aldoni oblikvan tekston
|
buttons.italic.tooltip = Aldoni oblikvan tekston
|
||||||
buttons.link.tooltip = Aldoni ligilon
|
buttons.link.tooltip = Aldoni ligilon
|
||||||
buttons.disable_monospace_font = Malsalti egallarĝan signoformaron
|
buttons.disable_monospace_font = Malsalti egallarĝan signoformaron
|
||||||
|
buttons.indent.tooltip = Krommarĝeni erojn je unu nivelo
|
||||||
|
buttons.unindent.tooltip = Malkrommarĝeni erojn je unu nivelo
|
||||||
|
|
||||||
[aria]
|
[aria]
|
||||||
navbar = Esplora breto
|
navbar = Esplora breto
|
||||||
footer.software = Pri programaro
|
footer.software = Pri ĉi tiu programaro
|
||||||
footer.links = Ligiloj
|
footer.links = Ligiloj
|
||||||
footer = Piedo
|
footer = Piedo
|
||||||
|
|
||||||
|
@ -176,13 +186,16 @@ network_error = Reteraro
|
||||||
invalid_csrf = Malvalida peto: malvalida CSRF-kodo
|
invalid_csrf = Malvalida peto: malvalida CSRF-kodo
|
||||||
occurred = Eraris iel
|
occurred = Eraris iel
|
||||||
missing_csrf = Malvalida peto: neniu CSRF-kodo
|
missing_csrf = Malvalida peto: neniu CSRF-kodo
|
||||||
server_internal = Eraris interno de servilo
|
server_internal = Ena servila eraro
|
||||||
|
|
||||||
[heatmap]
|
[heatmap]
|
||||||
less = Malpli
|
less = Malpli
|
||||||
number_of_contributions_in_the_last_12_months = %s kontribuoj dum la pasintaj 12 monatoj
|
number_of_contributions_in_the_last_12_months = %s kontribuoj dum la pasintaj 12 monatoj
|
||||||
contributions_zero = Neniu kontribuo
|
contributions_zero = Neniu kontribuo
|
||||||
more = Pli
|
more = Pli
|
||||||
|
contributions_format = {contributions} la {day}-an de {month} {year}
|
||||||
|
contributions_one = kontribuaĵo
|
||||||
|
contributions_few = kontribuaĵoj
|
||||||
|
|
||||||
[startpage]
|
[startpage]
|
||||||
app_desc = Senpena kaj memgastigebla Git-servo
|
app_desc = Senpena kaj memgastigebla Git-servo
|
||||||
|
@ -199,37 +212,37 @@ license_desc = Ek, prenu <a target="_blank" rel="noopener noreferrer" href="%[1]
|
||||||
title = Komenca agordado
|
title = Komenca agordado
|
||||||
install = Instalado
|
install = Instalado
|
||||||
db_name = Datumbazonomo
|
db_name = Datumbazonomo
|
||||||
run_user = Rulu kiel uzanto
|
run_user = Ruli kiel tiu uzanto
|
||||||
log_root_path = Protokola dosiervojo
|
log_root_path = Protokola dosiervojo
|
||||||
err_admin_name_is_invalid = Uzantonomo de administranto malvalidas
|
err_admin_name_is_invalid = Uzantonomo de administranto malvalidas
|
||||||
log_root_path_helper = Protokoloj skribiĝos en ĉi tiun dosierujon.
|
log_root_path_helper = Protokoloj skribiĝos en ĉi tiun dosierujon.
|
||||||
allow_only_external_registration.description = Permesi registriĝojn sole per fremdaj servoj
|
allow_only_external_registration.description = Uzantoj rajtas krei novajn kontojn nur uzante agorditajn fremdajn servojn.
|
||||||
user = Uzantonomo
|
user = Uzantonomo
|
||||||
smtp_addr = SMTP adreso
|
smtp_addr = SMTP adreso
|
||||||
smtp_port = SMTP adrespordo
|
smtp_port = SMTP adrespordo
|
||||||
disable_registration = Malŝalti registriĝon
|
disable_registration = Malaktivigi 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.
|
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.description = Ŝaltas serĉadon de profilbildoj el federaj fontoj per Libravatar.
|
federated_avatar_lookup.description = Serĉi profilbildojn per Libravatar.
|
||||||
mailer_password = SMTP pasvorto
|
mailer_password = SMTP pasvorto
|
||||||
repo_path = Deponeja dosiervojo
|
repo_path = Deponeja dosiervojo
|
||||||
err_empty_admin_email = La retpoŝtadreso de administranto ne malplenu.
|
err_empty_admin_email = La retpoŝtadreso de administranto ne malplenu.
|
||||||
app_url_helper = Baza URL por HTTP(S) elŝutaj ligiloj kaj retleteroj.
|
app_url_helper = Baza URL por HTTP(S) elŝutaj ligiloj kaj retleteroj.
|
||||||
mailer_user = SMTP uzantonomo
|
mailer_user = SMTP uzantnomo
|
||||||
openid_signup = Ŝalti registriĝon per OpenID
|
openid_signup = Aktivigi 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.
|
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
|
path = Vojo
|
||||||
no_admin_and_disable_registration = Neeblas malŝalti memregistradon sen kreiĝo de administranta konto.
|
no_admin_and_disable_registration = Neeblas malaktivigi memregistradon sen krei administrantan konton.
|
||||||
disable_gravatar.description = Malŝaltas Gravatar kaj fremdajn fontojn de profilbildoj. Implicita profilbildo uziĝos, krom se la uzanto alŝutus loke profilbildon.
|
disable_gravatar.description = Malaktivigas Gravatar-on kaj aliajn fremdajn fontojn de profilbildoj. Defaŭltaj profilbildoj 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.
|
offline_mode.description = Malaktivigi uzon de fremdaj serviloj por datumosendaĵoj kaj okupiĝas pri ciuj datumoj loke.
|
||||||
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:
|
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.
|
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
|
domain = Retnomo
|
||||||
err_admin_name_pattern_not_allowed = Uzantonomo de administranto malvalidas, ĉar la nomo akordas rezervan ŝablonon
|
err_admin_name_pattern_not_allowed = Uzantonomo de administranto malvalidas, ĉar la nomo akordas rezervan ŝablonon
|
||||||
disable_registration.description = Malŝaltas registriĝojn. Sole administrantoj rajtos krei novajn kontojn.
|
disable_registration.description = Malaktivigas registriĝojn. Sole administrantoj rajtos krei novajn kontojn.
|
||||||
db_schema = Skemo
|
db_schema = Skemo
|
||||||
reinstall_error = Vi provas instali al jamekzistanta Forgejo-datumbazo
|
reinstall_error = Vi provas instali al jamekzistanta Forgejo-datumbazo
|
||||||
err_empty_admin_password = La pasvorto de administranto ne malplenu.
|
err_empty_admin_password = La pasvorto de administranto ne malplenu.
|
||||||
disable_gravatar = Malŝalti profilbildojn per Gravatar
|
disable_gravatar = Malaktivigi Gravatar-on
|
||||||
repo_path_helper = Foraj Git-deponejoj konserviĝos al tiu ĉi dosierujo.
|
repo_path_helper = Foraj Git-deponejoj konserviĝos al tiu ĉi dosierujo.
|
||||||
sqlite_helper = Dosiervojo por la datumbazo SQLite3.<br>Enigu absolutan vojon se vi rulas Forgejon kiel servo.
|
sqlite_helper = Dosiervojo por la datumbazo SQLite3.<br>Enigu absolutan vojon se vi rulas Forgejon kiel servo.
|
||||||
enable_captcha = Ŝalti dumregistriĝan teston de homeco
|
enable_captcha = Ŝalti dumregistriĝan teston de homeco
|
||||||
|
@ -237,7 +250,7 @@ require_db_desc = Forgejo bezonas kiel datumbazo MySQL, PostgreSQL, SQLite3, aŭ
|
||||||
smtp_from = Sendu retleterojn kiel
|
smtp_from = Sendu retleterojn kiel
|
||||||
general_title = Ĝeneralaj agordoj
|
general_title = Ĝeneralaj agordoj
|
||||||
password = Pasvorto
|
password = Pasvorto
|
||||||
lfs_path_helper = Dosieroj spurataj de Git LFS konserviĝos en tiu ĉi dosierujo. Lasu malplena por malŝalti.
|
lfs_path_helper = Dosieroj spurataj de Git LFS konserviĝos en tiu ĉi dosierujo. Lasu malplena por malaktivigi.
|
||||||
openid_signin = Ŝalti salutadon per OpenID
|
openid_signin = Ŝalti salutadon per OpenID
|
||||||
host = Gastiganto
|
host = Gastiganto
|
||||||
docker_helper = Se vi rulas Forgejon per Docker, bonvolu legi la <a target="_blank" rel="noopener noreferrer" href="%s">gvidpaĝojn</a> antaŭ ajna agordoŝanĝo.
|
docker_helper = Se vi rulas Forgejon per Docker, bonvolu legi la <a target="_blank" rel="noopener noreferrer" href="%s">gvidpaĝojn</a> antaŭ ajna agordoŝanĝo.
|
||||||
|
@ -245,67 +258,71 @@ federated_avatar_lookup = Ŝalti federajn profilbildojn
|
||||||
optional_title = Malnepraj agordoj
|
optional_title = Malnepraj agordoj
|
||||||
domain_helper = Retnomo aŭ adreso de la servilo.
|
domain_helper = Retnomo aŭ adreso de la servilo.
|
||||||
mail_notify = Ŝalti retpoŝtajn sciigojn
|
mail_notify = Ŝalti retpoŝtajn sciigojn
|
||||||
app_url = Forgejo Baza URL
|
app_url = Baza URL
|
||||||
ssl_mode = SSL
|
ssl_mode = SSL
|
||||||
db_title = Datumbazaj agordoj
|
db_title = Datumbazaj agordoj
|
||||||
err_empty_db_path = La datumbazovojo de SQLite3 ne malplenu.
|
err_empty_db_path = La datumbazovojo de SQLite3 ne malplenu.
|
||||||
openid_signin.description = Ŝaltas salutadon per OpenID.
|
openid_signin.description = Permesas al la uzantoj ensaluti per OpenID.
|
||||||
smtp_from_helper = Retpoŝtadreson kiun uzos Forgejo. Enmetu ordinaran adreson aŭ laŭ la formo «"Name" <email@example.com>».
|
smtp_from_helper = Retpoŝtadreson kiun uzos Forgejo. Enmetu ordinaran adreson aŭ laŭ la formo «"Name" <email@example.com>».
|
||||||
enable_captcha.description = Postulas teston de homeco dum registriĝoj.
|
enable_captcha.description = Postuli teston de homeco al la uzantoj kreantaj kontojn.
|
||||||
ssh_port_helper = Adresporda numero kiun atentas via SSH-servilo. Lasu malplena por malŝalti.
|
ssh_port_helper = Adresporda numero kiu estos uzata de la SSH-servilo. Lasu malplena por malaktivigi la SSH-servilon.
|
||||||
lfs_path = Git LFS dosiervojo
|
lfs_path = Git LFS dosiervojo
|
||||||
app_name_helper = Vi povas enmeti la nomon de via kompanio ĉi tien.
|
app_name_helper = Vi povas enmeti la nomon de via kompanio ĉi tien. Ĝi montriĝos en ĉiuj retpaĝoj.
|
||||||
http_port_helper = Adresporda numero kiun atentos la HTTP-servilo de Forgejo.
|
http_port_helper = Adresporda numero kiu estos uzta de la HTTP-servilo de Forgejo.
|
||||||
http_port = Forgejo HTTP adrespordo
|
http_port = HTTP adrespordo
|
||||||
db_schema_helper = Lasu malplena por implicita («public»).
|
db_schema_helper = Lasu malplena por implicita («public»).
|
||||||
ssh_port = SSH adrespordo
|
ssh_port = SSH adrespordo
|
||||||
err_admin_name_is_reserved = Uzantonomo de administranto malvalidas, tiu uzantonomo estas rezerva
|
err_admin_name_is_reserved = Uzantonomo de administranto malvalidas, tiu uzantonomo estas rezerva
|
||||||
openid_signup.description = Ŝaltas uzantregistriĝon per OpenID.
|
openid_signup.description = Permesi al la uzantoj krei kontojn per OpenID se reĝitriĝo aktivas.
|
||||||
db_type = Datumbazospeco
|
db_type = Datumbazospeco
|
||||||
email_title = Retpoŝtaj agordoj
|
email_title = Retpoŝtaj agordoj
|
||||||
offline_mode = Ŝalti lokan reĝimon
|
offline_mode = Ŝalti lokan reĝimon
|
||||||
reinstall_confirm_check_1 = La datumoj ĉifritaj per la ŝlosilo SECRET_KEY en app.ini eble perdiĝos; eblas ke uzantoj ne povos saluti per dumaniera-saluto aŭ unufojaj pasvortoj, kaj ke spegulado ne funkcios ĝuste. Ŝaltinte tiun ĉi skatolon, vi asertas ke la nuna app.ini dosiero enhavas la ĝustan SECRET_KEY.
|
reinstall_confirm_check_1 = La datumoj ĉifritaj per la ŝlosilo SECRET_KEY en app.ini eble perdiĝos; eblas ke uzantoj ne povos saluti per dumaniera-saluto aŭ unufojaj pasvortoj, kaj ke spegulado ne funkcios ĝuste. Ŝaltinte tiun ĉi skatolon, vi asertas ke la nuna app.ini dosiero enhavas la ĝustan SECRET_KEY.
|
||||||
app_name = Retejonomo
|
app_name = Retejonomo
|
||||||
server_service_title = Servilaj kaj fremdservaj agordoj
|
server_service_title = Servilaj kaj fremdservaj agordoj
|
||||||
require_sign_in_view = Postuli saluton por vidi paĝojn
|
require_sign_in_view = Postuli saluton por vidi instancan enhavon
|
||||||
register_confirm = Postuli retpoŝtan kontrolon por registri
|
register_confirm = Postuli retpoŝtan kontrolon por registri
|
||||||
admin_password = Pasvorto
|
admin_password = Pasvorto
|
||||||
admin_title = Administrantaj kontagordoj
|
admin_title = Administrantaj kontagordoj
|
||||||
admin_email = Retpoŝtadreso
|
admin_email = Retpoŝtadreso
|
||||||
install_btn_confirm = Instali Forgejon
|
install_btn_confirm = Instali Forgejon
|
||||||
require_sign_in_view.description = 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 nur vidos salutajn kaj registriĝajn paĝojn.
|
||||||
invalid_db_setting = La datumbazaj agordoj malvalidas: %v
|
invalid_db_setting = La datumbazaj agordoj malvalidas: %v
|
||||||
invalid_db_table = La datumbaza tabelo «%s» 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»).
|
sqlite3_not_available = Ĉi tiu versio de Forgejo ne subtenas SQLite3. Bonvolu elŝuti la oficialan ruldosieron de %s (ne la version «gobuild»).
|
||||||
invalid_app_data_path = La programdatuma dosiervojo malvalidas: %s
|
invalid_app_data_path = La programdatuma dosiervojo malvalidas: %s
|
||||||
test_git_failed = Ne povis testi programon «git»: %v
|
test_git_failed = Ne povis testi "git" komandon: %v
|
||||||
confirm_password = Konfirmi pasvorton
|
confirm_password = Konfirmi pasvorton
|
||||||
invalid_repo_path = La deponeja dosiervojo malvalidas: %v
|
invalid_repo_path = La deponeja dosiervojo malvalidas: %v
|
||||||
admin_name = Administranto uzantonomo
|
admin_name = Administranta uzantnomo
|
||||||
admin_setting.description = Krei administranton estas malnepra. La unue registrota uzanto memage iĝos administranto.
|
admin_setting.description = Krei administrantan konton malnepras. La unua registrota uzanto aŭtomate iĝos administranto.
|
||||||
run_user_not_match = La «rulu kiel» uzantonomo ne samas al la nuna uzantonomo: %s -> %s
|
run_user_not_match = La "ruli kiel tiu uzanto" uzantnomo ne samas al la nuna uzantnomo: %s -> %s
|
||||||
secret_key_failed = Malsukcesis kreante sekretan ŝlosilon: %v
|
secret_key_failed = Malsukcesis kreante sekretan ŝlosilon: %v
|
||||||
save_config_failed = Malsukcesis konservante agordojn: %v
|
save_config_failed = Malsukcesis konservante agordojn: %v
|
||||||
invalid_admin_setting = Agordoj de administranta konto malvalidas: %v
|
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.
|
enable_update_checker_helper_forgejo = Periode serĉos novajn versiojn de Forgejo kontrolante DNS TXT registraĵon ĉe release.forgejo.org.
|
||||||
invalid_log_root_path = La protokola dosiervojo malvalidas: %v
|
invalid_log_root_path = La protokola dosiervojo malvalidas: %v
|
||||||
default_enable_timetracking = Ŝalti tempospuradon implicite
|
default_enable_timetracking = Aktivigi tempospuradon defaŭlte
|
||||||
default_enable_timetracking.description = Ŝaltus tempospuradon por novaj deponejoj implicite.
|
default_enable_timetracking.description = Aktivigas tempospuradon por novaj deponejoj defaŭlte.
|
||||||
default_keep_email_private.description = Kaŝus retpoŝtadresojn de novaj kontoj implicite.
|
default_keep_email_private.description = Kaŝi defaŭlte retpoŝtadresojn por novaj uzantoj por ke iliaj informoj ne senprokraste likiĝas post reĝistriĝo.
|
||||||
default_allow_create_organization = Permesi kreadon de organizaĵoj implicite
|
default_allow_create_organization = Permesi kreadon de organizaĵoj defaŭlte
|
||||||
allow_dots_in_usernames = Permesi ĉeeston de punktoj en uzantonomoj. Ne efikas je jamaj kontoj.
|
allow_dots_in_usernames = Permesi ĉeeston de punktoj en uzantonomoj. Ne efikas je jamaj kontoj.
|
||||||
no_reply_address = Retnomo de retpoŝtaj kaŝadresoj
|
no_reply_address = Retnomo por kaŝitaj retpoŝtadresoj
|
||||||
default_keep_email_private = Kaŝi retpoŝtadresojn implicite
|
default_keep_email_private = Kaŝi retpoŝtadresojn defaŭlte
|
||||||
default_allow_create_organization.description = Permesus novajn uzantojn krei organizaĵojn implicite.
|
default_allow_create_organization.description = Permesi al novaj uzantoj krei organizaĵojn defaŭlte. Kiam ĉi tiu opcio malaktiviĝas, administranto devos permesi al novaj uzantoj krei organizaĵojn.
|
||||||
env_config_keys_prompt = La jenaj mediaj variantoj ankaŭ fandiĝos kun via agordodosiero:
|
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».
|
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
|
enable_update_checker = Aktivigi novversian kontrolanton
|
||||||
password_algorithm = Pasvorthaketiga algoritmo
|
password_algorithm = Pasvorthaketiga algoritmo
|
||||||
env_config_keys = Mediagordoj
|
env_config_keys = Mediagordoj
|
||||||
invalid_password_algorithm = Malvalida pasvorthakeita algoritmo
|
invalid_password_algorithm = Malvalida pasvorthakeita algoritmo
|
||||||
password_algorithm_helper = Agordas la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj.
|
password_algorithm_helper = Agordas la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj.
|
||||||
internal_token_failed = Malsukcesis krei internan ĵetonon: %v
|
internal_token_failed = Malsukcesis krei internan ĵetonon: %v
|
||||||
smtp_from_invalid = La «Sendu retleterojn kiel» adreso malvalidas
|
smtp_from_invalid = La «Sendu retleterojn kiel» adreso malvalidas
|
||||||
|
allow_only_external_registration = Permesi registriĝon nur per fremdaj servoj
|
||||||
|
app_slogan = Instanca frapfrazo
|
||||||
|
app_slogan_helper = Enigu vian instancan frapfrazon ĉi tien. Lasu malplena por malaktivigi.
|
||||||
|
config_location_hint = Ĉi tiuj agordoj konserviĝos en:
|
||||||
|
|
||||||
[admin]
|
[admin]
|
||||||
config.app_data_path = Programdatuja doseiervojo
|
config.app_data_path = Programdatuja doseiervojo
|
||||||
|
@ -315,8 +332,8 @@ config.allow_dots_in_usernames = Permesi ĉeeston de punktoj en uzantonomoj. Ne
|
||||||
filter = Aliaj filtriloj
|
filter = Aliaj filtriloj
|
||||||
show_archived = Arĥivita
|
show_archived = Arĥivita
|
||||||
search_repos = Serĉi deponejon…
|
search_repos = Serĉi deponejon…
|
||||||
my_orgs = Miaj organizaĵoj
|
my_orgs = Organizaĵoj
|
||||||
uname_holder = Uzantonomo aŭ Retpoŝtadreso
|
uname_holder = Uzantnomo aŭ retpoŝtadreso
|
||||||
my_repos = Deponejoj
|
my_repos = Deponejoj
|
||||||
show_both_archived_unarchived = Montras arĥivitajn kaj nearĥivitajn
|
show_both_archived_unarchived = Montras arĥivitajn kaj nearĥivitajn
|
||||||
feed_of = Fluo de «%s»
|
feed_of = Fluo de «%s»
|
||||||
|
@ -333,7 +350,7 @@ show_only_unarchived = Montras sole nearĥivitajn
|
||||||
my_mirrors = Miaj speguloj
|
my_mirrors = Miaj speguloj
|
||||||
show_only_archived = Montras sole arĥivitajn
|
show_only_archived = Montras sole arĥivitajn
|
||||||
view_home = Vidi %s
|
view_home = Vidi %s
|
||||||
switch_dashboard_context = Ŝanĝi labortablon
|
switch_dashboard_context = Baskuli la kuntekston de la kontrolpanelo
|
||||||
|
|
||||||
[explore]
|
[explore]
|
||||||
search.match.tooltip = Inkluzivu sole rezultojn kiuj akordas precize la serĉomendon
|
search.match.tooltip = Inkluzivu sole rezultojn kiuj akordas precize la serĉomendon
|
||||||
|
@ -355,22 +372,26 @@ code_search_results = Serĉrezultoj je «%s»
|
||||||
relevant_repositories = Sole montras aktualajn deponejojn, <a href="%s">montri senfiltrajn rezultojn</a>.
|
relevant_repositories = Sole montras aktualajn deponejojn, <a href="%s">montri senfiltrajn rezultojn</a>.
|
||||||
code_last_indexed_at = Plejfreŝe esplorita je %s
|
code_last_indexed_at = Plejfreŝe esplorita je %s
|
||||||
code_no_results = Neniu fontkodo akorda laŭ via serĉomendo trovita.
|
code_no_results = Neniu fontkodo akorda laŭ via serĉomendo trovita.
|
||||||
|
forks_few = %d disbranĉigoj
|
||||||
|
stars_one = %d stelo
|
||||||
|
forks_one = %d disbranĉigo
|
||||||
|
stars_few = %d steloj
|
||||||
|
|
||||||
[auth]
|
[auth]
|
||||||
disable_register_mail = Retpoŝta konfirmado dum registriĝo estas malŝaltita.
|
disable_register_mail = Retpoŝta konfirmado dum registriĝo estas malaktivigita.
|
||||||
sign_up_successful = Konto sukcese kreita. Bonvenon!
|
sign_up_successful = Konto sukcese kreita. Bonvenon!
|
||||||
forgot_password = Ĉu forgesis pasvorton?
|
forgot_password = Ĉu forgesis pasvorton?
|
||||||
sign_up_now = Ĉu bezonas konton? Registriĝu nun.
|
sign_up_now = Ĉu bezonas konton? Registriĝu nun.
|
||||||
forgot_password_title = Forgesis pasvorton
|
forgot_password_title = Forgesis pasvorton
|
||||||
social_register_helper_msg = Ĉu vi jam havas konton? Alligu ĝin nun!
|
social_register_helper_msg = Ĉu vi jam havas konton? Alligu ĝin nun!
|
||||||
create_new_account = Registri konton
|
create_new_account = Registri konton
|
||||||
disable_register_prompt = Registrado estas malŝaltita. Bonvolu sciigi vian retejestron.
|
disable_register_prompt = Registrado estas malaktivigita. Bonvolu sciigi vian retejestron.
|
||||||
register_helper_msg = Ĉu vi jam havas konton? Salutu nun!
|
register_helper_msg = Ĉu vi jam havas konton? Salutu nun!
|
||||||
manual_activation_only = Kunparolu vian retejestron por finpretigi vian konton.
|
manual_activation_only = Kunparolu vian retejestron por finpretigi vian konton.
|
||||||
authorization_failed_desc = La aprobo malsukcesis ĉar ni rimarkis malvalidan peton. Bonvolu sciigi la prizorganton de la programo kiun vi provis aprobi.
|
authorization_failed_desc = La aprobo malsukcesis ĉar ni rimarkis malvalidan peton. Bonvolu sciigi la prizorganton de la programo kiun vi provis aprobi.
|
||||||
oauth_signin_tab = LIgi al jama konto
|
oauth_signin_tab = Ligi al jama konto
|
||||||
invalid_password = Via pasvorto ne samas tiun uzitan dum kreiĝo de via konto.
|
invalid_password = Via pasvorto ne samas tiun uzitan dum kreiĝo de via konto.
|
||||||
send_reset_mail = Sendi retleteron por rehavigo de konto
|
send_reset_mail = Sendi retleteron de rehavigo
|
||||||
oauth_signin_title = Salutu por aprobi kontligiĝon
|
oauth_signin_title = Salutu por aprobi kontligiĝon
|
||||||
reset_password_helper = Rehavigi konton
|
reset_password_helper = Rehavigi konton
|
||||||
tab_openid = OpenID
|
tab_openid = OpenID
|
||||||
|
@ -382,7 +403,7 @@ login_userpass = Saluti
|
||||||
password_too_short = Pasvortoj devas longi minimume %d signojn.
|
password_too_short = Pasvortoj devas longi minimume %d signojn.
|
||||||
resend_mail = Klaki ĉi tien por resendi vian konfirmleteron
|
resend_mail = Klaki ĉi tien por resendi vian konfirmleteron
|
||||||
change_unconfirmed_email_error = Ne povis ŝanĝi la retpoŝtadreson: %v
|
change_unconfirmed_email_error = Ne povis ŝanĝi la retpoŝtadreson: %v
|
||||||
authorize_application_description = Se vi permesus aliron, ĝi povos aliri kaj redakti ĉiujn viajn kontinformojn, inkluzivante privatajn deponejojn kaj organizaĵojn.
|
authorize_application_description = Se vi permesus aliron, ĝi povos aliri kaj redakti ĉiujn viajn kontinformojn, inkluzive privatajn deponejojn kaj organizaĵojn.
|
||||||
allow_password_change = Postuli novan pasvorton de la uzanto (rekomendita)
|
allow_password_change = Postuli novan pasvorton de la uzanto (rekomendita)
|
||||||
oauth.signin.error.access_denied = La aprobpeto malakceptiĝis.
|
oauth.signin.error.access_denied = La aprobpeto malakceptiĝis.
|
||||||
authorize_title = Aprobi aliron de via konto al «%s»?
|
authorize_title = Aprobi aliron de via konto al «%s»?
|
||||||
|
@ -394,15 +415,15 @@ disable_forgot_password_mail = Rehavigo de konto estas malsaltita ĉar neniu ret
|
||||||
last_admin = Vi ne povas forigi la lastan administranton. Nepras havi almenaŭ unu administranton.
|
last_admin = Vi ne povas forigi la lastan administranton. Nepras havi almenaŭ unu administranton.
|
||||||
reset_password_wrong_user = Vi salutis kiel %s, sed la kontrehaviga ligilo estas celata al %s
|
reset_password_wrong_user = Vi salutis kiel %s, sed la kontrehaviga ligilo estas celata al %s
|
||||||
openid_connect_title = Konekti jaman konton
|
openid_connect_title = Konekti jaman konton
|
||||||
confirmation_mail_sent_prompt = Sendis novan konfirmleteron al <b>%s</b>. Bonvolu kontroli vian retleterkeston antaŭ la venonta %s. Se la retpoŝtadreso malĝustas, vi povus saluti kaj peti sendon de plia konfirmletero al alian adreson.
|
confirmation_mail_sent_prompt = Sendis konfirmleteron al <b>%s</b>. Por fini la reĝistriĝon, bonvolu kontroli vian retleterkeston kaj sekvi la provizotan ligilon antaŭ la venonta %s. Se la retletero malĝustas, vi povas saluti kaj peti ke alian konfirmleteron estas sendota al malsama retpoŝtadreso.
|
||||||
password_pwned = La pasvorton kiun vi elektis listiĝas ĉe <a target="_blank" rel="noopener noreferrer" href="%s">listo de ŝtelitaj pasvortoj</a> kiu publikiĝis pro datumŝtelo. Bonvolu reprovi kun alia pasvorto, kaj konsideru anstataŭigon de ĉi tiu pasvorto ĉe aliaj kontoj.
|
password_pwned = La pasvorton kiun vi elektis listiĝas ĉe <a target="_blank" rel="noopener noreferrer" href="%s">listo de ŝtelitaj pasvortoj</a> kiu publikiĝis pro datumŝtelo. Bonvolu reprovi kun alia pasvorto, kaj konsideru anstataŭigon de ĉi tiu pasvorto ĉe aliaj kontoj.
|
||||||
authorize_application_created_by = Ĉi tiun programon kreis %s.
|
authorize_application_created_by = Ĉi tiun programon kreis %s.
|
||||||
prohibit_login = Salutado malpermesita
|
prohibit_login = La konto estas suspendita
|
||||||
openid_register_title = Krei novan konton
|
openid_register_title = Krei novan konton
|
||||||
email_domain_blacklisted = Vi ne povas registriĝi per via retpoŝtadreso.
|
email_domain_blacklisted = Vi ne povas registriĝi per via retpoŝtadreso.
|
||||||
verify = Konfirmi
|
verify = Konfirmi
|
||||||
oauth_signup_submit = Finfari konton
|
oauth_signup_submit = Finfari konton
|
||||||
prohibit_login_desc = Salutado per via konto estas malpermesita, bonvolu kunparoli vian retejestron.
|
prohibit_login_desc = Via konto estas suspendita kaj ne povas interagi kun la instanco. Bonvolu kontakti vian retejestron por regajni aliron.
|
||||||
openid_connect_desc = La elektita OpenID URI estas nekonata. Ligu ĝin al nova konto ĉi tie.
|
openid_connect_desc = La elektita OpenID URI estas nekonata. Ligu ĝin al nova konto ĉi tie.
|
||||||
oauth.signin.error = Eraris traktante aprobpeton. Se plu eraros, bonvolu kunparoli la retejestron.
|
oauth.signin.error = Eraris traktante aprobpeton. Se plu eraros, bonvolu kunparoli la retejestron.
|
||||||
invalid_code = Via konfirmkodo malvalidas aŭ eksdatiĝis.
|
invalid_code = Via konfirmkodo malvalidas aŭ eksdatiĝis.
|
||||||
|
@ -412,7 +433,7 @@ email_not_associate = Tiu retpoŝtadreso estas ligita al neniu konto.
|
||||||
openid_signin_desc = Enmetu vian OpenID URI. Ekzemple: sofia.openid.example.org aŭ https://openid.example.org/sofia.
|
openid_signin_desc = Enmetu vian OpenID URI. Ekzemple: sofia.openid.example.org aŭ https://openid.example.org/sofia.
|
||||||
disable_forgot_password_mail_admin = Rehavigo de konto sole uzeblas se retpoŝto estas agordita. Bonvolu agordi retpoŝton por ŝalti kontrehavigon.
|
disable_forgot_password_mail_admin = Rehavigo de konto sole uzeblas se retpoŝto estas agordita. Bonvolu agordi retpoŝton por ŝalti kontrehavigon.
|
||||||
change_unconfirmed_email = Se vi donis la malĝustan retpoŝtadreson dum registriĝo, vi povas ŝanĝi ĝin sube, kaj konfirmletero sendiĝus al tiu anstataŭe.
|
change_unconfirmed_email = Se vi donis la malĝustan retpoŝtadreson dum registriĝo, vi povas ŝanĝi ĝin sube, kaj konfirmletero sendiĝus al tiu anstataŭe.
|
||||||
reset_password_mail_sent_prompt = Sendis novan konfirmleteron al <b>%s</b>. Bonvolu kontroli vian retleterkeston antaŭ la venonta %s, por daŭrigi rehavigon de konto.
|
reset_password_mail_sent_prompt = Sendis konfirmleteron al <b>%s</b>. Por fini la rehavigon de konto, bonvolu kontroli vian retleterkeston kaj sekvi la provizotan ligilon antaŭ la venonta %s.
|
||||||
openid_register_desc = La elektita OpenID URI estas nekonata. Ligi ĝin al nova konto ĉi tie.
|
openid_register_desc = La elektita OpenID URI estas nekonata. Ligi ĝin al nova konto ĉi tie.
|
||||||
reset_password = Rehavigo de konto
|
reset_password = Rehavigo de konto
|
||||||
sspi_auth_failed = SSPI aŭtentikigo malsukcesis
|
sspi_auth_failed = SSPI aŭtentikigo malsukcesis
|
||||||
|
@ -424,6 +445,16 @@ change_unconfirmed_email_summary = Ŝanĝi al retpoŝtadreson al kiu la aktiviga
|
||||||
invalid_code_forgot_password = Via konfirmkodo malvalidas aŭ jam eksdatiĝis. Klaku <a href="%s">ĉi tien</a> por komenci novan saluton.
|
invalid_code_forgot_password = Via konfirmkodo malvalidas aŭ jam eksdatiĝis. Klaku <a href="%s">ĉi tien</a> por komenci novan saluton.
|
||||||
authorize_redirect_notice = Vi alidirektiĝos al %s se vi aprobus ĉi tiun programon.
|
authorize_redirect_notice = Vi alidirektiĝos al %s se vi aprobus ĉi tiun programon.
|
||||||
active_your_account = Aktivigi vian konton
|
active_your_account = Aktivigi vian konton
|
||||||
|
unauthorized_credentials = Viaj salutiloj malĝustas aŭ eksdatiĝis. Reprovu vian komandon aŭ vidu %s por pli da informoj
|
||||||
|
scratch_code = Sukuranta kodo
|
||||||
|
use_scratch_code = Uzi sukurantan kodon
|
||||||
|
twofa_scratch_used = Vi uzis vian sukurantan kodon. Vi redirektiĝis al la agorda retpaĝo por forigi la duoblan aŭtentikigon el via aparato aŭ generi novan sukurantan kodon.
|
||||||
|
twofa_passcode_incorrect = Via paskodo malĝustas. Se vi mislokis vian aparaton, uzu vian sukurantan kodo por saluti.
|
||||||
|
twofa_scratch_token_incorrect = Via sukuranta kodo malĝustas.
|
||||||
|
hint_login = Ĉu vi jam havas konton? <a href="%s">Salutu nun!</a>
|
||||||
|
hint_register = Ĉu vi bezonas konton? <a href="%s">Reĝistriĝi nun.</a>
|
||||||
|
sign_up_button = Reĝistriĝi nun.
|
||||||
|
sign_in_openid = Daŭrigi kun OpenID
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
activate_account.text_1 = Saluton <b>%[1]s</b>, dankon pro via registriĝo ĉe %[2]s!
|
activate_account.text_1 = Saluton <b>%[1]s</b>, dankon pro via registriĝo ĉe %[2]s!
|
||||||
|
@ -437,7 +468,7 @@ link_not_working_do_paste = ĉu ne funkcias? Provu kopii kaj alglui al via retfo
|
||||||
repo.transfer.body = Akceptu per vizito al %s, malakceptu per malatento.
|
repo.transfer.body = Akceptu per vizito al %s, malakceptu per malatento.
|
||||||
team_invite.text_3 = Noto: Ĉi tiu invito estas alcelita al %[1]s. Se vi ne atendis tiun ĉi invito, vi povus simple malatenti tiun ĉi retletero.
|
team_invite.text_3 = Noto: Ĉi tiu invito estas alcelita al %[1]s. Se vi ne atendis tiun ĉi invito, vi povus simple malatenti tiun ĉi retletero.
|
||||||
repo.collaborator.added.subject = %s aldonis vin al %3
|
repo.collaborator.added.subject = %s aldonis vin al %3
|
||||||
team_invite.subject = %[1]s invitis vin aliĝi la organizaĵon %[2]
|
team_invite.subject = %[1]s invitis vin aliĝi la organizaĵon %[2]s
|
||||||
reset_password.text = Bonvolu klaki la sekvontan ligilon por rehavigi vian konton ĝis <b>%</b>:
|
reset_password.text = Bonvolu klaki la sekvontan ligilon por rehavigi vian konton ĝis <b>%</b>:
|
||||||
issue.action.reopen = <b>@%[1]s</b> remalfermis #%[2]d.
|
issue.action.reopen = <b>@%[1]s</b> remalfermis #%[2]d.
|
||||||
issue.action.approve = <b>@%[1]s</b> aprobis tiun ĉi tirpeton.
|
issue.action.approve = <b>@%[1]s</b> aprobis tiun ĉi tirpeton.
|
||||||
|
@ -459,7 +490,7 @@ admin.new_user.subject = Nova uzanto %s ĵus registriĝis
|
||||||
register_notify.text_3 = Se iu alia kreis ĉi tiun konton anstataŭ vi, bonvolu <a href="%s">ŝanĝi vian pasvorton</a> tuj.
|
register_notify.text_3 = Se iu alia kreis ĉi tiun konton anstataŭ vi, bonvolu <a href="%s">ŝanĝi vian pasvorton</a> tuj.
|
||||||
release.new.subject = %s en %s eldoniĝis
|
release.new.subject = %s en %s eldoniĝis
|
||||||
view_it_on = Vidu ĝin ĉe %s
|
view_it_on = Vidu ĝin ĉe %s
|
||||||
register_notify.text_2 = Vi nun povas saluti per la uzantonomo: %s.
|
register_notify.text_2 = Vi povas saluti per la uzantonomo: %s
|
||||||
team_invite.text_1 = %[1]s invitis vin aliĝi grupon %[2]s en organizaĵo %[3]s.
|
team_invite.text_1 = %[1]s invitis vin aliĝi grupon %[2]s en organizaĵo %[3]s.
|
||||||
reset_password.title = %s, vi petis rehavigon de via konto
|
reset_password.title = %s, vi petis rehavigon de via konto
|
||||||
repo.collaborator.added.text = Vi aldoniĝis kiel kunlaboranto de deponejo:
|
repo.collaborator.added.text = Vi aldoniĝis kiel kunlaboranto de deponejo:
|
||||||
|
@ -475,6 +506,13 @@ issue.action.push_n = <b>@%[1]s</b> puŝis %[3]d enmetojn al %[2]s
|
||||||
activate_account = Bonvolu aktivigi vian konton
|
activate_account = Bonvolu aktivigi vian konton
|
||||||
activate_account.title = %s, bonvolu aktivigi vian konton
|
activate_account.title = %s, bonvolu aktivigi vian konton
|
||||||
activate_account.text_2 = Bonvolu klaki la jenan ligilon por aktivigi vian konton antaŭ <b>%s</b>:
|
activate_account.text_2 = Bonvolu klaki la jenan ligilon por aktivigi vian konton antaŭ <b>%s</b>:
|
||||||
|
primary_mail_change.text_1 = La ĉefa retpoŝtadreso de via konto ĵus ŝanĝiĝis en %[1]s. Tio volas diri ke ĉi tiu retpoŝtadreso ne ricevos plu sciigojn pri via konto.
|
||||||
|
totp_disabled.subject = TOTP ĵus malaktiviĝis
|
||||||
|
password_change.subject = Via pasvorto ŝanĝiĝis
|
||||||
|
password_change.text_1 = La pasvorto de via konto ĵus ŝanĝiĝis.
|
||||||
|
primary_mail_change.subject = Via ĉefa retpoŝtadreso ŝanĝiĝis
|
||||||
|
totp_disabled.text_1 = La tempobazita unufoja pasvorto (TOTP) en via konto ĵus malaktiviĝis.
|
||||||
|
admin.new_user.text = Bonvolu <a href="%s">klaki ĉi tie</a> por konduki ĉi tiun uzanton el la administranta agordilo.
|
||||||
|
|
||||||
[form]
|
[form]
|
||||||
TeamName = Gruponomo
|
TeamName = Gruponomo
|
||||||
|
@ -559,7 +597,7 @@ yes = Jes
|
||||||
[settings]
|
[settings]
|
||||||
applications = Programoj
|
applications = Programoj
|
||||||
password = Pasvorto
|
password = Pasvorto
|
||||||
twofa_disabled = Duobla aŭtentikigo malŝaltita.
|
twofa_disabled = Duobla aŭtentikigo malaktivigita.
|
||||||
appearance = Aspekto
|
appearance = Aspekto
|
||||||
repos = Deponejoj
|
repos = Deponejoj
|
||||||
delete = Forigi konton
|
delete = Forigi konton
|
||||||
|
@ -574,11 +612,11 @@ account_link = Ligitaj kontoj
|
||||||
organization = Organizaĵoj
|
organization = Organizaĵoj
|
||||||
public_profile = Publika profilo
|
public_profile = Publika profilo
|
||||||
openid_desc = OpenID povigas vin utiligi foran servilon por aŭtentikigo.
|
openid_desc = OpenID povigas vin utiligi foran servilon por aŭtentikigo.
|
||||||
twofa_disable_note = Vi povas malŝalti duoblan aŭtentikigon, laŭbezone.
|
twofa_disable_note = Vi povas malaktivigi duoblan aŭtentikigon, laŭbezone.
|
||||||
security = Sekureco
|
security = Sekureco
|
||||||
account = Konto
|
account = Konto
|
||||||
ssh_gpg_keys = SSH / GPG-ŝlosiloj
|
ssh_gpg_keys = SSH / GPG-ŝlosiloj
|
||||||
twofa_disable = Malŝalti duoblan aŭtentikigon
|
twofa_disable = Malaktivigi duoblan aŭtentikigon
|
||||||
twofa_enroll = Ŝalti duoblan aŭtentikigon
|
twofa_enroll = Ŝalti duoblan aŭtentikigon
|
||||||
orgs = Mastrumi organizaĵojn
|
orgs = Mastrumi organizaĵojn
|
||||||
blocked_users = Blokitaj uzantoj
|
blocked_users = Blokitaj uzantoj
|
||||||
|
@ -647,7 +685,7 @@ update_user_avatar_success = Profilbildo de uzanto ĝisdatigita.
|
||||||
manage_oauth2_applications = Mastrumi OAuth2-programojn
|
manage_oauth2_applications = Mastrumi OAuth2-programojn
|
||||||
activations_pending = Atendas konfirmiĝon
|
activations_pending = Atendas konfirmiĝon
|
||||||
primary = Ĉefa
|
primary = Ĉefa
|
||||||
ssh_disabled = SSH malŝaltita
|
ssh_disabled = SSH malaktivigita
|
||||||
update_avatar_success = Via profilbildo konserviĝis.
|
update_avatar_success = Via profilbildo konserviĝis.
|
||||||
keep_email_private = Kaŝi retpoŝtadreson
|
keep_email_private = Kaŝi retpoŝtadreson
|
||||||
manage_openid = Mastrumi OpenID-adresojn
|
manage_openid = Mastrumi OpenID-adresojn
|
||||||
|
@ -813,4 +851,30 @@ npm.details.tag = Etikedo
|
||||||
|
|
||||||
|
|
||||||
[search]
|
[search]
|
||||||
search = Serĉi...
|
search = Serĉi...
|
||||||
|
regexp = RegEsp
|
||||||
|
milestone_kind = Serĉi celojn...
|
||||||
|
code_search_by_git_grep = Nunaj rezultoj de kodoserĉo estas provizitaj de "git grep". Eble estas plibonaj rezultoj se la retejestro aktivigas la indeksilon de kodo.
|
||||||
|
code_search_unavailable = Kodoserĉo ne haveblas nune. Bonvolu kontakti la retejestron.
|
||||||
|
package_kind = Serĉi pakojn...
|
||||||
|
type_tooltip = Serĉotipo
|
||||||
|
user_kind = Serĉi uzantojn...
|
||||||
|
fuzzy_tooltip = Inkluzivas rezultojn proksime kongruantajn kun la serĉoterminoj
|
||||||
|
repo_kind = Serĉi deponejojn...
|
||||||
|
org_kind = Serĉi organizaĵojn...
|
||||||
|
code_kind = Serĉi kodon...
|
||||||
|
project_kind = Serĉi projektojn...
|
||||||
|
team_kind = Serĉi teamojn...
|
||||||
|
keyword_search_unavailable = Serĉo per ŝlosilvortoj ne haveblas nune. Bonvolu kontakti la retejestron.
|
||||||
|
union = Ŝlosilvortoj
|
||||||
|
union_tooltip = Inkluzivas rezultojn kongruantajn kun la ajnaj blankaspacitaj ŝlosilvortoj
|
||||||
|
commit_kind = Serĉi enmetojn...
|
||||||
|
no_results = Ne trovis kongruantajn rezultojn.
|
||||||
|
exact = Ĝusta
|
||||||
|
exact_tooltip = Inkluzivas nur rezultojn kongruantajn kun la ĝustaj serĉoterminoj
|
||||||
|
issue_kind = Serĉi erarojn...
|
||||||
|
regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo
|
||||||
|
fuzzy = Svaga
|
||||||
|
branch_kind = Serĉi disbranĉigojn...
|
||||||
|
runner_kind = Serĉi rulantojn...
|
||||||
|
pull_kind = Serĉi tirpetojn...
|
|
@ -474,6 +474,7 @@ hint_register = ¿Necesitas una cuenta? <a href="%s">Regístrate ahora.</a>
|
||||||
back_to_sign_in = Volver a Iniciar sesión
|
back_to_sign_in = Volver a Iniciar sesión
|
||||||
sign_in_openid = Proceder con OpenID
|
sign_in_openid = Proceder con OpenID
|
||||||
remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas.
|
remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas.
|
||||||
|
unauthorized_credentials = Las credenciales son incorrectas o han expirado. Reintenta el comando o visita %s para más información
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Ver en %s
|
view_it_on=Ver en %s
|
||||||
|
@ -713,6 +714,7 @@ following.title.one = Siguiendo
|
||||||
following.title.few = Siguiendo
|
following.title.few = Siguiendo
|
||||||
followers.title.one = Seguidor
|
followers.title.one = Seguidor
|
||||||
followers.title.few = Seguidores
|
followers.title.few = Seguidores
|
||||||
|
public_activity.visibility_hint.self_private_profile = Tu actividad solamente es visible para ti y los administradores de la instancia porque tu perfil es privado. <a href="%s">Configure</a>.
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
profile=Perfil
|
profile=Perfil
|
||||||
|
@ -1300,6 +1302,7 @@ view_git_blame=Ver Git blame
|
||||||
video_not_supported_in_browser=Su navegador no soporta el tag "video" de HTML5.
|
video_not_supported_in_browser=Su navegador no soporta el tag "video" de HTML5.
|
||||||
audio_not_supported_in_browser=Su navegador no soporta el tag "audio" de HTML5.
|
audio_not_supported_in_browser=Su navegador no soporta el tag "audio" de HTML5.
|
||||||
stored_lfs=Almacenados con Git LFS
|
stored_lfs=Almacenados con Git LFS
|
||||||
|
stored_annex=Almacenados con Git Annex
|
||||||
symbolic_link=Enlace simbólico
|
symbolic_link=Enlace simbólico
|
||||||
executable_file=Archivo ejecutable
|
executable_file=Archivo ejecutable
|
||||||
commit_graph=Gráfico de commits
|
commit_graph=Gráfico de commits
|
||||||
|
@ -1323,6 +1326,7 @@ editor.upload_file=Subir archivo
|
||||||
editor.edit_file=Editar archivo
|
editor.edit_file=Editar archivo
|
||||||
editor.preview_changes=Vista previa de los cambios
|
editor.preview_changes=Vista previa de los cambios
|
||||||
editor.cannot_edit_lfs_files=Los archivos LFS no se pueden editar en la interfaz web.
|
editor.cannot_edit_lfs_files=Los archivos LFS no se pueden editar en la interfaz web.
|
||||||
|
editor.cannot_edit_annex_files=Los archivos Annex no se pueden editar en la interfaz web.
|
||||||
editor.cannot_edit_non_text_files=Los archivos binarios no se pueden editar en la interfaz web.
|
editor.cannot_edit_non_text_files=Los archivos binarios no se pueden editar en la interfaz web.
|
||||||
editor.edit_this_file=Editar archivo
|
editor.edit_this_file=Editar archivo
|
||||||
editor.this_file_locked=El archivo está bloqueado
|
editor.this_file_locked=El archivo está bloqueado
|
||||||
|
@ -1598,9 +1602,9 @@ issues.no_content=No se ha proporcionado una descripción.
|
||||||
issues.close=Cerrar incidencia
|
issues.close=Cerrar incidencia
|
||||||
issues.comment_pull_merged_at=commit fusionado %[1]s en %[2]s %[3]s
|
issues.comment_pull_merged_at=commit fusionado %[1]s en %[2]s %[3]s
|
||||||
issues.comment_manually_pull_merged_at=commit manualmente fusionado %[1]s en %[2]s %[3]s
|
issues.comment_manually_pull_merged_at=commit manualmente fusionado %[1]s en %[2]s %[3]s
|
||||||
issues.close_comment_issue=Comentar y cerrar
|
issues.close_comment_issue=Cerrar con comentario
|
||||||
issues.reopen_issue=Reabrir
|
issues.reopen_issue=Reabrir
|
||||||
issues.reopen_comment_issue=Comentar y reabrir
|
issues.reopen_comment_issue=Reabrir con comentario
|
||||||
issues.create_comment=Comentar
|
issues.create_comment=Comentar
|
||||||
issues.closed_at=`cerró esta incidencia <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at=`cerró esta incidencia <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.reopened_at=`reabrió esta incidencia <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at=`reabrió esta incidencia <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
|
@ -1981,7 +1985,7 @@ signing.wont_sign.commitssigned=La fusión no se firmará ya que todos los commi
|
||||||
signing.wont_sign.approved=La fusión no se firmará ya que el PR no está aprobado.
|
signing.wont_sign.approved=La fusión no se firmará ya que el PR no está aprobado.
|
||||||
signing.wont_sign.not_signed_in=No ha iniciado sesión.
|
signing.wont_sign.not_signed_in=No ha iniciado sesión.
|
||||||
|
|
||||||
ext_wiki=Acceso a wiki externo
|
ext_wiki=Wiki externa
|
||||||
ext_wiki.desc=Enlace a una wiki externa.
|
ext_wiki.desc=Enlace a una wiki externa.
|
||||||
|
|
||||||
wiki=Wiki
|
wiki=Wiki
|
||||||
|
@ -2141,7 +2145,7 @@ settings.use_external_wiki=Usar wiki externa
|
||||||
settings.external_wiki_url=URL del wiki externo
|
settings.external_wiki_url=URL del wiki externo
|
||||||
settings.external_wiki_url_error=La URL de la Wiki externa no es una URL válida.
|
settings.external_wiki_url_error=La URL de la Wiki externa no es una URL válida.
|
||||||
settings.external_wiki_url_desc=Los visitantes serán redirigidos a la URL de la Wiki externa al hacer click en la pestaña de la Wiki.
|
settings.external_wiki_url_desc=Los visitantes serán redirigidos a la URL de la Wiki externa al hacer click en la pestaña de la Wiki.
|
||||||
settings.issues_desc=Activar gestor de incidencias para este repositorio
|
settings.issues_desc=Habilitar gestor de incidencias
|
||||||
settings.use_internal_issue_tracker=Usar gestor de incidencias integrado
|
settings.use_internal_issue_tracker=Usar gestor de incidencias integrado
|
||||||
settings.use_external_issue_tracker=Usar gestor de incidencias externo
|
settings.use_external_issue_tracker=Usar gestor de incidencias externo
|
||||||
settings.external_tracker_url=URL del gestor de incidencias externo
|
settings.external_tracker_url=URL del gestor de incidencias externo
|
||||||
|
@ -2431,7 +2435,7 @@ settings.require_signed_commits_desc=Rechazar push en esta rama si los commits n
|
||||||
settings.protect_branch_name_pattern=Patrón de nombre de ramas protegidas
|
settings.protect_branch_name_pattern=Patrón de nombre de ramas protegidas
|
||||||
settings.protect_patterns=Patrones
|
settings.protect_patterns=Patrones
|
||||||
settings.protect_protected_file_patterns=Patrones de archivos protegidos (separados con punto y coma ';')
|
settings.protect_protected_file_patterns=Patrones de archivos protegidos (separados con punto y coma ';')
|
||||||
settings.protect_protected_file_patterns_desc=No está permitido cambiar archivos directamente incluso si el usuario tiene permiso para agregar, editar o borrar archivos en esta rama. Múltiples patrones pueden separarse usando punto y coma (';'). Refvisa la documentación de <a href='%s'>github.com/gobwas/glob</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_protected_file_patterns_desc=No está permitido cambiar archivos directamente incluso si el usuario tiene permiso para agregar, editar o borrar archivos en esta rama. Múltiples patrones pueden separarse usando punto y coma (';'). Refvisa la documentación de <a href='%s'>%s</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.protect_unprotected_file_patterns=Patrones de archivos sin protección (separados con punto y coma ";")
|
settings.protect_unprotected_file_patterns=Patrones de archivos sin protección (separados con punto y coma ";")
|
||||||
settings.protect_unprotected_file_patterns_desc=Los archivos sin protección se pueden cambiar directamente si el usuario tiene acceso de escritura, evitando la restricción push. Múltiples patrones pueden separarse usando punto y coma (';'). Vea la documentación de <a href='%[1]s'>%[2]s</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_unprotected_file_patterns_desc=Los archivos sin protección se pueden cambiar directamente si el usuario tiene acceso de escritura, evitando la restricción push. Múltiples patrones pueden separarse usando punto y coma (';'). Vea la documentación de <a href='%[1]s'>%[2]s</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.add_protected_branch=Activar protección
|
settings.add_protected_branch=Activar protección
|
||||||
|
@ -2737,7 +2741,7 @@ pulls.title_desc_one = quiere fusionar %[1]d commit de <code>%[2]s</code> en <co
|
||||||
pulls.ready_for_review = Listo para revisar?
|
pulls.ready_for_review = Listo para revisar?
|
||||||
activity.navbar.contributors = Contribuidores
|
activity.navbar.contributors = Contribuidores
|
||||||
pulls.cmd_instruction_hint = Ver instrucciones para la línea de comandos
|
pulls.cmd_instruction_hint = Ver instrucciones para la línea de comandos
|
||||||
settings.units.units = Unidades del repositorio
|
settings.units.units = Unidades
|
||||||
settings.units.overview = Vista general
|
settings.units.overview = Vista general
|
||||||
pulls.status_checks_hide_all = Ocultar todas las verificaciones
|
pulls.status_checks_hide_all = Ocultar todas las verificaciones
|
||||||
settings.federation_not_enabled = La federación no está habilitada en tu instancia.
|
settings.federation_not_enabled = La federación no está habilitada en tu instancia.
|
||||||
|
@ -2770,6 +2774,9 @@ milestones.filter_sort.name = Nombre
|
||||||
settings.federation_settings = Ajustes de federación
|
settings.federation_settings = Ajustes de federación
|
||||||
settings.mirror_settings.push_mirror.none_ssh = Ninguna
|
settings.mirror_settings.push_mirror.none_ssh = Ninguna
|
||||||
settings.mirror_settings.push_mirror.copy_public_key = Copiar clave pública
|
settings.mirror_settings.push_mirror.copy_public_key = Copiar clave pública
|
||||||
|
issues.new.assign_to_me = Asignar a mi
|
||||||
|
issues.all_title = Todos
|
||||||
|
settings.wiki_globally_editable = Permitir a cualquiera editar la wiki
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
|
|
||||||
|
@ -3770,6 +3777,7 @@ variables.id_not_exist = Variable con id %d no existe.
|
||||||
type-1.display_name=Proyecto individual
|
type-1.display_name=Proyecto individual
|
||||||
type-2.display_name=Proyecto repositorio
|
type-2.display_name=Proyecto repositorio
|
||||||
type-3.display_name=Proyecto de organización
|
type-3.display_name=Proyecto de organización
|
||||||
|
deleted.display_name = Proyecto borrado
|
||||||
|
|
||||||
[git.filemode]
|
[git.filemode]
|
||||||
changed_filemode=%[1]s → %[2]s
|
changed_filemode=%[1]s → %[2]s
|
||||||
|
@ -3807,4 +3815,8 @@ exact = Exacto
|
||||||
exact_tooltip = Incluir sólo los resultados que corresponden al término de búsqueda exacto
|
exact_tooltip = Incluir sólo los resultados que corresponden al término de búsqueda exacto
|
||||||
issue_kind = Buscar incidencias…
|
issue_kind = Buscar incidencias…
|
||||||
fuzzy = Difusa
|
fuzzy = Difusa
|
||||||
runner_kind = Buscar ejecutores…
|
runner_kind = Buscar ejecutores…
|
||||||
|
|
||||||
|
[markup]
|
||||||
|
filepreview.lines = Líneas %[1]d a %[2]d en %[3]s
|
||||||
|
filepreview.line = Línea %[1]d en %[2]s
|
|
@ -15,9 +15,9 @@ page=صفحه
|
||||||
template=قالب
|
template=قالب
|
||||||
language=زبان
|
language=زبان
|
||||||
notifications=اعلانها
|
notifications=اعلانها
|
||||||
active_stopwatch=فعال کردن ثبت زمان
|
active_stopwatch=فعال کردن ردیاب زمان
|
||||||
create_new=ایجاد…
|
create_new=ایجاد…
|
||||||
user_profile_and_more=پروفایل و تنظیمات…
|
user_profile_and_more=نمایه و تنظیمات…
|
||||||
signed_in_as=ورود به عنوان
|
signed_in_as=ورود به عنوان
|
||||||
toc=فهرست محتویات
|
toc=فهرست محتویات
|
||||||
licenses=گواهینامه ها
|
licenses=گواهینامه ها
|
||||||
|
@ -26,11 +26,11 @@ return_to_forgejo=بازگشت به Forgejo
|
||||||
username=نام کاربری
|
username=نام کاربری
|
||||||
email=نشانی رایانامه
|
email=نشانی رایانامه
|
||||||
password=رمز عبور
|
password=رمز عبور
|
||||||
access_token=ژتون دسترسی
|
access_token=توکن دسترسی
|
||||||
re_type=تأیید گذرواژه
|
re_type=تأیید گذرواژه
|
||||||
captcha=کپچا
|
captcha=کپچا
|
||||||
twofa=احراز هویت دو مرحلهای
|
twofa=احراز هویت دو مرحلهای
|
||||||
twofa_scratch=کد احراز هویت
|
twofa_scratch=کد احراز هویت دو محله ای
|
||||||
passcode=رمز عبور
|
passcode=رمز عبور
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ mirror=قرینه
|
||||||
new_repo=مخزن جدید
|
new_repo=مخزن جدید
|
||||||
new_migrate=انتقال جدید
|
new_migrate=انتقال جدید
|
||||||
new_mirror=آینه جدید
|
new_mirror=آینه جدید
|
||||||
new_fork=انشعاب مخزن جدید
|
new_fork=انشعاب جدید از مخزن
|
||||||
new_org=سازمان جدید
|
new_org=سازمان جدید
|
||||||
new_project=پروژه جدید
|
new_project=پروژه جدید
|
||||||
manage_org=مدیریت سازمانها
|
manage_org=مدیریت سازمانها
|
||||||
|
@ -118,7 +118,21 @@ unpin = حذف سنجاق
|
||||||
locked = قفل شده
|
locked = قفل شده
|
||||||
copy_hash = رونوشت هش
|
copy_hash = رونوشت هش
|
||||||
unknown = نامشخص
|
unknown = نامشخص
|
||||||
copy_type_unsupported = این نوع از فایل نمیتواند رونوشت شود.
|
copy_type_unsupported = این نوع از فایل نمیتواند رونوشت شود
|
||||||
|
webauthn_insert_key = کلید امنیتی خود را وارد کنید
|
||||||
|
webauthn_sign_in = دکمۀ روی کلید امنیتی را فشار دهید. اگر کلید امنیتی شما دکمهای ندارد، آن را دوباره وارد کنید.
|
||||||
|
webauthn_use_twofa = از یک کد دومرحلهای از تلفنتان استفاده کنید
|
||||||
|
webauthn_error = کلید امنیتی شما نتوانست خوانده شود.
|
||||||
|
more_items = موارد بیشتر
|
||||||
|
webauthn_error_duplicated = کلید امنیتی برای این درخواست مجاز نیست. لطفاً مطمئن شوید که این کلید در حال حاضر ثبت نشده است.
|
||||||
|
webauthn_error_timeout = مهلت زمانی قبل از اینکه کلید شما خوانده شود تمام شد. لطفاً این صفحه را تازهسازی کرده و مجدد تلاش کنید.
|
||||||
|
new_org.link = سازمان جدید
|
||||||
|
new_org.title = سازمان جدید
|
||||||
|
new_migrate.link = مهاجرت جدید
|
||||||
|
webauthn_error_empty = شما باید یک نام برای این کلید انتخاب کنید.
|
||||||
|
new_repo.title = مخزن جدید
|
||||||
|
new_migrate.title = مهاجرت جدید
|
||||||
|
new_repo.link = مخزن جدید
|
||||||
|
|
||||||
[aria]
|
[aria]
|
||||||
|
|
||||||
|
@ -204,7 +218,7 @@ offline_mode.description=غیر فعال کردن شبکه های شخص ثال
|
||||||
disable_gravatar=غیر فعال کردن Gravatar
|
disable_gravatar=غیر فعال کردن Gravatar
|
||||||
disable_gravatar.description=غیر فعال کردن کلیک و منابع آواتار شخص ثالث. مگر در مواردی که کاربر محلی بارگزاری آواتار پیش فرض استفاده خواهد شد.
|
disable_gravatar.description=غیر فعال کردن کلیک و منابع آواتار شخص ثالث. مگر در مواردی که کاربر محلی بارگزاری آواتار پیش فرض استفاده خواهد شد.
|
||||||
federated_avatar_lookup=فعال سازی آواتار مشترک
|
federated_avatar_lookup=فعال سازی آواتار مشترک
|
||||||
federated_avatar_lookup.description=مراجعه مشترک آواتار با استفاده از Libravatar را قادر می سازد.
|
federated_avatar_lookup.description=پیدا کردن آواتار با استفاده از Libravatar.
|
||||||
disable_registration=غیرفعالکردن خود ثبت نامی
|
disable_registration=غیرفعالکردن خود ثبت نامی
|
||||||
disable_registration.description=غیرفعال کردن ثبت نام کاربر. تنها مدیر ها قادر خواهند بود حساب کاربری جدید اضافه کنند.
|
disable_registration.description=غیرفعال کردن ثبت نام کاربر. تنها مدیر ها قادر خواهند بود حساب کاربری جدید اضافه کنند.
|
||||||
allow_only_external_registration.description=اجازه ثبت نام فقط از طریق خدمات خارجی
|
allow_only_external_registration.description=اجازه ثبت نام فقط از طریق خدمات خارجی
|
||||||
|
@ -594,7 +608,7 @@ ssh_helper=<strong>آیا نمی دانید چگونه؟</strong>راهنمای
|
||||||
gpg_helper=<strong>به کمک نیاز دارید؟</strong> نگاهی به در GitHub را راهنمای <a href="%s">مورد GPG</a> است.
|
gpg_helper=<strong>به کمک نیاز دارید؟</strong> نگاهی به در GitHub را راهنمای <a href="%s">مورد GPG</a> است.
|
||||||
add_new_key=اضافه کردن کلید SSH
|
add_new_key=اضافه کردن کلید SSH
|
||||||
add_new_gpg_key=اضافه کردن کلید GPG
|
add_new_gpg_key=اضافه کردن کلید GPG
|
||||||
key_content_ssh_placeholder=معمولا با 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', یا 'sk-ssh-ed25519@openssh.com' شروع میشود.
|
key_content_ssh_placeholder=معمولا با 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', یا 'sk-ssh-ed25519@openssh.com' شروع میشود.
|
||||||
key_content_gpg_placeholder=با عبارت -----BEGIN PGP PUBLIC KEY BLOCK----- شروع میشود
|
key_content_gpg_placeholder=با عبارت -----BEGIN PGP PUBLIC KEY BLOCK----- شروع میشود
|
||||||
add_new_principal=یک کلید اصلی اضافه کنید
|
add_new_principal=یک کلید اصلی اضافه کنید
|
||||||
ssh_key_been_used=این کلید SSH پیش از این به سرور افزوده شده است.
|
ssh_key_been_used=این کلید SSH پیش از این به سرور افزوده شده است.
|
||||||
|
@ -667,7 +681,7 @@ manage_oauth2_applications=مدیریت برنامههای OAuth2
|
||||||
edit_oauth2_application=ویرایش برنامه OAuth2
|
edit_oauth2_application=ویرایش برنامه OAuth2
|
||||||
oauth2_applications_desc=برنامههای OAuth2 احراز هویت برنامه های شخص ثالث را با بستری امن میسر میکند.
|
oauth2_applications_desc=برنامههای OAuth2 احراز هویت برنامه های شخص ثالث را با بستری امن میسر میکند.
|
||||||
remove_oauth2_application=حذف برنامه OAuth2
|
remove_oauth2_application=حذف برنامه OAuth2
|
||||||
remove_oauth2_application_desc=حذف برنامه OAuth2 دسترسی تمام برنامه های متصل با آن را از بین میبرد. آیا ادامه میدهید؟
|
remove_oauth2_application_desc=حذف برنامه OAuth2 دسترسی تمام برنامه های متصل با آن را از بین میبرد. آیا ادامه میدهید؟
|
||||||
remove_oauth2_application_success=برنامه حذف شده است.
|
remove_oauth2_application_success=برنامه حذف شده است.
|
||||||
create_oauth2_application=ساختن یک برنامه OAuth2 جدید
|
create_oauth2_application=ساختن یک برنامه OAuth2 جدید
|
||||||
create_oauth2_application_button=ایجاد برنامه
|
create_oauth2_application_button=ایجاد برنامه
|
||||||
|
@ -938,6 +952,7 @@ file_copy_permalink=پرمالینک را کپی کنید
|
||||||
video_not_supported_in_browser=مرورگر شما از تگ video که در HTML5 تعریف شده است، پشتیبانی نمی کند.
|
video_not_supported_in_browser=مرورگر شما از تگ video که در HTML5 تعریف شده است، پشتیبانی نمی کند.
|
||||||
audio_not_supported_in_browser=مرورگر شما از تگ audio که در HTML5 تعریف شده است، پشتیبانی نمی کند.
|
audio_not_supported_in_browser=مرورگر شما از تگ audio که در HTML5 تعریف شده است، پشتیبانی نمی کند.
|
||||||
stored_lfs=ذخیره شده با GIT LFS
|
stored_lfs=ذخیره شده با GIT LFS
|
||||||
|
stored_annex=ذخیره شده با GIT Annex
|
||||||
symbolic_link=پیوند نمادین
|
symbolic_link=پیوند نمادین
|
||||||
commit_graph=نمودار کامیت
|
commit_graph=نمودار کامیت
|
||||||
commit_graph.select=انتخاب برنچها
|
commit_graph.select=انتخاب برنچها
|
||||||
|
@ -955,6 +970,7 @@ editor.upload_file=بارگذاری پرونده
|
||||||
editor.edit_file=ویرایش پرونده
|
editor.edit_file=ویرایش پرونده
|
||||||
editor.preview_changes=پیش نمایش تغییرات
|
editor.preview_changes=پیش نمایش تغییرات
|
||||||
editor.cannot_edit_lfs_files=پرونده های LFS در صحفه وب قابل تغییر نیست.
|
editor.cannot_edit_lfs_files=پرونده های LFS در صحفه وب قابل تغییر نیست.
|
||||||
|
editor.cannot_edit_annex_files=پرونده های Annex در صحفه وب قابل تغییر نیست.
|
||||||
editor.cannot_edit_non_text_files=پروندههای دودویی در صفحه وب قابل تغییر نیست.
|
editor.cannot_edit_non_text_files=پروندههای دودویی در صفحه وب قابل تغییر نیست.
|
||||||
editor.edit_this_file=ویرایش پرونده
|
editor.edit_this_file=ویرایش پرونده
|
||||||
editor.this_file_locked=پرونده قفل شده است
|
editor.this_file_locked=پرونده قفل شده است
|
||||||
|
@ -1440,7 +1456,7 @@ wiki.page=صفحه
|
||||||
wiki.filter_page=صافی صفحه
|
wiki.filter_page=صافی صفحه
|
||||||
wiki.new_page=صفحه
|
wiki.new_page=صفحه
|
||||||
wiki.default_commit_message=نوشتن متنی پیرامون بهروزرسانی این صفحه (اختیاری).
|
wiki.default_commit_message=نوشتن متنی پیرامون بهروزرسانی این صفحه (اختیاری).
|
||||||
wiki.save_page=نوشتن متنی پیرامون بهروزرسانی این صفحه (اختیاری).
|
wiki.save_page=ذخیره صفحه
|
||||||
wiki.last_commit_info=%s این صفحه %s را ویرایش کرده است
|
wiki.last_commit_info=%s این صفحه %s را ویرایش کرده است
|
||||||
wiki.edit_page_button=ویرایش
|
wiki.edit_page_button=ویرایش
|
||||||
wiki.new_page_button=صفحه جدید
|
wiki.new_page_button=صفحه جدید
|
||||||
|
@ -2633,13 +2649,31 @@ runners.task_list.commit=کامیت
|
||||||
runners.status.active=فعال
|
runners.status.active=فعال
|
||||||
|
|
||||||
runs.commit=کامیت
|
runs.commit=کامیت
|
||||||
|
variables.edit = تغییر متغیر
|
||||||
|
variables.deletion.success = متغیر حذف شد.
|
||||||
|
variables.deletion = حذف متغیر
|
||||||
|
variables.creation.success = متغیر "%s" ایجاد شد.
|
||||||
|
variables = متغیرها
|
||||||
|
variables.management = مدیریت متغیرها
|
||||||
|
variables.update.failed = عدم موفقیت در تغییر متغیر
|
||||||
|
variables.update.success = تغییر متغیر با موفقیت انجام شد.
|
||||||
|
variables.creation = افزودن متغیر
|
||||||
|
variables.none = هیچ متغیری هنوز وجود ندارد.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[projects]
|
[projects]
|
||||||
|
type-1.display_name = پروژه ی مستقل
|
||||||
|
type-2.display_name = مخزن پروژه
|
||||||
|
type-3.display_name = سازمان پروژه
|
||||||
|
deleted.display_name = پاک کردن پروژه
|
||||||
|
|
||||||
[git.filemode]
|
[git.filemode]
|
||||||
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
|
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
|
||||||
symbolic_link=پیوند نمادین
|
symbolic_link=پیوند نمادین
|
||||||
|
executable_file = فایل اجرایی
|
||||||
|
normal_file = فایل معمولی
|
||||||
|
changed_filemode = %[1] ها ← %[2] ها
|
||||||
|
directory = پوشه
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1883,7 +1883,7 @@ issues.dependency.no_permission_n = Wala kang pahintulot na basahin ang mga %d d
|
||||||
issues.dependency.removed_dependency = `nagtanggal ng dependency %s`
|
issues.dependency.removed_dependency = `nagtanggal ng dependency %s`
|
||||||
settings.mirror_settings.push_mirror.add = Magdagdag ng salaming pangtulak
|
settings.mirror_settings.push_mirror.add = Magdagdag ng salaming pangtulak
|
||||||
settings.mirror_settings.last_update = Huling nabago
|
settings.mirror_settings.last_update = Huling nabago
|
||||||
settings.units.add_more = Magdagdag ng higit pa...
|
settings.units.add_more = Paganahin ang higit pa
|
||||||
activity.closed_issues_count_n = Mga saradong isyu
|
activity.closed_issues_count_n = Mga saradong isyu
|
||||||
activity.new_issues_count_1 = Bagong isyu
|
activity.new_issues_count_1 = Bagong isyu
|
||||||
settings.branches.add_new_rule = Magdagdag ng bagong patakaran
|
settings.branches.add_new_rule = Magdagdag ng bagong patakaran
|
||||||
|
@ -2008,6 +2008,8 @@ settings.mirror_settings.docs.disabled_push_mirror.info = Na-disable ng iyong ta
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.instructions = I-set up ang iyong proyekto na awtomatikong hilahin ang mga commit, tag at branch mula sa isa pang repositoryo.
|
settings.mirror_settings.docs.disabled_push_mirror.instructions = I-set up ang iyong proyekto na awtomatikong hilahin ang mga commit, tag at branch mula sa isa pang repositoryo.
|
||||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions = I-set up ang iyong proyekto na awtomatikong magtulak ng mga commit, tag at branch sa isa pang repositoryo. Na-disable ng iyong tagapangasiwa ng site ang mga pull mirror.
|
settings.mirror_settings.docs.disabled_pull_mirror.instructions = I-set up ang iyong proyekto na awtomatikong magtulak ng mga commit, tag at branch sa isa pang repositoryo. Na-disable ng iyong tagapangasiwa ng site ang mga pull mirror.
|
||||||
activity.overview = Pangkalahatang Ideya
|
activity.overview = Pangkalahatang Ideya
|
||||||
|
mirror_public_key = Pampublikong susi ng SSH
|
||||||
|
milestones.cancel =
|
||||||
|
|
||||||
[search]
|
[search]
|
||||||
commit_kind = Maghanap ng mga commit...
|
commit_kind = Maghanap ng mga commit...
|
||||||
|
|
|
@ -207,7 +207,7 @@ string.desc=Z - A
|
||||||
|
|
||||||
[error]
|
[error]
|
||||||
occurred=Une erreur s’est produite
|
occurred=Une erreur s’est produite
|
||||||
report_message=Si vous pensez qu'il s'agit d'un bug Forgejo, veuillez consulter notre board <a href="%s" target="_blank">Codeberg</a> ou ouvrir un nouveau ticket si nécessaire.
|
report_message=Si vous pensez qu'il s'agit d'un bug Forgejo, veuillez consulter les tickets de <a href="%s" target="_blank">Codeberg</a> ou ouvrir un nouveau ticket si nécessaire.
|
||||||
missing_csrf=Requête incorrecte : aucun jeton CSRF présent
|
missing_csrf=Requête incorrecte : aucun jeton CSRF présent
|
||||||
invalid_csrf=Requête incorrecte : jeton CSRF invalide
|
invalid_csrf=Requête incorrecte : jeton CSRF invalide
|
||||||
not_found=La cible n'a pu être trouvée.
|
not_found=La cible n'a pu être trouvée.
|
||||||
|
@ -223,7 +223,7 @@ platform_desc=Forgejo est confirmé fonctionner sur des systèmes d'exploitation
|
||||||
lightweight=Léger
|
lightweight=Léger
|
||||||
lightweight_desc=Forgejo utilise peu de ressources. Il peut même tourner sur un Raspberry Pi très bon marché. Économisez l'énergie de vos serveurs !
|
lightweight_desc=Forgejo utilise peu de ressources. Il peut même tourner sur un Raspberry Pi très bon marché. Économisez l'énergie de vos serveurs !
|
||||||
license=Open Source
|
license=Open Source
|
||||||
license_desc=Toutes les sources sont sur <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a> ! Rejoignez-nous et <a target="_blank" rel="noopener noreferrer" href="https ://codeberg.org/forgejo/forgejo">contribuez</a> à rendre ce projet encore meilleur !
|
license_desc=Toutes les sources sont sur <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a> ! Rejoignez-nous et <a target="_blank" rel="noopener noreferrer" href="https ://codeberg.org/forgejo/forgejo">contribuez</a> à rendre ce projet encore meilleur. Ne craignez pas de devenir un·e contributeur·trice !
|
||||||
|
|
||||||
[install]
|
[install]
|
||||||
install=Installation
|
install=Installation
|
||||||
|
@ -478,11 +478,12 @@ sign_up_button = Creation d'un compte.
|
||||||
hint_login = Vous avez déjà un compte ? <a href="%s">Connectez vous maintenant !</a>
|
hint_login = Vous avez déjà un compte ? <a href="%s">Connectez vous maintenant !</a>
|
||||||
back_to_sign_in = Retour à la connexion
|
back_to_sign_in = Retour à la connexion
|
||||||
sign_in_openid = Continuer avec OpenID
|
sign_in_openid = Continuer avec OpenID
|
||||||
|
unauthorized_credentials = Vos identifiants sont invalides ou ont expiré. Réessayez votre commande, ou allez à %s pour plus d'informations
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Voir sur %s
|
view_it_on=Voir sur %s
|
||||||
reply=ou répondez directement à ce courriel
|
reply=ou répondez directement à ce courriel
|
||||||
link_not_working_do_paste=Le lien ne fonctionne pas ? Essayez de le copier-coller dans barre de navigation de votre navigateur.
|
link_not_working_do_paste=Le lien ne fonctionne pas ? Essayez de le copier-coller dans la barre de navigation de votre navigateur.
|
||||||
hi_user_x=Bonjour <b>%s</b>,
|
hi_user_x=Bonjour <b>%s</b>,
|
||||||
|
|
||||||
activate_account=Veuillez activer votre compte
|
activate_account=Veuillez activer votre compte
|
||||||
|
@ -545,19 +546,24 @@ team_invite.text_1=%[1]s vous a invité à rejoindre l’équipe %[2]s dans l’
|
||||||
team_invite.text_2=Veuillez cliquer sur le lien suivant pour rejoindre l'équipe :
|
team_invite.text_2=Veuillez cliquer sur le lien suivant pour rejoindre l'équipe :
|
||||||
team_invite.text_3=Remarque : Cette invitation était destinée à %[1]s. Si vous n’attendiez pas cette invitation, vous pouvez ignorer ce courriel.
|
team_invite.text_3=Remarque : Cette invitation était destinée à %[1]s. Si vous n’attendiez pas cette invitation, vous pouvez ignorer ce courriel.
|
||||||
admin.new_user.user_info = Information à propos de l'utilisateur
|
admin.new_user.user_info = Information à propos de l'utilisateur
|
||||||
admin.new_user.text = Veuillez <a href="%s">clicker ici</a> afin de gérer l'utilisateur depuis la page d'administration.
|
admin.new_user.text = Veuillez <a href="%s">cliquer ici</a> afin de gérer l'utilisateur depuis la page d'administration.
|
||||||
admin.new_user.subject = L'utilisateur %s vient de créer un compte
|
admin.new_user.subject = L'utilisateur %s vient de créer un compte
|
||||||
reset_password.text_1 = Le mot de passe de votre compte vient d'être modifié.
|
reset_password.text_1 = Le mot de passe de votre compte vient d'être modifié.
|
||||||
password_change.subject = Votre mot de passe a été modifié
|
password_change.subject = Votre mot de passe a été modifié
|
||||||
password_change.text_1 = Le mot de passe de votre compte vient d'être modifié.
|
password_change.text_1 = Le mot de passe de votre compte vient d'être modifié.
|
||||||
primary_mail_change.subject = Votre courriel principal a été modifié
|
primary_mail_change.subject = Votre courriel principal a été modifié
|
||||||
primary_mail_change.text_1 = Le courriel principal de votre compte vient d'être modifié en %[1]s.
|
primary_mail_change.text_1 = Le courriel principal de votre compte vient d'être modifié en %[1]s. Cela signifie que cette adresse e-mail ne recevra plus de notifications par e-mail pour votre compte.
|
||||||
totp_disabled.no_2fa = Il n'y a plus de méthodes 2FA configurées ce qui signifie qu'il n'est plus nécessaire d'utiliser 2FA pour se connecter à votre compte.
|
totp_disabled.no_2fa = Il n'y a plus de méthodes 2FA configurées ce qui signifie qu'il n'est plus nécessaire d'utiliser 2FA pour se connecter à votre compte.
|
||||||
totp_disabled.text_1 = Mot de passe à usage unique basé sur le temps (TOTP) vient d'être désactivé pour votre compte.
|
totp_disabled.text_1 = Mot de passe à usage unique basé sur le temps (TOTP) vient d'être désactivé pour votre compte.
|
||||||
removed_security_key.subject = Une clé de sécurité a été supprimée
|
removed_security_key.subject = Une clé de sécurité a été supprimée
|
||||||
totp_disabled.subject = TOTP a été désactivé
|
totp_disabled.subject = TOTP a été désactivé
|
||||||
removed_security_key.no_2fa = Il n'y a plus de méthodes 2FA configurées ce qui signifie qu'il n'est plus nécessaire d'utiliser 2FA pour se connecter à votre compte.
|
removed_security_key.no_2fa = Il n'y a plus de méthodes 2FA configurées ce qui signifie qu'il n'est plus nécessaire d'utiliser 2FA pour se connecter à votre compte.
|
||||||
account_security_caution.text_1 = Si vous êtes à l’origine de cette action, vous pouvez ignorer ce courriel.
|
account_security_caution.text_1 = Si vous êtes à l’origine de cette action, vous pouvez ignorer ce courriel.
|
||||||
|
totp_enrolled.text_1.no_webauthn = Vous venez d'activer TOTP pour votre compte. Cela signifie que pour toutes les prochaines connexions à votre compte, vous devrez utiliser TOTP comme méthode 2FA.
|
||||||
|
totp_enrolled.subject = Vous avez activé TOTP comme méthode 2FA
|
||||||
|
totp_enrolled.text_1.has_webauthn = Vous venez d'activer TOTP pour votre compte. Cela signifie que pour toutes les prochaines connexions à votre compte, vous pouvez utiliser TOTP comme méthode 2FA ou l'une de vos clés de sécurité.
|
||||||
|
removed_security_key.text_1 = La clé de sécurité « %[1]s » vient d'être supprimée de votre compte.
|
||||||
|
account_security_caution.text_2 = S'il ne s'agissait pas de vous, votre compte est compromis. Veuillez contacter les administrateurs du site.
|
||||||
|
|
||||||
[modal]
|
[modal]
|
||||||
yes=Oui
|
yes=Oui
|
||||||
|
@ -714,6 +720,7 @@ following.title.few = Following
|
||||||
followers.title.one = Follower
|
followers.title.one = Follower
|
||||||
followers.title.few = Followers
|
followers.title.few = Followers
|
||||||
following.title.one = Following
|
following.title.one = Following
|
||||||
|
public_activity.visibility_hint.self_private_profile = Votre profil est privé mais votre activité est aussi visible par les administrateurs·trices. <a href="%s">Configure</a>.
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
profile=Profil
|
profile=Profil
|
||||||
|
@ -823,7 +830,7 @@ add_new_email=Ajouter une nouvelle adresse e-mail
|
||||||
add_new_openid=Ajouter une nouvelle URI OpenID
|
add_new_openid=Ajouter une nouvelle URI OpenID
|
||||||
add_email=Ajouter une adresse courriel
|
add_email=Ajouter une adresse courriel
|
||||||
add_openid=Ajouter une URI OpenID
|
add_openid=Ajouter une URI OpenID
|
||||||
add_email_confirmation_sent=Un e-mail de confirmation a été envoyé à "%s". Veuillez vérifier votre boîte de réception dans les %s suivants pour confirmer votre adresse e-mail.
|
add_email_confirmation_sent=Un courriel de confirmation a été envoyé à « %s ». Pour confirmer votre adresse de courriel, veuillez vérifier votre boîte de réception et suivre le lien indiqué dans les prochains %s.
|
||||||
add_email_success=La nouvelle adresse e-mail a été ajoutée.
|
add_email_success=La nouvelle adresse e-mail a été ajoutée.
|
||||||
email_preference_set_success=L'e-mail de préférence a été défini avec succès.
|
email_preference_set_success=L'e-mail de préférence a été défini avec succès.
|
||||||
add_openid_success=La nouvelle adresse OpenID a été ajoutée.
|
add_openid_success=La nouvelle adresse OpenID a été ajoutée.
|
||||||
|
@ -1033,7 +1040,7 @@ user_unblock_success = Cet utilisateur a été débloqué avec succès.
|
||||||
user_block_success = Cet utilisateur a été bloqué avec succès.
|
user_block_success = Cet utilisateur a été bloqué avec succès.
|
||||||
change_password = Modifier le mot de passe
|
change_password = Modifier le mot de passe
|
||||||
hints = Suggestions
|
hints = Suggestions
|
||||||
additional_repo_units_hint_description = Afficher un bouton "Ajouter plus d'unités..." pour les dépôts qui n'ont pas toutes les unités disponibles activées.
|
additional_repo_units_hint_description = Afficher un bouton "Ajouter en plus..." pour les dépôts qui n'ont pas toutes les unités disponibles activées.
|
||||||
additional_repo_units_hint = Suggérer l'ajout de nouvelles unités pour le dépôt
|
additional_repo_units_hint = Suggérer l'ajout de nouvelles unités pour le dépôt
|
||||||
update_hints = Mettre à jour les suggestions
|
update_hints = Mettre à jour les suggestions
|
||||||
update_hints_success = Les suggestions ont été mises à jour.
|
update_hints_success = Les suggestions ont été mises à jour.
|
||||||
|
@ -1042,6 +1049,8 @@ pronouns = Pronoms
|
||||||
pronouns_unspecified = Non spécifiés
|
pronouns_unspecified = Non spécifiés
|
||||||
language.title = Langue par défaut
|
language.title = Langue par défaut
|
||||||
keep_activity_private.description = Vous seul pourrez voir votre <a href="%s">activité publique</a>, ainsi que les administrateurs de l'instance.
|
keep_activity_private.description = Vous seul pourrez voir votre <a href="%s">activité publique</a>, ainsi que les administrateurs de l'instance.
|
||||||
|
language.localization_project = Aidez-nous à traduire Forgejo dans votre langue ! <a href="%s">En savoir plus</a>.
|
||||||
|
language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion.
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>
|
new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>
|
||||||
|
@ -1302,6 +1311,7 @@ view_git_blame=Voir Git blame
|
||||||
video_not_supported_in_browser=Votre navigateur ne supporte pas la balise « vidéo » HTML5.
|
video_not_supported_in_browser=Votre navigateur ne supporte pas la balise « vidéo » HTML5.
|
||||||
audio_not_supported_in_browser=Votre navigateur ne supporte pas la balise « audio » HTML5.
|
audio_not_supported_in_browser=Votre navigateur ne supporte pas la balise « audio » HTML5.
|
||||||
stored_lfs=Stocké avec Git LFS
|
stored_lfs=Stocké avec Git LFS
|
||||||
|
stored_annex=Stocké avec Git Annex
|
||||||
symbolic_link=Lien symbolique
|
symbolic_link=Lien symbolique
|
||||||
executable_file=Fichier exécutable
|
executable_file=Fichier exécutable
|
||||||
vendored=Externe
|
vendored=Externe
|
||||||
|
@ -1327,6 +1337,7 @@ editor.upload_file=Téléverser un fichier
|
||||||
editor.edit_file=Modifier le fichier
|
editor.edit_file=Modifier le fichier
|
||||||
editor.preview_changes=Aperçu des modifications
|
editor.preview_changes=Aperçu des modifications
|
||||||
editor.cannot_edit_lfs_files=Les fichiers LFS ne peuvent pas être modifiés dans l'interface web.
|
editor.cannot_edit_lfs_files=Les fichiers LFS ne peuvent pas être modifiés dans l'interface web.
|
||||||
|
editor.cannot_edit_annex_files=Les fichiers Annex ne peuvent pas être modifiés dans l'interface web.
|
||||||
editor.cannot_edit_non_text_files=Les fichiers binaires ne peuvent pas être édités dans l'interface web.
|
editor.cannot_edit_non_text_files=Les fichiers binaires ne peuvent pas être édités dans l'interface web.
|
||||||
editor.edit_this_file=Modifier le fichier
|
editor.edit_this_file=Modifier le fichier
|
||||||
editor.this_file_locked=Le fichier est verrouillé
|
editor.this_file_locked=Le fichier est verrouillé
|
||||||
|
@ -1421,7 +1432,7 @@ commitstatus.failure=Échec
|
||||||
commitstatus.pending=En attente
|
commitstatus.pending=En attente
|
||||||
commitstatus.success=Succès
|
commitstatus.success=Succès
|
||||||
|
|
||||||
ext_issues=Accès aux tickets externes
|
ext_issues=Tickets externes
|
||||||
ext_issues.desc=Lien vers un gestionnaire de tickets externe.
|
ext_issues.desc=Lien vers un gestionnaire de tickets externe.
|
||||||
|
|
||||||
projects=Projets
|
projects=Projets
|
||||||
|
@ -1602,9 +1613,9 @@ issues.no_content=Sans contenu.
|
||||||
issues.close=Fermer le ticket
|
issues.close=Fermer le ticket
|
||||||
issues.comment_pull_merged_at=a fusionné la révision %[1]s dans %[2]s %[3]s
|
issues.comment_pull_merged_at=a fusionné la révision %[1]s dans %[2]s %[3]s
|
||||||
issues.comment_manually_pull_merged_at=a fusionné manuellement la révision %[1]s dans %[2]s %[3]s
|
issues.comment_manually_pull_merged_at=a fusionné manuellement la révision %[1]s dans %[2]s %[3]s
|
||||||
issues.close_comment_issue=Commenter et fermer
|
issues.close_comment_issue=Fermer avec le commentaire
|
||||||
issues.reopen_issue=Rouvrir
|
issues.reopen_issue=Rouvrir
|
||||||
issues.reopen_comment_issue=Commenter et réouvrir
|
issues.reopen_comment_issue=Réouvrir avec le commentaire
|
||||||
issues.create_comment=Commenter
|
issues.create_comment=Commenter
|
||||||
issues.closed_at=`a fermé ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
issues.closed_at=`a fermé ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||||
issues.reopened_at=`a réouvert ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
issues.reopened_at=`a réouvert ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||||
|
@ -1993,7 +2004,7 @@ signing.wont_sign.commitssigned=La fusion ne sera pas signée car ses révisions
|
||||||
signing.wont_sign.approved=La fusion ne sera pas signée car la demande d'ajout n'a pas été approuvée.
|
signing.wont_sign.approved=La fusion ne sera pas signée car la demande d'ajout n'a pas été approuvée.
|
||||||
signing.wont_sign.not_signed_in=Vous n'êtes pas connecté.
|
signing.wont_sign.not_signed_in=Vous n'êtes pas connecté.
|
||||||
|
|
||||||
ext_wiki=Accès au wiki externe
|
ext_wiki=Wiki externe
|
||||||
ext_wiki.desc=Lier un wiki externe.
|
ext_wiki.desc=Lier un wiki externe.
|
||||||
|
|
||||||
wiki=Wiki
|
wiki=Wiki
|
||||||
|
@ -2067,7 +2078,7 @@ activity.unresolved_conv_label=Ouvrir
|
||||||
activity.title.releases_1=%d publication
|
activity.title.releases_1=%d publication
|
||||||
activity.title.releases_n=%d publications
|
activity.title.releases_n=%d publications
|
||||||
activity.title.releases_published_by=%s publiée par %s
|
activity.title.releases_published_by=%s publiée par %s
|
||||||
activity.published_release_label=Publiée
|
activity.published_release_label=Publication
|
||||||
activity.no_git_activity=Il n'y a pas eu de nouvelle révision dans cette période.
|
activity.no_git_activity=Il n'y a pas eu de nouvelle révision dans cette période.
|
||||||
activity.git_stats_exclude_merges=En excluant les fusions,
|
activity.git_stats_exclude_merges=En excluant les fusions,
|
||||||
activity.git_stats_author_1=%d auteur
|
activity.git_stats_author_1=%d auteur
|
||||||
|
@ -2321,32 +2332,32 @@ settings.event_push_desc=Soumission Git.
|
||||||
settings.event_repository=Dépôt
|
settings.event_repository=Dépôt
|
||||||
settings.event_repository_desc=Dépôt créé ou supprimé.
|
settings.event_repository_desc=Dépôt créé ou supprimé.
|
||||||
settings.event_header_issue=Événements de ticket
|
settings.event_header_issue=Événements de ticket
|
||||||
settings.event_issues=Ticket
|
settings.event_issues=Modification
|
||||||
settings.event_issues_desc=Ticket ouvert, rouvert, fermé ou modifié.
|
settings.event_issues_desc=Ticket ouvert, rouvert, fermé ou modifié.
|
||||||
settings.event_issue_assign=Ticket assigné
|
settings.event_issue_assign=Assigné
|
||||||
settings.event_issue_assign_desc=Ticket assigné ou dé-assigné.
|
settings.event_issue_assign_desc=Ticket assigné ou dé-assigné.
|
||||||
settings.event_issue_label=Ticket étiqueté
|
settings.event_issue_label=Étiqueté
|
||||||
settings.event_issue_label_desc=Labels attribués ou retirés.
|
settings.event_issue_label_desc=Labels attribués ou retirés.
|
||||||
settings.event_issue_milestone=Ticket jalonné
|
settings.event_issue_milestone=Jalonné
|
||||||
settings.event_issue_milestone_desc=Ticket jalonné ou dé-jalonné.
|
settings.event_issue_milestone_desc=Ticket jalonné ou dé-jalonné.
|
||||||
settings.event_issue_comment=Ticket commenté
|
settings.event_issue_comment=Commenté
|
||||||
settings.event_issue_comment_desc=Commentaire créé, modifié ou supprimé.
|
settings.event_issue_comment_desc=Commentaire créé, modifié ou supprimé.
|
||||||
settings.event_header_pull_request=Événements de demande d'ajout
|
settings.event_header_pull_request=Événements de demande d'ajout
|
||||||
settings.event_pull_request=Demande d'ajout
|
settings.event_pull_request=Demande d'ajout
|
||||||
settings.event_pull_request_desc=Demande d’ajout ouverte, rouverte, fermée ou modifiée.
|
settings.event_pull_request_desc=Demande d’ajout ouverte, rouverte, fermée ou modifiée.
|
||||||
settings.event_pull_request_assign=Demande d'ajout assignée
|
settings.event_pull_request_assign=Assignée
|
||||||
settings.event_pull_request_assign_desc=Demande d'ajout assignée ou non assignée.
|
settings.event_pull_request_assign_desc=Demande d'ajout assignée ou non assignée.
|
||||||
settings.event_pull_request_label=Demande d'ajout étiquetée
|
settings.event_pull_request_label=Étiquetée
|
||||||
settings.event_pull_request_label_desc=Label attribué ou retiré.
|
settings.event_pull_request_label_desc=Label attribué ou retiré.
|
||||||
settings.event_pull_request_milestone=Demande d'ajout jalonnée
|
settings.event_pull_request_milestone=Jalonnée
|
||||||
settings.event_pull_request_milestone_desc=Demande d'ajout jalonnée ou dé-jalonnée.
|
settings.event_pull_request_milestone_desc=Jalonnée ou dé-jalonnée.
|
||||||
settings.event_pull_request_comment=Commentaire sur une demande d'ajout
|
settings.event_pull_request_comment=Commentaires
|
||||||
settings.event_pull_request_comment_desc=Commentaire créé, modifié ou supprimé.
|
settings.event_pull_request_comment_desc=Commentaire créé, modifié ou supprimé.
|
||||||
settings.event_pull_request_review=Demande d'ajout évaluée
|
settings.event_pull_request_review=Évaluations
|
||||||
settings.event_pull_request_review_desc=Demande d’ajout approuvée, rejetée ou commentée.
|
settings.event_pull_request_review_desc=Demande d’ajout approuvée, rejetée ou commentaires d'évaluation ajoutés.
|
||||||
settings.event_pull_request_sync=Demande d'ajout synchronisée
|
settings.event_pull_request_sync=Synchronisée
|
||||||
settings.event_pull_request_sync_desc=Demande d'ajout synchronisée.
|
settings.event_pull_request_sync_desc=Branche mise à jour automatiquement avec la branche cible.
|
||||||
settings.event_pull_request_review_request=Requête d’évaluation d'une demande d'ajout
|
settings.event_pull_request_review_request=Requête d’évaluation
|
||||||
settings.event_pull_request_review_request_desc=Création ou suppresion de demandes d’évaluation.
|
settings.event_pull_request_review_request_desc=Création ou suppresion de demandes d’évaluation.
|
||||||
settings.event_pull_request_approvals=Approbations de demande d'ajout
|
settings.event_pull_request_approvals=Approbations de demande d'ajout
|
||||||
settings.event_pull_request_merge=Fusion de demande d'ajout
|
settings.event_pull_request_merge=Fusion de demande d'ajout
|
||||||
|
@ -2418,28 +2429,28 @@ settings.protect_enable_merge_desc=Toute personne ayant un accès en écriture s
|
||||||
settings.protect_whitelist_committers=Liste blanche des soumissions (push)
|
settings.protect_whitelist_committers=Liste blanche des soumissions (push)
|
||||||
settings.protect_whitelist_committers_desc=Seuls les utilisateurs ou les équipes autorisés pourront soumettre sur cette branche (sans forcer).
|
settings.protect_whitelist_committers_desc=Seuls les utilisateurs ou les équipes autorisés pourront soumettre sur cette branche (sans forcer).
|
||||||
settings.protect_whitelist_deploy_keys=Mettez les clés de déploiement sur liste blanche avec accès en écriture pour soumettre.
|
settings.protect_whitelist_deploy_keys=Mettez les clés de déploiement sur liste blanche avec accès en écriture pour soumettre.
|
||||||
settings.protect_whitelist_users=Utilisateurs sur liste blanche :
|
settings.protect_whitelist_users=Utilisateurs sur liste blanche pour pousser
|
||||||
settings.protect_whitelist_search_users=Rechercher des utilisateurs…
|
settings.protect_whitelist_search_users=Rechercher des utilisateurs…
|
||||||
settings.protect_whitelist_teams=Équipes sur liste blanche :
|
settings.protect_whitelist_teams=Équipes sur liste blanche pour pousser
|
||||||
settings.protect_whitelist_search_teams=Rechercher des équipes…
|
settings.protect_whitelist_search_teams=Rechercher des équipes…
|
||||||
settings.protect_merge_whitelist_committers=Activer la liste blanche pour la fusion
|
settings.protect_merge_whitelist_committers=Activer la liste blanche pour la fusion
|
||||||
settings.protect_merge_whitelist_committers_desc=N'autoriser que les utilisateurs et les équipes en liste blanche d'appliquer les demandes de fusion sur cette branche.
|
settings.protect_merge_whitelist_committers_desc=N'autoriser que les utilisateurs et les équipes en liste blanche d'appliquer les demandes de fusion sur cette branche.
|
||||||
settings.protect_merge_whitelist_users=Utilisateurs en liste blanche de fusion :
|
settings.protect_merge_whitelist_users=Utilisateurs en liste blanche pour fusionner
|
||||||
settings.protect_merge_whitelist_teams=Équipes en liste blanche de fusion :
|
settings.protect_merge_whitelist_teams=Équipes en liste blanche pour fusionner
|
||||||
settings.protect_check_status_contexts=Activer le contrôle de status
|
settings.protect_check_status_contexts=Activer le contrôle de status
|
||||||
settings.protect_status_check_patterns=Motifs de vérification des statuts :
|
settings.protect_status_check_patterns=Motifs de vérification des statuts
|
||||||
settings.protect_status_check_patterns_desc=Entrez des motifs pour spécifier quelles vérifications doivent réussir avant que des branches puissent être fusionnées. Un motif par ligne. Un motif ne peut être vide.
|
settings.protect_status_check_patterns_desc=Entrez des motifs pour spécifier quelles vérifications doivent réussir avant que des branches puissent être fusionnées. Un motif par ligne. Un motif ne peut être vide.
|
||||||
settings.protect_check_status_contexts_desc=Exiger le status « succès » avant de fusionner. Quand activée, une branche protégée ne peux accepter que des soumissions ou des fusions ayant le status « succès ». Lorsqu'il n'y a pas de contexte, la dernière révision fait foi.
|
settings.protect_check_status_contexts_desc=Exiger le status « succès » avant de fusionner. Quand activée, une branche protégée ne peux accepter que des soumissions ou des fusions ayant le status « succès ». Lorsqu'il n'y a pas de contexte, la dernière révision fait foi.
|
||||||
settings.protect_check_status_contexts_list=Contrôles qualité trouvés au cours de la semaine dernière pour ce dépôt
|
settings.protect_check_status_contexts_list=Contrôles qualité trouvés au cours de la semaine dernière pour ce dépôt
|
||||||
settings.protect_status_check_matched=Correspondant
|
settings.protect_status_check_matched=Correspondant
|
||||||
settings.protect_invalid_status_check_pattern=Motif de vérification des statuts incorrect : « %s ».
|
settings.protect_invalid_status_check_pattern=Motif de vérification des statuts incorrect : « %s ».
|
||||||
settings.protect_no_valid_status_check_patterns=Aucun motif de vérification des statuts valide.
|
settings.protect_no_valid_status_check_patterns=Aucun motif de vérification des statuts valide.
|
||||||
settings.protect_required_approvals=Minimum d'approbations requis :
|
settings.protect_required_approvals=Approbations requises
|
||||||
settings.protect_required_approvals_desc=Permet de fusionner les demandes d’ajout lorsque suffisamment d’évaluation sont positives.
|
settings.protect_required_approvals_desc=Permet de fusionner les demandes d’ajout lorsque suffisamment d’évaluation sont positives.
|
||||||
settings.protect_approvals_whitelist_enabled=Restreindre les approbations aux utilisateurs ou aux équipes en liste blanche
|
settings.protect_approvals_whitelist_enabled=Restreindre les approbations aux utilisateurs ou aux équipes en liste blanche
|
||||||
settings.protect_approvals_whitelist_enabled_desc=Seuls les évaluations des utilisateurs ou des équipes suivantes compteront dans les approbations requises. Si laissé vide, les évaluations de toute personne ayant un accès en écriture seront comptabilisées à la place.
|
settings.protect_approvals_whitelist_enabled_desc=Seuls les évaluations des utilisateurs ou des équipes suivantes compteront dans les approbations requises. Si laissé vide, les évaluations de toute personne ayant un accès en écriture seront comptabilisées à la place.
|
||||||
settings.protect_approvals_whitelist_users=Évaluateurs autorisés :
|
settings.protect_approvals_whitelist_users=Évaluateurs autorisés
|
||||||
settings.protect_approvals_whitelist_teams=Équipes d’évaluateurs autorisés :
|
settings.protect_approvals_whitelist_teams=Équipes d’évaluateurs autorisés
|
||||||
settings.dismiss_stale_approvals=Révoquer automatiquement les approbations périmées
|
settings.dismiss_stale_approvals=Révoquer automatiquement les approbations périmées
|
||||||
settings.dismiss_stale_approvals_desc=Lorsque des nouvelles révisions changent le contenu de la demande d’ajout, les approbations existantes sont révoquées.
|
settings.dismiss_stale_approvals_desc=Lorsque des nouvelles révisions changent le contenu de la demande d’ajout, les approbations existantes sont révoquées.
|
||||||
settings.ignore_stale_approvals=Ignorer les approbations obsolètes
|
settings.ignore_stale_approvals=Ignorer les approbations obsolètes
|
||||||
|
@ -2449,9 +2460,9 @@ settings.require_signed_commits_desc=Rejeter les soumissions sur cette branche l
|
||||||
settings.protect_branch_name_pattern=Motif de nom de branche protégé
|
settings.protect_branch_name_pattern=Motif de nom de branche protégé
|
||||||
settings.protect_branch_name_pattern_desc=Motifs de nom de branche protégé. Consultez la <a href="%s">documentation</a> pour la syntaxe du motif. Exemples : main, release/**
|
settings.protect_branch_name_pattern_desc=Motifs de nom de branche protégé. Consultez la <a href="%s">documentation</a> pour la syntaxe du motif. Exemples : main, release/**
|
||||||
settings.protect_patterns=Motifs
|
settings.protect_patterns=Motifs
|
||||||
settings.protect_protected_file_patterns=Liste des fichiers et motifs protégés (séparés par un point virgule ";") :
|
settings.protect_protected_file_patterns=Motifs de fichiers protégés (séparés par un point virgule ";")
|
||||||
settings.protect_protected_file_patterns_desc=Les fichiers protégés ne peuvent être modifiés, même si l'utilisateur a le droit d'ajouter, éditer ou supprimer des fichiers dans cette branche. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir <a href="%s">github.com/gobwas/glob</a> la documentation pour la syntaxe des motifs. Exemples : <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_protected_file_patterns_desc=Les fichiers protégés ne peuvent être modifiés, même si l'utilisateur a le droit d'ajouter, éditer ou supprimer des fichiers dans cette branche. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir <a href="%[1]s">%[2]s</a> la documentation pour la syntaxe des motifs. Exemples : <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.protect_unprotected_file_patterns=Liste des fichiers et motifs exclus (séparés par un point virgule ";") :
|
settings.protect_unprotected_file_patterns=Motifs de fichiers non protégés (séparés par un point virgule ";")
|
||||||
settings.protect_unprotected_file_patterns_desc=Les fichiers non-protégés qui peuvent être modifiés si l'utilisateur a le droit d'écriture, prenant le pas sur les restrictions de push. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir <a href="%[1]s">%[2]s</a> la documentation pour la syntaxe des motifs. Exemples : <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
settings.protect_unprotected_file_patterns_desc=Les fichiers non-protégés qui peuvent être modifiés si l'utilisateur a le droit d'écriture, prenant le pas sur les restrictions de push. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir <a href="%[1]s">%[2]s</a> la documentation pour la syntaxe des motifs. Exemples : <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||||
settings.add_protected_branch=Activer la protection
|
settings.add_protected_branch=Activer la protection
|
||||||
settings.delete_protected_branch=Désactiver la protection
|
settings.delete_protected_branch=Désactiver la protection
|
||||||
|
@ -2682,9 +2693,9 @@ branch.renamed=La branche %s à été renommée en %s.
|
||||||
tag.create_tag=Créer l'étiquette %s
|
tag.create_tag=Créer l'étiquette %s
|
||||||
tag.create_tag_operation=Créer une étiquette
|
tag.create_tag_operation=Créer une étiquette
|
||||||
tag.confirm_create_tag=Créer une étiquette
|
tag.confirm_create_tag=Créer une étiquette
|
||||||
tag.create_tag_from=`Créer une nouvelle étiquette à partir de "%s"`
|
tag.create_tag_from=Créer une nouvelle étiquette à partir de « %s »
|
||||||
|
|
||||||
tag.create_success=L'étiquette "%s" a été créée.
|
tag.create_success=L'étiquette « %s » a été créée.
|
||||||
|
|
||||||
topic.manage_topics=Gérer les sujets
|
topic.manage_topics=Gérer les sujets
|
||||||
topic.done=Terminé
|
topic.done=Terminé
|
||||||
|
@ -2737,11 +2748,11 @@ settings.add_collaborator_blocked_our = Il n'est pas possible d'ajouter ce colla
|
||||||
settings.wiki_rename_branch_main_notices_1 = Cette operation <strong>NE PEUT PAS</strong> être annulée.
|
settings.wiki_rename_branch_main_notices_1 = Cette operation <strong>NE PEUT PAS</strong> être annulée.
|
||||||
settings.wiki_branch_rename_failure = Le nom de la branche associée au wiki du dépôt n'a pu être normalisé.
|
settings.wiki_branch_rename_failure = Le nom de la branche associée au wiki du dépôt n'a pu être normalisé.
|
||||||
pulls.reopen_failed.head_branch = La pull request ne peut pas être re-ouverte car la branch d'origine n'existe plus.
|
pulls.reopen_failed.head_branch = La pull request ne peut pas être re-ouverte car la branch d'origine n'existe plus.
|
||||||
settings.units.units = Fonctionnalités des dépôt
|
settings.units.units = Fonctionnalités
|
||||||
pulls.fast_forward_only_merge_pull_request = Fast-forward uniquement
|
pulls.fast_forward_only_merge_pull_request = Fast-forward uniquement
|
||||||
pulls.reopen_failed.base_branch = La pull request ne peut pas être re-ouverte car la branche de destination n'existe plus.
|
pulls.reopen_failed.base_branch = La pull request ne peut pas être re-ouverte car la branche de destination n'existe plus.
|
||||||
settings.units.overview = Vue générale
|
settings.units.overview = Vue générale
|
||||||
settings.units.add_more = Ajouter en plus...
|
settings.units.add_more = Ajouter en plus
|
||||||
activity.navbar.pulse = Pouls
|
activity.navbar.pulse = Pouls
|
||||||
activity.navbar.contributors = Contributeurs
|
activity.navbar.contributors = Contributeurs
|
||||||
contributors.contribution_type.commits = Commits
|
contributors.contribution_type.commits = Commits
|
||||||
|
@ -2811,6 +2822,32 @@ settings.federation_following_repos = Les URL des dépôts suivis séparés par
|
||||||
settings.federation_not_enabled = La fédération n'est pas activée pour votre instance.
|
settings.federation_not_enabled = La fédération n'est pas activée pour votre instance.
|
||||||
comments.edit.already_changed = Impossible de sauvegarder les changements du commentaire car son contenu a déjà été modifié par un autre utilisateur. Veuillez recharger la page et essayer de l'éditer à nouveau pour éviter d'écraser ses changements
|
comments.edit.already_changed = Impossible de sauvegarder les changements du commentaire car son contenu a déjà été modifié par un autre utilisateur. Veuillez recharger la page et essayer de l'éditer à nouveau pour éviter d'écraser ses changements
|
||||||
settings.federation_apapiurl = URL de fédération de ce dépôt. A copier-coller dans les paramètres de fédérations d'un autre dépôt comme URL d'un dépôt à suivre.
|
settings.federation_apapiurl = URL de fédération de ce dépôt. A copier-coller dans les paramètres de fédérations d'un autre dépôt comme URL d'un dépôt à suivre.
|
||||||
|
mirror_denied_combination = Il n'est pas possible de combiner une authentification par clé publique et par mot de passe.
|
||||||
|
mirror_public_key = Clé SSH publique
|
||||||
|
mirror_use_ssh.text = Utiliser l'authentification SSH
|
||||||
|
mirror_use_ssh.helper = Forgejo va créer un miroir du dépôt via Git sur SSH et créer une paire de clés pour vous lorsque vous sélectionnez cette option. Vous devez vous assurer que la clé publique générée est autorisée à pousser dans le dépôt de destination. Il n'est pas possible d'utiliser l'autorisation basée sur un mot de passe si vous choisissez cette option.
|
||||||
|
no_eol.text = Pas d'EOL
|
||||||
|
mirror_use_ssh.not_available = L'authentification par SSH n'est pas disponible.
|
||||||
|
no_eol.tooltip = Ce fichier ne contient pas de caractère final de fin de ligne.
|
||||||
|
release.type_attachment = Pièce jointe
|
||||||
|
settings.transfer_quota_exceeded = Le nouvel utilisateur (%s) a dépassé son quota. Le dépôt n'a pas été transféré.
|
||||||
|
settings.pull_mirror_sync_quota_exceeded = Quota dépassé, les modifications ne sont pas tirées.
|
||||||
|
activity.commit = Activité de commit
|
||||||
|
settings.mirror_settings.push_mirror.copy_public_key = Copier la clé publique
|
||||||
|
release.asset_external_url = URL externe
|
||||||
|
release.invalid_external_url = URL externe non valable : « %s »
|
||||||
|
milestones.filter_sort.name = Nom
|
||||||
|
settings.mirror_settings.push_mirror.none_ssh = Aucun
|
||||||
|
settings.protect_new_rule = Créer une nouvelle règle de protection de branche
|
||||||
|
pulls.cmd_instruction_merge_warning = <b>Avertissement :</b> Le paramètre "détection automatique de la fusion manuelle" n'est pas activé pour ce dépôt, vous devrez marquer cette demande d'ajout comme manuellement fusionnée après.
|
||||||
|
release.type_external_asset = Actif Externe
|
||||||
|
activity.published_prerelease_label = Pré-version
|
||||||
|
activity.published_tag_label = Étiquette
|
||||||
|
release.asset_name = Nom de l'actif
|
||||||
|
release.add_external_asset = Ajouter un actif externe
|
||||||
|
issues.new.assign_to_me = Assigner à moi-même
|
||||||
|
issues.all_title = Tous
|
||||||
|
settings.discord_icon_url.exceeds_max_length = L'URL de l’icône ne doit pas dépasser 2048 caractères
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
component_loading=Chargement de %s…
|
component_loading=Chargement de %s…
|
||||||
|
@ -2897,8 +2934,8 @@ teams.leave.detail=Êtes vous certain·e de vouloir quitter l'équipe «%s» ?
|
||||||
teams.can_create_org_repo=Créer des dépôts
|
teams.can_create_org_repo=Créer des dépôts
|
||||||
teams.can_create_org_repo_helper=Les membres peuvent créer de nouveaux dépôts dans l'organisation. Le créateur obtiendra l'accès administrateur au nouveau dépôt.
|
teams.can_create_org_repo_helper=Les membres peuvent créer de nouveaux dépôts dans l'organisation. Le créateur obtiendra l'accès administrateur au nouveau dépôt.
|
||||||
teams.none_access=Aucun accès
|
teams.none_access=Aucun accès
|
||||||
teams.none_access_helper=Les membres ne peuvent voir ou faire quoi que ce soit sur cette partie. Sans effet pour les dépôts publics.
|
teams.none_access_helper=L'option "Aucun accès" n'a pas d'effet sur les dépôts privés.
|
||||||
teams.general_access=Accès général
|
teams.general_access=Accès personnalisé
|
||||||
teams.general_access_helper=Les permissions des membres seront déterminées par la table des permissions ci-dessous.
|
teams.general_access_helper=Les permissions des membres seront déterminées par la table des permissions ci-dessous.
|
||||||
teams.read_access=Lecture
|
teams.read_access=Lecture
|
||||||
teams.read_access_helper=Les membres peuvent voir et cloner les dépôts de l'équipe.
|
teams.read_access_helper=Les membres peuvent voir et cloner les dépôts de l'équipe.
|
||||||
|
@ -3043,10 +3080,10 @@ dashboard.delete_old_actions.started=Suppression de toutes les anciennes activit
|
||||||
dashboard.update_checker=Vérificateur de mise à jour
|
dashboard.update_checker=Vérificateur de mise à jour
|
||||||
dashboard.delete_old_system_notices=Supprimer toutes les anciennes observations de la base de données
|
dashboard.delete_old_system_notices=Supprimer toutes les anciennes observations de la base de données
|
||||||
dashboard.gc_lfs=Épousseter les métaobjets LFS
|
dashboard.gc_lfs=Épousseter les métaobjets LFS
|
||||||
dashboard.stop_zombie_tasks=Arrêter les tâches zombies
|
dashboard.stop_zombie_tasks=Arrêter les actions zombies
|
||||||
dashboard.stop_endless_tasks=Arrêter les tâches sans fin
|
dashboard.stop_endless_tasks=Arrêter les actions sans fin
|
||||||
dashboard.cancel_abandoned_jobs=Annuler les jobs abandonnés
|
dashboard.cancel_abandoned_jobs=Annuler les actions abandonnées
|
||||||
dashboard.start_schedule_tasks=Démarrer les tâches planifiées
|
dashboard.start_schedule_tasks=Démarrer les actions planifiées
|
||||||
dashboard.sync_branch.started=Début de la synchronisation des branches
|
dashboard.sync_branch.started=Début de la synchronisation des branches
|
||||||
dashboard.sync_tag.started=Synchronisation des étiquettes
|
dashboard.sync_tag.started=Synchronisation des étiquettes
|
||||||
dashboard.rebuild_issue_indexer=Reconstruire l’indexeur des tickets
|
dashboard.rebuild_issue_indexer=Reconstruire l’indexeur des tickets
|
||||||
|
@ -3130,7 +3167,7 @@ orgs.new_orga=Nouvelle organisation
|
||||||
|
|
||||||
repos.repo_manage_panel=Gestion des dépôts
|
repos.repo_manage_panel=Gestion des dépôts
|
||||||
repos.unadopted=Dépôts non adoptés
|
repos.unadopted=Dépôts non adoptés
|
||||||
repos.unadopted.no_more=Aucun dépôt candidat à l'adoption n'a été trouvé
|
repos.unadopted.no_more=Aucun dépôt candidat à l'adoption n'a été trouvé.
|
||||||
repos.owner=Propriétaire
|
repos.owner=Propriétaire
|
||||||
repos.name=Nom
|
repos.name=Nom
|
||||||
repos.private=Privé
|
repos.private=Privé
|
||||||
|
@ -3256,7 +3293,7 @@ auths.tips=Conseils
|
||||||
auths.tips.oauth2.general=Authentification OAuth2
|
auths.tips.oauth2.general=Authentification OAuth2
|
||||||
auths.tips.oauth2.general.tip=Lors de l'enregistrement d'une nouvelle authentification OAuth2, l'URL de rappel/redirection doit être :
|
auths.tips.oauth2.general.tip=Lors de l'enregistrement d'une nouvelle authentification OAuth2, l'URL de rappel/redirection doit être :
|
||||||
auths.tip.oauth2_provider=Fournisseur OAuth2
|
auths.tip.oauth2_provider=Fournisseur OAuth2
|
||||||
auths.tip.bitbucket=`Créez un nouveau jeton OAuth sur %s
|
auths.tip.bitbucket=Créez un nouveau jeton OAuth sur %s
|
||||||
auths.tip.nextcloud=`Enregistrez un nouveau consommateur OAuth sur votre instance en utilisant le menu "Paramètres -> Sécurité -> Client OAuth 2.0"`
|
auths.tip.nextcloud=`Enregistrez un nouveau consommateur OAuth sur votre instance en utilisant le menu "Paramètres -> Sécurité -> Client OAuth 2.0"`
|
||||||
auths.tip.dropbox=Créez une nouvelle application sur %s
|
auths.tip.dropbox=Créez une nouvelle application sur %s
|
||||||
auths.tip.facebook=`Enregistrez une nouvelle application sur %s et ajoutez le produit "Facebook Login"`
|
auths.tip.facebook=`Enregistrez une nouvelle application sur %s et ajoutez le produit "Facebook Login"`
|
||||||
|
@ -3500,6 +3537,16 @@ config.cache_test_slow = Test du cache réussi, mais le temps de réponse est le
|
||||||
config.cache_test_failed = Échec du contrôle du cache : %v.
|
config.cache_test_failed = Échec du contrôle du cache : %v.
|
||||||
config.cache_test = Tester le cache
|
config.cache_test = Tester le cache
|
||||||
config.cache_test_succeeded = Test du cache réussi, réponse obtenue en %s.
|
config.cache_test_succeeded = Test du cache réussi, réponse obtenue en %s.
|
||||||
|
emails.delete_desc = Êtes-vous sûr de vouloir supprimer cette adresse courriel ?
|
||||||
|
users.organization_creation.description = Autoriser la création de nouvelles organisations.
|
||||||
|
emails.deletion_success = L'adresse courriel a été supprimée.
|
||||||
|
emails.delete = Supprimer le courriel
|
||||||
|
emails.delete_primary_email_error = Vous ne pouvez pas supprimer l'adresse courriel principale.
|
||||||
|
users.activated.description = Achèvement de la vérification de courriel. Le propriétaire d'un compte non activé ne pourra pas se connecter tant que la vérification de courriel n'est pas terminée.
|
||||||
|
users.block.description = Bloquer cet utilisateur d'interagir avec ce service via son compte et interdire la connexion.
|
||||||
|
users.admin.description = Accorder à cet utilisateur un accès complet à toutes les fonctionnalités administratives disponibles via l'interface web et l'API.
|
||||||
|
users.restricted.description = Autoriser uniquement l'interaction avec les dépôts et les organisations où cet utilisateur est ajouté en tant que collaborateur. Cela empêche l'accès aux dépôts publics sur cette instance.
|
||||||
|
users.local_import.description = Autoriser l'importation de dépôts à partir du système de fichiers local du serveur. Cela peut poser un problème de sécurité.
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
create_repo=a créé le dépôt <a href="%s">%s</a>
|
create_repo=a créé le dépôt <a href="%s">%s</a>
|
||||||
|
@ -3746,6 +3793,22 @@ rpm.repository.architectures = Architectures
|
||||||
rpm.repository.multiple_groups = Ce paquet est disponible dans plusieurs groupes.
|
rpm.repository.multiple_groups = Ce paquet est disponible dans plusieurs groupes.
|
||||||
owner.settings.cargo.rebuild.no_index = Incapable de reconstruire, index non initialisé.
|
owner.settings.cargo.rebuild.no_index = Incapable de reconstruire, index non initialisé.
|
||||||
npm.dependencies.bundle = Bundles de dépendances
|
npm.dependencies.bundle = Bundles de dépendances
|
||||||
|
arch.pacman.helper.gpg = Ajouter un certificat de confiance pour pacman :
|
||||||
|
arch.pacman.repo.multi = %s a la même version dans différentes distributions.
|
||||||
|
arch.pacman.repo.multi.item = Configuration pour %s
|
||||||
|
arch.pacman.conf = Ajouter un serveur associées à la distribution et l'architecture dans <code>/etc/pacman.conf</code> :
|
||||||
|
arch.pacman.sync = Synchroniser le paquet avec pacman :
|
||||||
|
arch.version.properties = Propriétés de version
|
||||||
|
arch.version.description = Description
|
||||||
|
arch.version.provides = Fournit
|
||||||
|
arch.version.groups = Groupe
|
||||||
|
arch.version.depends = Dépend
|
||||||
|
arch.version.optdepends = Dépendances optionnelles
|
||||||
|
arch.version.checkdepends = Vérifier les dépendances
|
||||||
|
arch.version.conflicts = Conflits
|
||||||
|
arch.version.replaces = Remplace
|
||||||
|
arch.version.backup = Sauvegarde
|
||||||
|
arch.version.makedepends = Faire des dépendances
|
||||||
|
|
||||||
[secrets]
|
[secrets]
|
||||||
secrets=Secrets
|
secrets=Secrets
|
||||||
|
@ -3765,7 +3828,7 @@ management=Gestion des secrets
|
||||||
[actions]
|
[actions]
|
||||||
actions=Actions
|
actions=Actions
|
||||||
|
|
||||||
unit.desc=Gérer l'intégration continue avec Forgejo Actions
|
unit.desc=Gérer l'intégration continue avec Forgejo Actions.
|
||||||
|
|
||||||
status.unknown=Inconnu
|
status.unknown=Inconnu
|
||||||
status.waiting=En attente
|
status.waiting=En attente
|
||||||
|
@ -3866,11 +3929,13 @@ workflow.dispatch.success = L'exécution du workflow a bien été demandée.
|
||||||
workflow.dispatch.input_required = Le champ "%s" est obligatoire.
|
workflow.dispatch.input_required = Le champ "%s" est obligatoire.
|
||||||
workflow.dispatch.invalid_input_type = Type invalide pour le champ "%s".
|
workflow.dispatch.invalid_input_type = Type invalide pour le champ "%s".
|
||||||
workflow.dispatch.warn_input_limit = Affichage des %d premiers champs seulement.
|
workflow.dispatch.warn_input_limit = Affichage des %d premiers champs seulement.
|
||||||
|
runs.expire_log_message = Les journaux ont été purgés car ils étaient trop anciens.
|
||||||
|
|
||||||
[projects]
|
[projects]
|
||||||
type-1.display_name=Projet personnel
|
type-1.display_name=Projet personnel
|
||||||
type-2.display_name=Projet du dépôt
|
type-2.display_name=Projet du dépôt
|
||||||
type-3.display_name=Projet de l'organisation
|
type-3.display_name=Projet de l'organisation
|
||||||
|
deleted.display_name = Projet Supprimé
|
||||||
|
|
||||||
[git.filemode]
|
[git.filemode]
|
||||||
changed_filemode=%[1]s → %[2]s
|
changed_filemode=%[1]s → %[2]s
|
||||||
|
@ -3922,6 +3987,8 @@ union = Union
|
||||||
union_tooltip = Inclus les résultats contenant au moins un des mots clé séparés par des espaces
|
union_tooltip = Inclus les résultats contenant au moins un des mots clé séparés par des espaces
|
||||||
pull_kind = Rechercher dans les demande d'ajout...
|
pull_kind = Rechercher dans les demande d'ajout...
|
||||||
milestone_kind = Recherche dans les jalons...
|
milestone_kind = Recherche dans les jalons...
|
||||||
|
regexp_tooltip = Interpréter le terme de recherche comme une expression régulière
|
||||||
|
regexp = RegExp
|
||||||
|
|
||||||
|
|
||||||
[munits.data]
|
[munits.data]
|
||||||
|
@ -3936,4 +4003,27 @@ eib = Eio
|
||||||
[markup]
|
[markup]
|
||||||
filepreview.line = Ligne %[1]d dans %[2]s
|
filepreview.line = Ligne %[1]d dans %[2]s
|
||||||
filepreview.lines = Lignes %[1]d jusqu'à %[2]d dans %[3]s
|
filepreview.lines = Lignes %[1]d jusqu'à %[2]d dans %[3]s
|
||||||
filepreview.truncated = L'aperçu a été tronqué
|
filepreview.truncated = L'aperçu a été tronqué
|
||||||
|
|
||||||
|
[repo.permissions]
|
||||||
|
pulls.write = <b>Écrire :</b> Fermer des demandes de tirage et gérer les métadonnées telles que les étiquettes, les jalons, les assignés, les dates d'échéance et les dépendances.
|
||||||
|
actions.read = <b>Lire :</b> Voir les pipelines CI/CD intégrés et leurs journaux.
|
||||||
|
releases.read = <b>Lire:</b> Voir et télécharger les versions.
|
||||||
|
releases.write = <b>Écrire :</b> Publier, modifier et supprimer des versions et leurs ressources.
|
||||||
|
projects.write = <b>Écrire :</b> Créer des projets, des colonnes et les modifier.
|
||||||
|
code.read = <b>Lire :</b> Accéder au code du dépôt et le cloner.
|
||||||
|
ext_issues = Accéder au lien vers un système externe de suivi des problèmes. Les autorisations sont gérées de manière externe.
|
||||||
|
code.write = <b>Écrire :</b> Pousser vers le dépôt, créer des branches et des étiquettes.
|
||||||
|
issues.read = <b>Lire :</b> Lire et créer des tickets et des commentaires.
|
||||||
|
wiki.read = <b>Lire :</b> Lire le wiki intégré et son historique.
|
||||||
|
wiki.write = <b>Écrire :</b> Créer, mettre à jour et supprimer des pages dans le wiki intégré.
|
||||||
|
projects.read = <b>Lire :</b> Accéder aux tableaux de projet du dépôt.
|
||||||
|
packages.read = <b>Lire :</b> Voir et télécharger les paquets assignés au dépôt.
|
||||||
|
packages.write = <b>Écrire :</b> Publier et supprimer des paquets assignés au dépôt.
|
||||||
|
actions.write = <b>Écrire :</b> Déclencher manuellement, redémarrer, annuler ou approuver les pipelines CI/CD en attente.
|
||||||
|
ext_wiki = Accéder au lien vers un wiki externe. Les autorisations sont gérées de manière externe.
|
||||||
|
issues.write = <b>Écrire :</b> Fermer des tickets et gérer les métadonnées telles que les étiquettes, les jalons, les assignés, les dates d'échéance et les dépendances.
|
||||||
|
pulls.read = <b>Lire :</b> Lire et créer des demandes de tirage.
|
||||||
|
|
||||||
|
[translation_meta]
|
||||||
|
test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce doux 100 % de complétion :)
|
|
@ -2,5 +2,26 @@
|
||||||
|
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
dashboard = डैशबोर्ड
|
dashboard = नियंत्रण कक्ष
|
||||||
home = घर
|
home = मुख्य पृष्ठ
|
||||||
|
help = सहायता
|
||||||
|
logo = चिह्न
|
||||||
|
explore = अन्वेषण करें
|
||||||
|
sign_in = प्रवेश करें
|
||||||
|
sign_in_with_provider = %s के साथ प्रवेश करें
|
||||||
|
sign_in_or = या
|
||||||
|
sign_out = बाहर निकलें
|
||||||
|
sign_up = पंजीकरण
|
||||||
|
register = पंजीकरण
|
||||||
|
version = संस्करण
|
||||||
|
powered_by = द्वारा संचालित %s
|
||||||
|
page = पृष्ठ
|
||||||
|
template = सांचा
|
||||||
|
language = भाषा
|
||||||
|
active_stopwatch = सक्रिय समय ट्रैकर
|
||||||
|
create_new = बनाएँ…
|
||||||
|
signed_in_as = साइन इन किया गया है
|
||||||
|
link_account = खाता लिंक करें
|
||||||
|
notifications = सूचनाएँ
|
||||||
|
tracked_time_summary = समस्याओं की सूची के फ़िल्टर के आधार पर ट्रैक किए गए समय का सारांश
|
||||||
|
user_profile_and_more = प्रोफ़ाइल और सेटिंग्स…
|
|
@ -20,15 +20,15 @@ user_profile_and_more=Profil és beállítások…
|
||||||
signed_in_as=Bejelentkezve mint
|
signed_in_as=Bejelentkezve mint
|
||||||
toc=Tartalomjegyzék
|
toc=Tartalomjegyzék
|
||||||
licenses=Licencek
|
licenses=Licencek
|
||||||
return_to_forgejo=Vissza a Forgejo-hoz
|
return_to_forgejo=Vissza a Forgejóhoz
|
||||||
|
|
||||||
username=Felhasználónév
|
username=Felhasználónév
|
||||||
email=E-mail cím
|
email=E-mail-cím
|
||||||
password=Jelszó
|
password=Jelszó
|
||||||
re_type=Jelszó megerősítése
|
re_type=Jelszó megerősítése
|
||||||
captcha=CAPTCHA
|
captcha=CAPTCHA
|
||||||
twofa=Kétlépcsős hitelesítés
|
twofa=Kétlépcsős hitelesítés
|
||||||
twofa_scratch=Kétlépcsős bejelentkezés egyszer használatos kódja
|
twofa_scratch=Kétlépcsős hitelesítés egyszer használatos kódja
|
||||||
passcode=Jelkód
|
passcode=Jelkód
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,13 +98,13 @@ filter.is_archived = Archivált
|
||||||
logo = Logó
|
logo = Logó
|
||||||
sign_in_with_provider = Bejelentkezés %s fiókkal
|
sign_in_with_provider = Bejelentkezés %s fiókkal
|
||||||
webauthn_insert_key = Helyezze be biztonsági kulcsát
|
webauthn_insert_key = Helyezze be biztonsági kulcsát
|
||||||
webauthn_press_button = Kérem nyomja meg a biztonsági kulcsán található gombot…
|
webauthn_press_button = Nyomja meg a biztonsági kulcsán található gombot…
|
||||||
access_token = Hozzáférési token
|
access_token = Hozzáférési token
|
||||||
webauthn_error = A biztonsági kulcsának beolvasása sikertelen volt.
|
webauthn_error = A biztonsági kulcsának beolvasása sikertelen volt.
|
||||||
webauthn_unsupported_browser = A böngészője jelenleg nem támogatja a WebAuthn protokollt.
|
webauthn_unsupported_browser = A böngészője jelenleg nem támogatja a WebAuthn protokollt.
|
||||||
webauthn_error_unknown = Egy ismeretlen hiba jelentkezett. Kérem próbálja újra.
|
webauthn_error_unknown = Ismeretlen hiba történt. Próbálja újra.
|
||||||
webauthn_error_unable_to_process = A szerver nem tudta feldolgozni kérését.
|
webauthn_error_unable_to_process = A kiszolgáló nem tudta feldolgozni a kérését.
|
||||||
webauthn_error_empty = Ennek a kulcsnak nevet kell adnia.
|
webauthn_error_empty = Nevet kell adnia ennek a kulcsnak.
|
||||||
new_project_column = Új oszlop
|
new_project_column = Új oszlop
|
||||||
never = Soha
|
never = Soha
|
||||||
unknown = Ismeretlen
|
unknown = Ismeretlen
|
||||||
|
@ -126,16 +126,53 @@ more_items = További elemek
|
||||||
view = Megtekintés
|
view = Megtekintés
|
||||||
ok = OK
|
ok = OK
|
||||||
copy_generic = Másolás vágólapra
|
copy_generic = Másolás vágólapra
|
||||||
copy_url = URL másolása
|
copy_url = Webcím másolása
|
||||||
webauthn_error_insecure = A WebAuthn csak biztonságos kapcsolatokat támogat. HTTP-n keresztüli tesztelés esetén használja a "localhost" vagy "127.0.0.1"-es elérési pontokat
|
webauthn_error_insecure = A WebAuthn csak biztonságos kapcsolatokat támogat. HTTP-n keresztüli tesztelés esetén használja a „localhost” vagy a „127.0.0.1” forrást.
|
||||||
|
filter.clear = Szűrők törlése
|
||||||
|
enable_javascript = Az oldal működéséhez engedélyezni kell a JavaScriptet.
|
||||||
|
webauthn_sign_in = Nyomja meg a biztonsági kulcsán található gombot. Ha nincs rajta gomb, próbálja meg újra behelyezni.
|
||||||
|
webauthn_use_twofa = Kétlépcsős hitelesítési kód használata telefonról
|
||||||
|
webauthn_error_timeout = Időtúllépés a kulcs beolvasása során. Töltse be újra ezt az oldalt, és próbálkozzon újra.
|
||||||
|
copy_branch = Elágazás nevének másolása
|
||||||
|
test = Tesztelés
|
||||||
|
copy_type_unsupported = Ezt a fájltípust nem lehet másolni
|
||||||
|
copy_error = Sikertelen másolás
|
||||||
|
invalid_data = Érvénytelen adatok: %v
|
||||||
|
unpin = Rögzítés feloldása
|
||||||
|
concept_user_individual = Egyéni
|
||||||
|
toggle_menu = Menü megjelenítése/elrejtése
|
||||||
|
concept_system_global = Globális
|
||||||
|
error413 = Felhasználta a kvótáját.
|
||||||
|
remove_label_str = „%s” eltávolítása
|
||||||
|
rerun_all = Minden feladat újrafuttatása
|
||||||
|
rerun = Újrafuttatás
|
||||||
|
show_full_screen = Teljes képernyő
|
||||||
|
rss_feed = RSS csatorna
|
||||||
|
copy = Másolás
|
||||||
|
retry = Újra
|
||||||
|
new_repo.title = Új tároló
|
||||||
|
new_repo.link = Új tároló
|
||||||
|
new_migrate.title = Új migráció
|
||||||
|
new_migrate.link = Új migráció
|
||||||
|
new_org.title = Új szervezet
|
||||||
|
new_org.link = Új szervezet
|
||||||
|
filter.is_fork = Másolatok
|
||||||
|
webauthn_error_duplicated = A biztonsági kulcs nem engedélyezett ehhez a kéréshez. Győződjön meg róla, hogy a kulcs nincs-e már regisztrálva.
|
||||||
|
filter.is_mirror = Tükrök
|
||||||
|
|
||||||
[aria]
|
[aria]
|
||||||
footer.links = Hivatkozások
|
footer.links = Hivatkozások
|
||||||
footer = Lábléc
|
footer = Lábléc
|
||||||
|
navbar = Navigációs eszközsor
|
||||||
|
footer.software = A programról
|
||||||
|
|
||||||
[heatmap]
|
[heatmap]
|
||||||
less = Kevesebb
|
less = Kevesebb
|
||||||
more = Több
|
more = Több
|
||||||
|
number_of_contributions_in_the_last_12_months = %s hozzájárulás az elmúlt 12 hónapban
|
||||||
|
contributions_zero = Nincsenek hozzájárulások
|
||||||
|
contributions_one = hozzájárulás
|
||||||
|
contributions_few = hozzájárulás
|
||||||
|
|
||||||
[editor]
|
[editor]
|
||||||
buttons.heading.tooltip = Fejléc hozzáadása
|
buttons.heading.tooltip = Fejléc hozzáadása
|
||||||
|
@ -145,6 +182,12 @@ buttons.italic.tooltip = Dőlt szöveg hozzáadása
|
||||||
buttons.quote.tooltip = Szöveg idézése
|
buttons.quote.tooltip = Szöveg idézése
|
||||||
buttons.link.tooltip = Hivatkozás hozzáadása
|
buttons.link.tooltip = Hivatkozás hozzáadása
|
||||||
buttons.indent.tooltip = Elemek behúzása egy szinttel
|
buttons.indent.tooltip = Elemek behúzása egy szinttel
|
||||||
|
buttons.mention.tooltip = Felhasználó vagy csapat említése
|
||||||
|
buttons.list.ordered.tooltip = Számozott lista hozzáadása
|
||||||
|
buttons.list.task.tooltip = Feladatlista hozzáadása
|
||||||
|
buttons.list.unordered.tooltip = Felsorolás hozzáadása
|
||||||
|
buttons.switch_to_legacy.tooltip = A régi szerkesztő használata
|
||||||
|
buttons.unindent.tooltip = Elemek behúzásának csökkentése egy szinttel
|
||||||
|
|
||||||
[filter]
|
[filter]
|
||||||
string.asc = A - Z
|
string.asc = A - Z
|
||||||
|
@ -154,6 +197,7 @@ string.desc = Z - A
|
||||||
occurred = Hiba történt
|
occurred = Hiba történt
|
||||||
server_internal = Belső szerverhiba
|
server_internal = Belső szerverhiba
|
||||||
network_error = Hálózati hiba
|
network_error = Hálózati hiba
|
||||||
|
not_found = A cél nem található.
|
||||||
|
|
||||||
[startpage]
|
[startpage]
|
||||||
app_desc=Fájdalommentes, saját gépre telepíthető Git szolgáltatás
|
app_desc=Fájdalommentes, saját gépre telepíthető Git szolgáltatás
|
||||||
|
@ -449,7 +493,7 @@ avatar=Profilkép
|
||||||
ssh_gpg_keys=SSH / GPG kulcsok
|
ssh_gpg_keys=SSH / GPG kulcsok
|
||||||
social=Közösségi fiókok
|
social=Közösségi fiókok
|
||||||
applications=Alkalmazások
|
applications=Alkalmazások
|
||||||
orgs=Szervezetek kezelése
|
orgs=Szervezetek
|
||||||
repos=Tárolók
|
repos=Tárolók
|
||||||
delete=Fiók törlése
|
delete=Fiók törlése
|
||||||
twofa=Kétlépcsős hitelesítés
|
twofa=Kétlépcsős hitelesítés
|
||||||
|
@ -621,6 +665,7 @@ email_notifications.submit=E-mail beállítások megadása
|
||||||
|
|
||||||
visibility.public=Nyilvános
|
visibility.public=Nyilvános
|
||||||
visibility.private=Privát
|
visibility.private=Privát
|
||||||
|
appearance = Megjelenés
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
owner=Tulajdonos
|
owner=Tulajdonos
|
||||||
|
@ -744,6 +789,7 @@ file_too_large=Ez a fájl túl nagy ahhoz, hogy megjelenítsük.
|
||||||
video_not_supported_in_browser=A böngésző nem támogatja a HTML5 video tag-et.
|
video_not_supported_in_browser=A böngésző nem támogatja a HTML5 video tag-et.
|
||||||
audio_not_supported_in_browser=A böngésző nem támogatja a HTML5 audio tag-et.
|
audio_not_supported_in_browser=A böngésző nem támogatja a HTML5 audio tag-et.
|
||||||
stored_lfs=Git LFS-el eltárolva
|
stored_lfs=Git LFS-el eltárolva
|
||||||
|
stored_annex=Git Annex-el eltárolva
|
||||||
symbolic_link=Szimbolikus hivatkozás
|
symbolic_link=Szimbolikus hivatkozás
|
||||||
commit_graph=Commit gráf
|
commit_graph=Commit gráf
|
||||||
commit_graph.hide_pr_refs=Pull request-ek elrejtése
|
commit_graph.hide_pr_refs=Pull request-ek elrejtése
|
||||||
|
@ -756,6 +802,7 @@ editor.upload_file=Fájl feltöltése
|
||||||
editor.edit_file=Fájl szerkesztése
|
editor.edit_file=Fájl szerkesztése
|
||||||
editor.preview_changes=Változások előnézete
|
editor.preview_changes=Változások előnézete
|
||||||
editor.cannot_edit_lfs_files=LFS fájlok nem szerkeszthetőek a webes felületen.
|
editor.cannot_edit_lfs_files=LFS fájlok nem szerkeszthetőek a webes felületen.
|
||||||
|
editor.cannot_edit_annex_files=Annex fájlok nem szerkeszthetőek a webes felületen.
|
||||||
editor.cannot_edit_non_text_files=Bináris fájlok nem szerkeszthetőek a webes felületen.
|
editor.cannot_edit_non_text_files=Bináris fájlok nem szerkeszthetőek a webes felületen.
|
||||||
editor.edit_this_file=Fájl szerkesztése
|
editor.edit_this_file=Fájl szerkesztése
|
||||||
editor.this_file_locked=Zárolt állomány
|
editor.this_file_locked=Zárolt állomány
|
||||||
|
@ -1726,6 +1773,9 @@ runs.commit=Commit
|
||||||
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
|
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
|
||||||
symbolic_link=Szimbolikus hivatkozás
|
symbolic_link=Szimbolikus hivatkozás
|
||||||
submodule = Almodul
|
submodule = Almodul
|
||||||
|
executable_file = Futtatható fájl
|
||||||
|
normal_file = Általános fájl
|
||||||
|
directory = Könyvtár
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1740,4 +1790,15 @@ user_kind = Felhasználók keresése...
|
||||||
repo_kind = Tárak keresése...
|
repo_kind = Tárak keresése...
|
||||||
org_kind = Szervezetek keresése...
|
org_kind = Szervezetek keresése...
|
||||||
team_kind = Csapatok keresése...
|
team_kind = Csapatok keresése...
|
||||||
exact = Pontos
|
exact = Pontos
|
||||||
|
code_search_by_git_grep = A kódkeresés jelenleg a "git grep" parancsot használja. Lehet, hogy jobb találatok is lennének, ha a webhely adminisztrátora bekapcsolja a forráskód indexelését.
|
||||||
|
milestone_kind = Mérföldkövek keresése...
|
||||||
|
fuzzy_tooltip = A keresési kifejezéshez hasonló találatok mutatása
|
||||||
|
fuzzy = Hasonlók
|
||||||
|
union = Kulcsszavakra
|
||||||
|
union_tooltip = A szóközzel elválasztott kulcsszavak bármelyikét tartalmazó találatok mutatása
|
||||||
|
branch_kind = Ágak keresése...
|
||||||
|
no_results = Nincsenek megfelelő találatok.
|
||||||
|
issue_kind = Hibajegyek keresése...
|
||||||
|
exact_tooltip = Csak a keresési kifejezést pontosan tartalmazó találatok mutatása
|
||||||
|
keyword_search_unavailable = A kulcsszó alapú keresés jelenleg nem elérhető. Kérlek értesítsd az oldal rendszergazdáját.
|
|
@ -598,6 +598,7 @@ file_permalink=Permalink
|
||||||
file_too_large=Berkas terlalu besar untuk ditampilkan.
|
file_too_large=Berkas terlalu besar untuk ditampilkan.
|
||||||
|
|
||||||
stored_lfs=Tersimpan dengan GIT LFS
|
stored_lfs=Tersimpan dengan GIT LFS
|
||||||
|
stored_annex=Tersimpan dengan GIT Annex
|
||||||
commit_graph=Grafik Komit
|
commit_graph=Grafik Komit
|
||||||
blame=Salahkan
|
blame=Salahkan
|
||||||
normal_view=Pandangan Normal
|
normal_view=Pandangan Normal
|
||||||
|
@ -609,6 +610,7 @@ editor.upload_file=Unggah Berkas
|
||||||
editor.edit_file=Sunting Berkas
|
editor.edit_file=Sunting Berkas
|
||||||
editor.preview_changes=Tinjau Perubahan
|
editor.preview_changes=Tinjau Perubahan
|
||||||
editor.cannot_edit_lfs_files=Berkas LFS tidak dapat disunting dalam antarmuka web.
|
editor.cannot_edit_lfs_files=Berkas LFS tidak dapat disunting dalam antarmuka web.
|
||||||
|
editor.cannot_edit_annex_files=Berkas Annex tidak dapat disunting dalam antarmuka web.
|
||||||
editor.cannot_edit_non_text_files=Berkas biner tidak dapat disunting dalam antarmuka web.
|
editor.cannot_edit_non_text_files=Berkas biner tidak dapat disunting dalam antarmuka web.
|
||||||
editor.edit_this_file=Sunting Berkas
|
editor.edit_this_file=Sunting Berkas
|
||||||
editor.this_file_locked=Berkas terkunci
|
editor.this_file_locked=Berkas terkunci
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue