Compare commits

...

38 Commits

Author SHA1 Message Date
Lunny Xiao
34182c87ec release notes for v1.1.4 2017-09-04 15:34:29 +02:00
Lunny Xiao
c401788383
bug fixed 2017-09-04 14:27:53 +08:00
Ethan Koenig
8335b556d1 Fix rendering of external links (#2292) (#2315) 2017-08-17 15:03:41 +08:00
Lunny Xiao
09fff9e1c1 fix 500 error when view an issue which's milestone deleted (#2297) (#2299) 2017-08-14 10:45:06 +08:00
Lunny Xiao
622552b709 Fix deleted milestone bug (#1942) (#2300)
* Fix deleted milestone bug

* Use locale for ghost milestone name

* Fix pointer bug
2017-08-13 19:18:57 -03:00
Lunny Xiao
1709297701 Fix SHA1 hash linking (#2143) (#2293)
This changes the regex to look for a hash from 7 to 40 characters,
to match the use of abbreviated hash lookups in both git and github.
The restriction of not being a pure number is also removed because
1234567 is now considered a valid abbreviated hash, as is deadbeef.

A note has been added to the top of the code to state that the
literal regex match is fine, but no extra validation is currently
performed so some false positives are expected.

A future change could ensure that the hash exists in the repository
before rendering it as a link, although this might incur a slight
performance penalty.

Reverts part of commit 4a46613 and fixes #2053.
2017-08-12 09:32:56 +08:00
Bo-Yi Wu
5fe8fee933 back port from #1709 (#2291)
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2017-08-11 10:32:26 +08:00
Bo-Yi Wu
5bb20be8b2 update sig file (#2269)
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2017-08-06 21:56:17 +03:00
Lunny Xiao
06a554c22a ignore coverage for release (#2263) 2017-08-05 12:14:59 +03:00
Lunny Xiao
00bd47ae5c add changelog of release v1.1.3 (#2251) 2017-08-03 16:50:21 +08:00
Lunny Xiao
b20f1ab47f
fix some bug 2017-07-28 14:36:18 +08:00
Ethan Koenig
9a7f59ef35 Fix fast-forward PR bug (#2137)
* Fix fast-forward PR bug

* Don't ignore error in getMergeCommit (#1843)
2017-07-11 09:51:39 -05:00
Ethan Koenig
6a6f0616f2 Fix diff of renamed and modified file (#2136) 2017-07-11 02:19:10 -05:00
Ethan Koenig
6caf04c129 Don't ignore gravatar error (#2138) 2017-07-11 01:00:43 -05:00
Antoine GIRARD
406f5de18c Fix missing less sources for oauth (backport #1288) (#2135) 2017-07-11 09:25:30 +08:00
Andrey Nering
39cb1ac517 Merge pull request #2043 from lunny/lunny/fix_markdown_render_list
Fix markdown rendering (#1530)
2017-06-23 10:17:45 -03:00
Morlinest
58dcbaf20b
Fix markdown rendering (#1530) 2017-06-23 17:19:38 +08:00
Kim "BKC" Carlbäcker
5f212ff4e9 Fix PR template error (#2008) 2017-06-19 09:18:53 +02:00
Ethan Koenig
45fa822ac4 Fix PR template error 2017-06-18 22:01:20 -04:00
Kim "BKC" Carlbäcker
1ac8646845 Merge pull request #1944 from appleboy/release/v1.1
[ci skip] add 1.1.2 change log.
2017-06-12 15:26:43 +02:00
Bo-Yi Wu
13e284c7cf
[ci skip] add 1.1.2 change log.
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2017-06-12 17:04:29 +08:00
Lunny Xiao
bbe6aa349f fix bug not to trim space of login username (#1806) 2017-05-29 06:10:11 -05:00
agrn
4fd55d8796 Backport bugfixes #1220 and #1393 to v1.1 (#1758)
* Fix "Error: No issue number specified"  when pushing

* fix wrong log when push to a new branch (#1220)

* Removing empty file modules/github/issues.go
2017-05-20 12:43:43 +08:00
Jonas Östanbäck
daaabaa1d9 Enforce netgo build tag while cross-compilation (Backport of #1690) (#1731) 2017-05-18 09:04:12 +08:00
Lunny Xiao
fa059debca fix delete user failed on sqlite (#1321) 2017-05-17 12:43:22 +02:00
Kim "BKC" Carlbäcker
2854c8aa47 Merge pull request #1724 from lunny/lunny/fix_avatar_update
fix update avatar
2017-05-15 17:16:31 +02:00
Lunny Xiao
506c98df5b
fix update avatar 2017-05-14 13:39:53 +08:00
Kim "BKC" Carlbäcker
f9859a2991 Update changelog with v1.1.1 2017-05-04 18:29:26 +02:00
Kim "BKC" Carlbäcker
473df53533 [backport] fix sanitation (#1646)
* Santiation fix from Gogs

- Add code-injection checks

* Fix SSH-breakage
2017-04-30 17:55:16 +08:00
Philippe Kueck
2482c67e2b backport of PR #1257 for release/v1.1: rewrite pre-commit, post-commit and options hooks (#1376)
* issue #1250, replace {pre,post}-receive and update hooks with a single shell script that does not require custom hooks to be a sh-script

* issue #1250, make script posix compilant

* v23, add migration script to update {pre,post}-receive and update hooks

* migration: use a more common name and rename v23 to v26 to avoid conflicts

* gofmt'ed and added copyright header

* fix SyncRepositoryHooks to also sync wiki repos

* no migration for you.
2017-03-28 15:47:59 +08:00
Lunny Xiao
d9bdf7a65d fix migration failed when authorized_keys is not exist (#1375)
* fix wiki bugs (#1294)

* fix migration failed when authorized_keys is not exist
2017-03-23 23:07:30 +08:00
Lunny Xiao
11ad296347 fix wiki bugs (#1294) (#1338) 2017-03-20 22:54:33 +08:00
Lunny Xiao
5fad54248f fix forget migration for wiki hooks (#1227) (#1237) 2017-03-17 13:01:33 +08:00
Philippe Kueck
2b5e4b4d96 fix #1189, commit messages containing a pipe (#1218)
(d680164f11)
2017-03-16 19:41:19 +08:00
Lunny Xiao
65eea82c3e fix repo settings external tracker failed and check external urls (#1215) (#1236) 2017-03-13 16:23:00 +08:00
Lunny Xiao
fac75b8086 Fix upgrade failed after ever rollback (#1194) (#1197)
* fix upgrade failed after rollback

* fix upgrade failed after rollback

* fix possible upgrade twice fail after rollback
2017-03-11 17:01:22 +08:00
Lunny Xiao
e4706127f9 bug fixed for delete repo failed (#1193) (#1195) 2017-03-10 22:28:00 +08:00
Lunny Xiao
c9baf9d14b fix ini format incomiptable with crowdin (#1177) (#1192) 2017-03-10 20:59:51 +08:00
51 changed files with 803 additions and 488 deletions

View File

@ -57,11 +57,11 @@ pipeline:
when: when:
event: [ push, tag, pull_request ] event: [ push, tag, pull_request ]
coverage: # coverage:
image: plugins/coverage # image: plugins/coverage
server: https://coverage.gitea.io # server: https://coverage.gitea.io
when: # when:
event: [ push, tag, pull_request ] # event: [ push, tag, pull_request ]
docker: docker:
image: plugins/docker image: plugins/docker

View File

@ -1 +1 @@
eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9zcnYvYXBwCiAgcGF0aDogc3JjL2NvZGUuZ2l0ZWEuaW8vZ2l0ZWEKCnBpcGVsaW5lOgogIGNsb25lOgogICAgaW1hZ2U6IHBsdWdpbnMvZ2l0CiAgICB0YWdzOiB0cnVlCgogIHRlc3Q6CiAgICBpbWFnZTogd2ViaGlwcGllL2dvbGFuZzplZGdlCiAgICBwdWxsOiB0cnVlCiAgICBlbnZpcm9ubWVudDoKICAgICAgVEFHUzogYmluZGF0YSBzcWxpdGUKICAgICAgR09QQVRIOiAvc3J2L2FwcAogICAgY29tbWFuZHM6CiAgICAgIC0gYXBrIC1VIGFkZCBvcGVuc3NoLWNsaWVudAogICAgICAtIG1ha2UgY2xlYW4KICAgICAgLSBtYWtlIGdlbmVyYXRlCiAgICAgIC0gbWFrZSB2ZXQKICAgICAgLSBtYWtlIGxpbnQKICAgICAgLSBtYWtlIHRlc3QKICAgICAgLSBtYWtlIGJ1aWxkCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCgogIHRlc3QtbXlzcWw6CiAgICBpbWFnZTogd2ViaGlwcGllL2dvbGFuZzplZGdlCiAgICBwdWxsOiB0cnVlCiAgICBlbnZpcm9ubWVudDoKICAgICAgVEFHUzogYmluZGF0YQogICAgICBHT1BBVEg6IC9zcnYvYXBwCiAgICBjb21tYW5kczoKICAgICAgLSBtYWtlIHRlc3QtbXlzcWwKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgdGVzdC1wZ3NxbDoKICAgIGltYWdlOiB3ZWJoaXBwaWUvZ29sYW5nOmVkZ2UKICAgIHB1bGw6IHRydWUKICAgIGVudmlyb25tZW50OgogICAgICBUQUdTOiBiaW5kYXRhCiAgICAgIEdPUEFUSDogL3Nydi9hcHAKICAgIGNvbW1hbmRzOgogICAgICAtIG1ha2UgdGVzdC1wZ3NxbAogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCwgdGFnLCBwdWxsX3JlcXVlc3QgXQoKICBzdGF0aWM6CiAgICBpbWFnZToga2FyYWxhYmUveGdvLWxhdGVzdDpsYXRlc3QKICAgIHB1bGw6IHRydWUKICAgIGVudmlyb25tZW50OgogICAgICBUQUdTOiBiaW5kYXRhIHNxbGl0ZQogICAgICBHT1BBVEg6IC9zcnYvYXBwCiAgICBjb21tYW5kczoKICAgICAgLSBtYWtlIHJlbGVhc2UKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgY292ZXJhZ2U6CiAgICBpbWFnZTogcGx1Z2lucy9jb3ZlcmFnZQogICAgc2VydmVyOiBodHRwczovL2NvdmVyYWdlLmdpdGVhLmlvCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCgogIGRvY2tlcjoKICAgIGltYWdlOiBwbHVnaW5zL2RvY2tlcgogICAgcmVwbzogZ2l0ZWEvZ2l0ZWEKICAgIHRhZ3M6IFsgJyR7RFJPTkVfVEFHIyN2fScgXQogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgdGFnIF0KICAgICAgYnJhbmNoOiBbIHJlZnMvdGFncy8qIF0KCiAgZG9ja2VyOgogICAgaW1hZ2U6IHBsdWdpbnMvZG9ja2VyCiAgICByZXBvOiBnaXRlYS9naXRlYQogICAgdGFnczogWyAnJHtEUk9ORV9CUkFOQ0gjI3JlbGVhc2Uvdn0nIF0KICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2ggXQogICAgICBicmFuY2g6IFsgcmVsZWFzZS8qIF0KCiAgZG9ja2VyOgogICAgaW1hZ2U6IHBsdWdpbnMvZG9ja2VyCiAgICByZXBvOiBnaXRlYS9naXRlYQogICAgdGFnczogWyAnbGF0ZXN0JyBdCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoIF0KICAgICAgYnJhbmNoOiBbIG1hc3RlciBdCgogIHJlbGVhc2U6CiAgICBpbWFnZTogcGx1Z2lucy9zMwogICAgcGF0aF9zdHlsZTogdHJ1ZQogICAgc3RyaXBfcHJlZml4OiBkaXN0L3JlbGVhc2UvCiAgICBzb3VyY2U6IGRpc3QvcmVsZWFzZS8qCiAgICB0YXJnZXQ6IC9naXRlYS8ke0RST05FX1RBRyMjdn0KICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHRhZyBdCiAgICAgIGJyYW5jaDogWyByZWZzL3RhZ3MvKiBdCgogIHJlbGVhc2U6CiAgICBpbWFnZTogcGx1Z2lucy9zMwogICAgcGF0aF9zdHlsZTogdHJ1ZQogICAgc3RyaXBfcHJlZml4OiBkaXN0L3JlbGVhc2UvCiAgICBzb3VyY2U6IGRpc3QvcmVsZWFzZS8qCiAgICB0YXJnZXQ6IC9naXRlYS8ke0RST05FX0JSQU5DSCMjcmVsZWFzZS92fQogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCBdCiAgICAgIGJyYW5jaDogWyByZWxlYXNlLyogXQoKICByZWxlYXNlOgogICAgaW1hZ2U6IHBsdWdpbnMvczMKICAgIHBhdGhfc3R5bGU6IHRydWUKICAgIHN0cmlwX3ByZWZpeDogZGlzdC9yZWxlYXNlLwogICAgc291cmNlOiBkaXN0L3JlbGVhc2UvKgogICAgdGFyZ2V0OiAvZ2l0ZWEvbWFzdGVyCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoIF0KICAgICAgYnJhbmNoOiBbIG1hc3RlciBdCgogIGdpdGh1YjoKICAgIGltYWdlOiBwbHVnaW5zL2dpdGh1Yi1yZWxlYXNlCiAgICBmaWxlczoKICAgICAgLSBkaXN0L3JlbGVhc2UvKgogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgdGFnIF0KICAgICAgYnJhbmNoOiBbIHJlZnMvdGFncy8qIF0KCiAgZ2l0dGVyOgogICAgaW1hZ2U6IHBsdWdpbnMvZ2l0dGVyCgpzZXJ2aWNlczoKICBteXNxbDoKICAgIGltYWdlOiBteXNxbDo1LjcKICAgIGVudmlyb25tZW50OgogICAgICAtIE1ZU1FMX0RBVEFCQVNFPXRlc3QKICAgICAgLSBNWVNRTF9BTExPV19FTVBUWV9QQVNTV09SRD15ZXMKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgcGdzcWw6CiAgICBpbWFnZTogcG9zdGdyZXM6OS41CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBQT1NUR1JFU19EQj10ZXN0CiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCg.hp6IsxbFIQOaxJdmGv32Vf34-Nra3KqVIWzH52W687I eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9zcnYvYXBwCiAgcGF0aDogc3JjL2NvZGUuZ2l0ZWEuaW8vZ2l0ZWEKCnBpcGVsaW5lOgogIGNsb25lOgogICAgaW1hZ2U6IHBsdWdpbnMvZ2l0CiAgICB0YWdzOiB0cnVlCgogIHRlc3Q6CiAgICBpbWFnZTogd2ViaGlwcGllL2dvbGFuZzplZGdlCiAgICBwdWxsOiB0cnVlCiAgICBlbnZpcm9ubWVudDoKICAgICAgVEFHUzogYmluZGF0YSBzcWxpdGUKICAgICAgR09QQVRIOiAvc3J2L2FwcAogICAgY29tbWFuZHM6CiAgICAgIC0gYXBrIC1VIGFkZCBvcGVuc3NoLWNsaWVudAogICAgICAtIG1ha2UgY2xlYW4KICAgICAgLSBtYWtlIGdlbmVyYXRlCiAgICAgIC0gbWFrZSB2ZXQKICAgICAgLSBtYWtlIGxpbnQKICAgICAgLSBtYWtlIHRlc3QKICAgICAgLSBtYWtlIGJ1aWxkCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCgogIHRlc3QtbXlzcWw6CiAgICBpbWFnZTogd2ViaGlwcGllL2dvbGFuZzplZGdlCiAgICBwdWxsOiB0cnVlCiAgICBlbnZpcm9ubWVudDoKICAgICAgVEFHUzogYmluZGF0YQogICAgICBHT1BBVEg6IC9zcnYvYXBwCiAgICBjb21tYW5kczoKICAgICAgLSBtYWtlIHRlc3QtbXlzcWwKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgdGVzdC1wZ3NxbDoKICAgIGltYWdlOiB3ZWJoaXBwaWUvZ29sYW5nOmVkZ2UKICAgIHB1bGw6IHRydWUKICAgIGVudmlyb25tZW50OgogICAgICBUQUdTOiBiaW5kYXRhCiAgICAgIEdPUEFUSDogL3Nydi9hcHAKICAgIGNvbW1hbmRzOgogICAgICAtIG1ha2UgdGVzdC1wZ3NxbAogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCwgdGFnLCBwdWxsX3JlcXVlc3QgXQoKICBzdGF0aWM6CiAgICBpbWFnZToga2FyYWxhYmUveGdvLWxhdGVzdDpsYXRlc3QKICAgIHB1bGw6IHRydWUKICAgIGVudmlyb25tZW50OgogICAgICBUQUdTOiBiaW5kYXRhIHNxbGl0ZQogICAgICBHT1BBVEg6IC9zcnYvYXBwCiAgICBjb21tYW5kczoKICAgICAgLSBtYWtlIHJlbGVhc2UKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgIyBjb3ZlcmFnZToKICAjICAgaW1hZ2U6IHBsdWdpbnMvY292ZXJhZ2UKICAjICAgc2VydmVyOiBodHRwczovL2NvdmVyYWdlLmdpdGVhLmlvCiAgIyAgIHdoZW46CiAgIyAgICAgZXZlbnQ6IFsgcHVzaCwgdGFnLCBwdWxsX3JlcXVlc3QgXQoKICBkb2NrZXI6CiAgICBpbWFnZTogcGx1Z2lucy9kb2NrZXIKICAgIHJlcG86IGdpdGVhL2dpdGVhCiAgICB0YWdzOiBbICcke0RST05FX1RBRyMjdn0nIF0KICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHRhZyBdCiAgICAgIGJyYW5jaDogWyByZWZzL3RhZ3MvKiBdCgogIGRvY2tlcjoKICAgIGltYWdlOiBwbHVnaW5zL2RvY2tlcgogICAgcmVwbzogZ2l0ZWEvZ2l0ZWEKICAgIHRhZ3M6IFsgJyR7RFJPTkVfQlJBTkNIIyNyZWxlYXNlL3Z9JyBdCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoIF0KICAgICAgYnJhbmNoOiBbIHJlbGVhc2UvKiBdCgogIGRvY2tlcjoKICAgIGltYWdlOiBwbHVnaW5zL2RvY2tlcgogICAgcmVwbzogZ2l0ZWEvZ2l0ZWEKICAgIHRhZ3M6IFsgJ2xhdGVzdCcgXQogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCBdCiAgICAgIGJyYW5jaDogWyBtYXN0ZXIgXQoKICByZWxlYXNlOgogICAgaW1hZ2U6IHBsdWdpbnMvczMKICAgIHBhdGhfc3R5bGU6IHRydWUKICAgIHN0cmlwX3ByZWZpeDogZGlzdC9yZWxlYXNlLwogICAgc291cmNlOiBkaXN0L3JlbGVhc2UvKgogICAgdGFyZ2V0OiAvZ2l0ZWEvJHtEUk9ORV9UQUcjI3Z9CiAgICB3aGVuOgogICAgICBldmVudDogWyB0YWcgXQogICAgICBicmFuY2g6IFsgcmVmcy90YWdzLyogXQoKICByZWxlYXNlOgogICAgaW1hZ2U6IHBsdWdpbnMvczMKICAgIHBhdGhfc3R5bGU6IHRydWUKICAgIHN0cmlwX3ByZWZpeDogZGlzdC9yZWxlYXNlLwogICAgc291cmNlOiBkaXN0L3JlbGVhc2UvKgogICAgdGFyZ2V0OiAvZ2l0ZWEvJHtEUk9ORV9CUkFOQ0gjI3JlbGVhc2Uvdn0KICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2ggXQogICAgICBicmFuY2g6IFsgcmVsZWFzZS8qIF0KCiAgcmVsZWFzZToKICAgIGltYWdlOiBwbHVnaW5zL3MzCiAgICBwYXRoX3N0eWxlOiB0cnVlCiAgICBzdHJpcF9wcmVmaXg6IGRpc3QvcmVsZWFzZS8KICAgIHNvdXJjZTogZGlzdC9yZWxlYXNlLyoKICAgIHRhcmdldDogL2dpdGVhL21hc3RlcgogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCBdCiAgICAgIGJyYW5jaDogWyBtYXN0ZXIgXQoKICBnaXRodWI6CiAgICBpbWFnZTogcGx1Z2lucy9naXRodWItcmVsZWFzZQogICAgZmlsZXM6CiAgICAgIC0gZGlzdC9yZWxlYXNlLyoKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHRhZyBdCiAgICAgIGJyYW5jaDogWyByZWZzL3RhZ3MvKiBdCgogIGdpdHRlcjoKICAgIGltYWdlOiBwbHVnaW5zL2dpdHRlcgoKc2VydmljZXM6CiAgbXlzcWw6CiAgICBpbWFnZTogbXlzcWw6NS43CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBNWVNRTF9EQVRBQkFTRT10ZXN0CiAgICAgIC0gTVlTUUxfQUxMT1dfRU1QVFlfUEFTU1dPUkQ9eWVzCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCgogIHBnc3FsOgogICAgaW1hZ2U6IHBvc3RncmVzOjkuNQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gUE9TVEdSRVNfREI9dGVzdAogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCwgdGFnLCBwdWxsX3JlcXVlc3QgXQo.uf02h57dWfCrxG3rcNcYlZPQP2XsFhKvcF2geGTpG50

View File

@ -1,5 +1,48 @@
# Changelog # Changelog
## [1.1.4](https://github.com/go-gitea/gitea/releases/tag/v1.1.4) - 2017-09-04
* BUGFIXES
* Fix rendering of external links (#2292) (#2315)
* Fix deleted milestone bug (#1942) (#2300)
* fix 500 error when view an issue which's milestone deleted (#2297) (#2299)
* Fix SHA1 hash linking (#2143) (#2293)
* back port from #1709 (#2291)
## [1.1.3](https://github.com/go-gitea/gitea/releases/tag/v1.1.3) - 2017-08-03
* BUGFIXES
* Fix PR template error (#2008)
* Fix markdown rendering (fix #1530) (#2043)
* Fix missing less sources for oauth (backport #1288) (#2135)
* Don't ignore gravatar error (#2138)
* Fix diff of renamed and modified file (#2136)
* Fix fast-forward PR bug (#2137)
* Fix some security bugs
## [1.1.2](https://github.com/go-gitea/gitea/releases/tag/v1.1.2) - 2017-06-13
* BUGFIXES
* Enforce netgo build tag while cross-compilation (Backport of #1690) (#1731)
* fix update avatar
* fix delete user failed on sqlite (#1321)
* fix bug not to trim space of login username (#1806)
* Backport bugfixes #1220 and #1393 to v1.1 (#1758)
## [1.1.1](https://github.com/go-gitea/gitea/releases/tag/v1.1.1) - 2017-05-04
* BUGFIXES
* Markdown Sanitation Fix [#1646](https://github.com/go-gitea/gitea/pull/1646)
* Fix broken hooks [#1376](https://github.com/go-gitea/gitea/pull/1376)
* Fix migration issue [#1375](https://github.com/go-gitea/gitea/pull/1375)
* Fix Wiki Issues [#1338](https://github.com/go-gitea/gitea/pull/1338)
* Forgotten migration for wiki githooks [#1237](https://github.com/go-gitea/gitea/pull/1237)
* Commit messages can contain pipes [#1218](https://github.com/go-gitea/gitea/pull/1218)
* Verify external tracker URLs [#1236](https://github.com/go-gitea/gitea/pull/1236)
* Allow upgrade after downgrade [#1197](https://github.com/go-gitea/gitea/pull/1197)
* 500 on delete repo with issue [#1195](https://github.com/go-gitea/gitea/pull/1195)
* INI compat with CrowdIn [#1192](https://github.com/go-gitea/gitea/pull/1192)
## [1.1.0](https://github.com/go-gitea/gitea/releases/tag/v1.1.0) - 2017-03-09 ## [1.1.0](https://github.com/go-gitea/gitea/releases/tag/v1.1.0) - 2017-03-09
* BREAKING * BREAKING

View File

@ -112,7 +112,7 @@ release-windows:
@hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ @hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
go get -u github.com/karalabe/xgo; \ go get -u github.com/karalabe/xgo; \
fi fi
xgo -dest $(DIST)/binaries -tags '$(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'windows/*' -out gitea-$(VERSION) . xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'windows/*' -out gitea-$(VERSION) .
ifeq ($(CI),drone) ifeq ($(CI),drone)
mv /build/* $(DIST)/binaries mv /build/* $(DIST)/binaries
endif endif
@ -122,7 +122,7 @@ release-linux:
@hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ @hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
go get -u github.com/karalabe/xgo; \ go get -u github.com/karalabe/xgo; \
fi fi
xgo -dest $(DIST)/binaries -tags '$(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'linux/*' -out gitea-$(VERSION) . xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'linux/*' -out gitea-$(VERSION) .
ifeq ($(CI),drone) ifeq ($(CI),drone)
mv /build/* $(DIST)/binaries mv /build/* $(DIST)/binaries
endif endif
@ -132,7 +132,7 @@ release-darwin:
@hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ @hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
go get -u github.com/karalabe/xgo; \ go get -u github.com/karalabe/xgo; \
fi fi
xgo -dest $(DIST)/binaries -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -targets 'darwin/*' -out gitea-$(VERSION) . xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '$(LDFLAGS)' -targets 'darwin/*' -out gitea-$(VERSION) .
ifeq ($(CI),drone) ifeq ($(CI),drone)
mv /build/* $(DIST)/binaries mv /build/* $(DIST)/binaries
endif endif

View File

@ -360,7 +360,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err
issue, err := GetIssueByRef(ref) issue, err := GetIssueByRef(ref)
if err != nil { if err != nil {
if IsErrIssueNotExist(err) { if IsErrIssueNotExist(err) || err == errMissingIssueNumber {
continue continue
} }
return err return err
@ -398,7 +398,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err
issue, err := GetIssueByRef(ref) issue, err := GetIssueByRef(ref)
if err != nil { if err != nil {
if IsErrIssueNotExist(err) { if IsErrIssueNotExist(err) || err == errMissingIssueNumber {
continue continue
} }
return err return err
@ -438,7 +438,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err
issue, err := GetIssueByRef(ref) issue, err := GetIssueByRef(ref)
if err != nil { if err != nil {
if IsErrIssueNotExist(err) { if IsErrIssueNotExist(err) || err == errMissingIssueNumber {
continue continue
} }
return err return err

View File

@ -9,8 +9,8 @@ import "github.com/markbates/goth"
// ExternalLoginUser makes the connecting between some existing user and additional external login sources // ExternalLoginUser makes the connecting between some existing user and additional external login sources
type ExternalLoginUser struct { type ExternalLoginUser struct {
ExternalID string `xorm:"NOT NULL"` ExternalID string `xorm:"NOT NULL"`
UserID int64 `xorm:"NOT NULL"` UserID int64 `xorm:"NOT NULL"`
LoginSourceID int64 `xorm:"NOT NULL"` LoginSourceID int64 `xorm:"NOT NULL"`
} }
// GetExternalLogin checks if a externalID in loginSourceID scope already exists // GetExternalLogin checks if a externalID in loginSourceID scope already exists
@ -67,8 +67,8 @@ func RemoveAccountLink(user *User, loginSourceID int64) (int64, error) {
return deleted, err return deleted, err
} }
// RemoveAllAccountLinks will remove all external login sources for the given user // removeAllAccountLinks will remove all external login sources for the given user
func RemoveAllAccountLinks(user *User) error { func removeAllAccountLinks(e Engine, user *User) error {
_, err := x.Delete(&ExternalLoginUser{UserID: user.ID}) _, err := e.Delete(&ExternalLoginUser{UserID: user.ID})
return err return err
} }

View File

@ -366,10 +366,12 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D
} }
curFile = &DiffFile{ curFile = &DiffFile{
Name: a, Name: b,
Index: len(diff.Files) + 1, OldName: a,
Type: DiffFileChange, Index: len(diff.Files) + 1,
Sections: make([]*DiffSection, 0, 10), Type: DiffFileChange,
Sections: make([]*DiffSection, 0, 10),
IsRenamed: a != b,
} }
diff.Files = append(diff.Files, curFile) diff.Files = append(diff.Files, curFile)
if len(diff.Files) >= maxFiles { if len(diff.Files) >= maxFiles {
@ -402,9 +404,6 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D
curFile.Type = DiffFileChange curFile.Type = DiffFileChange
case strings.HasPrefix(line, "similarity index 100%"): case strings.HasPrefix(line, "similarity index 100%"):
curFile.Type = DiffFileRename curFile.Type = DiffFileRename
curFile.IsRenamed = true
curFile.OldName = curFile.Name
curFile.Name = b
} }
if curFile.Type > 0 { if curFile.Type > 0 {
if strings.HasSuffix(line, " 160000\n") { if strings.HasSuffix(line, " 160000\n") {

View File

@ -78,8 +78,8 @@ func graphItemFromString(s string, r *git.Repository) (GraphItem, error) {
return GraphItem{}, fmt.Errorf("Failed parsing grap line:%s. Expect 1 or two fields", s) return GraphItem{}, fmt.Errorf("Failed parsing grap line:%s. Expect 1 or two fields", s)
} }
rows := strings.Split(data, "|") rows := strings.SplitN(data, "|", 8)
if len(rows) != 8 { if len(rows) < 8 {
return GraphItem{}, fmt.Errorf("Failed parsing grap line:%s - Should containt 8 datafields", s) return GraphItem{}, fmt.Errorf("Failed parsing grap line:%s - Should containt 8 datafields", s)
} }

View File

@ -146,7 +146,7 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
if issue.Milestone == nil && issue.MilestoneID > 0 { if issue.Milestone == nil && issue.MilestoneID > 0 {
issue.Milestone, err = getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) issue.Milestone, err = getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID)
if err != nil { if err != nil && !IsErrMilestoneNotExist(err) {
return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v", issue.RepoID, issue.MilestoneID, err) return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v", issue.RepoID, issue.MilestoneID, err)
} }
} }

View File

@ -231,12 +231,9 @@ func (c *Comment) LoadMilestone() error {
has, err := x.ID(c.OldMilestoneID).Get(&oldMilestone) has, err := x.ID(c.OldMilestoneID).Get(&oldMilestone)
if err != nil { if err != nil {
return err return err
} else if !has { } else if has {
return ErrMilestoneNotExist{ c.OldMilestone = &oldMilestone
ID: c.OldMilestoneID,
}
} }
c.OldMilestone = &oldMilestone
} }
if c.MilestoneID > 0 { if c.MilestoneID > 0 {
@ -244,12 +241,9 @@ func (c *Comment) LoadMilestone() error {
has, err := x.ID(c.MilestoneID).Get(&milestone) has, err := x.ID(c.MilestoneID).Get(&milestone)
if err != nil { if err != nil {
return err return err
} else if !has { } else if has {
return ErrMilestoneNotExist{ c.Milestone = &milestone
ID: c.MilestoneID,
}
} }
c.Milestone = &milestone
} }
return nil return nil
} }

View File

@ -635,7 +635,12 @@ func UserSignIn(username, password string) (*User, error) {
} }
} }
} else { } else {
user = &User{LowerName: strings.ToLower(strings.TrimSpace(username))} trimmedUsername := strings.TrimSpace(username)
if len(trimmedUsername) == 0 {
return nil, ErrUserNotExist{0, username, 0}
}
user = &User{LowerName: strings.ToLower(trimmedUsername)}
} }
hasUser, err := x.Get(user) hasUser, err := x.Get(user)

View File

@ -92,6 +92,8 @@ var migrations = []Migration{
NewMigration("use new avatar path name for security reason", useNewNameAvatars), NewMigration("use new avatar path name for security reason", useNewNameAvatars),
// v21 -> v22 // v21 -> v22
NewMigration("rewrite authorized_keys file via new format", useNewPublickeyFormat), NewMigration("rewrite authorized_keys file via new format", useNewPublickeyFormat),
// v21 -> v22
NewMigration("generate and migrate wiki Git hooks", generateAndMigrateWikiGitHooks),
} }
// Migrate database to current version // Migrate database to current version

View File

@ -59,6 +59,12 @@ func addUnitsToTables(x *xorm.Engine) error {
} }
var repoUnit RepoUnit var repoUnit RepoUnit
if exist, err := sess.IsTableExist(&repoUnit); err != nil {
return fmt.Errorf("IsExist RepoUnit: %v", err)
} else if exist {
return nil
}
if err := sess.CreateTable(&repoUnit); err != nil { if err := sess.CreateTable(&repoUnit); err != nil {
return fmt.Errorf("CreateTable RepoUnit: %v", err) return fmt.Errorf("CreateTable RepoUnit: %v", err)
} }

View File

@ -60,8 +60,14 @@ func generateAndMigrateGitHooks(x *xorm.Engine) (err error) {
oldHookPath := filepath.Join(hookDir, hookName) oldHookPath := filepath.Join(hookDir, hookName)
newHookPath := filepath.Join(hookDir, hookName+".d", "gitea") newHookPath := filepath.Join(hookDir, hookName+".d", "gitea")
if err = os.MkdirAll(filepath.Join(hookDir, hookName+".d"), os.ModePerm); err != nil { customHooksDir := filepath.Join(hookDir, hookName+".d")
return fmt.Errorf("create hooks dir '%s': %v", filepath.Join(hookDir, hookName+".d"), err) // if it's exist, that means you have upgraded ever
if com.IsExist(customHooksDir) {
continue
}
if err = os.MkdirAll(customHooksDir, os.ModePerm); err != nil {
return fmt.Errorf("create hooks dir '%s': %v", customHooksDir, err)
} }
// WARNING: Old server-side hooks will be moved to sub directory with the same name // WARNING: Old server-side hooks will be moved to sub directory with the same name

View File

@ -13,6 +13,7 @@ import (
"path/filepath" "path/filepath"
"strconv" "strconv"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"github.com/go-xorm/xorm" "github.com/go-xorm/xorm"
@ -33,6 +34,7 @@ func useNewNameAvatars(x *xorm.Engine) error {
} }
type User struct { type User struct {
ID int64 `xorm:"pk autoincr"`
Avatar string Avatar string
UseCustomAvatar bool UseCustomAvatar bool
} }
@ -40,7 +42,8 @@ func useNewNameAvatars(x *xorm.Engine) error {
for _, name := range names { for _, name := range names {
userID, err := strconv.ParseInt(name, 10, 64) userID, err := strconv.ParseInt(name, 10, 64)
if err != nil { if err != nil {
return err log.Warn("ignore avatar %s rename: %v", name, err)
continue
} }
var user User var user User

View File

@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"github.com/Unknwon/com"
"github.com/go-xorm/xorm" "github.com/go-xorm/xorm"
) )
@ -21,6 +22,10 @@ const (
func useNewPublickeyFormat(x *xorm.Engine) error { func useNewPublickeyFormat(x *xorm.Engine) error {
fpath := filepath.Join(setting.SSH.RootPath, "authorized_keys") fpath := filepath.Join(setting.SSH.RootPath, "authorized_keys")
if !com.IsExist(fpath) {
return nil
}
tmpPath := fpath + ".tmp" tmpPath := fpath + ".tmp"
f, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) f, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil { if err != nil {

94
models/migrations/v22.go Normal file
View File

@ -0,0 +1,94 @@
// Copyright 2017 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 (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"code.gitea.io/gitea/modules/setting"
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
)
func generateAndMigrateWikiGitHooks(x *xorm.Engine) (err error) {
type Repository struct {
ID int64
OwnerID int64
Name string
}
type User struct {
ID int64
Name string
}
var (
hookNames = []string{"pre-receive", "update", "post-receive"}
hookTpls = []string{
fmt.Sprintf("#!/usr/bin/env %s\nORI_DIR=`pwd`\nSHELL_FOLDER=$(cd \"$(dirname \"$0\")\";pwd)\ncd \"$ORI_DIR\"\nfor i in `ls \"$SHELL_FOLDER/pre-receive.d\"`; do\n sh \"$SHELL_FOLDER/pre-receive.d/$i\"\ndone", setting.ScriptType),
fmt.Sprintf("#!/usr/bin/env %s\nORI_DIR=`pwd`\nSHELL_FOLDER=$(cd \"$(dirname \"$0\")\";pwd)\ncd \"$ORI_DIR\"\nfor i in `ls \"$SHELL_FOLDER/update.d\"`; do\n sh \"$SHELL_FOLDER/update.d/$i\" $1 $2 $3\ndone", setting.ScriptType),
fmt.Sprintf("#!/usr/bin/env %s\nORI_DIR=`pwd`\nSHELL_FOLDER=$(cd \"$(dirname \"$0\")\";pwd)\ncd \"$ORI_DIR\"\nfor i in `ls \"$SHELL_FOLDER/post-receive.d\"`; do\n sh \"$SHELL_FOLDER/post-receive.d/$i\"\ndone", setting.ScriptType),
}
giteaHookTpls = []string{
fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' pre-receive\n", setting.ScriptType, setting.AppPath, setting.CustomConf),
fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' update $1 $2 $3\n", setting.ScriptType, setting.AppPath, setting.CustomConf),
fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' post-receive\n", setting.ScriptType, setting.AppPath, setting.CustomConf),
}
)
return x.Where("id > 0").Iterate(new(Repository),
func(idx int, bean interface{}) error {
repo := bean.(*Repository)
user := new(User)
has, err := x.Where("id = ?", repo.OwnerID).Get(user)
if err != nil {
return fmt.Errorf("query owner of repository [repo_id: %d, owner_id: %d]: %v", repo.ID, repo.OwnerID, err)
} else if !has {
return nil
}
repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".wiki.git"
if !com.IsExist(repoPath) {
return nil
}
hookDir := filepath.Join(repoPath, "hooks")
for i, hookName := range hookNames {
oldHookPath := filepath.Join(hookDir, hookName)
newHookPath := filepath.Join(hookDir, hookName+".d", "gitea")
customHooksDir := filepath.Join(hookDir, hookName+".d")
// if it's exist, that means you have upgraded ever
if com.IsExist(customHooksDir) {
continue
}
if err = os.MkdirAll(customHooksDir, os.ModePerm); err != nil {
return fmt.Errorf("create hooks dir '%s': %v", customHooksDir, err)
}
// WARNING: Old server-side hooks will be moved to sub directory with the same name
if hookName != "update" && com.IsExist(oldHookPath) {
newPlace := filepath.Join(hookDir, hookName+".d", hookName)
if err = os.Rename(oldHookPath, newPlace); err != nil {
return fmt.Errorf("Remove old hook file '%s' to '%s': %v", oldHookPath, newPlace, err)
}
}
if err = ioutil.WriteFile(oldHookPath, []byte(hookTpls[i]), 0777); err != nil {
return fmt.Errorf("write old hook file '%s': %v", oldHookPath, err)
}
if err = ioutil.WriteFile(newHookPath, []byte(giteaHookTpls[i]), 0777); err != nil {
return fmt.Errorf("write new hook file '%s': %v", oldHookPath, err)
}
}
return nil
})
}

View File

@ -499,9 +499,15 @@ func (pr *PullRequest) getMergeCommit() (*git.Commit, error) {
return nil, fmt.Errorf("git merge-base --is-ancestor: %v %v", stderr, err) return nil, fmt.Errorf("git merge-base --is-ancestor: %v %v", stderr, err)
} }
// We can ignore this error since we only get here when there's a valid commit in headFile commitIDBytes, err := ioutil.ReadFile(pr.BaseRepo.RepoPath() + "/" + headFile)
commitID, _ := ioutil.ReadFile(pr.BaseRepo.RepoPath() + "/" + headFile) if err != nil {
cmd := string(commitID)[:40] + ".." + pr.BaseBranch return nil, fmt.Errorf("ReadFile(%s): %v", headFile, err)
}
commitID := string(commitIDBytes)
if len(commitID) < 40 {
return nil, fmt.Errorf(`ReadFile(%s): invalid commit-ID "%s"`, headFile, commitID)
}
cmd := commitID[:40] + ".." + pr.BaseBranch
// Get the commit from BaseBranch where the pull request got merged // Get the commit from BaseBranch where the pull request got merged
mergeCommit, stderr, err := process.GetManager().ExecDirEnv(-1, "", fmt.Sprintf("isMerged (git rev-list --ancestry-path --merges --reverse): %d", pr.BaseRepo.ID), mergeCommit, stderr, err := process.GetManager().ExecDirEnv(-1, "", fmt.Sprintf("isMerged (git rev-list --ancestry-path --merges --reverse): %d", pr.BaseRepo.ID),
@ -510,6 +516,9 @@ func (pr *PullRequest) getMergeCommit() (*git.Commit, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("git rev-list --ancestry-path --merges --reverse: %v %v", stderr, err) return nil, fmt.Errorf("git rev-list --ancestry-path --merges --reverse: %v %v", stderr, err)
} else if len(mergeCommit) < 40 {
// PR was fast-forwarded, so just use last commit of PR
mergeCommit = commitID[:40]
} }
gitRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath()) gitRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath())

View File

@ -582,7 +582,7 @@ func (repo *Repository) DescriptionHTML() template.HTML {
sanitize := func(s string) string { sanitize := func(s string) string {
return fmt.Sprintf(`<a href="%[1]s" target="_blank" rel="noopener">%[1]s</a>`, s) return fmt.Sprintf(`<a href="%[1]s" target="_blank" rel="noopener">%[1]s</a>`, s)
} }
return template.HTML(descPattern.ReplaceAllStringFunc(markdown.Sanitizer.Sanitize(repo.Description), sanitize)) return template.HTML(descPattern.ReplaceAllStringFunc(markdown.Sanitize(repo.Description), sanitize))
} }
// LocalCopyPath returns the local repository copy path // LocalCopyPath returns the local repository copy path
@ -844,12 +844,8 @@ func cleanUpMigrateGitConfig(configPath string) error {
// createDelegateHooks creates all the hooks scripts for the repo // createDelegateHooks creates all the hooks scripts for the repo
func createDelegateHooks(repoPath string) (err error) { func createDelegateHooks(repoPath string) (err error) {
var ( var (
hookNames = []string{"pre-receive", "update", "post-receive"} hookNames = []string{"pre-receive", "update", "post-receive"}
hookTpls = []string{ hookTpl = fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType)
fmt.Sprintf("#!/usr/bin/env %s\nORI_DIR=`pwd`\nSHELL_FOLDER=$(cd \"$(dirname \"$0\")\";pwd)\ncd \"$ORI_DIR\"\nfor i in `ls \"$SHELL_FOLDER/pre-receive.d\"`; do\n sh \"$SHELL_FOLDER/pre-receive.d/$i\"\ndone", setting.ScriptType),
fmt.Sprintf("#!/usr/bin/env %s\nORI_DIR=`pwd`\nSHELL_FOLDER=$(cd \"$(dirname \"$0\")\";pwd)\ncd \"$ORI_DIR\"\nfor i in `ls \"$SHELL_FOLDER/update.d\"`; do\n sh \"$SHELL_FOLDER/update.d/$i\" $1 $2 $3\ndone", setting.ScriptType),
fmt.Sprintf("#!/usr/bin/env %s\nORI_DIR=`pwd`\nSHELL_FOLDER=$(cd \"$(dirname \"$0\")\";pwd)\ncd \"$ORI_DIR\"\nfor i in `ls \"$SHELL_FOLDER/post-receive.d\"`; do\n sh \"$SHELL_FOLDER/post-receive.d/$i\"\ndone", setting.ScriptType),
}
giteaHookTpls = []string{ giteaHookTpls = []string{
fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' pre-receive\n", setting.ScriptType, setting.AppPath, setting.CustomConf), fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' pre-receive\n", setting.ScriptType, setting.AppPath, setting.CustomConf),
fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' update $1 $2 $3\n", setting.ScriptType, setting.AppPath, setting.CustomConf), fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' update $1 $2 $3\n", setting.ScriptType, setting.AppPath, setting.CustomConf),
@ -868,7 +864,7 @@ func createDelegateHooks(repoPath string) (err error) {
} }
// WARNING: This will override all old server-side hooks // WARNING: This will override all old server-side hooks
if err = ioutil.WriteFile(oldHookPath, []byte(hookTpls[i]), 0777); err != nil { if err = ioutil.WriteFile(oldHookPath, []byte(hookTpl), 0777); err != nil {
return fmt.Errorf("write old hook file '%s': %v", oldHookPath, err) return fmt.Errorf("write old hook file '%s': %v", oldHookPath, err)
} }
@ -1585,7 +1581,7 @@ func DeleteRepository(uid, repoID int64) error {
attachments := make([]*Attachment, 0, 5) attachments := make([]*Attachment, 0, 5)
if err = sess. if err = sess.
In("issue_id=?", issueIDs). In("issue_id", issueIDs).
Find(&attachments); err != nil { Find(&attachments); err != nil {
return err return err
} }
@ -1909,6 +1905,11 @@ func SyncRepositoryHooks() error {
if err := createDelegateHooks(bean.(*Repository).RepoPath()); err != nil { if err := createDelegateHooks(bean.(*Repository).RepoPath()); err != nil {
return fmt.Errorf("SyncRepositoryHook: %v", err) return fmt.Errorf("SyncRepositoryHook: %v", err)
} }
if bean.(*Repository).HasWiki() {
if err := createDelegateHooks(bean.(*Repository).WikiPath()); err != nil {
return fmt.Errorf("SyncRepositoryHook: %v", err)
}
}
return nil return nil
}) })
} }

View File

@ -163,7 +163,7 @@ func (u *User) UpdateDiffViewStyle(style string) error {
func (u *User) AfterSet(colName string, _ xorm.Cell) { func (u *User) AfterSet(colName string, _ xorm.Cell) {
switch colName { switch colName {
case "full_name": case "full_name":
u.FullName = markdown.Sanitizer.Sanitize(u.FullName) u.FullName = markdown.Sanitize(u.FullName)
case "created_unix": case "created_unix":
u.Created = time.Unix(u.CreatedUnix, 0).Local() u.Created = time.Unix(u.CreatedUnix, 0).Local()
case "updated_unix": case "updated_unix":
@ -328,15 +328,14 @@ func (u *User) generateRandomAvatar(e Engine) error {
// which includes app sub-url as prefix. However, it is possible // which includes app sub-url as prefix. However, it is possible
// to return full URL if user enables Gravatar-like service. // to return full URL if user enables Gravatar-like service.
func (u *User) RelAvatarLink() string { func (u *User) RelAvatarLink() string {
defaultImgURL := setting.AppSubURL + "/img/avatar_default.png"
if u.ID == -1 { if u.ID == -1 {
return defaultImgURL return base.DefaultAvatarLink()
} }
switch { switch {
case u.UseCustomAvatar: case u.UseCustomAvatar:
if !com.IsFile(u.CustomAvatarPath()) { if !com.IsFile(u.CustomAvatarPath()) {
return defaultImgURL return base.DefaultAvatarLink()
} }
return setting.AppSubURL + "/avatars/" + u.Avatar return setting.AppSubURL + "/avatars/" + u.Avatar
case setting.DisableGravatar, setting.OfflineMode: case setting.DisableGravatar, setting.OfflineMode:
@ -867,7 +866,7 @@ func updateUser(e Engine, u *User) error {
u.Website = base.TruncateString(u.Website, 255) u.Website = base.TruncateString(u.Website, 255)
u.Description = base.TruncateString(u.Description, 255) u.Description = base.TruncateString(u.Description, 255)
u.FullName = markdown.Sanitizer.Sanitize(u.FullName) u.FullName = markdown.Sanitize(u.FullName)
_, err := e.Id(u.ID).AllCols().Update(u) _, err := e.Id(u.ID).AllCols().Update(u)
return err return err
} }
@ -989,7 +988,7 @@ func deleteUser(e *xorm.Session, u *User) error {
} }
// ***** START: ExternalLoginUser ***** // ***** START: ExternalLoginUser *****
if err = RemoveAllAccountLinks(u); err != nil { if err = removeAllAccountLinks(e, u); err != nil {
return fmt.Errorf("ExternalLoginUser: %v", err) return fmt.Errorf("ExternalLoginUser: %v", err)
} }
// ***** END: ExternalLoginUser ***** // ***** END: ExternalLoginUser *****

View File

@ -84,7 +84,11 @@ func (repo *Repository) LocalWikiPath() string {
func (repo *Repository) UpdateLocalWiki() error { func (repo *Repository) UpdateLocalWiki() error {
// Don't pass branch name here because it fails to clone and // Don't pass branch name here because it fails to clone and
// checkout to a specific branch when wiki is an empty repository. // checkout to a specific branch when wiki is an empty repository.
return UpdateLocalCopyBranch(repo.WikiPath(), repo.LocalWikiPath(), "") var branch = ""
if com.IsExist(repo.LocalWikiPath()) {
branch = "master"
}
return UpdateLocalCopyBranch(repo.WikiPath(), repo.LocalWikiPath(), branch)
} }
func discardLocalWikiChanges(localPath string) error { func discardLocalWikiChanges(localPath string) error {

View File

@ -192,13 +192,21 @@ func HashEmail(email string) string {
return EncodeMD5(strings.ToLower(strings.TrimSpace(email))) return EncodeMD5(strings.ToLower(strings.TrimSpace(email)))
} }
// DefaultAvatarLink the default avatar link
func DefaultAvatarLink() string {
return setting.AppSubURL + "/img/avatar_default.png"
}
// AvatarLink returns relative avatar link to the site domain by given email, // AvatarLink returns relative avatar link to the site domain by given email,
// which includes app sub-url as prefix. However, it is possible // which includes app sub-url as prefix. However, it is possible
// to return full URL if user enables Gravatar-like service. // to return full URL if user enables Gravatar-like service.
func AvatarLink(email string) string { func AvatarLink(email string) string {
if setting.EnableFederatedAvatar && setting.LibravatarService != nil { if setting.EnableFederatedAvatar && setting.LibravatarService != nil {
// TODO: This doesn't check any error. AvatarLink should return (string, error) url, err := setting.LibravatarService.FromEmail(email)
url, _ := setting.LibravatarService.FromEmail(email) if err != nil {
log.Error(4, "LibravatarService.FromEmail(email=%s): error %v", email, err)
return DefaultAvatarLink()
}
return url return url
} }
@ -206,7 +214,7 @@ func AvatarLink(email string) string {
return setting.GravatarSource + HashEmail(email) return setting.GravatarSource + HashEmail(email)
} }
return setting.AppSubURL + "/img/avatar_default.png" return DefaultAvatarLink()
} }
// Seconds-based time units // Seconds-based time units

View File

@ -334,13 +334,11 @@ func RepoAssignment(args ...bool) macaron.Handler {
if ctx.Repo.IsWriter() || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID)) { if ctx.Repo.IsWriter() || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID)) {
// Pull request is allowed if this is a fork repository // Pull request is allowed if this is a fork repository
// and base repository accepts pull requests. // and base repository accepts pull requests.
if repo.BaseRepo != nil { if repo.BaseRepo != nil && repo.BaseRepo.AllowsPulls() {
if repo.BaseRepo.AllowsPulls() { ctx.Data["BaseRepo"] = repo.BaseRepo
ctx.Data["BaseRepo"] = repo.BaseRepo ctx.Repo.PullRequest.BaseRepo = repo.BaseRepo
ctx.Repo.PullRequest.BaseRepo = repo.BaseRepo ctx.Repo.PullRequest.Allowed = true
ctx.Repo.PullRequest.Allowed = true ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
}
} else { } else {
// Or, this is repository accepts pull requests between branches. // Or, this is repository accepts pull requests between branches.
if repo.AllowsPulls() { if repo.AllowsPulls() {

View File

@ -15,7 +15,6 @@ import (
"strings" "strings"
"github.com/Unknwon/com" "github.com/Unknwon/com"
"github.com/microcosm-cc/bluemonday"
"github.com/russross/blackfriday" "github.com/russross/blackfriday"
"golang.org/x/net/html" "golang.org/x/net/html"
@ -29,24 +28,6 @@ const (
IssueNameStyleAlphanumeric = "alphanumeric" IssueNameStyleAlphanumeric = "alphanumeric"
) )
// Sanitizer markdown sanitizer
var Sanitizer = bluemonday.UGCPolicy()
// BuildSanitizer initializes sanitizer with allowed attributes based on settings.
// This function should only be called once during entire application lifecycle.
func BuildSanitizer() {
// Normal markdown-stuff
Sanitizer.AllowAttrs("class").Matching(regexp.MustCompile(`[\p{L}\p{N}\s\-_',:\[\]!\./\\\(\)&]*`)).OnElements("code", "div", "ul", "ol", "dl")
// Checkboxes
Sanitizer.AllowAttrs("type").Matching(regexp.MustCompile(`^checkbox$`)).OnElements("input")
Sanitizer.AllowAttrs("checked", "disabled").OnElements("input")
Sanitizer.AllowNoAttrs().OnElements("label")
// Custom URL-Schemes
Sanitizer.AllowURLSchemes(setting.Markdown.CustomURLSchemes...)
}
// IsMarkdownFile reports whether name looks like a Markdown file // IsMarkdownFile reports whether name looks like a Markdown file
// based on its extension. // based on its extension.
func IsMarkdownFile(name string) bool { func IsMarkdownFile(name string) bool {
@ -72,6 +53,10 @@ func IsReadmeFile(name string) bool {
} }
var ( var (
// NOTE: All below regex matching do not perform any extra validation.
// Thus a link is produced even if the user does not exist, the issue does not exist, the commit does not exist, etc.
// While fast, this is also incorrect and lead to false positives.
// MentionPattern matches string that mentions someone, e.g. @Unknwon // MentionPattern matches string that mentions someone, e.g. @Unknwon
MentionPattern = regexp.MustCompile(`(\s|^|\W)@[0-9a-zA-Z-_\.]+`) MentionPattern = regexp.MustCompile(`(\s|^|\W)@[0-9a-zA-Z-_\.]+`)
@ -84,9 +69,9 @@ var (
CrossReferenceIssueNumericPattern = regexp.MustCompile(`( |^)[0-9a-zA-Z]+/[0-9a-zA-Z]+#[0-9]+\b`) CrossReferenceIssueNumericPattern = regexp.MustCompile(`( |^)[0-9a-zA-Z]+/[0-9a-zA-Z]+#[0-9]+\b`)
// Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae // Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae
// FIXME: this pattern matches pure numbers as well, right now we do a hack to check in renderSha1CurrentPattern // Although SHA1 hashes are 40 chars long, the regex matches the hash from 7 to 40 chars in length
// by converting string to a number. // so that abbreviated hash links can be used as well. This matches git and github useability.
Sha1CurrentPattern = regexp.MustCompile(`(?:^|\s|\()[0-9a-f]{40}\b`) Sha1CurrentPattern = regexp.MustCompile(`(?:^|\s|\()([0-9a-f]{7,40})\b`)
// ShortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax // ShortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax
ShortLinkPattern = regexp.MustCompile(`(\[\[.*\]\]\w*)`) ShortLinkPattern = regexp.MustCompile(`(\[\[.*\]\]\w*)`)
@ -94,12 +79,29 @@ var (
// AnySHA1Pattern allows to split url containing SHA into parts // AnySHA1Pattern allows to split url containing SHA into parts
AnySHA1Pattern = regexp.MustCompile(`(http\S*)://(\S+)/(\S+)/(\S+)/(\S+)/([0-9a-f]{40})(?:/?([^#\s]+)?(?:#(\S+))?)?`) AnySHA1Pattern = regexp.MustCompile(`(http\S*)://(\S+)/(\S+)/(\S+)/(\S+)/([0-9a-f]{40})(?:/?([^#\s]+)?(?:#(\S+))?)?`)
// IssueFullPattern allows to split issue (and pull) URLs into parts
IssueFullPattern = regexp.MustCompile(`(?:^|\s|\()(http\S*)://((?:[^\s/]+/)+)((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`)
validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`) validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`)
) )
// regexp for full links to issues/pulls
var issueFullPattern *regexp.Regexp
// InitMarkdown initialize regexps for markdown parsing
func InitMarkdown() {
getIssueFullPattern()
}
func getIssueFullPattern() *regexp.Regexp {
if issueFullPattern == nil {
appURL := setting.AppURL
if len(appURL) > 0 && appURL[len(appURL)-1] != '/' {
appURL += "/"
}
issueFullPattern = regexp.MustCompile(appURL +
`\w+/\w+/(?:issues|pulls)/((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`)
}
return issueFullPattern
}
// isLink reports whether link fits valid format. // isLink reports whether link fits valid format.
func isLink(link []byte) bool { func isLink(link []byte) bool {
return validLinksPattern.Match(link) return validLinksPattern.Match(link)
@ -174,12 +176,15 @@ func (r *Renderer) ListItem(out *bytes.Buffer, text []byte, flags int) {
} }
switch { switch {
case bytes.HasPrefix(text, []byte(prefix+"[ ] ")): case bytes.HasPrefix(text, []byte(prefix+"[ ] ")):
text = append([]byte(`<div class="ui fitted disabled checkbox"><input type="checkbox" disabled="disabled" /><label /></div>`), text[3+len(prefix):]...) text = append([]byte(`<span class="ui fitted disabled checkbox"><input type="checkbox" disabled="disabled" /><label /></span>`), text[3+len(prefix):]...)
if prefix != "" {
text = bytes.Replace(text, []byte(prefix), []byte{}, 1)
}
case bytes.HasPrefix(text, []byte(prefix+"[x] ")): case bytes.HasPrefix(text, []byte(prefix+"[x] ")):
text = append([]byte(`<div class="ui checked fitted disabled checkbox"><input type="checkbox" checked="" disabled="disabled" /><label /></div>`), text[3+len(prefix):]...) text = append([]byte(`<span class="ui checked fitted disabled checkbox"><input type="checkbox" checked="" disabled="disabled" /><label /></span>`), text[3+len(prefix):]...)
} if prefix != "" {
if prefix != "" { text = bytes.Replace(text, []byte(prefix), []byte{}, 1)
text = bytes.Replace(text, []byte("</p>"), []byte{}, 1) }
} }
r.Renderer.ListItem(out, text, flags) r.Renderer.ListItem(out, text, flags)
} }
@ -364,32 +369,17 @@ func renderFullSha1Pattern(rawBytes []byte, urlPrefix string) []byte {
return rawBytes return rawBytes
} }
// renderFullIssuePattern renders issues-like URLs // RenderFullIssuePattern renders issues-like URLs
func renderFullIssuePattern(rawBytes []byte, urlPrefix string) []byte { func RenderFullIssuePattern(rawBytes []byte) []byte {
ms := IssueFullPattern.FindAllSubmatch(rawBytes, -1) ms := getIssueFullPattern().FindAllSubmatch(rawBytes, -1)
for _, m := range ms { for _, m := range ms {
all := m[0] all := m[0]
protocol := string(m[1]) id := string(m[1])
paths := bytes.Split(m[2], []byte("/"))
paths = paths[:len(paths)-1]
if bytes.HasPrefix(paths[0], []byte("gist.")) {
continue
}
path := protocol + "://" + string(m[2])
id := string(m[3])
path = URLJoin(path, id)
var comment []byte
if len(m) > 3 {
comment = m[4]
}
urlSuffix := ""
text := "#" + id text := "#" + id
if comment != nil { // TODO if m[2] is not nil, then link is to a comment,
urlSuffix += string(comment) // and we should indicate that in the text somehow
text += " <i class='comment icon'></i>"
}
rawBytes = bytes.Replace(rawBytes, all, []byte(fmt.Sprintf( rawBytes = bytes.Replace(rawBytes, all, []byte(fmt.Sprintf(
`<a href="%s%s">%s</a>`, path, urlSuffix, text)), -1) `<a href="%s">%s</a>`, string(all), text)), -1)
} }
return rawBytes return rawBytes
} }
@ -569,12 +559,15 @@ func RenderCrossReferenceIssueIndexPattern(rawBytes []byte, urlPrefix string, me
func renderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte { func renderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte {
ms := Sha1CurrentPattern.FindAllSubmatch(rawBytes, -1) ms := Sha1CurrentPattern.FindAllSubmatch(rawBytes, -1)
for _, m := range ms { for _, m := range ms {
all := m[0] hash := m[1]
if com.StrTo(all).MustInt() > 0 { // The regex does not lie, it matches the hash pattern.
continue // However, a regex cannot know if a hash actually exists or not.
} // We could assume that a SHA1 hash should probably contain alphas AND numerics
rawBytes = bytes.Replace(rawBytes, all, []byte(fmt.Sprintf( // but that is not always the case.
`<a href="%s">%s</a>`, URLJoin(urlPrefix, "commit", string(all)), base.ShortSha(string(all)))), -1) // Although unlikely, deadbeef and 1234567 are valid short forms of SHA1 hash
// as used by git and github for linking and thus we have to do similar.
rawBytes = bytes.Replace(rawBytes, hash, []byte(fmt.Sprintf(
`<a href="%s">%s</a>`, URLJoin(urlPrefix, "commit", string(hash)), base.ShortSha(string(hash)))), -1)
} }
return rawBytes return rawBytes
} }
@ -588,12 +581,12 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]strin
[]byte(fmt.Sprintf(`<a href="%s">%s</a>`, URLJoin(setting.AppURL, string(m[1:])), m)), -1) []byte(fmt.Sprintf(`<a href="%s">%s</a>`, URLJoin(setting.AppURL, string(m[1:])), m)), -1)
} }
rawBytes = RenderFullIssuePattern(rawBytes)
rawBytes = RenderShortLinks(rawBytes, urlPrefix, false, isWikiMarkdown) rawBytes = RenderShortLinks(rawBytes, urlPrefix, false, isWikiMarkdown)
rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas) rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas)
rawBytes = RenderCrossReferenceIssueIndexPattern(rawBytes, urlPrefix, metas) rawBytes = RenderCrossReferenceIssueIndexPattern(rawBytes, urlPrefix, metas)
rawBytes = renderFullSha1Pattern(rawBytes, urlPrefix) rawBytes = renderFullSha1Pattern(rawBytes, urlPrefix)
rawBytes = renderSha1CurrentPattern(rawBytes, urlPrefix) rawBytes = renderSha1CurrentPattern(rawBytes, urlPrefix)
rawBytes = renderFullIssuePattern(rawBytes, urlPrefix)
return rawBytes return rawBytes
} }
@ -657,10 +650,8 @@ OUTER_LOOP:
// Copy the token to the output verbatim // Copy the token to the output verbatim
buf.Write(RenderShortLinks([]byte(token.String()), urlPrefix, true, isWikiMarkdown)) buf.Write(RenderShortLinks([]byte(token.String()), urlPrefix, true, isWikiMarkdown))
if token.Type == html.StartTagToken { if token.Type == html.StartTagToken && !com.IsSliceContainsStr(noEndTags, token.Data) {
if !com.IsSliceContainsStr(noEndTags, token.Data) { stackNum++
stackNum++
}
} }
// If this is the close tag to the outer-most, we are done // If this is the close tag to the outer-most, we are done
@ -675,8 +666,8 @@ OUTER_LOOP:
continue OUTER_LOOP continue OUTER_LOOP
} }
if !com.IsSliceContainsStr(noEndTags, token.Data) { if !com.IsSliceContainsStr(noEndTags, tagName) {
startTags = append(startTags, token.Data) startTags = append(startTags, tagName)
} }
case html.EndTagToken: case html.EndTagToken:
@ -708,7 +699,7 @@ func render(rawBytes []byte, urlPrefix string, metas map[string]string, isWikiMa
urlPrefix = strings.Replace(urlPrefix, " ", "+", -1) urlPrefix = strings.Replace(urlPrefix, " ", "+", -1)
result := RenderRaw(rawBytes, urlPrefix, isWikiMarkdown) result := RenderRaw(rawBytes, urlPrefix, isWikiMarkdown)
result = PostProcess(result, urlPrefix, metas, isWikiMarkdown) result = PostProcess(result, urlPrefix, metas, isWikiMarkdown)
result = Sanitizer.SanitizeBytes(result) result = SanitizeBytes(result)
return result return result
} }

View File

@ -180,13 +180,15 @@ func TestRender_AutoLink(t *testing.T) {
numericIssueLink(URLJoin(setting.AppSubURL, "issues"), 3333)) numericIssueLink(URLJoin(setting.AppSubURL, "issues"), 3333))
// render external issue URLs // render external issue URLs
tmp := "http://1111/2222/ssss-issues/3333?param=blah&blahh=333" for _, externalURL := range []string{
test(tmp, "<a href=\""+tmp+"\">#3333 <i class='comment icon'></i></a>") "http://1111/2222/ssss-issues/3333?param=blah&blahh=333",
test("http://test.com/issues/33333", numericIssueLink("http://test.com/issues", 33333)) "http://test.com/issues/33333",
test("https://issues/333", numericIssueLink("https://issues", 333)) "https://issues/333"} {
test(externalURL, externalURL)
}
// render valid commit URLs // render valid commit URLs
tmp = URLJoin(AppSubURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae") tmp := URLJoin(AppSubURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae")
test(tmp, "<a href=\""+tmp+"\">d8a994ef24</a>") test(tmp, "<a href=\""+tmp+"\">d8a994ef24</a>")
tmp += "#diff-2" tmp += "#diff-2"
test(tmp, "<a href=\""+tmp+"\">d8a994ef24 (diff-2)</a>") test(tmp, "<a href=\""+tmp+"\">d8a994ef24 (diff-2)</a>")
@ -290,6 +292,8 @@ func TestRender_Commits(t *testing.T) {
var src = strings.Replace(subtree, "/commit/", "/src/", -1) var src = strings.Replace(subtree, "/commit/", "/src/", -1)
test(sha, `<p><a href="`+commit+`" rel="nofollow">b6dd6210ea</a></p>`) test(sha, `<p><a href="`+commit+`" rel="nofollow">b6dd6210ea</a></p>`)
test(sha[:7], `<p><a href="`+commit[:len(commit)-(40-7)]+`" rel="nofollow">b6dd621</a></p>`)
test(sha[:39], `<p><a href="`+commit[:len(commit)-(40-39)]+`" rel="nofollow">b6dd6210ea</a></p>`)
test(commit, `<p><a href="`+commit+`" rel="nofollow">b6dd6210ea</a></p>`) test(commit, `<p><a href="`+commit+`" rel="nofollow">b6dd6210ea</a></p>`)
test(tree, `<p><a href="`+src+`" rel="nofollow">b6dd6210ea/src</a></p>`) test(tree, `<p><a href="`+src+`" rel="nofollow">b6dd6210ea/src</a></p>`)
} }
@ -330,6 +334,22 @@ func TestRender_CrossReferences(t *testing.T) {
`<p><a href="`+URLJoin(AppURL, "gogits", "gogs", "issues", "12345")+`" rel="nofollow">gogits/gogs#12345</a></p>`) `<p><a href="`+URLJoin(AppURL, "gogits", "gogs", "issues", "12345")+`" rel="nofollow">gogits/gogs#12345</a></p>`)
} }
func TestRender_FullIssueURLs(t *testing.T) {
setting.AppURL = AppURL
setting.AppSubURL = AppSubURL
test := func(input, expected string) {
result := RenderFullIssuePattern([]byte(input))
assert.Equal(t, expected, string(result))
}
test("Here is a link https://git.osgeo.org/gogs/postgis/postgis/pulls/6",
"Here is a link https://git.osgeo.org/gogs/postgis/postgis/pulls/6")
test("Look here http://localhost:3000/person/repo/issues/4",
`Look here <a href="http://localhost:3000/person/repo/issues/4">#4</a>`)
test("http://localhost:3000/person/repo/issues/4#issuecomment-1234",
`<a href="http://localhost:3000/person/repo/issues/4#issuecomment-1234">#4</a>`)
}
func TestRegExp_MentionPattern(t *testing.T) { func TestRegExp_MentionPattern(t *testing.T) {
trueTestCases := []string{ trueTestCases := []string{
"@Unknwon", "@Unknwon",
@ -520,50 +540,6 @@ func TestRegExp_AnySHA1Pattern(t *testing.T) {
} }
} }
func TestRegExp_IssueFullPattern(t *testing.T) {
testCases := map[string][]string{
"https://github.com/gogits/gogs/pull/3244": {
"https",
"github.com/gogits/gogs/pull/",
"3244",
"",
"",
},
"https://github.com/gogits/gogs/issues/3247#issuecomment-231517079": {
"https",
"github.com/gogits/gogs/issues/",
"3247",
"#issuecomment-231517079",
"",
},
"https://try.gogs.io/gogs/gogs/issues/4#issue-685": {
"https",
"try.gogs.io/gogs/gogs/issues/",
"4",
"#issue-685",
"",
},
"https://youtrack.jetbrains.com/issue/JT-36485": {
"https",
"youtrack.jetbrains.com/issue/",
"JT-36485",
"",
"",
},
"https://youtrack.jetbrains.com/issue/JT-36485#comment=27-1508676": {
"https",
"youtrack.jetbrains.com/issue/",
"JT-36485",
"#comment=27-1508676",
"",
},
}
for k, v := range testCases {
assert.Equal(t, IssueFullPattern.FindStringSubmatch(k)[1:], v)
}
}
func TestMisc_IsMarkdownFile(t *testing.T) { func TestMisc_IsMarkdownFile(t *testing.T) {
setting.Markdown.FileExtensions = []string{".md", ".markdown", ".mdown", ".mkd"} setting.Markdown.FileExtensions = []string{".md", ".markdown", ".mdown", ".mkd"}
trueTestCases := []string{ trueTestCases := []string{
@ -632,7 +608,7 @@ var sameCases = []string{
Ideas and codes Ideas and codes
- Bezier widget (by @r-lyeh) https://github.com/ocornut/imgui/issues/786 - Bezier widget (by @r-lyeh) ` + AppURL + `ocornut/imgui/issues/786
- Node graph editors https://github.com/ocornut/imgui/issues/306 - Node graph editors https://github.com/ocornut/imgui/issues/306
- [[Memory Editor|memory_editor_example]] - [[Memory Editor|memory_editor_example]]
- [[Plot var helper|plot_var_example]]`, - [[Plot var helper|plot_var_example]]`,
@ -668,8 +644,8 @@ func testAnswers(baseURLContent, baseURLImages string) []string {
<p>Ideas and codes</p> <p>Ideas and codes</p>
<ul> <ul>
<li>Bezier widget (by <a href="` + AppURL + `r-lyeh" rel="nofollow">@r-lyeh</a>)<a href="https://github.com/ocornut/imgui/issues/786" rel="nofollow">#786</a></li> <li>Bezier widget (by <a href="` + AppURL + `r-lyeh" rel="nofollow">@r-lyeh</a>) <a href="http://localhost:3000/ocornut/imgui/issues/786" rel="nofollow">#786</a></li>
<li>Node graph editors<a href="https://github.com/ocornut/imgui/issues/306" rel="nofollow">#306</a></li> <li>Node graph editors https://github.com/ocornut/imgui/issues/306</li>
<li><a href="` + baseURLContent + `memory_editor_example" rel="nofollow">Memory Editor</a></li> <li><a href="` + baseURLContent + `memory_editor_example" rel="nofollow">Memory Editor</a></li>
<li><a href="` + baseURLContent + `plot_var_example" rel="nofollow">Plot var helper</a></li> <li><a href="` + baseURLContent + `plot_var_example" rel="nofollow">Plot var helper</a></li>
</ul> </ul>

View File

@ -0,0 +1,63 @@
// Copyright 2017 The Gitea Authors. All rights reserved.
// Copyright 2017 The Gogs 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 markdown
import (
"regexp"
"sync"
"code.gitea.io/gitea/modules/setting"
"github.com/microcosm-cc/bluemonday"
)
// Sanitizer is a protection wrapper of *bluemonday.Policy which does not allow
// any modification to the underlying policies once it's been created.
type Sanitizer struct {
policy *bluemonday.Policy
init sync.Once
}
var sanitizer = &Sanitizer{}
// NewSanitizer initializes sanitizer with allowed attributes based on settings.
// Multiple calls to this function will only create one instance of Sanitizer during
// entire application lifecycle.
func NewSanitizer() {
sanitizer.init.Do(func() {
sanitizer.policy = bluemonday.UGCPolicy()
// We only want to allow HighlightJS specific classes for code blocks
sanitizer.policy.AllowAttrs("class").Matching(regexp.MustCompile(`^language-\w+$`)).OnElements("code")
// Checkboxes
sanitizer.policy.AllowAttrs("type").Matching(regexp.MustCompile(`^checkbox$`)).OnElements("input")
sanitizer.policy.AllowAttrs("checked", "disabled").OnElements("input")
// Custom URL-Schemes
sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...)
})
}
// Sanitize takes a string that contains a HTML fragment or document and applies policy whitelist.
func Sanitize(s string) string {
if sanitizer.policy == nil {
NewSanitizer()
}
return sanitizer.policy.Sanitize(s)
}
// SanitizeBytes takes a []byte slice that contains a HTML fragment or document and applies policy whitelist.
func SanitizeBytes(b []byte) []byte {
if len(b) == 0 {
// nothing to sanitize
return b
}
if sanitizer.policy == nil {
NewSanitizer()
}
return sanitizer.policy.SanitizeBytes(b)
}

View File

@ -0,0 +1,44 @@
// Copyright 2017 The Gitea Authors. All rights reserved.
// Copyright 2017 The Gogs 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 markdown
import (
"testing"
"github.com/stretchr/testify/assert"
)
func Test_Sanitizer(t *testing.T) {
NewSanitizer()
testCases := []string{
// Regular
`<a onblur="alert(secret)" href="http://www.google.com">Google</a>`, `<a href="http://www.google.com" rel="nofollow">Google</a>`,
// Code highlighting class
`<code class="random string"></code>`, `<code></code>`,
`<code class="language-random ui tab active menu attached animating sidebar following bar center"></code>`, `<code></code>`,
`<code class="language-go"></code>`, `<code class="language-go"></code>`,
// Input checkbox
`<input type="hidden">`, ``,
`<input type="checkbox">`, `<input type="checkbox">`,
`<input checked disabled autofocus>`, `<input checked="" disabled="">`,
// Code highlight injection
`<code class="language-random&#32;ui&#32;tab&#32;active&#32;menu&#32;attached&#32;animating&#32;sidebar&#32;following&#32;bar&#32;center"></code>`, `<code></code>`,
`<code class="language-lol&#32;ui&#32;tab&#32;active&#32;menu&#32;attached&#32;animating&#32;sidebar&#32;following&#32;bar&#32;center">
<code class="language-lol&#32;ui&#32;container&#32;input&#32;huge&#32;basic&#32;segment&#32;center">&nbsp;</code>
<img src="https://try.gogs.io/img/favicon.png" width="200" height="200">
<code class="language-lol&#32;ui&#32;container&#32;input&#32;massive&#32;basic&#32;segment">Hello there! Something has gone wrong, we are working on it.</code>
<code class="language-lol&#32;ui&#32;container&#32;input&#32;huge&#32;basic&#32;segment">In the meantime, play a game with us at&nbsp;<a href="http://example.com/">example.com</a>.</code>
</code>`, "<code>\n<code>\u00a0</code>\n<img src=\"https://try.gogs.io/img/favicon.png\" width=\"200\" height=\"200\">\n<code>Hello there! Something has gone wrong, we are working on it.</code>\n<code>In the meantime, play a game with us at\u00a0<a href=\"http://example.com/\" rel=\"nofollow\">example.com</a>.</code>\n</code>",
}
for i := 0; i < len(testCases); i += 2 {
assert.Equal(t, testCases[i+1], Sanitize(testCases[i]))
assert.Equal(t, testCases[i+1], string(SanitizeBytes([]byte(testCases[i]))))
}
}

View File

@ -152,7 +152,7 @@ func Safe(raw string) template.HTML {
// Str2html render Markdown text to HTML // Str2html render Markdown text to HTML
func Str2html(raw string) template.HTML { func Str2html(raw string) template.HTML {
return template.HTML(markdown.Sanitizer.Sanitize(raw)) return template.HTML(markdown.Sanitize(raw))
} }
// List traversings the list // List traversings the list

View File

@ -86,7 +86,7 @@ optional_title=Dodatečná nastavení
email_title=Nastavení e-mailové služby email_title=Nastavení e-mailové služby
smtp_host=Server SMTP smtp_host=Server SMTP
smtp_from=Od smtp_from=Od
smtp_from_helper=E-mailová adresa podle RFC 5322. Může být zadána pouze e-mailová adresa nebo adresa ve formátu `"Name" <email@priklad.cz>"`. smtp_from_helper=E-mailová adresa podle RFC 5322. Může být zadána pouze e-mailová adresa nebo adresa ve formátu "Name" <email@priklad.cz>.
mailer_user=E-mailová adresa odesílatele mailer_user=E-mailová adresa odesílatele
mailer_password=Heslo mailer_password=Heslo
register_confirm=Povolit potvrzení registrace register_confirm=Povolit potvrzení registrace

View File

@ -52,7 +52,7 @@ cancel=Abbrechen
[install] [install]
install=Installation install=Installation
title=Installationsschritte für den ersten Start title=Installationsschritte für den ersten Start
docker_helper="Wenn Gitea innerhalb von Docker läuft, lies bitte den <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Leitfaden</a> genau durch, bevor du irgendwas auf dieser Seite änderst!" docker_helper=Wenn Gitea innerhalb von Docker läuft, lies bitte den <a target="_blank" rel="noopener" href="%s">Leitfaden</a> genau durch, bevor du irgendwas auf dieser Seite änderst!
requite_db_desc=Gitea benötigt MySQL, PostgreSQL, SQLite3 oder TiDB. requite_db_desc=Gitea benötigt MySQL, PostgreSQL, SQLite3 oder TiDB.
db_title=Datenbankeinstellungen db_title=Datenbankeinstellungen
db_type=Datenbanktyp db_type=Datenbanktyp
@ -111,7 +111,7 @@ enable_captcha=Captcha aktivieren
enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich. enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich.
require_sign_in_view=Seiten nur für angemeldete Benutzer zugänglich. require_sign_in_view=Seiten nur für angemeldete Benutzer zugänglich.
require_sign_in_view_popup=Nur angemeldete Benutzer können auf alle Seiten zugreifen. Gäste sehen nur die Seiten Anmelden/Registrieren. require_sign_in_view_popup=Nur angemeldete Benutzer können auf alle Seiten zugreifen. Gäste sehen nur die Seiten Anmelden/Registrieren.
admin_setting_desc="Du musst jetzt kein Administrator-Konto anlegen. Der erste Benutzer (\"Id=1\") erhält automatisch Administrator-Rechte." admin_setting_desc=`Du musst jetzt kein Administrator-Konto anlegen. Der erste Benutzer (Id=1) erhält automatisch Administrator-Rechte.`
admin_title=Administrator Einstellungen admin_title=Administrator Einstellungen
admin_name=Benutzername admin_name=Benutzername
admin_password=Passwort admin_password=Passwort
@ -328,7 +328,7 @@ keep_email_private_popup=Deine E-Mail-Adresse wird vor anderen Benutzern verstec
manage_ssh_keys=SSH-Schlüssel verwalten manage_ssh_keys=SSH-Schlüssel verwalten
add_key=Schlüssel hinzufügen add_key=Schlüssel hinzufügen
ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die deinem Konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind. ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die deinem Konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind.
ssh_helper="<strong>Brauchst du Hilfe?</strong> Hier ist eine Anleitung zum <a href=\"%s\">Erzeugen von SSH-Schlüsseln</a> oder <a href=\"%s\">Lösen einfacher SSH-Probleme</a>." ssh_helper=<strong>Brauchst du Hilfe?</strong> Hier ist eine Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder <a href="%s">Lösen einfacher SSH-Probleme</a>.
add_new_key=SSH-Schlüssel hinzufügen add_new_key=SSH-Schlüssel hinzufügen
ssh_key_been_used=Inhalt des öffentlichen Schlüssels wurde verwendet. ssh_key_been_used=Inhalt des öffentlichen Schlüssels wurde verwendet.
ssh_key_name_used=Ein öffentlicher Schlüssel mit diesem Namen existiert bereits. ssh_key_name_used=Ein öffentlicher Schlüssel mit diesem Namen existiert bereits.
@ -390,10 +390,10 @@ owner=Besitzer
repo_name=Repository-Name repo_name=Repository-Name
repo_name_helper=Ein guter Repository-Name besteht gewöhnlich aus kurzen, leicht zu merkenden und eindeutigen Schlüsselworten. repo_name_helper=Ein guter Repository-Name besteht gewöhnlich aus kurzen, leicht zu merkenden und eindeutigen Schlüsselworten.
visibility=Sichtbarkeit visibility=Sichtbarkeit
visiblity_helper="Dieses Repository ist <span class=\"ui red text\">privat</span>" visiblity_helper=Dieses Repository ist <span class="ui red text">privat</span>
visiblity_helper_forced="Der Administrator hat festgelegt, dass alle neuen Repositories <span class=\"ui red text\">privat</span> sein müssen" visiblity_helper_forced=Der Administrator hat festgelegt, dass alle neuen Repositories <span class="ui red text">privat</span> sein müssen
visiblity_fork_helper=(Eine Änderung dieses Wertes wirkt sich auf alle Forks aus) visiblity_fork_helper=(Eine Änderung dieses Wertes wirkt sich auf alle Forks aus)
clone_helper="Brauchst du Hilfe beim Klonen? Öffne die <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Hilfe</a>!" clone_helper=Brauchst du Hilfe beim Klonen? Öffne die <a target="_blank" rel="noopener" href="%s">Hilfe</a>!
fork_repo=Repository forken fork_repo=Repository forken
fork_from=Fork von fork_from=Fork von
fork_visiblity_helper=Die Sichtbarkeit von geforkten Repositories ist nicht veränderbar. fork_visiblity_helper=Die Sichtbarkeit von geforkten Repositories ist nicht veränderbar.
@ -423,7 +423,7 @@ form.name_pattern_not_allowed=Repository-Namen der Form '%s' sind nicht erlaubt.
need_auth=Authorisierung benötigt need_auth=Authorisierung benötigt
migrate_type=Migrationstyp migrate_type=Migrationstyp
migrate_type_helper="Dieses Repository wird ein <span class=\"text blue\">Mirror</span> sein" migrate_type_helper=Dieses Repository wird ein <span class="text blue">Mirror</span> sein
migrate_repo=Repository migrieren migrate_repo=Repository migrieren
migrate.clone_address=Adresse kopieren migrate.clone_address=Adresse kopieren
migrate.clone_address_desc=Dies kann eine HTTP/HTTPS/GIT URL oder ein lokaler Serverpfad sein. migrate.clone_address_desc=Dies kann eine HTTP/HTTPS/GIT URL oder ein lokaler Serverpfad sein.
@ -493,7 +493,7 @@ editor.add='%s' hinzufügen
editor.update='%s' ändern editor.update='%s' ändern
editor.delete='%s' löschen editor.delete='%s' löschen
editor.commit_message_desc=Eine ausführlichere Beschreibung kann hinzugefügt werden... editor.commit_message_desc=Eine ausführlichere Beschreibung kann hinzugefügt werden...
editor.commit_directly_to_this_branch="Direkt in den <strong class=\"branch-name\">%s</strong> Branch einchecken." editor.commit_directly_to_this_branch=Direkt in den <strong class="branch-name">%s</strong> Branch einchecken.
editor.create_new_branch=Einen <strong>neuen Branch</strong> für diesen Commit erstellen und einen Pull Request starten. 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 Branch Name... editor.new_branch_name_desc=Neuer Branch Name...
editor.cancel=Abbrechen editor.cancel=Abbrechen
@ -503,7 +503,7 @@ editor.directory_is_a_file='%s' im übergeordneten Verzeichnis ist eine Datei un
editor.file_is_a_symlink=Die Datei '%s' ist ein Symlink der nicht über den Web Editor bearbeitet werden kann. editor.file_is_a_symlink=Die Datei '%s' ist ein Symlink der nicht über den Web Editor bearbeitet werden kann.
editor.filename_is_a_directory=Die Datei '%s' existiert bereits als Verzeichnis in diesem Repository. editor.filename_is_a_directory=Die Datei '%s' existiert bereits als Verzeichnis in diesem Repository.
editor.file_editing_no_longer_exists=Die Datei '%s', welche du bearbeitest existiert in dieser Repository nicht mehr. editor.file_editing_no_longer_exists=Die Datei '%s', welche du bearbeitest existiert in dieser Repository nicht mehr.
editor.file_changed_while_editing="Seit dem Start der Bearbeitung hat sich die Datei geändert. <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Hier klicken</a> um die Änderungen zu sehen, oder nochmals <strong>Commit drücken</strong> um die Änderungen zu überschreiben." editor.file_changed_while_editing=Seit dem Start der Bearbeitung hat sich die Datei geändert. <a target="_blank" rel="noopener" href="%s">Hier klicken</a> um die Änderungen zu sehen, oder nochmals <strong>Commit drücken</strong> um die Änderungen zu überschreiben.
editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in diesem Repository. editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in diesem Repository.
editor.no_changes_to_show=Keine Änderungen vorhanden. editor.no_changes_to_show=Keine Änderungen vorhanden.
editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v
@ -542,8 +542,8 @@ issues.label_templates.info=Es sind noch keine Label vorhanden. Du kannst vordef
issues.label_templates.helper=Wähle ein Label issues.label_templates.helper=Wähle ein Label
issues.label_templates.use=Dieses Label Set benutzen issues.label_templates.use=Dieses Label Set benutzen
issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v
issues.add_label_at="`fügte hinzu <div class=\"ui label\" style=\"color: %s" ; background-color: %s">%s</div> label %s` issues.add_label_at=`fügte hinzu <div class="ui label" style="color: %s ; background-color: %s">%s</div> label %s`
issues.remove_label_at="`entfernte <div class=\"ui label\" style=\"color: %s" ; background-color: %s">%s</div> label %s` issues.remove_label_at=`entfernte <div class="ui label" style="color: %s ; background-color: %s">%s</div> label %s`
issues.add_milestone_at=`fügte das Issue zum <b>%s</b> Meilenstein hinzu %s` issues.add_milestone_at=`fügte das Issue zum <b>%s</b> Meilenstein hinzu %s`
issues.change_milestone_at=`änderte den Meilenstein von <b>%s</b> zu <b>%s</b> %s` issues.change_milestone_at=`änderte den Meilenstein von <b>%s</b> zu <b>%s</b> %s`
issues.remove_milestone_at=`entfernte das Issue vom <b>%s</b> Meilenstein %s` issues.remove_milestone_at=`entfernte das Issue vom <b>%s</b> Meilenstein %s`
@ -572,14 +572,14 @@ issues.filter_sort.recentupdate=Kürzlich aktualisiert
issues.filter_sort.leastupdate=Am längsten nicht aktualisiert issues.filter_sort.leastupdate=Am längsten nicht aktualisiert
issues.filter_sort.mostcomment=Am meisten kommentiert issues.filter_sort.mostcomment=Am meisten kommentiert
issues.filter_sort.leastcomment=Am wenigsten kommentiert issues.filter_sort.leastcomment=Am wenigsten kommentiert
issues.opened_by="%[1]s geöffnet von <a href=\"%[2]s\">%[3]s</a>" issues.opened_by=%[1]s geöffnet von <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=geöffnet %[1]s von %[2]s issues.opened_by_fake=geöffnet %[1]s von %[2]s
issues.previous=Vorherige issues.previous=Vorherige
issues.next=Nächste issues.next=Nächste
issues.open_title=Offen issues.open_title=Offen
issues.closed_title=Geschlossen issues.closed_title=Geschlossen
issues.num_comments=%d Kommentare issues.num_comments=%d Kommentare
issues.commented_at="`kommentierte <a href=\"#%s\">%s</a>`" issues.commented_at=`kommentierte <a href="#%s">%s</a>`
issues.delete_comment_confirm=Bist du sicher dass du das Kommentar löschen möchtest? issues.delete_comment_confirm=Bist du sicher dass du das Kommentar löschen möchtest?
issues.no_content=Hier gibt es bis jetzt noch keinen Inhalt. issues.no_content=Hier gibt es bis jetzt noch keinen Inhalt.
issues.close_issue=Schließen issues.close_issue=Schließen
@ -587,13 +587,13 @@ issues.close_comment_issue=Kommentieren und schließen
issues.reopen_issue=Wieder öffnen issues.reopen_issue=Wieder öffnen
issues.reopen_comment_issue=Kommentieren und wieder öffnen issues.reopen_comment_issue=Kommentieren und wieder öffnen
issues.create_comment=Kommentieren issues.create_comment=Kommentieren
issues.closed_at="`hat <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> geschlossen`" issues.closed_at=`hat <a id="%[1]s" href="#%[1]s">%[2]s</a> geschlossen`
issues.reopened_at="`hat <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> wieder geöffnet`" issues.reopened_at=`hat <a id="%[1]s" href="#%[1]s">%[2]s</a> wieder geöffnet`
issues.commit_ref_at="`hat dieses Issue <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> aus einem Commit referenziert`" issues.commit_ref_at=`hat dieses Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> aus einem Commit referenziert`
issues.poster=Ersteller issues.poster=Ersteller
issues.collaborator=Mitarbeiter issues.collaborator=Mitarbeiter
issues.owner=Besitzer issues.owner=Besitzer
issues.sign_in_require_desc="<a href=\"%s\">Anmelden</a>, um an der Diskussion teilzunehmen." issues.sign_in_require_desc=<a href="%s">Anmelden</a>, um an der Diskussion teilzunehmen.
issues.edit=Bearbeiten issues.edit=Bearbeiten
issues.cancel=Abbrechen issues.cancel=Abbrechen
issues.save=Speichern issues.save=Speichern
@ -621,7 +621,7 @@ pulls.compare_compare=vergleichen
pulls.filter_branch=Branch filtern pulls.filter_branch=Branch filtern
pulls.no_results=Keine Ergebnisse verfügbar. pulls.no_results=Keine Ergebnisse verfügbar.
pulls.nothing_to_compare=Es gibt nichts zu vergleichen, da Base- und Head-Branch gleich sind. pulls.nothing_to_compare=Es gibt nichts zu vergleichen, da Base- und Head-Branch gleich sind.
pulls.has_pull_request="`Es existiert bereits ein Pull-Request zwischen diesen beiden Zielen: <a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]d</a>`" pulls.has_pull_request=`Es existiert bereits ein Pull-Request zwischen diesen beiden Zielen: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Pull-Request erstellen pulls.create=Pull-Request erstellen
pulls.title_desc=möchte %[1]d Commits von <code>%[2]s</code> nach <code>%[3]s</code> zusammenführen pulls.title_desc=möchte %[1]d Commits von <code>%[2]s</code> nach <code>%[3]s</code> zusammenführen
pulls.merged_title_desc=hat %[1]d Commits von <code>%[2]s</code> nach <code>%[3]s</code> %[4]s zusammengeführt pulls.merged_title_desc=hat %[1]d Commits von <code>%[2]s</code> nach <code>%[3]s</code> %[4]s zusammengeführt
@ -637,7 +637,7 @@ pulls.can_auto_merge_desc=Dieser Pull-Request kann automatisch zusammengeführt
pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch zusammengeführt werden, da es Konflikte gibt. pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch zusammengeführt werden, da es Konflikte gibt.
pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen. pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen.
pulls.merge_pull_request=Pull-Request zusammenführen pulls.merge_pull_request=Pull-Request zusammenführen
pulls.open_unmerged_pull_exists="`Sie können diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.`" pulls.open_unmerged_pull_exists=`Sie können diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.`
milestones.new=Neuer Meilenstein milestones.new=Neuer Meilenstein
milestones.open_tab=%d offen milestones.open_tab=%d offen
@ -756,7 +756,7 @@ settings.search_user_placeholder=Benutzer suchen...
settings.org_not_allowed_to_be_collaborator=Eine Organisation kann nicht als Mitarbeiter hinzugefügt werden. settings.org_not_allowed_to_be_collaborator=Eine Organisation kann nicht als Mitarbeiter hinzugefügt werden.
settings.user_is_org_member=Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden. settings.user_is_org_member=Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden.
settings.add_webhook=Webhook hinzufügen settings.add_webhook=Webhook hinzufügen
settings.hooks_desc="Webhooks erlauben es dir, externe Dienste zu informieren, wenn etwas Bestimmtes in deinem Repository passiert. Gitea sendet dann einen POST-Request an alle angegebenen URLs. Erfahre mehr im Gitea <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks Guide</a>." settings.hooks_desc=Webhooks erlauben es dir, externe Dienste zu informieren, wenn etwas Bestimmtes in deinem Repository passiert. Gitea sendet dann einen POST-Request an alle angegebenen URLs. Erfahre mehr im Gitea <a target="_blank" rel="noopener" href="%s">Webhooks Guide</a>.
settings.webhook_deletion=Webhook entfernen settings.webhook_deletion=Webhook entfernen
settings.webhook_deletion_desc=Das Löschen dieses Webhooks wird alle zugehörigen Informationen und den Übertragungsverlauf entfernen. Wirklich fortfahren? settings.webhook_deletion_desc=Das Löschen dieses Webhooks wird alle zugehörigen Informationen und den Übertragungsverlauf entfernen. Wirklich fortfahren?
settings.webhook_deletion_success=Webhook wurde erfolgreich entfernt! settings.webhook_deletion_success=Webhook wurde erfolgreich entfernt!
@ -773,7 +773,7 @@ settings.githook_edit_desc=Wenn ein Hook inaktiv ist, wird der Standardinhalt be
settings.githook_name=Hook-Name settings.githook_name=Hook-Name
settings.githook_content=Hook-Inhalt settings.githook_content=Hook-Inhalt
settings.update_githook=Hook aktualisieren settings.update_githook=Hook aktualisieren
settings.add_webhook_desc="Gitea sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du empfangen möchtest (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks Guide</a>." settings.add_webhook_desc=Gitea sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du empfangen möchtest (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target="_blank" rel="noopener" href="%s">Webhooks Guide</a>.
settings.payload_url=Payload-URL settings.payload_url=Payload-URL
settings.content_type=Inhaltstyp settings.content_type=Inhaltstyp
settings.secret=Secret settings.secret=Secret
@ -798,7 +798,7 @@ settings.update_hook_success=Webhook wurde aktualisiert.
settings.delete_webhook=Webhook löschen settings.delete_webhook=Webhook löschen
settings.recent_deliveries=Letzte Zustellungen settings.recent_deliveries=Letzte Zustellungen
settings.hook_type=Hook Typ settings.hook_type=Hook Typ
settings.add_slack_hook_desc="Füge <a href=\"%s\">Slack</a>-Integration zu deinem Repository hinzu." settings.add_slack_hook_desc=Füge <a href="%s">Slack</a>-Integration zu deinem Repository hinzu.
settings.slack_token=Token settings.slack_token=Token
settings.slack_domain=Domain settings.slack_domain=Domain
settings.slack_channel=Kanal settings.slack_channel=Kanal
@ -1239,19 +1239,19 @@ notices.op=Aktion
notices.delete_success=Systemmitteilungen wurden erfolgreich gelöscht. notices.delete_success=Systemmitteilungen wurden erfolgreich gelöscht.
[action] [action]
create_repo="hat das Repository <a href=\"%s\">%s</a> erstellt" create_repo=hat das Repository <a href="%s">%s</a> erstellt
rename_repo="hat das Repository von <code>%[1]s</code> zu <a href=\"%[2]s\">%[3]s</a> umbenannt" rename_repo=hat das Repository von <code>%[1]s</code> zu <a href="%[2]s">%[3]s</a> umbenannt
commit_repo="hat auf <a href=\"%[1]s/src/%[2]s\">%[3]s</a> in <a href=\"%[1]s\">%[4]s</a> gepusht" commit_repo=hat auf <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> gepusht
create_issue="`hat Issue <a href=\"%s/issues/%s\">%s#%[2]s</a> geöffnet`" create_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> geöffnet`
close_issue="`hat Issue <a href=\"%s/issues/%s\">%s#%[2]s</a> geschlossen`" close_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> geschlossen`
reopen_issue="`hat Issue <a href=\"%s/issues/%s\">%s#%[2]s</a> wieder geöffnet`" reopen_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> wieder geöffnet`
create_pull_request="`hat Pull-Request <a href=\"%s/pulls/%s\">%s#%[2]s</a> erstellt`" create_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> erstellt`
close_pull_request="`hat Pull-Request <a href=\"%s/pulls/%s\">%s#%[2]s</a> geschlossen`" close_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> geschlossen`
reopen_pull_request="`hat den Pull-Request <a href=\"%s/pulls/%s\">%s#%[2]s</a> wieder geöffnet`" reopen_pull_request=`hat den Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> wieder geöffnet`
comment_issue="`hat Issue <a href=\"%s/issues/%s\">%s#%[2]s</a> kommentiert`" comment_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> kommentiert`
merge_pull_request="`hat Pull-Request <a href=\"%s/pulls/%s\">%s#%[2]s</a> zuammengeführt`" merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zuammengeführt`
transfer_repo="hat Repository <code>%s</code> transferiert an <a href=\"%s\">%s</a>" transfer_repo=hat Repository <code>%s</code> transferiert an <a href="%s">%s</a>
push_tag="hat Tag <a href=\"%s/src/%s\">%[2]s</a> auf <a href=\"%[1]s\">%[3]s</a> gepusht" push_tag=hat Tag <a href="%s/src/%s">%[2]s</a> auf <a href="%[1]s">%[3]s</a> gepusht
compare_commits=Zeige Vergleich für diese %d Commits compare_commits=Zeige Vergleich für diese %d Commits
[tool] [tool]

View File

@ -558,6 +558,7 @@ issues.remove_label_at = `removed the <div class="ui label" style="color: %s; ba
issues.add_milestone_at = `added this to the <b>%s</b> milestone %s` issues.add_milestone_at = `added this to the <b>%s</b> milestone %s`
issues.change_milestone_at = `modified the milestone from <b>%s</b> to <b>%s</b> %s` issues.change_milestone_at = `modified the milestone from <b>%s</b> to <b>%s</b> %s`
issues.remove_milestone_at = `removed this from the <b>%s</b> milestone %s` issues.remove_milestone_at = `removed this from the <b>%s</b> milestone %s`
issues.deleted_milestone = `(deleted)`
issues.self_assign_at = `self-assigned this %s` issues.self_assign_at = `self-assigned this %s`
issues.add_assignee_at = `was assigned by <b>%s</b> %s` issues.add_assignee_at = `was assigned by <b>%s</b> %s`
issues.remove_assignee_at = `removed their assignment %s` issues.remove_assignee_at = `removed their assignment %s`
@ -718,11 +719,13 @@ settings.wiki_desc = Enable wiki system
settings.use_internal_wiki = Use builtin wiki settings.use_internal_wiki = Use builtin wiki
settings.use_external_wiki = Use external wiki settings.use_external_wiki = Use external wiki
settings.external_wiki_url = External Wiki URL settings.external_wiki_url = External Wiki URL
settings.external_wiki_url_error = External Wiki URL is invalid
settings.external_wiki_url_desc = Visitors will be redirected to the specified URL when they click on the tab. settings.external_wiki_url_desc = Visitors will be redirected to the specified URL when they click on the tab.
settings.issues_desc = Enable issue tracker settings.issues_desc = Enable issue tracker
settings.use_internal_issue_tracker = Use builtin issue tracker settings.use_internal_issue_tracker = Use builtin issue tracker
settings.use_external_issue_tracker = Use external issue tracker settings.use_external_issue_tracker = Use external issue tracker
settings.external_tracker_url = External Issue Tracker URL settings.external_tracker_url = External Issue Tracker URL
settings.external_tracker_url_error = External Issue Tracker URL is invalid
settings.external_tracker_url_desc = Visitors will be redirected to the specified URL when they click on the tab. settings.external_tracker_url_desc = Visitors will be redirected to the specified URL when they click on the tab.
settings.tracker_url_format = External Issue Tracker URL Format settings.tracker_url_format = External Issue Tracker URL Format
settings.tracker_issue_style = External Issue Tracker Naming Style: settings.tracker_issue_style = External Issue Tracker Naming Style:

View File

@ -51,7 +51,7 @@ cancel=Peruuta
[install] [install]
install=Asennus install=Asennus
title=Asennusvaiheet ottaessa ensi kertaa käyttöön title=Asennusvaiheet ottaessa ensi kertaa käyttöön
docker_helper="Jos käytät Giteaia Dockerin sisällä, ole hyvä ja lue <a target=\"_blank\" rel=\"noopener\" href=\"%s\">ohjeet</a> huolellisesti ennen kuin muutat mitään tältä sivulta!" docker_helper=Jos käytät Giteaia Dockerin sisällä, ole hyvä ja lue <a target="_blank" rel="noopener" href="%s">ohjeet</a> huolellisesti ennen kuin muutat mitään tältä sivulta!
requite_db_desc=Gitea tarvitsee MySQL, PostgreSQL, SQLite3 tai TiDB. requite_db_desc=Gitea tarvitsee MySQL, PostgreSQL, SQLite3 tai TiDB.
db_title=Tietokanta asetukset db_title=Tietokanta asetukset
db_type=Tietokanta tyyppi db_type=Tietokanta tyyppi
@ -302,7 +302,7 @@ add_email_success=Uusi sähköpostiosoitteesi on lisätty onnistuneesti.
manage_ssh_keys=Hallitse SSH avaimia manage_ssh_keys=Hallitse SSH avaimia
add_key=Lisää avain add_key=Lisää avain
ssh_desc=Tämä on luettelo tiliisi liitetyistä SSH avaimista. Koska nämä avaimet sallivat kenen tahansa niitä käyttävän pääsevän repoihisi, on erittäin tärkeää että tunnistat ne. ssh_desc=Tämä on luettelo tiliisi liitetyistä SSH avaimista. Koska nämä avaimet sallivat kenen tahansa niitä käyttävän pääsevän repoihisi, on erittäin tärkeää että tunnistat ne.
ssh_helper="<strong>Etkö tiedä miten?</strong>Tarkista Githubin opas <a href=\"%s\">luo oma SSH avain</a> tai ratkaise <a href=\"%s\">yleisiä ongelmia</a> joita voit kohdata SSHta käyttäessä." ssh_helper=<strong>Etkö tiedä miten?</strong>Tarkista Githubin opas <a href="%s">luo oma SSH avain</a> tai ratkaise <a href="%s">yleisiä ongelmia</a> joita voit kohdata SSHta käyttäessä.
add_new_key=Lisää SSH avain add_new_key=Lisää SSH avain
ssh_key_been_used=Julkisen avaimen sisältö on käytetty. ssh_key_been_used=Julkisen avaimen sisältö on käytetty.
ssh_key_name_used=Samanniminen julkinen avain on jo olemassa. ssh_key_name_used=Samanniminen julkinen avain on jo olemassa.
@ -352,10 +352,10 @@ owner=Omistaja
repo_name=Repon nimi repo_name=Repon nimi
repo_name_helper=Hyvä repon nimi yleensä koostuu lyhyistä, mieleenpainuvista ja ainutlaatuisista avainsanoista. repo_name_helper=Hyvä repon nimi yleensä koostuu lyhyistä, mieleenpainuvista ja ainutlaatuisista avainsanoista.
visibility=Näkyvyys visibility=Näkyvyys
visiblity_helper="Tämä repo on <span class=\"ui red text\">yksityinen</span>" visiblity_helper=Tämä repo on <span class="ui red text">yksityinen</span>
visiblity_helper_forced="Sivuston ylläpito on pakottanut kaikkien uusien repojen olevan <span class=\"ui red text\">yksityisiä</span>" visiblity_helper_forced=Sivuston ylläpito on pakottanut kaikkien uusien repojen olevan <span class="ui red text">yksityisiä</span>
visiblity_fork_helper=(Arvon vaihtaminen vaikuttaa kaikkiin forkkeihin) visiblity_fork_helper=(Arvon vaihtaminen vaikuttaa kaikkiin forkkeihin)
clone_helper="Tarvitsetko apua kloonauksessa? Vieraile osoitteessa <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Apua</a>!" clone_helper=Tarvitsetko apua kloonauksessa? Vieraile osoitteessa <a target="_blank" rel="noopener" href="%s">Apua</a>!
fork_repo=Forkkaa repo fork_repo=Forkkaa repo
fork_from=Forkkaa lähteestä fork_from=Forkkaa lähteestä
fork_visiblity_helper=Et voi muuttaa forkatun repon näkyvyyttä. fork_visiblity_helper=Et voi muuttaa forkatun repon näkyvyyttä.
@ -382,7 +382,7 @@ form.name_pattern_not_allowed=Repon nimi mallia '%s' ei ole sallittu.
need_auth=Tarvitaan lupa need_auth=Tarvitaan lupa
migrate_type=Siirtotyyppi migrate_type=Siirtotyyppi
migrate_type_helper="Tämä repo tulee olemaan <span class=\"text blue\">peili</span>" migrate_type_helper=Tämä repo tulee olemaan <span class="text blue">peili</span>
migrate_repo=Siirrä repo migrate_repo=Siirrä repo
migrate.clone_address=Kloonaa osoite migrate.clone_address=Kloonaa osoite
migrate.clone_address_desc=Tämä voi olla HTTP/HTTPS/GIT URL tai paikallisen palvelimen polku. migrate.clone_address_desc=Tämä voi olla HTTP/HTTPS/GIT URL tai paikallisen palvelimen polku.
@ -494,7 +494,7 @@ issues.filter_sort.recentupdate=Äskettäin päivitetty
issues.filter_sort.leastupdate=Kauiten aikaa sitten päivitetty issues.filter_sort.leastupdate=Kauiten aikaa sitten päivitetty
issues.filter_sort.mostcomment=Eniten kommentoidut issues.filter_sort.mostcomment=Eniten kommentoidut
issues.filter_sort.leastcomment=Vähiten kommentoidut issues.filter_sort.leastcomment=Vähiten kommentoidut
issues.opened_by="%[1]s avasi <a href=\"%[2]s\">%[3]s</a>" issues.opened_by=%[1]s avasi <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=%[1]s avasi %[2]s issues.opened_by_fake=%[1]s avasi %[2]s
issues.previous=Edellinen issues.previous=Edellinen
issues.next=Seuraava issues.next=Seuraava
@ -507,9 +507,9 @@ issues.close_comment_issue=Kommentoi ja sulje
issues.reopen_issue=Avaa uudelleen issues.reopen_issue=Avaa uudelleen
issues.reopen_comment_issue=Kommentoi ja avaa uudelleen issues.reopen_comment_issue=Kommentoi ja avaa uudelleen
issues.create_comment=Kommentoi issues.create_comment=Kommentoi
issues.closed_at="`suljettu <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.closed_at=`suljettu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at="`avattu uudelleen <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.reopened_at=`avattu uudelleen <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at="`viittasi tähän ongelmaan commitissa <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.commit_ref_at=`viittasi tähän ongelmaan commitissa <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.poster=Tekijä issues.poster=Tekijä
issues.collaborator=Yhteistyökumppani issues.collaborator=Yhteistyökumppani
issues.owner=Omistaja issues.owner=Omistaja
@ -537,7 +537,7 @@ pulls.compare_compare=vertaa
pulls.filter_branch=Suodata branch pulls.filter_branch=Suodata branch
pulls.no_results=Tuloksia ei löytynyt. pulls.no_results=Tuloksia ei löytynyt.
pulls.nothing_to_compare=Ei ole mitään verrattavaa koska base ja head branchit ovat tasoissa. pulls.nothing_to_compare=Ei ole mitään verrattavaa koska base ja head branchit ovat tasoissa.
pulls.has_pull_request="`On olemassa jo pull pyyntö näiden kohteiden välillä: <a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]d</a>`" pulls.has_pull_request=`On olemassa jo pull pyyntö näiden kohteiden välillä: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Luo Pull-pyyntö pulls.create=Luo Pull-pyyntö
pulls.title_desc=haluaa yhdistää %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code>%[3]s</code> pulls.title_desc=haluaa yhdistää %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code>%[3]s</code>
pulls.merged_title_desc=yhdistetty %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code>%[3]s</code> %[4]s pulls.merged_title_desc=yhdistetty %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code>%[3]s</code> %[4]s
@ -553,7 +553,7 @@ pulls.can_auto_merge_desc=Tämä pull-pyyntö voidaan yhdistää automaattisesti
pulls.cannot_auto_merge_desc=Tätä pull-pyyntöä ei voi yhdistää automaattisesti koska on konflikteja. pulls.cannot_auto_merge_desc=Tätä pull-pyyntöä ei voi yhdistää automaattisesti koska on konflikteja.
pulls.cannot_auto_merge_helper=Ole hyvä ja yhdistä manuaalisesti konfliktien ratkaisemiseksi. pulls.cannot_auto_merge_helper=Ole hyvä ja yhdistä manuaalisesti konfliktien ratkaisemiseksi.
pulls.merge_pull_request=Yhdistä Pull-pyyntö pulls.merge_pull_request=Yhdistä Pull-pyyntö
pulls.open_unmerged_pull_exists="`Et voi suorittaa uudelleenavaus toimintoa koska on jo olemassa pull-pyyntö (#%d) samasta reposta samoilla yhdistämistiedoilla ja odottaa yhdistämistä.`" pulls.open_unmerged_pull_exists=`Et voi suorittaa uudelleenavaus toimintoa koska on jo olemassa pull-pyyntö (#%d) samasta reposta samoilla yhdistämistiedoilla ja odottaa yhdistämistä.`
milestones.new=Uusi merkkipaalu milestones.new=Uusi merkkipaalu
milestones.open_tab=%d avoinna milestones.open_tab=%d avoinna
@ -661,7 +661,7 @@ settings.search_user_placeholder=Etsi käyttäjä...
settings.org_not_allowed_to_be_collaborator=Yhteistyökumppaniksi ei voi lisätä organisaatiota. settings.org_not_allowed_to_be_collaborator=Yhteistyökumppaniksi ei voi lisätä organisaatiota.
settings.user_is_org_member=Käyttäjä on organisaation jäsen, jota ei voi lisätä yhteistyökumppaniksi. settings.user_is_org_member=Käyttäjä on organisaation jäsen, jota ei voi lisätä yhteistyökumppaniksi.
settings.add_webhook=Lisää webkoukku settings.add_webhook=Lisää webkoukku
settings.hooks_desc="Webkoukut muistuttavat paljon perus HTTP POST tapahtuma laukaisimia. Aina kun jotain tapahtuu Giteaissa, käsittelemme ilmoituksen määrittäämääsi kohteeseen. Lisätietoja <a target=\"_blank\" rel=\"noopener\" href=\"%s\">webkoukku oppaassa</a>." settings.hooks_desc=Webkoukut muistuttavat paljon perus HTTP POST tapahtuma laukaisimia. Aina kun jotain tapahtuu Giteaissa, käsittelemme ilmoituksen määrittäämääsi kohteeseen. Lisätietoja <a target="_blank" rel="noopener" href="%s">webkoukku oppaassa</a>.
settings.webhook_deletion=Poista webkoukku settings.webhook_deletion=Poista webkoukku
settings.webhook_deletion_desc=Tämän webkoukun poistaminen poistaa sen tiedot ja kaiken toimitushistorian. Haluatko jatkaa? settings.webhook_deletion_desc=Tämän webkoukun poistaminen poistaa sen tiedot ja kaiken toimitushistorian. Haluatko jatkaa?
settings.webhook_deletion_success=Webkoukku on poistettu onnistuneesti! settings.webhook_deletion_success=Webkoukku on poistettu onnistuneesti!
@ -677,7 +677,7 @@ settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkki
settings.githook_name=Koukun nimi settings.githook_name=Koukun nimi
settings.githook_content=Koukun sisältö settings.githook_content=Koukun sisältö
settings.update_githook=Päivitys koukku settings.update_githook=Päivitys koukku
settings.add_webhook_desc="Gitea lähettää <code>POST</code> requestin määrittämääsi URLiin, mukaanlukien tapahtuneen eventin. Voit myös määrittää millaisen tiedostomuodon haluat saada koukun lauettua (JSON, x-www-form-urlencoded, XML, jne). Lisätietoa löytyy meidän <a target=\"_blank\" rel=\"noopener\" href=\"%s\">koukut oppaasta</a>." settings.add_webhook_desc=Gitea lähettää <code>POST</code> requestin määrittämääsi URLiin, mukaanlukien tapahtuneen eventin. Voit myös määrittää millaisen tiedostomuodon haluat saada koukun lauettua (JSON, x-www-form-urlencoded, XML, jne). Lisätietoa löytyy meidän <a target="_blank" rel="noopener" href="%s">koukut oppaasta</a>.
settings.content_type=Sisältötyyppi settings.content_type=Sisältötyyppi
settings.secret=Salaus settings.secret=Salaus
settings.slack_username=Käyttäjätunnus settings.slack_username=Käyttäjätunnus
@ -698,7 +698,7 @@ settings.update_hook_success=Webkoukku on päivitetty.
settings.delete_webhook=Poista webkoukku settings.delete_webhook=Poista webkoukku
settings.recent_deliveries=Viimeisimmät toimitukset settings.recent_deliveries=Viimeisimmät toimitukset
settings.hook_type=Koukkutyyppi settings.hook_type=Koukkutyyppi
settings.add_slack_hook_desc="Lisää <a href=\"%s\">Slack</a> integraatio repoosi." settings.add_slack_hook_desc=Lisää <a href="%s">Slack</a> integraatio repoosi.
settings.slack_token=Pääsymerkki settings.slack_token=Pääsymerkki
settings.slack_domain=Verkkotunnus settings.slack_domain=Verkkotunnus
settings.slack_channel=Kanava settings.slack_channel=Kanava
@ -1114,19 +1114,19 @@ notices.op=Toiminta
notices.delete_success=Järjestelmän ilmoitukset on poistettu onnistuneesti. notices.delete_success=Järjestelmän ilmoitukset on poistettu onnistuneesti.
[action] [action]
create_repo="luotu repo <a href=\"%s\">%s</a>" create_repo=luotu repo <a href="%s">%s</a>
rename_repo="uudelleennimetty repo <code>%[1]s</code> nimelle <a href=\"%[2]s\">%[3]s</a>" rename_repo=uudelleennimetty repo <code>%[1]s</code> nimelle <a href="%[2]s">%[3]s</a>
commit_repo="pushattu kohteeseen <a href=\"%[1]s/src/%[2]s\">%[3]s</a> paikassa <a href=\"%[1]s\">%[4]s</a>" commit_repo=pushattu kohteeseen <a href="%[1]s/src/%[2]s">%[3]s</a> paikassa <a href="%[1]s">%[4]s</a>
create_issue="`avasi ongelman <a href=\"%s/issues/%s\">%s#%[2]s</a>`" create_issue=`avasi ongelman <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue="`sulki ongelman <a href=\"%s/issues/%s\">%s#%[2]s</a>`" close_issue=`sulki ongelman <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue="`avasi uudelleen ongelman <a href=\"%s/issues/%s\">%s#%[2]s</a>`" reopen_issue=`avasi uudelleen ongelman <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request="`luotu pull-pyyntö <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" create_pull_request=`luotu pull-pyyntö <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request="`sulki pull-pyynnön <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" close_pull_request=`sulki pull-pyynnön <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_pull_request="`avasi uudelleen pull-pyynnön <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" reopen_pull_request=`avasi uudelleen pull-pyynnön <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue="`kommentoi ongelmaa <a href=\"%s/issues/%s\">%s#%[2]s</a>`" comment_issue=`kommentoi ongelmaa <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request="`yhdistetty pull-pyyntö <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" merge_pull_request=`yhdistetty pull-pyyntö <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo="siirretty repo <code>%s</code> kohteeseen <a href=\"%s\">%s</a>" transfer_repo=siirretty repo <code>%s</code> kohteeseen <a href="%s">%s</a>
push_tag="pushattu tagi <a href=\"%s/src/%s\">%[2]s</a> kohteeseen <a href=\"%[1]s\">%[3]s</a>" push_tag=pushattu tagi <a href="%s/src/%s">%[2]s</a> kohteeseen <a href="%[1]s">%[3]s</a>
compare_commits=Näytä vertailu näille %d commiteille compare_commits=Näytä vertailu näille %d commiteille
[tool] [tool]

View File

@ -52,7 +52,7 @@ cancel=Annuler
[install] [install]
install=Installation install=Installation
title=Instructions pour la première exécution title=Instructions pour la première exécution
docker_helper="Si vous exécutez Gitea grâce à Docker, merci de lire la <a target=\"_blank\" rel=\"noopener\" href=\"%s\">procédure</a> attentivement avant de modifier quoi que ce soit sur cette page !" docker_helper=Si vous exécutez Gitea grâce à Docker, merci de lire la <a target="_blank" rel="noopener" href="%s">procédure</a> attentivement avant de modifier quoi que ce soit sur cette page !
requite_db_desc=Gitea requiert MySQL, PostgreSQL, SQLite3 ou TiDB. requite_db_desc=Gitea requiert MySQL, PostgreSQL, SQLite3 ou TiDB.
db_title=Paramètres de la base de données db_title=Paramètres de la base de données
db_type=Type de base de données db_type=Type de base de données
@ -325,7 +325,7 @@ keep_email_private_popup=Votre adresse email sera masquée aux autres utilisateu
manage_ssh_keys=Gérer les clés SSH manage_ssh_keys=Gérer les clés SSH
add_key=Ajouter une Clé add_key=Ajouter une Clé
ssh_desc=Ceci est une liste des clés SSH associées à votre compte. Supprimez celles que vous ne reconnaissez pas. ssh_desc=Ceci est une liste des clés SSH associées à votre compte. Supprimez celles que vous ne reconnaissez pas.
ssh_helper="<strong>Besoin d'aide?</strong> Consultez notre guide pour <a href=\"%s\"> générer des clés SSH</a> ou résoudre les <a href=\"%s\"> problèmes courants de SSH</a>." ssh_helper=<strong>Besoin d'aide?</strong> Consultez notre guide pour <a href="%s"> générer des clés SSH</a> ou résoudre les <a href="%s"> problèmes courants de SSH</a>.
add_new_key=Ajouter une Clé SSH add_new_key=Ajouter une Clé SSH
ssh_key_been_used=Le contenu de la clé publique a été utilisée. ssh_key_been_used=Le contenu de la clé publique a été utilisée.
ssh_key_name_used=Un clé publique avec le même nom existe déjà. ssh_key_name_used=Un clé publique avec le même nom existe déjà.
@ -387,10 +387,10 @@ owner=Propriétaire
repo_name=Nom du dépôt repo_name=Nom du dépôt
repo_name_helper=Idéalement, le nom d'un dépot devrait être court, mémorable et <strong>unique</strong>. repo_name_helper=Idéalement, le nom d'un dépot devrait être court, mémorable et <strong>unique</strong>.
visibility=Visibilité visibility=Visibilité
visiblity_helper="Ce dépôt est <span class=\"ui red text\"> privé</span>" visiblity_helper=Ce dépôt est <span class="ui red text"> privé</span>
visiblity_helper_forced="L'administrateur du site a forcé tous les nouveaux dépôts à être <span class=\"ui red text\">privés</span>" visiblity_helper_forced=L'administrateur du site a forcé tous les nouveaux dépôts à être <span class="ui red text">privés</span>
visiblity_fork_helper=(Les changement de cette valeur affecteront tous les forks) visiblity_fork_helper=(Les changement de cette valeur affecteront tous les forks)
clone_helper="Besoin d'aide pour dupliquer ? Visitez <a target=\"_blank\" rel=\"noopener\" href=\"%s\">l'aide</a> !" clone_helper=Besoin d'aide pour dupliquer ? Visitez <a target="_blank" rel="noopener" href="%s">l'aide</a> !
fork_repo=Créer un fork du dépôt fork_repo=Créer un fork du dépôt
fork_from=Fork de fork_from=Fork de
fork_visiblity_helper=La visibilité d'un fork ne peut pas être modifiée. fork_visiblity_helper=La visibilité d'un fork ne peut pas être modifiée.
@ -419,7 +419,7 @@ form.name_pattern_not_allowed=Motif '%s' interdit pour les noms de dépôt.
need_auth=Nécessite une Autorisation need_auth=Nécessite une Autorisation
migrate_type=Type de migration migrate_type=Type de migration
migrate_type_helper="Ce dépôt sera un <span class=\"text blue\"> miroir</span>" migrate_type_helper=Ce dépôt sera un <span class="text blue"> miroir</span>
migrate_repo=Migrer le dépôt migrate_repo=Migrer le dépôt
migrate.clone_address=Adresse du clone migrate.clone_address=Adresse du clone
migrate.clone_address_desc=Cela peut être une URL HTTP/HTTPS/GIT ou un chemin d'accès local. migrate.clone_address_desc=Cela peut être une URL HTTP/HTTPS/GIT ou un chemin d'accès local.
@ -489,7 +489,7 @@ editor.add=Ajouter '%s'
editor.update=Mettre à jour '%s' editor.update=Mettre à jour '%s'
editor.delete=Supprimer '%s' editor.delete=Supprimer '%s'
editor.commit_message_desc=Ajouter une optionnelle description détaillée... editor.commit_message_desc=Ajouter une optionnelle description détaillée...
editor.commit_directly_to_this_branch="Soumettre directement à la branche <strong class=\"branch-name\">%s</strong>." editor.commit_directly_to_this_branch=Soumettre directement à la branche <strong class="branch-name">%s</strong>.
editor.create_new_branch=Créer une <strong>nouvelle branche</strong> pour cette validation et envoyer une nouvelle demande d'ajout. editor.create_new_branch=Créer une <strong>nouvelle branche</strong> pour cette validation et envoyer une nouvelle demande d'ajout.
editor.new_branch_name_desc=Nouveau nom de la branche... editor.new_branch_name_desc=Nouveau nom de la branche...
editor.cancel=Annuler editor.cancel=Annuler
@ -499,7 +499,7 @@ editor.directory_is_a_file=L'entrée '%s' dans le chemin daccès parent est u
editor.file_is_a_symlink=Le fichier '%s' est un lien symbolique qui ne peut pas être modifié par l'éditeur web editor.file_is_a_symlink=Le fichier '%s' est un lien symbolique qui ne peut pas être modifié par l'éditeur web
editor.filename_is_a_directory=Le nom de fichier '%s' existe déjà dans ce dépot. editor.filename_is_a_directory=Le nom de fichier '%s' existe déjà dans ce dépot.
editor.file_editing_no_longer_exists=Le fichier '%s' que vous modifiez n'existe plus dans le dépôt. editor.file_editing_no_longer_exists=Le fichier '%s' que vous modifiez n'existe plus dans le dépôt.
editor.file_changed_while_editing="Le contenu du fichier à changé depuis que vous avez commencé à l'éditer. <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Cliquez ici</a> pour voir ce qui à été modifié ou <strong>appuyez sur commit encore une fois</strong> pour remplacer ces changements." editor.file_changed_while_editing=Le contenu du fichier à changé depuis que vous avez commencé à l'éditer. <a target="_blank" rel="noopener" href="%s">Cliquez ici</a> pour voir ce qui à été modifié ou <strong>appuyez sur commit encore une fois</strong> pour remplacer ces changements.
editor.file_already_exists=La branche '%s' existe déjà dans ce dépôt. editor.file_already_exists=La branche '%s' existe déjà dans ce dépôt.
editor.no_changes_to_show=Il ny a aucun changement à afficher. editor.no_changes_to_show=Il ny a aucun changement à afficher.
editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec lerreur : %v editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec lerreur : %v
@ -538,8 +538,8 @@ issues.label_templates.info=Il n'y a pas encore d'étiquettes. Vous pouvez cliqu
issues.label_templates.helper=Sélectionnez un ensemble d'étiquettes issues.label_templates.helper=Sélectionnez un ensemble d'étiquettes
issues.label_templates.use=Utilisez ce jeu d'étiquettes issues.label_templates.use=Utilisez ce jeu d'étiquettes
issues.label_templates.fail_to_load_file=Impossible de charger le fichier de modèle étiquette '%s' : %v issues.label_templates.fail_to_load_file=Impossible de charger le fichier de modèle étiquette '%s' : %v
issues.add_label_at="`ajouté le <div class=\"ui label\" style=\"color: %s" ; background-color: %s">%s</div> label %s` issues.add_label_at=`ajouté le <div class="ui label" style="color: %s; background-color: %s">%s</div> label %s`
issues.remove_label_at="`supprimé le <div class=\"ui label\" style=\"color: %s" ; background-color: %s">%s</div> label %s` issues.remove_label_at=`supprimé le <div class="ui label" style="color: %s; background-color: %s">%s</div> label %s`
issues.add_milestone_at=`a ajouté cela au jalon <b>%s</b> %s` issues.add_milestone_at=`a ajouté cela au jalon <b>%s</b> %s`
issues.change_milestone_at=`a modifié le jalon de <b>%s</b> à <b>%s</b> %s` issues.change_milestone_at=`a modifié le jalon de <b>%s</b> à <b>%s</b> %s`
issues.remove_milestone_at=`a supprimé cela du jalon <b>%s</b> %s` issues.remove_milestone_at=`a supprimé cela du jalon <b>%s</b> %s`
@ -568,14 +568,14 @@ issues.filter_sort.recentupdate=Mis à jour récemment
issues.filter_sort.leastupdate=Moins récemment mis à jour issues.filter_sort.leastupdate=Moins récemment mis à jour
issues.filter_sort.mostcomment=Les plus commentés issues.filter_sort.mostcomment=Les plus commentés
issues.filter_sort.leastcomment=Les moins commentés issues.filter_sort.leastcomment=Les moins commentés
issues.opened_by="Créé %[1]s par <a href=\"%[2]s\">%[3]s</a>" issues.opened_by=Créé %[1]s par <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=ouvert %[1]s par %[2]s issues.opened_by_fake=ouvert %[1]s par %[2]s
issues.previous=Page Précédente issues.previous=Page Précédente
issues.next=Page Suivante issues.next=Page Suivante
issues.open_title=Ouvert issues.open_title=Ouvert
issues.closed_title=Fermé issues.closed_title=Fermé
issues.num_comments=%d commentaires issues.num_comments=%d commentaires
issues.commented_at="`a commenté <a href=\"#%s\"> %s</a>`" issues.commented_at=`a commenté <a href="#%s"> %s</a>`
issues.delete_comment_confirm=Êtes-vous certain de vouloir supprimer ce commentaire? issues.delete_comment_confirm=Êtes-vous certain de vouloir supprimer ce commentaire?
issues.no_content=Il n'existe pas encore de contenu. issues.no_content=Il n'existe pas encore de contenu.
issues.close_issue=Fermer issues.close_issue=Fermer
@ -583,13 +583,13 @@ issues.close_comment_issue=Commenter et fermer
issues.reopen_issue=Réouvrir issues.reopen_issue=Réouvrir
issues.reopen_comment_issue=Commenter et réouvrir issues.reopen_comment_issue=Commenter et réouvrir
issues.create_comment=Créer un commentaire issues.create_comment=Créer un commentaire
issues.closed_at="`fermé à <a id=\"%[1]s\"href=\"#%[1]s\"> %[2]s</a>`" issues.closed_at=`fermé à <a id="%[1]s"href="#%[1]s"> %[2]s</a>`
issues.reopened_at="`réouvert à <a id=\"%[1]s\" href=\"#%[1]s\"> %[2]s</a>`" issues.reopened_at=`réouvert à <a id="%[1]s" href="#%[1]s"> %[2]s</a>`
issues.commit_ref_at="`a référencé ce problème depuis une révision <a id=\"%[1]s\" href=\"#%[1]s\"> %[2]s</a>`" issues.commit_ref_at=`a référencé ce problème depuis une révision <a id="%[1]s" href="#%[1]s"> %[2]s</a>`
issues.poster=Publier issues.poster=Publier
issues.collaborator=Collaborateur issues.collaborator=Collaborateur
issues.owner=Propriétaire issues.owner=Propriétaire
issues.sign_in_require_desc="<a href=\"%s\">Connectez-vous</a> pour rejoindre cette conversation." issues.sign_in_require_desc=<a href="%s">Connectez-vous</a> pour rejoindre cette conversation.
issues.edit=Modifier issues.edit=Modifier
issues.cancel=Annuler issues.cancel=Annuler
issues.save=Enregistrer issues.save=Enregistrer
@ -617,7 +617,7 @@ pulls.compare_compare=Comparer
pulls.filter_branch=Filtre de branche pulls.filter_branch=Filtre de branche
pulls.no_results=Aucun résultat trouvé. pulls.no_results=Aucun résultat trouvé.
pulls.nothing_to_compare=Il n'y a rien de comparable parce que les deux branches sont égales. pulls.nothing_to_compare=Il n'y a rien de comparable parce que les deux branches sont égales.
pulls.has_pull_request="`Il y a déjà une demande d'ajout entre ces deux cibles : <a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]d</a>`" pulls.has_pull_request=`Il y a déjà une demande d'ajout entre ces deux cibles : <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Creer une demande d'ajout pulls.create=Creer une demande d'ajout
pulls.title_desc=veut fusionner %[1]d commits à partir de <code>%[2]s</code> vers <code>%[3]s</code> pulls.title_desc=veut fusionner %[1]d commits à partir de <code>%[2]s</code> vers <code>%[3]s</code>
pulls.merged_title_desc=a fusionné %[1]d révision(s) à partir de <code>%[2]s</code> vers <code>%[3]s</code> %[4]s pulls.merged_title_desc=a fusionné %[1]d révision(s) à partir de <code>%[2]s</code> vers <code>%[3]s</code> %[4]s
@ -633,7 +633,7 @@ pulls.can_auto_merge_desc=Cette demande d'ajout peut être fusionnée automatiqu
pulls.cannot_auto_merge_desc=Cette demande d'ajout ne peut pas être fusionnée automatiquement à cause de conflits. pulls.cannot_auto_merge_desc=Cette demande d'ajout ne peut pas être fusionnée automatiquement à cause de conflits.
pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits. pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits.
pulls.merge_pull_request=Fusionner la demande d'ajout pulls.merge_pull_request=Fusionner la demande d'ajout
pulls.open_unmerged_pull_exists="`Vous ne pouvez effectuer une réouverture car il y a déjà une pull-request ouverte (#%d) depuis le même dépôt avec les mêmes informations de fusion et est en attente de fusion.`" pulls.open_unmerged_pull_exists=`Vous ne pouvez effectuer une réouverture car il y a déjà une pull-request ouverte (#%d) depuis le même dépôt avec les mêmes informations de fusion et est en attente de fusion.`
milestones.new=Nouveau Jalon milestones.new=Nouveau Jalon
milestones.open_tab=%d Ouvert milestones.open_tab=%d Ouvert
@ -752,7 +752,7 @@ settings.search_user_placeholder=Rechercher un utilisateur...
settings.org_not_allowed_to_be_collaborator=Une organisation n'est pas autorisée à être ajoutée en tant que collaborateur. settings.org_not_allowed_to_be_collaborator=Une organisation n'est pas autorisée à être ajoutée en tant que collaborateur.
settings.user_is_org_member=Cet utilisateur ne peut pas être ajouté en tant que collaborateur car il fait partie d'une organisation. settings.user_is_org_member=Cet utilisateur ne peut pas être ajouté en tant que collaborateur car il fait partie d'une organisation.
settings.add_webhook=Ajouter un Webhook settings.add_webhook=Ajouter un Webhook
settings.hooks_desc="Les Webhooks sont des déclencheurs de POST HTTP . Lorsque qu'un événement se produit dans Gitea, une notification sera envoyée vers l'hôte cible préalablement spécifié. Apprenez-en davantage dans le <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Guide des Webhooks</a>." settings.hooks_desc=Les Webhooks sont des déclencheurs de POST HTTP . Lorsque qu'un événement se produit dans Gitea, une notification sera envoyée vers l'hôte cible préalablement spécifié. Apprenez-en davantage dans le <a target="_blank" rel="noopener" href="%s">Guide des Webhooks</a>.
settings.webhook_deletion=Supprimer le Webhook settings.webhook_deletion=Supprimer le Webhook
settings.webhook_deletion_desc=Supprimer ce webhook va supprimer ses informations et l'historique de livraison. Voulez-vous continuer ? settings.webhook_deletion_desc=Supprimer ce webhook va supprimer ses informations et l'historique de livraison. Voulez-vous continuer ?
settings.webhook_deletion_success=Le webhook a été supprimé avec succès ! settings.webhook_deletion_success=Le webhook a été supprimé avec succès !
@ -769,7 +769,7 @@ settings.githook_edit_desc=Si un Hook est inactif, un exemple de contenu vous se
settings.githook_name=Nom du Hook settings.githook_name=Nom du Hook
settings.githook_content=Contenu du Hook settings.githook_content=Contenu du Hook
settings.update_githook=Mettre le Hook à jour settings.update_githook=Mettre le Hook à jour
settings.add_webhook_desc="Une requête <code>POST</code> sera transmise vers l'URL spécifiée selon l'événement produit. Vous pouvez également choisir le format souhaité pour la réception des données (JSON, x-www-form-urlencoded, XML etc). Pour plus d'infos, lisez le <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Guide des WebHooks</a>." settings.add_webhook_desc=Une requête <code>POST</code> sera transmise vers l'URL spécifiée selon l'événement produit. Vous pouvez également choisir le format souhaité pour la réception des données (JSON, x-www-form-urlencoded, XML etc). Pour plus d'infos, lisez le <a target="_blank" rel="noopener" href="%s">Guide des WebHooks</a>.
settings.payload_url=URL des Données Utiles settings.payload_url=URL des Données Utiles
settings.content_type=Type de contenu settings.content_type=Type de contenu
settings.secret=Confidentiel settings.secret=Confidentiel
@ -794,7 +794,7 @@ settings.update_hook_success=Webhook mis à jour.
settings.delete_webhook=Supprimer le Webhook settings.delete_webhook=Supprimer le Webhook
settings.recent_deliveries=Livraisons récentes settings.recent_deliveries=Livraisons récentes
settings.hook_type=Type de Hook settings.hook_type=Type de Hook
settings.add_slack_hook_desc="Intégrer <a href=\"%s\"> Slack</a> à votre dépôt." settings.add_slack_hook_desc=Intégrer <a href="%s"> Slack</a> à votre dépôt.
settings.slack_token=Jeton settings.slack_token=Jeton
settings.slack_domain=Domaine settings.slack_domain=Domaine
settings.slack_channel=Canal settings.slack_channel=Canal
@ -1233,19 +1233,19 @@ notices.op=Opération
notices.delete_success=Notifications système supprimées avec succès. notices.delete_success=Notifications système supprimées avec succès.
[action] [action]
create_repo="a créé le dépôt <a href=\"%s\">%s</a>" create_repo=a créé le dépôt <a href="%s">%s</a>
rename_repo="a rebaptisé le dépôt de <code>%[1]s</code> vers <a href=\"%[2]s\">%[3]s</a>" rename_repo=a rebaptisé le dépôt de <code>%[1]s</code> vers <a href="%[2]s">%[3]s</a>
commit_repo="a poussé dans <a href=\"%[1]s/src/%[2]s\">%[3]s</a> sur <a href=\"%[1]s\">%[4]s</a>" commit_repo=a poussé dans <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a>
create_issue="`a ouvert un problème <a href=\"%s/issues/%s\">%s#%[2]s</a>`" create_issue=`a ouvert un problème <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue="`tickets clos <a href=\"%s/issues/%s\">%s#%[2]s</a>`" close_issue=`tickets clos <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue="`tickets ré-ouverts <a href=\"%s/issues/%s\">%s#%[2]s</a>`" reopen_issue=`tickets ré-ouverts <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request="`pull request créée le <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" create_pull_request=`pull request créée le <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request="`pull request fermé <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" close_pull_request=`pull request fermé <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_pull_request="`pull request ré-ouverte <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" reopen_pull_request=`pull request ré-ouverte <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue="`a commenté le problème <a href=\"%s/issues/%s\">%s#%[2]s</a>`" comment_issue=`a commenté le problème <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request="`demande d'ajout fusionnée le <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" merge_pull_request=`demande d'ajout fusionnée le <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo="a transféré le dépôt <code>%s</code> à <a href=\"%s\">%s</a>" transfer_repo=a transféré le dépôt <code>%s</code> à <a href="%s">%s</a>
push_tag="a soumis le tag <a href=\"%s/src/%s\">%[2]s</a> sur <a href=\"%[1]s\">%[3]s</a>" push_tag=a soumis le tag <a href="%s/src/%s">%[2]s</a> sur <a href="%[1]s">%[3]s</a>
compare_commits=Comparer ces %d révisions compare_commits=Comparer ces %d révisions
[tool] [tool]

View File

@ -51,7 +51,7 @@ cancel=Annulla
[install] [install]
install=Installazione install=Installazione
title=Passi d'installazione per il primo avvio title=Passi d'installazione per il primo avvio
docker_helper="Se stai utilizzando Gitea su Docker, per favore leggi le <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Linee guida</a> con attenzione prima di cambiare qualcosa su questa pagina!" docker_helper=Se stai utilizzando Gitea su Docker, per favore leggi le <a target="_blank" rel="noopener" href="%s">Linee guida</a> con attenzione prima di cambiare qualcosa su questa pagina!
requite_db_desc=Gitea necessita MySQL, PostgreSQL, SQLite3 o TiDB. requite_db_desc=Gitea necessita MySQL, PostgreSQL, SQLite3 o TiDB.
db_title=Impostazioni Database db_title=Impostazioni Database
db_type=Tipo di database db_type=Tipo di database
@ -309,7 +309,7 @@ keep_email_private_popup=Il tuo indirizzo email sarà nascosto agli altri utenti
manage_ssh_keys=Gestisci chiavi SSH manage_ssh_keys=Gestisci chiavi SSH
add_key=Aggiungi Chiave add_key=Aggiungi Chiave
ssh_desc=Questa è una lista di chiavi SSH associate al tuo account. Poiché queste chiavi consentono a chiunque di ottenere accesso alle tue repository, è molto importante che tu le riconosca. ssh_desc=Questa è una lista di chiavi SSH associate al tuo account. Poiché queste chiavi consentono a chiunque di ottenere accesso alle tue repository, è molto importante che tu le riconosca.
ssh_helper="<strong>Non sai come?</strong> Controlla la guida di GitHub sul <a href=\"%s\">creare le tue chiavi SSH</a> o sul risolvere <a href=\"%s\">problemi frequenti</a> che potresti incontrare usando SSH." ssh_helper=<strong>Non sai come?</strong> Controlla la guida di GitHub sul <a href="%s">creare le tue chiavi SSH</a> o sul risolvere <a href="%s">problemi frequenti</a> che potresti incontrare usando SSH.
add_new_key=Aggiungi Chiave SSH add_new_key=Aggiungi Chiave SSH
ssh_key_been_used=È stato utilizzato il contenuto della chiave pubblica. ssh_key_been_used=È stato utilizzato il contenuto della chiave pubblica.
ssh_key_name_used=Chiave pubblica con lo stesso nome esiste già. ssh_key_name_used=Chiave pubblica con lo stesso nome esiste già.
@ -359,10 +359,10 @@ owner=Proprietario
repo_name=Nome Repository repo_name=Nome Repository
repo_name_helper=I migliori nomi dei repository sono brevi, facili da memorizzare e <strong>univoci</strong>. repo_name_helper=I migliori nomi dei repository sono brevi, facili da memorizzare e <strong>univoci</strong>.
visibility=Visibilità visibility=Visibilità
visiblity_helper="Questo repository è <span class=\"ui red text\"> privato</span>" visiblity_helper=Questo repository è <span class="ui red text"> privato</span>
visiblity_helper_forced="L'amministratore del sito ha deciso che tutti i nuovi repository devono essere <span class=\"ui red text\">privati</span>" visiblity_helper_forced=L'amministratore del sito ha deciso che tutti i nuovi repository devono essere <span class="ui red text">privati</span>
visiblity_fork_helper=(La modifica di questo valore avrà effetto su tutti i fork) visiblity_fork_helper=(La modifica di questo valore avrà effetto su tutti i fork)
clone_helper="Hai bisogno di aiuto per la clonazione? Visita <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Aiuto</a>!" clone_helper=Hai bisogno di aiuto per la clonazione? Visita <a target="_blank" rel="noopener" href="%s">Aiuto</a>!
fork_repo=Forka Repository fork_repo=Forka Repository
fork_from=Forka da fork_from=Forka da
fork_visiblity_helper=Non puoi cambiare la visibilità di un repository forkato. fork_visiblity_helper=Non puoi cambiare la visibilità di un repository forkato.
@ -389,7 +389,7 @@ form.name_pattern_not_allowed=La struttura del nome del repository %s non è con
need_auth=Richiesta di autorizzazione need_auth=Richiesta di autorizzazione
migrate_type=Tipo di migrazione migrate_type=Tipo di migrazione
migrate_type_helper="Questo repository sarà un <span class=\"text blue\">mirror</span>" migrate_type_helper=Questo repository sarà un <span class="text blue">mirror</span>
migrate_repo=Migra Repository migrate_repo=Migra Repository
migrate.clone_address=Duplica Indirizzo migrate.clone_address=Duplica Indirizzo
migrate.clone_address_desc=Può essere un URL HTTP/HTTPS/GIT o il percorso del server locale. migrate.clone_address_desc=Può essere un URL HTTP/HTTPS/GIT o il percorso del server locale.
@ -484,7 +484,7 @@ issues.filter_sort.recentupdate=Aggiornati di recente
issues.filter_sort.leastupdate=Aggiornati tempo fa issues.filter_sort.leastupdate=Aggiornati tempo fa
issues.filter_sort.mostcomment=I più commentati issues.filter_sort.mostcomment=I più commentati
issues.filter_sort.leastcomment=I meno commentati issues.filter_sort.leastcomment=I meno commentati
issues.opened_by="aperto %[1]s da <a href=\"/%[2]s\">%[3]s</a>" issues.opened_by=aperto %[1]s da <a href="/%[2]s">%[3]s</a>
issues.opened_by_fake=aperto %[1]s da %[2]s issues.opened_by_fake=aperto %[1]s da %[2]s
issues.previous=Pagina precedente issues.previous=Pagina precedente
issues.next=Pagina successiva issues.next=Pagina successiva
@ -497,8 +497,8 @@ issues.close_comment_issue=Commenta e chiudi
issues.reopen_issue=Riapri issues.reopen_issue=Riapri
issues.reopen_comment_issue=Commenta e riapri issues.reopen_comment_issue=Commenta e riapri
issues.create_comment=Commento issues.create_comment=Commento
issues.closed_at="`chiuso <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.closed_at=`chiuso <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at="`riaperto <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.reopened_at=`riaperto <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.poster=Autore issues.poster=Autore
issues.collaborator=Collaboratori issues.collaborator=Collaboratori
issues.owner=Proprietario issues.owner=Proprietario
@ -524,7 +524,7 @@ pulls.compare_compare=confronta
pulls.filter_branch=Filtra branch pulls.filter_branch=Filtra branch
pulls.no_results=Nessun risultato trovato. pulls.no_results=Nessun risultato trovato.
pulls.nothing_to_compare=Non c'è niente da confrontare perchè i branch base e head uguali. pulls.nothing_to_compare=Non c'è niente da confrontare perchè i branch base e head uguali.
pulls.has_pull_request="`E' già presente una pull request tra questi due trargets: <a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]d</a>`" pulls.has_pull_request=`E' già presente una pull request tra questi due trargets: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Crea Pull Request pulls.create=Crea Pull Request
pulls.title_desc=vorrebbe unire %[1]d commit da <code>%[2]s</code> a <code>%[3]s</code> pulls.title_desc=vorrebbe unire %[1]d commit da <code>%[2]s</code> a <code>%[3]s</code>
pulls.merged_title_desc=ha unito %[1]d commit da <code>%[2]s</code> a <code>%[3]s</code> %[4]s pulls.merged_title_desc=ha unito %[1]d commit da <code>%[2]s</code> a <code>%[3]s</code> %[4]s
@ -629,7 +629,7 @@ settings.search_user_placeholder=Cerca utente...
settings.org_not_allowed_to_be_collaborator=Un'organizzazione non può essere aggiunta come collaboratore. settings.org_not_allowed_to_be_collaborator=Un'organizzazione non può essere aggiunta come collaboratore.
settings.user_is_org_member=L'utente è un membro dell'organizzazione che non può essere aggiunto come collaboratore. settings.user_is_org_member=L'utente è un membro dell'organizzazione che non può essere aggiunto come collaboratore.
settings.add_webhook=Aggiungi Webhook settings.add_webhook=Aggiungi Webhook
settings.hooks_desc="I Webhooks sono molto simili a un basilare evento trigger HTTP POST. Ogni volta che qualcosa si verifica in Gitea, tratteremo la notifica all'host di destinazione specificato. Ulteriori informazioni in questa <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Guida ai Webhooks</a>." settings.hooks_desc=I Webhooks sono molto simili a un basilare evento trigger HTTP POST. Ogni volta che qualcosa si verifica in Gitea, tratteremo la notifica all'host di destinazione specificato. Ulteriori informazioni in questa <a target="_blank" rel="noopener" href="%s">Guida ai Webhooks</a>.
settings.webhook_deletion=Elimina Webhook settings.webhook_deletion=Elimina Webhook
settings.webhook_deletion_success=Il Webhook è stato eliminato con successo! settings.webhook_deletion_success=Il Webhook è stato eliminato con successo!
settings.webhook.test_delivery=Test di consegna settings.webhook.test_delivery=Test di consegna
@ -640,7 +640,7 @@ settings.githook_edit_desc=Se l'hook è inattivo, sarà presentato un contenuto
settings.githook_name=Nome hook settings.githook_name=Nome hook
settings.githook_content=Contenuto hook settings.githook_content=Contenuto hook
settings.update_githook=Aggiorna Hook settings.update_githook=Aggiorna Hook
settings.add_webhook_desc="Gitea manderà una richiesta <code>POST</code> all'URL specificata, insieme alle informazioni sull'evento avvenuto. Puoi anche specificare quale tipo di formato dati vorresti ottenere all'innesco dell'hook (JSON, x-www-form-urlencoded, XML, ecc). Puoi trovare più informazioni nella nostra <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Guida ai Webhook</a>." settings.add_webhook_desc=Gitea manderà una richiesta <code>POST</code> all'URL specificata, insieme alle informazioni sull'evento avvenuto. Puoi anche specificare quale tipo di formato dati vorresti ottenere all'innesco dell'hook (JSON, x-www-form-urlencoded, XML, ecc). Puoi trovare più informazioni nella nostra <a target="_blank" rel="noopener" href="%s">Guida ai Webhook</a>.
settings.slack_username=Nome utente settings.slack_username=Nome utente
settings.slack_icon_url=URL icona settings.slack_icon_url=URL icona
settings.slack_color=Colore settings.slack_color=Colore
@ -659,7 +659,7 @@ settings.update_hook_success=Il webhook è stato aggiornato.
settings.delete_webhook=Eliminare Webhook settings.delete_webhook=Eliminare Webhook
settings.recent_deliveries=Recenti Deliveries settings.recent_deliveries=Recenti Deliveries
settings.hook_type=Tipo di Hook settings.hook_type=Tipo di Hook
settings.add_slack_hook_desc="Aggiungi <a href=\"%s\"> Slack</a> integrazione al tuo repository." settings.add_slack_hook_desc=Aggiungi <a href="%s"> Slack</a> integrazione al tuo repository.
settings.slack_domain=Dominio settings.slack_domain=Dominio
settings.slack_channel=Canale settings.slack_channel=Canale
settings.deploy_keys=Dispiega Chiavi settings.deploy_keys=Dispiega Chiavi
@ -1034,14 +1034,14 @@ notices.desc=Descrizione
notices.delete_success=Gli avvisi di sistema sono stati successivamente eliminati. notices.delete_success=Gli avvisi di sistema sono stati successivamente eliminati.
[action] [action]
create_repo="ha creato il repository <a href=\"%s\">%s</a>" create_repo=ha creato il repository <a href="%s">%s</a>
rename_repo="repository rinominato da <code>%[1]s</code> a <a href=\"%[2]s\">[3]s</a>" rename_repo=repository rinominato da <code>%[1]s</code> a <a href="%[2]s">[3]s</a>
commit_repo="ha pushato nel <a href=\"%[1]s/src/%[2]s\">%[3]s</a> in <a href=\"%[1]s\">%[4]s</a>" commit_repo=ha pushato nel <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a>
create_issue="`ha aperto il problema <a href=\"%s/issues/%s\">%s#%[2]s</a>`" create_issue=`ha aperto il problema <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request="`creata pull request <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" create_pull_request=`creata pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue="`ha commentato il problema <a href=\"%s/issues/%s\">%s#%[2]s</a>`" comment_issue=`ha commentato il problema <a href="%s/issues/%s">%s#%[2]s</a>`
transfer_repo="ha trasferito il repository <code>%s</code> a <a href=\"%s\">%s</a>" transfer_repo=ha trasferito il repository <code>%s</code> a <a href="%s">%s</a>
push_tag="ha pushato il tag <a href=\"%s/src/%s\">%[2]s</a> a <a href=\"%[1]s\">%[3]s</a>" push_tag=ha pushato il tag <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a>
compare_commits=Visualizza comparazione tra questi %d commit compare_commits=Visualizza comparazione tra questi %d commit
[tool] [tool]

View File

@ -48,7 +48,7 @@ cancel=Annuleren
[install] [install]
install=Installatie install=Installatie
title=Installatiestappen voor de eerste keer opstarten title=Installatiestappen voor de eerste keer opstarten
docker_helper="Als u gebruik maakt Gitea binnen Docker, lees dan de <a target=\"_blank\" rel=\"noopener\" href=\"%s\">richtlijnen</a> voordat u iets veranderen op deze pagina!" docker_helper=Als u gebruik maakt Gitea binnen Docker, lees dan de <a target="_blank" rel="noopener" href="%s">richtlijnen</a> voordat u iets veranderen op deze pagina!
requite_db_desc=Gitea vereist MySQL, PostgreSQL, SQite3 of TiDB. requite_db_desc=Gitea vereist MySQL, PostgreSQL, SQite3 of TiDB.
db_title=Database-instellingen db_title=Database-instellingen
db_type=Database-type db_type=Database-type
@ -301,7 +301,7 @@ add_email_success=Het e-mailadres was toegevoegd.
manage_ssh_keys=Beheer SSH sleutels manage_ssh_keys=Beheer SSH sleutels
add_key=Sleutel toevoegen add_key=Sleutel toevoegen
ssh_desc=Dit is een lijst van alle SSH sleutels die gekoppeld zijn aan uw account. Verwijder alle sleutels die u niet herkent. ssh_desc=Dit is een lijst van alle SSH sleutels die gekoppeld zijn aan uw account. Verwijder alle sleutels die u niet herkent.
ssh_helper="<strong>Weet u niet hoe?</strong> Lees dan onze handleiding voor het <a href=\"%s\"> genereren van SSH sleutels</a> of voor <a href=\"%s\"> algemene SSH</a> problemen." ssh_helper=<strong>Weet u niet hoe?</strong> Lees dan onze handleiding voor het <a href="%s"> genereren van SSH sleutels</a> of voor <a href="%s"> algemene SSH</a> problemen.
add_new_key=SSH sleutel toevoegen add_new_key=SSH sleutel toevoegen
ssh_key_been_used=Publieke sleutel werd gebruikt. ssh_key_been_used=Publieke sleutel werd gebruikt.
ssh_key_name_used=Een publieke sleutel met dezelfde naam bestaat al. ssh_key_name_used=Een publieke sleutel met dezelfde naam bestaat al.
@ -347,10 +347,10 @@ owner=Eigenaar
repo_name=Naam van repository repo_name=Naam van repository
repo_name_helper=Een goede repository-naam is kort, makkelijk te onthouden en <strong>uniek</strong>. repo_name_helper=Een goede repository-naam is kort, makkelijk te onthouden en <strong>uniek</strong>.
visibility=Zichtbaarheid visibility=Zichtbaarheid
visiblity_helper="Deze repository is <span class=\"ui red text\">privé</span>" visiblity_helper=Deze repository is <span class="ui red text">privé</span>
visiblity_helper_forced="Sitebeheerder heeft alle nieuwe repositories gedwongen <span class=\"ui red text\">privé</span> te zijn" visiblity_helper_forced=Sitebeheerder heeft alle nieuwe repositories gedwongen <span class="ui red text">privé</span> te zijn
visiblity_fork_helper=(Verandering van deze waarde zal van invloed zijn op alle forks) visiblity_fork_helper=(Verandering van deze waarde zal van invloed zijn op alle forks)
clone_helper="Hulp nodig bij het klonen? Bekijk dan onze <a target=\"_blank\" rel=\"noopener\" href=\"%s\"> handleiding</a>!" clone_helper=Hulp nodig bij het klonen? Bekijk dan onze <a target="_blank" rel="noopener" href="%s"> handleiding</a>!
fork_repo=Repository forken fork_repo=Repository forken
fork_from=Afsplitsing van fork_from=Afsplitsing van
fork_visiblity_helper=U kunt de zichtbaarheid van een geforkte repository niet aanpassen. fork_visiblity_helper=U kunt de zichtbaarheid van een geforkte repository niet aanpassen.
@ -376,7 +376,7 @@ form.name_pattern_not_allowed=Repository naampatroon '%s' is niet toegestaan.
need_auth=Autorisatie vereist need_auth=Autorisatie vereist
migrate_type=Migratie type migrate_type=Migratie type
migrate_type_helper="Deze repository zal een <span class=\"text blue\">kopie</span> zijn" migrate_type_helper=Deze repository zal een <span class="text blue">kopie</span> zijn
migrate_repo=Migreer repository migrate_repo=Migreer repository
migrate.clone_address=Kloon adres migrate.clone_address=Kloon adres
migrate.clone_address_desc=Dit kan een HTTP/HTTPS/GIT URL zijn migrate.clone_address_desc=Dit kan een HTTP/HTTPS/GIT URL zijn
@ -469,7 +469,7 @@ issues.filter_sort.recentupdate=Recent bijgewerkt
issues.filter_sort.leastupdate=Minst recent bijgewerkt issues.filter_sort.leastupdate=Minst recent bijgewerkt
issues.filter_sort.mostcomment=Meest besproken issues.filter_sort.mostcomment=Meest besproken
issues.filter_sort.leastcomment=Minst besproken issues.filter_sort.leastcomment=Minst besproken
issues.opened_by="%[1]s werd geopend door <a href=\"/%[2]s\">%[3]s</a>" issues.opened_by=%[1]s werd geopend door <a href="/%[2]s">%[3]s</a>
issues.opened_by_fake=%[1]s werd geopend door %[2]s issues.opened_by_fake=%[1]s werd geopend door %[2]s
issues.previous=Vorige issues.previous=Vorige
issues.next=Volgende issues.next=Volgende
@ -481,9 +481,9 @@ issues.close_comment_issue=Sluit en geef commentaar
issues.reopen_issue=Heropen issues.reopen_issue=Heropen
issues.reopen_comment_issue=Heropen en geef commentaar issues.reopen_comment_issue=Heropen en geef commentaar
issues.create_comment=Reageer issues.create_comment=Reageer
issues.closed_at="`gesloten om <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.closed_at=`gesloten om <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at="`heropend om <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.reopened_at=`heropend om <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at="`verwees naar dit probleem vanuit commit <a id=\"%[1]s\" href=\"#%[1]s\"> %[2]s'</a>`" issues.commit_ref_at=`verwees naar dit probleem vanuit commit <a id="%[1]s" href="#%[1]s"> %[2]s'</a>`
issues.collaborator=Medewerker issues.collaborator=Medewerker
issues.owner=Eigenaar issues.owner=Eigenaar
issues.edit=Bewerken issues.edit=Bewerken
@ -506,7 +506,7 @@ pulls.compare_changes_desc=Vergelijk twee branches en maak een pull verzoek voor
pulls.compare_compare=vergelijk pulls.compare_compare=vergelijk
pulls.no_results=Geen resultaten gevonden. pulls.no_results=Geen resultaten gevonden.
pulls.nothing_to_compare=Er is niets te vergelijken omdat base en head branches dezelfde zijn. pulls.nothing_to_compare=Er is niets te vergelijken omdat base en head branches dezelfde zijn.
pulls.has_pull_request="' Er is al een pull-aanvraag tussen deze twee targets: <a href=\"%[1]s/pulls/%[3]d\"> %[2]s #% [3]d</a>'" pulls.has_pull_request=` Er is al een pull-aanvraag tussen deze twee targets: <a href="%[1]s/pulls/%[3]d"> %[2]s #% [3]d</a`
pulls.create=Pull verzoek aanmaken pulls.create=Pull verzoek aanmaken
pulls.title_desc=wil %[1]d commits van <code>%[2]s</code> samenvoegen met <code>%[3]s</code> pulls.title_desc=wil %[1]d commits van <code>%[2]s</code> samenvoegen met <code>%[3]s</code>
pulls.merged_title_desc=heeft %[1]d commits samengevoegd van <code>%[2]s</code> naar <code>%[3]s</code> %[4]s pulls.merged_title_desc=heeft %[1]d commits samengevoegd van <code>%[2]s</code> naar <code>%[3]s</code> %[4]s
@ -521,7 +521,7 @@ pulls.can_auto_merge_desc=Dit pull-request kan automatisch samengevoegd worden.
pulls.cannot_auto_merge_desc=Dit pull-request kan niet worden gemerged omdat er conflicten zijn. pulls.cannot_auto_merge_desc=Dit pull-request kan niet worden gemerged omdat er conflicten zijn.
pulls.cannot_auto_merge_helper=Gelieve beide versies manueel samen te voegen om de conflicten op te lossen. pulls.cannot_auto_merge_helper=Gelieve beide versies manueel samen te voegen om de conflicten op te lossen.
pulls.merge_pull_request=Samenvoegen van pull verzoek pulls.merge_pull_request=Samenvoegen van pull verzoek
pulls.open_unmerged_pull_exists="U kan de bewerking 'heropenen' niet uitvoeren omdat er al een pull-aanvraag (#%d) is van dezelfde repository met dezelfde informatie. Voeg deze eerst samen." pulls.open_unmerged_pull_exists=`U kan de bewerking 'heropenen' niet uitvoeren omdat er al een pull-aanvraag (#%d) is van dezelfde repository met dezelfde informatie. Voeg deze eerst samen.`
milestones.new=Nieuwe mijlpaal milestones.new=Nieuwe mijlpaal
milestones.open_tab=%d geopend milestones.open_tab=%d geopend
@ -617,7 +617,7 @@ settings.search_user_placeholder=Zoek gebruiker...
settings.org_not_allowed_to_be_collaborator=De organisatie kan niet toegevoegd worden als medewerker. settings.org_not_allowed_to_be_collaborator=De organisatie kan niet toegevoegd worden als medewerker.
settings.user_is_org_member=Gebruiker is lid van de organisatie die als een medewerker kan niet worden toegevoegd. settings.user_is_org_member=Gebruiker is lid van de organisatie die als een medewerker kan niet worden toegevoegd.
settings.add_webhook=Webhook toevoegen settings.add_webhook=Webhook toevoegen
settings.hooks_desc="Webhooks dat de externe diensten om kennisgevingen te ontvangen wanneer bepaalde gebeurtenissen op Gitea plaatsvinden. Wanneer de opgegeven gebeurtenissen plaatsvinden, sturen we een POST-aanvraag naar elk van de URL's die u opgeeft. Meer informatie vindt u in onze <a target=\"_blank\" rel=\"noopener\" href=\"%s\"> Webhooks gids</a>." settings.hooks_desc=Webhooks dat de externe diensten om kennisgevingen te ontvangen wanneer bepaalde gebeurtenissen op Gitea plaatsvinden. Wanneer de opgegeven gebeurtenissen plaatsvinden, sturen we een POST-aanvraag naar elk van de URL's die u opgeeft. Meer informatie vindt u in onze <a target="_blank" rel="noopener" href="%s"> Webhooks gids</a>.
settings.webhook_deletion=Webhook verwijderen settings.webhook_deletion=Webhook verwijderen
settings.webhook_deletion_desc=Verwijderen van deze webhook zal de informatie en alle geschiedenis verwijderen. Wilt u doorgaan? settings.webhook_deletion_desc=Verwijderen van deze webhook zal de informatie en alle geschiedenis verwijderen. Wilt u doorgaan?
settings.webhook_deletion_success=Webhook is succesvol verwijderd! settings.webhook_deletion_success=Webhook is succesvol verwijderd!
@ -633,7 +633,7 @@ settings.githook_edit_desc=Als haak niet actief is, zal monster inhoud worden ge
settings.githook_name=Haak naam settings.githook_name=Haak naam
settings.githook_content=Haak inhoud settings.githook_content=Haak inhoud
settings.update_githook=Haak bijwerken settings.update_githook=Haak bijwerken
settings.add_webhook_desc="We sturen een <code>POST</code>-aanvraag naar de onderstaande URL met details voor alle geplaatste gebeurtenissen. U kunt ook opgeven welke gegevensindeling u wenst te ontvangen (JSON, <code>x-1-800-www-Dell-vorm-urlencoded</code>, <em>enz</em>.). Meer informatie kan gevonden worden in <a target=\"_blank\" rel=\"noopener\" href=\"%s\"> Webhooks gids</a>." settings.add_webhook_desc=We sturen een <code>POST</code>-aanvraag naar de onderstaande URL met details voor alle geplaatste gebeurtenissen. U kunt ook opgeven welke gegevensindeling u wenst te ontvangen (JSON, <code>x-1-800-www-Dell-vorm-urlencoded</code>, <em>enz</em>.). Meer informatie kan gevonden worden in <a target="_blank" rel="noopener" href="%s"> Webhooks gids</a>.
settings.payload_url=Nettolading URL settings.payload_url=Nettolading URL
settings.content_type=Content type settings.content_type=Content type
settings.secret=Geheim settings.secret=Geheim
@ -655,7 +655,7 @@ settings.update_hook_success=Webhook is bijgewerkt.
settings.delete_webhook=Webhook verwijderen settings.delete_webhook=Webhook verwijderen
settings.recent_deliveries=Recente bezorgingen settings.recent_deliveries=Recente bezorgingen
settings.hook_type=Type hook settings.hook_type=Type hook
settings.add_slack_hook_desc="<a href=\"%s\"> toegestane vertraging</a> integratie toevoegen aan uw repository." settings.add_slack_hook_desc=<a href="%s"> toegestane vertraging</a> integratie toevoegen aan uw repository.
settings.slack_token=Slack token settings.slack_token=Slack token
settings.slack_domain=Slack domein settings.slack_domain=Slack domein
settings.slack_channel=Slack kanaal settings.slack_channel=Slack kanaal
@ -1039,12 +1039,12 @@ notices.type_1=Opslagplaats
notices.desc=Beschrijving notices.desc=Beschrijving
[action] [action]
create_repo="repository aangemaakt in <a href=\"%s\">%s</a>" create_repo=repository aangemaakt in <a href="%s">%s</a>
commit_repo="push update naar <a href=\"%[1]s/src/%[2]s\">%[3]s</a> in <a href=\"%[1]s\">%[4]s</a>" commit_repo=push update naar <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a>
create_issue="`opende issue in <a href=\"%s/issues/%s\">%s#%[2]s</a>`" create_issue=`opende issue in <a href="%s/issues/%s">%s#%[2]s</a>`
comment_issue="`reactie op issue <a href=\"%s/issues/%s\">%s#%[2]s</a>`" comment_issue=`reactie op issue <a href="%s/issues/%s">%s#%[2]s</a>`"
transfer_repo="repository verplaatst naar <code>%s</code> naar <a href=\"%s\">%s</a>" transfer_repo=repository verplaatst naar <code>%s</code> naar <a href="%s">%s</a>
push_tag="geduwd label <a href=\"%s/src/%s\"> %[2]s</a> naar <a href=\"%[1]s\"> %[3]s</a>" push_tag=geduwd label <a href="%s/src/%s"> %[2]s</a> naar <a href="%[1]s"> %[3]s</a>
compare_commits=Toon vergelijking voor deze %d commits compare_commits=Toon vergelijking voor deze %d commits
[tool] [tool]

View File

@ -52,7 +52,7 @@ cancel=Cancelar
[install] [install]
install=Instalação install=Instalação
title=Etapas de instalação para primeira execução title=Etapas de instalação para primeira execução
docker_helper="Se você está rodando o Gitea dentro do Docker, por favor leia os <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Guias</a> cuidadosamente antes de mudar qualquer coisa nesta página!" docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia os <a target="_blank" rel="noopener" href="%s">Guias</a> cuidadosamente antes de mudar qualquer coisa nesta página!
requite_db_desc=Gitea requer MySQL, PostgreSQL, SQLite3 ou TiDB. requite_db_desc=Gitea requer MySQL, PostgreSQL, SQLite3 ou TiDB.
db_title=Configurações de banco de dados db_title=Configurações de banco de dados
db_type=Tipo de banco de dados db_type=Tipo de banco de dados
@ -328,7 +328,7 @@ keep_email_private_popup=Seu endereço de e-mail será ocultado de outros usuár
manage_ssh_keys=Gerenciar Chaves SSH manage_ssh_keys=Gerenciar Chaves SSH
add_key=Adicionar chave add_key=Adicionar chave
ssh_desc=Esta é uma lista de chaves SSH associadas com a sua conta. Como essas chaves permitem que qualquer um que as usem tenham acesso aos seus repositórios, é altamente importante que você reconheça elas. ssh_desc=Esta é uma lista de chaves SSH associadas com a sua conta. Como essas chaves permitem que qualquer um que as usem tenham acesso aos seus repositórios, é altamente importante que você reconheça elas.
ssh_helper="<strong>Precisa de ajuda?</strong> Confira nosso guia para <a href=\"%s\">gerar chaves SSH</a> ou solucionar <a href=\"%s\">problemas comuns com SSH</a>." ssh_helper=<strong>Precisa de ajuda?</strong> Confira nosso guia para <a href="%s">gerar chaves SSH</a> ou solucionar <a href="%s">problemas comuns com SSH</a>.
add_new_key=Adicionar Chave SSH add_new_key=Adicionar Chave SSH
ssh_key_been_used=Uma chave pública com esse mesmo conteúdo já está em uso. ssh_key_been_used=Uma chave pública com esse mesmo conteúdo já está em uso.
ssh_key_name_used=Uma outra chave pública já existe com esse mesmo nome. ssh_key_name_used=Uma outra chave pública já existe com esse mesmo nome.
@ -390,10 +390,10 @@ owner=Dono
repo_name=Nome do repositório repo_name=Nome do repositório
repo_name_helper=Nomes de repositórios bons são pequenos, memorizáveis e únicos. repo_name_helper=Nomes de repositórios bons são pequenos, memorizáveis e únicos.
visibility=Visibilidade visibility=Visibilidade
visiblity_helper="Este é um repositório <span class=\"ui red text\"> privado</span>" visiblity_helper=Este é um repositório <span class="ui red text"> privado</span>
visiblity_helper_forced="O adminstrador forçou todos os novos repositórios para serem <span class=\"ui red text\">privados</span>" visiblity_helper_forced=O adminstrador forçou todos os novos repositórios para serem <span class="ui red text">privados</span>
visiblity_fork_helper=(A alteração desse valor irá afetar todos os forks) visiblity_fork_helper=(A alteração desse valor irá afetar todos os forks)
clone_helper="Precisa de ajuda com o clone? Visite a <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Ajuda</a>!" clone_helper=Precisa de ajuda com o clone? Visite a <a target="_blank" rel="noopener" href="%s">Ajuda</a>!
fork_repo=Fork do repositório fork_repo=Fork do repositório
fork_from=Fork de fork_from=Fork de
fork_visiblity_helper=Não é possível alterar a visibilidade de um repositório fork. fork_visiblity_helper=Não é possível alterar a visibilidade de um repositório fork.
@ -423,7 +423,7 @@ form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome
need_auth=Precisa de autorização need_auth=Precisa de autorização
migrate_type=Tipo de migração migrate_type=Tipo de migração
migrate_type_helper="Este repositório será um <span class=\"text blue\">mirror</span>" migrate_type_helper=Este repositório será um <span class="text blue">mirror</span>
migrate_repo=Migrar repositório migrate_repo=Migrar repositório
migrate.clone_address=Endereço de clone migrate.clone_address=Endereço de clone
migrate.clone_address_desc=Isto pode ser uma URL de HTTP/HTTPS/GIT migrate.clone_address_desc=Isto pode ser uma URL de HTTP/HTTPS/GIT
@ -493,7 +493,7 @@ editor.add=Adicionar '%s'
editor.update=Atualizar '%s' editor.update=Atualizar '%s'
editor.delete=Excluir '%s' editor.delete=Excluir '%s'
editor.commit_message_desc=Adicione uma descrição estendida opcional... editor.commit_message_desc=Adicione uma descrição estendida opcional...
editor.commit_directly_to_this_branch="Efetive diretamente no branch <strong class=\"branch-name\">%s</strong>." editor.commit_directly_to_this_branch=Efetive diretamente no branch <strong class="branch-name">%s</strong>.
editor.create_new_branch=Crie um <strong>novo branch</strong> para este commit e crie um pull request. editor.create_new_branch=Crie um <strong>novo branch</strong> para este commit e crie um pull request.
editor.new_branch_name_desc=Novo nome do ramo... editor.new_branch_name_desc=Novo nome do ramo...
editor.cancel=Cancelar editor.cancel=Cancelar
@ -503,7 +503,7 @@ editor.directory_is_a_file=Entrada '%s' no caminho pai é um arquivo e não uma
editor.file_is_a_symlink=O arquivo '%s' é um link simbólico que não pode ser modificado a partir do editor da web editor.file_is_a_symlink=O arquivo '%s' é um link simbólico que não pode ser modificado a partir do editor da web
editor.filename_is_a_directory=O arquivo '%s' é uma pasta existente neste repositório. editor.filename_is_a_directory=O arquivo '%s' é uma pasta existente neste repositório.
editor.file_editing_no_longer_exists=O arquivo '%s' que você está editando não existe mais neste repositório. editor.file_editing_no_longer_exists=O arquivo '%s' que você está editando não existe mais neste repositório.
editor.file_changed_while_editing="O conteúdo do arquivo mudou desde que você começou a editar. <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Clique aqui</a> para ver o que mudou ou <strong>pressione efetivar novamente</strong> para sobrescrever esses mudanças." editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. <a target="_blank" rel="noopener" href="%s">Clique aqui</a> para ver o que mudou ou <strong>pressione efetivar novamente</strong> para sobrescrever esses mudanças.
editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório. editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório.
editor.no_changes_to_show=Nenhuma alteração a mostrar. editor.no_changes_to_show=Nenhuma alteração a mostrar.
editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v
@ -542,8 +542,8 @@ issues.label_templates.info=Não existem etiquetas ainda. Você pode clicar em "
issues.label_templates.helper=Selecione um conjunto de etiquetas issues.label_templates.helper=Selecione um conjunto de etiquetas
issues.label_templates.use=Usar este conjunto de etiquetas issues.label_templates.use=Usar este conjunto de etiquetas
issues.label_templates.fail_to_load_file=Houve erro ao carregar arquivo de template '%s': %v issues.label_templates.fail_to_load_file=Houve erro ao carregar arquivo de template '%s': %v
issues.add_label_at="`adicionou a etiqueta <div class=\"ui label\" style=\"color: %s" ; background-color: %s">%s</div> label %s` issues.add_label_at=`adicionou a etiqueta <div class="ui label" style="color: %s; background-color: %s">%s</div> label %s`
issues.remove_label_at="`removeu a etiqueta <div class=\"ui label\" style=\"color: %s" ; background-color: %s">%s</div> label %s` issues.remove_label_at=`removeu a etiqueta <div class="ui label" style="color: %s; background-color: %s">%s</div> label %s`
issues.add_milestone_at=`adicionou esta issue para a milestone <b>%s</b> %s` issues.add_milestone_at=`adicionou esta issue para a milestone <b>%s</b> %s`
issues.change_milestone_at=`modificou a milestone de <b>%s</b> para <b>%s</b> %s` issues.change_milestone_at=`modificou a milestone de <b>%s</b> para <b>%s</b> %s`
issues.remove_milestone_at=`removeu esta issue da milestone <b>%s</b> %s` issues.remove_milestone_at=`removeu esta issue da milestone <b>%s</b> %s`
@ -572,7 +572,7 @@ issues.filter_sort.recentupdate=Mais recentemente atualizados
issues.filter_sort.leastupdate=Menos recentemente atualizados issues.filter_sort.leastupdate=Menos recentemente atualizados
issues.filter_sort.mostcomment=Mais comentados issues.filter_sort.mostcomment=Mais comentados
issues.filter_sort.leastcomment=Menos comentados issues.filter_sort.leastcomment=Menos comentados
issues.opened_by="aberto por <a href=\"%[2]s\">%[3]s</a> %[1]s" issues.opened_by=aberto por <a href="%[2]s">%[3]s</a> %[1]s
issues.opened_by_fake=aberto por %[2]s %[1]s issues.opened_by_fake=aberto por %[2]s %[1]s
issues.previous=Anterior issues.previous=Anterior
issues.next=Próximo issues.next=Próximo
@ -593,7 +593,7 @@ issues.commit_ref_at=`citou este problema em um commit %[2]s`
issues.poster=Autor issues.poster=Autor
issues.collaborator=Colaborador issues.collaborator=Colaborador
issues.owner=Proprietário issues.owner=Proprietário
issues.sign_in_require_desc="<a href=\"%s\">Faça login</a> para participar desta conversação." issues.sign_in_require_desc=<a href="%s">Faça login</a> para participar desta conversação.
issues.edit=Editar issues.edit=Editar
issues.cancel=Cancelar issues.cancel=Cancelar
issues.save=Salvar issues.save=Salvar
@ -621,7 +621,7 @@ pulls.compare_compare=comparar
pulls.filter_branch=Filtrar branch pulls.filter_branch=Filtrar branch
pulls.no_results=Nada encontrado. pulls.no_results=Nada encontrado.
pulls.nothing_to_compare=Não há nada para comparar porque o branch base e o head estão iguais. pulls.nothing_to_compare=Não há nada para comparar porque o branch base e o head estão iguais.
pulls.has_pull_request="`Já existem pull requests entre esses dois alvos: <a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]d</a>`" pulls.has_pull_request=`Já existem pull requests entre esses dois alvos: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Criar pull request pulls.create=Criar pull request
pulls.title_desc=quer mesclar %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> pulls.title_desc=quer mesclar %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code>
pulls.merged_title_desc=mesclou %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> %[4]s pulls.merged_title_desc=mesclou %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> %[4]s
@ -637,7 +637,7 @@ pulls.can_auto_merge_desc=O merge deste Pull Pequest pode ser aplicado automatic
pulls.cannot_auto_merge_desc=O merge deste pull request não pode ser aplicado automaticamente pois há conflitos. pulls.cannot_auto_merge_desc=O merge deste pull request não pode ser aplicado automaticamente pois há conflitos.
pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos. pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos.
pulls.merge_pull_request=Solicitação de merge de pull request pulls.merge_pull_request=Solicitação de merge de pull request
pulls.open_unmerged_pull_exists="`Você não pode executar a operação de reabrir porque já existe um Pull request aberto (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.`" pulls.open_unmerged_pull_exists=`Você não pode executar a operação de reabrir porque já existe um Pull request aberto (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.`
milestones.new=Novo milestone milestones.new=Novo milestone
milestones.open_tab=%d abertos milestones.open_tab=%d abertos
@ -756,7 +756,7 @@ settings.search_user_placeholder=Pesquisar usuário...
settings.org_not_allowed_to_be_collaborator=Organização não tem permissão para ser adicionada como um colaborador. settings.org_not_allowed_to_be_collaborator=Organização não tem permissão para ser adicionada como um colaborador.
settings.user_is_org_member=O usuário é um membro da organização que não pode ser adicionado como um colaborador. settings.user_is_org_member=O usuário é um membro da organização que não pode ser adicionado como um colaborador.
settings.add_webhook=Adicionar webhook settings.add_webhook=Adicionar webhook
settings.hooks_desc="Hooks da web ou webhooks permitem serviços externos serem notificados quando certos eventos acontecem no Gitea. Quando acontecem os eventos especificados, enviaremos uma solicitação POST para cada uma das URLs que você fornecer. Saiba mais no nosso <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Guia de webhooks</a>." settings.hooks_desc=Hooks da web ou webhooks permitem serviços externos serem notificados quando certos eventos acontecem no Gitea. Quando acontecem os eventos especificados, enviaremos uma solicitação POST para cada uma das URLs que você fornecer. Saiba mais no nosso <a target="_blank" rel="noopener" href="%s">Guia de webhooks</a>.
settings.webhook_deletion=Excluir webhook settings.webhook_deletion=Excluir webhook
settings.webhook_deletion_desc=Excluir este webhook vai remover sua informação e todo o histórico de entrega. Deseja continuar? settings.webhook_deletion_desc=Excluir este webhook vai remover sua informação e todo o histórico de entrega. Deseja continuar?
settings.webhook_deletion_success=Webhook excluído com sucesso! settings.webhook_deletion_success=Webhook excluído com sucesso!
@ -773,7 +773,7 @@ settings.githook_edit_desc=Se o hook não estiver ativo, o conteúdo de exemplo
settings.githook_name=Nome do Hook settings.githook_name=Nome do Hook
settings.githook_content=Conteúdo do Hook settings.githook_content=Conteúdo do Hook
settings.update_githook=Atualizar Hook settings.update_githook=Atualizar Hook
settings.add_webhook_desc="Enviaremos uma solicitação <code>POST</code> para o URL abaixo com detalhes de quaisquer eventos inscritos. Você pode também especificar qual formato de dados você gostaria de receber (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mais informação pode ser encontrada em <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks Guide</a>." settings.add_webhook_desc=Enviaremos uma solicitação <code>POST</code> para o URL abaixo com detalhes de quaisquer eventos inscritos. Você pode também especificar qual formato de dados você gostaria de receber (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mais informação pode ser encontrada em <a target="_blank" rel="noopener" href="%s">Webhooks Guide</a>.
settings.payload_url=URL de payload settings.payload_url=URL de payload
settings.content_type=Tipo de conteúdo settings.content_type=Tipo de conteúdo
settings.secret=Senha settings.secret=Senha
@ -798,7 +798,7 @@ settings.update_hook_success=Webhook atualizado.
settings.delete_webhook=Excluir webhook settings.delete_webhook=Excluir webhook
settings.recent_deliveries=Entregas Recentes settings.recent_deliveries=Entregas Recentes
settings.hook_type=Tipo de Hook settings.hook_type=Tipo de Hook
settings.add_slack_hook_desc="Adicionar <a href=\"%s\">Slack</a> de integração para o seu repositório." settings.add_slack_hook_desc=Adicionar <a href="%s">Slack</a> de integração para o seu repositório.
settings.slack_token=Token settings.slack_token=Token
settings.slack_domain=Domínio settings.slack_domain=Domínio
settings.slack_channel=Canal settings.slack_channel=Canal
@ -1239,19 +1239,19 @@ notices.op=Op.
notices.delete_success=Avisos do sistema foram excluídos com sucesso. notices.delete_success=Avisos do sistema foram excluídos com sucesso.
[action] [action]
create_repo="criou o repositório <a href=\"%s\"> %s</a>" create_repo=criou o repositório <a href="%s"> %s</a>
rename_repo="renomeou o o repositório <code>%[1]s</code> para <a href=\"%[2]s\">%[3]s</a>" rename_repo=renomeou o o repositório <code>%[1]s</code> para <a href="%[2]s">%[3]s</a>
commit_repo="fez push para <a href=\"%[1]s/src/%[2]s\">%[3]s</a> em <a href=\"%[1]s\">%[4]s</a>" commit_repo=fez push para <a href="%[1]s/src/%[2]s">%[3]s</a> em <a href="%[1]s">%[4]s</a>
create_issue="`abriu issue <a href=\"%s/issues/%s\">%s#%[2]s</a>`" create_issue=`abriu issue <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue="`fechou issue <a href=\"%s/issues/%s\">%s#%[2]s</a>`" close_issue=`fechou issue <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue="`reabriu issue <a href=\"%s/issues/%s\">%s#%[2]s</a>`" reopen_issue=`reabriu issue <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request="`criou o pull request <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" create_pull_request=`criou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request="`fechou o pull request <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" close_pull_request=`fechou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_pull_request="`reabriu o pull request <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" reopen_pull_request=`reabriu o pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue="`comentou sobre a issue <a href=\"%s/issues/%s\">%s#%[2]s</a>`" comment_issue=`comentou sobre a issue <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request="`mesclou o pull request <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" merge_pull_request=`mesclou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo="transferiu repositório de <code>%s</code> para <a href=\"%s\">%s</a>" transfer_repo=transferiu repositório de <code>%s</code> para <a href="%s">%s</a>
push_tag="fez push da tag <a href=\"%s/src/%s\">%[2]s</a> para <a href=\"%[1]s\">%[3]s</a>" push_tag=fez push da tag <a href="%s/src/%s">%[2]s</a> para <a href="%[1]s">%[3]s</a>
compare_commits=Ver comparação entre esses %d commits compare_commits=Ver comparação entre esses %d commits
[tool] [tool]

View File

@ -50,7 +50,7 @@ cancel=Avbryt
[install] [install]
install=Installation install=Installation
title=Steg för att installera för första gången title=Steg för att installera för första gången
docker_helper="Om du kör Gitea inuti Docker, vänligen läs <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Riktninjerna</a> nogrant innan du ändrar någonting på denna sida!" docker_helper=Om du kör Gitea inuti Docker, vänligen läs <a target="_blank" rel="noopener" href="%s">Riktninjerna</a> nogrant innan du ändrar någonting på denna sida!
requite_db_desc=Gitea kräver MySQL, PostgreSQL, SQLite3 eller TiDB. requite_db_desc=Gitea kräver MySQL, PostgreSQL, SQLite3 eller TiDB.
db_title=Databasinställningar db_title=Databasinställningar
db_type=Databastyp db_type=Databastyp
@ -325,7 +325,7 @@ keep_email_private_popup=Om denna inställningar är påslagen kommer din eposta
manage_ssh_keys=Hantera SSH-nycklar manage_ssh_keys=Hantera SSH-nycklar
add_key=Lägg till nyckel add_key=Lägg till nyckel
ssh_desc=Detta är en lista över SSH-nycklar som hör till ditt konto. Ta bort alla nycklar som du inte känner igen. ssh_desc=Detta är en lista över SSH-nycklar som hör till ditt konto. Ta bort alla nycklar som du inte känner igen.
ssh_helper="<strong>Vet du inte hur?</strong> Kolla in Github's guide för att <a href=\"%s\">skapa din egen SSH-nycklar</a> eller lösa <a href=\"%s\">vanliga problem</a> som kan uppstå med SSH." ssh_helper=<strong>Vet du inte hur?</strong> Kolla in Github's guide för att <a href="%s">skapa din egen SSH-nycklar</a> eller lösa <a href="%s">vanliga problem</a> som kan uppstå med SSH.
add_new_key=Lägg till SSH-nyckel add_new_key=Lägg till SSH-nyckel
ssh_key_been_used=Innehåll i publik nyckel har använts. ssh_key_been_used=Innehåll i publik nyckel har använts.
ssh_key_name_used=Offentlig nyckel med samma namn har redan existerat. ssh_key_name_used=Offentlig nyckel med samma namn har redan existerat.
@ -387,10 +387,10 @@ owner=Ägare
repo_name=Utvecklingskatalogens namn repo_name=Utvecklingskatalogens namn
repo_name_helper=Ett bra utvecklingskatalogsnamn består vanligtvis av korta, minnesvärda och unika nyckelord. repo_name_helper=Ett bra utvecklingskatalogsnamn består vanligtvis av korta, minnesvärda och unika nyckelord.
visibility=Synligt för visibility=Synligt för
visiblity_helper="Denna utvecklingskatalog är <span class=\"ui red text\">Privat</span>" visiblity_helper=Denna utvecklingskatalog är <span class="ui red text">Privat</span>
visiblity_helper_forced="Administratören har tvingat alla nya utvecklingskataloger att vara <span class=\"ui red text\">Privata</span>" visiblity_helper_forced=Administratören har tvingat alla nya utvecklingskataloger att vara <span class="ui red text">Privata</span>
visiblity_fork_helper=(Ändring av detta värde kommer att påverka alla forks) visiblity_fork_helper=(Ändring av detta värde kommer att påverka alla forks)
clone_helper="Behöver du hjälp med kloning? Gå till <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Hjälp</a>!" clone_helper=Behöver du hjälp med kloning? Gå till <a target="_blank" rel="noopener" href="%s">Hjälp</a>!
fork_repo=Forka Repo fork_repo=Forka Repo
fork_from=Forka Från fork_from=Forka Från
fork_visiblity_helper=Du kan inte ändra offentligheten på ett forkat repo. fork_visiblity_helper=Du kan inte ändra offentligheten på ett forkat repo.
@ -419,7 +419,7 @@ form.name_pattern_not_allowed=Reponamnet '%s' är inte tillåtet.
need_auth=Tillstånd Krävs need_auth=Tillstånd Krävs
migrate_type=Migreringstyp migrate_type=Migreringstyp
migrate_type_helper="Detta repo kommer att vara en <span class=\"text blue\">spegling</span>" migrate_type_helper=Detta repo kommer att vara en <span class="text blue">spegling</span>
migrate_repo=Migrera Repot migrate_repo=Migrera Repot
migrate.clone_address=Kloningsaddress migrate.clone_address=Kloningsaddress
migrate.clone_address_desc=Detta kan vara en HTTP/HTTPS/GIT-URL eller en lokal sökväg på servern. migrate.clone_address_desc=Detta kan vara en HTTP/HTTPS/GIT-URL eller en lokal sökväg på servern.
@ -488,7 +488,7 @@ editor.add=Lägg till '%s'
editor.update=Uppdatera '%s' editor.update=Uppdatera '%s'
editor.delete=Tag bort '%s' editor.delete=Tag bort '%s'
editor.commit_message_desc=Lägg till en valfri utökad beskrivning... editor.commit_message_desc=Lägg till en valfri utökad beskrivning...
editor.commit_directly_to_this_branch="Checka in direkt till grenen <strong class=\"branch-name\">%s</strong>." editor.commit_directly_to_this_branch=Checka in direkt till grenen <strong class="branch-name">%s</strong>.
editor.create_new_branch=Skapa en <strong>ny gren</strong> för denna incheckning och påbörja en hämtningsbegäran. editor.create_new_branch=Skapa en <strong>ny gren</strong> för denna incheckning och påbörja en hämtningsbegäran.
editor.new_branch_name_desc=Nytt grennamn... editor.new_branch_name_desc=Nytt grennamn...
editor.cancel=Avbryt editor.cancel=Avbryt
@ -498,7 +498,7 @@ editor.directory_is_a_file=Komponenten '%s' i föräldrasökvägen är en fil, i
editor.file_is_a_symlink=Filen '%s' är en symbolisk länk som inte kan editeras i webbläsaren editor.file_is_a_symlink=Filen '%s' är en symbolisk länk som inte kan editeras i webbläsaren
editor.filename_is_a_directory=Filnmanet '%s' är en existerande katalog i detta förråd. editor.filename_is_a_directory=Filnmanet '%s' är en existerande katalog i detta förråd.
editor.file_editing_no_longer_exists=Filen '%s' som du redigerar finns inte lägre i förrådet. editor.file_editing_no_longer_exists=Filen '%s' som du redigerar finns inte lägre i förrådet.
editor.file_changed_while_editing="Filinnhållet har ändrats sedan du började redigera. <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Klicka här</a> för att se vad som ändrats eller <strong>tryck checka in igen</strong> för att skriva över dessa ändringar." editor.file_changed_while_editing=Filinnhållet har ändrats sedan du började redigera. <a target="_blank" rel="noopener" href="%s">Klicka här</a> för att se vad som ändrats eller <strong>tryck checka in igen</strong> för att skriva över dessa ändringar.
editor.file_already_exists=En fil med namnet '%s' finns redan i förrådet. editor.file_already_exists=En fil med namnet '%s' finns redan i förrådet.
editor.no_changes_to_show=Det finns inga ändringar att visa. editor.no_changes_to_show=Det finns inga ändringar att visa.
editor.fail_to_update_file=Uppdateringen/skapandet av filen '%s' misslyckades med felet: %v editor.fail_to_update_file=Uppdateringen/skapandet av filen '%s' misslyckades med felet: %v
@ -557,14 +557,14 @@ issues.filter_sort.recentupdate=Nyligen uppdaterade
issues.filter_sort.leastupdate=Äldst uppdaterad issues.filter_sort.leastupdate=Äldst uppdaterad
issues.filter_sort.mostcomment=Mest kommenterade issues.filter_sort.mostcomment=Mest kommenterade
issues.filter_sort.leastcomment=Minst kommenterade issues.filter_sort.leastcomment=Minst kommenterade
issues.opened_by="öppnade %[1]s av <a href=\"%[2]s\">%[3]s</a>" issues.opened_by=öppnade %[1]s av <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=öppnade %[1]s av %[2]s issues.opened_by_fake=öppnade %[1]s av %[2]s
issues.previous=Föregående issues.previous=Föregående
issues.next=Nästa issues.next=Nästa
issues.open_title=Öppen issues.open_title=Öppen
issues.closed_title=Stängd issues.closed_title=Stängd
issues.num_comments=%d kommentarer issues.num_comments=%d kommentarer
issues.commented_at="`kommenterad <a href=\"#%s\">%s</a>`" issues.commented_at=`kommenterad <a href="#%s">%s</a>`
issues.delete_comment_confirm=Är du säker på att du vill ta bort den här kommentaren? issues.delete_comment_confirm=Är du säker på att du vill ta bort den här kommentaren?
issues.no_content=Det finns inget innehåll än. issues.no_content=Det finns inget innehåll än.
issues.close_issue=Stäng issues.close_issue=Stäng
@ -572,13 +572,13 @@ issues.close_comment_issue=Kommentera och stäng
issues.reopen_issue=Återöppna issues.reopen_issue=Återöppna
issues.reopen_comment_issue=Kommentera och återöppna issues.reopen_comment_issue=Kommentera och återöppna
issues.create_comment=Kommentera issues.create_comment=Kommentera
issues.closed_at="`stängde <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.closed_at=`stängde <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at="`återöppnade <a if=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.reopened_at=`återöppnade <a if="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at="`refererade till detta ärende från en incheckning <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a>`" issues.commit_ref_at=`refererade till detta ärende från en incheckning <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.poster=Skapare issues.poster=Skapare
issues.collaborator=Deltagare issues.collaborator=Deltagare
issues.owner=Ägare issues.owner=Ägare
issues.sign_in_require_desc="<a href=\"%s\">Logga in</a> för att delta i denna konversation." issues.sign_in_require_desc=<a href="%s">Logga in</a> för att delta i denna konversation.
issues.edit=Redigera issues.edit=Redigera
issues.cancel=Avbryt issues.cancel=Avbryt
issues.save=Spara issues.save=Spara
@ -606,7 +606,7 @@ pulls.compare_compare=jämför
pulls.filter_branch=Filtrera gren pulls.filter_branch=Filtrera gren
pulls.no_results=Inga resultat hittades. pulls.no_results=Inga resultat hittades.
pulls.nothing_to_compare=Det finns inget att jämföra eftersom bas och huvudgrenar är lika. pulls.nothing_to_compare=Det finns inget att jämföra eftersom bas och huvudgrenar är lika.
pulls.has_pull_request="`Det finns redan en pullförfrågan mellan detta två mål: <a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]s</a>^" pulls.has_pull_request=`Det finns redan en pullförfrågan mellan detta två mål: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]s</a>`
pulls.create=Skapa Pullförfrågan pulls.create=Skapa Pullförfrågan
pulls.title_desc=vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code>%[3]s</code> pulls.title_desc=vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code>%[3]s</code>
pulls.merged_title_desc=sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s pulls.merged_title_desc=sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s
@ -739,7 +739,7 @@ settings.search_user_placeholder=Sök användare...
settings.org_not_allowed_to_be_collaborator=Organisationen kan inte läggas till som en deltagare. settings.org_not_allowed_to_be_collaborator=Organisationen kan inte läggas till som en deltagare.
settings.user_is_org_member=Änvändaren är en organisationsmedlem som inte kan bli tillagd som deltagare. settings.user_is_org_member=Änvändaren är en organisationsmedlem som inte kan bli tillagd som deltagare.
settings.add_webhook=Lägg Till Webbhook settings.add_webhook=Lägg Till Webbhook
settings.hooks_desc="Webbhookar påminner mycket om vanliga HTTP POST-händelseutlösare. När något inträffar i Gitea, kommer vi att meddela måldatorn som du anger. Läs mera i <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webbhook Guide</a>." settings.hooks_desc=Webbhookar påminner mycket om vanliga HTTP POST-händelseutlösare. När något inträffar i Gitea, kommer vi att meddela måldatorn som du anger. Läs mera i <a target="_blank" rel="noopener" href="%s">Webbhook Guide</a>.
settings.webhook_deletion=Ta Bort Webbhook settings.webhook_deletion=Ta Bort Webbhook
settings.webhook_deletion_desc=Borttagning av denna webbhook kommer att ta bort all dess information och all leveranshistorik. Är du säker på att du vill fortsätta? settings.webhook_deletion_desc=Borttagning av denna webbhook kommer att ta bort all dess information och all leveranshistorik. Är du säker på att du vill fortsätta?
settings.webhook_deletion_success=Webbhook har tagits bort! settings.webhook_deletion_success=Webbhook har tagits bort!
@ -756,7 +756,7 @@ settings.githook_edit_desc=Om kroken är inaktiv visas exempelinnehåll. Inaktiv
settings.githook_name=Kroknamn settings.githook_name=Kroknamn
settings.githook_content=Krokinnehåll settings.githook_content=Krokinnehåll
settings.update_githook=Uppdatera krok settings.update_githook=Uppdatera krok
settings.add_webhook_desc="Gitea kommer skicka <code>POST</code>-anrop till webbadressen du anger, tillsammans med information om händelsen som inträffade. Du kan också ange vilken sorts dataformat du vill få när kroken triggas (JSON, x-www-form-urlencoded, XML et.c.). Mer information finns i vår <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks Guide</a>." settings.add_webhook_desc=Gitea kommer skicka <code>POST</code>-anrop till webbadressen du anger, tillsammans med information om händelsen som inträffade. Du kan också ange vilken sorts dataformat du vill få när kroken triggas (JSON, x-www-form-urlencoded, XML et.c.). Mer information finns i vår <a target="_blank" rel="noopener" href="%s">Webhooks Guide</a>.
settings.payload_url=Adress till innehåll settings.payload_url=Adress till innehåll
settings.content_type=Typ av innehåll settings.content_type=Typ av innehåll
settings.secret=Hemlighet settings.secret=Hemlighet
@ -781,7 +781,7 @@ settings.update_hook_success=Webbkrok har uppdaterats.
settings.delete_webhook=Tag bort webbkrok settings.delete_webhook=Tag bort webbkrok
settings.recent_deliveries=Färska leveranser settings.recent_deliveries=Färska leveranser
settings.hook_type=Kroktyp settings.hook_type=Kroktyp
settings.add_slack_hook_desc="Lägg till <a href=\"%s\">Slack</a>-integration till ditt förråd." settings.add_slack_hook_desc=Lägg till <a href="%s">Slack</a>-integration till ditt förråd.
settings.slack_token=Pollett settings.slack_token=Pollett
settings.slack_domain=Domän settings.slack_domain=Domän
settings.slack_channel=Kanal settings.slack_channel=Kanal
@ -1190,9 +1190,9 @@ notices.desc=Beskrivning
notices.delete_success=Systemnotiser har tagits bort. notices.delete_success=Systemnotiser har tagits bort.
[action] [action]
create_repo="skapade utvecklingskatalog <a href=\"%s\"> %s</a>" create_repo=skapade utvecklingskatalog <a href="%s"> %s</a>
rename_repo="döpte om utvecklingskalatogen från <code>%[1]s</code> till <a href=\"%[2]s\">%[3]s</a>" rename_repo=döpte om utvecklingskalatogen från <code>%[1]s</code> till <a href="%[2]s">%[3]s</a>
transfer_repo="överförde utvecklingskalatogen <code>%s</code> till <a href=\"%s\">%s</a>" transfer_repo=överförde utvecklingskalatogen <code>%s</code> till <a href="%s">%s</a>
compare_commits=Jämför dessa %d incheckningar compare_commits=Jämför dessa %d incheckningar
[tool] [tool]

View File

@ -52,7 +52,7 @@ cancel=取消
[install] [install]
install=安装页面 install=安装页面
title=首次运行安装程序 title=首次运行安装程序
docker_helper="如果您正在使用 Docker 容器运行 Gitea请务必先仔细阅读 <a target=\"_blank\" rel=\"noopener\" href=\"%s\">官方文档</a> 后再对本页面进行填写。" docker_helper=如果您正在使用 Docker 容器运行 Gitea请务必先仔细阅读 <a target="_blank" rel="noopener" href="%s">官方文档</a> 后再对本页面进行填写。
requite_db_desc=Gitea 要求安装 MySQL、PostgreSQL、SQLite3 或 TiDB。 requite_db_desc=Gitea 要求安装 MySQL、PostgreSQL、SQLite3 或 TiDB。
db_title=数据库设置 db_title=数据库设置
db_type=数据库类型 db_type=数据库类型
@ -111,7 +111,7 @@ enable_captcha=启用验证码服务
enable_captcha_popup=要求在用户注册时输入预验证码 enable_captcha_popup=要求在用户注册时输入预验证码
require_sign_in_view=启用登录访问限制 require_sign_in_view=启用登录访问限制
require_sign_in_view_popup=只有已登录的用户才能够访问页面,否则将只能看到登录或注册页面。 require_sign_in_view_popup=只有已登录的用户才能够访问页面,否则将只能看到登录或注册页面。
admin_setting_desc="创建管理员帐号并不是必须的,因为 ID=1 的用户将自动获得管理员权限。" admin_setting_desc=创建管理员帐号并不是必须的,因为 ID=1 的用户将自动获得管理员权限。
admin_title=管理员帐号设置 admin_title=管理员帐号设置
admin_name=管理员用户名 admin_name=管理员用户名
admin_password=管理员密码 admin_password=管理员密码
@ -130,7 +130,7 @@ invalid_log_root_path=无效的日志路径:%v
default_keep_email_private=隐藏邮箱地址的默认值 default_keep_email_private=隐藏邮箱地址的默认值
default_keep_email_private_popup=这是用户邮箱地址可见性的默认值当它设置为true所有的新用户的邮箱地址将被隐藏除非用户修改他的配置。 default_keep_email_private_popup=这是用户邮箱地址可见性的默认值当它设置为true所有的新用户的邮箱地址将被隐藏除非用户修改他的配置。
no_reply_address=不可回邮地址 no_reply_address=不可回邮地址
no_reply_address_helper=用来隐藏用户在git日志里的邮箱地址的域名。例如用户张三和域名noreply.example.org'会变成‘zhangsan@noreply.example.org'。 no_reply_address_helper=用来隐藏用户在git日志里的邮箱地址的域名。例如用户 '张三' 和域名 'noreply.example.org' 会变成 'zhangsan@noreply.example.org'。
[home] [home]
uname_holder=用户名或邮箱 uname_holder=用户名或邮箱
@ -328,7 +328,7 @@ keep_email_private_popup=设置该选项会使得其他用户看不到你的邮
manage_ssh_keys=管理 SSH 密钥 manage_ssh_keys=管理 SSH 密钥
add_key=增加密钥 add_key=增加密钥
ssh_desc=以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它! ssh_desc=以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它!
ssh_helper="<strong>需要帮助?</strong> 请查看有关 <a href=\"%s\">如何生成 SSH 密钥</a> 或 <a href=\"%s\">常见 SSH 问题</a> 寻找答案。" ssh_helper=<strong>需要帮助?</strong> 请查看有关 <a href="%s">如何生成 SSH 密钥</a> 或 <a href="%s">常见 SSH 问题</a> 寻找答案。
add_new_key=增加 SSH 密钥 add_new_key=增加 SSH 密钥
ssh_key_been_used=公开密钥已经被使用! ssh_key_been_used=公开密钥已经被使用!
ssh_key_name_used=使用相同名称的公开密钥已经存在! ssh_key_name_used=使用相同名称的公开密钥已经存在!
@ -390,10 +390,10 @@ owner=拥有者
repo_name=仓库名称 repo_name=仓库名称
repo_name_helper=伟大的仓库名称一般都较短、令人深刻并且 <strong>独一无二</strong> 的。 repo_name_helper=伟大的仓库名称一般都较短、令人深刻并且 <strong>独一无二</strong> 的。
visibility=可见性 visibility=可见性
visiblity_helper="该仓库为 <span class=\"ui red text\">私有的</span>" visiblity_helper=该仓库为 <span class="ui red text">私有的</span>
visiblity_helper_forced="网站管理员已强制要求所有新建仓库必须为 <span class=\"ui red text\">私有的</span>" visiblity_helper_forced=网站管理员已强制要求所有新建仓库必须为 <span class="ui red text">私有的</span>
visiblity_fork_helper=(修改该值将会影响到所有派生仓库) visiblity_fork_helper=(修改该值将会影响到所有派生仓库)
clone_helper="不知道如何操作?访问 <a target=\"_blank\" rel=\"noopener\" href=\"%s\">此处</a> 查看帮助!" clone_helper=不知道如何操作?访问 <a target="_blank" rel="noopener" href="%s">此处</a> 查看帮助!
fork_repo=派生仓库 fork_repo=派生仓库
fork_from=派生自 fork_from=派生自
fork_visiblity_helper=派生仓库无法修改可见性 fork_visiblity_helper=派生仓库无法修改可见性
@ -423,7 +423,7 @@ form.name_pattern_not_allowed=仓库名称不允许 '%s' 的格式。
need_auth=需要授权验证 need_auth=需要授权验证
migrate_type=迁移类型 migrate_type=迁移类型
migrate_type_helper="该仓库将是一个 <span class=\"text blue\">镜像</span>" migrate_type_helper=该仓库将是一个 <span class="text blue">镜像</span>
migrate_repo=迁移仓库 migrate_repo=迁移仓库
migrate.clone_address=克隆地址 migrate.clone_address=克隆地址
migrate.clone_address_desc=该地址可以是 HTTP/HTTPS/GIT URL 或本地服务器路径。 migrate.clone_address_desc=该地址可以是 HTTP/HTTPS/GIT URL 或本地服务器路径。
@ -493,7 +493,7 @@ editor.add=添加 '%s'
editor.update=更新 '%s' editor.update=更新 '%s'
editor.delete=删除 '%s' editor.delete=删除 '%s'
editor.commit_message_desc=添加一个可选的扩展描述... editor.commit_message_desc=添加一个可选的扩展描述...
editor.commit_directly_to_this_branch="直接提交至 <strong class=\"branch-name\">%s</strong> 分支。" editor.commit_directly_to_this_branch=直接提交至 <strong class="branch-name">%s</strong> 分支。
editor.create_new_branch=为此提交创建一个 <strong>新的分支</strong> 并发起合并请求。 editor.create_new_branch=为此提交创建一个 <strong>新的分支</strong> 并发起合并请求。
editor.new_branch_name_desc=新的分支名称... editor.new_branch_name_desc=新的分支名称...
editor.cancel=取消 editor.cancel=取消
@ -503,7 +503,7 @@ editor.directory_is_a_file=路径 '%s' 的父路径中包含此仓库已存在
editor.file_is_a_symlink='%s'数据是网页编辑器不能改变的符号链接。 editor.file_is_a_symlink='%s'数据是网页编辑器不能改变的符号链接。
editor.filename_is_a_directory=文件名 '%s' 是此仓库中已存在的目录名。 editor.filename_is_a_directory=文件名 '%s' 是此仓库中已存在的目录名。
editor.file_editing_no_longer_exists=您编辑的文件 '%s' 已经不存在于此仓库中。 editor.file_editing_no_longer_exists=您编辑的文件 '%s' 已经不存在于此仓库中。
editor.file_changed_while_editing="文件内容在您进行编辑时已经发生变动。<a target=\"_blank\" rel=\"noopener\" href=\"%s\">单击此处</a> 查看变动的具体内容,或者 <strong>再次提交</strong> 覆盖已发生的变动。" editor.file_changed_while_editing=文件内容在您进行编辑时已经发生变动。<a target="_blank" rel="noopener" href="%s">单击此处</a> 查看变动的具体内容,或者 <strong>再次提交</strong> 覆盖已发生的变动。
editor.file_already_exists=此仓库已经存在名为 '%s' 的文件。 editor.file_already_exists=此仓库已经存在名为 '%s' 的文件。
editor.no_changes_to_show=没有可以显示的变更。 editor.no_changes_to_show=没有可以显示的变更。
editor.fail_to_update_file=更新/创建文件 '%s' 时发生错误:%v editor.fail_to_update_file=更新/创建文件 '%s' 时发生错误:%v
@ -542,8 +542,8 @@ issues.label_templates.info=此仓库还未创建任何标签,您可以通过
issues.label_templates.helper=选择标签模板 issues.label_templates.helper=选择标签模板
issues.label_templates.use=加载标签模板 issues.label_templates.use=加载标签模板
issues.label_templates.fail_to_load_file=加载标签模板文件 '%s' 时发生错误:%v issues.label_templates.fail_to_load_file=加载标签模板文件 '%s' 时发生错误:%v
issues.add_label_at="` %[4]s 添加了标签 <div class=\"ui label\" style=\"color: %[1]s" ; background-color: %s">%s</div> label %s` issues.add_label_at=` %[4]s 添加了标签 <div class="ui label" style="color: %[1]s ; background-color: %s">%s</div> label %s`
issues.remove_label_at="` %[4]s 删除了标签 <div class=\"ui label\" style=\"color: %[1]s" ; background-color: %s">%s</div> label %s` issues.remove_label_at=` %[4]s 删除了标签 <div class="ui label" style="color: %[1]s ; background-color: %s">%s</div> label %s`
issues.add_milestone_at=` %[2]s 添加了里程碑 <b>%[1]s</b>` issues.add_milestone_at=` %[2]s 添加了里程碑 <b>%[1]s</b>`
issues.change_milestone_at=`%[3]s 修改了里程碑从 <b>%[1]s</b> 到 <b>%[2]s</b>` issues.change_milestone_at=`%[3]s 修改了里程碑从 <b>%[1]s</b> 到 <b>%[2]s</b>`
issues.remove_milestone_at=`%[2]s 删除了里程碑 <b>%[1]s</b>` issues.remove_milestone_at=`%[2]s 删除了里程碑 <b>%[1]s</b>`
@ -572,14 +572,14 @@ issues.filter_sort.recentupdate=最近更新
issues.filter_sort.leastupdate=最少更新 issues.filter_sort.leastupdate=最少更新
issues.filter_sort.mostcomment=最多评论 issues.filter_sort.mostcomment=最多评论
issues.filter_sort.leastcomment=最少评论 issues.filter_sort.leastcomment=最少评论
issues.opened_by="由 <a href=\"%[2]s\">%[3]s</a> 于 %[1]s创建" issues.opened_by=由 <a href="%[2]s">%[3]s</a> 于 %[1]s创建
issues.opened_by_fake=由 %[2]s 于 %[1]s创建 issues.opened_by_fake=由 %[2]s 于 %[1]s创建
issues.previous=上一页 issues.previous=上一页
issues.next=下一页 issues.next=下一页
issues.open_title=开启中 issues.open_title=开启中
issues.closed_title=已关闭 issues.closed_title=已关闭
issues.num_comments=%d 条评论 issues.num_comments=%d 条评论
issues.commented_at="`评论于 <a href=\"#%s\">%s</a>`" issues.commented_at=`评论于 <a href="#%s">%s</a>`
issues.delete_comment_confirm=您确定要删除该条评论吗? issues.delete_comment_confirm=您确定要删除该条评论吗?
issues.no_content=这个人很懒,什么都没留下。 issues.no_content=这个人很懒,什么都没留下。
issues.close_issue=关闭 issues.close_issue=关闭
@ -587,13 +587,13 @@ issues.close_comment_issue=评论并关闭
issues.reopen_issue=重新开启 issues.reopen_issue=重新开启
issues.reopen_comment_issue=评论并重新开启 issues.reopen_comment_issue=评论并重新开启
issues.create_comment=评论 issues.create_comment=评论
issues.closed_at="`于 <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> 关闭`" issues.closed_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 关闭`
issues.reopened_at="`于 <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> 重新开启`" issues.reopened_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 重新开启`
issues.commit_ref_at="`在代码提交 <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> 中引用了该工单`" issues.commit_ref_at=`在代码提交 <a id="%[1]s" href="#%[1]s">%[2]s</a> 中引用了该工单`
issues.poster=发布者 issues.poster=发布者
issues.collaborator=协作者 issues.collaborator=协作者
issues.owner=所有者 issues.owner=所有者
issues.sign_in_require_desc="<a href=\"%s\">登陆</a> 并参与到对话中。" issues.sign_in_require_desc=<a href="%s">登陆</a> 并参与到对话中。
issues.edit=编辑 issues.edit=编辑
issues.cancel=取消 issues.cancel=取消
issues.save=保存 issues.save=保存
@ -621,7 +621,7 @@ pulls.compare_compare=对比分支
pulls.filter_branch=过滤分支 pulls.filter_branch=过滤分支
pulls.no_results=未找到结果 pulls.no_results=未找到结果
pulls.nothing_to_compare=基准和对比分支代码已经同步,无需进行对比。 pulls.nothing_to_compare=基准和对比分支代码已经同步,无需进行对比。
pulls.has_pull_request="`已经存在目标分支的合并请求:<a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]d</a>`" pulls.has_pull_request=`已经存在目标分支的合并请求:<a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=创建合并请求 pulls.create=创建合并请求
pulls.title_desc=请求将 %[1]d 次代码提交从 <code>%[2]s</code> 合并至 <code>%[3]s</code> pulls.title_desc=请求将 %[1]d 次代码提交从 <code>%[2]s</code> 合并至 <code>%[3]s</code>
pulls.merged_title_desc=于 %[4]s 将 %[1]d 次代码提交从 <code>%[2]s</code>合并至 <code>%[3]s</code> pulls.merged_title_desc=于 %[4]s 将 %[1]d 次代码提交从 <code>%[2]s</code>合并至 <code>%[3]s</code>
@ -637,7 +637,7 @@ pulls.can_auto_merge_desc=该合并请求可以进行自动合并操作。
pulls.cannot_auto_merge_desc=该合并请求存在冲突,无法进行自动合并操作。 pulls.cannot_auto_merge_desc=该合并请求存在冲突,无法进行自动合并操作。
pulls.cannot_auto_merge_helper=请手动拉取代码变更以解决冲突。 pulls.cannot_auto_merge_helper=请手动拉取代码变更以解决冲突。
pulls.merge_pull_request=合并请求 pulls.merge_pull_request=合并请求
pulls.open_unmerged_pull_exists="`由于已经存在来自相同仓库和合并信息的未合并请求(#%d您无法执行重新开启操作。`" pulls.open_unmerged_pull_exists=`由于已经存在来自相同仓库和合并信息的未合并请求(#%d您无法执行重新开启操作。`
milestones.new=新的里程碑 milestones.new=新的里程碑
milestones.open_tab=%d 开启中 milestones.open_tab=%d 开启中
@ -756,7 +756,7 @@ settings.search_user_placeholder=搜索用户...
settings.org_not_allowed_to_be_collaborator=组织不允许被添加为仓库协作者! settings.org_not_allowed_to_be_collaborator=组织不允许被添加为仓库协作者!
settings.user_is_org_member=被操作的用户是组织成员,因此无法添加为协作者! settings.user_is_org_member=被操作的用户是组织成员,因此无法添加为协作者!
settings.add_webhook=添加 Web 钩子 settings.add_webhook=添加 Web 钩子
settings.hooks_desc="Web 钩子允许您设定在 Gitea 上发生指定事件时对指定 URL 发送 POST 通知。查看 <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks 文档</a> 获取更多信息。" settings.hooks_desc=Web 钩子允许您设定在 Gitea 上发生指定事件时对指定 URL 发送 POST 通知。查看 <a target="_blank" rel="noopener" href="%s">Webhooks 文档</a> 获取更多信息。
settings.webhook_deletion=删除 Web 钩子 settings.webhook_deletion=删除 Web 钩子
settings.webhook_deletion_desc=删除该 Web 钩子将会删除与其有关的信息和推送历史。是否继续? settings.webhook_deletion_desc=删除该 Web 钩子将会删除与其有关的信息和推送历史。是否继续?
settings.webhook_deletion_success=Web 钩子删除成功! settings.webhook_deletion_success=Web 钩子删除成功!
@ -773,7 +773,7 @@ settings.githook_edit_desc=如果钩子未启动,则会显示样例文件中
settings.githook_name=钩子名称 settings.githook_name=钩子名称
settings.githook_content=钩子文本 settings.githook_content=钩子文本
settings.update_githook=更新钩子设置 settings.update_githook=更新钩子设置
settings.add_webhook_desc="我们会通过 <code>POST</code> 请求将订阅事件信息发送至向指定 URL 地址。您可以设置不同的数据接收方式JSON 或 <code>x-www-form-urlencoded</code>)。 请查阅 <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks 文档</a> 获取更多信息。" settings.add_webhook_desc=我们会通过 <code>POST</code> 请求将订阅事件信息发送至向指定 URL 地址。您可以设置不同的数据接收方式JSON 或 <code>x-www-form-urlencoded</code>)。 请查阅 <a target="_blank" rel="noopener" href="%s">Webhooks 文档</a> 获取更多信息。
settings.payload_url=推送地址 settings.payload_url=推送地址
settings.content_type=数据格式 settings.content_type=数据格式
settings.secret=密钥文本 settings.secret=密钥文本
@ -798,7 +798,7 @@ settings.update_hook_success=Web 钩子更新成功!
settings.delete_webhook=删除 Web 钩子 settings.delete_webhook=删除 Web 钩子
settings.recent_deliveries=最近推送记录 settings.recent_deliveries=最近推送记录
settings.hook_type=钩子类型 settings.hook_type=钩子类型
settings.add_slack_hook_desc="为您的仓库增加 <a href=\"%s\">Slack</a> 集成。" settings.add_slack_hook_desc=为您的仓库增加 <a href="%s">Slack</a> 集成。
settings.slack_token=令牌 settings.slack_token=令牌
settings.slack_domain=域名 settings.slack_domain=域名
settings.slack_channel=频道 settings.slack_channel=频道
@ -1239,19 +1239,19 @@ notices.op=操作
notices.delete_success=系统提示删除成功! notices.delete_success=系统提示删除成功!
[action] [action]
create_repo="创建了仓库 <a href=\"%s\">%s</a>" create_repo=`创建了仓库 <a href="%s">%s</a>`
rename_repo="重命名仓库 <code>%[1]s</code> 为 <a href=\"%[2]s\">%[3]s</a>" rename_repo=`重命名仓库 <code>%[1]s</code> 为 <a href="%[2]s">%[3]s</a>`
commit_repo="推送了 <a href=\"%[1]s/src/%[2]s\">%[3]s</a> 分支的代码到 <a href=\"%[1]s\">%[4]s</a>" commit_repo=`推送了 <a href="%[1]s/src/%[2]s">%[3]s</a> 分支的代码到 <a href="%[1]s">%[4]s</a>`
create_issue="`创建了工单 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" create_issue=`创建了工单 <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue="`关闭了工单 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" close_issue=`关闭了工单 <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue="`重新开启了工单 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" reopen_issue=`重新开启了工单 <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request="`创建了合并请求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" create_pull_request=`创建了合并请求 <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request="`关闭了合并请求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" close_pull_request=`关闭了合并请求 <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_pull_request="`重新开启了合并请求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" reopen_pull_request=`重新开启了合并请求 <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue="`评论了工单 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" comment_issue=`评论了工单 <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request="`合并了合并请求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" merge_pull_request=`合并了合并请求 <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo="将仓库 <code>%s</code> 转移至 <a href=\"%s\">%s</a>" transfer_repo=将仓库 <code>%s</code> 转移至 <a href="%s">%s</a>
push_tag="推送了标签 <a href=\"%s/src/%s\">%[2]s</a> 到 <a href=\"%[1]s\">%[3]s</a>" push_tag=推送了标签 <a href="%s/src/%s">%[2]s</a> 到 <a href="%[1]s">%[3]s</a>
compare_commits=对比 %d 次代码提交 compare_commits=对比 %d 次代码提交
[tool] [tool]

View File

@ -449,7 +449,7 @@ editor.filename_help=輸入名稱後按下 / 鍵即可新增資料夾,或將
editor.or= editor.or=
editor.cancel_lower=取消 editor.cancel_lower=取消
editor.commit_changes=提交更改嗎? editor.commit_changes=提交更改嗎?
editor.add_tmpl=新增 %s/<filename>' editor.add_tmpl=新增 '%s/<filename>'
editor.add=新增 '%s' editor.add=新增 '%s'
editor.update=更新 '%s' editor.update=更新 '%s'
editor.delete=刪除 '%s' editor.delete=刪除 '%s'

View File

@ -52,7 +52,7 @@ cancel=取消
[install] [install]
install=安裝頁面 install=安裝頁面
title=首次安裝步驟 title=首次安裝步驟
docker_helper="如果您正在使用 Docker 容器運行 Gitea請務必先仔細閱讀 <a target=\"_blank\" rel=\"noopener\" href=\"%s\">官方文檔</a> 後再對本頁面進行填寫。" docker_helper=如果您正在使用 Docker 容器運行 Gitea請務必先仔細閱讀 <a target="_blank" rel="noopener" href="%s">官方文檔</a> 後再對本頁面進行填寫。
requite_db_desc=Gitea 要求安裝 MySQL、PostgreSQL、SQLite3 或 TiDB。 requite_db_desc=Gitea 要求安裝 MySQL、PostgreSQL、SQLite3 或 TiDB。
db_title=資料庫設定 db_title=資料庫設定
db_type=資料庫類型 db_type=資料庫類型
@ -110,7 +110,7 @@ enable_captcha=啟用驗證碼服務
enable_captcha_popup=要求在用戶註冊時輸入驗證碼 enable_captcha_popup=要求在用戶註冊時輸入驗證碼
require_sign_in_view=啓用登錄訪問限制 require_sign_in_view=啓用登錄訪問限制
require_sign_in_view_popup=只有已登錄的用戶才能夠訪問頁面,否則將只能看到登錄或註冊頁面。 require_sign_in_view_popup=只有已登錄的用戶才能夠訪問頁面,否則將只能看到登錄或註冊頁面。
admin_setting_desc="建立管理員帳號並不是必須的,因為 ID=1 的用戶將自動獲得管理員權限。" admin_setting_desc=建立管理員帳號並不是必須的,因為 ID=1 的用戶將自動獲得管理員權限。
admin_title=管理員帳號設定 admin_title=管理員帳號設定
admin_name=管理員用戶名 admin_name=管理員用戶名
admin_password=管理員密碼 admin_password=管理員密碼
@ -325,7 +325,7 @@ keep_email_private_popup=設定此選項會使得其他用戶看不到您的電
manage_ssh_keys=管理 SSH 金鑰 manage_ssh_keys=管理 SSH 金鑰
add_key=增加金鑰 add_key=增加金鑰
ssh_desc=以下是與您帳戶所關聯的 SSH 金鑰,如果您發現有陌生的金鑰,請立即刪除它! ssh_desc=以下是與您帳戶所關聯的 SSH 金鑰,如果您發現有陌生的金鑰,請立即刪除它!
ssh_helper="<strong>需要幫助嗎?</strong> 請查看有關 <a href=\"%s\"> 如何生成 SSH 金鑰</a> 的指南或 <a href=\"%s\"> SSH 的常見問題</a> 的疑難排解。" ssh_helper=<strong>需要幫助嗎?</strong> 請查看有關 <a href="%s"> 如何生成 SSH 金鑰</a> 的指南或 <a href="%s"> SSH 的常見問題</a> 的疑難排解。
add_new_key=增加 SSH 金鑰 add_new_key=增加 SSH 金鑰
ssh_key_been_used=公共金鑰已經被使用 ssh_key_been_used=公共金鑰已經被使用
ssh_key_name_used=使用相同名稱的公共金鑰已經存在! ssh_key_name_used=使用相同名稱的公共金鑰已經存在!
@ -387,10 +387,10 @@ owner=擁有者
repo_name=儲存庫名稱 repo_name=儲存庫名稱
repo_name_helper=偉大的儲存庫名稱一般都較短、令人深刻並且 <strong>獨一無二</strong> 的。 repo_name_helper=偉大的儲存庫名稱一般都較短、令人深刻並且 <strong>獨一無二</strong> 的。
visibility=可見度 visibility=可見度
visiblity_helper="該儲存庫為 <span class=\"ui red text\">私有的</span>" visiblity_helper=該儲存庫為 <span class="ui red text">私有的</span>
visiblity_helper_forced="網站管理員已強制要求所有新建儲存庫必須為 <span class=\"ui red text\">私有的</span>" visiblity_helper_forced=網站管理員已強制要求所有新建儲存庫必須為 <span class="ui red text">私有的</span>
visiblity_fork_helper=(修改該值將會影響到所有複製儲存庫) visiblity_fork_helper=(修改該值將會影響到所有複製儲存庫)
clone_helper="不知道如何操作?訪問 <a target=\"_blank\" rel=\"noopener\"href=\"%s\"> 帮助説明</a> " clone_helper=不知道如何操作?訪問 <a target="_blank" rel="noopener" href="%s"> 帮助説明</a>
fork_repo=複製儲存庫 fork_repo=複製儲存庫
fork_from=複製自 fork_from=複製自
fork_visiblity_helper=複製儲存庫無法修改可見性。 fork_visiblity_helper=複製儲存庫無法修改可見性。
@ -420,7 +420,7 @@ form.name_pattern_not_allowed=儲存庫名稱不允許 '%s' 的格式。
need_auth=需要授權驗證 need_auth=需要授權驗證
migrate_type=遷移類型 migrate_type=遷移類型
migrate_type_helper="該儲存庫將是一個 <span class=\"text blue\">鏡像</span>" migrate_type_helper=該儲存庫將是一個 <span class="text blue">鏡像</span>
migrate_repo=遷移儲存庫 migrate_repo=遷移儲存庫
migrate.clone_address=複製地址 migrate.clone_address=複製地址
migrate.clone_address_desc=該地址可以是 HTTP/HTTPS/GIT URL 或本地伺服器路徑。 migrate.clone_address_desc=該地址可以是 HTTP/HTTPS/GIT URL 或本地伺服器路徑。
@ -485,12 +485,12 @@ editor.filename_help=輸入名稱後按下 / 鍵即可新增資料夾,或將
editor.or= editor.or=
editor.cancel_lower=取消 editor.cancel_lower=取消
editor.commit_changes=提交更改嗎? editor.commit_changes=提交更改嗎?
editor.add_tmpl=新增 %s/<filename>' editor.add_tmpl=新增 '%s/<filename>'
editor.add=新增 '%s' editor.add=新增 '%s'
editor.update=更新 '%s' editor.update=更新 '%s'
editor.delete=刪除 '%s' editor.delete=刪除 '%s'
editor.commit_message_desc=新增一個可選的擴充描述... editor.commit_message_desc=新增一個可選的擴充描述...
editor.commit_directly_to_this_branch="直接提交到 <strong class=\"branch-name\">%s</strong> 分支。" editor.commit_directly_to_this_branch=直接提交到 <strong class="branch-name">%s</strong> 分支。
editor.create_new_branch=建立 <strong>新的分支</strong> 為此提交和開始合併請求。 editor.create_new_branch=建立 <strong>新的分支</strong> 為此提交和開始合併請求。
editor.new_branch_name_desc=新的分支名稱... editor.new_branch_name_desc=新的分支名稱...
editor.cancel=取消 editor.cancel=取消
@ -499,7 +499,7 @@ editor.branch_already_exists='%s' 已存在於此存儲庫。
editor.directory_is_a_file='%s' 在此儲存庫中的路徑是檔案而不是目錄。 editor.directory_is_a_file='%s' 在此儲存庫中的路徑是檔案而不是目錄。
editor.filename_is_a_directory=檔案名 '%s' 是此資料庫中的現有目錄。 editor.filename_is_a_directory=檔案名 '%s' 是此資料庫中的現有目錄。
editor.file_editing_no_longer_exists=檔 '%s' 您正在編輯不再存在於資料庫。 editor.file_editing_no_longer_exists=檔 '%s' 您正在編輯不再存在於資料庫。
editor.file_changed_while_editing="從您開始編輯已更改檔的內容。<a target=\"_blank\"href=\"%s\"> 按一下此處</a> 以查看什麼發生了更改或 <strong>按提交再</strong> 覆蓋這些更改。" editor.file_changed_while_editing=從您開始編輯已更改檔的內容。<a target="_blank" href="%s"> 按一下此處</a> 以查看什麼發生了更改或 <strong>按提交再</strong> 覆蓋這些更改。
editor.file_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。 editor.file_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。
editor.no_changes_to_show=沒有可以顯示的變更。 editor.no_changes_to_show=沒有可以顯示的變更。
editor.fail_to_update_file=上傳/建立檔案 '%s' 失敗, 錯誤訊息: %v editor.fail_to_update_file=上傳/建立檔案 '%s' 失敗, 錯誤訊息: %v
@ -562,14 +562,14 @@ issues.filter_sort.recentupdate=最近更新
issues.filter_sort.leastupdate=最少更新 issues.filter_sort.leastupdate=最少更新
issues.filter_sort.mostcomment=最多評論 issues.filter_sort.mostcomment=最多評論
issues.filter_sort.leastcomment=最少評論 issues.filter_sort.leastcomment=最少評論
issues.opened_by="由 <a href=\"%[2]s\">%[3]s</a> 於 %[1]s建立" issues.opened_by=由 <a href="%[2]s">%[3]s</a> 於 %[1]s建立
issues.opened_by_fake=由 %[2]s 於 %[1]s建立 issues.opened_by_fake=由 %[2]s 於 %[1]s建立
issues.previous=上一頁 issues.previous=上一頁
issues.next=下一頁 issues.next=下一頁
issues.open_title=開啟中 issues.open_title=開啟中
issues.closed_title=已關閉 issues.closed_title=已關閉
issues.num_comments=%d 條評論 issues.num_comments=%d 條評論
issues.commented_at="` 評論 <a href=\"#%s\"> %s</a>`" issues.commented_at=` 評論 <a href="#%s"> %s</a>`
issues.delete_comment_confirm=您確定要刪除該條評論嗎? issues.delete_comment_confirm=您確定要刪除該條評論嗎?
issues.no_content=尚未有任何內容 issues.no_content=尚未有任何內容
issues.close_issue=關閉 issues.close_issue=關閉
@ -577,13 +577,13 @@ issues.close_comment_issue=關閉及評論
issues.reopen_issue=重新開啟 issues.reopen_issue=重新開啟
issues.reopen_comment_issue=重新開啟及評論 issues.reopen_comment_issue=重新開啟及評論
issues.create_comment=評論 issues.create_comment=評論
issues.closed_at="`於 <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> 關閉`" issues.closed_at=`於 <a id="%[1]s" href="#%[1]s">%[2]s</a> 關閉`
issues.reopened_at="`於 <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> 重新開啟`" issues.reopened_at=`於 <a id="%[1]s" href="#%[1]s">%[2]s</a> 重新開啟`
issues.commit_ref_at="`在代碼提交 <a id=\"%[1]s\" href=\"#%[1]s\">%[2]s</a> 中引用了該問題`" issues.commit_ref_at=`在代碼提交 <a id="%[1]s" href="#%[1]s">%[2]s</a> 中引用了該問題`
issues.poster=發佈者 issues.poster=發佈者
issues.collaborator=協同者 issues.collaborator=協同者
issues.owner=所有者 issues.owner=所有者
issues.sign_in_require_desc="<a href=\"%s\"> 登入</a> 才能加入這對話。" issues.sign_in_require_desc=<a href="%s"> 登入</a> 才能加入這對話。
issues.edit=編輯 issues.edit=編輯
issues.cancel=取消 issues.cancel=取消
issues.save=儲存 issues.save=儲存
@ -611,7 +611,7 @@ pulls.compare_compare=對比文件變化
pulls.filter_branch=過濾分支 pulls.filter_branch=過濾分支
pulls.no_results=未找到結果 pulls.no_results=未找到結果
pulls.nothing_to_compare=基準和對比分支程式碼已經同步,無需進行對比。 pulls.nothing_to_compare=基準和對比分支程式碼已經同步,無需進行對比。
pulls.has_pull_request="`已經存在目標分支的合併請求:<a href=\"%[1]s/pulls/%[3]d\">%[2]s#%[3]d</a>`" pulls.has_pull_request=`已經存在目標分支的合併請求:<a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=建立合併請求 pulls.create=建立合併請求
pulls.title_desc=請求將 %[1]d 次程式碼提交從 <code>%[2]s</code> 合併至 <code>%[3]s</code> pulls.title_desc=請求將 %[1]d 次程式碼提交從 <code>%[2]s</code> 合併至 <code>%[3]s</code>
pulls.merged_title_desc=於 %[4]s 將 %[1]d 次代碼提交從 <code>%[2]s</code>合併至 <code>%[3]s</code> pulls.merged_title_desc=於 %[4]s 將 %[1]d 次代碼提交從 <code>%[2]s</code>合併至 <code>%[3]s</code>
@ -627,7 +627,7 @@ pulls.can_auto_merge_desc=這個拉請求可以自動合併。
pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。 pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。 pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
pulls.merge_pull_request=合併請求 pulls.merge_pull_request=合併請求
pulls.open_unmerged_pull_exists="`由於已經存在來自相同儲存庫和合併訊息的未合併請求(#%d您無法執行重新開啟操作。`" pulls.open_unmerged_pull_exists=`由於已經存在來自相同儲存庫和合併訊息的未合併請求(#%d您無法執行重新開啟操作。`
milestones.new=新的里程碑 milestones.new=新的里程碑
milestones.open_tab=%d 開啟中 milestones.open_tab=%d 開啟中
@ -745,7 +745,7 @@ settings.search_user_placeholder=搜尋用戶...
settings.org_not_allowed_to_be_collaborator=組織不允許被加為協同者。 settings.org_not_allowed_to_be_collaborator=組織不允許被加為協同者。
settings.user_is_org_member=被操作的用戶是組織成員,因此無法新增為協作者! settings.user_is_org_member=被操作的用戶是組織成員,因此無法新增為協作者!
settings.add_webhook=建立 Webhook settings.add_webhook=建立 Webhook
settings.hooks_desc="Webhook 允許您設定在 Gitea 上發生指定事件時對指定 URL 發送 POST 通知。查看 <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks 文檔</a> 獲取更多訊息。" settings.hooks_desc=Webhook 允許您設定在 Gitea 上發生指定事件時對指定 URL 發送 POST 通知。查看 <a target="_blank" rel="noopener" href="%s">Webhooks 文檔</a> 獲取更多訊息。
settings.webhook_deletion=刪除 Webhook settings.webhook_deletion=刪除 Webhook
settings.webhook_deletion_desc=刪除該 Webhook 將會刪除與其有關的訊息和推送歷史。是否繼續? settings.webhook_deletion_desc=刪除該 Webhook 將會刪除與其有關的訊息和推送歷史。是否繼續?
settings.webhook_deletion_success=Webhook 刪除成功! settings.webhook_deletion_success=Webhook 刪除成功!
@ -762,7 +762,7 @@ settings.githook_edit_desc=如果 Hook 未啟動,則會顯示樣例文件中
settings.githook_name=Hook 名稱 settings.githook_name=Hook 名稱
settings.githook_content=Hook 內容 settings.githook_content=Hook 內容
settings.update_githook=更新 Hook 設定 settings.update_githook=更新 Hook 設定
settings.add_webhook_desc="我們會通過 <code>POST</code> 請求將訂閱事件訊息發送至向指定 URL 地址。您可以設定不同的資料接收方式JSON 或 <code>x-www-form-urlencoded</code>)。 請查閱 <a target=\"_blank\" rel=\"noopener\" href=\"%s\">Webhooks 指南</a>." settings.add_webhook_desc=我們會通過 <code>POST</code> 請求將訂閱事件訊息發送至向指定 URL 地址。您可以設定不同的資料接收方式JSON 或 <code>x-www-form-urlencoded</code>)。 請查閱 <a target="_blank" rel="noopener" href="%s">Webhooks 指南</a>.
settings.payload_url=推送地址 settings.payload_url=推送地址
settings.content_type=資料格式 settings.content_type=資料格式
settings.secret=金鑰文本 settings.secret=金鑰文本
@ -787,7 +787,7 @@ settings.update_hook_success=Webhook 更新成功!
settings.delete_webhook=刪除 Webhook settings.delete_webhook=刪除 Webhook
settings.recent_deliveries=最近推送記錄 settings.recent_deliveries=最近推送記錄
settings.hook_type=Hook 類型 settings.hook_type=Hook 類型
settings.add_slack_hook_desc="為您的儲存庫增加 <a href=\"%s\">Slack</a> 集成。" settings.add_slack_hook_desc=為您的儲存庫增加 <a href="%s">Slack</a> 集成。
settings.slack_token=令牌 settings.slack_token=令牌
settings.slack_domain=域名 settings.slack_domain=域名
settings.slack_channel=頻道 settings.slack_channel=頻道
@ -1228,19 +1228,19 @@ notices.op=操作
notices.delete_success=系統提示刪除成功! notices.delete_success=系統提示刪除成功!
[action] [action]
create_repo="建立了儲存庫 <a href=\"%s\">%s</a>" create_repo=建立了儲存庫 <a href="%s">%s</a>
rename_repo="重新命名儲存庫 <code>%[1]s</code> 為 <a href=\"%[2]s\">%[3]s</a>" rename_repo=重新命名儲存庫 <code>%[1]s</code> 為 <a href="%[2]s">%[3]s</a>
commit_repo="推送了 <a href=\"%[1]s/src/%[2]s\">%[3]s</a> 分支的代碼到 <a href=\"%[1]s\">%[4]s</a>" commit_repo=推送了 <a href="%[1]s/src/%[2]s">%[3]s</a> 分支的代碼到 <a href="%[1]s">%[4]s</a>
create_issue="`建立了問題 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" create_issue=`建立了問題 <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue="`已關閉問題 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" close_issue=`已關閉問題 <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue="`已重新開啟問題 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" reopen_issue=`已重新開啟問題 <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request="`建立了合併請求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" create_pull_request=`建立了合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request="`已關閉合併請求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" close_pull_request=`已關閉合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_pull_request="`已重新開啟合併請求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" reopen_pull_request=`已重新開啟合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue="`評論了問題 <a href=\"%s/issues/%s\">%s#%[2]s</a>`" comment_issue=`評論了問題 <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request="`合併了合併請求 <a href=\"%s/pulls/%s\">%s#%[2]s</a>`" merge_pull_request=`合併了合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo="將儲存庫 <code>%s</code> 轉移至 <a href=\"%s\">%s</a>" transfer_repo=將儲存庫 <code>%s</code> 轉移至 <a href="%s">%s</a>
push_tag="推送了標籤 <a href=\"%s/src/%s\">%[2]s</a> 到 <a href=\"%[1]s\">%[3]s</a>" push_tag=推送了標籤 <a href="%s/src/%s">%[2]s</a> 到 <a href="%[1]s">%[3]s</a>
compare_commits=查看 %d 次提交的內容比對 compare_commits=查看 %d 次提交的內容比對
[tool] [tool]

View File

@ -949,6 +949,23 @@ footer .ui.language .menu {
#create-page-form form textarea { #create-page-form form textarea {
width: 50%!important; width: 50%!important;
} }
.signin .oauth2 div {
display: inline-block;
}
.signin .oauth2 div p {
margin: 10px 5px 0 0;
float: left;
}
.signin .oauth2 a {
margin-right: 5px;
}
.signin .oauth2 a:last-child {
margin-right: 0px;
}
.signin .oauth2 img {
width: 32px;
height: 32px;
}
.user.activate form, .user.activate form,
.user.forgot.password form, .user.forgot.password form,
.user.reset.password form, .user.reset.password form,
@ -2742,6 +2759,10 @@ footer .ui.language .menu {
.user.notification .octicon.blue { .user.notification .octicon.blue {
color: #2185d0; color: #2185d0;
} }
.user.link-account:not(.icon) {
padding-top: 15px;
padding-bottom: 5px;
}
.dashboard { .dashboard {
padding-top: 15px; padding-top: 15px;
padding-bottom: 80px; padding-bottom: 80px;
@ -2983,24 +3004,3 @@ footer .ui.language .menu {
.ui.user.list .item .description a:hover { .ui.user.list .item .description a:hover {
text-decoration: underline; text-decoration: underline;
} }
.user.link-account:not(.icon) {
padding-top: 15px;
padding-bottom: 5px;
}
.signin .oauth2 div {
display: inline-block;
}
.signin .oauth2 div p {
margin: 10px 5px 0 0;
float: left;
}
.signin .oauth2 a {
margin-right: 5px;
}
.signin .oauth2 a:last-child {
margin-right: 0px;
}
.signin .oauth2 img {
width: 32px;
height: 32px;
}

View File

@ -5,11 +5,13 @@ jQuery.fn.autolink = function() {
.each(function() { .each(function() {
$(this).each(function() { $(this).each(function() {
if (re.test($(this).text())) if (re.test($(this).text()))
$(this).replaceWith( if($(this).parents().filter('code').length === 0) {
$("<span />").html( $(this).replaceWith(
this.nodeValue.replace(re, "<a href='$1'>$1</a>") $("<span />").html(
) this.nodeValue.replace(re, "<a href='$1'>$1</a>")
); )
);
};
}); });
}); });
}; };

View File

@ -46,6 +46,27 @@
} }
} }
.signin {
.oauth2{
div {
display: inline-block;
p {
margin: 10px 5px 0 0;
float: left;
}
}
a {
margin-right: 5px;
&:last-child {
margin-right: 0px;
}
}
img {
width: 32px;
height: 32px;
}
}
}
.user.activate, .user.activate,
.user.forgot.password, .user.forgot.password,
.user.reset.password, .user.reset.password,
@ -85,7 +106,7 @@
.header { .header {
padding-left: 0 !important; padding-left: 0 !important;
text-align: center; text-align: center;
} }
} }
} }

View File

@ -114,4 +114,8 @@
} }
} }
} }
&.link-account:not(.icon) {
padding-top: 15px;
padding-bottom: 5px;
}
} }

View File

@ -341,7 +341,7 @@ func RegisterRoutes(m *macaron.Macaron) {
Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey) Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey)
m.Combo("/:id").Get(repo.GetDeployKey). m.Combo("/:id").Get(repo.GetDeployKey).
Delete(repo.DeleteDeploykey) Delete(repo.DeleteDeploykey)
}) }, reqRepoWriter())
m.Group("/issues", func() { m.Group("/issues", func() {
m.Combo("").Get(repo.ListIssues).Post(bind(api.CreateIssueOption{}), repo.CreateIssue) m.Combo("").Get(repo.ListIssues).Post(bind(api.CreateIssueOption{}), repo.CreateIssue)
m.Group("/comments", func() { m.Group("/comments", func() {

View File

@ -75,7 +75,7 @@ func TestAPI_RenderGFM(t *testing.T) {
<ul> <ul>
<li><a href="` + AppSubURL + `wiki/Links" rel="nofollow">Links, Language bindings, Engine bindings</a></li> <li><a href="` + AppSubURL + `wiki/Links" rel="nofollow">Links, Language bindings, Engine bindings</a></li>
<li><a href="` + AppSubURL + `wiki/Tips" rel="nofollow">Tips</a></li> <li><a href="` + AppSubURL + `wiki/Tips" rel="nofollow">Tips</a></li>
<li>Bezier widget (by <a href="` + AppURL + `r-lyeh" rel="nofollow">@r-lyeh</a>)<a href="https://github.com/ocornut/imgui/issues/786" rel="nofollow">#786</a></li> <li>Bezier widget (by <a href="` + AppURL + `r-lyeh" rel="nofollow">@r-lyeh</a>) https://github.com/ocornut/imgui/issues/786</li>
</ul> </ul>
`, `,
// wine-staging wiki home extract: special wiki syntax, images // wine-staging wiki home extract: special wiki syntax, images

View File

@ -49,7 +49,8 @@ func GlobalInit() {
if setting.InstallLock { if setting.InstallLock {
highlight.NewContext() highlight.NewContext()
markdown.BuildSanitizer() markdown.InitMarkdown()
markdown.NewSanitizer()
if err := models.NewEngine(); err != nil { if err := models.NewEngine(); err != nil {
log.Fatal(4, "Failed to initialize ORM engine: %v", err) log.Fatal(4, "Failed to initialize ORM engine: %v", err)
} }

View File

@ -596,6 +596,16 @@ func ViewIssue(ctx *context.Context) {
ctx.Handle(500, "LoadMilestone", err) ctx.Handle(500, "LoadMilestone", err)
return return
} }
ghostMilestone := &models.Milestone{
ID: -1,
Name: ctx.Tr("repo.issues.deleted_milestone"),
}
if comment.OldMilestoneID > 0 && comment.OldMilestone == nil {
comment.OldMilestone = ghostMilestone
}
if comment.MilestoneID > 0 && comment.Milestone == nil {
comment.Milestone = ghostMilestone
}
} else if comment.Type == models.CommentTypeAssignees { } else if comment.Type == models.CommentTypeAssignees {
if err = comment.LoadAssignees(); err != nil { if err = comment.LoadAssignees(); err != nil {
ctx.Handle(500, "LoadAssignees", err) ctx.Handle(500, "LoadAssignees", err)

View File

@ -72,6 +72,7 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
err := models.NewRepoRedirect(ctx.Repo.Owner.ID, repo.ID, repo.Name, newRepoName) err := models.NewRepoRedirect(ctx.Repo.Owner.ID, repo.ID, repo.Name, newRepoName)
if err != nil { if err != nil {
ctx.Handle(500, "NewRepoRedirect", err) ctx.Handle(500, "NewRepoRedirect", err)
return
} }
log.Trace("Repository name changed: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newRepoName) log.Trace("Repository name changed: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newRepoName)
@ -151,6 +152,12 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
if form.EnableWiki { if form.EnableWiki {
if form.EnableExternalWiki { if form.EnableExternalWiki {
if !strings.HasPrefix(form.ExternalWikiURL, "http://") && !strings.HasPrefix(form.ExternalWikiURL, "https://") {
ctx.Flash.Error(ctx.Tr("repo.settings.external_wiki_url_error"))
ctx.Redirect(repo.Link() + "/settings")
return
}
units = append(units, models.RepoUnit{ units = append(units, models.RepoUnit{
RepoID: repo.ID, RepoID: repo.ID,
Type: models.UnitTypeExternalWiki, Type: models.UnitTypeExternalWiki,
@ -171,10 +178,15 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
if form.EnableIssues { if form.EnableIssues {
if form.EnableExternalTracker { if form.EnableExternalTracker {
if !strings.HasPrefix(form.ExternalTrackerURL, "http://") && !strings.HasPrefix(form.ExternalTrackerURL, "https://") {
ctx.Flash.Error(ctx.Tr("repo.settings.external_tracker_url_error"))
ctx.Redirect(repo.Link() + "/settings")
return
}
units = append(units, models.RepoUnit{ units = append(units, models.RepoUnit{
RepoID: repo.ID, RepoID: repo.ID,
Type: models.UnitTypeExternalWiki, Type: models.UnitTypeExternalTracker,
Index: int(models.UnitTypeExternalWiki), Index: int(models.UnitTypeExternalTracker),
Config: &models.ExternalTrackerConfig{ Config: &models.ExternalTrackerConfig{
ExternalTrackerURL: form.ExternalTrackerURL, ExternalTrackerURL: form.ExternalTrackerURL,
ExternalTrackerFormat: form.TrackerURLFormat, ExternalTrackerFormat: form.TrackerURLFormat,

View File

@ -177,6 +177,10 @@ func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, err
// ctx.Handle(500, "OpenRepository", err) // ctx.Handle(500, "OpenRepository", err)
return nil, nil, err return nil, nil, err
} }
if !wikiRepo.IsBranchExist("master") {
return wikiRepo, nil, nil
}
commit, err := wikiRepo.GetBranchCommit("master") commit, err := wikiRepo.GetBranchCommit("master")
if err != nil { if err != nil {
ctx.Handle(500, "GetBranchCommit", err) ctx.Handle(500, "GetBranchCommit", err)
@ -190,6 +194,9 @@ func renderWikiPage(ctx *context.Context, isViewPage bool) (*git.Repository, *gi
if err != nil { if err != nil {
return nil, nil return nil, nil
} }
if commit == nil {
return wikiRepo, nil
}
// Get page list. // Get page list.
if isViewPage { if isViewPage {
@ -210,7 +217,7 @@ func renderWikiPage(ctx *context.Context, isViewPage bool) (*git.Repository, *gi
} }
pages = append(pages, PageMeta{ pages = append(pages, PageMeta{
Name: models.ToWikiPageName(name), Name: models.ToWikiPageName(name),
URL: models.ToWikiPageURL(name), URL: name,
}) })
} }
} }
@ -308,6 +315,11 @@ func Wiki(ctx *context.Context) {
if ctx.Written() { if ctx.Written() {
return return
} }
if entry == nil {
ctx.Data["Title"] = ctx.Tr("repo.wiki")
ctx.HTML(200, tplWikiStart)
return
}
ename := entry.Name() ename := entry.Name()
if !markdown.IsMarkdownFile(ename) { if !markdown.IsMarkdownFile(ename) {
@ -362,7 +374,7 @@ func WikiPages(ctx *context.Context) {
} }
pages = append(pages, PageMeta{ pages = append(pages, PageMeta{
Name: models.ToWikiPageName(name), Name: models.ToWikiPageName(name),
URL: models.ToWikiPageURL(name), URL: name,
Updated: c.Author.When, Updated: c.Author.When,
}) })
} }
@ -480,7 +492,7 @@ func EditWikiPost(ctx *context.Context, form auth.NewWikiForm) {
return return
} }
oldWikiPath := ctx.Params(":page") oldWikiPath := models.ToWikiPageURL(ctx.Params(":page"))
newWikiPath := models.ToWikiPageURL(form.Title) newWikiPath := models.ToWikiPageURL(form.Title)
if err := ctx.Repo.Repository.EditWikiPage(ctx.User, oldWikiPath, newWikiPath, form.Content, form.Message); err != nil { if err := ctx.Repo.Repository.EditWikiPage(ctx.User, oldWikiPath, newWikiPath, form.Content, form.Message); err != nil {
@ -493,7 +505,7 @@ func EditWikiPost(ctx *context.Context, form auth.NewWikiForm) {
// DeleteWikiPagePost delete wiki page // DeleteWikiPagePost delete wiki page
func DeleteWikiPagePost(ctx *context.Context) { func DeleteWikiPagePost(ctx *context.Context) {
pageURL := ctx.Params(":page") pageURL := models.ToWikiPageURL(ctx.Params(":page"))
if len(pageURL) == 0 { if len(pageURL) == 0 {
pageURL = "Home" pageURL = "Home"
} }

View File

@ -78,7 +78,7 @@
{{end}} {{end}}
</h4> </h4>
<div class="ui attached table segment"> <div class="ui attached table segment">
{{if not $file.IsRenamed}} {{if ne $file.Type 4}}
{{$isImage := (call $.IsImageFile $file.Name)}} {{$isImage := (call $.IsImageFile $file.Name)}}
{{if and $isImage}} {{if and $isImage}}
<div class="center"> <div class="center">