Merge branch 'master' of https://github.com/go-gitea/gitea
This commit is contained in:
commit
8a6ba47cbc
|
|
@ -604,9 +604,9 @@ ko-KR = ko
|
|||
[U2F]
|
||||
; Two Factor authentication with security keys
|
||||
; https://developers.yubico.com/U2F/App_ID.html
|
||||
APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s
|
||||
APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
|
||||
; Comma seperated list of truisted facets
|
||||
TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s
|
||||
TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
|
||||
|
||||
; Extension mapping to highlight class
|
||||
; e.g. .toml=ini
|
||||
|
|
|
|||
|
|
@ -27,659 +27,93 @@ _Symbols used in table:_
|
|||
|
||||
* _✘ - unsupported_
|
||||
|
||||
<table border="1" cellpadding="4">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Feature</td>
|
||||
<td>Gitea</td>
|
||||
<td>Gogs</td>
|
||||
<td>GitHub EE</td>
|
||||
<td>GitLab CE</td>
|
||||
<td>GitLab EE</td>
|
||||
<td>BitBucket</td>
|
||||
<td>RhodeCode CE</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Open source and free</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Issue tracker</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Pull/Merge requests</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Squash merging</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Rebase merging</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>⁄</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Pull/Merge request inline comments</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Pull/Merge request approval</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>⁄</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Merge conflict resolution</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Restrict push and merge access to certain users</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>⁄</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Markdown support</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Issues and pull/merge requests templates</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Revert specific commits or a merge request</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Labels</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Time tracking</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Multiple assignees for issues</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Related issues</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>⁄</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Confidential issues</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Comment reactions</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lock Discussion</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Batch issue handling</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Issue Boards</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create new branches from issues</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Commit graph</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Web code editor</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Branch manager</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create new branches</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Repository topics</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Repository code search</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Global code search</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Issue search</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Global issue search</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Git LFS 2.0</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>⁄</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Integrated Git-powered wiki</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Static Git-powered pages</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Group Milestones</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Granular user roles (Code, Issues, Wiki etc)</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Cherry-picking changes</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>GPG Signed Commits</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Reject unsigned commits</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Verified Committer</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>?</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Subgroups: groups within groups</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Custom Git Hooks</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Repository Activity page</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Deploy Tokens</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Repository Tokens with write rights</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Easy upgrade process</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Built-in Container Registry</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>External git mirroring</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>AD / LDAP integration</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Multiple LDAP / AD server support</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>LDAP user synchronization</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>OpenId Connect support</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>?</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>OAuth 2.0 integration (external authorization)</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>⁄</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>?</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Act as OAuth 2.0 provider</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Two factor authentication (2FA)</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>FIDO U2F (2FA)</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Webhook support</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Mattermost/Slack integration</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>⁄</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>⁄</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Discord integration</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Built-in CI/CD</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>External CI/CD status display</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Multiple database support</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>⁄</td>
|
||||
<td>⁄</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Multiple OS support</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Low resource usage (RAM/CPU)</td>
|
||||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
<td>✘</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
#### General Features
|
||||
|
||||
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|
||||
|---------|-------|------|-----------|-----------|-----------|-----------|--------------|
|
||||
| Open source and free | ✓ | ✓ | ✘| ✓ | ✘ | ✘ | ✓ |
|
||||
| Low resource usage (RAM/CPU) | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✘ |
|
||||
| Multiple database support | ✓ | ✓ | ✘ | ⁄ | ⁄ | ✓ | ✓ |
|
||||
| Multiple OS support | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✓ |
|
||||
| Easy upgrade process | ✓ | ✓ | ✘ | ✓ | ✓ | ✘ | ✓ |
|
||||
| Markdown support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Static Git-powered pages | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Integrated Git-powered wiki | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Deploy Tokens | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Repository Tokens with write rights | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ |
|
||||
| Built-in Container Registry | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
| External git mirroring | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ |
|
||||
| FIDO U2F (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Built-in CI/CD | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Subgroups: groups within groups | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✓ |
|
||||
|
||||
#### Code management
|
||||
|
||||
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|
||||
|---------|-------|------|-----------|-----------|-----------|-----------|--------------|
|
||||
| Repository topics | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Repository code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Global code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Git LFS 2.0 | ✓ | ✘ | ✓ | ✓ | ✓ | ⁄ | ✓ |
|
||||
| Group Milestones | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Granular user roles (Code, Issues, Wiki etc) | ✓ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Verified Committer | ✘ | ✘ | ? | ✓ | ✓ | ✓ | ✘ |
|
||||
| GPG Signed Commits | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Reject unsigned commits | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ |
|
||||
| Repository Activity page | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Branch manager | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Create new branches | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Web code editor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Commit graph | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
|
||||
#### Issue Tracker
|
||||
|
||||
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|
||||
|---------|-------|------|-----------|-----------|-----------|-----------|--------------|
|
||||
| Issue tracker | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Issue templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Labels | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Time tracking | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Multiple assignees for issues | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Related issues | ✘ | ✘ | ⁄ | ✘ | ✓ | ✘ | ✘ |
|
||||
| Confidential issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Comment reactions | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Lock Discussion | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Batch issue handling | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Issue Boards | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Create new branches from issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Issue search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Global issue search | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
|
||||
#### Pull/Merge requests
|
||||
|
||||
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|
||||
|---------|-------|------|-----------|-----------|-----------|-----------|--------------|
|
||||
| Pull/Merge requests | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Squash merging | ✓ | ✘ | ✓ | ✘ | ✓ | ✓ | ✓ |
|
||||
| Rebase merging | ✓ | ✓ | ✓ | ✘ | ⁄ | ✘ | ✓ |
|
||||
| Pull/Merge request inline comments | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Pull/Merge request approval | ✘ | ✘ | ⁄ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Merge conflict resolution | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Restrict push and merge access to certain users | ✓ | ✘ | ✓ | ⁄ | ✓ | ✓ | ✓ |
|
||||
| Revert specific commits or a merge request | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Pull/Merge requests templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||
| Cherry-picking changes | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
|
||||
|
||||
|
||||
#### 3rd-party integrations
|
||||
|
||||
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|
||||
|---------|-------|------|-----------|-----------|-----------|-----------|--------------|
|
||||
| Webhook support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Custom Git Hooks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| AD / LDAP integration | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| Multiple LDAP / AD server support | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ |
|
||||
| LDAP user synchronization | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
| OpenId Connect support | ✓ | ✘ | ✓ | ✓ | ✓ | ? | ✘ |
|
||||
| OAuth 2.0 integration (external authorization) | ✓ | ✘ | ⁄ | ✓ | ✓ | ? | ✓ |
|
||||
| Act as OAuth 2.0 provider | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Two factor authentication (2FA) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
|
||||
| Mattermost/Slack integration | ✓ | ✓ | ⁄ | ✓ | ✓ | ⁄ | ✓ |
|
||||
| Discord integration | ✓ | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ |
|
||||
| External CI/CD status display | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
|
|
|
|||
|
|
@ -71,3 +71,15 @@ func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error
|
|||
Find(&watches)
|
||||
return
|
||||
}
|
||||
|
||||
func removeIssueWatchersByRepoID(e Engine, userID int64, repoID int64) error {
|
||||
iw := &IssueWatch{
|
||||
IsWatching: false,
|
||||
}
|
||||
_, err := e.
|
||||
Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", repoID).
|
||||
Cols("is_watching", "updated_unix").
|
||||
Where("`issue_watch`.user_id = ?", userID).
|
||||
Update(iw)
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -187,6 +187,8 @@ var migrations = []Migration{
|
|||
// v66 -> v67
|
||||
NewMigration("add login source id column for public_key table", addLoginSourceIDToPublicKeyTable),
|
||||
// v67 -> v68
|
||||
NewMigration("remove stale watches", removeStaleWatches),
|
||||
// v68 -> v69
|
||||
NewMigration("add issue_dependencies", addIssueDependencies),
|
||||
}
|
||||
|
||||
|
|
|
|||
158
models/migrations/v67.go
Normal file
158
models/migrations/v67.go
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
// Copyright 2018 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
|
||||
"github.com/go-xorm/xorm"
|
||||
)
|
||||
|
||||
func removeStaleWatches(x *xorm.Engine) error {
|
||||
type Watch struct {
|
||||
ID int64
|
||||
UserID int64
|
||||
RepoID int64
|
||||
}
|
||||
|
||||
type IssueWatch struct {
|
||||
ID int64
|
||||
UserID int64
|
||||
RepoID int64
|
||||
IsWatching bool
|
||||
}
|
||||
|
||||
type Repository struct {
|
||||
ID int64
|
||||
IsPrivate bool
|
||||
OwnerID int64
|
||||
}
|
||||
|
||||
type Access struct {
|
||||
UserID int64
|
||||
RepoID int64
|
||||
Mode int
|
||||
}
|
||||
|
||||
const (
|
||||
// AccessModeNone no access
|
||||
AccessModeNone int = iota // 0
|
||||
// AccessModeRead read access
|
||||
AccessModeRead // 1
|
||||
)
|
||||
|
||||
accessLevel := func(userID int64, repo *Repository) (int, error) {
|
||||
mode := AccessModeNone
|
||||
if !repo.IsPrivate {
|
||||
mode = AccessModeRead
|
||||
}
|
||||
|
||||
if userID == 0 {
|
||||
return mode, nil
|
||||
}
|
||||
|
||||
if userID == repo.OwnerID {
|
||||
return 4, nil
|
||||
}
|
||||
|
||||
a := &Access{UserID: userID, RepoID: repo.ID}
|
||||
if has, err := x.Get(a); !has || err != nil {
|
||||
return mode, err
|
||||
}
|
||||
return a.Mode, nil
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err := sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
repoCache := make(map[int64]*Repository)
|
||||
err := x.BufferSize(setting.IterateBufferSize).Iterate(new(Watch),
|
||||
func(idx int, bean interface{}) error {
|
||||
watch := bean.(*Watch)
|
||||
|
||||
repo := repoCache[watch.RepoID]
|
||||
if repo == nil {
|
||||
repo = &Repository{
|
||||
ID: watch.RepoID,
|
||||
}
|
||||
if _, err := x.Get(repo); err != nil {
|
||||
return err
|
||||
}
|
||||
repoCache[watch.RepoID] = repo
|
||||
}
|
||||
|
||||
// Remove watches from now unaccessible repositories
|
||||
mode, err := accessLevel(watch.UserID, repo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
has := AccessModeRead <= mode
|
||||
if has {
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err = sess.Delete(&Watch{0, watch.UserID, repo.ID}); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = sess.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", repo.ID)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
repoCache = make(map[int64]*Repository)
|
||||
err = x.BufferSize(setting.IterateBufferSize).
|
||||
Distinct("issue_watch.user_id", "issue.repo_id").
|
||||
Join("INNER", "issue", "issue_watch.issue_id = issue.id").
|
||||
Where("issue_watch.is_watching = ?", true).
|
||||
Iterate(new(IssueWatch),
|
||||
func(idx int, bean interface{}) error {
|
||||
watch := bean.(*IssueWatch)
|
||||
|
||||
repo := repoCache[watch.RepoID]
|
||||
if repo == nil {
|
||||
repo = &Repository{
|
||||
ID: watch.RepoID,
|
||||
}
|
||||
if _, err := x.Get(repo); err != nil {
|
||||
return err
|
||||
}
|
||||
repoCache[watch.RepoID] = repo
|
||||
}
|
||||
|
||||
// Remove issue watches from now unaccssible repositories
|
||||
mode, err := accessLevel(watch.UserID, repo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
has := AccessModeRead <= mode
|
||||
if has {
|
||||
return nil
|
||||
}
|
||||
|
||||
iw := &IssueWatch{
|
||||
IsWatching: false,
|
||||
}
|
||||
|
||||
_, err = sess.
|
||||
Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", watch.RepoID).
|
||||
Cols("is_watching", "updated_unix").
|
||||
Where("`issue_watch`.user_id = ?", watch.UserID).
|
||||
Update(iw)
|
||||
|
||||
return err
|
||||
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
|
@ -178,6 +178,11 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e
|
|||
if err = watchRepo(e, teamUser.UID, repo.ID, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Remove all IssueWatches a user has subscribed to in the repositories
|
||||
if err := removeIssueWatchersByRepoID(e, teamUser.UID, repo.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
@ -374,11 +379,34 @@ func DeleteTeam(t *Team) error {
|
|||
return err
|
||||
}
|
||||
|
||||
if err := t.getMembers(sess); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete all accesses.
|
||||
for _, repo := range t.Repos {
|
||||
if err := repo.recalculateTeamAccesses(sess, t.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Remove watches from all users and now unaccessible repos
|
||||
for _, user := range t.Members {
|
||||
has, err := hasAccess(sess, user.ID, repo, AccessModeRead)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if has {
|
||||
continue
|
||||
}
|
||||
|
||||
if err = watchRepo(sess, user.ID, repo.ID, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Remove all IssueWatches a user has subscribed to in the repositories
|
||||
if err = removeIssueWatchersByRepoID(sess, user.ID, repo.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Delete team-repo
|
||||
|
|
@ -518,6 +546,10 @@ func AddTeamMember(team *Team, userID int64) error {
|
|||
if err := repo.recalculateTeamAccesses(sess, 0); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = watchRepo(sess, userID, repo.ID, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
|
|
@ -558,6 +590,23 @@ func removeTeamMember(e *xorm.Session, team *Team, userID int64) error {
|
|||
if err := repo.recalculateTeamAccesses(e, 0); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Remove watches from now unaccessible
|
||||
has, err := hasAccess(e, userID, repo, AccessModeRead)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if has {
|
||||
continue
|
||||
}
|
||||
|
||||
if err = watchRepo(e, userID, repo.ID, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Remove all IssueWatches a user has subscribed to in the repositories
|
||||
if err := removeIssueWatchersByRepoID(e, userID, repo.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the user is a member of any team in the organization.
|
||||
|
|
|
|||
|
|
@ -1855,6 +1855,9 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
|
|||
if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err = sess.In("issue_id", issueIDs).Delete(&IssueWatch{}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
attachments := make([]*Attachment, 0, 5)
|
||||
if err = sess.
|
||||
|
|
|
|||
|
|
@ -172,5 +172,14 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) {
|
|||
return err
|
||||
}
|
||||
|
||||
if err = watchRepo(sess, uid, repo.ID, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Remove all IssueWatches a user has subscribed to in the repository
|
||||
if err := removeIssueWatchersByRepoID(sess, uid, repo.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,12 +83,12 @@ host=Host
|
|||
user=Benutzername
|
||||
password=Passwort
|
||||
db_name=Datenbankname
|
||||
db_helper=Hinweis für MySQL-Benutzer: Bitte verwende das InnoDB Speichersubsystem und den Zeichensatz "utf8_general_ci".
|
||||
db_helper=Hinweis für MySQL-Benutzer: Bitte verwende das InnoDB-Speichersubsystem und den Zeichensatz „utf8_general_ci“.
|
||||
ssl_mode=SSL
|
||||
path=Pfad
|
||||
sqlite_helper=Der Dateipfad zur SQLite3- oder TiDB-Datenbank. <br>Bitte verwende einen absoluten Pfad, wenn Gitea als Service gestartet wird.
|
||||
err_empty_db_path=Der SQLite3 oder TiDB Datenbankpfad darf nicht leer sein.
|
||||
err_invalid_tidb_name=Der TiDB Datenbankname darf nicht die Zeichen "." und "-" enthalten.
|
||||
err_empty_db_path=Der SQLite3- oder TiDB-Datenbankpfad darf nicht leer sein.
|
||||
err_invalid_tidb_name=Der TiDB-Datenbankname darf nicht die Zeichen „.“ und „-“ enthalten.
|
||||
no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen.
|
||||
err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein.
|
||||
|
||||
|
|
@ -101,13 +101,13 @@ lfs_path=Git LFS-Wurzelpfad
|
|||
lfs_path_helper=In diesem Verzeichnis werden die Dateien von Git LFS abgespeichert. Leer lassen um LFS zu deaktivieren.
|
||||
run_user=Ausführen als
|
||||
run_user_helper=Gebe den Betriebssystem-Benutzernamen ein, unter welchem Gitea laufen soll. Beachte, dass dieser Nutzer Zugriff auf den Repository-Ordner haben muss.
|
||||
domain=SSH Server-Domain
|
||||
domain=SSH-Server-Domain
|
||||
domain_helper=Domain oder Host-Adresse für die SSH-URL.
|
||||
ssh_port=SSH Server Port
|
||||
ssh_port=SSH-Server-Port
|
||||
ssh_port_helper=Der Port deines SSH-Servers. Leer lassen um SSH zu deaktivieren.
|
||||
http_port=Gitea HTTP-Listen-Port
|
||||
http_port_helper=Port unter dem der Gitea Web Server laufen soll.
|
||||
app_url=Gitea Basis-URL
|
||||
http_port=Gitea-HTTP-Listen-Port
|
||||
http_port_helper=Port, unter dem der Gitea-Webserver laufen soll.
|
||||
app_url=Gitea-Basis-URL
|
||||
app_url_helper=Adresse für HTTP(S)-Klon-URLs und E-Mail-Benachrichtigungen.
|
||||
log_root_path=Logdateipfad
|
||||
log_root_path_helper=Log-Dateien werden in diesem Verzeichnis gespeichert.
|
||||
|
|
@ -117,8 +117,8 @@ email_title=E-Mail-Einstellungen
|
|||
smtp_host=SMTP-Server
|
||||
smtp_from=E-Mail senden als
|
||||
smtp_from_helper=E-Mail-Adresse, die von Gitea genutzt werden soll. Bitte gib die E-Mail-Adresse im '"Name" <email@example.com>'-Format ein.
|
||||
mailer_user=SMTP Benutzername
|
||||
mailer_password=SMTP Passwort
|
||||
mailer_user=SMTP-Benutzername
|
||||
mailer_password=SMTP-Passwort
|
||||
register_confirm=E-Mail-Bestätigung benötigt zum Registrieren
|
||||
mail_notify=E-Mail-Benachrichtigungen aktivieren
|
||||
server_service_title=Sonstige Server- und Drittserviceeinstellungen
|
||||
|
|
@ -131,9 +131,9 @@ federated_avatar_lookup_popup=Föderierte Profilbilder via Libravatar aktivieren
|
|||
disable_registration=Registrierung deaktivieren
|
||||
disable_registration_popup=Registrierung neuer Benutzer deaktivieren. Nur Administratoren werden neue Benutzerkonten anlegen können.
|
||||
allow_only_external_registration_popup=Registrierung nur über externe Services aktiveren.
|
||||
openid_signin=OpenID Anmeldung aktivieren
|
||||
openid_signin=OpenID-Anmeldung aktivieren
|
||||
openid_signin_popup=Benutzeranmeldung via OpenID aktivieren.
|
||||
openid_signup=OpenID Selbstregistrierung aktivieren
|
||||
openid_signup=OpenID-Selbstregistrierung aktivieren
|
||||
openid_signup_popup=OpenID-basierte Selbstregistrierung aktivieren.
|
||||
enable_captcha=CAPTCHA aktivieren
|
||||
enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich.
|
||||
|
|
@ -147,10 +147,10 @@ confirm_password=Passwort bestätigen
|
|||
admin_email=E-Mail-Adresse
|
||||
install_btn_confirm=Gitea installieren
|
||||
test_git_failed=Fehler beim Test des 'git' Kommandos: %v
|
||||
sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die 'gobuild'-Version).
|
||||
sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die „gobuild“-Version).
|
||||
invalid_db_setting=Datenbankeinstellungen sind ungültig: %v
|
||||
invalid_repo_path=Repository-Verzeichnis ist ungültig: %v
|
||||
run_user_not_match=Der "Ausführen als" Benutzer ist nicht der aktuelle Benutzer: %s -> %s
|
||||
run_user_not_match=Der „Ausführen als“-Benutzername ist nicht der aktuelle Benutzername: %s -> %s
|
||||
save_config_failed=Fehler beim Speichern der Konfiguration: %v
|
||||
invalid_admin_setting=Administrator-Konto Einstellungen sind ungültig: %v
|
||||
install_success=Willkommen! Danke, dass du Gitea gewählt hast. Viel Spaß!
|
||||
|
|
@ -162,7 +162,7 @@ default_allow_create_organization_popup=Neuen Nutzern das Erstellen von Organisa
|
|||
default_enable_timetracking=Zeiterfassung standardmäßig aktivieren
|
||||
default_enable_timetracking_popup=Zeiterfassung standardmäßig für neue Repositories aktivieren.
|
||||
no_reply_address=Versteckte E-Mail-Domain
|
||||
no_reply_address_helper=Domain-Namen für Benutzer mit einer versteckten Emailadresse. Zum Beispiel wird der Benutzername "Joe" in Git als "joe@noreply.example.org" protokolliert, wenn die versteckte E-Mail-Domäne "noreply.example.org" festgelegt ist.
|
||||
no_reply_address_helper=Domain-Name für Benutzer mit einer versteckten Emailadresse. Zum Beispiel wird der Benutzername „Joe“ in Git als „joe@noreply.example.org“ protokolliert, wenn die versteckte E-Mail-Domain „noreply.example.org“ festgelegt ist.
|
||||
|
||||
[home]
|
||||
uname_holder=E-Mail-Adresse oder Benutzername
|
||||
|
|
@ -225,9 +225,9 @@ login_userpass=Anmelden
|
|||
login_openid=OpenID
|
||||
openid_connect_submit=Verbinden
|
||||
openid_connect_title=Mit bestehendem Konto verbinden
|
||||
openid_connect_desc=Die gewählte OpenID URI ist unbekannt. Ordne sie hier einem neuen Account zu.
|
||||
openid_connect_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu.
|
||||
openid_register_title=Neues Konto einrichten
|
||||
openid_register_desc=Die gewählte OpenID URI ist unbekannt. Ordne sie hier einem neuen Account zu.
|
||||
openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu.
|
||||
openid_signin_desc=Gib deine OpenID-URI ein. Zum Beispiel: https://anne.me, bob.openid.org.cn oder gnusocial.net/carry.
|
||||
disable_forgot_password_mail=Das Zurücksetzen von Passwörtern wurde deaktiviert. Bitte wende dich an den Administrator.
|
||||
|
||||
|
|
@ -264,8 +264,8 @@ TreeName=Dateipfad
|
|||
Content=Inhalt
|
||||
|
||||
require_error=` darf nicht leer sein.`
|
||||
alpha_dash_error=` sollte nur Buchstaben, Zahlen, Bindestriche ('-') und Unterstriche ('_') enthalten`
|
||||
alpha_dash_dot_error=` sollte nur Buchstaben, Zahlen, Bindestriche ('-'), Unterstriche ('_') und Punkte ('.') enthalten`
|
||||
alpha_dash_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“) und Unterstriche („_“) enthalten.`
|
||||
alpha_dash_dot_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“), Unterstriche („_“) und Punkte („.“) enthalten.`
|
||||
git_ref_name_error=` muss ein wohlgeformter Git-Referenzname sein.`
|
||||
size_error=` muss die Größe %s haben.`
|
||||
min_size_error=` muss mindestens %s Zeichen enthalten.`
|
||||
|
|
@ -283,13 +283,13 @@ org_name_been_taken=Der Organisationsname ist bereits vergeben.
|
|||
team_name_been_taken=Der Teamname ist bereits vergeben.
|
||||
team_no_units_error=Das Team muss auf mindestens einen Bereich Zugriff haben.
|
||||
email_been_used=Die E-Mail-Adresse wird bereits verwendet.
|
||||
openid_been_used=Die OpenID-Adresse "%s" wird bereits verwendet.
|
||||
openid_been_used=Die OpenID-Adresse „%s“ wird bereits verwendet.
|
||||
username_password_incorrect=Benutzername oder Passwort ist falsch.
|
||||
enterred_invalid_repo_name=Der eingegebenen Repository-Name ist falsch.
|
||||
enterred_invalid_owner_name=Der Name des neuen Besitzers ist invalid.
|
||||
enterred_invalid_owner_name=Der Name des neuen Besitzers ist ungültig.
|
||||
enterred_invalid_password=Das eingegebene Passwort ist falsch.
|
||||
user_not_exist=Dieser Benutzer ist nicht vorhanden.
|
||||
last_org_owner=Du kannst den letzten Benutzer nicht aus dem "Besitzer"-Team entferenen. Es muss mindestens ein Besitzer in einer Organisation geben.
|
||||
last_org_owner=Du kannst den letzten Benutzer nicht aus dem „Besitzer“-Team entfernen. Es muss mindestens einen Besitzer in einer Organisation geben.
|
||||
cannot_add_org_to_team=Eine Organisation kann nicht als Teammitglied hinzugefügt werden.
|
||||
|
||||
invalid_ssh_key=Dein SSH-Key kann nicht überprüft werden: %s
|
||||
|
|
@ -349,7 +349,7 @@ continue=Weiter
|
|||
cancel=Abbrechen
|
||||
language=Sprache
|
||||
|
||||
lookup_avatar_by_mail=Avatar anhand der E-Mail-Addresse suchen
|
||||
lookup_avatar_by_mail=Profilbild anhand der E-Mail-Addresse suchen
|
||||
federated_avatar_lookup=Suche nach föderierten Profilbildern
|
||||
enable_custom_avatar=Benutzerdefiniertes Profilbild benutzen
|
||||
choose_new_avatar=Neues Profilbild auswählen
|
||||
|
|
@ -364,7 +364,7 @@ new_password=Neues Passwort
|
|||
retype_new_password=Neues Passwort erneut eingeben
|
||||
password_incorrect=Das aktuelle Passwort ist falsch.
|
||||
change_password_success=Dein Passwort wurde aktualisiert. Bitte verwende dieses beim nächsten Einloggen.
|
||||
password_change_disabled=Benutzer, die nicht von Gitea verwaltet werden, können ihr Passwort im Web Interface nicht ändern.
|
||||
password_change_disabled=Benutzer, die nicht von Gitea verwaltet werden, können ihr Passwort im Web-Interface nicht ändern.
|
||||
|
||||
emails=E-Mail-Adressen
|
||||
manage_emails=E-Mail-Adressen verwalten
|
||||
|
|
@ -383,7 +383,7 @@ add_new_email=Neue E-Mail-Adresse hinzufügen
|
|||
add_new_openid=Neue OpenID-URI hinzufügen
|
||||
add_email=E-Mail-Adresse hinzufügen
|
||||
add_openid=OpenID-URI hinzufügen
|
||||
add_email_confirmation_sent=Eine Bestätigungs-E-Mail wurde an '%s' gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die E-Mail-Adresse zu bestätigen.
|
||||
add_email_confirmation_sent=Eine Bestätigungs-E-Mail wurde an „%s“ gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die E-Mail-Adresse zu bestätigen.
|
||||
add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt.
|
||||
add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt.
|
||||
keep_email_private=E-Mail-Adresse verbergen
|
||||
|
|
@ -394,8 +394,8 @@ manage_ssh_keys=SSH-Schlüssel verwalten
|
|||
manage_gpg_keys=GPG-Schlüssel verwalten
|
||||
add_key=Schlüssel hinzufügen
|
||||
ssh_desc=Diese öffentlichen SSH-Keys sind mit deinem Account verbunden. Der dazugehörigen privaten SSH-Keys geben dir vollen Zugriff auf deine Repositories.
|
||||
gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden. Halte die dazugehörigen privaten SSH-Keys geheim, da diese deine Commits signieren.
|
||||
ssh_helper=<strong>Brauchst du Hilfe?</strong> Hier ist Githubs Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder <a href="%s">Lösen einfacher SSH-Probleme</a>.
|
||||
gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden. Halte die dazugehörigen privaten GPG-Keys geheim, da diese deine Commits signieren.
|
||||
ssh_helper=<strong>Brauchst du Hilfe?</strong> Hier ist GitHubs Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder zum <a href="%s">Lösen einfacher SSH-Probleme</a>.
|
||||
gpg_helper=<strong>Brauchst du Hilfe?</strong> Hier ist GitHubs Anleitung <a href="%s">über GPG</a>.
|
||||
add_new_key=SSH-Schlüssel hinzufügen
|
||||
add_new_gpg_key=GPG-Schlüssel hinzufügen
|
||||
|
|
@ -407,8 +407,8 @@ subkeys=Unterschlüssel
|
|||
key_id=Schlüssel-ID
|
||||
key_name=Schlüsselname
|
||||
key_content=Inhalt
|
||||
add_key_success=Der SSH-Schlüssel "%s" wurde hinzugefügt.
|
||||
add_gpg_key_success=Der GPG-Key "%s" wurde hinzugefügt.
|
||||
add_key_success=Der SSH-Schlüssel „%s“ wurde hinzugefügt.
|
||||
add_gpg_key_success=Der GPG-Key „%s“ wurde hinzugefügt.
|
||||
delete_key=Entfernen
|
||||
ssh_key_deletion=SSH-Schlüssel entfernen
|
||||
gpg_key_deletion=GPG-Schlüssel entfernen
|
||||
|
|
@ -511,10 +511,10 @@ create_repo=Repository erstellen
|
|||
default_branch=Standardbranch
|
||||
mirror_prune=Entfernen
|
||||
mirror_prune_desc=Entferne veraltete remote-tracking Referenzen
|
||||
mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind 'h', 'm', 's')
|
||||
mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind „h“, „m“, „s“)
|
||||
mirror_interval_invalid=Das Spiegel-Intervall ist ungültig.
|
||||
mirror_address=Klonen via URL
|
||||
mirror_address_desc=Bitte gebe alle benötigten Zugangsdaten in der URL an.
|
||||
mirror_address_desc=Bitte gib alle benötigten Zugangsdaten in der URL an.
|
||||
mirror_last_synced=Zuletzt synchronisiert
|
||||
watchers=Beobachter
|
||||
stargazers=Favorisiert von
|
||||
|
|
@ -523,7 +523,7 @@ pick_reaction=Wähle eine Reaktion
|
|||
reactions_more=und %d weitere
|
||||
|
||||
form.reach_limit_of_creation=Du hast bereits dein Limit von %d Repositories erreicht.
|
||||
form.name_reserved=Der Repository-Name '%s' ist reserviert.
|
||||
form.name_reserved=Der Repository-Name „%s“ ist reserviert.
|
||||
form.name_pattern_not_allowed='%s' ist nicht erlaubt für Repository-Namen.
|
||||
|
||||
need_auth=Authentifizierung zum Klonen benötigt
|
||||
|
|
@ -598,31 +598,31 @@ editor.filename_help=Füge einen Ordner hinzu, indem du seinen Namen und anschli
|
|||
editor.or=oder
|
||||
editor.cancel_lower=Abbrechen
|
||||
editor.commit_changes=Änderungen committen
|
||||
editor.add_tmpl='%s/<filename>' hinzufügen
|
||||
editor.add='%s' hinzufügen
|
||||
editor.update='%s' ändern
|
||||
editor.delete='%s' löschen
|
||||
editor.add_tmpl=„%s/<filename>“ hinzufügen
|
||||
editor.add=„%s“ hinzufügen
|
||||
editor.update=„%s“ ändern
|
||||
editor.delete=„%s“ löschen
|
||||
editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen…
|
||||
editor.commit_directly_to_this_branch=Direkt in die <strong class="branch-name">%s</strong>-Branch einchecken.
|
||||
editor.create_new_branch=Einen <strong>neue Branch</strong> für diesen Commit erstellen und einen Pull Request starten.
|
||||
editor.commit_directly_to_this_branch=Direkt in den Branch „<strong class="branch-name">%s</strong>“ einchecken.
|
||||
editor.create_new_branch=Einen <strong>neuen Branch</strong> für diesen Commit erstellen und einen Pull Request starten.
|
||||
editor.new_branch_name_desc=Neuer Branchname…
|
||||
editor.cancel=Abbrechen
|
||||
editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein.
|
||||
editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository.
|
||||
editor.directory_is_a_file=Der Verzeichnisname '%s' wird bereits als Dateiname in diesem Repository verwendet.
|
||||
editor.directory_is_a_file=Der Verzeichnisname „%s“ wird bereits als Dateiname in diesem Repository verwendet.
|
||||
editor.file_is_a_symlink='%s' ist ein symolischer Link. Symbolische Links können mit dem Web Editor nicht bearbeitet werden.
|
||||
editor.filename_is_a_directory=Der Dateiname '%s' wird bereits als Verzeichnisname in diesem Repository verwendet.
|
||||
editor.file_editing_no_longer_exists=Die bearbeitete Datei '%s' existiert nicht mehr in diesem Repository.
|
||||
editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. <a target="_blank" rel="noopener" href="%s">Hier klicken</a> um die Änderungen anzusehen, oder <strong>Änderungen erneut comitten</strong> um sie zu überschreiben.
|
||||
editor.file_already_exists=Eine Datei mit dem Namen '%s' ist bereits in diesem Repository vorhanden.
|
||||
editor.filename_is_a_directory=Der Dateiname „%s“ wird bereits als Verzeichnisname in diesem Repository verwendet.
|
||||
editor.file_editing_no_longer_exists=Die bearbeitete Datei „%s“ existiert nicht mehr in diesem Repository.
|
||||
editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. <a target="_blank" rel="noopener" href="%s">Hier klicken</a>, um die Änderungen anzusehen, oder <strong>Änderungen erneut comitten</strong>, um sie zu überschreiben.
|
||||
editor.file_already_exists=Eine Datei mit dem Namen „%s“ ist bereits in diesem Repository vorhanden.
|
||||
editor.no_changes_to_show=Keine Änderungen vorhanden.
|
||||
editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v
|
||||
editor.add_subdir=Verzeichnis erstellen…
|
||||
editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach '%s'. Fehler: %v
|
||||
editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach „%s“. Fehler: %v
|
||||
editor.upload_files_to_dir=Dateien hochladen nach '%s'
|
||||
editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch '%s' ist nicht möglich.
|
||||
editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch „%s“ ist nicht möglich.
|
||||
|
||||
commits.desc=Durchsuche die Quellcode Änderungshistorie.
|
||||
commits.desc=Durchsuche die Quellcode-Änderungshistorie.
|
||||
commits.commits=Commits
|
||||
commits.search=Commits durchsuchen…
|
||||
commits.find=Suchen
|
||||
|
|
@ -633,7 +633,7 @@ commits.date=Datum
|
|||
commits.older=Älter
|
||||
commits.newer=Neuer
|
||||
commits.signed_by=Signiert von
|
||||
commits.gpg_key_id=GPG Schlüssel-ID
|
||||
commits.gpg_key_id=GPG-Schlüssel-ID
|
||||
|
||||
ext_issues=Externe Issues
|
||||
ext_issues.desc=Link zu externem Issuetracker.
|
||||
|
|
@ -768,10 +768,10 @@ issues.cancel_tracking_history=hat die Zeiterfassung %s abgebrochen
|
|||
issues.time_spent_total=Zeitaufwand insgesamt
|
||||
issues.time_spent_from_all_authors=`Aufgewendete Zeit: %s`
|
||||
issues.due_date=Fällig am
|
||||
issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format 'JJJJ-MM-TT' haben.
|
||||
issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben.
|
||||
issues.error_modifying_due_date=Fehler beim Ändern des Fälligkeitsdatums.
|
||||
issues.error_removing_due_date=Fehler beim Entfernen des Fälligkeitsdatums.
|
||||
issues.due_date_form=jjjj-mm-tt
|
||||
issues.due_date_form=JJJJ-MM-TT
|
||||
issues.due_date_form_add=Fälligkeitsdatum hinzufügen
|
||||
issues.due_date_form_update=Fälligkeitsdatum ändern
|
||||
issues.due_date_form_remove=Fälligkeitsdatum löschen
|
||||
|
|
@ -787,7 +787,7 @@ pulls.new=Neuer Pull-Request
|
|||
pulls.compare_changes=Neuer Pull-Request
|
||||
pulls.compare_changes_desc=Wähle die Ziel- und Quellbranch aus.
|
||||
pulls.compare_base=Ziel
|
||||
pulls.compare_compare=pull von
|
||||
pulls.compare_compare=pullen von
|
||||
pulls.filter_branch=Branch filtern
|
||||
pulls.no_results=Keine Ergebnisse verfügbar.
|
||||
pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Request erstellt werden.
|
||||
|
|
@ -827,13 +827,13 @@ milestones.title=Titel
|
|||
milestones.desc=Beschreibung
|
||||
milestones.due_date=Fälligkeitsdatum (optional)
|
||||
milestones.clear=Feld leeren
|
||||
milestones.invalid_due_date_format=Das Fälligkeitsdatum muss das Format 'JJJJ-MM-TT' haben.
|
||||
milestones.create_success=Der Meilenstein '%s' wurde erstellt.
|
||||
milestones.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben.
|
||||
milestones.create_success=Der Meilenstein „%s“ wurde erstellt.
|
||||
milestones.edit=Meilenstein bearbeiten
|
||||
milestones.edit_subheader=Benutze Meilensteine, um Issues zu organisieren und den Fortschritt darzustellen.
|
||||
milestones.cancel=Abbrechen
|
||||
milestones.modify=Meilenstein bearbeiten
|
||||
milestones.edit_success=Die Änderungen am Meilenstein "%s" wurden gespeichert.
|
||||
milestones.edit_success=Die Änderungen am Meilenstein „%s“ wurden gespeichert.
|
||||
milestones.deletion=Meilenstein löschen
|
||||
milestones.deletion_desc=Das Löschen des Meilensteins entfernt ihn von allen Issues. Fortfahren?
|
||||
milestones.deletion_success=Der Meilenstein wurde gelöscht.
|
||||
|
|
@ -849,7 +849,7 @@ ext_wiki.desc=Verweis auf externes Wiki.
|
|||
|
||||
wiki=Wiki
|
||||
wiki.welcome=Willkommen im Wiki.
|
||||
wiki.welcome_desc=Im Wiki kannst Dokumentation schreiben und mit Mitarbeitern teilen.
|
||||
wiki.welcome_desc=Im Wiki kannst du Dokumentation schreiben und sie mit Mitarbeitern teilen.
|
||||
wiki.desc=Schreibe und teile Dokumentation mit Mitarbeitern.
|
||||
wiki.create_first_page=Erstelle die erste Seite
|
||||
wiki.page=Seite
|
||||
|
|
@ -861,9 +861,9 @@ wiki.last_commit_info=%s hat diese Seite bearbeitet %s
|
|||
wiki.edit_page_button=Bearbeiten
|
||||
wiki.new_page_button=Neue Seite
|
||||
wiki.delete_page_button=Seite löschen
|
||||
wiki.delete_page_notice_1=Das Löschen der Wiki-Seite '%s' kann nicht Rückgängig gemacht werden. Fortfahren?
|
||||
wiki.delete_page_notice_1=Das Löschen der Wiki-Seite „%s“ kann nicht rückgängig gemacht werden. Fortfahren?
|
||||
wiki.page_already_exists=Eine Wiki-Seite mit dem gleichen Namen existiert bereits.
|
||||
wiki.reserved_page=Der Wiki-Seitenname "%s" ist reserviert.
|
||||
wiki.reserved_page=Der Wiki-Seitenname „%s“ ist reserviert.
|
||||
wiki.pages=Seiten
|
||||
wiki.last_updated=Zuletzt aktualisiert %s
|
||||
|
||||
|
|
@ -911,7 +911,7 @@ activity.published_release_label=Veröffentlicht
|
|||
|
||||
search=Suchen
|
||||
search.search_repo=Repository durchsuchen
|
||||
search.results=Suchergebnisse für "%s" in <a href="%s"> %s</a>
|
||||
search.results=Suchergebnisse für „%s“ in <a href="%s"> %s</a>
|
||||
|
||||
settings=Einstellungen
|
||||
settings.desc=In den Einstellungen kannst du die Einstellungen des Repository anpassen
|
||||
|
|
@ -925,28 +925,28 @@ settings.hooks=Webhooks
|
|||
settings.githooks=Git-Hooks
|
||||
settings.basic_settings=Grundeinstellungen
|
||||
settings.mirror_settings=Mirror Einstellungen
|
||||
settings.sync_mirror=Jetzt Synchronisieren
|
||||
settings.sync_mirror=Jetzt synchronisieren
|
||||
settings.mirror_sync_in_progress=Mirror-Synchronisierung wird zurzeit ausgeführt. Komm in ein paar Minuten zurück.
|
||||
settings.site=Webseite
|
||||
settings.update_settings=Einstellungen speichern
|
||||
settings.advanced_settings=Erweiterte Einstellungen
|
||||
settings.wiki_desc=Repository Wiki aktivieren
|
||||
settings.wiki_desc=Repository-Wiki aktivieren
|
||||
settings.use_internal_wiki=Eingebautes Wiki verwenden
|
||||
settings.use_external_wiki=Externes Wiki verwenden
|
||||
settings.external_wiki_url=Externe Wiki URL
|
||||
settings.external_wiki_url_error=Die externe Wiki-URL ist ungültig.
|
||||
settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet wenn sie auf das Wiki-Tab klicken.
|
||||
settings.issues_desc=Repository Issue-Tracker aktivieren
|
||||
settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet, wenn sie auf das Wiki-Tab klicken.
|
||||
settings.issues_desc=Repository-Issue-Tracker aktivieren
|
||||
settings.use_internal_issue_tracker=Integrierten Issue-Tracker verwenden
|
||||
settings.use_external_issue_tracker=Externen Issue-Tracker verwenden
|
||||
settings.external_tracker_url=URL eines externen Issue Trackers
|
||||
settings.external_tracker_url_error=Die URL des externen Issue-Trackers ist ungültig.
|
||||
settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet wenn sie auf das Issues-Tab klicken.
|
||||
settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet, wenn sie auf das Issues-Tab klicken.
|
||||
settings.tracker_url_format=URL-Format des externen Issue-Systems
|
||||
settings.tracker_issue_style=Namenskonvention des externen Issue-Trackers
|
||||
settings.tracker_issue_style.numeric=Numerisch
|
||||
settings.tracker_issue_style.alphanumeric=Alphanumerisch
|
||||
settings.tracker_url_format_desc=Du kannst die Platzhalter <code>{user}</code>, <code>{repo}</code>, <code>{index}</code> für den Benutzernamen, den Namen des Repositories und die Issue-Nummer verwenden.
|
||||
settings.tracker_url_format_desc=Du kannst die Platzhalter <code>{user}</code>, <code>{repo}</code>, <code>{index}</code> für den Benutzernamen, den Namen des Repositorys und die Issue-Nummer verwenden.
|
||||
settings.enable_timetracker=Zeiterfassung aktivieren
|
||||
settings.allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen
|
||||
settings.pulls_desc=Repository-Pull-Requests aktivieren
|
||||
|
|
@ -964,22 +964,22 @@ settings.convert_notices_1=Dieser Vorgang wandelt das Mirror-Repository in ein n
|
|||
settings.convert_confirm=Repository umwandeln
|
||||
settings.convert_succeed=Das Mirror-Repository wurde erfolgreich in ein normales Repository umgewandelt.
|
||||
settings.transfer=Besitz übertragen
|
||||
settings.transfer_desc=Übertrage dieses Repository auf einen anderen Benutzer oder eine Organisation in der Du Admin-Rechte hast.
|
||||
settings.transfer_notices_1=- Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist.
|
||||
settings.transfer_notices_2=- Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist.
|
||||
settings.transfer_desc=Übertrage dieses Repository auf einen anderen Benutzer oder eine Organisation, in der du Admin-Rechte hast.
|
||||
settings.transfer_notices_1=– Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist.
|
||||
settings.transfer_notices_2=– Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist.
|
||||
settings.transfer_form_title=Gib den Repository-Namen zur Bestätigung ein:
|
||||
settings.wiki_delete=Wiki-Daten löschen
|
||||
settings.wiki_delete_desc=Das Löschen von Wiki-Daten kann nicht rückgängig gemacht werden. Bitte sei vorsichtig.
|
||||
settings.wiki_delete_notices_1=- Dies löscht und deaktiviert das Wiki für %s.
|
||||
settings.wiki_delete_notices_1=– Dies löscht und deaktiviert das Wiki für %s.
|
||||
settings.confirm_wiki_delete=Wiki-Daten löschen
|
||||
settings.wiki_deletion_success=Repository Wiki-Daten wurden gelöscht.
|
||||
settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht.
|
||||
settings.delete=Dieses Repository löschen
|
||||
settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte sei vorsichtig.
|
||||
settings.delete_notices_1=- Diese Operation kann <strong>NICHT</strong> rückgängig gemacht werden.
|
||||
settings.delete_notices_2=- Die Operation wird das <strong>%s</strong>-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen.
|
||||
settings.delete_notices_fork_1=- Nach dem Löschen werden alle Forks unabhängig.
|
||||
settings.delete_notices_2=– Die Operation wird das <strong>%s</strong>-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen.
|
||||
settings.delete_notices_fork_1=– Forks dieses Repositorys werden nach dem Löschen unabhängig.
|
||||
settings.deletion_success=Das Repository wurde gelöscht.
|
||||
settings.update_settings_success=Repository Einstellungen wurden aktualisiert.
|
||||
settings.update_settings_success=Repository-Einstellungen wurden aktualisiert.
|
||||
settings.transfer_owner=Neuer Besitzer
|
||||
settings.make_transfer=Transfer durchführen
|
||||
settings.transfer_succeed=Das Repository wurde transferiert.
|
||||
|
|
@ -994,7 +994,7 @@ settings.search_user_placeholder=Benutzer suchen…
|
|||
settings.org_not_allowed_to_be_collaborator=Organisationen können nicht als Mitarbeiter hinzugefügt werden.
|
||||
settings.user_is_org_member=Der Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden.
|
||||
settings.add_webhook=Webhook hinzufügen
|
||||
settings.hooks_desc=Webhooks senden bei bestimmten Gitea-Events automatisch HTTP POST-Requets an einen Server. Lies mehr in unserer <a target="_blank" rel="noopener" href="%s">Anleitung zu Webhooks (Englisch)</a>.
|
||||
settings.hooks_desc=Webhooks senden bei bestimmten Gitea-Events automatisch „HTTP POST“-Anfragen an einen Server. Lies mehr in unserer <a target="_blank" rel="noopener" href="%s">Anleitung zu Webhooks (auf Englisch)</a>.
|
||||
settings.webhook_deletion=Webhook löschen
|
||||
settings.webhook_deletion_desc=Das Entfernen eines Webhooks löscht seine Einstellungen und Zustellungsverlauf. Fortfahren?
|
||||
settings.webhook_deletion_success=Webhook wurde entfernt.
|
||||
|
|
@ -1066,18 +1066,18 @@ settings.title=Titel
|
|||
settings.deploy_key_content=Inhalt
|
||||
settings.key_been_used=Ein Deploy-Key mit identischem Inhalt wird bereits verwendet.
|
||||
settings.key_name_used=Ein Deploy-Key mit diesem Namen existiert bereits.
|
||||
settings.add_key_success=Der Deploy-Key '%s' wurde erfolgreich hinzugefügt.
|
||||
settings.add_key_success=Der Deploy-Key „%s“ wurde erfolgreich hinzugefügt.
|
||||
settings.deploy_key_deletion=Deploy-Key löschen
|
||||
settings.deploy_key_deletion_desc=Nach dem Löschen wird dieser Deploy-Key keinen Zugriff mehr auf dieses Repository haben. Fortfahren?
|
||||
settings.deploy_key_deletion_success=Der Deploy-Key wurde entfernt.
|
||||
settings.branches=Branches
|
||||
settings.protected_branch=Branch-Protection
|
||||
settings.protected_branch=Branch-Schutz
|
||||
settings.protected_branch_can_push=Push erlauben?
|
||||
settings.protected_branch_can_push_yes=Du kannst pushen
|
||||
settings.protected_branch_can_push_no=Du kannst nicht pushen
|
||||
settings.branch_protection=Branch-Schutz" für Branch '<b>%s</b>'
|
||||
settings.branch_protection=Branch-Schutz für Branch „<b>%s</b>“
|
||||
settings.protect_this_branch=Brach-Schutz aktivieren
|
||||
settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere Git force push auf diese Branch.
|
||||
settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das sog. „force pushing” von Git auf diesen Branch.
|
||||
settings.protect_whitelist_committers=Push-Whitelist aktivieren
|
||||
settings.protect_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Push-Beschränkungen zu umgehen.
|
||||
settings.protect_whitelist_users=Nutzer, die pushen dürfen:
|
||||
|
|
@ -1090,12 +1090,12 @@ settings.protect_merge_whitelist_users=Nutzer, die mergen dürfen:
|
|||
settings.protect_merge_whitelist_teams=Teams, die mergen dürfen:
|
||||
settings.add_protected_branch=Schutz aktivieren
|
||||
settings.delete_protected_branch=Schutz deaktivieren
|
||||
settings.update_protect_branch_success=Branch-protection für die Branch '%s' wurde geändert.
|
||||
settings.remove_protected_branch_success=Branch-protection für die Branch '%s' wurde deaktiviert.
|
||||
settings.update_protect_branch_success=Branch-Schutz für den Branch „%s“ wurde geändert.
|
||||
settings.remove_protected_branch_success=Branch-Schutz für den Branch „%s“ wurde deaktiviert.
|
||||
settings.protected_branch_deletion=Brach-Schutz deaktivieren
|
||||
settings.protected_branch_deletion_desc=Wenn du die Branch-Protection deaktivierst, können alle Nutzer mit Schreibrechten auf die Branch pushen. Fortfahren?
|
||||
settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren?
|
||||
settings.default_branch_desc=Wähle eine Standardbranch für Pull-Requests und Code-Commits:
|
||||
settings.choose_branch=Wähle eine Branch…
|
||||
settings.choose_branch=Wähle einen Branch …
|
||||
settings.no_protected_branch=Es gibt keine geschützten Branches.
|
||||
|
||||
diff.browse_source=Quellcode durchsuchen
|
||||
|
|
@ -1131,7 +1131,7 @@ release.write=Schreiben
|
|||
release.preview=Vorschau
|
||||
release.loading=Laden…
|
||||
release.prerelease_desc=Als Pre-Release kennzeichnen
|
||||
release.prerelease_helper=Dieses Release als "ungeeignet für den produktiven Einsatz" markieren.
|
||||
release.prerelease_helper=Dieses Release als „ungeeignet für den produktiven Einsatz“ markieren.
|
||||
release.cancel=Abbrechen
|
||||
release.publish=Release veröffentlichen
|
||||
release.save_draft=Entwurf speichern
|
||||
|
|
@ -1146,24 +1146,24 @@ release.downloads=Downloads
|
|||
|
||||
branch.name=Branchname
|
||||
branch.search=Branches durchsuchen
|
||||
branch.already_exists=Eine Branch mit dem Namen '%s' existiert bereits.
|
||||
branch.already_exists=Ein Branch mit dem Namen „%s“ existiert bereits.
|
||||
branch.delete_head=Löschen
|
||||
branch.delete=Branch '%s' löschen
|
||||
branch.delete=Branch „%s“ löschen
|
||||
branch.delete_html=Branch löschen
|
||||
branch.delete_desc=Das Löschen einer Branch ist permanent. Es <strong>KANN NICHT</strong> Rückgängig gemacht werden. Fortfahren?
|
||||
branch.deletion_success=Branch '%s' wurde gelöscht.
|
||||
branch.deletion_failed=Branch '%s' konnte nicht gelöscht werden.
|
||||
branch.delete_branch_has_new_commits=Die Branch '%s' kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden.
|
||||
branch.delete_desc=Das Löschen eines Branches ist permanent. Es <strong>KANN NICHT</strong> rückgängig gemacht werden. Fortfahren?
|
||||
branch.deletion_success=Branch „%s“ wurde gelöscht.
|
||||
branch.deletion_failed=Branch „%s“ konnte nicht gelöscht werden.
|
||||
branch.delete_branch_has_new_commits=Der Branch „%s“ kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden.
|
||||
branch.create_branch=Erstelle Branch <strong>%s</strong>
|
||||
branch.create_from=von '%s'
|
||||
branch.create_success=Branch '%s' wurde erstellt.
|
||||
branch.create_success=Branch „%s“ wurde erstellt.
|
||||
branch.branch_already_exists=Branch '%s' existiert bereits in diesem Repository.
|
||||
branch.branch_name_conflict=Der Branch-Name '%s' steht in Konflikt mit der bestehendem Branch '%s'.
|
||||
branch.tag_collision=Branch '%s' kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert.
|
||||
branch.branch_name_conflict=Der Branch-Name „%s“ steht in Konflikt mit dem bestehenden Branch „%s“.
|
||||
branch.tag_collision=Branch „%s“ kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert.
|
||||
branch.deleted_by=Von %s gelöscht
|
||||
branch.restore_success=Branch '%s' wurde wiederhergestellt.
|
||||
branch.restore_failed=Wiederherstellung der Branch '%s' fehlgeschlagen.
|
||||
branch.protected_deletion_failed=Branch '%s' ist geschützt und kann nicht gelöscht werden.
|
||||
branch.restore_success=Branch „%s“ wurde wiederhergestellt.
|
||||
branch.restore_failed=Wiederherstellung des Branches „%s“ fehlgeschlagen.
|
||||
branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht gelöscht werden.
|
||||
|
||||
topic.manage_topics=Themen verwalten
|
||||
topic.done=Fertig
|
||||
|
|
@ -1188,9 +1188,9 @@ team_desc_helper=Beschreibe den Zweck oder die Rolle des Teams.
|
|||
team_permission_desc=Berechtigungen
|
||||
team_unit_desc=Zugriff auf Repositorybereiche erlauben
|
||||
|
||||
form.name_reserved=Der Organisationsname '%s' ist reserviert.
|
||||
form.name_pattern_not_allowed=Das Muster '%s' ist in Organisationsnamen nicht erlaubt.
|
||||
form.create_org_not_allowed=Du bist nicht berechtigt eine Organisation zu erstellen.
|
||||
form.name_reserved=Der Organisationsname „%s“ ist reserviert.
|
||||
form.name_pattern_not_allowed=Das Muster „%s“ ist in Organisationsnamen nicht erlaubt.
|
||||
form.create_org_not_allowed=Du bist nicht berechtigt, eine Organisation zu erstellen.
|
||||
|
||||
settings=Einstellungen
|
||||
settings.options=Organisation
|
||||
|
|
@ -1229,7 +1229,7 @@ teams.read_access_helper=Mitglieder können Teamrepositories ansehen und klonen.
|
|||
teams.write_access=Schreibzugriff
|
||||
teams.write_access_helper=Mitglieder können Teamrepositories ansehen und auf sie pushen.
|
||||
teams.admin_access=Administratorzugang
|
||||
teams.admin_access_helper=Mitglieder können auf Team Repositories "pushen", von ihnen "pullen" und Mitarbeiter hinzufügen.
|
||||
teams.admin_access_helper=Mitglieder können auf Team-Repositorys pushen, von ihnen pullen und Mitarbeiter hinzufügen.
|
||||
teams.no_desc=Dieses Team hat keine Beschreibung
|
||||
teams.settings=Einstellungen
|
||||
teams.owners_permission_desc=Besitzer haben vollen Zugriff auf <strong>alle Repositories</strong> und <strong>Admin-Rechte</strong> für diese Organisation.
|
||||
|
|
@ -1277,12 +1277,12 @@ dashboard.delete_repo_archives=Alle Repository-Archive löschen
|
|||
dashboard.delete_repo_archives_success=Alle Repository-Archive wurden gelöscht.
|
||||
dashboard.delete_missing_repos=Alle Repository-Datensätze mit verlorenen gegangenen Git-Dateien löschen
|
||||
dashboard.delete_missing_repos_success=Alle Repository-Datensätze mit verlorenen Git-Dateien wurden gelöscht.
|
||||
dashboard.git_gc_repos=Garbage Collection auf Repositories ausführen
|
||||
dashboard.git_gc_repos_success=Alle Repositories haben Garbage Collection beendet.
|
||||
dashboard.resync_all_sshkeys='.ssh/authorized_keys'-Datei mit Gitea SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH Server nutzt, musst du das nicht ausführen.)
|
||||
dashboard.git_gc_repos=Garbage-Collection auf Repositories ausführen
|
||||
dashboard.git_gc_repos_success=Alle Repositories haben Garbage-Collection beendet.
|
||||
dashboard.resync_all_sshkeys=„.ssh/authorized_keys“-Datei mit Gitea-SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH-Server nutzt, musst du das nicht ausführen.)
|
||||
dashboard.resync_all_sshkeys_success=Alle von Gitea verwalteten öffentlichen Schlüssel wurden neu geschrieben.
|
||||
dashboard.resync_all_hooks=Synchronisiere pre-receive, update und post-receive Hooks für alle Repositories.
|
||||
dashboard.resync_all_hooks_success=Alle pre-receive, update und post-receive Repository-Hooks wurden synchronisiert.
|
||||
dashboard.resync_all_hooks=Synchronisiere „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut.
|
||||
dashboard.resync_all_hooks_success=Alle „pre-receive“-, „update“- und „post-receive“-Repository-Hooks wurden erneut synchronisiert.
|
||||
dashboard.reinit_missing_repos=Alle Git-Repositories mit Einträgen neu einlesen
|
||||
dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert.
|
||||
dashboard.sync_external_users=Externe Benutzerdaten synchronisieren
|
||||
|
|
@ -1305,11 +1305,11 @@ dashboard.heap_memory_released=Freigegebener Heap-Memory
|
|||
dashboard.heap_objects=Heap-Objekte
|
||||
dashboard.bootstrap_stack_usage=Bootstrap-Stack-Auslastung
|
||||
dashboard.stack_memory_obtained=Erhaltener Stack-Memory
|
||||
dashboard.mspan_structures_usage=MSpan-Structures Auslastung
|
||||
dashboard.mspan_structures_obtained=MSpan-Structures erhalten
|
||||
dashboard.mcache_structures_usage=MCache-Structures Auslastung
|
||||
dashboard.mspan_structures_usage=MSpan-Structures-Auslastung
|
||||
dashboard.mspan_structures_obtained=Erhaltene MSpan-Structures
|
||||
dashboard.mcache_structures_usage=MCache-Structures-Auslastung
|
||||
dashboard.mcache_structures_obtained=Erhaltene MCache-Structures
|
||||
dashboard.profiling_bucket_hash_table_obtained=Analysesatz Hashtabellen erhalten
|
||||
dashboard.profiling_bucket_hash_table_obtained=Erhaltene Analysesatz-Hashtabellen
|
||||
dashboard.gc_metadata_obtained=Erhaltene GC-Metadata
|
||||
dashboard.other_system_allocation_obtained=Andere erhaltene System-Allokationen
|
||||
dashboard.next_gc_recycle=Nächster GC-Zyklus
|
||||
|
|
@ -1342,7 +1342,7 @@ users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwen
|
|||
users.is_activated=Account ist aktiviert
|
||||
users.prohibit_login=Anmelden deaktivieren
|
||||
users.is_admin=Ist Administrator
|
||||
users.allow_git_hook=Darf "Git Hooks" erstellen
|
||||
users.allow_git_hook=Darf „Git Hooks“ erstellen
|
||||
users.allow_import_local=Darf lokale Repositories importieren
|
||||
users.allow_create_organization=Darf Organisationen erstellen
|
||||
users.update_profile=Benutzerkonto aktualisieren
|
||||
|
|
@ -1384,31 +1384,31 @@ auths.bind_dn=DN binden
|
|||
auths.bind_password=Passwort binden
|
||||
auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze wenn möglich einen Account mit nur Lesezugriff.
|
||||
auths.user_base=Basis für Benutzersuche
|
||||
auths.user_dn=Benutzer DN
|
||||
auths.attribute_username=Benutzername Attribut
|
||||
auths.user_dn=Benutzer-DN
|
||||
auths.attribute_username=Benutzernamens-Attribut
|
||||
auths.attribute_username_placeholder=Leerlassen, um den in Gitea eingegebenen Benutzernamen zu verwenden.
|
||||
auths.attribute_name=Vornamensattribut
|
||||
auths.attribute_surname=Nachnamensattribut
|
||||
auths.attribute_mail=E-Mail Attribut
|
||||
auths.attribute_ssh_public_key=Öffentliches SSH-Schlüssel Attribut
|
||||
auths.attribute_mail=E-Mail-Attribut
|
||||
auths.attribute_ssh_public_key=Öffentlicher-SSH-Schlüssel-Attribut
|
||||
auths.attributes_in_bind=Hole Attribute im Bind-Kontext
|
||||
auths.use_paged_search=Seitensuche verwenden
|
||||
auths.search_page_size=Seitengröße
|
||||
auths.filter=Benutzerfilter
|
||||
auths.admin_filter=Admin Filter
|
||||
auths.ms_ad_sa=MS AD Suchattribute
|
||||
auths.admin_filter=Admin-Filter
|
||||
auths.ms_ad_sa=MS-AD-Suchattribute
|
||||
auths.smtp_auth=SMTP-Authentifizierungstyp
|
||||
auths.smtphost=SMTP-Host
|
||||
auths.smtpport=SMTP-Port
|
||||
auths.allowed_domains=Erlaubte Domains
|
||||
auths.allowed_domains_helper=Leerlassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma (',').
|
||||
auths.allowed_domains_helper=Leerlassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma („,“).
|
||||
auths.enable_tls=TLS-Verschlüsselung aktivieren
|
||||
auths.skip_tls_verify=TLS Verifikation überspringen
|
||||
auths.pam_service_name=PAM Dienstname
|
||||
auths.oauth2_provider=OAuth2 Anbieter
|
||||
auths.skip_tls_verify=TLS-Verifikation überspringen
|
||||
auths.pam_service_name=PAM-Dienstname
|
||||
auths.oauth2_provider=OAuth2-Anbieter
|
||||
auths.oauth2_clientID=Client-ID (Schlüssel)
|
||||
auths.oauth2_clientSecret=Client-Secret
|
||||
auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL
|
||||
auths.openIdConnectAutoDiscoveryURL=OpenID-Connect-Auto-Discovery-URL
|
||||
auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden
|
||||
auths.oauth2_tokenURL=Token-URL
|
||||
auths.oauth2_authURL=Authorisierungs-URL
|
||||
|
|
@ -1416,48 +1416,48 @@ auths.oauth2_profileURL=Profil-URL
|
|||
auths.oauth2_emailURL=E-Mail-URL
|
||||
auths.enable_auto_register=Automatische Registrierung aktivieren
|
||||
auths.tips=Tipps
|
||||
auths.tips.oauth2.general=OAuth2 Authentifizierung
|
||||
auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2 Authentifizierung sollte die Callback/Weiterleitungs-URL <host>/user/oauth2/<Authentication Name>/callback sein.
|
||||
auths.tip.oauth2_provider=OAuth2 Anbieter
|
||||
auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter https://bitbucket.org/account/user/<dein-benutzername>/oauth-consumers/new und füge die Berechtigung "Account"-"Read" hinzu.
|
||||
auths.tips.oauth2.general=OAuth2-Authentifizierung
|
||||
auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2-Authentifizierung sollte die Callback-/Weiterleitungs-URL „<host>/user/oauth2/<Authentication Name>/callback“ sein.
|
||||
auths.tip.oauth2_provider=OAuth2-Anbieter
|
||||
auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter https://bitbucket.org/account/user/<dein-benutzername>/oauth-consumers/new und füge die Berechtigung „Account“ – „Read“ hinzu.
|
||||
auths.tip.dropbox=Erstelle eine neue App auf https://www.dropbox.com/developers/apps.
|
||||
auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook.com/apps und füge das Produkt "Facebook Login" hinzu.
|
||||
auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth Anwendung.
|
||||
auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook.com/apps und füge das Produkt „Facebook Login“ hinzu.
|
||||
auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth-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 Console unter https://console.developers.google.com/
|
||||
auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter https://console.developers.google.com/
|
||||
auths.tip.openid_connect=Benutze die OpenID Connect Discovery URL (<server>/.well-known/openid-configuration) als Endpunkt.
|
||||
auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, 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 https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist
|
||||
auths.edit=Authentifikationsquelle bearbeiten
|
||||
auths.activated=Diese Authentifikationsquelle ist aktiviert
|
||||
auths.new_success=Die Authentifizierung "%s" wurde hinzugefügt.
|
||||
auths.new_success=Die Authentifizierung „%s“ wurde hinzugefügt.
|
||||
auths.update_success=Diese Authentifizierungsquelle wurde aktualisiert.
|
||||
auths.update=Authentifizierungsquelle aktualisieren
|
||||
auths.delete=Authentifikationsquelle löschen
|
||||
auths.delete_auth_title=Authentifizierungsquelle löschen
|
||||
auths.delete_auth_desc=Das Löschen einer Authentifizierungsquelle verhindert, dass Benutzer sich darüber anmelden können. Fortfahren?
|
||||
auths.still_in_used=Diese Authentifizierungsquelle wird noch verwendet. Bearbeite oder lösche zuerst alle Benutzer, die diese Authentifizierungsquelle benutzen.
|
||||
auths.deletion_success=Die Authentifizierungsquelle '%s' wurde gelöscht.
|
||||
auths.login_source_exist=Die Authentifizierungsquelle '%s' existiert bereits.
|
||||
auths.deletion_success=Die Authentifizierungsquelle „%s“ wurde gelöscht.
|
||||
auths.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits.
|
||||
|
||||
config.server_config=Serverkonfiguration
|
||||
config.app_name=Seitentitel
|
||||
config.app_ver=Gitea Version
|
||||
config.app_url=Gitea Basis-URL
|
||||
config.app_ver=Gitea-Version
|
||||
config.app_url=Gitea-Basis-URL
|
||||
config.custom_conf=Konfigurations-Datei-Pfad
|
||||
config.domain=SSH Server-Domain
|
||||
config.domain=SSH-Server-Domain
|
||||
config.offline_mode=Lokaler Modus
|
||||
config.disable_router_log=Router-Log deaktivieren
|
||||
config.run_user=Ausführen als
|
||||
config.run_mode=Laufzeit-Modus
|
||||
config.git_version=Git Version
|
||||
config.repo_root_path=Repository-Verzeichnis
|
||||
config.git_version=Git-Version
|
||||
config.repo_root_path=Repository-Wurzelpfad
|
||||
config.lfs_root_path=LFS-Wurzelpfad
|
||||
config.static_file_root_path=Verzeichnis für statische Dateien
|
||||
config.log_file_root_path=Logdateipfad
|
||||
config.script_type=Skript-Typ
|
||||
config.reverse_auth_user=Nutzer bei Reverse-Authentifizierung
|
||||
|
||||
config.ssh_config=SSH Konfiguration
|
||||
config.ssh_config=SSH-Konfiguration
|
||||
config.ssh_enabled=Aktiviert
|
||||
config.ssh_start_builtin_server=Eingebauten Server verwenden
|
||||
config.ssh_domain=Server-Domain
|
||||
|
|
@ -1465,9 +1465,9 @@ config.ssh_port=Port
|
|||
config.ssh_listen_port=Listen-Port
|
||||
config.ssh_root_path=Wurzelverzeichnis
|
||||
config.ssh_key_test_path=Schlüssel-Test-Pfad
|
||||
config.ssh_keygen_path=Keygen ('ssh-keygen') Pfad
|
||||
config.ssh_keygen_path=Keygen-Pfad („ssh-keygen“)
|
||||
config.ssh_minimum_key_size_check=Prüfung der Mindestschlüssellänge
|
||||
config.ssh_minimum_key_sizes=Minimale Schlüssellängen
|
||||
config.ssh_minimum_key_sizes=Mindestschlüssellängen
|
||||
|
||||
config.db_config=Datenbankkonfiguration
|
||||
config.db_type=Typ
|
||||
|
|
@ -1481,17 +1481,17 @@ config.service_config=Service-Konfiguration
|
|||
config.register_email_confirm=E-Mail-Bestätigung benötigt zum Registrieren
|
||||
config.disable_register=Selbstegistrierung deaktivieren
|
||||
config.allow_only_external_registration=Registrierung nur über externe Services aktiveren
|
||||
config.enable_openid_signup=OpenID Selbstregistrierung aktivieren
|
||||
config.enable_openid_signin=OpenID Anmeldung aktivieren
|
||||
config.enable_openid_signup=OpenID-Selbstregistrierung aktivieren
|
||||
config.enable_openid_signin=OpenID-Anmeldung aktivieren
|
||||
config.show_registration_button=Schaltfläche zum Registrieren anzeigen
|
||||
config.require_sign_in_view=Seiten nur für angemeldete Benutzer zugänglich
|
||||
config.mail_notify=E-Mail-Benachrichtigungen aktivieren
|
||||
config.disable_key_size_check=Prüfung der Mindestschlüssellänge deaktiveren
|
||||
config.enable_captcha=CAPTCHA aktivieren
|
||||
config.active_code_lives=Aktivierungscode Lebensdauer
|
||||
config.active_code_lives=Aktivierungscode-Lebensdauer
|
||||
config.reset_password_code_lives=Ablaufdatum des Passworts zurücksetzen
|
||||
config.default_keep_email_private=E-Mail-Adressen standardmäßig verbergen
|
||||
config.default_allow_create_organization=Erstellen von Organisationen standarmäßig erlauben
|
||||
config.default_allow_create_organization=Erstellen von Organisationen standardmäßig erlauben
|
||||
config.enable_timetracking=Zeiterfassung aktivieren
|
||||
config.default_enable_timetracking=Zeiterfassung standardmäßig aktivieren
|
||||
config.default_allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen
|
||||
|
|
@ -1500,11 +1500,11 @@ config.no_reply_address=Versteckte E-Mail-Domain
|
|||
config.webhook_config=Webhook-Konfiguration
|
||||
config.queue_length=Warteschlangenlänge
|
||||
config.deliver_timeout=Zeitlimit für Zustellung
|
||||
config.skip_tls_verify=TLS Verifikation überspringen
|
||||
config.skip_tls_verify=TLS-Verifikation überspringen
|
||||
|
||||
config.mailer_config=SMTP Mailer Konfiguration
|
||||
config.mailer_config=SMTP-Mailer-Konfiguration
|
||||
config.mailer_enabled=Aktiviert
|
||||
config.mailer_disable_helo=HELO Deaktivieren
|
||||
config.mailer_disable_helo=HELO deaktivieren
|
||||
config.mailer_name=Name
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Benutzer
|
||||
|
|
@ -1512,8 +1512,8 @@ config.mailer_use_sendmail=Sendmail benutzen
|
|||
config.mailer_sendmail_path=Sendmail-Pfad
|
||||
config.mailer_sendmail_args=Zusätzliche Argumente für Sendmail
|
||||
config.send_test_mail=Test-E-Mail senden
|
||||
config.test_mail_failed=Das Senden der Test-E-Mail an '%s' ist fehlgeschlagen: %v
|
||||
config.test_mail_sent=Eine Test-E-Mail wurde an '%s' gesendet.
|
||||
config.test_mail_failed=Das Senden der Test-E-Mail an „%s“ ist fehlgeschlagen: %v
|
||||
config.test_mail_sent=Eine Test-E-Mail wurde an „%s“ gesendet.
|
||||
|
||||
config.oauth_config=OAuth-Konfiguration
|
||||
config.oauth_enabled=Aktiviert
|
||||
|
|
@ -1533,16 +1533,16 @@ config.session_life_time=Session-Lebensdauer
|
|||
config.https_only=Nur HTTPS
|
||||
config.cookie_life_time=Cookie-Lebensdauer
|
||||
|
||||
config.picture_config=Avatar-Konfiguration
|
||||
config.picture_config=Bild-und-Profilbild-Konfiguration
|
||||
config.picture_service=Bilderservice
|
||||
config.disable_gravatar=Gravatar deaktivieren
|
||||
config.enable_federated_avatar=Föderierte Profilbilder einschalten
|
||||
|
||||
config.git_config=Git Konfiguration
|
||||
config.git_disable_diff_highlight=Diff Syntaxhervorhebung ausschalten
|
||||
config.git_max_diff_lines=Max Diff Zeilen (in einer Datei)
|
||||
config.git_max_diff_line_characters=Max Diff Zeichen (in einer Zeile)
|
||||
config.git_max_diff_files=Max Diff Dateien (Anzeige)
|
||||
config.git_config=Git-Konfiguration
|
||||
config.git_disable_diff_highlight=Diff-Syntaxhervorhebung ausschalten
|
||||
config.git_max_diff_lines=Max. Diff-Zeilen (in einer Datei)
|
||||
config.git_max_diff_line_characters=Max. Diff-Zeichen (in einer Zeile)
|
||||
config.git_max_diff_files=Max. Diff-Dateien (Angezeigte)
|
||||
config.git_gc_args=GC-Argumente
|
||||
config.git_migrate_timeout=Zeitlimit für Migration
|
||||
config.git_mirror_timeout=Zeitlimit für Mirror-Aktualisierung
|
||||
|
|
@ -1638,12 +1638,12 @@ mark_all_as_read=Alle als gelesen markieren
|
|||
[gpg]
|
||||
error.extract_sign=Die Signatur konnte nicht extrahiert werden
|
||||
error.generate_hash=Es konnte kein Hash vom Commit generiert werden
|
||||
error.no_committer_account=Es ist kein Benutzerkonto mit dieser Commiter-Email verbunden
|
||||
error.no_committer_account=Es ist kein Benutzerkonto mit der E-Mail-Adresse des Committers verbunden
|
||||
error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
|
||||
error.not_signed_commit=Kein signierter Commit
|
||||
error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Kontos
|
||||
|
||||
[units]
|
||||
error.no_unit_allowed_repo=Du hast keine Berechtigung auf einen Bereich dieses Repositories zuzugreifen.
|
||||
error.unit_not_allowed=Du hast keine Berechtigung auf diesen Repository-Bereich zuzugreifen.
|
||||
error.no_unit_allowed_repo=Du hast keine Berechtigung, um auf irgendeinen Bereich dieses Repositories zuzugreifen.
|
||||
error.unit_not_allowed=Du hast keine Berechtigung, um auf diesen Repository-Bereich zuzugreifen.
|
||||
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ non_local_account=Нелокальні акаунти не можуть змін
|
|||
verify=Підтвердити
|
||||
scratch_code=Одноразовий пароль
|
||||
use_scratch_code=Використовувати одноразовий пароль
|
||||
twofa_scratch_used=Ви використовували одноразовий пароль. Ви були перенаправлені на сторінку налаштувань для генерації нового коду або відключення двуфакторной аутентифікації.
|
||||
twofa_scratch_used=Ви використовували одноразовий пароль. Ви були перенаправлені на сторінку налаштувань для генерації нового коду або відключення двуфакторної автентифікації.
|
||||
twofa_passcode_incorrect=Ваш пароль є невірним. Якщо ви втратили пристрій, використовуйте ваш одноразовий пароль.
|
||||
twofa_scratch_token_incorrect=Невірний одноразовий пароль.
|
||||
login_userpass=Увійти
|
||||
|
|
@ -280,12 +280,12 @@ target_branch_not_exist=Цільової гілки не існує.
|
|||
|
||||
[user]
|
||||
change_avatar=Змінити свій аватар…
|
||||
join_on=Приєднався
|
||||
join_on=Приєднався(-лась)
|
||||
repositories=Репозиторії
|
||||
activity=Публічна активність
|
||||
followers=Підписники
|
||||
followers=Читачі
|
||||
starred=Обрані Репозиторії
|
||||
following=Слідкувати
|
||||
following=Читає
|
||||
follow=Підписатися
|
||||
unfollow=Відписатися
|
||||
|
||||
|
|
@ -399,20 +399,25 @@ generate_token=Згенерувати токен
|
|||
delete_token=Видалити
|
||||
access_token_deletion=Видалити токен доступу
|
||||
|
||||
twofa_desc=Двофакторна аутентифікація підвищує безпеку вашого облікового запису.
|
||||
twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису.
|
||||
twofa_is_enrolled=Ваш обліковий запис на даний час <strong>використовує</strong> двофакторну автентифікацію.
|
||||
twofa_disable=Вимкнути двофакторну автентифікацію
|
||||
twofa_scratch_token_regenerate=Перестворити токен одноразового пароля
|
||||
twofa_enroll=Увімкнути двофакторну автентифікацію
|
||||
twofa_disable_note=При необхідності можна відключити двофакторну автентифікацію.
|
||||
regenerate_scratch_token_desc=Якщо ви втратили свій токен одноразового пароля або вже використовували його для входу, ви можете скинути його тут.
|
||||
twofa_disabled=Двофакторна автентифікація вимкнена.
|
||||
scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної аутентифікації:
|
||||
scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної автентифікації:
|
||||
or_enter_secret=Або введіть секрет: %s
|
||||
passcode_invalid=Некоректний пароль. Спробуй ще раз.
|
||||
|
||||
u2f_desc=Ключами безпеки є апаратні пристрої, що містять криптографічні ключі. Вони можуть використовуватися для двофакторної автентифікації. Ключ безпеки повинен підтримувати стандарт <a href="https://fidoalliance.org/">FIDO U2F</a>.
|
||||
u2f_register_key=Додати ключ безпеки
|
||||
u2f_nickname=Псевдонім
|
||||
u2f_delete_key=Видалити ключ безпеки
|
||||
|
||||
manage_account_links=Керування обліковими записами
|
||||
manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Gitea.
|
||||
remove_account_link=Видалити облікові записи
|
||||
|
||||
orgs_none=Ви не є учасником будь-якої організації.
|
||||
|
|
@ -428,6 +433,7 @@ owner=Власник
|
|||
repo_name=Назва репозиторію
|
||||
visibility=Видимість
|
||||
visiblity_helper=Зробити репозиторій приватним
|
||||
visiblity_fork_helper=(Зміна цього вплине на всі форки.)
|
||||
clone_helper=Потрібна допомога у клонуванні? Відвідайте <a target="_blank" rel="noopener" href="%s">Допомогу</a>.
|
||||
fork_repo=Форкнути репозиторій
|
||||
fork_from=Форк з
|
||||
|
|
@ -439,6 +445,7 @@ license=Ліцензія
|
|||
license_helper=Виберіть ліцензійний файл.
|
||||
readme=README
|
||||
readme_helper=Виберіть шаблон README.
|
||||
auto_init=Ініціалізувати репозиторій (Додає .gitignore, LICENSE та README)
|
||||
create_repo=Створити репозиторій
|
||||
default_branch=Головна гілка
|
||||
mirror_prune=Очистити
|
||||
|
|
@ -603,7 +610,10 @@ issues.filter_sort.recentupdate=Нещодавно оновлено
|
|||
issues.filter_sort.leastupdate=Найдавніше оновлені
|
||||
issues.filter_sort.mostcomment=Найбільш коментовані
|
||||
issues.filter_sort.leastcomment=Найменш коментовані
|
||||
issues.filter_sort.moststars=Найбільш обраних
|
||||
issues.filter_sort.feweststars=Найменш обраних
|
||||
issues.filter_sort.mostforks=Найбільше форків
|
||||
issues.filter_sort.fewestforks=Найменше форків
|
||||
issues.action_open=Відкрити
|
||||
issues.action_close=Закрити
|
||||
issues.action_label=Мітка
|
||||
|
|
@ -968,6 +978,7 @@ topic.done=Готово
|
|||
[org]
|
||||
org_name_holder=Назва організації
|
||||
org_full_name_holder=Повна назва організації
|
||||
org_name_helper=Назва організації має бути простою та зрозумілою.
|
||||
create_org=Створити організацію
|
||||
repo_updated=Оновлено
|
||||
people=Учасники
|
||||
|
|
@ -1130,7 +1141,7 @@ repos.forks=Форки
|
|||
repos.issues=Проблеми
|
||||
repos.size=Розмір
|
||||
|
||||
auths.auth_manage_panel=Керування джерелом аутентифікації
|
||||
auths.auth_manage_panel=Керування джерелом автентифікації
|
||||
auths.new=Додати джерело автентифікації
|
||||
auths.name=Ім'я
|
||||
auths.type=Тип
|
||||
|
|
@ -1167,8 +1178,8 @@ auths.oauth2_profileURL=URL профілю
|
|||
auths.oauth2_emailURL=URL електронної пошти
|
||||
auths.enable_auto_register=Увімкнути автоматичну реєстрацію
|
||||
auths.tips=Поради
|
||||
auths.tips.oauth2.general=OAuth2 аутентифікація
|
||||
auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні аутентифікації повинена виглядати так:<host>/user/oauth2/<Authentication Name>/callback
|
||||
auths.tips.oauth2.general=OAuth2 автентифікація
|
||||
auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні автентифікації повинена виглядати так:<host>/user/oauth2/<Authentication Name>/callback
|
||||
auths.tip.oauth2_provider=Постачальник OAuth2
|
||||
auths.tip.dropbox=Додайте новий додаток на https://www.dropbox.com/developers/apps
|
||||
auths.tip.facebook=Створіть новий додаток на https://developers.facebook.com/apps і додайте модуль "Facebook Login
|
||||
|
|
@ -1232,6 +1243,7 @@ config.default_keep_email_private=Приховати адресу електро
|
|||
config.default_allow_create_organization=Дозволити створення організацій за замовчуванням
|
||||
config.enable_timetracking=Увімкнути відстеження часу
|
||||
config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням
|
||||
config.no_reply_address=Прихований домен е-пошти
|
||||
|
||||
config.webhook_config=Конфігурація web-хуків
|
||||
config.queue_length=Довжина черги
|
||||
|
|
|
|||
|
|
@ -213,6 +213,7 @@ send_reset_mail=单击此处(重新)发送您的密码重置邮件
|
|||
reset_password=重置密码
|
||||
invalid_code=此确认密钥无效或已过期。
|
||||
reset_password_helper=单击此处重置密码
|
||||
password_too_short=密码长度不能少于 %d 位。
|
||||
non_local_account=非本地帐户不能通过 Gitea 的 web 界面更改密码。
|
||||
verify=验证
|
||||
scratch_code=验证口令
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
// Copyright 2016 The Gogs Authors. All rights reserved.
|
||||
// Copyright 2018 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
|
|
@ -166,7 +167,7 @@ func CreateIssue(ctx *context.APIContext, form api.CreateIssueOption) {
|
|||
// "$ref": "#/responses/Issue"
|
||||
|
||||
var deadlineUnix util.TimeStamp
|
||||
if form.Deadline != nil {
|
||||
if form.Deadline != nil && ctx.Repo.IsWriter() {
|
||||
deadlineUnix = util.TimeStamp(form.Deadline.Unix())
|
||||
}
|
||||
|
||||
|
|
@ -179,15 +180,22 @@ func CreateIssue(ctx *context.APIContext, form api.CreateIssueOption) {
|
|||
DeadlineUnix: deadlineUnix,
|
||||
}
|
||||
|
||||
// Get all assignee IDs
|
||||
assigneeIDs, err := models.MakeIDsFromAPIAssigneesToAdd(form.Assignee, form.Assignees)
|
||||
if err != nil {
|
||||
if models.IsErrUserNotExist(err) {
|
||||
ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err))
|
||||
} else {
|
||||
ctx.Error(500, "AddAssigneeByName", err)
|
||||
var assigneeIDs = make([]int64, 0)
|
||||
var err error
|
||||
if ctx.Repo.IsWriter() {
|
||||
issue.MilestoneID = form.Milestone
|
||||
assigneeIDs, err = models.MakeIDsFromAPIAssigneesToAdd(form.Assignee, form.Assignees)
|
||||
if err != nil {
|
||||
if models.IsErrUserNotExist(err) {
|
||||
ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err))
|
||||
} else {
|
||||
ctx.Error(500, "AddAssigneeByName", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
return
|
||||
} else {
|
||||
// setting labels is not allowed if user is not a writer
|
||||
form.Labels = make([]int64, 0)
|
||||
}
|
||||
|
||||
if err := models.NewIssue(ctx.Repo.Repository, issue, form.Labels, assigneeIDs, nil); err != nil {
|
||||
|
|
|
|||
|
|
@ -24,12 +24,7 @@ func Account(ctx *context.Context) {
|
|||
ctx.Data["PageIsSettingsAccount"] = true
|
||||
ctx.Data["Email"] = ctx.User.Email
|
||||
|
||||
emails, err := models.GetEmailAddresses(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetEmailAddresses", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Emails"] = emails
|
||||
loadAccountData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsAccount)
|
||||
}
|
||||
|
|
@ -40,6 +35,8 @@ func AccountPost(ctx *context.Context, form auth.ChangePasswordForm) {
|
|||
ctx.Data["PageIsSettingsAccount"] = true
|
||||
|
||||
if ctx.HasError() {
|
||||
loadAccountData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsAccount)
|
||||
return
|
||||
}
|
||||
|
|
@ -85,15 +82,9 @@ func EmailPost(ctx *context.Context, form auth.AddEmailForm) {
|
|||
return
|
||||
}
|
||||
|
||||
// Add Email address.
|
||||
emails, err := models.GetEmailAddresses(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetEmailAddresses", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Emails"] = emails
|
||||
|
||||
if ctx.HasError() {
|
||||
loadAccountData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsAccount)
|
||||
return
|
||||
}
|
||||
|
|
@ -105,6 +96,8 @@ func EmailPost(ctx *context.Context, form auth.AddEmailForm) {
|
|||
}
|
||||
if err := models.AddEmailAddress(email); err != nil {
|
||||
if models.IsErrEmailAlreadyUsed(err) {
|
||||
loadAccountData(ctx)
|
||||
|
||||
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplSettingsAccount, &form)
|
||||
return
|
||||
}
|
||||
|
|
@ -149,6 +142,8 @@ func DeleteAccount(ctx *context.Context) {
|
|||
|
||||
if _, err := models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil {
|
||||
if models.IsErrUserNotExist(err) {
|
||||
loadAccountData(ctx)
|
||||
|
||||
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), tplSettingsAccount, nil)
|
||||
} else {
|
||||
ctx.ServerError("UserSignIn", err)
|
||||
|
|
@ -172,3 +167,12 @@ func DeleteAccount(ctx *context.Context) {
|
|||
ctx.Redirect(setting.AppSubURL + "/")
|
||||
}
|
||||
}
|
||||
|
||||
func loadAccountData(ctx *context.Context) {
|
||||
emails, err := models.GetEmailAddresses(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetEmailAddresses", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Emails"] = emails
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,12 +22,7 @@ func Applications(ctx *context.Context) {
|
|||
ctx.Data["Title"] = ctx.Tr("settings")
|
||||
ctx.Data["PageIsSettingsApplications"] = true
|
||||
|
||||
tokens, err := models.ListAccessTokens(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListAccessTokens", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Tokens"] = tokens
|
||||
loadApplicationsData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsApplications)
|
||||
}
|
||||
|
|
@ -38,12 +33,8 @@ func ApplicationsPost(ctx *context.Context, form auth.NewAccessTokenForm) {
|
|||
ctx.Data["PageIsSettingsApplications"] = true
|
||||
|
||||
if ctx.HasError() {
|
||||
tokens, err := models.ListAccessTokens(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListAccessTokens", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Tokens"] = tokens
|
||||
loadApplicationsData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsApplications)
|
||||
return
|
||||
}
|
||||
|
|
@ -75,3 +66,12 @@ func DeleteApplication(ctx *context.Context) {
|
|||
"redirect": setting.AppSubURL + "/user/settings/applications",
|
||||
})
|
||||
}
|
||||
|
||||
func loadApplicationsData(ctx *context.Context) {
|
||||
tokens, err := models.ListAccessTokens(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListAccessTokens", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Tokens"] = tokens
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,19 +23,7 @@ func Keys(ctx *context.Context) {
|
|||
ctx.Data["PageIsSettingsKeys"] = true
|
||||
ctx.Data["DisableSSH"] = setting.SSH.Disabled
|
||||
|
||||
keys, err := models.ListPublicKeys(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListPublicKeys", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Keys"] = keys
|
||||
|
||||
gpgkeys, err := models.ListGPGKeys(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListGPGKeys", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["GPGKeys"] = gpgkeys
|
||||
loadKeysData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsKeys)
|
||||
}
|
||||
|
|
@ -45,21 +33,9 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) {
|
|||
ctx.Data["Title"] = ctx.Tr("settings")
|
||||
ctx.Data["PageIsSettingsKeys"] = true
|
||||
|
||||
keys, err := models.ListPublicKeys(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListPublicKeys", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Keys"] = keys
|
||||
|
||||
gpgkeys, err := models.ListGPGKeys(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListGPGKeys", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["GPGKeys"] = gpgkeys
|
||||
|
||||
if ctx.HasError() {
|
||||
loadKeysData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsKeys)
|
||||
return
|
||||
}
|
||||
|
|
@ -73,9 +49,13 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) {
|
|||
ctx.Flash.Error(ctx.Tr("form.invalid_gpg_key", err.Error()))
|
||||
ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
|
||||
case models.IsErrGPGKeyIDAlreadyUsed(err):
|
||||
loadKeysData(ctx)
|
||||
|
||||
ctx.Data["Err_Content"] = true
|
||||
ctx.RenderWithErr(ctx.Tr("settings.gpg_key_id_used"), tplSettingsKeys, &form)
|
||||
case models.IsErrGPGNoEmailFound(err):
|
||||
loadKeysData(ctx)
|
||||
|
||||
ctx.Data["Err_Content"] = true
|
||||
ctx.RenderWithErr(ctx.Tr("settings.gpg_no_key_email_found"), tplSettingsKeys, &form)
|
||||
default:
|
||||
|
|
@ -103,9 +83,13 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) {
|
|||
ctx.Data["HasSSHError"] = true
|
||||
switch {
|
||||
case models.IsErrKeyAlreadyExist(err):
|
||||
loadKeysData(ctx)
|
||||
|
||||
ctx.Data["Err_Content"] = true
|
||||
ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsKeys, &form)
|
||||
case models.IsErrKeyNameAlreadyUsed(err):
|
||||
loadKeysData(ctx)
|
||||
|
||||
ctx.Data["Err_Title"] = true
|
||||
ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsKeys, &form)
|
||||
default:
|
||||
|
|
@ -147,3 +131,19 @@ func DeleteKey(ctx *context.Context) {
|
|||
"redirect": setting.AppSubURL + "/user/settings/keys",
|
||||
})
|
||||
}
|
||||
|
||||
func loadKeysData(ctx *context.Context) {
|
||||
keys, err := models.ListPublicKeys(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListPublicKeys", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Keys"] = keys
|
||||
|
||||
gpgkeys, err := models.ListGPGKeys(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("ListGPGKeys", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["GPGKeys"] = gpgkeys
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ const (
|
|||
func Profile(ctx *context.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("settings")
|
||||
ctx.Data["PageIsSettingsProfile"] = true
|
||||
|
||||
ctx.HTML(200, tplSettingsProfile)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,30 @@ func Security(ctx *context.Context) {
|
|||
ctx.Data["Title"] = ctx.Tr("settings")
|
||||
ctx.Data["PageIsSettingsSecurity"] = true
|
||||
|
||||
if ctx.Query("openid.return_to") != "" {
|
||||
settingsOpenIDVerify(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
loadSecurityData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsSecurity)
|
||||
}
|
||||
|
||||
// DeleteAccountLink delete a single account link
|
||||
func DeleteAccountLink(ctx *context.Context) {
|
||||
if _, err := models.RemoveAccountLink(ctx.User, ctx.QueryInt64("loginSourceID")); err != nil {
|
||||
ctx.Flash.Error("RemoveAccountLink: " + err.Error())
|
||||
} else {
|
||||
ctx.Flash.Success(ctx.Tr("settings.remove_account_link_success"))
|
||||
}
|
||||
|
||||
ctx.JSON(200, map[string]interface{}{
|
||||
"redirect": setting.AppSubURL + "/user/settings/security",
|
||||
})
|
||||
}
|
||||
|
||||
func loadSecurityData(ctx *context.Context) {
|
||||
enrolled := true
|
||||
_, err := models.GetTwoFactorByUID(ctx.User.ID)
|
||||
if err != nil {
|
||||
|
|
@ -71,30 +95,10 @@ func Security(ctx *context.Context) {
|
|||
}
|
||||
ctx.Data["AccountLinks"] = sources
|
||||
|
||||
if ctx.Query("openid.return_to") != "" {
|
||||
settingsOpenIDVerify(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
openid, err := models.GetUserOpenIDs(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetUserOpenIDs", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["OpenIDs"] = openid
|
||||
|
||||
ctx.HTML(200, tplSettingsSecurity)
|
||||
}
|
||||
|
||||
// DeleteAccountLink delete a single account link
|
||||
func DeleteAccountLink(ctx *context.Context) {
|
||||
if _, err := models.RemoveAccountLink(ctx.User, ctx.QueryInt64("loginSourceID")); err != nil {
|
||||
ctx.Flash.Error("RemoveAccountLink: " + err.Error())
|
||||
} else {
|
||||
ctx.Flash.Success(ctx.Tr("settings.remove_account_link_success"))
|
||||
}
|
||||
|
||||
ctx.JSON(200, map[string]interface{}{
|
||||
"redirect": setting.AppSubURL + "/user/settings/security",
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,12 +19,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) {
|
|||
ctx.Data["PageIsSettingsSecurity"] = true
|
||||
|
||||
if ctx.HasError() {
|
||||
openid, err := models.GetUserOpenIDs(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetUserOpenIDs", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["OpenIDs"] = openid
|
||||
loadSecurityData(ctx)
|
||||
|
||||
ctx.HTML(200, tplSettingsSecurity)
|
||||
return
|
||||
}
|
||||
|
|
@ -37,6 +33,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) {
|
|||
|
||||
id, err := openid.Normalize(form.Openid)
|
||||
if err != nil {
|
||||
loadSecurityData(ctx)
|
||||
|
||||
ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form)
|
||||
return
|
||||
}
|
||||
|
|
@ -53,6 +51,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) {
|
|||
// Check that the OpenID is not already used
|
||||
for _, obj := range oids {
|
||||
if obj.URI == id {
|
||||
loadSecurityData(ctx)
|
||||
|
||||
ctx.RenderWithErr(ctx.Tr("form.openid_been_used", id), tplSettingsSecurity, &form)
|
||||
return
|
||||
}
|
||||
|
|
@ -61,6 +61,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) {
|
|||
redirectTo := setting.AppURL + "user/settings/security"
|
||||
url, err := openid.RedirectURL(id, redirectTo, setting.AppURL)
|
||||
if err != nil {
|
||||
loadSecurityData(ctx)
|
||||
|
||||
ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form)
|
||||
return
|
||||
}
|
||||
|
|
@ -73,13 +75,6 @@ func settingsOpenIDVerify(ctx *context.Context) {
|
|||
fullURL := setting.AppURL + ctx.Req.Request.URL.String()[1:]
|
||||
log.Trace("Full URL: " + fullURL)
|
||||
|
||||
oids, err := models.GetUserOpenIDs(ctx.User.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetUserOpenIDs", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["OpenIDs"] = oids
|
||||
|
||||
id, err := openid.Verify(fullURL)
|
||||
if err != nil {
|
||||
ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &auth.AddOpenIDForm{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user