mirror of
https://github.com/gogs/gogs.git
synced 2026-02-28 17:20:59 +01:00
Compare commits
648 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8e8d535e23 | ||
|
|
cbb78b6a63 | ||
|
|
9a4132cb09 | ||
|
|
d496d0cc4d | ||
|
|
1490e862cc | ||
|
|
cc0d963f75 | ||
|
|
03011e31fe | ||
|
|
7241598c19 | ||
|
|
137e4139ed | ||
|
|
c5be40decb | ||
|
|
b92bb77b54 | ||
|
|
e6b3eb115a | ||
|
|
27244174df | ||
|
|
009d692c7d | ||
|
|
bdd92dc7d1 | ||
|
|
4cd892c99f | ||
|
|
c44e1c7ca9 | ||
|
|
eea9302d8f | ||
|
|
b983912fce | ||
|
|
42a2c5ca54 | ||
|
|
3ff708b749 | ||
|
|
4bfc71c73f | ||
|
|
c541938a3d | ||
|
|
eedac73229 | ||
|
|
869113704b | ||
|
|
2cc050e21e | ||
|
|
4917d29c12 | ||
|
|
2bb1fb8f44 | ||
|
|
43bfee0d48 | ||
|
|
fac4e27882 | ||
|
|
72377c721c | ||
|
|
f83519b452 | ||
|
|
ba47306a69 | ||
|
|
678700b74d | ||
|
|
167265d533 | ||
|
|
eda9211fa4 | ||
|
|
7d8121b077 | ||
|
|
589618c8a5 | ||
|
|
53bcf373c1 | ||
|
|
31f6069dbe | ||
|
|
2f38215f5c | ||
|
|
686dd59916 | ||
|
|
6f8e388b55 | ||
|
|
436ef5b50a | ||
|
|
d384ce7dbc | ||
|
|
514ce712b0 | ||
|
|
fa298a2c30 | ||
|
|
2b1442f3df | ||
|
|
2e7b38db9f | ||
|
|
68cacf9c63 | ||
|
|
c0883a51a0 | ||
|
|
b838e94980 | ||
|
|
752b527152 | ||
|
|
1ba837a055 | ||
|
|
54b58e988d | ||
|
|
70d44e9565 | ||
|
|
bab811c530 | ||
|
|
57651060ce | ||
|
|
007a42a8ff | ||
|
|
333ab1b2b4 | ||
|
|
d86c4841fa | ||
|
|
74511b1d54 | ||
|
|
fcd6b45192 | ||
|
|
4ab60bbfba | ||
|
|
c0b56f3057 | ||
|
|
3dcc0a4b5f | ||
|
|
91ab2538c3 | ||
|
|
9cf334fca9 | ||
|
|
e69f09f50e | ||
|
|
6272986192 | ||
|
|
52dd09fb76 | ||
|
|
900796ec52 | ||
|
|
dc4aab9925 | ||
|
|
3426ae42b3 | ||
|
|
ac95f6d50f | ||
|
|
04e596f984 | ||
|
|
86dbda0b42 | ||
|
|
4447a20f87 | ||
|
|
30beb59fd8 | ||
|
|
a6596f2231 | ||
|
|
a5f9077e5a | ||
|
|
548b95f7b5 | ||
|
|
d6cdd49c16 | ||
|
|
42a72b62fc | ||
|
|
03011ed307 | ||
|
|
bebbd08920 | ||
|
|
ff051e2106 | ||
|
|
71b9a87fe1 | ||
|
|
4cbbaefd82 | ||
|
|
ccf17a6ecb | ||
|
|
41ce633920 | ||
|
|
2b1e67e085 | ||
|
|
cbce2ec9cf | ||
|
|
ec774d48c5 | ||
|
|
663c28beb6 | ||
|
|
f62ffeb481 | ||
|
|
92783bf6ef | ||
|
|
09def4a0b5 | ||
|
|
81adbe17ca | ||
|
|
2724dbd450 | ||
|
|
562ad02a6d | ||
|
|
e94ca36335 | ||
|
|
ced212f8fa | ||
|
|
35be8741c4 | ||
|
|
b8e9c60040 | ||
|
|
02bc16d392 | ||
|
|
eb0f0710f0 | ||
|
|
a2a9e151f8 | ||
|
|
b9dc2147b4 | ||
|
|
b60fd3aaad | ||
|
|
3be3b8faa7 | ||
|
|
5cf3732339 | ||
|
|
5dd3dd71a0 | ||
|
|
ffd17924fd | ||
|
|
9af8a6c6a3 | ||
|
|
1269ce0538 | ||
|
|
c6531c4882 | ||
|
|
1564b77cf5 | ||
|
|
1492c905bb | ||
|
|
4fca548ed1 | ||
|
|
c47afdff58 | ||
|
|
c76ee1cf83 | ||
|
|
08f7547acf | ||
|
|
d82d9bc153 | ||
|
|
bfef8f0edd | ||
|
|
73698d292a | ||
|
|
6eecbf17cd | ||
|
|
b36134194c | ||
|
|
27fe9cfcba | ||
|
|
66d7adc3a8 | ||
|
|
5c63e1015d | ||
|
|
f3aab5dbe3 | ||
|
|
c08baee085 | ||
|
|
7a7c096fd0 | ||
|
|
f92bdf875b | ||
|
|
182003aa41 | ||
|
|
5de0b0c5ce | ||
|
|
0647645948 | ||
|
|
e378b3152c | ||
|
|
673a76d638 | ||
|
|
67983e57f2 | ||
|
|
5300a63d0f | ||
|
|
2c4fb6e646 | ||
|
|
8363c9dd0f | ||
|
|
3db0e7553e | ||
|
|
80e640f082 | ||
|
|
51aef347ee | ||
|
|
65a06731db | ||
|
|
6a0fec77ea | ||
|
|
5a4f314cf7 | ||
|
|
e57594dc31 | ||
|
|
f78046fc3b | ||
|
|
3a3e1b90e7 | ||
|
|
b579800e50 | ||
|
|
072c67e457 | ||
|
|
81e6173356 | ||
|
|
423b1c69be | ||
|
|
7b59d40f08 | ||
|
|
1988c0993d | ||
|
|
639e34e362 | ||
|
|
7e5063a93d | ||
|
|
9512eec034 | ||
|
|
f26f8d5afa | ||
|
|
9fb2d49b93 | ||
|
|
e0036ebb0c | ||
|
|
93ff2e31e8 | ||
|
|
698b9e2acc | ||
|
|
d76f11c6f1 | ||
|
|
27dbb60965 | ||
|
|
44ea3d9065 | ||
|
|
99b774e741 | ||
|
|
f2b851388b | ||
|
|
ab730a91f0 | ||
|
|
5a5f072177 | ||
|
|
e1a4f99eaa | ||
|
|
c5c5aac7a5 | ||
|
|
aae74c793a | ||
|
|
5169a0e025 | ||
|
|
ab896ecf25 | ||
|
|
f1ba0c859f | ||
|
|
f7219b0cf0 | ||
|
|
8061447f0e | ||
|
|
5f594d8774 | ||
|
|
211596f407 | ||
|
|
9c67a19332 | ||
|
|
caf7618ea6 | ||
|
|
6f81c05dde | ||
|
|
ab6b288141 | ||
|
|
750d82b8e2 | ||
|
|
27c3c5415f | ||
|
|
484175f702 | ||
|
|
2bb982dada | ||
|
|
ade343f6dc | ||
|
|
5c3cac3bc0 | ||
|
|
529b6f04aa | ||
|
|
a8377d8ded | ||
|
|
d4c04a65c7 | ||
|
|
75cbb32b1e | ||
|
|
20a8d651f3 | ||
|
|
3a977fc0ae | ||
|
|
b6f8b486c7 | ||
|
|
62e436e6b7 | ||
|
|
e312634286 | ||
|
|
7fe68d3db7 | ||
|
|
7cf0564587 | ||
|
|
1cb57b1a44 | ||
|
|
8f0f845b14 | ||
|
|
ea9cf5ec8c | ||
|
|
96a71aaed8 | ||
|
|
e9c599b48a | ||
|
|
e6cf83b8c0 | ||
|
|
deee2d5fa8 | ||
|
|
4aecaf7488 | ||
|
|
82f7a01ded | ||
|
|
49aeb87e44 | ||
|
|
104d914b39 | ||
|
|
8e815abeb0 | ||
|
|
8fa2056e14 | ||
|
|
e7f4d23412 | ||
|
|
466facc009 | ||
|
|
33894591a6 | ||
|
|
35c83f6026 | ||
|
|
fc6db829b2 | ||
|
|
69025f1510 | ||
|
|
d61962a18a | ||
|
|
588f3215c6 | ||
|
|
471b8a18ab | ||
|
|
c226e92284 | ||
|
|
80b23854bc | ||
|
|
86abd34eb8 | ||
|
|
7dbb98b2a3 | ||
|
|
25dd6f8fa0 | ||
|
|
37ab32b613 | ||
|
|
fd07de5751 | ||
|
|
27491031ba | ||
|
|
8238c28c31 | ||
|
|
08cd20bad9 | ||
|
|
96a95e9dfd | ||
|
|
f745b08163 | ||
|
|
d0e34c57cc | ||
|
|
2bfe2ddb6d | ||
|
|
b72e75e522 | ||
|
|
b668fc7aad | ||
|
|
48bb639371 | ||
|
|
0720d3988f | ||
|
|
7ba9d1171c | ||
|
|
6b70a0c0d9 | ||
|
|
98674b2a21 | ||
|
|
4aafeace23 | ||
|
|
34102f7889 | ||
|
|
da6fd93f0d | ||
|
|
406efbf3f5 | ||
|
|
6abbea4f3d | ||
|
|
5d5d774e03 | ||
|
|
41cc43208e | ||
|
|
127eb439d7 | ||
|
|
4b9fb43a70 | ||
|
|
5e763baa12 | ||
|
|
18c0697329 | ||
|
|
e3d73d9b24 | ||
|
|
6c84223f43 | ||
|
|
b447d18dca | ||
|
|
63a73b43b4 | ||
|
|
3db80f2c55 | ||
|
|
a6a2f59d1d | ||
|
|
d446be9f5f | ||
|
|
8d17ff8ce7 | ||
|
|
b0b11fd7b1 | ||
|
|
f44204e944 | ||
|
|
473e265727 | ||
|
|
3a6ba39a61 | ||
|
|
0d90a16d9f | ||
|
|
fab038b175 | ||
|
|
e3dece1371 | ||
|
|
d5de48df89 | ||
|
|
8896c82d34 | ||
|
|
1f61340fa3 | ||
|
|
f92bfabf86 | ||
|
|
cd8b43d984 | ||
|
|
556881964f | ||
|
|
ee68a826a5 | ||
|
|
e90f014e4a | ||
|
|
125fe92a19 | ||
|
|
10e4b5b6c6 | ||
|
|
7ccab9cd09 | ||
|
|
2369881808 | ||
|
|
04164eada3 | ||
|
|
e97a6ff911 | ||
|
|
7d109573cb | ||
|
|
74a8bb93d8 | ||
|
|
059338139c | ||
|
|
aa670ce660 | ||
|
|
81fcc0db0c | ||
|
|
c753fdceaf | ||
|
|
a6a99d49cf | ||
|
|
9dfa17faf2 | ||
|
|
3fcc39c26b | ||
|
|
1654e9ecab | ||
|
|
bbee7b7196 | ||
|
|
4f567edc6e | ||
|
|
fc4dff1b17 | ||
|
|
065f8d1f56 | ||
|
|
2f1369c614 | ||
|
|
8f1d2d9f24 | ||
|
|
3efe3f42e8 | ||
|
|
5293ae1221 | ||
|
|
d2f439a241 | ||
|
|
77ac1e6ff6 | ||
|
|
c0ad512398 | ||
|
|
563e8b4ea9 | ||
|
|
be19fe48d7 | ||
|
|
b508fb041f | ||
|
|
1628ef4ba5 | ||
|
|
0fa209d07b | ||
|
|
6e341e26b3 | ||
|
|
a307574fbc | ||
|
|
58e28e5d9d | ||
|
|
4e18bbf1cf | ||
|
|
e6fc58a744 | ||
|
|
aa68e86206 | ||
|
|
7759b9ee6e | ||
|
|
b6519f78c7 | ||
|
|
455fad0fbd | ||
|
|
ed89b39984 | ||
|
|
f9454cc32c | ||
|
|
d85366930c | ||
|
|
f625665d8d | ||
|
|
d047811c1a | ||
|
|
685ed1f807 | ||
|
|
8c1986181d | ||
|
|
a38e4a0b02 | ||
|
|
cd6a2b78a7 | ||
|
|
0009a1d2b1 | ||
|
|
def39d191b | ||
|
|
cdd8f7c53a | ||
|
|
ddf7014b9b | ||
|
|
2692d4aa49 | ||
|
|
25f5a8d798 | ||
|
|
3aaf292ba8 | ||
|
|
6b7d35eade | ||
|
|
6d0f3a07d4 | ||
|
|
b99c4baab2 | ||
|
|
7fda0cdb93 | ||
|
|
0b3722c359 | ||
|
|
31eb49c3ae | ||
|
|
67a9416ae5 | ||
|
|
8a6c86644e | ||
|
|
6c1ee384f1 | ||
|
|
0a4cda0dd4 | ||
|
|
2804784df9 | ||
|
|
876a856759 | ||
|
|
7e7160eefd | ||
|
|
c5c467a9cd | ||
|
|
c7a042ef36 | ||
|
|
e805fdb29c | ||
|
|
0af74b36ad | ||
|
|
d02e45f985 | ||
|
|
e5d6f4ce56 | ||
|
|
485ea6f14f | ||
|
|
28580aee63 | ||
|
|
6a23252edc | ||
|
|
e407df54f0 | ||
|
|
bad533a219 | ||
|
|
7d3932b9cd | ||
|
|
b61ef40406 | ||
|
|
767bf82eab | ||
|
|
0d158e569b | ||
|
|
5cd887dba5 | ||
|
|
b7e26aa5e3 | ||
|
|
aa35be975f | ||
|
|
6ed96b7a20 | ||
|
|
3cc04682c5 | ||
|
|
f15fa9167a | ||
|
|
cd0ee35b3f | ||
|
|
3a44143b81 | ||
|
|
9420eecb87 | ||
|
|
17a34949eb | ||
|
|
775bd65234 | ||
|
|
85f384f271 | ||
|
|
00653e52ee | ||
|
|
ba77a3b0b4 | ||
|
|
19525abfc4 | ||
|
|
f989805050 | ||
|
|
fc1befcf3c | ||
|
|
2a2596fe61 | ||
|
|
3f2e99962c | ||
|
|
216683004e | ||
|
|
87b90372a7 | ||
|
|
5a99e9a37b | ||
|
|
afccd0a3ee | ||
|
|
0669897226 | ||
|
|
ddddad9792 | ||
|
|
4e79adf6b5 | ||
|
|
fc6d80d619 | ||
|
|
92036a78d1 | ||
|
|
3c65265871 | ||
|
|
79f3281548 | ||
|
|
16018e8323 | ||
|
|
15d4f32825 | ||
|
|
04adc94b26 | ||
|
|
2f40f614b5 | ||
|
|
23f3f60dcf | ||
|
|
1ab09e4f1b | ||
|
|
03af37554e | ||
|
|
01cef678a3 | ||
|
|
02c5bade0f | ||
|
|
f706102890 | ||
|
|
7140f50637 | ||
|
|
e0329c0eb5 | ||
|
|
4dfffee9fb | ||
|
|
3e307e7862 | ||
|
|
e91b28eb9b | ||
|
|
5d4425bbbc | ||
|
|
fd1df86c44 | ||
|
|
bef38d9d3f | ||
|
|
7f71fe9dae | ||
|
|
5589445557 | ||
|
|
98f7f6bef8 | ||
|
|
43bf94e1aa | ||
|
|
a7662f4a39 | ||
|
|
8e238058b2 | ||
|
|
26bccef297 | ||
|
|
e8b62e8957 | ||
|
|
32fb5ea5d0 | ||
|
|
e43bd15b96 | ||
|
|
4de0b19cec | ||
|
|
902f19f70b | ||
|
|
bfce0def25 | ||
|
|
5c4b85c029 | ||
|
|
57291d1e2a | ||
|
|
956c59b282 | ||
|
|
0a2068d7fb | ||
|
|
cd6376f093 | ||
|
|
d4fc8880eb | ||
|
|
b8425ccbec | ||
|
|
7ec42465a7 | ||
|
|
89ea3e1acc | ||
|
|
facd491a6d | ||
|
|
4c4488213a | ||
|
|
ac29dc93cd | ||
|
|
27bd2157ed | ||
|
|
b293b6eaa6 | ||
|
|
3d9cda2d98 | ||
|
|
faddaff90d | ||
|
|
569fcc30f3 | ||
|
|
32152d2363 | ||
|
|
69d98e9edd | ||
|
|
66a9c0d71d | ||
|
|
7e3d66673d | ||
|
|
fb9dcfa921 | ||
|
|
d8394bb2e0 | ||
|
|
ee6786216a | ||
|
|
37fcc8daf2 | ||
|
|
9803f84c88 | ||
|
|
c0e9481fa6 | ||
|
|
76f8904718 | ||
|
|
c6b87aaf02 | ||
|
|
077d1ae70b | ||
|
|
61608f13a0 | ||
|
|
4ef3245413 | ||
|
|
2a70d6b723 | ||
|
|
bb103e8723 | ||
|
|
161774d4fb | ||
|
|
edbfbfa66e | ||
|
|
830bc75107 | ||
|
|
8e384ce46c | ||
|
|
cf59057ef3 | ||
|
|
0e286a0ca9 | ||
|
|
bd414a2d1f | ||
|
|
be8bdc0393 | ||
|
|
9fa287e4f7 | ||
|
|
210306bd64 | ||
|
|
eae08ea8f4 | ||
|
|
452cca35e0 | ||
|
|
7170011f4d | ||
|
|
f99690a545 | ||
|
|
bdd6aef746 | ||
|
|
e6f97c78ff | ||
|
|
50d91f3b6a | ||
|
|
7d4cef6008 | ||
|
|
d0827e5d5e | ||
|
|
bb26285a12 | ||
|
|
9e61ec316e | ||
|
|
13e35398aa | ||
|
|
9f4e584122 | ||
|
|
04d698bfbc | ||
|
|
c7cbdd34fb | ||
|
|
d5c6b53571 | ||
|
|
f0ca16d78f | ||
|
|
6251626de4 | ||
|
|
9b0858b1ad | ||
|
|
c73e9057ae | ||
|
|
fd70f9ec1b | ||
|
|
d016eaaa09 | ||
|
|
44fa9147b7 | ||
|
|
0b56272c13 | ||
|
|
677b1ec627 | ||
|
|
3ea1443885 | ||
|
|
6643647687 | ||
|
|
b6272d1803 | ||
|
|
40de2f78c4 | ||
|
|
aa2148a7a9 | ||
|
|
bd555551ce | ||
|
|
e1c5008238 | ||
|
|
0f1ff9b1ad | ||
|
|
52cc58fd9d | ||
|
|
477bea574a | ||
|
|
37566f71a9 | ||
|
|
afdb0c7f9d | ||
|
|
63c1f9a23f | ||
|
|
e948c7c262 | ||
|
|
81a44e4cd0 | ||
|
|
f059866a21 | ||
|
|
234a7c19a4 | ||
|
|
35dd41c3a2 | ||
|
|
afc659442d | ||
|
|
6a6636d451 | ||
|
|
46742a79ca | ||
|
|
d61def86e1 | ||
|
|
30c750a5df | ||
|
|
bae1d65564 | ||
|
|
995a805a31 | ||
|
|
c0cfd62b90 | ||
|
|
e193005c66 | ||
|
|
fff8109567 | ||
|
|
3af757ed77 | ||
|
|
ebbe6177a9 | ||
|
|
97b39ae2e4 | ||
|
|
0f77ad219c | ||
|
|
8b31be43c6 | ||
|
|
21dbcb7c77 | ||
|
|
0d7bb9af46 | ||
|
|
86e9ebdcc9 | ||
|
|
350e0080e6 | ||
|
|
66e2016eeb | ||
|
|
030b3d751e | ||
|
|
79537467da | ||
|
|
a18decf4cc | ||
|
|
20b5c23a19 | ||
|
|
e6e2cf7855 | ||
|
|
c884ecfea1 | ||
|
|
edbe1de026 | ||
|
|
2321b4b272 | ||
|
|
007cf33e88 | ||
|
|
b231b8c927 | ||
|
|
d01e7b0173 | ||
|
|
bb267e30b6 | ||
|
|
eca42bcb44 | ||
|
|
5ffeca35e7 | ||
|
|
87be137b88 | ||
|
|
0a697517ac | ||
|
|
c4820f119d | ||
|
|
57b3be4016 | ||
|
|
b033f2f535 | ||
|
|
f34b04cfc0 | ||
|
|
ec71d538fc | ||
|
|
6919c80f0b | ||
|
|
99599c099f | ||
|
|
d01f2f3c22 | ||
|
|
1a5aa5e0c0 | ||
|
|
9803c421f5 | ||
|
|
792ec63c8a | ||
|
|
c9e0b3b987 | ||
|
|
28766479a7 | ||
|
|
9ac940d31d | ||
|
|
b553ea45ee | ||
|
|
ac4a10456e | ||
|
|
2f3a7e53cb | ||
|
|
42c7bb7529 | ||
|
|
35140f1cc7 | ||
|
|
4f4392b83e | ||
|
|
db6c0ebf76 | ||
|
|
cf7ebfbdc8 | ||
|
|
bc8721fb6c | ||
|
|
01ba771783 | ||
|
|
9ee80e3e54 | ||
|
|
b2c6a6920f | ||
|
|
e321469884 | ||
|
|
b7ebbb4064 | ||
|
|
9a1fe801e5 | ||
|
|
6f71632e3e | ||
|
|
2844674587 | ||
|
|
0daef29053 | ||
|
|
21081836ba | ||
|
|
a2f6e1803b | ||
|
|
39c068400e | ||
|
|
47e7175b80 | ||
|
|
0b785ad967 | ||
|
|
069486d169 | ||
|
|
298ebc58c1 | ||
|
|
3fd41d138c | ||
|
|
35b02997f8 | ||
|
|
adc1ac689e | ||
|
|
528c075ad6 | ||
|
|
e577f2fff3 | ||
|
|
daf96dfae1 | ||
|
|
d4a1d9f82a | ||
|
|
f7f4ea1dcf | ||
|
|
0af3a5b603 | ||
|
|
00cf3e4dab | ||
|
|
cb6be94358 | ||
|
|
54ef1cee1d | ||
|
|
b9999427a8 | ||
|
|
ddeb076890 | ||
|
|
d06d58e461 | ||
|
|
48bb0fadc2 | ||
|
|
cd627ba16e | ||
|
|
d0a80e432d | ||
|
|
9558999698 | ||
|
|
5338808600 | ||
|
|
82da024a4d | ||
|
|
5c866fc737 | ||
|
|
d75013a0e8 | ||
|
|
1591a37ad5 | ||
|
|
3e528f34af | ||
|
|
b6437b5a4c | ||
|
|
db4951bc61 | ||
|
|
d6132aaa88 | ||
|
|
9adc8e9d3f | ||
|
|
be54b4bf26 | ||
|
|
64d90a761b | ||
|
|
4d123d0a93 | ||
|
|
5dd8308686 | ||
|
|
9c2120eb34 | ||
|
|
4f8d888e66 | ||
|
|
ca09a0b516 | ||
|
|
a43164877c | ||
|
|
515641d033 | ||
|
|
54d25c13d7 | ||
|
|
23d53561d1 | ||
|
|
0cce61de3a | ||
|
|
5b96e3fcc7 | ||
|
|
79dae254cf | ||
|
|
5b32cdd960 | ||
|
|
f9ad8d6903 | ||
|
|
1b66600bd0 | ||
|
|
dc53270da9 | ||
|
|
8ea7ba3afa | ||
|
|
ef275ebf62 | ||
|
|
22ab4fa1b0 | ||
|
|
55dfe2c978 | ||
|
|
3c3f7c2a56 | ||
|
|
0c92da7e9c | ||
|
|
8fac41768c | ||
|
|
c418b83678 | ||
|
|
b53f6357fc | ||
|
|
11ca3dedfb | ||
|
|
f77680520f |
10
.bra.toml
10
.bra.toml
@@ -1,20 +1,20 @@
|
||||
[run]
|
||||
init_cmds = [
|
||||
["grep", "-rn", "FIXME", "."],
|
||||
#["grep", "-rn", "FIXME", "."],
|
||||
["./gogs", "web"]
|
||||
]
|
||||
watch_all = true
|
||||
watch_dirs = [
|
||||
"$WORKDIR/conf/locale",
|
||||
"$WORKDIR/cmd",
|
||||
"$WORKDIR/models",
|
||||
"$WORKDIR/modules",
|
||||
"$WORKDIR/routers"
|
||||
]
|
||||
watch_exts = [".go", ".ini"]
|
||||
watch_exts = [".go"]
|
||||
build_delay = 1500
|
||||
cmds = [
|
||||
["go", "install", "-tags", "sqlite cert"],# redis memcache
|
||||
["go", "build", "-tags", "sqlite cert"],
|
||||
#["go-bindata", "-o=modules/bindata/bindata.go", "-ignore=\\.DS_Store|README", "-pkg=bindata", "conf/..."],
|
||||
["go", "install", "-tags", "sqlite"],# redis memcache cert pam
|
||||
["go", "build", "-tags", "sqlite"],
|
||||
["./gogs", "web"]
|
||||
]
|
||||
12
.editorconfig
Normal file
12
.editorconfig
Normal file
@@ -0,0 +1,12 @@
|
||||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_style = tab
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
.DS_Store
|
||||
*.db
|
||||
*.log
|
||||
log/
|
||||
custom/
|
||||
data/
|
||||
.vendor/
|
||||
@@ -28,10 +29,9 @@ profile/
|
||||
__pycache__
|
||||
*.pem
|
||||
output*
|
||||
config.codekit
|
||||
.brackets.json
|
||||
docker/fig.yml
|
||||
docker/docker/Dockerfile
|
||||
docker/docker/init_gogs.sh
|
||||
gogs.sublime-project
|
||||
gogs.sublime-workspace
|
||||
gogs.sublime-workspace
|
||||
|
||||
22
.gobuild.yml
22
.gobuild.yml
@@ -1,22 +0,0 @@
|
||||
filesets:
|
||||
includes:
|
||||
- conf
|
||||
- etc
|
||||
- public
|
||||
- scripts
|
||||
- templates
|
||||
- LICENSE
|
||||
- README.md
|
||||
- README_ZH.md
|
||||
excludes:
|
||||
- \.git
|
||||
depth: 5
|
||||
settings:
|
||||
build: |
|
||||
if test "$GOOS" = "windows" -a "$GOARCH" = "386"
|
||||
then
|
||||
go install -v
|
||||
else
|
||||
go get -v -tags "sqlite redis memcache cert" github.com/gogits/gogs
|
||||
go install -v -tags "sqlite redis memcache cert"
|
||||
fi
|
||||
56
.gopmfile
56
.gopmfile
@@ -2,32 +2,38 @@
|
||||
path = github.com/gogits/gogs
|
||||
|
||||
[deps]
|
||||
github.com/beego/memcache = commit:2aea774416
|
||||
github.com/beego/redigo = commit:856744a0d5
|
||||
github.com/bradfitz/gomemcache = commit:72a68649ba
|
||||
github.com/Unknwon/cae = commit:2e70a1351b
|
||||
github.com/Unknwon/com = commit:2cbcbc6916
|
||||
github.com/Unknwon/goconfig = commit:0f8d8dc1c0
|
||||
github.com/Unknwon/i18n = commit:aec5f77857
|
||||
github.com/Unknwon/macaron = commit:5c8d1b7642
|
||||
github.com/codegangsta/cli = commit:7381bc4e62
|
||||
github.com/go-sql-driver/mysql = commit:8111ee3ec3
|
||||
github.com/go-xorm/core = commit:3e0fa232ab
|
||||
github.com/go-xorm/xorm = commit:58d33844ce
|
||||
github.com/gogits/go-gogs-client = commit:3b1d86c3a8
|
||||
github.com/gogits/oauth2 = commit:99cbec870a
|
||||
github.com/lib/pq = commit:b021d0ef20
|
||||
github.com/macaron-contrib/binding = commit:0e23661e7d
|
||||
github.com/macaron-contrib/cache = commit:0bb9e6c9ef
|
||||
github.com/macaron-contrib/captcha = commit:3567dc48b8
|
||||
github.com/macaron-contrib/csrf = commit:422b79675c
|
||||
github.com/macaron-contrib/i18n = commit:2246f45894
|
||||
github.com/macaron-contrib/session = commit:f00d48fd4f
|
||||
github.com/macaron-contrib/toolbox = commit:57127bcc89
|
||||
github.com/mattn/go-sqlite3 = commit:a80c27ba33
|
||||
github.com/nfnt/resize = commit:581d15cb53
|
||||
github.com/russross/blackfriday = commit:05b8cefd6a
|
||||
github.com/saintfish/chardet = commit:3af4cd4741
|
||||
github.com/Unknwon/com = commit:47d7d2b81a
|
||||
github.com/Unknwon/i18n = commit:7457d88830
|
||||
github.com/Unknwon/macaron = commit:635c89ac74
|
||||
github.com/Unknwon/paginater = commit:cab2d086fa
|
||||
github.com/codegangsta/cli = commit:2bcd11f863
|
||||
github.com/go-sql-driver/mysql = commit:a197e5d405
|
||||
github.com/go-xorm/core = commit:bacc62db6e
|
||||
github.com/go-xorm/xorm = commit:7b8945acfe
|
||||
github.com/gogits/chardet = commit:2404f77725
|
||||
github.com/gogits/go-gogs-client = commit:92e76d616a
|
||||
github.com/lib/pq = commit:0dad96c0b9
|
||||
github.com/macaron-contrib/binding = commit:de6ed78668
|
||||
github.com/macaron-contrib/cache = commit:cd824f6f2d
|
||||
github.com/macaron-contrib/captcha = commit:9a0a0b1468
|
||||
github.com/macaron-contrib/csrf = commit:98ddf5a710
|
||||
github.com/macaron-contrib/i18n = commit:da2b19e90b
|
||||
github.com/macaron-contrib/oauth2 = commit:8f394c3629
|
||||
github.com/macaron-contrib/session = commit:e48134e803
|
||||
github.com/macaron-contrib/toolbox = commit:acbfe36e16
|
||||
github.com/mattn/go-sqlite3 = commit:e28cd440fa
|
||||
github.com/microcosm-cc/bluemonday = commit:2b7763a06c
|
||||
github.com/msteinert/pam = commit:9a42d39dbf
|
||||
github.com/nfnt/resize = commit:dc93e1b98c
|
||||
github.com/russross/blackfriday = commit:8cec3a854e
|
||||
github.com/shurcooL/go = commit:680f57227f
|
||||
golang.org/x/net = commit:937a34c9de13
|
||||
golang.org/x/text = commit:5b2527008a4c
|
||||
gopkg.in/ini.v1 = commit:caf3f03ad9
|
||||
gopkg.in/redis.v2 = commit:e617904962
|
||||
|
||||
[res]
|
||||
include = conf|etc|public|scripts|templates
|
||||
include = etc|public|scripts|templates
|
||||
|
||||
|
||||
25
.pkgr.yml
25
.pkgr.yml
@@ -1,13 +1,24 @@
|
||||
targets:
|
||||
debian-7: &debian
|
||||
build_dependencies:
|
||||
- libpam0g-dev
|
||||
dependencies:
|
||||
- libpam0g
|
||||
- git
|
||||
debian-8:
|
||||
<<: *debian
|
||||
ubuntu-14.04:
|
||||
<<: *debian
|
||||
ubuntu-12.04:
|
||||
debian-7:
|
||||
centos6:
|
||||
build_dependencies:
|
||||
- mercurial
|
||||
- bzr
|
||||
dependencies:
|
||||
- git
|
||||
<<: *debian
|
||||
centos-6: &el
|
||||
build_dependencies:
|
||||
- pam-devel
|
||||
dependencies:
|
||||
- pam
|
||||
- git
|
||||
centos-7:
|
||||
<<: *el
|
||||
before:
|
||||
- mv packager/Procfile .
|
||||
- mv packager/.godir .
|
||||
|
||||
16
.travis.yml
16
.travis.yml
@@ -2,4 +2,18 @@ language: go
|
||||
|
||||
go:
|
||||
- 1.2
|
||||
- 1.3
|
||||
- 1.3
|
||||
- 1.4
|
||||
- tip
|
||||
|
||||
before_install:
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -y libpam-dev
|
||||
- go get github.com/msteinert/pam
|
||||
|
||||
script: go build -v -tags "pam"
|
||||
|
||||
notifications:
|
||||
email:
|
||||
- u@gogs.io
|
||||
slack: gophercn:o5pSanyTeNhnfYc3QnG0X7Wx
|
||||
|
||||
@@ -1,71 +1,73 @@
|
||||
# Contributing to Gogs
|
||||
|
||||
> This guidelines sheet is forked from [CONTRIBUTING.md](https://github.com/drone/drone/blob/master/CONTRIBUTING.md).
|
||||
> This guidelines sheet is forked from [CONTRIBUTING.md](https://github.com/drone/drone/blob/8d9c7cee56d6c2eac81dc156ce27be6716d97e68/CONTRIBUTING.md).
|
||||
|
||||
Gogs is not perfect and it has bugs, or incomplete features for rare cases. You're welcome to tell us or contribute some code. This document describles details about how can you contribute to Gogs project.
|
||||
Gogs is not perfect, and it has bugs or incomplete features in rare cases. You're welcome to tell us, or to contribute some code. This document describes details about how can you contribute to Gogs project.
|
||||
|
||||
## Contribution guidelines
|
||||
|
||||
Depends on the situation, you will:
|
||||
|
||||
- Find bug, create an issue
|
||||
- Need more functionality, make a feature request
|
||||
- Want to contribute code, open a pull request
|
||||
- Run into issue, need help
|
||||
- Find a bug and create an issue
|
||||
- Need more functionality and make a feature request
|
||||
- Want to contribute code and open a pull request
|
||||
- Run into issue and need help
|
||||
|
||||
### Bug Report
|
||||
|
||||
If you find or consider something is a bug, please create a issue on [GitHub](https://github.com/gogits/gogs/issues). To reduce unnecessary time wasting of interacting and waiting with team members, please use following form as template in the first place:
|
||||
If you find something you consider a bug, please create a issue on [GitHub](https://github.com/gogits/gogs/issues). To avoid wasting time and reduce back-and-forth communication with team members, please include at least the following information in a form comfortable for you:
|
||||
|
||||
```
|
||||
- **Bug Description**:
|
||||
- **Gogs Version**:
|
||||
- **Git Version**:
|
||||
- **System Type**:
|
||||
- **Error Log**:
|
||||
- **Other information**:
|
||||
```
|
||||
- Bug Description
|
||||
- Gogs Version
|
||||
- Git Version
|
||||
- System Type
|
||||
- Error Log
|
||||
- Other information
|
||||
|
||||
Please take a moment to check that an issue on [GitHub](https://github.com/gogits/gogs/issues) doesn't already exist documenting your bug report or improvement proposal. If it does, it never hurts to add a quick "+1" or "I have this problem too". This will help prioritize the most common problems and requests.
|
||||
|
||||
#### Bug Report Example
|
||||
|
||||
- **Bug Description**: Crash when create repository with license|
|
||||
- **Gogs Version**: `v0.4.9.0901`
|
||||
- **Git Version**: `1.9.0`
|
||||
- **System Type**: `Ubuntu 12.04`
|
||||
- **Error Log**:
|
||||
Gogs crashed when creating a repository with a license, using v0.5.13.0207, SQLite3, Git 1.9.0, Ubuntu 12.04.
|
||||
|
||||
Error log:
|
||||
|
||||
```
|
||||
2014/09/01 07:21:49 [E] nil pointer
|
||||
```
|
||||
|
||||
- **Other information**: Use SQLite3 as database
|
||||
|
||||
### Feature Request
|
||||
|
||||
There is no standard form of making a feature request, just try to describle the feature as clear as possible because team members may not have experience with the functionality you're talking about.
|
||||
There is no standard form of making a feature request. Just try to describe the feature as clearly as possible, because team members may not have experience with the functionality you're talking about.
|
||||
|
||||
### Pull Request
|
||||
|
||||
Pull requests are always welcome, but note that **ALL PULL REQUESTS MUST SEND TO `DEV` BRANCH**.
|
||||
Pull requests are always welcome, but note that **ALL PULL REQUESTS MUST APPLY TO THE `DEV` BRANCH**.
|
||||
|
||||
We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it.
|
||||
|
||||
If your pull request is not accepted on the first try, don't be discouraged! If there's a problem with the implementation, hopefully you received feedback on what to improve.
|
||||
|
||||
We're trying very hard to keep Gogs lean and focused. We don't want it to do everything for everybody. This means that we might decide against incorporating a new feature.
|
||||
We're trying very hard to keep Gogs lean and focused. We don't want it to do everything for everybody. This means that we might decide against incorporating a new feature. We believe you do like to discuss with us first in [Gitter](https://gitter.im/gogits/gogs).
|
||||
|
||||
### Ask For Help
|
||||
|
||||
Before open any new issue, please check your problem on [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md) and [FAQs](http://gogs.io/docs/intro/faqs.html) pages.
|
||||
Before opening an issue, please make sure your problem isn't already addressed on the [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md) and [FAQs](http://gogs.io/docs/intro/faqs.html) pages.
|
||||
|
||||
## Things To Notice
|
||||
|
||||
Please take a moment to check that an issue on [GitHub](https://github.com/gogits/gogs/issues) or card on [Trello](https://trello.com/b/uxAoeLUl/gogs-go-git-service) doesn't already exist documenting your bug report or improvement proposal. If it does, it never hurts to add a quick "+1" or "I have this problem too". This will help prioritize the most common problems and requests.
|
||||
|
||||
### Discuss your design on the mailing list
|
||||
## Code of conduct
|
||||
|
||||
We recommend discussing your plans [on the mailing list](https://groups.google.com/forum/#!forum/gogits) before starting to code - especially for more ambitious contributions. This gives other contributors a chance to point you in the right direction, give feedback on your design, and maybe point out if someone else is working on the same thing.
|
||||
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
||||
|
||||
We may close your pull request if not first discussed on the mailing list. We aren't doing this to be jerks. We are doing this to prevent people from spending large amounts of time on changes that may need to be designed or architected in a specific way, or may not align with the vision of the project.
|
||||
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
|
||||
|
||||
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior can be reported by emailing u@gogs.io
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
||||
|
||||
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
||||
FROM google/golang:latest
|
||||
|
||||
ENV TAGS="sqlite redis memcache cert" USER="git" HOME="/home/git"
|
||||
|
||||
COPY . /gopath/src/github.com/gogits/gogs/
|
||||
WORKDIR /gopath/src/github.com/gogits/gogs/
|
||||
|
||||
RUN go get -v -tags="$TAGS" github.com/gogits/gogs \
|
||||
&& go build -tags="$TAGS" \
|
||||
&& useradd -d $HOME -m $USER \
|
||||
&& chown -R $USER .
|
||||
|
||||
USER $USER
|
||||
|
||||
ENTRYPOINT [ "./gogs" ]
|
||||
|
||||
CMD [ "web" ]
|
||||
59
README.md
59
README.md
@@ -1,16 +1,20 @@
|
||||
Gogs - Go Git Service [](https://app.wercker.com/project/bykey/ad0bdb0bc450ac6f09bc56b9640a50aa) [](https://travis-ci.org/gogits/gogs)
|
||||
Gogs - Go Git Service [](https://travis-ci.org/gogits/gogs)
|
||||
=====================
|
||||
|
||||
Gogs(Go Git Service) is a painless self-hosted Git Service written in Go.
|
||||
[](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||

|
||||
Gogs (Go Git Service) is a painless self-hosted Git service.
|
||||
|
||||
##### Current version: 0.5.8 Beta
|
||||

|
||||
|
||||
##### Current version: 0.6.3 Beta
|
||||
|
||||
### NOTICES
|
||||
|
||||
- Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **June 21, 2014** and will reset multiple times after. Please do **NOT** put your important data on the site.
|
||||
- Demo site [try.gogs.io](https://try.gogs.io) is running under `dev` branch.
|
||||
- Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site.
|
||||
- The demo site [try.gogs.io](https://try.gogs.io) is running under `develop` branch.
|
||||
- You **MUST** read [CONTRIBUTING.md](CONTRIBUTING.md) before you start filing an issue or making a Pull Request, and **MUST** discuss with us on [Gitter](https://gitter.im/gogits/gogs) for UI changes and feature Pull Requests, otherwise it's high possibilities that we are not going to merge it.
|
||||
- If you think there are vulnerabilities in the project, please talk privately to **u@gogs.io**. Thanks!
|
||||
|
||||
#### Other language version
|
||||
|
||||
@@ -18,14 +22,15 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go.
|
||||
|
||||
## Purpose
|
||||
|
||||
The goal of this project is to make the easiest, fastest and most painless way to set up a self-hosted Git service. With Go, this can be done in independent binary distribution across **ALL platforms** that Go supports, including Linux, Mac OS X, and Windows.
|
||||
The goal of this project is to make the easiest, fastest, and most painless way to set up a self-hosted Git service. With Go, this can be done via an independent binary distribution across **ALL platforms** that Go supports, including Linux, Mac OS X, and Windows.
|
||||
|
||||
## Overview
|
||||
|
||||
- Please see [Documentation](http://gogs.io/docs/intro/) for project design, known issues, and change log.
|
||||
- See [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
|
||||
- Try it before anything? Do it [online](https://try.gogs.io/Unknown/gogs) or go down to **Installation -> Install from binary** section!
|
||||
- Having troubles? Get help from [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md).
|
||||
- Please see the [Documentation](http://gogs.io/docs/intro/) for project design, known issues, and change log.
|
||||
- See the [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
|
||||
- Want to try it before doing anything else? Do it [online](https://try.gogs.io/unknwon/gogs) or go down to the **Installation -> Install from binary** section!
|
||||
- Having trouble? Get help with [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md).
|
||||
- Want to help with localization? Check out the [guide](http://gogs.io/docs/features/i18n.html)!
|
||||
|
||||
## Features
|
||||
|
||||
@@ -41,22 +46,36 @@ The goal of this project is to make the easiest, fastest and most painless way t
|
||||
- Repository Git hooks
|
||||
- Add/remove repository collaborators
|
||||
- Gravatar and cache support
|
||||
- Mail service(register, issue)
|
||||
- Mail service (register, issue)
|
||||
- Administration panel
|
||||
- Slack webhook integration
|
||||
- Drone CI integration
|
||||
- Supports MySQL, PostgreSQL and SQLite3
|
||||
- Social account login(GitHub, Google, QQ, Weibo)
|
||||
- Multi-language support(English, Simplified Chinese, Traditional Chinese, Germany, French, Dutch, and [more](https://crowdin.com/project/gogs))
|
||||
- Social account login (GitHub, Google, QQ, Weibo)
|
||||
- Multi-language support ([14 languages](https://crowdin.com/project/gogs))
|
||||
|
||||
## System Requirements
|
||||
|
||||
- A cheap Raspberry Pi is powerful enough to match the minimal requirement.
|
||||
- 4 CPU Cores and 1GB RAM would be the baseline for teamwork.
|
||||
- A cheap Raspberry Pi is powerful enough for basic functionality.
|
||||
- At least 2 CPU cores and 1GB RAM would be the baseline for teamwork.
|
||||
|
||||
## Browser Support
|
||||
|
||||
According to [Semantic UI](https://github.com/Semantic-Org/Semantic-UI/tree/1.x):
|
||||
|
||||
- Last 2 Versions FF, Chrome, IE 10+
|
||||
- Safari 6
|
||||
- IE 9+ (Browser prefix only)
|
||||
- Android 4
|
||||
- Blackberry 10
|
||||
|
||||
Browser prefixes are present for Internet Explorer 9, but the browser is not officially supported.
|
||||
|
||||
The official support minimal size is 1024*768, UI may still looks right in smaller size but no promises and fixes.
|
||||
|
||||
## Installation
|
||||
|
||||
Make sure you install [Prerequirements](http://gogs.io/docs/installation/) first.
|
||||
Make sure you install the [prerequisites](http://gogs.io/docs/installation/) first.
|
||||
|
||||
There are 5 ways to install Gogs:
|
||||
|
||||
@@ -71,14 +90,16 @@ There are 5 ways to install Gogs:
|
||||
- Router and middleware mechanism of [Macaron](https://github.com/Unknwon/macaron).
|
||||
- Mail Service, modules design is inspired by [WeTalk](https://github.com/beego/wetalk).
|
||||
- System Monitor Status is inspired by [GoBlog](https://github.com/fuxiaohei/goblog).
|
||||
- Usage and modification from [beego](http://beego.me) modules.
|
||||
- Thanks [lavachen](http://www.lavachen.cn/) and [Rocker](http://weibo.com/rocker1989) for designing Logo.
|
||||
- Thanks [gobuild.io](http://gobuild.io) for providing binary compile and download service.
|
||||
- Thanks [Crowdin](https://crowdin.com/project/gogs) for providing open source translation plan.
|
||||
|
||||
## Contributors
|
||||
|
||||
The [core team](http://gogs.io/team) of this project. See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors.
|
||||
- The [core team](http://gogs.io/team) of this project.
|
||||
- Ex-team members [@lunny](https://github.com/lunny) and [@fuxiaohei](https://github.com/fuxiaohei).
|
||||
- See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors.
|
||||
- See [TRANSLATORS](conf/locale/TRANSLATORS) for full list of translators.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
41
README_ZH.md
41
README_ZH.md
@@ -1,11 +1,7 @@
|
||||
Gogs - Go Git Service [](https://app.wercker.com/project/bykey/ad0bdb0bc450ac6f09bc56b9640a50aa) [](https://travis-ci.org/gogits/gogs)
|
||||
Gogs - Go Git Service [](https://travis-ci.org/gogits/gogs)
|
||||
=====================
|
||||
|
||||
Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务。
|
||||
|
||||

|
||||
|
||||
##### 当前版本:0.5.8 Beta
|
||||
Gogs (Go Git Service) 是一款可轻易搭建的自助 Git 服务。
|
||||
|
||||
## 开发目的
|
||||
|
||||
@@ -13,10 +9,11 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
|
||||
## 项目概览
|
||||
|
||||
- 有关项目设计、已知问题和变更日志,请通过 [使用手册](http://gogs.io/docs/intro/) 查看。
|
||||
- 有关项目设计、已知问题和变更日志,请通过 [使用手册](http://gogs.io/docs/intro/) 查看。
|
||||
- 您可以到 [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) 跟随开发团队的脚步。
|
||||
- 想要先睹为快?通过 [在线体验](https://try.gogs.io/Unknown/gogs) 或查看 **安装部署 -> 二进制安装** 小节。
|
||||
- 想要先睹为快?通过 [在线体验](https://try.gogs.io/unknwon/gogs) 或查看 **安装部署 -> 二进制安装** 小节。
|
||||
- 使用过程中遇到问题?尝试从 [故障排查](http://gogs.io/docs/intro/troubleshooting.md) 页面获取帮助。
|
||||
- 希望帮助多国语言界面的翻译吗?请立即访问 [详情页面](http://gogs.io/docs/features/i18n.html)!
|
||||
|
||||
## 功能特性
|
||||
|
||||
@@ -38,12 +35,26 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
- Drone CI 持续部署集成
|
||||
- 支持 MySQL、PostgreSQL 以及 SQLite3 数据库
|
||||
- 社交帐号登录(GitHub、Google、QQ、微博)
|
||||
- 多语言支持(英文、简体中文、繁体中文、德语、法语、荷兰语以及 [更多]([more](https://crowdin.com/project/gogs)))
|
||||
- 多语言支持([14 种语言]([more](https://crowdin.com/project/gogs)))
|
||||
|
||||
## 系统要求
|
||||
|
||||
- 最低的系统硬件要求为一个廉价的树莓派
|
||||
- 如果用于团队项目,建议使用 4 核 CPU 及 1GB 内存
|
||||
- 如果用于团队项目,建议使用 2 核 CPU 及 1GB 内存
|
||||
|
||||
## 浏览器支持
|
||||
|
||||
根据 [Semantic UI](https://github.com/Semantic-Org/Semantic-UI/tree/1.x) 的要求:
|
||||
|
||||
- 最新两版的 FF、Chrome 和 IE 10+
|
||||
- Safari 6
|
||||
- IE 9+ (仅限浏览器前缀)
|
||||
- Android 4
|
||||
- Blackberry 10
|
||||
|
||||
尽管已经使用了 Internet Explorer 9 的浏览器前缀,但该版本的浏览器被没有被正式支持。
|
||||
|
||||
官方支持的最小 UI 尺寸为 1024*768,UI 不一定会在更小尺寸的设备上被破坏,但我们无法保证且不会修复。
|
||||
|
||||
## 安装部署
|
||||
|
||||
@@ -59,8 +70,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
|
||||
## 特别鸣谢
|
||||
|
||||
- [Macaron](https://github.com/Unknwon/macaron) 的路由与中间件机制。
|
||||
- [beego](http://beego.me) 模块的使用与修改。
|
||||
- 基于 [Macaron](https://github.com/Unknwon/macaron) 的路由与中间件机制。
|
||||
- 基于 [WeTalk](https://github.com/beego/wetalk) 修改的邮件服务和模块设计。
|
||||
- 基于 [GoBlog](https://github.com/fuxiaohei/goblog) 修改的系统监视状态。
|
||||
- 感谢 [gobuild.io](http://gobuild.io) 提供二进制编译与下载服务。
|
||||
@@ -69,8 +79,11 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
|
||||
## 贡献成员
|
||||
|
||||
本项目的 [开发团队](http://gogs.io/team)。您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。
|
||||
- 本项目的 [开发团队](http://gogs.io/team)。
|
||||
- 前团队成员 [@lunny](https://github.com/lunny) 和 [@fuxiaohei](https://github.com/fuxiaohei)。
|
||||
- 您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。
|
||||
- 您可以通过查看 [TRANSLATORS](conf/locale/TRANSLATORS) 文件获取完整的翻译人员列表。
|
||||
|
||||
## 授权许可
|
||||
|
||||
本项目采用 MIT 开源授权许可证,完整的授权说明已放置在 [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) 文件中。
|
||||
本项目采用 MIT 开源授权许可证,完整的授权说明已放置在 [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) 文件中。
|
||||
|
||||
@@ -114,6 +114,7 @@ func runCert(ctx *cli.Context) {
|
||||
SerialNumber: serialNumber,
|
||||
Subject: pkix.Name{
|
||||
Organization: []string{"Acme Co"},
|
||||
CommonName: "Gogs",
|
||||
},
|
||||
NotBefore: notBefore,
|
||||
NotAfter: notAfter,
|
||||
|
||||
@@ -8,7 +8,7 @@ package cmd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
"os"
|
||||
|
||||
"github.com/codegangsta/cli"
|
||||
)
|
||||
@@ -19,16 +19,9 @@ var CmdCert = cli.Command{
|
||||
Description: `Generate a self-signed X.509 certificate for a TLS server.
|
||||
Outputs to 'cert.pem' and 'key.pem' and will overwrite existing files.`,
|
||||
Action: runCert,
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{"host", "", "Comma-separated hostnames and IPs to generate a certificate for", ""},
|
||||
cli.StringFlag{"ecdsa-curve", "", "ECDSA curve to use to generate a key. Valid values are P224, P256, P384, P521", ""},
|
||||
cli.IntFlag{"rsa-bits", 2048, "Size of RSA key to generate. Ignored if --ecdsa-curve is set", ""},
|
||||
cli.StringFlag{"start-date", "", "Creation date formatted as Jan 1 15:04:05 2011", ""},
|
||||
cli.DurationFlag{"duration", 365 * 24 * time.Hour, "Duration that certificate is valid for", ""},
|
||||
cli.BoolFlag{"ca", "whether this cert should be its own Certificate Authority", ""},
|
||||
},
|
||||
}
|
||||
|
||||
func runCert(ctx *cli.Context) {
|
||||
fmt.Println("Command cert not available, please use build tags 'cert' to rebuild.")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
@@ -25,11 +25,15 @@ var CmdDump = cli.Command{
|
||||
It can be used for backup and capture Gogs server image to send to maintainer`,
|
||||
Action: runDump,
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""},
|
||||
cli.BoolFlag{"verbose, v", "show process details", ""},
|
||||
},
|
||||
}
|
||||
|
||||
func runDump(ctx *cli.Context) {
|
||||
if ctx.IsSet("config") {
|
||||
setting.CustomConf = ctx.String("config")
|
||||
}
|
||||
setting.NewConfigContext()
|
||||
models.LoadModelsConfig()
|
||||
models.SetEngine()
|
||||
@@ -58,7 +62,7 @@ func runDump(ctx *cli.Context) {
|
||||
workDir, _ := setting.WorkDir()
|
||||
z.AddFile("gogs-repo.zip", path.Join(workDir, "gogs-repo.zip"))
|
||||
z.AddFile("gogs-db.sql", path.Join(workDir, "gogs-db.sql"))
|
||||
z.AddFile("custom/conf/app.ini", path.Join(workDir, "custom/conf/app.ini"))
|
||||
z.AddDir("custom", path.Join(workDir, "custom"))
|
||||
z.AddDir("log", path.Join(workDir, "log"))
|
||||
// FIXME: SSH key file.
|
||||
if err = z.Close(); err != nil {
|
||||
|
||||
181
cmd/fix.go
181
cmd/fix.go
@@ -1,181 +0,0 @@
|
||||
// Copyright 2014 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 cmd
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/codegangsta/cli"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
var CmdFix = cli.Command{
|
||||
Name: "fix",
|
||||
Usage: "This command for upgrade from old version",
|
||||
Action: runFix,
|
||||
Subcommands: fixCommands,
|
||||
Flags: []cli.Flag{},
|
||||
}
|
||||
|
||||
func runFix(ctx *cli.Context) {
|
||||
}
|
||||
|
||||
var fixCommands = []cli.Command{
|
||||
{
|
||||
Name: "location",
|
||||
Usage: "Change Gogs app location",
|
||||
Description: `Command location fixes location change of Gogs
|
||||
|
||||
gogs fix location <old Gogs path>
|
||||
`,
|
||||
Action: runFixLocation,
|
||||
},
|
||||
}
|
||||
|
||||
// rewriteAuthorizedKeys replaces old Gogs path to the new one.
|
||||
func rewriteAuthorizedKeys(sshPath, oldPath, newPath string) error {
|
||||
fr, err := os.Open(sshPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer fr.Close()
|
||||
|
||||
tmpPath := sshPath + ".tmp"
|
||||
fw, err := os.Create(tmpPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer fw.Close()
|
||||
|
||||
oldPath = "command=\"" + oldPath + " serv"
|
||||
newPath = "command=\"" + newPath + " serv"
|
||||
buf := bufio.NewReader(fr)
|
||||
for {
|
||||
line, errRead := buf.ReadString('\n')
|
||||
line = strings.TrimSpace(line)
|
||||
|
||||
if errRead != nil {
|
||||
if errRead != io.EOF {
|
||||
return errRead
|
||||
}
|
||||
|
||||
// Reached end of file, if nothing to read then break,
|
||||
// otherwise handle the last line.
|
||||
if len(line) == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Still finding the line, copy the line that currently read.
|
||||
if _, err = fw.WriteString(strings.Replace(line, oldPath, newPath, 1) + "\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if errRead == io.EOF {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if err = os.Remove(sshPath); err != nil {
|
||||
return err
|
||||
}
|
||||
return os.Rename(tmpPath, sshPath)
|
||||
}
|
||||
|
||||
func rewriteUpdateHook(path, appPath string) error {
|
||||
if runtime.GOOS == "windows" {
|
||||
rp := strings.NewReplacer("\\", "/")
|
||||
appPath = "\"" + rp.Replace(appPath) + "\""
|
||||
} else {
|
||||
rp := strings.NewReplacer("\\", "/", " ", "\\ ")
|
||||
appPath = rp.Replace(appPath)
|
||||
}
|
||||
|
||||
if err := ioutil.WriteFile(path, []byte(fmt.Sprintf(models.TPL_UPDATE_HOOK,
|
||||
setting.ScriptType, appPath)), os.ModePerm); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func walkDir(rootPath, recPath, appPath string, depth int) error {
|
||||
depth++
|
||||
if depth > 3 {
|
||||
return nil
|
||||
} else if depth == 3 {
|
||||
if err := rewriteUpdateHook(path.Join(rootPath, "hooks/update"), appPath); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
dir, err := os.Open(rootPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer dir.Close()
|
||||
|
||||
fis, err := dir.Readdir(0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, fi := range fis {
|
||||
if strings.Contains(fi.Name(), ".DS_Store") {
|
||||
continue
|
||||
}
|
||||
|
||||
relPath := path.Join(recPath, fi.Name())
|
||||
curPath := path.Join(rootPath, fi.Name())
|
||||
if fi.IsDir() {
|
||||
if err = walkDir(curPath, relPath, appPath, depth); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func runFixLocation(ctx *cli.Context) {
|
||||
if len(ctx.Args()) != 1 {
|
||||
fmt.Println("Incorrect arguments number, expect 1")
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
execPath, _ := setting.ExecPath()
|
||||
|
||||
oldPath := ctx.Args().First()
|
||||
fmt.Printf("Old location: %s\n", oldPath)
|
||||
fmt.Println("This command should be executed in the new Gogs path")
|
||||
fmt.Printf("Do you want to change Gogs app path from old location to:\n")
|
||||
fmt.Printf("-> %s?\n", execPath)
|
||||
fmt.Print("Press <enter> to continue, use <Ctrl+c> to exit.")
|
||||
fmt.Scanln()
|
||||
|
||||
// Fix in authorized_keys file.
|
||||
sshPath := path.Join(models.SshPath, "authorized_keys")
|
||||
fmt.Printf("Fixing pathes in file: %s\n", sshPath)
|
||||
if err := rewriteAuthorizedKeys(sshPath, oldPath, execPath); err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Fix position in gogs-repositories.
|
||||
setting.NewConfigContext()
|
||||
fmt.Printf("Fixing pathes in repositories: %s\n", setting.RepoRootPath)
|
||||
if err := walkDir(setting.RepoRootPath, "", execPath, 0); err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Println("Fix position finished!")
|
||||
}
|
||||
164
cmd/serve.go
164
cmd/serve.go
@@ -8,7 +8,6 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -17,25 +16,38 @@ import (
|
||||
"github.com/codegangsta/cli"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/httplib"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/uuid"
|
||||
)
|
||||
|
||||
const (
|
||||
_ACCESS_DENIED_MESSAGE = "Repository does not exist or you do not have access"
|
||||
)
|
||||
|
||||
var CmdServ = cli.Command{
|
||||
Name: "serv",
|
||||
Usage: "This command should only be called by SSH shell",
|
||||
Description: `Serv provide access auth for repositories`,
|
||||
Action: runServ,
|
||||
Flags: []cli.Flag{},
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""},
|
||||
},
|
||||
}
|
||||
|
||||
func setup(logPath string) {
|
||||
setting.NewConfigContext()
|
||||
log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath))
|
||||
|
||||
if setting.DisableSSH {
|
||||
println("Gogs: SSH has been disabled")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
models.LoadModelsConfig()
|
||||
|
||||
if models.UseSQLite3 {
|
||||
if setting.UseSQLite3 {
|
||||
workDir, _ := setting.WorkDir()
|
||||
os.Chdir(workDir)
|
||||
}
|
||||
@@ -48,61 +60,53 @@ func parseCmd(cmd string) (string, string) {
|
||||
if len(ss) != 2 {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
verb, args := ss[0], ss[1]
|
||||
if verb == "git" {
|
||||
ss = strings.SplitN(args, " ", 2)
|
||||
args = ss[1]
|
||||
verb = fmt.Sprintf("%s %s", verb, ss[0])
|
||||
}
|
||||
return verb, strings.Replace(args, "'/", "'", 1)
|
||||
return ss[0], strings.Replace(ss[1], "'/", "'", 1)
|
||||
}
|
||||
|
||||
var (
|
||||
COMMANDS_READONLY = map[string]models.AccessType{
|
||||
"git-upload-pack": models.WRITABLE,
|
||||
"git upload-pack": models.WRITABLE,
|
||||
"git-upload-archive": models.WRITABLE,
|
||||
}
|
||||
|
||||
COMMANDS_WRITE = map[string]models.AccessType{
|
||||
"git-receive-pack": models.READABLE,
|
||||
"git receive-pack": models.READABLE,
|
||||
COMMANDS = map[string]models.AccessMode{
|
||||
"git-upload-pack": models.ACCESS_MODE_READ,
|
||||
"git-upload-archive": models.ACCESS_MODE_READ,
|
||||
"git-receive-pack": models.ACCESS_MODE_WRITE,
|
||||
}
|
||||
)
|
||||
|
||||
func In(b string, sl map[string]models.AccessType) bool {
|
||||
_, e := sl[b]
|
||||
return e
|
||||
}
|
||||
|
||||
func runServ(k *cli.Context) {
|
||||
func runServ(c *cli.Context) {
|
||||
if c.IsSet("config") {
|
||||
setting.CustomConf = c.String("config")
|
||||
}
|
||||
setup("serv.log")
|
||||
|
||||
keys := strings.Split(os.Args[2], "-")
|
||||
fail := func(userMessage, logMessage string, args ...interface{}) {
|
||||
fmt.Fprintln(os.Stderr, "Gogs: ", userMessage)
|
||||
log.GitLogger.Fatal(2, logMessage, args...)
|
||||
}
|
||||
|
||||
if len(c.Args()) < 1 {
|
||||
fail("Not enough arguments", "Not enough arguments")
|
||||
}
|
||||
|
||||
keys := strings.Split(c.Args()[0], "-")
|
||||
if len(keys) != 2 {
|
||||
println("Gogs: auth file format error")
|
||||
log.GitLogger.Fatal(2, "Invalid auth file format: %s", os.Args[2])
|
||||
fail("key-id format error", "Invalid key id: %s", c.Args()[0])
|
||||
}
|
||||
|
||||
keyId, err := com.StrTo(keys[1]).Int64()
|
||||
if err != nil {
|
||||
println("Gogs: auth file format error")
|
||||
log.GitLogger.Fatal(2, "Invalid auth file format: %v", err)
|
||||
fail("key-id format error", "Invalid key id: %s", err)
|
||||
}
|
||||
|
||||
user, err := models.GetUserByKeyId(keyId)
|
||||
if err != nil {
|
||||
if err == models.ErrUserNotKeyOwner {
|
||||
println("Gogs: you are not the owner of SSH key")
|
||||
log.GitLogger.Fatal(2, "Invalid owner of SSH key: %d", keyId)
|
||||
}
|
||||
println("Gogs: internal error:", err.Error())
|
||||
log.GitLogger.Fatal(2, "Fail to get user by key ID(%d): %v", keyId, err)
|
||||
fail("internal error", "Failed to get user by key ID(%d): %v", keyId, err)
|
||||
}
|
||||
|
||||
cmd := os.Getenv("SSH_ORIGINAL_COMMAND")
|
||||
if cmd == "" {
|
||||
println("Hi", user.Name, "! You've successfully authenticated, but Gogs does not provide shell access.")
|
||||
fmt.Printf("Hi, %s! You've successfully authenticated, but Gogs does not provide shell access.\n", user.Name)
|
||||
if user.IsAdmin {
|
||||
println("If this is unexpected, please log in with password and setup Gogs under another user.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -110,62 +114,47 @@ func runServ(k *cli.Context) {
|
||||
repoPath := strings.Trim(args, "'")
|
||||
rr := strings.SplitN(repoPath, "/", 2)
|
||||
if len(rr) != 2 {
|
||||
println("Gogs: unavailable repository", args)
|
||||
log.GitLogger.Fatal(2, "Unavailable repository: %v", args)
|
||||
fail("Invalid repository path", "Invalid repository path: %v", args)
|
||||
}
|
||||
repoUserName := rr[0]
|
||||
repoName := strings.TrimSuffix(rr[1], ".git")
|
||||
|
||||
isWrite := In(verb, COMMANDS_WRITE)
|
||||
isRead := In(verb, COMMANDS_READONLY)
|
||||
|
||||
repoUser, err := models.GetUserByName(repoUserName)
|
||||
if err != nil {
|
||||
if err == models.ErrUserNotExist {
|
||||
println("Gogs: given repository owner are not registered")
|
||||
log.GitLogger.Fatal(2, "Unregistered owner: %s", repoUserName)
|
||||
fail("Repository owner does not exist", "Unregistered owner: %s", repoUserName)
|
||||
}
|
||||
println("Gogs: internal error:", err.Error())
|
||||
log.GitLogger.Fatal(2, "Fail to get repository owner(%s): %v", repoUserName, err)
|
||||
fail("Internal error", "Failed to get repository owner(%s): %v", repoUserName, err)
|
||||
}
|
||||
|
||||
// Access check.
|
||||
switch {
|
||||
case isWrite:
|
||||
has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.WRITABLE)
|
||||
if err != nil {
|
||||
println("Gogs: internal error:", err.Error())
|
||||
log.GitLogger.Fatal(2, "Fail to check write access:", err)
|
||||
} else if !has {
|
||||
println("You have no right to write this repository")
|
||||
log.GitLogger.Fatal(2, "User %s has no right to write repository %s", user.Name, repoPath)
|
||||
}
|
||||
case isRead:
|
||||
repo, err := models.GetRepositoryByName(repoUser.Id, repoName)
|
||||
if err != nil {
|
||||
if err == models.ErrRepoNotExist {
|
||||
println("Gogs: given repository does not exist")
|
||||
log.GitLogger.Fatal(2, "Repository does not exist: %s/%s", repoUser.Name, repoName)
|
||||
repo, err := models.GetRepositoryByName(repoUser.Id, repoName)
|
||||
if err != nil {
|
||||
if models.IsErrRepoNotExist(err) {
|
||||
if user.Id == repoUser.Id || repoUser.IsOwnedBy(user.Id) {
|
||||
fail("Repository does not exist", "Repository does not exist: %s/%s", repoUser.Name, repoName)
|
||||
} else {
|
||||
fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", repoUser.Name, repoName)
|
||||
}
|
||||
println("Gogs: internal error:", err.Error())
|
||||
log.GitLogger.Fatal(2, "Fail to get repository: %v", err)
|
||||
}
|
||||
fail("Internal error", "Failed to get repository: %v", err)
|
||||
}
|
||||
|
||||
if !repo.IsPrivate {
|
||||
break
|
||||
}
|
||||
requestedMode, has := COMMANDS[verb]
|
||||
if !has {
|
||||
fail("Unknown git command", "Unknown git command %s", verb)
|
||||
}
|
||||
|
||||
has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.READABLE)
|
||||
if err != nil {
|
||||
println("Gogs: internal error:", err.Error())
|
||||
log.GitLogger.Fatal(2, "Fail to check read access:", err)
|
||||
} else if !has {
|
||||
println("You have no right to access this repository")
|
||||
log.GitLogger.Fatal(2, "User %s has no right to read repository %s", user.Name, repoPath)
|
||||
mode, err := models.AccessLevel(user, repo)
|
||||
if err != nil {
|
||||
fail("Internal error", "Fail to check access: %v", err)
|
||||
} else if mode < requestedMode {
|
||||
clientMessage := _ACCESS_DENIED_MESSAGE
|
||||
if mode >= models.ACCESS_MODE_READ {
|
||||
clientMessage = "You do not have sufficient authorization for this action"
|
||||
}
|
||||
default:
|
||||
println("Unknown command")
|
||||
return
|
||||
fail(clientMessage,
|
||||
"User %s does not have level %v access to repository %s",
|
||||
user.Name, requestedMode, repoPath)
|
||||
}
|
||||
|
||||
uuid := uuid.NewV4().String()
|
||||
@@ -183,11 +172,10 @@ func runServ(k *cli.Context) {
|
||||
gitcmd.Stdin = os.Stdin
|
||||
gitcmd.Stderr = os.Stderr
|
||||
if err = gitcmd.Run(); err != nil {
|
||||
println("Gogs: internal error:", err.Error())
|
||||
log.GitLogger.Fatal(2, "Fail to execute git command: %v", err)
|
||||
fail("Internal error", "Failed to execute git command: %v", err)
|
||||
}
|
||||
|
||||
if isWrite {
|
||||
if requestedMode == models.ACCESS_MODE_WRITE {
|
||||
tasks, err := models.GetUpdateTasksByUuid(uuid)
|
||||
if err != nil {
|
||||
log.GitLogger.Fatal(2, "GetUpdateTasksByUuid: %v", err)
|
||||
@@ -197,7 +185,7 @@ func runServ(k *cli.Context) {
|
||||
err = models.Update(task.RefName, task.OldCommitId, task.NewCommitId,
|
||||
user.Name, repoUserName, repoName, user.Id)
|
||||
if err != nil {
|
||||
log.GitLogger.Error(2, "Fail to update: %v", err)
|
||||
log.GitLogger.Error(2, "Failed to update: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,13 +194,19 @@ func runServ(k *cli.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
// Send deliver hook request.
|
||||
resp, err := httplib.Head(setting.AppUrl + setting.AppSubUrl + repoUserName + "/" + repoName + "/hooks/trigger").Response()
|
||||
if err == nil {
|
||||
resp.Body.Close()
|
||||
}
|
||||
|
||||
// Update key activity.
|
||||
key, err := models.GetPublicKeyById(keyId)
|
||||
if err != nil {
|
||||
log.GitLogger.Fatal(2, "GetPublicKeyById: %v", err)
|
||||
fail("Internal error", "GetPublicKeyById: %v", err)
|
||||
}
|
||||
key.Updated = time.Now()
|
||||
if err = models.UpdatePublicKey(key); err != nil {
|
||||
log.GitLogger.Fatal(2, "UpdatePublicKey: %v", err)
|
||||
fail("Internal error", "UpdatePublicKey: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
var CmdUpdate = cli.Command{
|
||||
@@ -18,10 +19,15 @@ var CmdUpdate = cli.Command{
|
||||
Usage: "This command should only be called by SSH shell",
|
||||
Description: `Update get pushed info and insert into database`,
|
||||
Action: runUpdate,
|
||||
Flags: []cli.Flag{},
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""},
|
||||
},
|
||||
}
|
||||
|
||||
func runUpdate(c *cli.Context) {
|
||||
if c.IsSet("config") {
|
||||
setting.CustomConf = c.String("config")
|
||||
}
|
||||
cmd := os.Getenv("SSH_ORIGINAL_COMMAND")
|
||||
if cmd == "" {
|
||||
return
|
||||
|
||||
180
cmd/web.go
180
cmd/web.go
@@ -5,6 +5,7 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io/ioutil"
|
||||
@@ -21,14 +22,19 @@ import (
|
||||
"github.com/macaron-contrib/captcha"
|
||||
"github.com/macaron-contrib/csrf"
|
||||
"github.com/macaron-contrib/i18n"
|
||||
"github.com/macaron-contrib/oauth2"
|
||||
"github.com/macaron-contrib/session"
|
||||
"github.com/macaron-contrib/toolbox"
|
||||
"gopkg.in/ini.v1"
|
||||
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/auth"
|
||||
"github.com/gogits/gogs/modules/auth/apiv1"
|
||||
"github.com/gogits/gogs/modules/avatar"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/bindata"
|
||||
"github.com/gogits/gogs/modules/git"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/middleware"
|
||||
@@ -48,13 +54,22 @@ var CmdWeb = cli.Command{
|
||||
Description: `Gogs web server is the only thing you need to run,
|
||||
and it takes care of all the other things for you`,
|
||||
Action: runWeb,
|
||||
Flags: []cli.Flag{},
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{"port, p", "3000", "Temporary port number to prevent conflict", ""},
|
||||
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""},
|
||||
},
|
||||
}
|
||||
|
||||
type VerChecker struct {
|
||||
ImportPath string
|
||||
Version func() string
|
||||
Expected string
|
||||
}
|
||||
|
||||
// checkVersion checks if binary matches the version of templates files.
|
||||
func checkVersion() {
|
||||
// Templates.
|
||||
data, err := ioutil.ReadFile(path.Join(setting.StaticRootPath, "templates/.VERSION"))
|
||||
data, err := ioutil.ReadFile(setting.StaticRootPath + "/templates/.VERSION")
|
||||
if err != nil {
|
||||
log.Fatal(4, "Fail to read 'templates/.VERSION': %v", err)
|
||||
}
|
||||
@@ -63,24 +78,29 @@ func checkVersion() {
|
||||
}
|
||||
|
||||
// Check dependency version.
|
||||
macaronVer := git.MustParseVersion(strings.Join(strings.Split(macaron.Version(), ".")[:3], "."))
|
||||
if macaronVer.LessThan(git.MustParseVersion("0.4.2")) {
|
||||
log.Fatal(4, "Package macaron version is too old, did you forget to update?(github.com/Unknwon/macaron)")
|
||||
checkers := []VerChecker{
|
||||
{"github.com/Unknwon/macaron", macaron.Version, "0.5.4"},
|
||||
{"github.com/macaron-contrib/binding", binding.Version, "0.1.0"},
|
||||
{"github.com/macaron-contrib/cache", cache.Version, "0.0.7"},
|
||||
{"github.com/macaron-contrib/csrf", csrf.Version, "0.0.3"},
|
||||
{"github.com/macaron-contrib/i18n", i18n.Version, "0.0.7"},
|
||||
{"github.com/macaron-contrib/session", session.Version, "0.1.6"},
|
||||
{"gopkg.in/ini.v1", ini.Version, "1.3.4"},
|
||||
}
|
||||
i18nVer := git.MustParseVersion(i18n.Version())
|
||||
if i18nVer.LessThan(git.MustParseVersion("0.0.2")) {
|
||||
log.Fatal(4, "Package i18n version is too old, did you forget to update?(github.com/macaron-contrib/i18n)")
|
||||
}
|
||||
sessionVer := git.MustParseVersion(session.Version())
|
||||
if sessionVer.LessThan(git.MustParseVersion("0.0.5")) {
|
||||
log.Fatal(4, "Package session version is too old, did you forget to update?(github.com/macaron-contrib/session)")
|
||||
for _, c := range checkers {
|
||||
ver := strings.Join(strings.Split(c.Version(), ".")[:3], ".")
|
||||
if git.MustParseVersion(ver).LessThan(git.MustParseVersion(c.Expected)) {
|
||||
log.Fatal(4, "Package '%s' version is too old(%s -> %s), did you forget to update?", c.ImportPath, ver, c.Expected)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// newMacaron initializes Macaron instance.
|
||||
func newMacaron() *macaron.Macaron {
|
||||
m := macaron.New()
|
||||
m.Use(macaron.Logger())
|
||||
if !setting.DisableRouterLog {
|
||||
m.Use(macaron.Logger())
|
||||
}
|
||||
m.Use(macaron.Recovery())
|
||||
if setting.EnableGzip {
|
||||
m.Use(macaron.Gziper())
|
||||
@@ -91,7 +111,14 @@ func newMacaron() *macaron.Macaron {
|
||||
m.Use(macaron.Static(
|
||||
path.Join(setting.StaticRootPath, "public"),
|
||||
macaron.StaticOptions{
|
||||
SkipLogging: !setting.DisableRouterLog,
|
||||
SkipLogging: setting.DisableRouterLog,
|
||||
},
|
||||
))
|
||||
m.Use(macaron.Static(
|
||||
setting.AvatarUploadPath,
|
||||
macaron.StaticOptions{
|
||||
Prefix: "avatars",
|
||||
SkipLogging: setting.DisableRouterLog,
|
||||
},
|
||||
))
|
||||
m.Use(macaron.Renderer(macaron.RenderOptions{
|
||||
@@ -99,27 +126,33 @@ func newMacaron() *macaron.Macaron {
|
||||
Funcs: []template.FuncMap{base.TemplateFuncs},
|
||||
IndentJSON: macaron.Env != macaron.PROD,
|
||||
}))
|
||||
|
||||
localeNames, err := bindata.AssetDir("conf/locale")
|
||||
if err != nil {
|
||||
log.Fatal(4, "Fail to list locale files: %v", err)
|
||||
}
|
||||
localFiles := make(map[string][]byte)
|
||||
for _, name := range localeNames {
|
||||
localFiles[name] = bindata.MustAsset("conf/locale/" + name)
|
||||
}
|
||||
m.Use(i18n.I18n(i18n.Options{
|
||||
SubURL: setting.AppSubUrl,
|
||||
Directory: path.Join(setting.ConfRootPath, "locale"),
|
||||
Files: localFiles,
|
||||
CustomDirectory: path.Join(setting.CustomPath, "conf/locale"),
|
||||
Langs: setting.Langs,
|
||||
Names: setting.Names,
|
||||
Redirect: true,
|
||||
}))
|
||||
m.Use(cache.Cacher(cache.Options{
|
||||
Adapter: setting.CacheAdapter,
|
||||
Interval: setting.CacheInternal,
|
||||
Conn: setting.CacheConn,
|
||||
Adapter: setting.CacheAdapter,
|
||||
AdapterConfig: setting.CacheConn,
|
||||
Interval: setting.CacheInternal,
|
||||
}))
|
||||
m.Use(captcha.Captchaer(captcha.Options{
|
||||
SubURL: setting.AppSubUrl,
|
||||
}))
|
||||
m.Use(session.Sessioner(session.Options{
|
||||
Provider: setting.SessionProvider,
|
||||
Config: *setting.SessionConfig,
|
||||
}))
|
||||
m.Use(csrf.Generate(csrf.Options{
|
||||
m.Use(session.Sessioner(setting.SessionConfig))
|
||||
m.Use(csrf.Csrfer(csrf.Options{
|
||||
Secret: setting.SecretKey,
|
||||
SetCookie: true,
|
||||
Header: "X-Csrf-Token",
|
||||
@@ -133,11 +166,21 @@ func newMacaron() *macaron.Macaron {
|
||||
},
|
||||
},
|
||||
}))
|
||||
|
||||
// OAuth 2.
|
||||
if setting.OauthService != nil {
|
||||
for _, info := range setting.OauthService.OauthInfos {
|
||||
m.Use(oauth2.NewOAuth2Provider(info.Options, info.AuthUrl, info.TokenUrl))
|
||||
}
|
||||
}
|
||||
m.Use(middleware.Contexter())
|
||||
return m
|
||||
}
|
||||
|
||||
func runWeb(*cli.Context) {
|
||||
func runWeb(ctx *cli.Context) {
|
||||
if ctx.IsSet("config") {
|
||||
setting.CustomConf = ctx.String("config")
|
||||
}
|
||||
routers.GlobalInit()
|
||||
checkVersion()
|
||||
|
||||
@@ -154,8 +197,9 @@ func runWeb(*cli.Context) {
|
||||
// Routers.
|
||||
m.Get("/", ignSignIn, routers.Home)
|
||||
m.Get("/explore", ignSignIn, routers.Explore)
|
||||
m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install)
|
||||
m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost)
|
||||
m.Combo("/install", routers.InstallInit).
|
||||
Get(routers.Install).
|
||||
Post(bindIgnErr(auth.InstallForm{}), routers.InstallPost)
|
||||
m.Group("", func() {
|
||||
m.Get("/pulls", user.Pulls)
|
||||
m.Get("/issues", user.Issues)
|
||||
@@ -183,29 +227,30 @@ func runWeb(*cli.Context) {
|
||||
})
|
||||
|
||||
// Repositories.
|
||||
m.Get("/user/repos", middleware.ApiReqToken(), v1.ListMyRepos)
|
||||
m.Combo("/user/repos", middleware.ApiReqToken()).Get(v1.ListMyRepos).Post(bind(api.CreateRepoOption{}), v1.CreateRepo)
|
||||
m.Post("/org/:org/repos", middleware.ApiReqToken(), bind(api.CreateRepoOption{}), v1.CreateOrgRepo)
|
||||
m.Group("/repos", func() {
|
||||
m.Get("/search", v1.SearchRepos)
|
||||
m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), v1.Migrate)
|
||||
m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), v1.MigrateRepo)
|
||||
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Combo("/hooks").Get(v1.ListRepoHooks).Post(bind(v1.CreateRepoHookForm{}), v1.CreateRepoHook)
|
||||
m.Patch("/hooks/:id:int", bind(v1.EditRepoHookForm{}), v1.EditRepoHook)
|
||||
m.Combo("/hooks").Get(v1.ListRepoHooks).Post(bind(api.CreateHookOption{}), v1.CreateRepoHook)
|
||||
m.Patch("/hooks/:id:int", bind(api.EditHookOption{}), v1.EditRepoHook)
|
||||
m.Get("/raw/*", middleware.RepoRef(), v1.GetRepoRawFile)
|
||||
}, middleware.ApiRepoAssignment(), middleware.ApiReqToken())
|
||||
})
|
||||
|
||||
m.Any("/*", func(ctx *middleware.Context) {
|
||||
ctx.JSON(404, &base.ApiJsonErr{"Not Found", base.DOC_URL})
|
||||
ctx.HandleAPI(404, "Page not found")
|
||||
})
|
||||
})
|
||||
})
|
||||
}, ignSignIn)
|
||||
|
||||
// User.
|
||||
m.Group("/user", func() {
|
||||
m.Get("/login", user.SignIn)
|
||||
m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost)
|
||||
m.Get("/login/:name", user.SocialSignIn)
|
||||
m.Get("/info/:name", user.SocialSignIn)
|
||||
m.Get("/sign_up", user.SignUp)
|
||||
m.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost)
|
||||
m.Get("/reset_password", user.ResetPasswd)
|
||||
@@ -214,6 +259,9 @@ func runWeb(*cli.Context) {
|
||||
m.Group("/user/settings", func() {
|
||||
m.Get("", user.Settings)
|
||||
m.Post("", bindIgnErr(auth.UpdateProfileForm{}), user.SettingsPost)
|
||||
m.Post("/avatar", binding.MultipartForm(auth.UploadAvatarForm{}), user.SettingsAvatar)
|
||||
m.Get("/email", user.SettingsEmails)
|
||||
m.Post("/email", bindIgnErr(auth.AddEmailForm{}), user.SettingsEmailPost)
|
||||
m.Get("/password", user.SettingsPassword)
|
||||
m.Post("/password", bindIgnErr(auth.ChangePasswordForm{}), user.SettingsPasswordPost)
|
||||
m.Get("/ssh", user.SettingsSSHKeys)
|
||||
@@ -225,6 +273,7 @@ func runWeb(*cli.Context) {
|
||||
m.Group("/user", func() {
|
||||
// r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds)
|
||||
m.Any("/activate", user.Activate)
|
||||
m.Any("/activate_email", user.ActivateEmail)
|
||||
m.Get("/email2user", user.Email2User)
|
||||
m.Get("/forget_password", user.ForgotPasswd)
|
||||
m.Post("/forget_password", user.ForgotPasswdPost)
|
||||
@@ -281,7 +330,7 @@ func runWeb(*cli.Context) {
|
||||
m.Get("/template/*", dev.TemplatePreview)
|
||||
}
|
||||
|
||||
reqTrueOwner := middleware.RequireTrueOwner()
|
||||
reqAdmin := middleware.RequireAdmin()
|
||||
|
||||
// Organization.
|
||||
m.Group("/org", func() {
|
||||
@@ -325,7 +374,7 @@ func runWeb(*cli.Context) {
|
||||
}, reqSignIn)
|
||||
m.Group("/org", func() {
|
||||
m.Get("/:org", org.Home)
|
||||
}, middleware.OrgAssignment(true))
|
||||
}, ignSignIn, middleware.OrgAssignment(true))
|
||||
|
||||
// Repository.
|
||||
m.Group("/repo", func() {
|
||||
@@ -356,7 +405,7 @@ func runWeb(*cli.Context) {
|
||||
m.Post("/:name", repo.GitHooksEditPost)
|
||||
}, middleware.GitHookService())
|
||||
})
|
||||
}, reqSignIn, middleware.RepoAssignment(true), reqTrueOwner)
|
||||
}, reqSignIn, middleware.RepoAssignment(true), reqAdmin)
|
||||
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Get("/action/:action", repo.Action)
|
||||
@@ -369,34 +418,42 @@ func runWeb(*cli.Context) {
|
||||
m.Post("/:index/milestone", repo.UpdateIssueMilestone)
|
||||
m.Post("/:index/assignee", repo.UpdateAssignee)
|
||||
m.Get("/:index/attachment/:id", repo.IssueGetAttachment)
|
||||
m.Post("/labels/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel)
|
||||
m.Post("/labels/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel)
|
||||
m.Post("/labels/delete", repo.DeleteLabel)
|
||||
m.Get("/milestones/new", repo.NewMilestone)
|
||||
m.Post("/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost)
|
||||
m.Get("/milestones/:index/edit", repo.UpdateMilestone)
|
||||
m.Post("/milestones/:index/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.UpdateMilestonePost)
|
||||
m.Get("/milestones/:index/:action", repo.UpdateMilestone)
|
||||
})
|
||||
m.Group("/labels", func() {
|
||||
m.Post("/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel)
|
||||
m.Post("/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel)
|
||||
m.Post("/delete", repo.DeleteLabel)
|
||||
})
|
||||
m.Group("/milestones", func() {
|
||||
m.Get("/new", repo.NewMilestone)
|
||||
m.Post("/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost)
|
||||
m.Get("/:index/edit", repo.UpdateMilestone)
|
||||
m.Post("/:index/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.UpdateMilestonePost)
|
||||
m.Get("/:index/:action", repo.UpdateMilestone)
|
||||
})
|
||||
|
||||
m.Post("/comment/:action", repo.Comment)
|
||||
m.Get("/releases/new", repo.NewRelease)
|
||||
m.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
|
||||
m.Get("/releases/edit/:tagname", repo.EditRelease)
|
||||
m.Post("/releases/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost)
|
||||
|
||||
m.Group("/releases", func() {
|
||||
m.Get("/new", repo.NewRelease)
|
||||
m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
|
||||
m.Get("/edit/:tagname", repo.EditRelease)
|
||||
m.Post("/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost)
|
||||
}, middleware.RepoRef())
|
||||
}, reqSignIn, middleware.RepoAssignment(true))
|
||||
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Get("/releases", repo.Releases)
|
||||
m.Get("/issues", repo.Issues)
|
||||
m.Get("/releases", middleware.RepoRef(), repo.Releases)
|
||||
m.Get("/issues", repo.RetrieveLabels, repo.Issues)
|
||||
m.Get("/issues/:index", repo.ViewIssue)
|
||||
m.Get("/issues/milestones", repo.Milestones)
|
||||
m.Get("/labels/", repo.RetrieveLabels, repo.Labels)
|
||||
m.Get("/milestones", repo.Milestones)
|
||||
m.Get("/pulls", repo.Pulls)
|
||||
m.Get("/branches", repo.Branches)
|
||||
m.Get("/archive/*", repo.Download)
|
||||
m.Get("/issues2/", repo.Issues2)
|
||||
m.Get("/pulls2/", repo.PullRequest2)
|
||||
m.Get("/labels2/", repo.Labels2)
|
||||
m.Get("/milestone2/", repo.Milestones2)
|
||||
m.Head("/hooks/trigger", repo.TriggerHook)
|
||||
|
||||
m.Group("", func() {
|
||||
m.Get("/src/*", repo.Home)
|
||||
@@ -409,14 +466,18 @@ func runWeb(*cli.Context) {
|
||||
}, ignSignIn, middleware.RepoAssignment(true))
|
||||
|
||||
m.Group("/:username", func() {
|
||||
m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef(), repo.Home)
|
||||
m.Group("/:reponame", func() {
|
||||
m.Get("", repo.Home)
|
||||
m.Get(".git", repo.Home)
|
||||
}, ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef())
|
||||
|
||||
m.Any("/:reponame/*", ignSignInAndCsrf, repo.Http)
|
||||
})
|
||||
|
||||
// robots.txt
|
||||
m.Get("/robots.txt", func(ctx *middleware.Context) {
|
||||
if setting.HasRobotsTxt {
|
||||
ctx.ServeFile(path.Join(setting.CustomPath, "robots.txt"))
|
||||
ctx.ServeFileContent(path.Join(setting.CustomPath, "robots.txt"))
|
||||
} else {
|
||||
ctx.Error(404)
|
||||
}
|
||||
@@ -425,6 +486,12 @@ func runWeb(*cli.Context) {
|
||||
// Not found handler.
|
||||
m.NotFound(routers.NotFound)
|
||||
|
||||
// Flag for port number in case first time run conflict.
|
||||
if ctx.IsSet("port") {
|
||||
setting.AppUrl = strings.Replace(setting.AppUrl, setting.HttpPort, ctx.String("port"), 1)
|
||||
setting.HttpPort = ctx.String("port")
|
||||
}
|
||||
|
||||
var err error
|
||||
listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort)
|
||||
log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubUrl)
|
||||
@@ -432,7 +499,8 @@ func runWeb(*cli.Context) {
|
||||
case setting.HTTP:
|
||||
err = http.ListenAndServe(listenAddr, m)
|
||||
case setting.HTTPS:
|
||||
err = http.ListenAndServeTLS(listenAddr, setting.CertFile, setting.KeyFile, m)
|
||||
server := &http.Server{Addr: listenAddr, TLSConfig: &tls.Config{MinVersion: tls.VersionTLS10}, Handler: m}
|
||||
err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile)
|
||||
case setting.FCGI:
|
||||
err = fcgi.Serve(nil, m)
|
||||
default:
|
||||
|
||||
7
conf/README
Normal file
7
conf/README
Normal file
@@ -0,0 +1,7 @@
|
||||
Execute following command in ROOT directory when anything is changed:
|
||||
|
||||
$ go-bindata -o=modules/bindata/bindata.go -ignore="\\.DS_Store|README" -pkg=bindata conf/...
|
||||
|
||||
Add -debug flag to make life easier in development(somehow isn't working):
|
||||
|
||||
$ go-bindata -debug -o=modules/bindata/bindata.go -ignore="\\.DS_Store|README" -pkg=bindata conf/...
|
||||
77
conf/app.ini
77
conf/app.ini
@@ -1,3 +1,6 @@
|
||||
# NEVER EVER MODIFY THIS FILE
|
||||
# PLEASE MAKE CHANGES ON CORRESPONDING CUSTOM CONFIG FILE
|
||||
|
||||
; App name that shows on every page title
|
||||
APP_NAME = Gogs: Go Git Service
|
||||
; Change it if you run locally
|
||||
@@ -9,12 +12,18 @@ RUN_MODE = dev
|
||||
ROOT =
|
||||
SCRIPT_TYPE = bash
|
||||
|
||||
[ui]
|
||||
; Number of issues that are showed in one page
|
||||
ISSUE_PAGING_NUM = 10
|
||||
|
||||
[server]
|
||||
PROTOCOL = http
|
||||
DOMAIN = localhost
|
||||
ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
|
||||
HTTP_ADDR =
|
||||
HTTP_PORT = 3000
|
||||
; Disable SSH feature when not available
|
||||
DISABLE_SSH = false
|
||||
SSH_PORT = 22
|
||||
; Disable CDN even in "prod" mode
|
||||
OFFLINE_MODE = false
|
||||
@@ -22,6 +31,11 @@ DISABLE_ROUTER_LOG = false
|
||||
; Generate steps:
|
||||
; $ cd path/to/gogs/custom/https
|
||||
; $ ./gogs cert -ca=true -duration=8760h0m0s -host=myhost.example.com
|
||||
;
|
||||
; Or from a .pfx file exported from the Windows certificate store (do
|
||||
; not forget to export the private key):
|
||||
; $ openssl pkcs12 -in cert.pfx -out cert.pem -nokeys
|
||||
; $ openssl pkcs12 -in cert.pfx -out key.pem -nocerts -nodes
|
||||
CERT_FILE = custom/https/cert.pem
|
||||
KEY_FILE = custom/https/key.pem
|
||||
; Upper level of template and static file path
|
||||
@@ -29,6 +43,8 @@ KEY_FILE = custom/https/key.pem
|
||||
STATIC_ROOT_PATH =
|
||||
; Application level GZIP support
|
||||
ENABLE_GZIP = false
|
||||
; Landing page for non-logged users, can be "home" or "explore"
|
||||
LANDING_PAGE = home
|
||||
|
||||
[database]
|
||||
; Either "mysql", "postgres" or "sqlite3", it's your choice
|
||||
@@ -70,12 +86,17 @@ ENABLE_CACHE_AVATAR = false
|
||||
ENABLE_NOTIFY_MAIL = false
|
||||
; More detail: https://github.com/gogits/gogs/issues/165
|
||||
ENABLE_REVERSE_PROXY_AUTHENTICATION = false
|
||||
ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false
|
||||
; Do not check minimum key size with corresponding type
|
||||
DISABLE_MINIMUM_KEY_SIZE_CHECK = false
|
||||
|
||||
[webhook]
|
||||
; Cron task interval in minutes
|
||||
TASK_INTERVAL = 1
|
||||
; Hook task queue length
|
||||
QUEUE_LENGTH = 1000
|
||||
; Deliver timeout in seconds
|
||||
DELIVER_TIMEOUT = 5
|
||||
; Allow insecure certification
|
||||
SKIP_TLS_VERIFY = false
|
||||
|
||||
[mailer]
|
||||
ENABLED = false
|
||||
@@ -86,8 +107,19 @@ SUBJECT = %(APP_NAME)s
|
||||
; Mail server
|
||||
; Gmail: smtp.gmail.com:587
|
||||
; QQ: smtp.qq.com:25
|
||||
HOST =
|
||||
; Mail from address
|
||||
; Note, if the port ends with "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. If the server supports STARTTLS it will always be used.
|
||||
HOST =
|
||||
; Disable HELO operation when hostname are different.
|
||||
DISABLE_HELO =
|
||||
; Custom hostname for HELO operation, default is from system.
|
||||
HELO_HOSTNAME =
|
||||
; Do not verify the certificate of the server. Only use this for self-signed certificates
|
||||
SKIP_VERIFY =
|
||||
; Use client certificate
|
||||
USE_CERTIFICATE = false
|
||||
CERT_FILE = custom/mailer/cert.pem
|
||||
KEY_FILE = custom/mailer/key.pem
|
||||
; Mail from address, RFC 5322. This can be just an email address, or the `"Name" <email@example.com>` format
|
||||
FROM =
|
||||
; Mailer user name and password
|
||||
USER =
|
||||
@@ -118,13 +150,10 @@ TOKEN_URL = https://accounts.google.com/o/oauth2/token
|
||||
ENABLED = false
|
||||
CLIENT_ID =
|
||||
CLIENT_SECRET =
|
||||
SCOPES = all
|
||||
SCOPES = get_user_info
|
||||
; QQ 互联
|
||||
; AUTH_URL = https://graph.qq.com/oauth2.0/authorize
|
||||
; TOKEN_URL = https://graph.qq.com/oauth2.0/token
|
||||
; Tencent weibo
|
||||
AUTH_URL = https://open.t.qq.com/cgi-bin/oauth2/authorize
|
||||
TOKEN_URL = https://open.t.qq.com/cgi-bin/oauth2/access_token
|
||||
AUTH_URL = https://graph.qq.com/oauth2.0/authorize
|
||||
TOKEN_URL = https://graph.qq.com/oauth2.0/token
|
||||
|
||||
[oauth.weibo]
|
||||
ENABLED = false
|
||||
@@ -140,17 +169,17 @@ ADAPTER = memory
|
||||
; For "memory" only, GC interval in seconds, default is 60
|
||||
INTERVAL = 60
|
||||
; For "redis" and "memcache", connection host address
|
||||
; redis: `:6039`
|
||||
; redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180
|
||||
; memcache: `127.0.0.1:11211`
|
||||
HOST =
|
||||
|
||||
[session]
|
||||
; Either "memory", "file", "redis" or "mysql", default is "memory"
|
||||
PROVIDER = file
|
||||
PROVIDER = memory
|
||||
; Provider config options
|
||||
; memory: not have any config yet
|
||||
; file: session file path, e.g. `data/sessions`
|
||||
; redis: config like redis server addr, poolSize, password, e.g. `127.0.0.1:6379,100,gogs`
|
||||
; redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180
|
||||
; mysql: go-sql-driver/mysql dsn config string, e.g. `root:password@/session_table`
|
||||
PROVIDER_CONFIG = data/sessions
|
||||
; Session cookie name
|
||||
@@ -167,6 +196,7 @@ SESSION_LIFE_TIME = 86400
|
||||
[picture]
|
||||
; The place to picture data, either "server" or "qiniu", default is "server"
|
||||
SERVICE = server
|
||||
AVATAR_UPLOAD_PATH = data/avatars
|
||||
; Chinese users can choose "duoshuo"
|
||||
GRAVATAR_SOURCE = gravatar
|
||||
DISABLE_GRAVATAR = false
|
||||
@@ -251,8 +281,23 @@ DRIVER =
|
||||
CONN =
|
||||
|
||||
[git]
|
||||
MAX_GITDIFF_LINES = 10000
|
||||
MAX_GIT_DIFF_LINES = 10000
|
||||
; Arguments for command 'git gc', e.g.: "--aggressive --auto"
|
||||
; see more on http://git-scm.com/docs/git-gc/1.7.5
|
||||
GC_ARGS =
|
||||
|
||||
; Git health check.
|
||||
[git.fsck]
|
||||
ENABLE = true
|
||||
; Execution interval in hours. Default is 24.
|
||||
INTERVAL = 24
|
||||
; Arguments for command 'git fsck', e.g.: "--unreachable --tags"
|
||||
; see more on http://git-scm.com/docs/git-fsck/1.7.5
|
||||
ARGS =
|
||||
|
||||
[i18n]
|
||||
LANGS = en-US,zh-CN,zh-HK,de-DE,fr-CA,nl-NL
|
||||
NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands
|
||||
LANGS = en-US,zh-CN,zh-HK,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT
|
||||
NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский,日本语,Español,Português,Polski,български,Italiano
|
||||
|
||||
[other]
|
||||
SHOW_FOOTER_BRANDING = false
|
||||
Binary file not shown.
13
conf/gitignore/PHP CakePHP
Normal file
13
conf/gitignore/PHP CakePHP
Normal file
@@ -0,0 +1,13 @@
|
||||
# CakePHP 3
|
||||
|
||||
/vendor/*
|
||||
/config/app.php
|
||||
/tmp/*
|
||||
/logs/*
|
||||
|
||||
# CakePHP 2
|
||||
|
||||
/app/tmp/*
|
||||
/app/Config/core.php
|
||||
/app/Config/database.php
|
||||
/vendors/*
|
||||
2
conf/gitignore/PHP FuelPHP
Normal file
2
conf/gitignore/PHP FuelPHP
Normal file
@@ -0,0 +1,2 @@
|
||||
fuel/app/logs/*/*/*
|
||||
fuel/app/cache/*/*
|
||||
4
conf/gitignore/PHP Laravel
Normal file
4
conf/gitignore/PHP Laravel
Normal file
@@ -0,0 +1,4 @@
|
||||
/bootstrap/compiled.php
|
||||
.env.*.php
|
||||
.env.php
|
||||
.env
|
||||
37
conf/gitignore/PHP Symfony
Normal file
37
conf/gitignore/PHP Symfony
Normal file
@@ -0,0 +1,37 @@
|
||||
# Cache and logs (Symfony2)
|
||||
/app/cache/*
|
||||
/app/logs/*
|
||||
!app/cache/.gitkeep
|
||||
!app/logs/.gitkeep
|
||||
|
||||
# Cache and logs (Symfony3)
|
||||
/var/cache/*
|
||||
/var/logs/*
|
||||
!var/cache/.gitkeep
|
||||
!var/logs/.gitkeep
|
||||
|
||||
# Parameters
|
||||
/app/config/parameters.yml
|
||||
/app/config/parameters.ini
|
||||
|
||||
# Managed by Composer
|
||||
/app/bootstrap.php.cache
|
||||
/var/bootstrap.php.cache
|
||||
/bin/*
|
||||
!bin/console
|
||||
!bin/symfony_requirements
|
||||
/vendor/
|
||||
|
||||
# Assets and user uploads
|
||||
/web/bundles/
|
||||
/web/uploads/
|
||||
|
||||
# PHPUnit
|
||||
/app/phpunit.xml
|
||||
/phpunit.xml
|
||||
|
||||
# Build data
|
||||
/build/
|
||||
|
||||
# Composer PHAR
|
||||
/composer.phar
|
||||
6
conf/gitignore/PHP Yii
Normal file
6
conf/gitignore/PHP Yii
Normal file
@@ -0,0 +1,6 @@
|
||||
assets/*
|
||||
!assets/.gitignore
|
||||
protected/runtime/*
|
||||
!protected/runtime/.gitignore
|
||||
protected/data/*.db
|
||||
themes/classic/views/
|
||||
20
conf/gitignore/PHP ZendFramework
Normal file
20
conf/gitignore/PHP ZendFramework
Normal file
@@ -0,0 +1,20 @@
|
||||
# Composer files
|
||||
composer.phar
|
||||
vendor/
|
||||
|
||||
# Local configs
|
||||
config/autoload/*.local.php
|
||||
|
||||
# Binary gettext files
|
||||
*.mo
|
||||
|
||||
# Data
|
||||
data/logs/
|
||||
data/cache/
|
||||
data/sessions/
|
||||
data/tmp/
|
||||
temp/
|
||||
|
||||
# Legacy ZF1
|
||||
demos/
|
||||
extras/documentation
|
||||
16
conf/locale/TRANSLATORS
Normal file
16
conf/locale/TRANSLATORS
Normal file
@@ -0,0 +1,16 @@
|
||||
# This file lists all PUBLIC individuals having contributed content to the translation.
|
||||
# Order of name is meaningless.
|
||||
|
||||
Akihiro YAGASAKI <yaggytter@momiage.com>
|
||||
Alexander Steinhöfer <kontakt@lx-s.de>
|
||||
Christoph Kisfeld <christoph.kisfeld@gmail.com>
|
||||
Daniel Speichert <daniel@speichert.pl>
|
||||
Huimin Wang <wanghm2009@hotmail.co.jp>
|
||||
ilko <email>
|
||||
Thomas Fanninger <gogs.thomas@fanninger.at>
|
||||
Łukasz Jan Niemier <lukasz@niemier.pl>
|
||||
Lafriks <lafriks@gmail.com>
|
||||
Luc Stepniewski <luc@stepniewski.fr>
|
||||
Miguel de la Cruz <miguel@mcrx.me>
|
||||
Natan Albuquerque <natanalbuquerque5@gmail.com>
|
||||
Marc Schiller <marc@schiller.im>
|
||||
798
conf/locale/locale_bg-BG.ini
Executable file
798
conf/locale/locale_bg-BG.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Удобна услуга за самостоятелни Git услуги, написана на Go
|
||||
|
||||
home=Начало
|
||||
dashboard=Табло
|
||||
explore=Разгледай
|
||||
help=Помощ
|
||||
sign_in=Влизане
|
||||
social_sign_in=Вход чрез социална мрежа: 2. стъпка <small>асоцииране на акаунт</small>
|
||||
sign_out=Излизане
|
||||
sign_up=Регистрирайте се
|
||||
register=Регистриране
|
||||
website=Уебсайт
|
||||
version=Версия
|
||||
page=Страница
|
||||
template=Шаблон
|
||||
language=Език
|
||||
|
||||
username=Потребителско име
|
||||
email=Електронна поща
|
||||
password=Парола
|
||||
re_type=Въведете отново
|
||||
captcha=Captcha
|
||||
|
||||
repository=Хранилище
|
||||
organization=Организация
|
||||
mirror=Mirror
|
||||
new_repo=Ново хранилище
|
||||
new_migrate=Нова миграция
|
||||
new_fork=Създаване на нов форк на хранилището
|
||||
new_org=Нова организация
|
||||
manage_org=Управление на организации
|
||||
admin_panel=Админ панел
|
||||
account_settings=Настройки на профила
|
||||
settings=Настройки
|
||||
|
||||
news_feed=Емисия новини
|
||||
pull_requests=Pull Requests
|
||||
issues=Проблеми
|
||||
|
||||
cancel=Отказ
|
||||
|
||||
[search]
|
||||
search=Търсене...
|
||||
repository=Хранилище
|
||||
user=Потребител
|
||||
issue=Проблем
|
||||
code=Код
|
||||
|
||||
[install]
|
||||
install=Инсталация
|
||||
title=Стъпки за инсталиране при първоначално стартиране
|
||||
requite_db_desc=Gogs изисква MySQL, PostgreSQL или SQLite3.
|
||||
db_title=Настройки на базата данни
|
||||
db_type=Тип на база данни
|
||||
host=Хост
|
||||
user=Потребител
|
||||
password=Парола
|
||||
db_name=Име на база данни
|
||||
db_helper=Моля, използвайте INNODB engine с utf8_general_ci charset за MySQL.
|
||||
ssl_mode=Режим SSL
|
||||
path=Път
|
||||
sqlite_helper=Пък към файла на SQLite3 база данни.
|
||||
err_empty_sqlite_path=Пътят за SQLite3 база за данни не може да е празен.
|
||||
|
||||
general_title=Общи настройки на Gogs
|
||||
app_name=Име на програмата
|
||||
app_name_helper=Постави името на твоята организация тук - голямо е крещящо!
|
||||
repo_path=Основен път към хранилището
|
||||
repo_path_helper=Всички отдалечени хранилища ще бъдат съхранени в тази папка.
|
||||
run_user=Run User
|
||||
run_user_helper=The user must have access to Repository Root Path and run Gogs.
|
||||
domain=Домейн
|
||||
domain_helper=Това влияе на URL-адреса за клониране по SSH.
|
||||
http_port=HTTP порт
|
||||
http_port_helper=Порт, на който програмата ще слуша.
|
||||
app_url=URL на програмата
|
||||
app_url_helper=Този параметър влияе на URL на HTTP/HTTPS и понякога на адреса на електронната поща.
|
||||
|
||||
optional_title=Опционални настройки
|
||||
email_title=Настройка на мейл услугата
|
||||
smtp_host=SMTP хост
|
||||
smtp_from=От
|
||||
smtp_from_helper=Писмо от адрес, RFC 5322. Тя може да бъде мейл адрес или на < email@example.com > формат.
|
||||
mailer_user=Адрес на изпращача
|
||||
mailer_password=Парола на изпращача
|
||||
register_confirm=Включи потвърждението на регистрациите
|
||||
mail_notify=Включи оповестяването по пощата
|
||||
server_service_title=Настройки на сървъра и други услуги
|
||||
offline_mode=Включи офлайн режима
|
||||
offline_mode_popup=Забранете CDN дори в режим production, всички ресурсни файлове ще бъдат връчени локално.
|
||||
disable_registration=Изключи саморегистрацията
|
||||
disable_registration_popup=Изключи потребителската саморегистрация, само администратор може да създава профили.
|
||||
require_sign_in_view=Изисквай вписване за преглед на страниците
|
||||
require_sign_in_view_popup=Само вписани потребители могат да виждат страниците, посетителите виждат само страниците за регистрация и вход.
|
||||
admin_setting_desc=Няма Нужда да създавате администраторски акаунт в момента - потребителя с ID 1 получава администраторски достъп автоматично.
|
||||
admin_title=Настройки на акаунта на администратора
|
||||
admin_name=Потребителско име
|
||||
admin_password=Парола
|
||||
confirm_password=Потвърждение на паролата
|
||||
admin_email=Електронна поща
|
||||
install_gogs=Инсталирай Gogs
|
||||
test_git_failed=Неуспех при тестването на "git" команда: %v
|
||||
sqlite3_not_available=Вашата версия не поддържа SQLite3, моля, изтеглете официалната двоичен версия от %s, а не gobuild версия.
|
||||
invalid_db_setting=Настройките на базата данни не са правилни: %v
|
||||
invalid_repo_path=Главният път за хранилището е невалиден: %v
|
||||
run_user_not_match=Потребителя пуснал приложението не е текущия потребител: %s -> %s
|
||||
save_config_failed=Неуспех при запазване на конфигурацията: %v
|
||||
invalid_admin_setting=Настройките за акаунта на администратора е невалиден: %v
|
||||
install_success=Добре дошли! Ние се радваме, че сте избрали Gogs. Приятно ползване!
|
||||
|
||||
[home]
|
||||
uname_holder=Потребителско име или имейл
|
||||
password_holder=Парола
|
||||
switch_dashboard_context=Превключване на контекста на контролното табло
|
||||
my_repos=Моите хранилища
|
||||
collaborative_repos=Съвместни хранилища
|
||||
my_orgs=Моите организации
|
||||
my_mirrors=Моите огледала
|
||||
|
||||
[explore]
|
||||
repos=Хранилища
|
||||
|
||||
[auth]
|
||||
create_new_account=Създаване на нов акаунт
|
||||
register_hepler_msg=Вече имате регистрация? Впишете се сега!
|
||||
social_register_hepler_msg=Вече имате профил? Свържете сега!
|
||||
disable_register_prompt=За съжаление регистрацията е преустановена. Обърнете се към администратора на сайта.
|
||||
disable_register_mail=За съжаление потвърждението на регистрацията е преустановена.
|
||||
remember_me=Запомни ме
|
||||
forgot_password=Забравена парола
|
||||
forget_password=Забравена парола?
|
||||
sign_up_now=Нужда от акаунт? Регистрирайте се сега.
|
||||
confirmation_mail_sent_prompt=Нов имейл за потвърждение е бил изпратен до <b>%s</b>, моля, проверете пощенската си кутия в рамките на следващите %d часа, за да завършите процеса на регистрация.
|
||||
sign_in_email=Влез чрез своя имейл
|
||||
active_your_account=Активиране на акаунта
|
||||
resent_limit_prompt=За съжаление вие вече имате имейл за активация. Моля изчакайте 3 минути, след което опитайте отново.
|
||||
has_unconfirmed_mail=Здравейте %s, имате непотвърден имейл адрес (<b>%s</b>). Ако не сте получили имейл за потвърждение или имате нужда да се изпрати нов, моля, кликнете върху бутона по-долу.
|
||||
resend_mail=Щракнете тук, за да изпратите наново имейл за активиране
|
||||
email_not_associate=Този имейл адрес не е свързана с никой акаунт.
|
||||
send_reset_mail=Щракнете тук, за да получите (наново) имейл за нулиране на паролата
|
||||
reset_password=Нулиране на паролата
|
||||
invalid_code=За съжаление, вашия код за потвърждение е изтекъл или не е валиден.
|
||||
reset_password_helper=Щракнете тук, за да нулирате паролата си
|
||||
password_too_short=Дължина на паролата не може да бъде по-малко от 6.
|
||||
|
||||
[modal]
|
||||
yes=Да
|
||||
no=Не
|
||||
modify=Промени
|
||||
|
||||
[form]
|
||||
UserName=Потребителско име
|
||||
RepoName=Име на хранилище
|
||||
Email=Адрес на електронната поща
|
||||
Password=Парола
|
||||
Retype=Въведете отново паролата си
|
||||
SSHTitle=Име на SSH ключ
|
||||
HttpsUrl=HTTPS URL
|
||||
PayloadUrl=Payload URL
|
||||
TeamName=Име на екипа
|
||||
AuthName=Име за ауторизация
|
||||
AdminEmail=Имейл на администратора
|
||||
|
||||
require_error="не може да бъде празен."
|
||||
alpha_dash_error=`трябва да e валидна буква, число или тире(-_).`
|
||||
alpha_dash_dot_error=`трябва да e валидна буква, число, тире(-_) или точка.`
|
||||
size_error=`трябва да е с размер %s.`
|
||||
min_size_error="трябва да съдържа поне %s знака."
|
||||
max_size_error="трябва да съдържа най-много %s знака."
|
||||
email_error=„не е валиден имейл адрес.“
|
||||
url_error="не е валиден URL адрес."
|
||||
unknown_error=Непозната грешка:
|
||||
captcha_incorrect=Captcha не съвпада.
|
||||
password_not_match=Паролата и потвърждението ѝ не съвпадат.
|
||||
|
||||
username_been_taken=Потребителското име е заето.
|
||||
repo_name_been_taken=Името на хранилището вече е заето.
|
||||
org_name_been_taken=Името на организацията вече се ползва.
|
||||
team_name_been_taken=Името на екипа вече се ползва.
|
||||
email_been_used=Този е-мейл адрес е бил вече използван.
|
||||
ssh_key_been_used=Име на публичен ключ или съдържание са били използвани.
|
||||
illegal_team_name=Името на екип съдържа недопустими знаци.
|
||||
username_password_incorrect=Потребителското име или паролата не е вярна.
|
||||
enterred_invalid_repo_name=Моля, проверете дали името на хранилището е въведено правилно.
|
||||
enterred_invalid_owner_name=Моля уверете се, че въведеното име на собственик е вярно.
|
||||
enterred_invalid_password=Моля уверете се, че въведената парола е вярна.
|
||||
user_not_exist=Даденият потребител не съществува.
|
||||
last_org_owner=Премахване на последния потребител от собственика екип не е позволено, тъй като винаги трябва да има поне един собственик в дадена организация.
|
||||
|
||||
invalid_ssh_key=За съжаление, ние не сме в състояние да удостоверим вашия SSH ключ: %s
|
||||
unable_verify_ssh_key=Gogs не може да провери вашия SSH ключ, но предполагаме, че е валиден, моля, проверете го.
|
||||
auth_failed=Неуспешно удостоверяване: %v
|
||||
|
||||
still_own_repo=Вашата регистрация все още е собственик на поне едно хранилище, вие трябва да изтриете или да ги прехвърлите първо.
|
||||
still_has_org=Вашата сметка все още има членство в най-малко една организация, вие трябва да напусне или да изтриете вашите членства първо.
|
||||
org_still_own_repo=Тази организация все още има собственост на хранилище, вие трябва да я изтриете или да я прехвърлите първо.
|
||||
|
||||
still_own_user=Тази аутентикация се ползва все още, моля премахнете я от аутентиканцията и опитайте отново.
|
||||
|
||||
target_branch_not_exist=Target branch does not exist.
|
||||
|
||||
[user]
|
||||
change_avatar=Сменете вашия аватар на gravatar.com
|
||||
change_custom_avatar=Промяна на вашия аватар в настройките
|
||||
join_on=Присъедини се на
|
||||
repositories=Хранилища
|
||||
activity=Обществена дейност
|
||||
followers=Последователи
|
||||
starred=Избрано
|
||||
following=Следване
|
||||
|
||||
form.name_reserved=Потребителското име "%s" е запазено.
|
||||
form.name_pattern_not_allowed=Потребителското име «%s» не е допустимо.
|
||||
|
||||
[settings]
|
||||
profile=Профил
|
||||
password=Парола
|
||||
ssh_keys=SSH ключове
|
||||
social=Социални профили
|
||||
applications=Приложения
|
||||
orgs=Организации
|
||||
delete=Изтриване на акаунт
|
||||
uid=UID
|
||||
|
||||
public_profile=Публичен профил
|
||||
profile_desc=Вашият имейл адрес е публичен и ще бъде използван за всеки свързани с профила ви уведомления и всички уеб базирани операции, направени чрез сайта.
|
||||
full_name=Пълно име
|
||||
website=Уебсайт
|
||||
location=Местоположение
|
||||
update_profile=Актуализиране на профила ви
|
||||
update_profile_success=Вашият профил е актуализиран успешно.
|
||||
change_username=Потребителското име е променено
|
||||
change_username_desc=Сменихте вашето потребителско име. Това ще засегне връзките сочещи към акаунта ви. Искате ли да продължите?
|
||||
continue=Продължи
|
||||
cancel=Отказ
|
||||
|
||||
enable_custom_avatar=Разреши потребителски аватар
|
||||
enable_custom_avatar_helper=Включете тази опция, за да изключите сареждането от Gravatar
|
||||
choose_new_avatar=Изберете нов аватар
|
||||
update_avatar=Обнови настройките на аватара
|
||||
uploaded_avatar_not_a_image=Каченият файл не е изображение.
|
||||
no_custom_avatar_available=Собствен аватар е забранен, включването е невъзможно.
|
||||
update_avatar_success=Настройките за аватара са обновени успешно.
|
||||
|
||||
change_password=Промени парола
|
||||
old_password=Текуща парола
|
||||
new_password=Нова парола
|
||||
password_incorrect=Въведената парола не е вярна.
|
||||
change_password_success=Вашата парола бе успешно променена. Сега можете да влезете, използвайки тази нова парола.
|
||||
|
||||
emails=Имейл адреси
|
||||
manage_emails=Управление на имейл адреси
|
||||
email_desc=Вашият основен имейл адрес ще се използва за известия и други операции.
|
||||
primary=Основен
|
||||
primary_email=Задаване като основна
|
||||
delete_email=Изтриване
|
||||
add_new_email=Добавяне на нов имейл адрес
|
||||
add_email=Добавяне на имейл
|
||||
add_email_confirmation_sent=Нов имейл за потвърждение е бил изпратен до <b>%s</b>, моля, проверете пощенската си кутия в рамките на следващите %d часа, за да завършите процеса на регистрация.
|
||||
add_email_success=Успешно беше добавен нов имейл адрес.
|
||||
|
||||
manage_ssh_keys=Управление на SSH ключове
|
||||
add_key=Добавяне на ключ
|
||||
ssh_desc=Това е списък на SSH ключове, свързани с вашия акаунт. Тъй като тези ключове позволяват на всеки, който ги използва да получи достъп до хранилищата ви, много е важно да се уверите, че ги разпознавате.
|
||||
ssh_helper=<strong>Не знам как?</strong> Проверете на GitHub упътването как да <a href="%s"> създадете свои собствени SSH ключове</a> или решаване на <a href="%s"> Общи проблеми</a>, които може да възникнат при използване на SSH.
|
||||
add_new_key=Добавите SSH ключ
|
||||
key_name=Име на ключа
|
||||
key_content=Съдържание
|
||||
add_key_success=Добавен е нов SSH ключ!
|
||||
delete_key=Изтрий
|
||||
add_on=Добавен на
|
||||
last_used=Последно използван на
|
||||
no_activity=Няма скорошна активност
|
||||
|
||||
manage_social=Управление на свързаните с тях акаунти в социални мрежи
|
||||
social_desc=Това е списък на свързаните акаунти в социални мрежи. Премахнете всички, които не разпознавате.
|
||||
unbind=Освобождаване
|
||||
unbind_success=Социалния профил е освободен.
|
||||
|
||||
manage_access_token=Управление на tokens за персонален достъп
|
||||
generate_new_token=Генерира нов маркер
|
||||
tokens_desc=Маркерите, които са генерирани и могат да бъдат ползвани за достъп до API-то на Gogs.
|
||||
new_token_desc=Всеки маркер ще има пълен достъп до вашия акаунт.
|
||||
token_name=Име на маркера
|
||||
generate_token=Генериране на маркер
|
||||
generate_token_succees=Успешно е генериран вашия маркер за достъп! Уверете се, че сте го копирали, тъй като няма да можете да го видите отново!
|
||||
delete_token=Изтриване
|
||||
delete_token_success=Този маркер за личен достъп е премахнат успешно! Не забравяйте да актуализирате вашите приложения.
|
||||
|
||||
delete_account=Изтриване на вашия акаунт
|
||||
delete_prompt=Тази операция ще изтрие вашия акаунт завинаги и <strong>няма да може</strong> да се отмени!
|
||||
confirm_delete_account=Потвърждаване на изтриването
|
||||
delete_account_title=Изтриване на акаунта
|
||||
delete_account_desc=Този акаунт ще бъде окончателно изтрит. Искате ли да продължите?
|
||||
|
||||
[repo]
|
||||
owner=Собственик
|
||||
repo_name=Име на хранилище
|
||||
repo_name_helper=Добро име на хранилище е име, състоящо от кратки, запомнящи се и уникални ключови думи.
|
||||
visibility=Видимост
|
||||
visiblity_helper=Това хранилище е <span class="label label-red label-radius"> частно</span>
|
||||
fork_repo=Fork на хранилището
|
||||
fork_from=Fork от
|
||||
fork_visiblity_helper=Не можете да промените видимостта на форкнато хранилище.
|
||||
repo_desc=Описание
|
||||
repo_lang=Език
|
||||
repo_lang_helper=Изберете .gitignore файл
|
||||
license=Лиценз
|
||||
license_helper=Изберете лицензионен файл
|
||||
init_readme=Инициализиране на това хранилище с README.md
|
||||
create_repo=Създаване на хранилище
|
||||
default_branch=Клон по подразбиране
|
||||
mirror_interval=Интервал на мирроване(часове)
|
||||
|
||||
form.name_reserved=Името на хранилището "%s" е запазено.
|
||||
form.name_pattern_not_allowed=Името на хранилище „%s“ не е позволено.
|
||||
|
||||
need_auth=Нужда от удостоверяване
|
||||
migrate_type=Тип мигриране
|
||||
migrate_type_helper=НА хранилището ще бъде създаден <span class="label label-blue label-radius">мирор</span>
|
||||
migrate_repo=Мигриране на хранилището
|
||||
migrate.clone_address=Клонирай адрес
|
||||
migrate.invalid_local_path=Невалиден път - не съществува или не е директория.
|
||||
|
||||
forked_from=Форкнато от
|
||||
fork_from_self=Не можете да форкнате хранилище което си е Ваше!
|
||||
copy_link=Копирай
|
||||
click_to_copy=Копиране в клипборда
|
||||
copied=Успешно копирано
|
||||
clone_helper=Нуждаеш се от помощ при клониране? Посети <a target="_blank" href="%s">Помощ</a>!
|
||||
unwatch=Не следи повече
|
||||
watch=Следи
|
||||
unstar=Нехаресвам
|
||||
star=Харесвам
|
||||
fork=Форк
|
||||
|
||||
no_desc=Няма описание
|
||||
quick_guide=Бърз справочник
|
||||
clone_this_repo=Клониране на хранилището
|
||||
create_new_repo_command=Създай ново хранилище чрез командния ред
|
||||
push_exist_repo=Пушни съществуващо хранилище през командния ред
|
||||
|
||||
branch=Бранч
|
||||
tree=Дърво
|
||||
branch_and_tags=Бранчове и тагове
|
||||
branches=Бранчове
|
||||
tags=Тагове
|
||||
issues=Issues
|
||||
labels=Етикети
|
||||
milestones=Етапи
|
||||
commits=Комити
|
||||
releases=Релийзи
|
||||
file_raw=Суров
|
||||
file_history=История
|
||||
file_view_raw=Прегледай в суров вид
|
||||
file_permalink=Твърса връзка
|
||||
|
||||
commits.commits=Комити
|
||||
commits.search=Търсене на комити
|
||||
commits.find=Намери
|
||||
commits.author=Автор
|
||||
commits.message=Съобщение
|
||||
commits.date=Дата
|
||||
commits.older=По-стари
|
||||
commits.newer=По-нови
|
||||
|
||||
issues.new=Нов въпрос
|
||||
issues.new_label=Нов етикет
|
||||
issues.new_label_placeholder=Име на етикет...
|
||||
issues.open_tab=%d отворени
|
||||
issues.close_tab=%d затворени
|
||||
issues.filter_label=Етикет
|
||||
issues.filter_label_no_select=Не е избран етикет
|
||||
issues.filter_milestone=Етап
|
||||
issues.filter_assignee=Назначена на
|
||||
issues.filter_type=Тип
|
||||
issues.filter_type.all_issues=Всички въпроси
|
||||
issues.filter_type.assigned_to_you=Назначени на теб
|
||||
issues.filter_type.created_by_you=Създадени от теб
|
||||
issues.filter_type.mentioning_you=Които те споменават
|
||||
issues.opened_by=отворен %[1]s от <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Предишна
|
||||
issues.next=Следваща
|
||||
issues.label_title=Име на етикет
|
||||
issues.label_color=Цвят на етикет
|
||||
issues.label_count=%d етикети
|
||||
issues.label_open_issues=%d отворени въпроси
|
||||
issues.label_edit=Редакция
|
||||
issues.label_delete=Изтриване
|
||||
issues.label_modify=Модифициране на етикет
|
||||
issues.label_deletion=Изтриване на етикет
|
||||
issues.label_deletion_desc=Изтриване на етикет ще премахне информацията за него във всички свързани въпроси. Желаете ли да продължите?
|
||||
issues.label_deletion_success=Етикетът е изтрит успешно!
|
||||
|
||||
settings=Настройки
|
||||
settings.options=Опции
|
||||
settings.collaboration=Сътрудничество
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Git Hooks
|
||||
settings.deploy_keys=Използвай ключове
|
||||
settings.basic_settings=Основни настройки
|
||||
settings.danger_zone=Опасната зона
|
||||
settings.site=Официален сайт
|
||||
settings.update_settings=Настройки за актуализациите
|
||||
settings.change_reponame=Името на хранилището е променено
|
||||
settings.change_reponame_desc=Името на хранилището е променено. Това ще засегне линковете, отнасящи се до хранилището. Искате ли да продължите?
|
||||
settings.transfer=Прехвърляне на собствеността
|
||||
settings.transfer_desc=Прехвърля това хранилище на друг потребител или на организация, в която имате права на администратор.
|
||||
settings.new_owner_has_same_repo=Новият собственик вече има хранилище със същото име. Изберете друго име.
|
||||
settings.delete=Изтриване на това хранилище
|
||||
settings.delete_desc=След като изтриете хранилище, няма връщане назад. Моля, бъдете сигурни.
|
||||
settings.transfer_notices=<p>-Ще загубите достъп ако новият собственик е индивидуален потребител.</p> <p>-Ти ще запазиш достъп, ако новият собственик е организация и вие сте един от собствениците.</p>
|
||||
settings.update_settings_success=Опции за хранилище е актуализиран успешно.
|
||||
settings.transfer_owner=Нов собственик
|
||||
settings.make_transfer=Направи трансфер
|
||||
settings.transfer_succeed=Собствеността на хранилището е прехвърлена успешно.
|
||||
settings.confirm_delete=Потвърждаване на изтриването
|
||||
settings.add_collaborator=Добавяне на нов сътрудник
|
||||
settings.add_collaborator_success=Добавен е нов съавтор.
|
||||
settings.remove_collaborator_success=Съавторът е премахнат.
|
||||
settings.user_is_org_member=Потребителят е член на организацията, който не може да бъде добавен като съавтор.
|
||||
settings.add_webhook=Добави Webhook
|
||||
settings.hooks_desc=Webhooks са много като основните HTTP POST тригери. Когато нещо се случи в Gogs, ние ще пратим уведомлението до хоста, който е посочвате. Научете повече в това <a target="_blank" href="%s"> Webhooks ръководство</a>.
|
||||
settings.githooks_desc=Git Hooks се изпълняват от Git, вие може да промените файловете на поддъръжаните хуукове в списъка отдолу, за да може да изпълнявате персонализирани операции.
|
||||
settings.githook_edit_desc=Ако хуукът е неактивен, примерно съдържание ще бъдат представено. Ако оставите съдържанието празна стойност този хуук ще бъде изключен.
|
||||
settings.githook_name=Име на хуук
|
||||
settings.githook_content=Съдържание на хуука
|
||||
settings.update_githook=Обнови хуука
|
||||
settings.remove_hook_success=Webhook е бил изтрит.
|
||||
settings.add_webhook_desc=Gogs ще изпрати <code>POST</code> заявка към ядрес който укажете, заедно с информация за събитието, което е настъпило. Можете също да укажете какъв формат на данни желаете да получите при задействане на куката (JSON, x-www-form-urlencoded, XML, и т.н.). Повече информация можете да намерите в нашето <a target="_blank" href="%s">Ръководство за уеб-куки</a>.
|
||||
settings.payload_url=Payload URL
|
||||
settings.content_type=Тип на съдържанието
|
||||
settings.secret=Тайна
|
||||
settings.event_desc=При какви събития да се задейства този webhook?
|
||||
settings.event_push_only=Само <code>пуш</code> събитието.
|
||||
settings.active=Активен
|
||||
settings.active_helper=Подробности относно събитието извикало хуука ще бъде също представена.
|
||||
settings.add_hook_success=Нова webhook е добавен.
|
||||
settings.update_webhook=Актуализация на Webhook
|
||||
settings.update_hook_success=Webhook е бил актуализиран.
|
||||
settings.delete_webhook=Изтриване на Webhook
|
||||
settings.recent_deliveries=Последните доставки
|
||||
settings.hook_type=Вид на хуука
|
||||
settings.add_slack_hook_desc=Добавяне на интеграция с <a href="%s">Slack</a> в вашето хранилище.
|
||||
settings.slack_token=Маркер
|
||||
settings.slack_domain=Домейн
|
||||
settings.slack_channel=Канал
|
||||
|
||||
diff.browse_source=Преглед на кода
|
||||
diff.parent=родител
|
||||
diff.commit=commit
|
||||
diff.data_not_available=Няма Diff данни.
|
||||
diff.show_diff_stats=Покажи Diff статистика
|
||||
diff.stats_desc=<strong>%d променени файлове</strong> с <strong>%d допълнения</strong> и <strong>изравания %d</strong>
|
||||
diff.bin=BIN
|
||||
diff.view_file=Преглед на файла
|
||||
|
||||
release.releases=Релийзи
|
||||
release.new_release=Нов релийз
|
||||
release.draft=Чернова
|
||||
release.prerelease=Предварително издание
|
||||
release.stable=Стабилна
|
||||
release.edit=редактиране
|
||||
release.ahead=<strong>%d</strong> комит(а) %s след последния издание
|
||||
release.source_code=Програмен код
|
||||
release.tag_name=Име на етикет
|
||||
release.target=Цел
|
||||
release.tag_helper=Изберете съществуващ етикет или създайте нов етикет при публикуване.
|
||||
release.release_title=Заглавие на изданието
|
||||
release.content_with_md=Съдържание с <a href="%s"> Markdown</a>
|
||||
release.write=Писане
|
||||
release.preview=Преглед
|
||||
release.content_placeholder=Напишете някакво съдържание
|
||||
release.loading=Зареждане...
|
||||
release.prerelease_desc=Това е предварително издание
|
||||
release.prerelease_helper=Ние ще се отбележим, че тази версия не е готова за производство.
|
||||
release.publish=Публично издание
|
||||
release.save_draft=Запази чернова
|
||||
release.edit_release=Редактиране на изданието
|
||||
release.tag_name_already_exist=Релийз с таг с такова име вече съществува.
|
||||
|
||||
[org]
|
||||
org_name_holder=Име на организацията
|
||||
org_name_helper=Добрите имена на организация са кратки и запомнящи се.
|
||||
org_email_helper=Пощата на организацията получава всички уведомления и потвърждения.
|
||||
create_org=Създаване на организация
|
||||
repo_updated=Актуализиране
|
||||
people=Хора
|
||||
invite_someone=Поканете някого
|
||||
teams=Екипи
|
||||
lower_members=членове
|
||||
lower_repositories=хранилища
|
||||
create_new_team=Създаване на нов екип
|
||||
org_desc=Описание
|
||||
team_name=Име на екипа
|
||||
team_desc=Описание
|
||||
team_name_helper=Ще използвате това име при споменаване на този отбор в разговори.
|
||||
team_desc_helper=Каква е целта на този отбор?
|
||||
team_permission_desc=Какво ниво на достъп трябва да има този отбор?
|
||||
|
||||
form.name_reserved=Името за организация "%s" е запазено.
|
||||
form.name_pattern_not_allowed=Името на хранилището „%s“ не е позволено.
|
||||
|
||||
settings=Настройки
|
||||
settings.options=Опции
|
||||
settings.full_name=Пълно име
|
||||
settings.website=Уебсайт
|
||||
settings.location=Местоположение
|
||||
settings.update_settings=Актуализирай настройките
|
||||
settings.change_orgname=Името на екипа е променено
|
||||
settings.change_orgname_desc=Името на организацията е сменено. Това ще засегне връзките свързани с организацията. Искате ли да продължите?
|
||||
settings.update_setting_success=Настройките на организацията са успешно запазени.
|
||||
settings.delete=Изтрий организацията
|
||||
settings.delete_account=Изтрий тази организация
|
||||
settings.delete_prompt=Организацията ще бъде изтрита и <strong>НЕ МОЖЕ</strong> да се върне!
|
||||
settings.confirm_delete_account=Потвърди изтриването
|
||||
settings.delete_org_title=Изтриване на организацията
|
||||
settings.delete_org_desc=Тази организация ще бъде окончателно изтрита. Искате ли да продължите?
|
||||
settings.hooks_desc=Добави webhooks, който ще бъде използван за <strong>всички хранилища</strong> в тази организация.
|
||||
|
||||
members.public=Обществено
|
||||
members.public_helper=направи частен
|
||||
members.private=Частно
|
||||
members.private_helper=направи публично
|
||||
members.owner=Собственик
|
||||
members.member=Участник
|
||||
members.conceal=Прикриване
|
||||
members.remove=Премахни
|
||||
members.leave=Напусни
|
||||
members.invite_desc=Започнете да пишете потребителското име, за да поканите член в %s:
|
||||
members.invite_now=Покани сега
|
||||
|
||||
teams.join=Присъединяване
|
||||
teams.leave=Напусни
|
||||
teams.read_access=Достъп за четене
|
||||
teams.read_access_helper=Този екип ще може да вижда и клонира своите хранилища.
|
||||
teams.write_access=Достъп за запис
|
||||
teams.write_access_helper=Този екип ще може да чете своите хранилища и ще може да пушва.
|
||||
teams.admin_access=Администраторски достъп
|
||||
teams.admin_access_helper=Екипът може да пушва и пулва в своите хранилища и да добавя collaborators.
|
||||
teams.no_desc=Този екип няма описание
|
||||
teams.settings=Настройки
|
||||
teams.owners_permission_desc=Собствениците имат пълен достъп до <strong>всички хранилища</strong> и имат <strong>права на администратор</strong> на организацията.
|
||||
teams.members=Членовете на екипа
|
||||
teams.update_settings=Актуализирай настройките
|
||||
teams.delete_team=Изтриване на този екип
|
||||
teams.add_team_member=Добавяне на член в екипа
|
||||
teams.delete_team_title=Изтриването на екипа
|
||||
teams.delete_team_desc=Тъй като този екип ще бъдат изтрит, членовете на този екип може да загуби достъп до някои хранилища. Искате ли да продължите?
|
||||
teams.delete_team_success=Даденият екип е бил изтрит успешно.
|
||||
teams.read_permission_desc=Този екип предоставя достъп за <strong>четене</strong>: членове могат да разглеждат и клонират хранилищата на екипа.
|
||||
teams.write_permission_desc=Този екип предоставя права за <strong>пиша</strong>: членовете могат да четат от и пушват към хранилищата на екипа.
|
||||
teams.admin_permission_desc=Този екип получава <strong>администраторски</strong> достъп: членовете могат да четат, да пушват и добавя сътрудници към хранилищата на екипа.
|
||||
teams.repositories=Хранилища на екипа
|
||||
teams.add_team_repository=Добави хранилище на екипа
|
||||
teams.remove_repo=Премахни
|
||||
teams.add_nonexistent_repo=Хранилището, което се опитвате да добавите не съществува. Моля първо го създадете!
|
||||
|
||||
[admin]
|
||||
dashboard=Табло
|
||||
users=Потребители
|
||||
organizations=Организация
|
||||
repositories=Хранилища
|
||||
authentication=Ауторизация
|
||||
config=Конфигурация
|
||||
notices=Системни известия
|
||||
monitor=Наблюдение
|
||||
prev=Предишен.
|
||||
next=Следващ
|
||||
|
||||
dashboard.statistic=Статистики
|
||||
dashboard.operations=Операции
|
||||
dashboard.system_status=Наблюдение на системния статус
|
||||
dashboard.statistic_info=Gogs базата данни има <b>%d</b> потребители, <b>%d</b> организации, <b>%d</b> публични ключове, <b>%d</b> хранилища, <b>%d</b> watches, <b>%d</b> stars, <b>%d</b> действия, <b>%d</b> accesses, <b>%d</b> issues, <b>%d</b> коментари, <b>%d</b> социални accounts, <b>%d</b> последователи , <b>%d</b> mirrors, <b>%d</b> releases, <b>%d</b> login soureces, <b>%d</b> webhooks, <b>%d</b> milestones, <b>%d</b> label, <b>%d</b> hook tasks <b>%d</b> teams, <b>%d</b> update tasks, <b>%d</b> attachments.
|
||||
dashboard.operation_name=Име на операцията
|
||||
dashboard.operation_switch=Превключване
|
||||
dashboard.operation_run=Стартиране
|
||||
dashboard.clean_unbind_oauth=Изчисти несвързаните OAuthes
|
||||
dashboard.clean_unbind_oauth_success=Всички неизползвани OAuthes са изтрити успешно.
|
||||
dashboard.delete_inactivate_accounts=Изтриване на всички неактивни профили
|
||||
dashboard.delete_inactivate_accounts_success=Всички неактивни профили са изтрити успешно.
|
||||
dashboard.delete_repo_archives=Изтрий всички архиви на хранилищата
|
||||
dashboard.delete_repo_archives_success=Всички архиви на хранилищата са били изтрити успешно.
|
||||
dashboard.git_gc_repos=Почисти ненужните данни в хранилищата
|
||||
dashboard.git_gc_repos_success=Всички хранилища са изпълнили garbage collection успешно.
|
||||
dashboard.resync_all_sshkeys=Презапис на ".ssh/authorized_keys" файл (внимание: не-Gogs ключове ще бъдат загубени)
|
||||
dashboard.resync_all_sshkeys_success=Всички публични ключове са били презаписани успешно.
|
||||
dashboard.resync_all_update_hooks=Пренапише всички хуукове за обновяване на хранилищата (необходимо, когато се ползва собствен път за конфигурацията)
|
||||
dashboard.resync_all_update_hooks_success=Всички куки закачени на актуализация на хранилище са пренаписани успешно.
|
||||
|
||||
dashboard.server_uptime=Сървър ъптайм
|
||||
dashboard.current_goroutine=Текущата Goroutines
|
||||
dashboard.current_memory_usage=Текущо ползване на паметта
|
||||
dashboard.total_memory_allocated=Цялата заделена памет
|
||||
dashboard.memory_obtained=Заделена памет
|
||||
dashboard.pointer_lookup_times=Търсене на указател
|
||||
dashboard.memory_allocate_times=Заделяне на памет
|
||||
dashboard.memory_free_times=Освобождаване на памет
|
||||
dashboard.current_heap_usage=Текущо използван heap
|
||||
dashboard.heap_memory_obtained=Заделена осн. памет
|
||||
dashboard.heap_memory_idle=Празна осн. памет
|
||||
dashboard.heap_memory_in_use=Използвана осн. памет
|
||||
dashboard.heap_memory_released=Освободена осн. памет
|
||||
dashboard.heap_objects=Обекти в осн. памет
|
||||
dashboard.bootstrap_stack_usage=Изпалзван стек за bootstrap
|
||||
dashboard.stack_memory_obtained=Заделена памет в стека
|
||||
dashboard.mspan_structures_usage=Използвани MSpan обекти
|
||||
dashboard.mspan_structures_obtained=Получени MSpan обекти
|
||||
dashboard.mcache_structures_usage=Използвани MCache обекти
|
||||
dashboard.mcache_structures_obtained=Получени MCache обекти
|
||||
dashboard.profiling_bucket_hash_table_obtained=Получени Profiling Bucket Hash Table
|
||||
dashboard.gc_metadata_obtained=Получени GC метаданни
|
||||
dashboard.other_system_allocation_obtained=Получена друга системна памет
|
||||
dashboard.next_gc_recycle=Слeдващо рециклиране на GC
|
||||
dashboard.last_gc_time=Време от последен GC
|
||||
dashboard.total_gc_time=Общо време за GC
|
||||
dashboard.total_gc_pause=Общо пауза за GC
|
||||
dashboard.last_gc_pause=Последна пауза за GC
|
||||
dashboard.gc_times=Брой GC
|
||||
|
||||
users.user_manage_panel=Панел за управление на потребителите
|
||||
users.new_account=Създаване на нов профил
|
||||
users.name=Име
|
||||
users.activated=Активиран
|
||||
users.admin=Администратор
|
||||
users.repos=Хранилища
|
||||
users.created=Създаване
|
||||
users.edit=Редакцияэ
|
||||
users.auth_source=Източници за удостоверяване
|
||||
users.local=Локално
|
||||
users.auth_login_name=Потребителско име за удстоверяване
|
||||
users.update_profile_success=Профилът е обновен успешно.
|
||||
users.edit_account=Редактиране на профила
|
||||
users.is_activated=Този профил е активиран
|
||||
users.is_admin=Този профил има административни права
|
||||
users.allow_git_hook=Този профил има разрешение да създава Git hooks
|
||||
users.update_profile=Обнови профила
|
||||
users.delete_account=Изтриване на акаунта
|
||||
users.still_own_repo=Този профил е собственик на поне едно хранилище. Трябва да ги изтриете или предадете на друг преди това.
|
||||
users.still_has_org=Този потребител е поне в една организация. Първо трябва да излезете от или изтриете тези организации.
|
||||
|
||||
orgs.org_manage_panel=Управление на организациите
|
||||
orgs.name=Име
|
||||
orgs.teams=Екипи
|
||||
orgs.members=Членове
|
||||
|
||||
repos.repo_manage_panel=Управление на хранилищата
|
||||
repos.owner=Собственик
|
||||
repos.name=Име
|
||||
repos.private=Личен
|
||||
repos.watches=Watches
|
||||
repos.stars=Stars
|
||||
repos.issues=Issues
|
||||
|
||||
auths.auth_manage_panel=Управление на удостоверяването
|
||||
auths.new=Добави нов начин за удостоверяване
|
||||
auths.name=Име
|
||||
auths.type=Тип
|
||||
auths.enabled=Активиран
|
||||
auths.updated=Актуализиране
|
||||
auths.auth_type=Тип на разрешение
|
||||
auths.auth_name=Име на удостоверяването
|
||||
auths.domain=Домейн
|
||||
auths.host=Хост
|
||||
auths.port=Порт
|
||||
auths.base_dn=Основен DN
|
||||
auths.attribute_username=Атрибут на потребителско име
|
||||
auths.attribute_name=Атрибут име
|
||||
auths.attribute_surname=Атрибут фамилия
|
||||
auths.attribute_mail=E-Mail атрибут
|
||||
auths.filter=Филтър за търсене
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=Вид на SMTP удостоверяване
|
||||
auths.smtphost=SMTP хост
|
||||
auths.smtpport=SMTP порт
|
||||
auths.enable_tls=Разрешаване на TLS шифроване
|
||||
auths.pam_service_name=Име на PAM услуга
|
||||
auths.enable_auto_register=Включване на автоматичната регистрация
|
||||
auths.tips=Съвети
|
||||
auths.edit=Редактиране на низа за ауторизация
|
||||
auths.activated=Това удостоверяване е активно
|
||||
auths.update_success=Настройките за удостоверяване са обновени успешно.
|
||||
auths.update=Обнови настройките за удостоверяване
|
||||
auths.delete=Изтрий това удостоверяване
|
||||
auths.delete_auth_title=Изтриване на удостоверяването
|
||||
auths.delete_auth_desc=Това удостоверяване ще бъде изтрито. Искате ли да продължите?
|
||||
|
||||
config.server_config=Сървърни настройки
|
||||
config.app_name=Име на програмата
|
||||
config.app_ver=Версия на приложението
|
||||
config.app_url=URL на програмата
|
||||
config.domain=Домейн
|
||||
config.offline_mode=Офлайн режим
|
||||
config.disable_router_log=Изключи логът на маршрутизатора
|
||||
config.run_user=Run User
|
||||
config.run_mode=Run Mode
|
||||
config.repo_root_path=Път към хранилището
|
||||
config.static_file_root_path=Път към статичен път
|
||||
config.log_file_root_path=Път към лог файла
|
||||
config.script_type=Тип на скрипта
|
||||
config.reverse_auth_user=Потребителско име при обратно удостоверяване
|
||||
config.db_config=Настройки на базата данни
|
||||
config.db_type=Тип
|
||||
config.db_host=Хост
|
||||
config.db_name=Име
|
||||
config.db_user=Потребител
|
||||
config.db_ssl_mode=SSL режим
|
||||
config.db_ssl_mode_helper=(само за «postgres»)
|
||||
config.db_path=Път
|
||||
config.db_path_helper=(само за "sqlite3")
|
||||
config.service_config=Настройка на услугата
|
||||
config.register_email_confirm=Изисквай имейл потвърждение
|
||||
config.disable_register=Изключване на регистрирането
|
||||
config.show_registration_button=Покажи бутон за регистрация
|
||||
config.require_sign_in_view=Изисква влизане за преглед
|
||||
config.mail_notify=Уведомяване по поща
|
||||
config.enable_cache_avatar=Разрешено кеширане на аватари
|
||||
config.active_code_lives=Кодове за активиране
|
||||
config.reset_password_code_lives=Кодове за ресет на парола
|
||||
config.webhook_config=Webhook настройки
|
||||
config.task_interval=Интервал на повторение
|
||||
config.deliver_timeout=Време за отказ на доставка
|
||||
config.skip_tls_verify=Пропусни TLS проверката
|
||||
config.mailer_config=Мейлър конфигурация
|
||||
config.mailer_enabled=Включено
|
||||
config.mailer_disable_helo=Изключи HELO
|
||||
config.mailer_name=Име
|
||||
config.mailer_host=Хост
|
||||
config.mailer_user=Потребител
|
||||
config.oauth_config=OAuth конфигурация
|
||||
config.oauth_enabled=Активиран
|
||||
config.cache_config=Конфигурация на кеша
|
||||
config.cache_adapter=Кеш адаптер
|
||||
config.cache_interval=Кеш интервал
|
||||
config.cache_conn=Кеш на връзката
|
||||
config.session_config=Конфигурация на сесията
|
||||
config.session_provider=Доставчик на сесия
|
||||
config.provider_config=Конфигурация на доставчик
|
||||
config.cookie_name=Име на бисквитка
|
||||
config.enable_set_cookie=Разреши установяване на бисквитки
|
||||
config.gc_interval_time=GC през интервал
|
||||
config.session_life_time=Време на живот на сесията
|
||||
config.https_only=HTTPS само
|
||||
config.cookie_life_time=Време на живот на бисквитка
|
||||
config.picture_config=Конфигурация на идображение
|
||||
config.picture_service=Услуги за снимки
|
||||
config.disable_gravatar=Изключване на Gravatar
|
||||
config.log_config=Конфигурация на логовете
|
||||
config.log_mode=Режим на логване
|
||||
|
||||
monitor.cron=Cron задачи
|
||||
monitor.name=Име
|
||||
monitor.schedule=График
|
||||
monitor.next=Следващ път
|
||||
monitor.previous=Предишен път
|
||||
monitor.execute_times=Време на изпълнение
|
||||
monitor.process=Изпълнявани процеса
|
||||
monitor.desc=Описание
|
||||
monitor.start=Начален час
|
||||
monitor.execute_time=Време за изпълнение
|
||||
|
||||
notices.system_notice_list=Системни известия
|
||||
notices.type=Вид
|
||||
notices.type_1=Хранилище
|
||||
notices.desc=Описание
|
||||
notices.op=Op.
|
||||
notices.delete_success=Системното съобщение е изтрито успешно.
|
||||
|
||||
[action]
|
||||
create_repo=създадено е хранилище <a href="%s"> %s</a>
|
||||
commit_repo=пушнато към <a href="%s/src/%s">%[2]s</a> в <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`отворен въпрос <a href="%s/issues/%s">%s#%[2]s"</a>`
|
||||
comment_issue=`коментира въпрос <a href="%s/issues/%s">%s#%[2]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>
|
||||
compare_2_commits=Виж сравнението между тези 2 комита
|
||||
|
||||
[tool]
|
||||
ago=преди
|
||||
from_now=от сега
|
||||
now=сега
|
||||
1s=1 секунда %s
|
||||
1m=1 минута %s
|
||||
1h=1 час %s
|
||||
1d=1 ден %s
|
||||
1w=1 седмица %s
|
||||
1mon=1 месец %s
|
||||
1y=1 година %s
|
||||
seconds=%d секунди %s
|
||||
minutes=%d минути %s
|
||||
hours=%d часа %s
|
||||
days=%d дни %s
|
||||
weeks=%d седмици %s
|
||||
months=%d месеца %s
|
||||
years=%d години %s
|
||||
raw_seconds=секунди
|
||||
raw_minutes=минути
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
app_desc=Ein einfacher, selbst gehosteter Git-Service, geschrieben in Go
|
||||
app_desc=Ein schmerzloser, selbst gehosteter Git-Service, geschrieben in Go
|
||||
|
||||
home=Home
|
||||
dashboard=Übersicht
|
||||
@@ -39,10 +39,18 @@ issues=Issues
|
||||
|
||||
cancel=Abbrechen
|
||||
|
||||
[search]
|
||||
search=Suchen...
|
||||
repository=Repository
|
||||
user=Benutzer
|
||||
issue=Problem
|
||||
code=Code
|
||||
|
||||
[install]
|
||||
install=Installation
|
||||
title=Installation für erstmaligen Start
|
||||
requite_db_desc=Gogs erfordert MySQL, PostgreSQL oder SQLite 3, aber SQLite3 ist in der offiziellen binären Version akiviert.
|
||||
db_title=Datenbankeinstellungen
|
||||
db_type=Datenbanktyp
|
||||
host=Host
|
||||
user=Benutzer
|
||||
@@ -52,22 +60,39 @@ db_helper=Bitte verwenden InnoDB-Engine mit utf8_general_ci Zeichensatz für MyS
|
||||
ssl_mode=SSL-Modus
|
||||
path=Pfad
|
||||
sqlite_helper=Der Dateipfad des SQLite3 Datenbank.
|
||||
err_empty_sqlite_path=Pfad zur SQLite3-Datenbank darf nicht leer sein.
|
||||
|
||||
general_title=Allgemeine Einstellungen von Gogs
|
||||
app_name=Anwendungsname
|
||||
app_name_helper=Hier den Organisationsnamen einfügen.
|
||||
repo_path=Repository Root-Verzeichnispfad
|
||||
repo_path_helper=Alle Git-Repositorys werden in diesem Verzeichnis gespeichert.
|
||||
run_user=Ausführender Benutzer
|
||||
run_user_helper=Der Benutzer muss die Zugriffsberechtigung für das Repository Root-Verzeichnis haben und der ausführende Benutzer von Gogs sein.
|
||||
domain=Domain
|
||||
domain_helper=Dies hat Auswirkung auf die SSH clone URLs.
|
||||
http_port=HTTP Port
|
||||
http_port_helper=Auf dieser Port Nummer ist die Apllikation erreichbar.
|
||||
app_url=Anwendungs-URL
|
||||
app_url_helper=Dies hat Auswirkung auf die HTTP/HTTPS clone URLs und für die E-Mails.
|
||||
email_title=E-Mail-Service-Einstellungen (optional)
|
||||
|
||||
optional_title=Optionale Einstellungen
|
||||
email_title=E-Mail-Service Einstellungen
|
||||
smtp_host=SMTP Host
|
||||
smtp_from=Von
|
||||
smtp_from_helper=Absender-Adresse nach RFC 5322. Entweder nur eine E-Mail Adresse oder im folgenden Format: "Name" <email@example.com>.
|
||||
mailer_user=Sender E-mail
|
||||
mailer_password=Sender Passwort
|
||||
notify_title=Benachrichtigungseinstellungen (optional)
|
||||
register_confirm=Registrierungsbestätigung aktvieren
|
||||
mail_notify=E-Mail-Benachrichtgung aktivieren
|
||||
server_service_title=Server- und sonstige Diensteinstellungen
|
||||
offline_mode=Offline-Modus aktivieren
|
||||
offline_mode_popup=Deaktiviere das CDN auch im Produktionsmodus, alle Dateien werden von diesem Server ausgeliefert.
|
||||
disable_registration=Benutzerregistrierung deaktivieren
|
||||
disable_registration_popup=Deaktiviere die Benutzerregistrierung, nur Administratoren können Benutzerkonten anlegen.
|
||||
require_sign_in_view=Erfordere Anmeldung, um Inhalte anzusehen
|
||||
require_sign_in_view_popup=Lediglich angemeldete Benutzer können Inhalte betrachten, Gäste sehen nur die Anmelden/Registrieren Seite.
|
||||
admin_setting_desc=Sie müssen jetzt noch keinen Administrator-Account anlegen. Der erste Benutzer ("ID=1") erhält automatisch Administrationsrechte.
|
||||
admin_title=Konto-Einstellungen für den Administrator
|
||||
admin_name=Benutzername
|
||||
admin_password=Passwort
|
||||
@@ -81,7 +106,7 @@ invalid_repo_path=Repository Root-Verzeichnis ist ungültig: %v
|
||||
run_user_not_match=Der ausführende Benutzer ist nicht der aktuelle Benutzer: %s -> %s
|
||||
save_config_failed=Versuche die Konfiguration zu speichern ist fehlgeschlagen: %v
|
||||
invalid_admin_setting=Admin-Konto Einstellungen sind ungültig: %v
|
||||
install_success=Herzlich Willkommen! Wir sind froh, dass du dich für Gogs entschieden hast. Hab viel Vergnügen damit.
|
||||
install_success=Herzlich Willkommen! Wir sind froh, dass du dich für Gogs entschieden hast. Wir wünschen viel Vergnügen damit.
|
||||
|
||||
[home]
|
||||
uname_holder=Benutzername oder E-Mail
|
||||
@@ -109,7 +134,7 @@ confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an <b>%s</b>
|
||||
sign_in_email=Melde dich mit deiner E-Mail-Adresse an
|
||||
active_your_account=Aktiviere dein Konto
|
||||
resent_limit_prompt=Es tut uns leid, du sendest zu häufig Aktivierungs-E-Mails. Bitte warte 3 Minuten.
|
||||
has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (<b>%s</b>). Falls du noch keine Bestätigungs-E-Mail erhalten hast oder eine neue senden musst, klicke auf den unteren Button.
|
||||
has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (<b>%s</b>). Wenn du keine Bestätigungs-E-Mail erhalten hast oder eine neue benötigtst, klicke bitte auf den folgenden Button.
|
||||
resend_mail=Hier klicken, um deine Aktivierungs-E-Mail erneut zu versenden
|
||||
email_not_associate=Diese E-Mail-Adresse ist mit keinem Konto verknüpft.
|
||||
send_reset_mail=Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden
|
||||
@@ -118,6 +143,11 @@ invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungülti
|
||||
reset_password_helper=Hier klicken, um das Passwort zurückzusetzen
|
||||
password_too_short=Das Passwort muss mindenstens 6 Zeichen lang sein
|
||||
|
||||
[modal]
|
||||
yes=Ja
|
||||
no=Nein
|
||||
modify=Ändern
|
||||
|
||||
[form]
|
||||
UserName=Benutzername
|
||||
RepoName=Repository-Name
|
||||
@@ -134,6 +164,7 @@ AdminEmail=Admin E-mail
|
||||
require_error=` darf nicht leer sein.`
|
||||
alpha_dash_error=` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.`
|
||||
alpha_dash_dot_error=` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.`
|
||||
size_error=` muss die Größe %s haben.`
|
||||
min_size_error=` muss mindestens %s Zeichen enthalten.`
|
||||
max_size_error=` darf höchstens %s Zeichen enthalten.`
|
||||
email_error=` ist keine gültige E-Mail-Adresse.`
|
||||
@@ -148,31 +179,29 @@ org_name_been_taken=Organisationsname ist bereits vergeben.
|
||||
team_name_been_taken=Teamname ist bereits vergeben.
|
||||
email_been_used=E-Mail-Adresse wird bereits verwendet.
|
||||
ssh_key_been_used=SSH-Schlüsselname wird bereits verwendet.
|
||||
illegal_username=Benutzername enthält ungültige Zeichen.
|
||||
illegal_repo_name=Repository-Name enthält ungültige Zeichen.
|
||||
illegal_org_name=Organisationsname enthält ungültige Zeichen.
|
||||
illegal_team_name=Teamname enthält ungültige Zeichen.
|
||||
username_password_incorrect=Benutzername oder Passwort ist nicht korrekt.
|
||||
enterred_invalid_repo_name=Bitte stelle sicher, dass der eingegeben Repository-Name richtig ist.
|
||||
enterred_invalid_owner_name=Bitte stelle sicher, dass der eingegeben Besitzername richtig ist.
|
||||
enterred_invalid_repo_name=Bitte stelle sicher, dass der eingegebene Repository-Name richtig ist.
|
||||
enterred_invalid_owner_name=Bitte stelle sicher, dass der eingegebene Besitzername richtig ist.
|
||||
enterred_invalid_password=Bitte stelle sicher, dass das eingegebene Passwort richtig ist.
|
||||
user_not_exist=Angegebener Benutzer existiert nicht.
|
||||
last_org_owner=Der zu entfernende Benutzer ist der letzte Teambesitzer. Es muss einen anderen Besitzer geben.
|
||||
last_org_owner=Der zu entfernende Benutzer ist der letzte Besitzer einer Organisation. Diese müssen zuerst gelöscht oder übertragen werden.
|
||||
|
||||
invalid_ssh_key=Leider sind wir nicht in der Lage, deinen SSH-Schlüssel zu überprüfen: %s
|
||||
unable_verify_ssh_key=Gogs kann deinen SSH-Schlüssel nicht verifizieren, nimmt aber an, dass er gültig ist. Bitte stelle dies selbst sicher.
|
||||
auth_failed=Authentifizierung fehlgeschlagen: %v
|
||||
|
||||
still_own_repo=Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
|
||||
still_has_org=Ihr Konto noch Mitgliedschaft in der Organisation, Sie nach links oder löschen Sie sie zuerst.
|
||||
still_own_repo=Dein Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden.
|
||||
still_has_org=Du bist noch Mitglied einer Organisation, bitte lösche zunächst diese Mitgliedschaft.
|
||||
org_still_own_repo=Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
|
||||
|
||||
still_own_user=Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut.
|
||||
still_own_user=Diese Authentifizierung wird noch von einigen Benutzern genutzt, diese müssen zuerst gelöscht oder deren Authentifizierung geändert werden.
|
||||
|
||||
target_branch_not_exist=Ziel-Branch existiert nicht
|
||||
|
||||
[user]
|
||||
change_avatar=Ändere dein Profilbild auf gravatar.com
|
||||
change_custom_avatar=Ändere deinen Avatar in den Einstellungen
|
||||
join_on=Registriert
|
||||
repositories=Repositorys
|
||||
activity=Öffentliche Aktivität
|
||||
@@ -180,6 +209,9 @@ followers=Folgen
|
||||
starred=Markiert
|
||||
following=Folgt
|
||||
|
||||
form.name_reserved=Der Benutzername '%s' ist reserviert.
|
||||
form.name_pattern_not_allowed=Benutzernamens-Muster "%s" ist nicht zulässig.
|
||||
|
||||
[settings]
|
||||
profile=Profil
|
||||
password=Passwort
|
||||
@@ -191,7 +223,7 @@ delete=Konto löschen
|
||||
uid=Uid
|
||||
|
||||
public_profile=Öffentliches Profil
|
||||
profile_desc=Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken.
|
||||
profile_desc=Deine E-Mail-Adresse ist öffentlich einsehbar und wird für accountspezifische Benachrichtigungen verwendet, sowie für alle web-basierten Funktionen, die über die Seite gemacht werden.
|
||||
full_name=Vollständiger Name
|
||||
website=Webseite
|
||||
location=Standort
|
||||
@@ -202,12 +234,31 @@ change_username_desc=Benutzername wurde geändert, möchtest du fortfahren? Dies
|
||||
continue=Weiter
|
||||
cancel=Abbrechen
|
||||
|
||||
enable_custom_avatar=Aktiviere benuztzerdefinierten Avatar
|
||||
enable_custom_avatar_helper=Aktiviere dies, um deinen Avatar nicht von Gravatar zu laden
|
||||
choose_new_avatar=Neuen Avatar auswählen
|
||||
update_avatar=Avatar-Einstellung aktualisieren
|
||||
uploaded_avatar_not_a_image=Die hochgeladene Datei ist kein Bild.
|
||||
no_custom_avatar_available=Kein benutzerdefinierter Avatar verfügbar, Aktivierung ist nicht möglich.
|
||||
update_avatar_success=Deine Avatar-Einstellung wurde aktualisiert.
|
||||
|
||||
change_password=Passwort ändern
|
||||
old_password=Aktuelles Passwort
|
||||
new_password=Neues Passwort
|
||||
password_incorrect=Aktuelles Passwort ist nicht korrekt.
|
||||
change_password_success=Passwort geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden.
|
||||
|
||||
emails=E-Mail-Adressen
|
||||
manage_emails=E-Mail-Adressen verwalten
|
||||
email_desc=Deine primäre E-Mail-Adresse wird für Benachrichtigungen und andere Funktionen verwendet.
|
||||
primary=Primär
|
||||
primary_email=Als primäre Adresse verwenden
|
||||
delete_email=Löschen
|
||||
add_new_email=Neue E-Mail-Adresse hinzufügen
|
||||
add_email=E-Mail-Adresse hinzufügen
|
||||
add_email_confirmation_sent=Eine neue Bestätigungsmail wurde an <b>%s</b> gesendet, bitte überprüfen Sie Ihren Posteingang innerhalb von %d Stunden um die Bestätigung abzuschließen.
|
||||
add_email_success=Deine neue E-Mail-Adresse wurde erfolgreich hinzugefügt.
|
||||
|
||||
manage_ssh_keys=SSH-Schlüssel verwalten
|
||||
add_key=SSH-Schlüssel hinzufügen
|
||||
ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verknüpft sind. Entferne alle Schlüssel, die du nicht kennst.
|
||||
@@ -260,20 +311,25 @@ init_readme=Repository mit README.md initialisieren
|
||||
create_repo=Repository erstellen
|
||||
default_branch=Standard-Branch
|
||||
mirror_interval=Spiegel-Intervall (in Stunden)
|
||||
goget_meta=Go-Get Meta
|
||||
goget_meta_helper=Dieses Repository wird man mit <span class="label label-blue label-radius">go get</span> klonen können.
|
||||
|
||||
form.name_reserved=Repository-Name '%s' ist bereits vergeben.
|
||||
form.name_pattern_not_allowed=Repository-Namesmuster '%s' ist nicht zulässig.
|
||||
|
||||
need_auth=Authorisierung benötigt
|
||||
migrate_type=Migrationstyp
|
||||
migrate_type_helper=Dieses Repository wird ein <span class="label label-blue label-radius">Spiegel</span>
|
||||
migrate_repo=Repository migrieren
|
||||
migrate.clone_address=Adresse kopieren
|
||||
migrate.invalid_local_path=Lokaler Pfad ist ungültig, er existiert nicht oder ist kein Ordner.
|
||||
|
||||
forked_from=Geforkt von
|
||||
fork_from_self=SIe können kein Repository forken, das ihnen gehört!
|
||||
copy_link=Kopieren
|
||||
click_to_copy=In Zwischenablage kopieren
|
||||
copied=Kopiert OK
|
||||
clone_helper=Du brauchst Hilfe beim Klonen? Hier gibt es <a target="_blank" href="%s">Hilfe</a>!
|
||||
unwatch=Beobachtung beenden
|
||||
watch=Beobachtung
|
||||
watch=Beobachten
|
||||
unstar=Markierung aufheben
|
||||
star=Markierung
|
||||
fork=Abspaltung
|
||||
@@ -290,11 +346,14 @@ branch_and_tags=Branches & Tags
|
||||
branches=Branches
|
||||
tags=Markierungen
|
||||
issues=Issues
|
||||
labels=Label
|
||||
milestones=Meilensteine
|
||||
commits=Commits
|
||||
releases=Veröffentlichungen
|
||||
file_raw=Roh
|
||||
file_history=Verlauf
|
||||
file_view_raw=Ansicht Roh
|
||||
file_permalink=Permalink
|
||||
|
||||
commits.commits=Commits
|
||||
commits.search=Durchsuche Commits
|
||||
@@ -305,6 +364,34 @@ commits.date=Datum
|
||||
commits.older=Älter
|
||||
commits.newer=Neuer
|
||||
|
||||
issues.new=Neues Problem
|
||||
issues.new_label=Neues Label
|
||||
issues.new_label_placeholder=Label-Name...
|
||||
issues.open_tab=%d offen
|
||||
issues.close_tab=%d geschlossen
|
||||
issues.filter_label=Label
|
||||
issues.filter_label_no_select=Kein Label gewählt
|
||||
issues.filter_milestone=Meilenstein
|
||||
issues.filter_assignee=Beauftragter
|
||||
issues.filter_type=Typ
|
||||
issues.filter_type.all_issues=Alle Probleme
|
||||
issues.filter_type.assigned_to_you=Dir zugewiesen
|
||||
issues.filter_type.created_by_you=Erstellt von dir
|
||||
issues.filter_type.mentioning_you=Erwähnen dich
|
||||
issues.opened_by=eröffnet %[1]s von <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Vorherige Seite
|
||||
issues.next=Nächste Seite
|
||||
issues.label_title=Label Name
|
||||
issues.label_color=Label Farbe
|
||||
issues.label_count=%d Labels
|
||||
issues.label_open_issues=%d offene Probleme
|
||||
issues.label_edit=Bearbeiten
|
||||
issues.label_delete=Löschen
|
||||
issues.label_modify=Label Änderung
|
||||
issues.label_deletion=Label Löschung
|
||||
issues.label_deletion_desc=Das Löschen eines Labels entfernt es von allen verknüpften Issues. Möchtest du fortfahren?
|
||||
issues.label_deletion_success=Label wurde erfolgreich gelöscht!
|
||||
|
||||
settings=Einstellungen
|
||||
settings.options=Optionen
|
||||
settings.collaboration=Zusammenarbeit
|
||||
@@ -318,7 +405,7 @@ settings.update_settings=Aktualisierungseinstellungen
|
||||
settings.change_reponame=Name des Repositories geändert
|
||||
settings.change_reponame_desc=Repository-Name wurde geändert, möchtest du fortfahren? Dies beeinträchtigt sämtliche Links, die dieses Repository betreffen.
|
||||
settings.transfer=Besitz übertragen
|
||||
settings.transfer_desc=Übertrage dieses Repository einem anderen Benutzer oder einer Organisation.
|
||||
settings.transfer_desc=Übertrage dieses Repository einem anderen Benutzer oder einer Organisation in der du Admin-Rechte hast.
|
||||
settings.new_owner_has_same_repo=Neuer Eigentümer hat bereits ein Repository mit dem gleichen Namen.
|
||||
settings.delete=Repository löschen
|
||||
settings.delete_desc=Wenn dieses Repository gelöscht ist, gibt es keinen Weg zurück. Sei dir sicher!
|
||||
@@ -333,14 +420,14 @@ settings.add_collaborator_success=Mitarbeiter hinzugefügt
|
||||
settings.remove_collaborator_success=Mitarbeiter entfernt
|
||||
settings.user_is_org_member=Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden.
|
||||
settings.add_webhook=Webhook hinzufügen
|
||||
settings.hooks_desc=Webhooks erlauben es externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. GoGS sendet dann eine POST-Request an alle angegebenen URLs. Erfahre mehr in unserem <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.hooks_desc=Webhooks erlauben es dir, externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. Gogs sendet dann einen POST-Request an alle angegebenen URLs. Erfahre mehr in unserem <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.githooks_desc=Git-Hooks werden von Git selbst bereitgestellt. Du kannst die Dateien der unterstützten Hooks in der Liste unten bearbeiten, um eigene Operationen einzubinden.
|
||||
settings.githook_edit_desc=Wenn ein Hook nicht aktiv ist, wird der Standardinhalt benutzt. Lasse den Inhalt leer, um den Hook zu deaktivieren.
|
||||
settings.githook_name=Hook-Name
|
||||
settings.githook_content=Hook-Inhalt
|
||||
settings.update_githook=Aktualisiere Hook
|
||||
settings.remove_hook_success=Webhook entfernt
|
||||
settings.add_webhook_desc=GoGS sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.add_webhook_desc=Gogs sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.payload_url=Payload-URL
|
||||
settings.content_type=Inhaltstyp
|
||||
settings.secret=Secret
|
||||
@@ -368,10 +455,34 @@ diff.stats_desc=<strong> %d geänderte Dateien</strong> mit <strong>%d neuen Zei
|
||||
diff.bin=BIN
|
||||
diff.view_file=Datei anzeigen
|
||||
|
||||
release.releases=Releases
|
||||
release.new_release=Neues Release
|
||||
release.draft=Entwurf
|
||||
release.prerelease=Pre-Release
|
||||
release.stable=Endversion
|
||||
release.edit=bearbeiten
|
||||
release.ahead=<strong>%d</strong> Commits zu %s seit diesem Release
|
||||
release.source_code=Quelltext
|
||||
release.tag_name=Tag-Name
|
||||
release.target=Ziel
|
||||
release.tag_helper=Wähle ein neues Tag oder erstelle ein Tag beim Veröffentlichen.
|
||||
release.release_title=Release-Titel
|
||||
release.content_with_md=Inhalt mit <a href="%s">Markdown</a>
|
||||
release.write=Schreiben
|
||||
release.preview=Vorschau
|
||||
release.content_placeholder=Schreibe hier etwas
|
||||
release.loading=Laden…
|
||||
release.prerelease_desc=Dies ist eine Pre-Release-Version
|
||||
release.prerelease_helper=Wir möchten darauf hinweisen, dass dieses Release nicht für den produktiven Einsatz gedacht ist.
|
||||
release.publish=Release veröffentlichen
|
||||
release.save_draft=Entwurf speichern
|
||||
release.edit_release=Release bearbeiten
|
||||
release.tag_name_already_exist=Ein Release mit diesem Tag existiert bereits.
|
||||
|
||||
[org]
|
||||
org_name_holder=Name der Organisation
|
||||
org_name_helper=Gute Namen von Organisationen sind kurz und einprägsam.
|
||||
org_email_helper=Das E-Mail-Konto der Organisation empfängt alle Benachrichtigungen.
|
||||
org_email_helper=Die E-Mail-Adresse der Organisation erhält alle Benachrichtigungen und Bestätigungs-E-Mails.
|
||||
create_org=Organisation erstellen
|
||||
repo_updated=Aktualisiert
|
||||
people=Personen
|
||||
@@ -387,6 +498,9 @@ team_name_helper=Verwende diesen Namen, um dich auf dieses Team zu beziehen.
|
||||
team_desc_helper=Was hat es mit diesem Team auf sich?
|
||||
team_permission_desc=Welche Berechtigungsstufe soll das Team haben?
|
||||
|
||||
form.name_reserved=Organisationsname '%s' ist bereits vergeben.
|
||||
form.name_pattern_not_allowed=Organisations-Namensmuster '%s' ist nicht zulässig.
|
||||
|
||||
settings=Einstellungen
|
||||
settings.options=Optionen
|
||||
settings.full_name=Vollständiger Name
|
||||
@@ -462,11 +576,18 @@ dashboard.operation_name=Name der Operation
|
||||
dashboard.operation_switch=Switch
|
||||
dashboard.operation_run=Ausführen
|
||||
dashboard.clean_unbind_oauth=ungebundene OAuths bereinigen
|
||||
dashboard.clean_unbind_oauth_success=Alle aufheben OAuthes erfolgreich gelöscht wurden.
|
||||
dashboard.clean_unbind_oauth_success=Alle ungebundenen OAuth-Tokens wurden gelöscht.
|
||||
dashboard.delete_inactivate_accounts=inaktive Konten löschen
|
||||
dashboard.delete_inactivate_accounts_success=Alle inaktive Konten erfolgreich gelöscht wurden.
|
||||
dashboard.delete_repo_archives=Alle Repositories Archive löschen
|
||||
dashboard.delete_repo_archives_success=Alle Repositories Archive wurden erfolgreich gelöscht.
|
||||
dashboard.delete_inactivate_accounts_success=Alle inaktiven Konten wurden erfolgreich gelöscht.
|
||||
dashboard.delete_repo_archives=Alle Repository-Archive löschen
|
||||
dashboard.delete_repo_archives_success=Alle Repositoriy-Archive wurden gelöscht.
|
||||
dashboard.git_gc_repos=Führe Garbage Collection auf Repositories aus
|
||||
dashboard.git_gc_repos_success=Garbage Collection wurde auf allen Repositories erfolgreich ausgeführt.
|
||||
dashboard.resync_all_sshkeys=Überschreibe '.ssh/authorized_keys' Datei (Warnung: Keys, die nicht zu Gogs gehören werden verloren gehen)
|
||||
dashboard.resync_all_sshkeys_success=Alle öffentlichen Keys sind erfolgreich neu geschrieben worden.
|
||||
dashboard.resync_all_update_hooks=Überschreibe alle Hooks der Repositories (benötigt, wenn sich der Pfad in der Konfiguration ändert)
|
||||
dashboard.resync_all_update_hooks_success=Die Hooks aller Repositories sind erfolgreich neu geschrieben worden.
|
||||
|
||||
dashboard.server_uptime=Server-Uptime
|
||||
dashboard.current_goroutine=Aktuelle Goroutines
|
||||
dashboard.current_memory_usage=Aktuelle Speichernutzung
|
||||
@@ -512,11 +633,11 @@ users.update_profile_success=Kontoprofil aktualisiert
|
||||
users.edit_account=Konto bearbeiten
|
||||
users.is_activated=Dieses Konto ist aktiviert
|
||||
users.is_admin=Dieses Konto hat Administratorrechte
|
||||
users.allow_git_hook=Dieses Konto verfügt über Berechtigungen zum Erstellen von Git hooks
|
||||
users.allow_git_hook=Dieses Konto ist berechtigt, Git-Hooks zu erstellen
|
||||
users.update_profile=Kontoprofil aktualisieren
|
||||
users.delete_account=Dieses Konto löschen
|
||||
users.still_own_repo=Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
|
||||
users.still_has_org=Dieses Konto noch Mitgliedschaft in der Organisation, Sie nach links oder löschen Sie sie zuerst.
|
||||
users.still_own_repo=Dieses Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden.
|
||||
users.still_has_org=Dieses Konto ist noch Mitglied einer Organisation, bitte entferne diese Mitgliedschaft zuerst.
|
||||
|
||||
orgs.org_manage_panel=Organisationenverwaltung
|
||||
orgs.name=Name
|
||||
@@ -543,13 +664,17 @@ auths.domain=Domain
|
||||
auths.host=Host
|
||||
auths.port=Port
|
||||
auths.base_dn=Base DN
|
||||
auths.attributes=Suchattribute
|
||||
auths.attribute_username=Benutzername Attribut
|
||||
auths.attribute_name=Vorname Attribut
|
||||
auths.attribute_surname=Nachname Attribut
|
||||
auths.attribute_mail=E-Mail Attribut
|
||||
auths.filter=Suchfilter
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=SMTP-Authentifizierungstyp
|
||||
auths.smtphost=SMTP-Host
|
||||
auths.smtpport=SMTP-Port
|
||||
auths.enable_tls=TLS-Verschlüsselung aktivieren
|
||||
auths.pam_service_name=PAM Dienstname
|
||||
auths.enable_auto_register=Automatische Registrierung aktivieren
|
||||
auths.tips=Tipps
|
||||
auths.edit=Authentifizierungseinstellungen bearbeiten
|
||||
@@ -586,6 +711,7 @@ config.db_path_helper=(nur für "sqlite3")
|
||||
config.service_config=Service-Einstellungen
|
||||
config.register_email_confirm=E-Mail-Bestätigung bei Registrierung
|
||||
config.disable_register=Registrierung deaktivieren
|
||||
config.show_registration_button=Zeige die Schaltfläche Registrieren
|
||||
config.require_sign_in_view=Ansehen erfordert Registrierung
|
||||
config.mail_notify=E-Mail-Benachrichtigung
|
||||
config.enable_cache_avatar=Avatar-Cache aktivieren
|
||||
@@ -594,8 +720,10 @@ config.reset_password_code_lives=Passwortcode Lebensdauer
|
||||
config.webhook_config=Webhook-Einstellungen
|
||||
config.task_interval=Task-Intervall
|
||||
config.deliver_timeout=Zeitlimit für Zustellung
|
||||
config.skip_tls_verify=TLS verifikation überspringen
|
||||
config.mailer_config=Mailer-Einstellungen
|
||||
config.mailer_enabled=Aktiviert
|
||||
config.mailer_disable_helo=HELO Deaktivieren
|
||||
config.mailer_name=Name
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Benutzer
|
||||
@@ -639,12 +767,12 @@ notices.op=Op.
|
||||
notices.delete_success=System-Mitteilung erfolgreich gelöscht.
|
||||
|
||||
[action]
|
||||
create_repo=hat Repository <a href="%s/%s">%s</a> erstellt
|
||||
commit_repo=hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht
|
||||
create_issue=hat Issue <a href="%s/%s/issues/%s">%s#%s</a> eröffnet
|
||||
comment_issue=hat Issue <a href="%s/%s/issues/%s">%s#%s</a> kommentiert
|
||||
transfer_repo=hat Repository <code>%s</code> transferiert an <a href="/%s%s">%s</a>
|
||||
push_tag=hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht
|
||||
create_repo=hat Repository <a href="%s">%s</a> erstellt
|
||||
commit_repo=hat nach <a href="%s/src/%s">%[2]s</a> in <a href="%[1]s">%[3]s</a> gepusht
|
||||
create_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> eröffnet`
|
||||
comment_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> kommentiert`
|
||||
transfer_repo=hat Repository <code>%s</code> transferiert an <a href="%s">%s</a>
|
||||
push_tag=hat nach <a href="%s/src/%s">%[2]s</a> in <a href="%[1]s">%[3]s</a> gepusht
|
||||
compare_2_commits=Zeige Vergleich dieser 2 Commits
|
||||
|
||||
[tool]
|
||||
@@ -668,16 +796,3 @@ years=%[2]s %[1]d Jahren
|
||||
raw_seconds=Sekunden
|
||||
raw_minutes=Minuten
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
app_desc = A painless self-hosted Git service written in Go
|
||||
app_desc = A painless self-hosted Git service
|
||||
|
||||
home = Home
|
||||
dashboard = Dashboard
|
||||
@@ -39,10 +39,18 @@ issues = Issues
|
||||
|
||||
cancel = Cancel
|
||||
|
||||
[search]
|
||||
search = Search...
|
||||
repository = Repository
|
||||
user = User
|
||||
issue = Issue
|
||||
code = Code
|
||||
|
||||
[install]
|
||||
install = Installation
|
||||
title = Install Steps For First-time Run
|
||||
requite_db_desc = Gogs requires MySQL, PostgreSQL or SQLite3.
|
||||
db_title = Database Settings
|
||||
db_type = Database Type
|
||||
host = Host
|
||||
user = User
|
||||
@@ -52,22 +60,39 @@ db_helper = Please use INNODB engine with utf8_general_ci charset for MySQL.
|
||||
ssl_mode = SSL Mode
|
||||
path = Path
|
||||
sqlite_helper = The file path of SQLite3 database.
|
||||
general_title = General Settings of Gogs
|
||||
err_empty_sqlite_path = SQLite3 database path cannot be empty.
|
||||
|
||||
general_title = Application General Settings
|
||||
app_name = Application Name
|
||||
app_name_helper = Put your organization name here huge and loud!
|
||||
repo_path = Repository Root Path
|
||||
repo_path_helper = All Git remote repositories will be saved to this directory.
|
||||
run_user = Run User
|
||||
run_user_helper = The user must have access to Repository Root Path and run Gogs.
|
||||
domain = Domain
|
||||
domain_helper = This affects SSH clone URLs.
|
||||
http_port = HTTP Port
|
||||
http_port_helper = Port number which application will listen on.
|
||||
app_url = Application URL
|
||||
app_url_helper = This affects HTTP/HTTPS clone URL and somewhere in e-mail.
|
||||
email_title = Email Service Settings(Optional)
|
||||
|
||||
optional_title = Optional Settings
|
||||
email_title = E-mail Service Settings
|
||||
smtp_host = SMTP Host
|
||||
smtp_from = From
|
||||
smtp_from_helper = Mail from address, RFC 5322. It can be just an email address, or the "Name" <email@example.com> format.
|
||||
mailer_user = Sender E-mail
|
||||
mailer_password = Sender Password
|
||||
notify_title = Notification Settings(Optional)
|
||||
mailer_password = Sender Password
|
||||
register_confirm = Enable Register Confirmation
|
||||
mail_notify = Enable Mail Notification
|
||||
server_service_title = Server and Other Services Settings
|
||||
offline_mode = Enable Offline Mode
|
||||
offline_mode_popup = Disable CDN even in production mode, all resource files will be served locally.
|
||||
disable_registration = Disable Self-registration
|
||||
disable_registration_popup = Disable user self-registration, only admin can create accounts.
|
||||
require_sign_in_view = Enable Require Sign In to View Pages
|
||||
require_sign_in_view_popup = Only signed in users can view pages, visitors will only be able to see sign in/up pages.
|
||||
admin_setting_desc = You do not have to create an admin account right now, user whoever ID=1 will gain admin access automatically.
|
||||
admin_title = Admin Account Settings
|
||||
admin_name = Username
|
||||
admin_password = Password
|
||||
@@ -81,7 +106,7 @@ invalid_repo_path = Repository root path is invalid: %v
|
||||
run_user_not_match = Run user isn't the current user: %s -> %s
|
||||
save_config_failed = Fail to save configuration: %v
|
||||
invalid_admin_setting = Admin account setting is invalid: %v
|
||||
install_success = Welcome! We're glad that you choose Gogs, have fun and take care.
|
||||
install_success = Welcome! We're glad that you chose Gogs, have fun and take care.
|
||||
|
||||
[home]
|
||||
uname_holder = Username or E-mail
|
||||
@@ -105,19 +130,24 @@ remember_me = Remember Me
|
||||
forgot_password= Forgot Password
|
||||
forget_password = Forgot password?
|
||||
sign_up_now = Need an account? Sign up now.
|
||||
confirmation_mail_sent_prompt = A new confirmation e-mail has been sent to <b>%s</b>, please check your inbox within the next %d hours to complete your registration.
|
||||
confirmation_mail_sent_prompt = A new confirmation e-mail has been sent to <b>%s</b>, please check your inbox within the next %d hours to complete the registration process.
|
||||
sign_in_email = Sign in to your e-mail
|
||||
active_your_account = Activate Your Account
|
||||
resent_limit_prompt = Sorry, you are sending an activation e-mail too frequently. Please wait 3 minutes.
|
||||
has_unconfirmed_mail = Hi %s, you have an unconfirmed email address(<b>%s</b>). If you haven't received a confirmation e-mail or need to resend a new one, please click on the button below.
|
||||
resent_limit_prompt = Sorry, you already requested an activation email recently. Please wait 3 minutes then try again.
|
||||
has_unconfirmed_mail = Hi %s, you have an unconfirmed e-mail address (<b>%s</b>). If you haven't received a confirmation e-mail or need to resend a new one, please click on the button below.
|
||||
resend_mail = Click here to resend your activation e-mail
|
||||
email_not_associate = This e-mail address does not associate to any account.
|
||||
email_not_associate = This e-mail address is not associated with any account.
|
||||
send_reset_mail = Click here to (re)send your password reset e-mail
|
||||
reset_password = Reset Your Password
|
||||
invalid_code = Sorry, your confirmation code has expired or not valid.
|
||||
reset_password_helper = Click here to reset your password
|
||||
password_too_short = Password length cannot be less then 6.
|
||||
|
||||
[modal]
|
||||
yes = Yes
|
||||
no = No
|
||||
modify = Modify
|
||||
|
||||
[form]
|
||||
UserName = Username
|
||||
RepoName = Repository name
|
||||
@@ -134,6 +164,7 @@ AdminEmail = Admin E-mail
|
||||
require_error = ` cannot be empty.`
|
||||
alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.`
|
||||
alpha_dash_dot_error = ` must be valid alpha or numeric or dash(-_) or dot characters.`
|
||||
size_error = ` must be size %s.`
|
||||
min_size_error = ` must contain at least %s characters.`
|
||||
max_size_error = ` must contain at most %s characters.`
|
||||
email_error = ` is not a valid e-mail address.`
|
||||
@@ -147,32 +178,30 @@ repo_name_been_taken = Repository name has been already taken.
|
||||
org_name_been_taken = Organization name has been already taken.
|
||||
team_name_been_taken = Team name has been already taken.
|
||||
email_been_used = E-mail address has been already used.
|
||||
ssh_key_been_used = Public key name has been used.
|
||||
illegal_username = Your username contains illegal characters.
|
||||
illegal_repo_name = Repository name contains illegal characters.
|
||||
illegal_org_name = Organization name contains illegal characters.
|
||||
ssh_key_been_used = Public key name or content has been used.
|
||||
illegal_team_name = Team name contains illegal characters.
|
||||
username_password_incorrect = Username or password is not correct.
|
||||
enterred_invalid_repo_name = Please make sure you entered repository name is correct.
|
||||
enterred_invalid_owner_name = Please make sure you entered owner name is correct.
|
||||
enterred_invalid_password = Please make sure you entered password is correct.
|
||||
enterred_invalid_repo_name = Please make sure that the repository name you entered is correct.
|
||||
enterred_invalid_owner_name = Please make sure that the owner name you entered is correct.
|
||||
enterred_invalid_password = Please make sure the that password you entered is correct.
|
||||
user_not_exist = Given user does not exist.
|
||||
last_org_owner = The user to remove is the last member in owner team. There must be another owner.
|
||||
last_org_owner = Removing the last user from a owner team isn't allowed, as there must always be at least one owner in any given organization.
|
||||
|
||||
invalid_ssh_key = Sorry, we're not able to verify your SSH key: %s
|
||||
unable_verify_ssh_key = Gogs cannot verify your SSH key, but we assume that is valid, please make sure yourself.
|
||||
unable_verify_ssh_key = Gogs cannot verify your SSH key, but we assume that it is valid, please double-check it.
|
||||
auth_failed = Authentication failed: %v
|
||||
|
||||
still_own_repo = Your account still have ownership of repository, you have to delete or transfer them first.
|
||||
still_has_org = Your account still have membership of organization, you have to left or delete them first.
|
||||
still_own_repo = Your account still has ownership over at least one repository, you have to delete or transfer them first.
|
||||
still_has_org = Your account still has membership in at least one organization, you have to leave or delete your memberships first.
|
||||
org_still_own_repo = This organization still have ownership of repository, you have to delete or transfer them first.
|
||||
|
||||
still_own_user = This authentication still has used by some users, you should move them and then delete again.
|
||||
still_own_user = This authentication still is in use by at least one user, please remove them from the authentication and try again.
|
||||
|
||||
target_branch_not_exist = Target branch does not exist
|
||||
target_branch_not_exist = Target branch does not exist.
|
||||
|
||||
[user]
|
||||
change_avatar = Change your avatar at gravatar.com
|
||||
change_custom_avatar = Change your avatar in settings
|
||||
join_on = Joined on
|
||||
repositories = Repositories
|
||||
activity = Public Activity
|
||||
@@ -180,6 +209,9 @@ followers = Followers
|
||||
starred = Starred
|
||||
following = Following
|
||||
|
||||
form.name_reserved = Username '%s' is reserved.
|
||||
form.name_pattern_not_allowed = Username pattern '%s' is not allowed.
|
||||
|
||||
[settings]
|
||||
profile = Profile
|
||||
password = Password
|
||||
@@ -191,27 +223,46 @@ delete = Delete Account
|
||||
uid = Uid
|
||||
|
||||
public_profile = Public Profile
|
||||
profile_desc = Your Email address is public and will be used for any account related notifications, and any web based operations made via the site.
|
||||
profile_desc = Your E-mail address is public and will be used for any account related notifications, and any web based operations made via the site.
|
||||
full_name = Full Name
|
||||
website = Website
|
||||
location = Location
|
||||
update_profile = Update Profile
|
||||
update_profile_success = Your profile has been updated successfully.
|
||||
change_username = Username Changed
|
||||
change_username_desc = Username has been changed, do you want to continue? This will affect all links relate to your account.
|
||||
change_username_desc = You changed your username. This will affect the way how links relate to your account. Do you want to continue?
|
||||
continue = Continue
|
||||
cancel = Cancel
|
||||
|
||||
enable_custom_avatar = Enable Custom Avatar
|
||||
enable_custom_avatar_helper = Enable this to disable fetch from Gravatar
|
||||
choose_new_avatar = Choose new avatar
|
||||
update_avatar = Update Avatar Setting
|
||||
uploaded_avatar_not_a_image = Uploaded file is not a image.
|
||||
no_custom_avatar_available = No custom avatar available, cannot enable it.
|
||||
update_avatar_success = Your avatar setting has been updated successfully.
|
||||
|
||||
change_password = Change Password
|
||||
old_password = Current Password
|
||||
new_password = New Password
|
||||
password_incorrect = Current password is not correct.
|
||||
change_password_success = Password is changed successfully. You can now sign in via new password.
|
||||
change_password_success = Your password was successfully changed. You can now sign using this new password.
|
||||
|
||||
emails = E-mail Addresses
|
||||
manage_emails = Manage e-mail addresses
|
||||
email_desc = Your primary e-mail address will be used for notifications and other operations.
|
||||
primary = Primary
|
||||
primary_email = Set as primary
|
||||
delete_email = Delete
|
||||
add_new_email = Add new e-mail address
|
||||
add_email = Add e-mail
|
||||
add_email_confirmation_sent = A new confirmation e-mail has been sent to <b>%s</b>, please check your inbox within the next %d hours to complete the confirmation process.
|
||||
add_email_success = Your new E-mail address was successfully added.
|
||||
|
||||
manage_ssh_keys = Manage SSH Keys
|
||||
add_key = Add Key
|
||||
ssh_desc = This is a list of SSH keys associated with your account. Remove any keys that you do not recognize.
|
||||
ssh_helper = <strong>Need help?</strong> Check out our guide to <a href="%s">generating SSH keys</a> or troubleshoot <a href="%s">common SSH Problems</a>.
|
||||
ssh_desc = This is a list of SSH keys associated with your account. As these keys allow anyone using them to gain access to your repositories, it is highly important that you make sure you recognize them.
|
||||
ssh_helper = <strong>Don't know how?</strong> Check out GitHub's guide to <a href="%s">create your own SSH keys</a> or solve <a href="%s">common problems</a> you might encounter using SSH.
|
||||
add_new_key = Add SSH Key
|
||||
key_name = Key Name
|
||||
key_content = Content
|
||||
@@ -229,12 +280,12 @@ unbind_success = Social account has been unbound.
|
||||
manage_access_token = Manage Personal Access Tokens
|
||||
generate_new_token = Generate New Token
|
||||
tokens_desc = Tokens you have generated that can be used to access the Gogs API.
|
||||
new_token_desc = As for now, every token will have full access to your account.
|
||||
new_token_desc = Each token will have full access to your account.
|
||||
token_name = Token Name
|
||||
generate_token = Generate Token
|
||||
generate_token_succees = New access token has been generated successfully! Make sure to copy your new personal access token now. You won't be able to see it again!
|
||||
generate_token_succees = Your access token was successfully generated! Make sure to copy it right now, as you won't be able to see it again later!
|
||||
delete_token = Delete
|
||||
delete_token_success = Personal access token has been deleted successfully! Don't forget to update your applications as well.
|
||||
delete_token_success = This personal access token has been successfully removed successfully! Don't forget to update your applications as well.
|
||||
|
||||
delete_account = Delete Your Account
|
||||
delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone!
|
||||
@@ -245,12 +296,12 @@ delete_account_desc = This account is going to be deleted permanently, do you wa
|
||||
[repo]
|
||||
owner = Owner
|
||||
repo_name = Repository Name
|
||||
repo_name_helper = Great repository names are short, memorable and <strong>unique</strong>.
|
||||
repo_name_helper = A good repository name is usually composed of short, memorable and unique keywords.
|
||||
visibility = Visibility
|
||||
visiblity_helper = This repository is <span class="label label-red label-radius">Private</span>
|
||||
fork_repo = Fork Repository
|
||||
fork_from = Fork From
|
||||
fork_visiblity_helper = Forked repository cannot change its visiblity
|
||||
fork_visiblity_helper = You cannot alter the visibility of a forked repository.
|
||||
repo_desc = Description
|
||||
repo_lang = Language
|
||||
repo_lang_helper = Select a .gitignore file
|
||||
@@ -259,15 +310,20 @@ license_helper = Select a license file
|
||||
init_readme = Initialize this repository with a README.md
|
||||
create_repo = Create Repository
|
||||
default_branch = Default Branch
|
||||
mirror_interval = Mirror Interval(hour)
|
||||
goget_meta = Go-Get Meta
|
||||
goget_meta_helper = This repository will be <span class="label label-blue label-radius">Go-Getable</span>
|
||||
mirror_interval = Mirror Interval (hour)
|
||||
|
||||
form.name_reserved = Repository name '%s' is reserved.
|
||||
form.name_pattern_not_allowed = Repository name pattern '%s' is not allowed.
|
||||
|
||||
need_auth = Need Authorization
|
||||
migrate_type = Migration Type
|
||||
migrate_type_helper = This repository will be a <span class="label label-blue label-radius">Mirror</span>
|
||||
migrate_type_helper = This repository will be a <span class="label label-blue label-radius">mirror</span>
|
||||
migrate_repo = Migrate Repository
|
||||
migrate.clone_address = Clone Address
|
||||
migrate.invalid_local_path = Invalid local path, it does not exist or not a directory.
|
||||
|
||||
forked_from = forked from
|
||||
fork_from_self = You cannot fork repository you already owned!
|
||||
copy_link = Copy
|
||||
click_to_copy = Copy to clipboard
|
||||
copied = Copied OK
|
||||
@@ -290,11 +346,14 @@ branch_and_tags = Branches & Tags
|
||||
branches = Branches
|
||||
tags = Tags
|
||||
issues = Issues
|
||||
labels = Labels
|
||||
milestones = Milestones
|
||||
commits = Commits
|
||||
releases = Releases
|
||||
file_raw = Raw
|
||||
file_history = History
|
||||
file_view_raw = View Raw
|
||||
file_permalink = Permalink
|
||||
|
||||
commits.commits = Commits
|
||||
commits.search = Search commits
|
||||
@@ -305,6 +364,34 @@ commits.date = Date
|
||||
commits.older = Older
|
||||
commits.newer = Newer
|
||||
|
||||
issues.new = New Issue
|
||||
issues.new_label = New Label
|
||||
issues.new_label_placeholder = Label name...
|
||||
issues.open_tab = %d Open
|
||||
issues.close_tab = %d Closed
|
||||
issues.filter_label = Label
|
||||
issues.filter_label_no_select = No selected label
|
||||
issues.filter_milestone = Milestone
|
||||
issues.filter_assignee = Assignee
|
||||
issues.filter_type = Type
|
||||
issues.filter_type.all_issues = All issues
|
||||
issues.filter_type.assigned_to_you = Assigned to you
|
||||
issues.filter_type.created_by_you = Created by you
|
||||
issues.filter_type.mentioning_you = Mentioning you
|
||||
issues.opened_by = opened %[1]s by <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous = Previous
|
||||
issues.next = Next
|
||||
issues.label_title = Label name
|
||||
issues.label_color = Label color
|
||||
issues.label_count = %d labels
|
||||
issues.label_open_issues = %d open issues
|
||||
issues.label_edit = Edit
|
||||
issues.label_delete = Delete
|
||||
issues.label_modify = Label Modification
|
||||
issues.label_deletion = Label Deletion
|
||||
issues.label_deletion_desc = Delete label will remove its information in all related issues. Do you want to continue?
|
||||
issues.label_deletion_success = Label has been deleted successfully!
|
||||
|
||||
settings = Settings
|
||||
settings.options = Options
|
||||
settings.collaboration = Collaboration
|
||||
@@ -316,13 +403,13 @@ settings.danger_zone = Danger Zone
|
||||
settings.site = Official Site
|
||||
settings.update_settings = Update Settings
|
||||
settings.change_reponame = Repository Name Changed
|
||||
settings.change_reponame_desc = Repository name has been changed, do you want to continue? This will affect all links relate to this repository.
|
||||
settings.change_reponame_desc = Repository name was changed. This will affect how links relate to the repository. Do you want to continue?
|
||||
settings.transfer = Transfer Ownership
|
||||
settings.transfer_desc = Transfer this repo to another user or to an organization where you have admin rights.
|
||||
settings.new_owner_has_same_repo = New owner already has a repository with same name.
|
||||
settings.transfer_desc = Transfer this repository to another user or to an organization in which you have admin rights.
|
||||
settings.new_owner_has_same_repo = The new owner already has a repository with same name. Please choose another name.
|
||||
settings.delete = Delete This Repository
|
||||
settings.delete_desc = Once you delete a repository, there is no going back. Please be certain.
|
||||
settings.transfer_notices = <p>- You will lose access if new owner is a individual user.</p><p>- You will remain access if new owner is an organization and you're one of the owners.</p>
|
||||
settings.transfer_notices = <p>- You will lose access if new owner is a individual user.</p><p>- You will conserve access if new owner is an organization and if you're one of the owners.</p>
|
||||
settings.update_settings_success = Repository options has been updated successfully.
|
||||
settings.transfer_owner = New Owner
|
||||
settings.make_transfer = Make Transfer
|
||||
@@ -333,21 +420,21 @@ settings.add_collaborator_success = New collaborator has been added.
|
||||
settings.remove_collaborator_success = Collaborator has been removed.
|
||||
settings.user_is_org_member = User is organization member who cannot be added as a collaborator.
|
||||
settings.add_webhook = Add Webhook
|
||||
settings.hooks_desc = Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.githooks_desc = Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to apply custom operations.
|
||||
settings.githook_edit_desc = If hook is not active, sample content will be presented. Leave content to be blank will disable this hook.
|
||||
settings.hooks_desc = Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gogs, we will handle the notification to the target host you specify. Learn more in this <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.githooks_desc = Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to perform custom operations.
|
||||
settings.githook_edit_desc = If the hook is inactive, sample content will be presented. Leaving content to an empty value will disable this hook.
|
||||
settings.githook_name = Hook Name
|
||||
settings.githook_content = Hook Content
|
||||
settings.update_githook = Update Hook
|
||||
settings.remove_hook_success = Webhook has been removed.
|
||||
settings.add_webhook_desc = We’ll send a <code>POST</code> request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). More information can be found in <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.add_webhook_desc = Gogs will send a <code>POST</code> request to the URL you specify, along with regarding the event that occured. You can also specify what kind of data format you'd like to get upon triggering the hook (JSON, x-www-form-urlencoded, XML, etc). More information can be found in our <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.payload_url = Payload URL
|
||||
settings.content_type = Content Type
|
||||
settings.secret = Secret
|
||||
settings.event_desc = Which events would you like to trigger this webhook?
|
||||
settings.event_desc = Upon which events should this webhook be triggered?
|
||||
settings.event_push_only = Just the <code>push</code> event.
|
||||
settings.active = Active
|
||||
settings.active_helper = We will deliver event details when this hook is triggered.
|
||||
settings.active_helper = Details regarding the event which triggered the hook will be delivered as well.
|
||||
settings.add_hook_success = New webhook has been added.
|
||||
settings.update_webhook = Update Webhook
|
||||
settings.update_hook_success = Webhook has been updated.
|
||||
@@ -368,10 +455,34 @@ diff.stats_desc = <strong> %d changed files</strong> with <strong>%d additions</
|
||||
diff.bin = BIN
|
||||
diff.view_file = View File
|
||||
|
||||
release.releases = Releases
|
||||
release.new_release = New Release
|
||||
release.draft = Draft
|
||||
release.prerelease = Pre-Release
|
||||
release.stable = Stable
|
||||
release.edit = edit
|
||||
release.ahead = <strong>%d</strong> commits to %s since this release
|
||||
release.source_code = Source Code
|
||||
release.tag_name = Tag name
|
||||
release.target = Target
|
||||
release.tag_helper = Choose an existing tag, or create a new tag on publish.
|
||||
release.release_title = Release title
|
||||
release.content_with_md = Content with <a href="%s">Markdown</a>
|
||||
release.write = Write
|
||||
release.preview = Preview
|
||||
release.content_placeholder = Write some content
|
||||
release.loading = Loading...
|
||||
release.prerelease_desc = This is a pre-release
|
||||
release.prerelease_helper = We’ll point out that this release is not production-ready.
|
||||
release.publish = Publish Release
|
||||
release.save_draft = Save Draft
|
||||
release.edit_release = Edit Release
|
||||
release.tag_name_already_exist = Release with this tag name has already existed.
|
||||
|
||||
[org]
|
||||
org_name_holder = Organization Name
|
||||
org_name_helper = Great organization names are short and memorable.
|
||||
org_email_helper = Organization's Email receives all notifications and confirmations.
|
||||
org_email_helper = Organization's E-mail receives all notifications and confirmations.
|
||||
create_org = Create Organization
|
||||
repo_updated = Updated
|
||||
people = People
|
||||
@@ -387,6 +498,9 @@ team_name_helper = You'll use this name to mention this team in conversations.
|
||||
team_desc_helper = What is this team all about?
|
||||
team_permission_desc = What permission level should this team have?
|
||||
|
||||
form.name_reserved = Organization name '%s' is reserved.
|
||||
form.name_pattern_not_allowed = Organization name pattern '%s' is not allowed.
|
||||
|
||||
settings = Settings
|
||||
settings.options = Options
|
||||
settings.full_name = Full Name
|
||||
@@ -394,11 +508,11 @@ settings.website = Website
|
||||
settings.location = Location
|
||||
settings.update_settings = Update Settings
|
||||
settings.change_orgname = Organization Name Changed
|
||||
settings.change_orgname_desc = Organization name has been changed, do you want to continue? This will affect all links relate to this organization.
|
||||
settings.update_setting_success = Organization setting has been updated successfully.
|
||||
settings.change_orgname_desc = Organization name has been changed. This will affect how links relate to the organization. Do you want to continue?
|
||||
settings.update_setting_success = Organization settings were successfully updated.
|
||||
settings.delete = Delete Organization
|
||||
settings.delete_account = Delete This Organization
|
||||
settings.delete_prompt = The operation will delete this organization permanently, and <strong>CANNOT</strong> be undone!
|
||||
settings.delete_prompt = The organization will be permanently removed, and this <strong>CANNOT</strong> be undone!
|
||||
settings.confirm_delete_account = Confirm Deletion
|
||||
settings.delete_org_title = Organization Deletion
|
||||
settings.delete_org_desc = This organization is going to be deleted permanently, do you want to continue?
|
||||
@@ -432,7 +546,7 @@ teams.update_settings = Update Settings
|
||||
teams.delete_team = Delete This Team
|
||||
teams.add_team_member = Add Team Member
|
||||
teams.delete_team_title = Team Deletion
|
||||
teams.delete_team_desc = This team is going to be deleted, do you want to continue? Members of this team may lose access to some repositories.
|
||||
teams.delete_team_desc = As this team will be deleted, members of this team may lose access to some repositories. Do you want to continue?
|
||||
teams.delete_team_success = Given team has been deleted successfully.
|
||||
teams.read_permission_desc = This team grants <strong>Read</strong> access: members can view and clone the team's repositories.
|
||||
teams.write_permission_desc = This team grants <strong>Write</strong> access: members can read from and push to the team's repositories.
|
||||
@@ -467,6 +581,13 @@ dashboard.delete_inactivate_accounts = Delete all inactive accounts
|
||||
dashboard.delete_inactivate_accounts_success = All inactivate accounts have been deleted successfully.
|
||||
dashboard.delete_repo_archives = Delete all repositories archives
|
||||
dashboard.delete_repo_archives_success = All repositories archives have been deleted successfully.
|
||||
dashboard.git_gc_repos = Do garbage collection on repositories
|
||||
dashboard.git_gc_repos_success = All repositories have done garbage collection successfully.
|
||||
dashboard.resync_all_sshkeys = Rewrite '.ssh/authorized_keys' file (caution: non-Gogs keys will be lost)
|
||||
dashboard.resync_all_sshkeys_success = All public keys have been rewritten successfully.
|
||||
dashboard.resync_all_update_hooks = Rewrite all update hook of repositories (needed when custom config path is changed)
|
||||
dashboard.resync_all_update_hooks_success = All repositories' update hook have been rewritten successfully.
|
||||
|
||||
dashboard.server_uptime = Server Uptime
|
||||
dashboard.current_goroutine = Current Goroutines
|
||||
dashboard.current_memory_usage = Current Memory Usage
|
||||
@@ -515,8 +636,8 @@ users.is_admin = This account has administrator permissions
|
||||
users.allow_git_hook = This account has permissions to create Git hooks
|
||||
users.update_profile = Update Account Profile
|
||||
users.delete_account = Delete This Account
|
||||
users.still_own_repo = This account still have ownership of repository, you have to delete or transfer them first.
|
||||
users.still_has_org = This account still have membership of organization, you have to left or delete them first.
|
||||
users.still_own_repo = This account still has ownership over at least one repository, you have to delete or transfer them first.
|
||||
users.still_has_org = This account still has membership in at least one organization, you have to leave or delete the organizations first.
|
||||
|
||||
orgs.org_manage_panel = Organization Manage Panel
|
||||
orgs.name = Name
|
||||
@@ -543,13 +664,17 @@ auths.domain = Domain
|
||||
auths.host = Host
|
||||
auths.port = Port
|
||||
auths.base_dn = Base DN
|
||||
auths.attributes = Search Attributes
|
||||
auths.attribute_username = Username attribute
|
||||
auths.attribute_name = First name attribute
|
||||
auths.attribute_surname = Surname attribute
|
||||
auths.attribute_mail = E-mail attribute
|
||||
auths.filter = Search Filter
|
||||
auths.ms_ad_sa = Ms Ad SA
|
||||
auths.smtp_auth = SMTP Authorization Type
|
||||
auths.smtphost = SMTP Host
|
||||
auths.smtpport = SMTP Port
|
||||
auths.enable_tls = Enable TLS Encryption
|
||||
auths.pam_service_name = PAM Service Name
|
||||
auths.enable_auto_register = Enable Auto Registration
|
||||
auths.tips = Tips
|
||||
auths.edit = Edit Authorization Setting
|
||||
@@ -584,18 +709,21 @@ config.db_ssl_mode_helper = (for "postgres" only)
|
||||
config.db_path = Path
|
||||
config.db_path_helper = (for "sqlite3" only)
|
||||
config.service_config = Service Configuration
|
||||
config.register_email_confirm = Register Email Confirmation
|
||||
config.register_email_confirm = Require E-mail Confirmation
|
||||
config.disable_register = Disable Registration
|
||||
config.show_registration_button = Show Register Button
|
||||
config.require_sign_in_view = Require Sign In View
|
||||
config.mail_notify = Mail Notification
|
||||
config.enable_cache_avatar = Enable Cache Avatar
|
||||
config.active_code_lives = Active Code Lives
|
||||
config.reset_password_code_lives = Reset Password Code Lives
|
||||
config.webhook_config = Webhook Configuration
|
||||
config.task_interval = Task Interval
|
||||
config.queue_length = Queue Length
|
||||
config.deliver_timeout = Deliver Timeout
|
||||
config.skip_tls_verify = Skip TLS Verify
|
||||
config.mailer_config = Mailer Configuration
|
||||
config.mailer_enabled = Enabled
|
||||
config.mailer_disable_helo = Disable HELO
|
||||
config.mailer_name = Name
|
||||
config.mailer_host = Host
|
||||
config.mailer_user = User
|
||||
@@ -639,12 +767,12 @@ notices.op = Op.
|
||||
notices.delete_success = System notice has been deleted successfully.
|
||||
|
||||
[action]
|
||||
create_repo = created repository <a href="%s/%s">%s</a>
|
||||
commit_repo = pushed to <a href="%s/%s/src/%s">%s</a> at <a href="%s/%s">%s</a>
|
||||
create_issue = opened issue <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
comment_issue = commented on issue <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
transfer_repo = transfered repository <code>%s</code> to <a href="/%s%s">%s</a>
|
||||
push_tag = pushed tag <a href="%s/%s/src/%s">%s</a> to <a href="%s/%s">%s</a>
|
||||
create_repo = created repository <a href="%s">%s</a>
|
||||
commit_repo = pushed to <a href="%s/src/%s">%[2]s</a> at <a href="%[1]s">%[3]s</a>
|
||||
create_issue = `opened issue <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue = `commented on issue <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
transfer_repo = transfered repository <code>%s</code> to <a href="%s">%s</a>
|
||||
push_tag = pushed tag <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits = View comparison for these 2 commits
|
||||
|
||||
[tool]
|
||||
@@ -667,16 +795,3 @@ months = %d months %s
|
||||
years = %d years %s
|
||||
raw_seconds = seconds
|
||||
raw_minutes = minutes
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
798
conf/locale/locale_es-ES.ini
Executable file
798
conf/locale/locale_es-ES.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Un servicio de Git auto alojado y sin complicaciones
|
||||
|
||||
home=Incio
|
||||
dashboard=Panel de control
|
||||
explore=Explorar
|
||||
help=Ayuda
|
||||
sign_in=Iniciar sesión
|
||||
social_sign_in=Inicio de sesión social: 2° paso <small>cuenta de asociado</small>
|
||||
sign_out=Cerrar sesión
|
||||
sign_up=Suscripción
|
||||
register=Registro
|
||||
website=Pagina Web
|
||||
version=Versión
|
||||
page=Página
|
||||
template=Plantilla
|
||||
language=Lenguaje
|
||||
|
||||
username=Nombre de usuario
|
||||
email=Correo electrónico
|
||||
password=Contraseña
|
||||
re_type=Ingrese de nuevo
|
||||
captcha=Captcha
|
||||
|
||||
repository=Repositorio
|
||||
organization=Organización
|
||||
mirror=Espejo
|
||||
new_repo=Nuevo repositorio
|
||||
new_migrate=Nueva Migración
|
||||
new_fork=Nuevo Fork del Repositorio
|
||||
new_org=Nueva organización
|
||||
manage_org=Administrar organizaciones
|
||||
admin_panel=Panel de administración
|
||||
account_settings=Configuraciones de la cuenta
|
||||
settings=Configuraciones
|
||||
|
||||
news_feed=entrada de noticias
|
||||
pull_requests=Solicitudes de retiro
|
||||
issues=Publicaciones
|
||||
|
||||
cancel=Cancelar
|
||||
|
||||
[search]
|
||||
search=Buscar...
|
||||
repository=Repositorio
|
||||
user=Usuario
|
||||
issue=Incidencia
|
||||
code=Código
|
||||
|
||||
[install]
|
||||
install=Instalación
|
||||
title=Pasos de la instalación por primera vez
|
||||
requite_db_desc=Gogs necesita MySQL, PostgreSQL o SQLite3.
|
||||
db_title=Configuración de base de datos
|
||||
db_type=Tipo de base de datos
|
||||
host=Anfitrión
|
||||
user=Usuario
|
||||
password=Contraseña
|
||||
db_name=Nombre de la base de datos
|
||||
db_helper=Por favor utilice el motor INNODB con la configuración de caracteres utf8_general_ci para MySQL.
|
||||
ssl_mode=Modo SSL
|
||||
path=Ruta
|
||||
sqlite_helper=Ruta del archivo de la base de datos de SQLite3.
|
||||
err_empty_sqlite_path=La ruta de la base de datos SQLite3 no puede estar vacía.
|
||||
|
||||
general_title=Configuración General de Gogs
|
||||
app_name=Nombre de la Aplicación
|
||||
app_name_helper=Pon aquí el nombre de tu organización, ¡alto y claro!
|
||||
repo_path=Ruta del repositorio de Raiz (Root)
|
||||
repo_path_helper=Todos los repositorios remotos de Git se guardarán en este directorio.
|
||||
run_user=Abrir el usuario
|
||||
run_user_helper=El usuario necesita tener acceso a la Ruta Raíz del Repositorio y ejecutar Gogs.
|
||||
domain=Dominio
|
||||
domain_helper=Esto afecta a las URLs para clonar por SSH.
|
||||
http_port=Puerto HTTP
|
||||
http_port_helper=Puerto en el que escuchará la aplicación.
|
||||
app_url=URL de la aplicación
|
||||
app_url_helper=Esto afecta a las URLs para clonar por HTTP/HTTPS y a algunos correos electrónicos.
|
||||
|
||||
optional_title=Configuración Opcional
|
||||
email_title=Configuración del Servicio de Correo
|
||||
smtp_host=SMTP Host
|
||||
smtp_from=Desde
|
||||
smtp_from_helper=Remitente del email, RFC 5322. Puede ser solamente una dirección de correo electrónico, o estar en el formato "Nombre" <email@example.com>.
|
||||
mailer_user=Remitente del Correo Electrónico
|
||||
mailer_password=Contraseña del Remitente
|
||||
register_confirm=Habilitar la Confirmación en el Registro
|
||||
mail_notify=Habilitar las Notificaciones de Correo
|
||||
server_service_title=Configuración de Servidor y Otros Servicios
|
||||
offline_mode=Activar el modo Sin Conexión
|
||||
offline_mode_popup=Desactivar el CDN incluso en el modo de producción, todos los recursos se servirán localmente.
|
||||
disable_registration=Desactivar Auto-Registro
|
||||
disable_registration_popup=Desactivar auto-registro del usuario, solo el administrador podrá crear cuentas nuevas.
|
||||
require_sign_in_view=Activar el Inicio de Sesión obligatorio para Ver Páginas
|
||||
require_sign_in_view_popup=Solo los usuarios logados pueden ver páginas, los visitantes anónimos solo podrán ver las páginas de login/registro.
|
||||
admin_setting_desc=No es necesario crear una cuenta de administrador ahora mismo, el usuario que tenga ID=1 obtendrá privilegios de administrador automáticamente.
|
||||
admin_title=Configuración de la Cuenta de Administrador
|
||||
admin_name=Nombre de usuario
|
||||
admin_password=Contraseña
|
||||
confirm_password=Confirmar Contraseña
|
||||
admin_email=Correo electrónico
|
||||
install_gogs=Instalar Gogs
|
||||
test_git_failed=Fallo al probar el comando 'git': %v
|
||||
sqlite3_not_available=Tu versión no soporta SQLite3, por favor descarga el binario oficial desde %s, NO la versión de gobuild.
|
||||
invalid_db_setting=La configuración de la base de datos no es correcta: %v
|
||||
invalid_repo_path=La ruta de la raíz del repositorio es inválida: %v
|
||||
run_user_not_match=El usuario que está ejecutando la aplicación no es el usuario actual: %s -> %s
|
||||
save_config_failed=Error al guardar la configuración: %v
|
||||
invalid_admin_setting=La configuración de la cuenta de administración es inválida: %v
|
||||
install_success=Bienvenido! Estamos encantados de que hayas escogido Gogs, diviértete y cuídate.
|
||||
|
||||
[home]
|
||||
uname_holder=Nombre de usuario o correo electrónico
|
||||
password_holder=Contraseña
|
||||
switch_dashboard_context=Cambiar el contexto del Dashboard
|
||||
my_repos=Mis Repositorios
|
||||
collaborative_repos=Repositorios Colaborativos
|
||||
my_orgs=Mis Organizaciones
|
||||
my_mirrors=Mis Mirrors
|
||||
|
||||
[explore]
|
||||
repos=Repositorios
|
||||
|
||||
[auth]
|
||||
create_new_account=Crear una Nueva Cuenta
|
||||
register_hepler_msg=¿Ya tienes una cuenta? ¡Inicia sesión!
|
||||
social_register_hepler_msg=¿Ya tienes una cuenta? ¡Enlázala!
|
||||
disable_register_prompt=Lo sentimos, el registro está deshabilitado. Por favor, contacta con el administrador del sitio.
|
||||
disable_register_mail=Lo sentimos. Los correos de Confirmación de Registro están deshabilitados.
|
||||
remember_me=Recuérdame
|
||||
forgot_password=He olvidado mi contraseña
|
||||
forget_password=¿Has olvidado tu contraseña?
|
||||
sign_up_now=¿Necesitas una cuenta? Regístrate ahora.
|
||||
confirmation_mail_sent_prompt=Un nuevo correo de confirmación se ha enviado a <b>%s</b>. Por favor, comprueba tu bandeja de entrada en las siguientes %d horas para completar el proceso de registro.
|
||||
sign_in_email=Inicia sesión con tu correo electrónico
|
||||
active_your_account=Activa tu cuenta
|
||||
resent_limit_prompt=Lo sentimos, estás solicitando el reenvío del mail de activación con demasiada frecuencia. Por favor, espera 3 minutos.
|
||||
has_unconfirmed_mail=Hola %s, tu correo electrónico (<b>%s</b>) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón.
|
||||
resend_mail=Haz click aquí para reenviar tu correo electrónico de activación
|
||||
email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta.
|
||||
send_reset_mail=Haga clic aquí para (re)enviar el correo para el restablecimiento de la contraseña
|
||||
reset_password=Restablecer su contraseña
|
||||
invalid_code=Lo sentimos, su código de confirmación ha expirado o no es valido.
|
||||
reset_password_helper=Haga Clic aquí para restablecer su contraseña
|
||||
password_too_short=La longitud de la contraseña no puede ser menor a 6.
|
||||
|
||||
[modal]
|
||||
yes=Sí
|
||||
no=No
|
||||
modify=Editar
|
||||
|
||||
[form]
|
||||
UserName=Nombre de usuario
|
||||
RepoName=Nombre del repositorio
|
||||
Email=Dirección de correo electrónico
|
||||
Password=Contraseña
|
||||
Retype=Vuelva a escribir la contraseña
|
||||
SSHTitle=Nombre de la Clave de SSH
|
||||
HttpsUrl=HTTPS URL
|
||||
PayloadUrl=URL de carga
|
||||
TeamName=Nombre del equipo
|
||||
AuthName=Nombre de autorización
|
||||
AdminEmail=Correo electrónico del administrador
|
||||
|
||||
require_error=` no puede estar vacío.`
|
||||
alpha_dash_error=` los caracteres deben ser Alfanumericos o dash(-_).`
|
||||
alpha_dash_dot_error=` debe ser un caracter alfanumérivo válido, un guión alto o bajo (-_) o un signo de puntuación.`
|
||||
size_error=` debe ser de tamaño %s.`
|
||||
min_size_error=` debe contener al menos %s caracteres.`
|
||||
max_size_error=` debe contener como máximo %s caracteres.`
|
||||
email_error=` no es una dirección de correo válida.`
|
||||
url_error=` no es una URL válida.`
|
||||
unknown_error=Error desconocido:
|
||||
captcha_incorrect=El captcha no es válido.
|
||||
password_not_match=La contraseña de confirmación no coincide.
|
||||
|
||||
username_been_taken=Ya existe un usuario con este nombre.
|
||||
repo_name_been_taken=Ya existe un repositorio con este nombre.
|
||||
org_name_been_taken=Ya existe una organización con este nombre.
|
||||
team_name_been_taken=Ya existe un equipo con este nombre.
|
||||
email_been_used=Esta dirección de correo electrónico ya está en uso.
|
||||
ssh_key_been_used=Este nombre de clave pública ya está en uso.
|
||||
illegal_team_name=El nombre del equipo contiene caracteres inválidos.
|
||||
username_password_incorrect=Nombre de usuario o contraseña incorrectos.
|
||||
enterred_invalid_repo_name=Por favor, asegúrate de que has introducido correctamente el nombre del repositorio.
|
||||
enterred_invalid_owner_name=Por favor, asegúrate de que has introducido correctamente el nombre del propietario.
|
||||
enterred_invalid_password=Por favor, asegúrate de que has introducido correctamente tu contraseña.
|
||||
user_not_exist=El usuario indicado no existe.
|
||||
last_org_owner=El usuario que se intenta eliminar es el último miembro del equipo de propietarios. Debe existir otro propietario.
|
||||
|
||||
invalid_ssh_key=Lo sentimos, no somos capaces de verificar tu clave SSH: %s
|
||||
unable_verify_ssh_key=Gogs no puede velificar tu clave SSH, pero asumimos que es válida. Por favor, asegúrate de que es así.
|
||||
auth_failed=Error de autenticación: %v
|
||||
|
||||
still_own_repo=Tu cuenta es la propietaria de uno o más repositorios, tienes que borrarlos o transferirlos primero.
|
||||
still_has_org=Tu cuenta es miembro de una o más organizaciones, tienes que abandonarlas o eliminarlas primero.
|
||||
org_still_own_repo=Esta organización es dueña de uno o más repositorios, tienes que eliminarlos o transferirlos primero.
|
||||
|
||||
still_own_user=Esta autenticación está en uso por algunos usuarios, debes moverlos y antes de eliminarla.
|
||||
|
||||
target_branch_not_exist=La rama de destino no existe
|
||||
|
||||
[user]
|
||||
change_avatar=Cambia tu avatar en gravatar.com
|
||||
change_custom_avatar=Cambia tu avatar en la configuración
|
||||
join_on=Registrado en
|
||||
repositories=Repositorios
|
||||
activity=Actividad pública
|
||||
followers=Seguidores
|
||||
starred=Destacados
|
||||
following=Siguiendo
|
||||
|
||||
form.name_reserved=El usuario '%s' está reservado.
|
||||
form.name_pattern_not_allowed=El patrón de nombre de usuario '%s' no está permitido.
|
||||
|
||||
[settings]
|
||||
profile=Perfil
|
||||
password=Contraseña
|
||||
ssh_keys=Claves SSH
|
||||
social=Redes Sociales
|
||||
applications=Aplicaciones
|
||||
orgs=Organizaciones
|
||||
delete=Eliminar Cuenta
|
||||
uid=UUID
|
||||
|
||||
public_profile=Perfil Público
|
||||
profile_desc=Tu correo electrónico es público y será usado para todas las notificaciones relacionadas con cualquier cuenta y cualquier operación hecha a través de la web.
|
||||
full_name=Nombre Completo
|
||||
website=Página Web
|
||||
location=Localización
|
||||
update_profile=Actualizar Perfil
|
||||
update_profile_success=Tu perfil se ha actualizado correctamente.
|
||||
change_username=Nombre de usuario modificado
|
||||
change_username_desc=El nombre de usuario ha sido modificado, ¿quieres continuar? Esta acción afectará a todos los enlaces relacionados con tu cuenta.
|
||||
continue=Continuar
|
||||
cancel=Cancelar
|
||||
|
||||
enable_custom_avatar=Activar Avatar Personalizado
|
||||
enable_custom_avatar_helper=Activa esto para desactivar los avatares de Gravatar
|
||||
choose_new_avatar=Selecciona nuevo avatar
|
||||
update_avatar=Actualizar Configuración del Avatar
|
||||
uploaded_avatar_not_a_image=El archivo enviado no es una imagen.
|
||||
no_custom_avatar_available=No hay ningún avatar personalizado disponible, no se puede habilitar.
|
||||
update_avatar_success=La configuración de tu avatar se ha actualizado correctamente.
|
||||
|
||||
change_password=Cambiar contraseña
|
||||
old_password=Contraseña actual
|
||||
new_password=Nueva contraseña
|
||||
password_incorrect=Contraseña actual incorrecta.
|
||||
change_password_success=La contraseña se ha modificado correctamente. Ya puedes iniciar sesión con tu nueva contraseña.
|
||||
|
||||
emails=Direcciones de correo electrónico
|
||||
manage_emails=Gestionar direcciones de correo electrónico
|
||||
email_desc=Tu dirección de correo principal se utilizará para las notificaciones y otras operaciones.
|
||||
primary=Principal
|
||||
primary_email=Marcar como principal
|
||||
delete_email=Eliminar
|
||||
add_new_email=Añadir nueva dirección de correo electrónico
|
||||
add_email=Añadir correo electrónico
|
||||
add_email_confirmation_sent=Un nuevo correo de confirmación ha sido enviado a <b>%s</b>, por favor, comprueba tu bandeja de entrada en las próximas %d horas para completar el proceso de confirmación.
|
||||
add_email_success=Tu nuevo correo electrónico se ha añadido correctamente.
|
||||
|
||||
manage_ssh_keys=Gestionar Claves SSH
|
||||
add_key=Añadir Clave
|
||||
ssh_desc=Esta es la lista de claves SSH asociadas con tu cuenta. Elimina cualquier clave que no reconozcas.
|
||||
ssh_helper=<strong>¿Necesitas ayuda?</strong>. Consulta nuestra guía para <a href="%s">generar claves SSH</a> o solucionar <a href="%s">problemas comunes de SSH</a>.
|
||||
add_new_key=Añadir clave SSH
|
||||
key_name=Nombre de la Clave
|
||||
key_content=Contenido
|
||||
add_key_success=¡Se ha añadido una nueva clave SSH!
|
||||
delete_key=Eliminar
|
||||
add_on=Añadido en
|
||||
last_used=Utilizado por última vez en
|
||||
no_activity=No hay actividad reciente
|
||||
|
||||
manage_social=Gestionar Redes Sociales asociadas
|
||||
social_desc=Esta es una lista de las Redes Sociales asociadas. Elimina cualquier vínculo que no reconozcas.
|
||||
unbind=Desvincular
|
||||
unbind_success=La Red Social ha sido desvinculada.
|
||||
|
||||
manage_access_token=Gestionar los Tokens de Acceso personales
|
||||
generate_new_token=Generar nuevo Token
|
||||
tokens_desc=Tokens generados que pueden ser usados para acceder al API de Gogs.
|
||||
new_token_desc=Desde ahora, todos los tokens tendrán acceso completo a tu cuenta.
|
||||
token_name=Nombre del Token
|
||||
generate_token=Generar Token
|
||||
generate_token_succees=¡Los nuevos tokens de acceso se han generado correctamente! Asegúrate de copiar tu nuevo token de acceso personal. ¡No podrás verlo de nuevo!
|
||||
delete_token=Eliminar
|
||||
delete_token_success=¡Los tokens de acceso personales se han eliminado correctamente! No olvides actualizar las aplicaciones que los usasen.
|
||||
|
||||
delete_account=Elimina tu cuenta
|
||||
delete_prompt=La operación eliminará tu cuenta de forma permanente y ¡<strong>NO</strong> se puede deshacer!
|
||||
confirm_delete_account=Confirmar Eliminación
|
||||
delete_account_title=Eliminación de Cuenta
|
||||
delete_account_desc=Esta cuenta se va a eliminar permanentemente, ¿quieres continuar?
|
||||
|
||||
[repo]
|
||||
owner=Propietario
|
||||
repo_name=Nombre del Repositorio
|
||||
repo_name_helper=Los grandes nombres de repositorios son cortos, memorables y <strong>únicos</strong>.
|
||||
visibility=Visibilidad
|
||||
visiblity_helper=Este repositorio es <span class="label label-red label-radius">Privado</span>
|
||||
fork_repo=Hacer Fork del repositorio
|
||||
fork_from=Crear un Fork desde
|
||||
fork_visiblity_helper=No es posible cambiar la visibilidad de un Fork
|
||||
repo_desc=Descripción
|
||||
repo_lang=Idioma
|
||||
repo_lang_helper=Selecciona un fichero .gitignore
|
||||
license=Licencia
|
||||
license_helper=Selecciona un fichero de licencia
|
||||
init_readme=Crear este repositorio con un fichero README.md
|
||||
create_repo=Crear Repositorio
|
||||
default_branch=Rama por defecto
|
||||
mirror_interval=Intervalo de mirror(en horas)
|
||||
|
||||
form.name_reserved=El nombre del repositorio '%s' está reservado.
|
||||
form.name_pattern_not_allowed=El patrón del nombre del repositorio '%s' no está permitido.
|
||||
|
||||
need_auth=Requiere Autorización
|
||||
migrate_type=Tipo de Migración
|
||||
migrate_type_helper=Este repositorio será un <span class="label label-blue label-radius">Mirror</span>
|
||||
migrate_repo=Migrar Repositorio
|
||||
migrate.clone_address=Clonar Dirección
|
||||
migrate.invalid_local_path=Rutal local inválida, no existe o no es un directorio.
|
||||
|
||||
forked_from=forked de
|
||||
fork_from_self=eres el propietario del repositorio, no puedes hacer fork!
|
||||
copy_link=Copiar
|
||||
click_to_copy=Copiar al portapapeles
|
||||
copied=Copiado correctamente
|
||||
clone_helper=¿Necesitas ayuda con el clone? ¡Consulta la <a target="_blank" href="%s">Ayuda</a>!
|
||||
unwatch=Dejar de vigilar
|
||||
watch=Vigilar
|
||||
unstar=Eliminar destacado
|
||||
star=Destacar
|
||||
fork=Fork
|
||||
|
||||
no_desc=Sin Descripción
|
||||
quick_guide=Guía Rápida
|
||||
clone_this_repo=Clonar este repositorio
|
||||
create_new_repo_command=Crear un nuevo repositorio desde línea de comandos
|
||||
push_exist_repo=Hacer Push de un repositorio existente desde línea de comandos
|
||||
|
||||
branch=Rama
|
||||
tree=Árbol
|
||||
branch_and_tags=Ramas y Etiquetas
|
||||
branches=Ramas
|
||||
tags=Etiquetas
|
||||
issues=Incidencias
|
||||
labels=Etiquetas
|
||||
milestones=Milestones
|
||||
commits=Commits
|
||||
releases=Releases
|
||||
file_raw=Raw
|
||||
file_history=Histórico
|
||||
file_view_raw=Ver Raw
|
||||
file_permalink=Permalink
|
||||
|
||||
commits.commits=Commits
|
||||
commits.search=Buscar Commits
|
||||
commits.find=Buscar
|
||||
commits.author=Autor
|
||||
commits.message=Mensaje
|
||||
commits.date=Fecha
|
||||
commits.older=Anterior
|
||||
commits.newer=Posterior
|
||||
|
||||
issues.new=Nueva Incidencia
|
||||
issues.new_label=Nueva Etiqueta
|
||||
issues.new_label_placeholder=Nombre etiqueta...
|
||||
issues.open_tab=%d abiertas
|
||||
issues.close_tab=%d cerradas
|
||||
issues.filter_label=Etiqueta
|
||||
issues.filter_label_no_select=Ninguna etiqueta seleccionada
|
||||
issues.filter_milestone=Milestone
|
||||
issues.filter_assignee=Asignada por
|
||||
issues.filter_type=Tipo
|
||||
issues.filter_type.all_issues=Todas las incidencias
|
||||
issues.filter_type.assigned_to_you=Asignada a ti
|
||||
issues.filter_type.created_by_you=Creada por ti
|
||||
issues.filter_type.mentioning_you=Citado en
|
||||
issues.opened_by=abierta %[1]s por <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Página Anterior
|
||||
issues.next=Página Siguiente
|
||||
issues.label_title=Nombre etiqueta
|
||||
issues.label_color=Color etiqueta
|
||||
issues.label_count=%d etiquetas
|
||||
issues.label_open_issues=%d incidencias abiertas
|
||||
issues.label_edit=Editar
|
||||
issues.label_delete=Borrar
|
||||
issues.label_modify=Modificación de Etiqueta
|
||||
issues.label_deletion=Borrado de Etiqueta
|
||||
issues.label_deletion_desc=Al borrar la etiqueta su información será eliminada de todas las incidencias relacionadas. Desea continuar?
|
||||
issues.label_deletion_success=Etiqueta borrada con éxito!
|
||||
|
||||
settings=Configuración
|
||||
settings.options=Opciones
|
||||
settings.collaboration=Colaboración
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Git Hooks
|
||||
settings.deploy_keys=Claves de Despliegue
|
||||
settings.basic_settings=Configuración Básica
|
||||
settings.danger_zone=Zona de Peligro
|
||||
settings.site=Sitio Oficial
|
||||
settings.update_settings=Actualizar Configuración
|
||||
settings.change_reponame=Nombre del Repositorio Modificado
|
||||
settings.change_reponame_desc=El nombre del repositorio ha sido modificado, ¿quieres continuar? Esto afectará a todos los enlaces relacionados con este repositorio.
|
||||
settings.transfer=Transferir la Propiedad
|
||||
settings.transfer_desc=Transferir este repositorio a otro usuario u organización donde tengas permisos de administración.
|
||||
settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con el mismo nombre.
|
||||
settings.delete=Eliminar este Repositorio
|
||||
settings.delete_desc=Una vez has eliminado un repositorio, no hay vuelta atrás. Por favor, asegúrate de que es lo que quieres.
|
||||
settings.transfer_notices=<p>- Perderás acceso si el nuevo propietario es un usuario individual.</p><p>- Seguirás teniendo acceso si el nuevo propietario es una organización y estás en el grupo de los propietarios.</p>
|
||||
settings.update_settings_success=Las opciones del repositorio se han actualizado correctamente.
|
||||
settings.transfer_owner=Nuevo Propietario
|
||||
settings.make_transfer=Transferir
|
||||
settings.transfer_succeed=La propiedad del repositorio ha sido transferida exitosamente.
|
||||
settings.confirm_delete=Confirmar Eliminación
|
||||
settings.add_collaborator=Añadir Nuevo Colaborador
|
||||
settings.add_collaborator_success=Se ha añadido el nuevo colaborador.
|
||||
settings.remove_collaborator_success=Se ha eliminado el colaborador.
|
||||
settings.user_is_org_member=El usuario es miembro de la organización, no puede ser añadido como colaborador.
|
||||
settings.add_webhook=Añadir Webhook
|
||||
settings.hooks_desc=Los Webhooks permiten a servicios externos recibir notificaciones cuando sucedan ciertos eventos en Gogs. Cuando sucedan los eventos especificados, enviaremos una petición POST a cada una de las URLs indicadas. Para obtener más información, consulta nuestra <a target="_blank" href="%s">Guía de Webhooks</a>.
|
||||
settings.githooks_desc=Los Git Hooks son una funcionalidad del propio Git, puedes editar los ficheros de los hooks soportados en la siguiente lista para aplicar operaciones personalizadas.
|
||||
settings.githook_edit_desc=Si el hook no está activo, se mostrará contenido de ejemplo. Dejar el contenido vacío deshabilitará este hook.
|
||||
settings.githook_name=Nombre del Hook
|
||||
settings.githook_content=Contenido del Hook
|
||||
settings.update_githook=Actualizar Hook
|
||||
settings.remove_hook_success=El Webhook ha sido eliminado.
|
||||
settings.add_webhook_desc=Enviaremos una petición <code>POST</code> a la siguiente URL con los detalles de cualquier evento suscrito. También puedes especificar qué formato de datos te gustaría recibir (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Puedes encontrar más información en la <a target="_blank" href="%s">Guía de Webhooks</a>.
|
||||
settings.payload_url=URL de Payload
|
||||
settings.content_type=Tipo de Contenido
|
||||
settings.secret=Secreto
|
||||
settings.event_desc=¿Qué eventos te gustaría que desencadenasen este webhook?
|
||||
settings.event_push_only=Solo el evento <code>push</code>.
|
||||
settings.active=Activo
|
||||
settings.active_helper=Enviaremos detalles del evento cuando este hook se dispare.
|
||||
settings.add_hook_success=Se ha añadido un nuevo webhook.
|
||||
settings.update_webhook=Actualizar Webhook
|
||||
settings.update_hook_success=Se ha actualizado el Webhook.
|
||||
settings.delete_webhook=Borrar Webhook
|
||||
settings.recent_deliveries=Envíos Recientes
|
||||
settings.hook_type=Tipo de Hook
|
||||
settings.add_slack_hook_desc=Añade integración con <a href="%s">Slack</a> a tu repositorio.
|
||||
settings.slack_token=Token
|
||||
settings.slack_domain=Dominio
|
||||
settings.slack_channel=Canal
|
||||
|
||||
diff.browse_source=Explorar el Código
|
||||
diff.parent=padre
|
||||
diff.commit=commit
|
||||
diff.data_not_available=Los datos del Diff no están disponibles.
|
||||
diff.show_diff_stats=Mostrar Estadísticas de Diff
|
||||
diff.stats_desc=Se han <strong>modificado %d ficheros</strong> con <strong>%d adiciones</strong> y <strong>%d borrados</strong>
|
||||
diff.bin=BIN
|
||||
diff.view_file=Ver Fichero
|
||||
|
||||
release.releases=Releases
|
||||
release.new_release=Nueva Release
|
||||
release.draft=Borrador
|
||||
release.prerelease=Pre-Release
|
||||
release.stable=Estable
|
||||
release.edit=editar
|
||||
release.ahead=<strong>%d</strong> commits en %s desde esta release
|
||||
release.source_code=Código Fuente
|
||||
release.tag_name=Nombre de la etiqueta
|
||||
release.target=Destino
|
||||
release.tag_helper=Escoge una etiqueta o crea una nueva al publicar.
|
||||
release.release_title=Título de la Release
|
||||
release.content_with_md=Contenido con formato <a href="%s">Markdown</a>
|
||||
release.write=Escribir
|
||||
release.preview=Vista Previa
|
||||
release.content_placeholder=Escribe algo de contenido
|
||||
release.loading=Cargando...
|
||||
release.prerelease_desc=Esta es una pre-release
|
||||
release.prerelease_helper=Esta release está marcada como no apta para producción.
|
||||
release.publish=Publicar Release
|
||||
release.save_draft=Guardar Borrador
|
||||
release.edit_release=Editar Release
|
||||
release.tag_name_already_exist=Ya existe una Release con esta etiqueta.
|
||||
|
||||
[org]
|
||||
org_name_holder=Nombre de la Organización
|
||||
org_name_helper=Los grandes nombres de organizaciones son cortos y memorables.
|
||||
org_email_helper=Los correos electrónicos de las organizaciones reciben todas las notificaciones y confirmaciones.
|
||||
create_org=Crear Organización
|
||||
repo_updated=Actualizado
|
||||
people=Personas
|
||||
invite_someone=Invitar a alguien
|
||||
teams=Equipos
|
||||
lower_members=miembros
|
||||
lower_repositories=repositorios
|
||||
create_new_team=Crear un Nuevo Equipo
|
||||
org_desc=Descripción
|
||||
team_name=Nombre del Equipo
|
||||
team_desc=Descripción
|
||||
team_name_helper=Utiliza este nombre para mencionar a este equipo en las conversaciones.
|
||||
team_desc_helper=¿En qué consiste este equipo?
|
||||
team_permission_desc=¿Qué nivel de permisos debería tener este equipo?
|
||||
|
||||
form.name_reserved=El nombre de la organización '%s' está reservado.
|
||||
form.name_pattern_not_allowed=El patrón de nombre de la organización '%s' no está permitido.
|
||||
|
||||
settings=Configuración
|
||||
settings.options=Opciones
|
||||
settings.full_name=Nombre Completo
|
||||
settings.website=Sitio Web
|
||||
settings.location=Localización
|
||||
settings.update_settings=Actualizar Configuración
|
||||
settings.change_orgname=Nombre de la Organización Modificado
|
||||
settings.change_orgname_desc=El nombre de la organización ha sido modificado, ¿quieres continuar? Esta acción afectará a todos los enlaces relacionados con esta organización.
|
||||
settings.update_setting_success=La configuración de la Organización se ha actualizado correctamente.
|
||||
settings.delete=Eliminar Organización
|
||||
settings.delete_account=Eliminar esta Organización
|
||||
settings.delete_prompt=Esta operación eliminará esta organización de manera permanente, y ¡<strong>NO PUEDE</strong> deshacerse!
|
||||
settings.confirm_delete_account=Confirmar Eliminación
|
||||
settings.delete_org_title=Eliminación de la Organización
|
||||
settings.delete_org_desc=Esta organización se va a eliminar permanentemente, ¿quieres continuar?
|
||||
settings.hooks_desc=Añadir webhooks que serán ejecutados para <strong>todos los repositorios</strong> de esta organización.
|
||||
|
||||
members.public=Público
|
||||
members.public_helper=convertir en privado
|
||||
members.private=Privado
|
||||
members.private_helper=convertir en público
|
||||
members.owner=Propietario
|
||||
members.member=Miembro
|
||||
members.conceal=Ocultar
|
||||
members.remove=Eliminar
|
||||
members.leave=Abandonar
|
||||
members.invite_desc=Comienza a teclear un nombre de usuario para invitar a un nuevo miembro a %s:
|
||||
members.invite_now=Invitar
|
||||
|
||||
teams.join=Unirse
|
||||
teams.leave=Abandonar
|
||||
teams.read_access=Acceso de Lectura
|
||||
teams.read_access_helper=Este equipo podrá ver y clonar sus repositorios.
|
||||
teams.write_access=Acceso de Escritura
|
||||
teams.write_access_helper=Este equipo podrá leer sus repositorios, así como hacer push en ellos.
|
||||
teams.admin_access=Acceso de Administrador
|
||||
teams.admin_access_helper=Este equipo podrá hacer push/pull en sus repositorios, así como añadir colaboradores a ellos.
|
||||
teams.no_desc=Este equipo no tiene descripción
|
||||
teams.settings=Configuración
|
||||
teams.owners_permission_desc=Los propietarios tienen acceso completo a <strong>todos los repositorios</strong> y tienen <strong>derechos de administración</strong> en la organización.
|
||||
teams.members=Miembros del Equipo
|
||||
teams.update_settings=Actualizar Configuración
|
||||
teams.delete_team=Borrar este Equipo
|
||||
teams.add_team_member=Añadir Miembro al Equipo
|
||||
teams.delete_team_title=Eliminar Equipo
|
||||
teams.delete_team_desc=Este equipo va a ser eliminado, ¿seguro que quieres continuar? Los miembros de este equipo pueden perder acceso a algunos repositorios.
|
||||
teams.delete_team_success=El Equipo se ha eliminado correctamente.
|
||||
teams.read_permission_desc=Este equipo tiene permisos de <strong>Lectura</strong>: sus miembros pueden ver y clonar los repositorios del equipo.
|
||||
teams.write_permission_desc=Este equipo tiene permisos de <strong>Escritura</strong>: sus miembros pueden leer y hacer push a los repositorios del equipo.
|
||||
teams.admin_permission_desc=Este equipo tiene permisos de <strong>Administración</strong>: sus miembros pueden leer, hacer push y añadir colaboradores a los repositorios del equipo.
|
||||
teams.repositories=Repositorios del Equipo
|
||||
teams.add_team_repository=Añadir Repositorio al Equipo
|
||||
teams.remove_repo=Eliminar
|
||||
teams.add_nonexistent_repo=El repositorio que estás intentando añadir no existe, por favor, créalo primero.
|
||||
|
||||
[admin]
|
||||
dashboard=Dashboard
|
||||
users=Usuarios
|
||||
organizations=Organizaciones
|
||||
repositories=Repositorios
|
||||
authentication=Autenticaciones
|
||||
config=Configuración
|
||||
notices=Avisos del Sistema
|
||||
monitor=Monitorización
|
||||
prev=Anterior
|
||||
next=Siguiente
|
||||
|
||||
dashboard.statistic=Estadísticas
|
||||
dashboard.operations=Operaciones
|
||||
dashboard.system_status=Estado del Monitor del Sistema
|
||||
dashboard.statistic_info=La base de datos de Gogs contiene <b>%d</b> usuarios, <b>%d</b> organizaciones, <b>%d</b> claves públicas, <b>%d</b> repositorios, <b>%d</b> vigilados, <b>%d</b> destacados, <b>%d</b> acciones, <b>%d</b> accesos, <b>%d</b> incidencias, <b>%d</b> comentarios, <b>%d</b> cuentas de redes sociales, <b>%d</b> seguidores, <b>%d</b> mirrors, <b>%d</b> releases, <b>%d</b> fuentes de login, <b>%d</b> webhooks, <b>%d</b> milestones, <b>%d</b> etiquetas, <b>%d</b> hooks, <b>%d</b> equipos, <b>%d</b> tareas actualizadas, <b>%d</b> adjuntos.
|
||||
dashboard.operation_name=Nombre de la Operación
|
||||
dashboard.operation_switch=Interruptor
|
||||
dashboard.operation_run=Ejecutar
|
||||
dashboard.clean_unbind_oauth=Limpiar solicitudes de OAuth sin confirmar
|
||||
dashboard.clean_unbind_oauth_success=Las solicitudes de OAuth sin confirmar se han eliminado correctamente.
|
||||
dashboard.delete_inactivate_accounts=Eliminar todas las cuentas inactivas
|
||||
dashboard.delete_inactivate_accounts_success=Todas las cuentas inactivas se han eliminado correctamente.
|
||||
dashboard.delete_repo_archives=Eliminar todos los archivos de repositorios
|
||||
dashboard.delete_repo_archives_success=Todos los archivos de repositorios se han eliminado correctamente.
|
||||
dashboard.git_gc_repos=Ejecutar la recolección de basura en los repositorios
|
||||
dashboard.git_gc_repos_success=Todos los repositorios han ejecutado correctamente el recolector de basuras.
|
||||
dashboard.resync_all_sshkeys=Reescribir el fichero '.ssh/authorized_keys'(atención: se perderán las claves que no pertenezcan a Gogs)
|
||||
dashboard.resync_all_sshkeys_success=Todas las claves públicas se han reescrito correctamente.
|
||||
dashboard.resync_all_update_hooks=Reescribir todos los hooks de actualización de los repositorios (necesario cuando se modifica la ruta de configuración personalizada)
|
||||
dashboard.resync_all_update_hooks_success=Todos los hooks de actualización de los repositorios se han reescrito correctamente.
|
||||
|
||||
dashboard.server_uptime=Uptime del Servidor
|
||||
dashboard.current_goroutine=Gorutinas Actuales
|
||||
dashboard.current_memory_usage=Uso de Memoria Actual
|
||||
dashboard.total_memory_allocated=Total de Memoria Reservada
|
||||
dashboard.memory_obtained=Memoria Obtenida
|
||||
dashboard.pointer_lookup_times=Tiempos de Búsqueda de Punteros
|
||||
dashboard.memory_allocate_times=Tiempos de Reserva de Memoria
|
||||
dashboard.memory_free_times=Tiempos de Liberado de Memoria
|
||||
dashboard.current_heap_usage=Uso de Heap Actual
|
||||
dashboard.heap_memory_obtained=Memoria de Heap Obtenida
|
||||
dashboard.heap_memory_idle=Memoria de Heap Inactiva
|
||||
dashboard.heap_memory_in_use=Memoria de Heap en Uso
|
||||
dashboard.heap_memory_released=Memoria de Heap Liberada
|
||||
dashboard.heap_objects=Objetos en el Heap
|
||||
dashboard.bootstrap_stack_usage=Uso de la Pila de Bootstrap
|
||||
dashboard.stack_memory_obtained=Memoria de Pila Obtenida
|
||||
dashboard.mspan_structures_usage=Uso de Estructuras MSpan
|
||||
dashboard.mspan_structures_obtained=Estructuras MSpan Obtenidas
|
||||
dashboard.mcache_structures_usage=Uso de estructuras MCache
|
||||
dashboard.mcache_structures_obtained=Estructuras MCache Obtenidas
|
||||
dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtenido
|
||||
dashboard.gc_metadata_obtained=Metadatos del Recolector de Basuras Obtenidos
|
||||
dashboard.other_system_allocation_obtained=Otros Recursos del Sistema Asignados
|
||||
dashboard.next_gc_recycle=Siguiente Reciclado del Recolector de Basuras
|
||||
dashboard.last_gc_time=Tiempo desde el Último GC
|
||||
dashboard.total_gc_time=Pausa Total por GC
|
||||
dashboard.total_gc_pause=Pausa Total por GC
|
||||
dashboard.last_gc_pause=Última Pausa por GC
|
||||
dashboard.gc_times=Ejecuciones GC
|
||||
|
||||
users.user_manage_panel=Panel de Gestión de Usuarios
|
||||
users.new_account=Crear Nueva Cuenta
|
||||
users.name=Nombre
|
||||
users.activated=Activado
|
||||
users.admin=Administrador
|
||||
users.repos=Repositorios
|
||||
users.created=Creado
|
||||
users.edit=Editar
|
||||
users.auth_source=Origen de Autorización
|
||||
users.local=Local
|
||||
users.auth_login_name=Nombre de Usuario de Autorización
|
||||
users.update_profile_success=El perfil de la cuenta se ha actualizado correctamente.
|
||||
users.edit_account=Editar Cuenta
|
||||
users.is_activated=Esta cuenta está activada
|
||||
users.is_admin=Esta cuenta tiene permisos de administrador
|
||||
users.allow_git_hook=Esta cuenta tiene permisos para crear hooks de Git
|
||||
users.update_profile=Actualizar Perfil de la Cuenta
|
||||
users.delete_account=Eliminar esta Cuenta
|
||||
users.still_own_repo=Esta cuenta es propietaria de uno o más repositorios, tienes que borrarlos o transferirlos primero.
|
||||
users.still_has_org=Esta cuenta es miembro de una o más organizaciones, tienes que abandonarlas o eliminarlas primero.
|
||||
|
||||
orgs.org_manage_panel=Panel de Gestión de Organización
|
||||
orgs.name=Nombre
|
||||
orgs.teams=Equipos
|
||||
orgs.members=Miembros
|
||||
|
||||
repos.repo_manage_panel=Panel de Gestión de Repositorios
|
||||
repos.owner=Propietario
|
||||
repos.name=Nombre
|
||||
repos.private=Privado
|
||||
repos.watches=Vigilantes
|
||||
repos.stars=Estrellas
|
||||
repos.issues=Incidencias
|
||||
|
||||
auths.auth_manage_panel=Panel de Gestión de Autorizaciones
|
||||
auths.new=Añadir nuevo origen de autorización
|
||||
auths.name=Nombre
|
||||
auths.type=Tipo
|
||||
auths.enabled=Activo
|
||||
auths.updated=Actualizado
|
||||
auths.auth_type=Tipo de Autorización
|
||||
auths.auth_name=Nombre de Autorización
|
||||
auths.domain=Dominio
|
||||
auths.host=Host
|
||||
auths.port=Puerto
|
||||
auths.base_dn=Base DN
|
||||
auths.attribute_username=Atributo username
|
||||
auths.attribute_name=Atributo nombre
|
||||
auths.attribute_surname=Atributo apellido
|
||||
auths.attribute_mail=Atributo correo electrónico
|
||||
auths.filter=Filtro de Búsqueda
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=Tipo de Autorización SMTP
|
||||
auths.smtphost=SMTP Host
|
||||
auths.smtpport=Puerto SMTP
|
||||
auths.enable_tls=Habilitar Cifrado TLS
|
||||
auths.pam_service_name=Nombre del Servicio PAM
|
||||
auths.enable_auto_register=Hablilitar Auto-Registro
|
||||
auths.tips=Consejos
|
||||
auths.edit=Editar la Configuración de Autorización
|
||||
auths.activated=Esta autenticación ha sido activada
|
||||
auths.update_success=La Configuración de Autorización ha sido actualizada correctamente.
|
||||
auths.update=Actualizar la Configuración de Autorización
|
||||
auths.delete=Eliminar esta Autorización
|
||||
auths.delete_auth_title=Eliminación de Autorización
|
||||
auths.delete_auth_desc=Se va a eliminar esta autorización, ¿quieres continuar?
|
||||
|
||||
config.server_config=Configuración del Servidor
|
||||
config.app_name=Nombre de la Aplicación
|
||||
config.app_ver=Versión de la Aplicación
|
||||
config.app_url=URL de la Aplicación
|
||||
config.domain=Dominio
|
||||
config.offline_mode=Modo Sin Conexión
|
||||
config.disable_router_log=Deshabilitar Log del Router
|
||||
config.run_user=Usuario de Ejecución
|
||||
config.run_mode=Modo de Ejecución
|
||||
config.repo_root_path=Ruta del Repositorio
|
||||
config.static_file_root_path=Ruta de los Ficheros Estáticos
|
||||
config.log_file_root_path=Ruta de los Ficheros de Log
|
||||
config.script_type=Tipo de Script
|
||||
config.reverse_auth_user=Autenticación Inversa de Usuario
|
||||
config.db_config=Configuración de la Base de Datos
|
||||
config.db_type=Tipo
|
||||
config.db_host=Host
|
||||
config.db_name=Nombre
|
||||
config.db_user=Usuario
|
||||
config.db_ssl_mode=Modo SSL
|
||||
config.db_ssl_mode_helper=(solo para "postgres")
|
||||
config.db_path=Ruta
|
||||
config.db_path_helper=(solo para "sqlite3")
|
||||
config.service_config=Configuración del Servicio
|
||||
config.register_email_confirm=Solicitar Confirmación por Correo Electrónico
|
||||
config.disable_register=Deshabilitar el Registro
|
||||
config.show_registration_button=Mostrar Botón de Registro
|
||||
config.require_sign_in_view=Solicitar la Vista de Inicio de Sesión
|
||||
config.mail_notify=Notificación por Correo Electrónico
|
||||
config.enable_cache_avatar=Activar la Caché de Avatar
|
||||
config.active_code_lives=Habilitar Vida del Código
|
||||
config.reset_password_code_lives=Restablecer Contraseña de Vida del Código
|
||||
config.webhook_config=Configuración de Webhooks
|
||||
config.task_interval=Intervalo de Tareas
|
||||
config.deliver_timeout=Timeout de Entrega
|
||||
config.skip_tls_verify=Omitir la Verificación TLS
|
||||
config.mailer_config=Configuración del Mailer
|
||||
config.mailer_enabled=Activado
|
||||
config.mailer_disable_helo=Desactivar HELO
|
||||
config.mailer_name=Nombre
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Usuario
|
||||
config.oauth_config=Configuración OAuth
|
||||
config.oauth_enabled=Activado
|
||||
config.cache_config=Configuración de la Caché
|
||||
config.cache_adapter=Adaptador de la Caché
|
||||
config.cache_interval=Intervalo de la Caché
|
||||
config.cache_conn=Conexión de la Caché
|
||||
config.session_config=Configuración de la Sesión
|
||||
config.session_provider=Proveedor de la Sesión
|
||||
config.provider_config=Configuración del Proveedor
|
||||
config.cookie_name=Nombre de la Cookie
|
||||
config.enable_set_cookie=Activar Establecimiento de Cookie
|
||||
config.gc_interval_time=Intervalo de tiempo del GC
|
||||
config.session_life_time=Tiempo de Vida de la Sesión
|
||||
config.https_only=Sólo HTTPS
|
||||
config.cookie_life_time=Tiempo de Vida de la Cookie
|
||||
config.picture_config=Configuración de Imagen
|
||||
config.picture_service=Servicio de Imágen
|
||||
config.disable_gravatar=Desactivar Gravatar
|
||||
config.log_config=Configuración del Log
|
||||
config.log_mode=Modo del Log
|
||||
|
||||
monitor.cron=Tareas de Cron
|
||||
monitor.name=Nombre
|
||||
monitor.schedule=Agenda
|
||||
monitor.next=Próxima Vez
|
||||
monitor.previous=Vez Anterior
|
||||
monitor.execute_times=Ejecuciones
|
||||
monitor.process=Procesos en Ejecución
|
||||
monitor.desc=Descripción
|
||||
monitor.start=Hora de Inicio
|
||||
monitor.execute_time=Tiempo de ejecución
|
||||
|
||||
notices.system_notice_list=Notificaciones del Sistema
|
||||
notices.type=Tipo
|
||||
notices.type_1=Repositorio
|
||||
notices.desc=Descripción
|
||||
notices.op=Op.
|
||||
notices.delete_success=La notificación del sistema se ha eliminado correctamente.
|
||||
|
||||
[action]
|
||||
create_repo=Repositorio creado <a href="%s">%s</a>
|
||||
commit_repo=hizo push a <a href="%s/src/%s">%[2]s</a> en <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`incidencia abierta <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue=`comentó en la incidencia <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
transfer_repo=transfirió el repositorio <code>%s</code> a <a href="%s">%s</a>
|
||||
push_tag=hizo push del tag <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits=Ver la comparación de estos 2 commits
|
||||
|
||||
[tool]
|
||||
ago=hace
|
||||
from_now=desde ahora
|
||||
now=ahora
|
||||
1s=1 segundo %s
|
||||
1m=1 minuto %s
|
||||
1h=1 hora %s
|
||||
1d=1 día %s
|
||||
1w=1 semana %s
|
||||
1mon=1 mes %s
|
||||
1y=1 año %s
|
||||
seconds=%d segundos %s
|
||||
minutes=%d minutos %s
|
||||
hours=%d horas %s
|
||||
days=%d días %s
|
||||
weeks=%d semanas %s
|
||||
months=%d meses %s
|
||||
years=%d años %s
|
||||
raw_seconds=segundos
|
||||
raw_minutes=minutos
|
||||
|
||||
@@ -26,7 +26,7 @@ organization=Organisation
|
||||
mirror=Miroir
|
||||
new_repo=Nouveau Référentiel
|
||||
new_migrate=Nouvelle Migration
|
||||
new_fork=Nouveau référentiel de fourche
|
||||
new_fork=Nouveau Référentiel d'Embranchement
|
||||
new_org=Nouvelle Organisation
|
||||
manage_org=Gérer les Organisations
|
||||
admin_panel=Administration
|
||||
@@ -39,10 +39,18 @@ issues=Problèmes
|
||||
|
||||
cancel=Annuler
|
||||
|
||||
[search]
|
||||
search=Rechercher...
|
||||
repository=Référentiel
|
||||
user=Utilisateur
|
||||
issue=Problème
|
||||
code=Code
|
||||
|
||||
[install]
|
||||
install=Installation
|
||||
title=Instructions de Première Installation
|
||||
requite_db_desc=Gogs nécessite MySQL, PostgreSQL ou SQLite3.
|
||||
db_title=Paramètres de la base de données
|
||||
db_type=Type de Base de Données
|
||||
host=Hôte
|
||||
user=Utilisateur
|
||||
@@ -52,22 +60,39 @@ db_helper=Veuillez utiliser le moteur INNODB avec le jeu de caractères utf8_gen
|
||||
ssl_mode=Mode SSL
|
||||
path=Chemin
|
||||
sqlite_helper=Emplacement du fichier de la base de données SQLite3.
|
||||
err_empty_sqlite_path=Le chemin de la base de donnée SQLite3 ne peut être vide.
|
||||
|
||||
general_title=Paramètres Généraux de Gogs
|
||||
app_name=Nom de l'Application
|
||||
app_name_helper=Inscrivez fièrement le nom de votre organisation ici !
|
||||
repo_path=Emplacement Racine du Référentiel
|
||||
repo_path_helper=Tous les Référentiels Git distants seront sauvegardés ici.
|
||||
run_user=Entrer un Utilisateur
|
||||
run_user_helper=L'utilisateur doit avoir accès à la Racine du Référentiel et éxécuter Gogs.
|
||||
domain=Domaine
|
||||
domain_helper=Cela affecte les doublons d'URL SSH.
|
||||
http_port=Port HTTP
|
||||
http_port_helper=Numéro de port que l'application écoutera.
|
||||
app_url=URL de l'Application
|
||||
app_url_helper=Cela affecte les doublons d'URL HTTP/HTTPS et le contenu d'e-mail.
|
||||
email_title=Paramètres du Service de Messagerie (Facultatif)
|
||||
|
||||
optional_title=Paramètres facultatifs
|
||||
email_title=Paramètres du Service de Messagerie
|
||||
smtp_host=Hôte SMTP
|
||||
smtp_from=Provenant de
|
||||
smtp_from_helper=Adresse de l'expéditeur, RFC 5322. Soit une adresse courriel simple, soit au format "Nom" <email@example.com>.
|
||||
mailer_user=E-mail de l'Expéditeur
|
||||
mailer_password=Mot de Passe de l'Expéditeur
|
||||
notify_title=Paramètre des Notifications (Facultatif)
|
||||
register_confirm=Activer la Confirmation d'Enregistrement
|
||||
mail_notify=Activer la Notification des Mails reçus
|
||||
server_service_title=Paramètres du serveur et des autres services
|
||||
offline_mode=Activer le Mode hors connexion
|
||||
offline_mode_popup=Désactiver le CDN, même en production. Toutes les ressources seront distribuées en local.
|
||||
disable_registration=Désactiver le formulaire d'inscription
|
||||
disable_registration_popup=Désactiver le formulaire d'inscription, seuls les administrateurs peuvent créer des comptes.
|
||||
require_sign_in_view=Demander une connexion pour afficher des pages
|
||||
require_sign_in_view_popup=Seules les personnes connectées peuvent voir les pages. Les visiteurs anonymes ne pourront voir que les pages de connexion/enregistrement.
|
||||
admin_setting_desc=Vous n'avez pas besoin de créer un compte admin. L'utilisateur ayant l'ID = 1 aura l'accès admin automatiquement.
|
||||
admin_title=Paramètres du Compte Administrateur
|
||||
admin_name=Nom d'Utilisateur
|
||||
admin_password=Mot de Passe
|
||||
@@ -109,15 +134,20 @@ confirmation_mail_sent_prompt=Un nouveau mail de confirmation à été envoyé
|
||||
sign_in_email=Connexion avec l'E-mail
|
||||
active_your_account=Activer votre Compte
|
||||
resent_limit_prompt=Désolé, vos tentatives d'activation sont trop fréquentes. Veuillez réessayer dans 3 minutes.
|
||||
has_unconfirmed_mail=Bonjour %s, votre adresse e-mail n'a pas été confirmée (<b>%s</b>). Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, appuyez sur le bouton ci-dessous.
|
||||
resend_mail=Appuyez ici pour renvoyer un mail de confirmation
|
||||
has_unconfirmed_mail=Bonjour %s, votre adresse courriel (<b>%s</b>) n'a pas été confirmée. Si vous n'avez reçu aucun courriel de confirmation ou souhaitez renouveler l'envoi, appuyez sur le bouton ci-dessous.
|
||||
resend_mail=Cliquez ici pour renvoyer un mail de confirmation
|
||||
email_not_associate=Cette adresse e-mail n'est associée à aucun compte.
|
||||
send_reset_mail=Appuyez ici pour (r)envoyer le mail de réinitialisation du mot de passe
|
||||
send_reset_mail=Cliquez ici pour (r)envoyer le mail de réinitialisation du mot de passe
|
||||
reset_password=Réinitialiser le Mot de Passe
|
||||
invalid_code=Désolé, code de confirmation invalide ou expiré.
|
||||
reset_password_helper=Appuyez ici pour réinitialiser votre mot de passe
|
||||
reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe
|
||||
password_too_short=Le mot de passe doit contenir 6 caractères minimum.
|
||||
|
||||
[modal]
|
||||
yes=Oui
|
||||
no=Non
|
||||
modify=Modifier
|
||||
|
||||
[form]
|
||||
UserName=Nom d'Utilisateur
|
||||
RepoName=Nom du Référentiel
|
||||
@@ -129,11 +159,12 @@ HttpsUrl=URL HTTPS
|
||||
PayloadUrl=URL des Données Utiles
|
||||
TeamName=Nom d'équipe
|
||||
AuthName=Nom d'autorisation
|
||||
AdminEmail=E-mail d'admin
|
||||
AdminEmail=E-mail de l'administrateur
|
||||
|
||||
require_error=` Ne peut être vide `
|
||||
alpha_dash_error=` doivent être des caractères alpha, numeriques ou console (-_) valides `
|
||||
alpha_dash_dot_error=` doivent être des caractères alpha, numeriques, console (-_) valides ou des points `
|
||||
size_error=` doit être à la taille de %s.`
|
||||
min_size_error=` %s caractères minimum `
|
||||
max_size_error=` %s caractères maximum `
|
||||
email_error=` adresse e-mail invalide `
|
||||
@@ -148,9 +179,6 @@ org_name_been_taken=Nom d'organisation déjà pris.
|
||||
team_name_been_taken=Nom d'équipe déjà pris.
|
||||
email_been_used=Adresse e-mail déjà utilisée.
|
||||
ssh_key_been_used=Le nom de la clé publique a déjà servi.
|
||||
illegal_username=Le nom d'utilisateur contient des caractères interdits.
|
||||
illegal_repo_name=Le nom du Référentiel contient des caractères interdits.
|
||||
illegal_org_name=Le nom de l'organisation contient des caractères interdits.
|
||||
illegal_team_name=Le nom de l'équipe contient des caractères interdits.
|
||||
username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect.
|
||||
enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du Référentiel soit correct.
|
||||
@@ -163,16 +191,17 @@ invalid_ssh_key=Désolé, impossible de valider votre clé SSH : %s
|
||||
unable_verify_ssh_key=Gogs n'a pu vérifier la validité de votre clé SSH, même si nous partons du principe qu'elle le soit. Cela-dit, veuillez vous en assurer.
|
||||
auth_failed=Échec d'authentification : %s
|
||||
|
||||
still_own_repo=Votre compte comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
|
||||
still_has_org=Votre compte a toujours membres de l'organisation, vous avez à gauche ou supprimez tout d'abord.
|
||||
still_own_repo=Votre compte comporte toujours des propriétés du dépôt. Vous devez d'abord les supprimer ou les transférer.
|
||||
still_has_org=Votre compte contient toujours au moins une adhésion à une organisation, vous devez quitter ou supprimer votre adhésion.
|
||||
org_still_own_repo=Cette organisation comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
|
||||
|
||||
still_own_user=Cette authentification a déjà servi à d'autres utilisateurs. Veuillez les déplacer puis supprimez à nouveau.
|
||||
|
||||
target_branch_not_exist=Branche cible n'existe pas
|
||||
target_branch_not_exist=La branche cible n'existe pas.
|
||||
|
||||
[user]
|
||||
change_avatar=Changez d'avatar via gravatar.com
|
||||
change_custom_avatar=Changer votre avatar dans les paramètres
|
||||
join_on=Adhéré le
|
||||
repositories=Référentiels
|
||||
activity=Activités publiques
|
||||
@@ -180,6 +209,9 @@ followers=Abonnés
|
||||
starred=Votés
|
||||
following=Abonnements
|
||||
|
||||
form.name_reserved=Le nom '%s' est réservé.
|
||||
form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'utilisateur.
|
||||
|
||||
[settings]
|
||||
profile=Profil
|
||||
password=Mot de Passe
|
||||
@@ -202,12 +234,31 @@ change_username_desc=Nom d'utilisateur modifié. Cela affecte tous les liens rel
|
||||
continue=Continuer
|
||||
cancel=Annuler
|
||||
|
||||
enable_custom_avatar=Activer l'Avatar personnalisé
|
||||
enable_custom_avatar_helper=Cette option désactive l'affichage via Gravatar
|
||||
choose_new_avatar=Sélectionner un nouvel avatar
|
||||
update_avatar=Mettre l'Avatar à Jour
|
||||
uploaded_avatar_not_a_image=Le fichier téléchargé n'est pas une image.
|
||||
no_custom_avatar_available=Aucun avatar personnalisé disponible, activation impossible.
|
||||
update_avatar_success=Votre avatar a été mis à jour avec succès.
|
||||
|
||||
change_password=Modifier le Mot de Passe
|
||||
old_password=Mot de Passe actuel
|
||||
new_password=Nouveau Mot de Passe
|
||||
password_incorrect=Mot de passe actuel incorrect.
|
||||
change_password_success=Mot de passe modifié avec succès. Vous pouvez à présent vous connecter avec le nouveau mot de passe.
|
||||
|
||||
emails=Adresses E-mail
|
||||
manage_emails=Gérer les adresses e-mail
|
||||
email_desc=Votre adresse e-mail principale sera utilisée pour les notifications et d'autres opérations.
|
||||
primary=Principale
|
||||
primary_email=Définir comme principale
|
||||
delete_email=Supprimer
|
||||
add_new_email=Ajouter une nouvelle adresse courriel
|
||||
add_email=Ajouter un courriel
|
||||
add_email_confirmation_sent=Un nouvel e-mail de confirmation a été envoyé à <b>%s</b>, merci de vérifier votre boite de réception dans les %d heures pour compléter le processus de confirmation.
|
||||
add_email_success=Votre courriel a été ajouté avec succès.
|
||||
|
||||
manage_ssh_keys=Gérer les clés SSH
|
||||
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.
|
||||
@@ -234,7 +285,7 @@ token_name=Nom du jeton
|
||||
generate_token=Générer le jeton
|
||||
generate_token_succees=Nouveau jeton d'accès a été généré avec succès ! Assurez-vous de copier votre nouveau jeton d'accès personnel maintenant. Vous ne serez pas en mesure de le revoir !
|
||||
delete_token=Supprimer
|
||||
delete_token_success=Jeton d'accès personnelle a été supprimée avec succès ! N'oubliez pas de mettre à jour vos applications aussi bien.
|
||||
delete_token_success=Ce Jeton d'accès personnel a été supprimé avec succès ! N'oubliez pas de mettre vos applications à jour également.
|
||||
|
||||
delete_account=Supprimer le Compte
|
||||
delete_prompt=Votre compte sera supprimé définitivement et cette opération est <strong>IRRÉVERSIBLE</strong> !
|
||||
@@ -245,12 +296,12 @@ delete_account_desc=Ce compte sera supprimé définitivement. Voulez-vous contin
|
||||
[repo]
|
||||
owner=Propriétaire
|
||||
repo_name=Nom du Référentiel
|
||||
repo_name_helper=Idéalement, le nom d'un Référentiel 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é
|
||||
visiblity_helper=Ce Référentiel est <span class="label label-red label-radius">Privé</span>
|
||||
fork_repo=Référentiel de la fourche
|
||||
fork_from=Fourche de
|
||||
fork_visiblity_helper=Référentiel Aristide ne peut pas changer sa visiblité
|
||||
fork_repo=Référentiel d'Embranchement
|
||||
fork_from=Embranchement de
|
||||
fork_visiblity_helper=Un dépôt scindé ne peut pas changer sa visiblité
|
||||
repo_desc=Description
|
||||
repo_lang=Langue
|
||||
repo_lang_helper=Sélectionner un fichier .gitignore
|
||||
@@ -260,16 +311,21 @@ init_readme=Initialiser ce Référentiel avec un README.md
|
||||
create_repo=Créer un Référentiel
|
||||
default_branch=Branche par défaut
|
||||
mirror_interval=Intervalle du miroir (heure)
|
||||
goget_meta=Méta Go-Get
|
||||
goget_meta_helper=Ce Référentiel sera <span class="label label-blue label-radius">Go-Getable</span>
|
||||
|
||||
form.name_reserved=Le nom de dépôt '%s' est réservé.
|
||||
form.name_pattern_not_allowed=Motif '%s' interdit pour les noms de dépôt.
|
||||
|
||||
need_auth=Nécessite une Autorisation
|
||||
migrate_type=Type de Migration
|
||||
migrate_type_helper=Ce Référentiel sera un <span class="label label-blue label-radius">Miroir</span>
|
||||
migrate_type_helper=Ce dépôt sera un <span class="label label-blue label-radius">Miroir</span>
|
||||
migrate_repo=Migrer le Référentiel
|
||||
migrate.clone_address=Adresse du clone
|
||||
migrate.invalid_local_path=Chemin local non valide, non existant ou n'étant pas un dossier.
|
||||
|
||||
forked_from=dérivé depuis
|
||||
fork_from_self=Vous nous ne pouvez pas dériver un dépôt que vous possédez déja !
|
||||
copy_link=Copier
|
||||
click_to_copy=Copier dans le presse-papier
|
||||
click_to_copy=Copier dans le presse-papiers
|
||||
copied=Copié
|
||||
clone_helper=Besoin d'aide pour le clonage ? Visitez <a target="_blank" href="%s"> l'aider</a> !
|
||||
unwatch=Ne plus suivre
|
||||
@@ -290,11 +346,14 @@ branch_and_tags=Branches & Tags
|
||||
branches=Branches
|
||||
tags=Tags
|
||||
issues=Problèmes
|
||||
labels=Etiquettes
|
||||
milestones=Étapes
|
||||
commits=Commissions
|
||||
releases=Publications
|
||||
file_raw=Raw
|
||||
file_history=Historique
|
||||
file_view_raw=Voir le Raw
|
||||
file_permalink=Lien permanent
|
||||
|
||||
commits.commits=Commissions
|
||||
commits.search=Rechercher des commissions
|
||||
@@ -305,6 +364,34 @@ commits.date=Date
|
||||
commits.older=Précédemment
|
||||
commits.newer=Récemment
|
||||
|
||||
issues.new=Nouveau Problème
|
||||
issues.new_label=Nouvelle étiquette
|
||||
issues.new_label_placeholder=Nom de l'étiquette...
|
||||
issues.open_tab=%d Ouvert
|
||||
issues.close_tab=%d Fermé
|
||||
issues.filter_label=Étiquette
|
||||
issues.filter_label_no_select=Aucun étiquette sélectionnée
|
||||
issues.filter_milestone=Étape
|
||||
issues.filter_assignee=Assigné
|
||||
issues.filter_type=Type
|
||||
issues.filter_type.all_issues=Tous les problèmes
|
||||
issues.filter_type.assigned_to_you=Qui vous sont assignés
|
||||
issues.filter_type.created_by_you=Créé(es) par vous
|
||||
issues.filter_type.mentioning_you=Vous mentionnant
|
||||
issues.opened_by=ouvert %[1]s par <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Page Précédente
|
||||
issues.next=Page Suivante
|
||||
issues.label_title=Nom du Label
|
||||
issues.label_color=Couleur du Label
|
||||
issues.label_count=%d labels
|
||||
issues.label_open_issues=%d problèmes ouverts
|
||||
issues.label_edit=Éditer
|
||||
issues.label_delete=Supprimer
|
||||
issues.label_modify=Modification du Label
|
||||
issues.label_deletion=Suppression du Label
|
||||
issues.label_deletion_desc=Cette opération supprimera également toutes les informations relatives aux problèmes. Voulez-vous continuer ?
|
||||
issues.label_deletion_success=Label supprimé avec succès !
|
||||
|
||||
settings=Paramètres
|
||||
settings.options=Options
|
||||
settings.collaboration=Collaboration
|
||||
@@ -316,10 +403,10 @@ settings.danger_zone=Zone de danger
|
||||
settings.site=Site officiel
|
||||
settings.update_settings=Valider
|
||||
settings.change_reponame=Référentiel renommé
|
||||
settings.change_reponame_desc=Le Référentiel a été renommé. Cela affecte tous les liens relatifs à ce Référentiel. Continuer ?
|
||||
settings.change_reponame_desc=Le dépôt a été renommé. Cela affecte tous les liens relatifs à ce dépôt. Continuer ?
|
||||
settings.transfer=Transférer les propriétés
|
||||
settings.transfer_desc=Transfère ce Référentiel à un autre utilisateur ou organisation dont vous possédez des droits d'administrateur.
|
||||
settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un Référentiel nommé ainsi.
|
||||
settings.transfer_desc=Transfèrer ce dépôt à un autre utilisateur ou une organisation dont vous possédez des droits d'administrateur.
|
||||
settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un dépôt nommé ainsi.
|
||||
settings.delete=Supprimer ce Référentiel
|
||||
settings.delete_desc=Attention, action irréversible. Soyez sûre de vous.
|
||||
settings.transfer_notices=<p>- Vous perdrez l'accès si le nouveau propriétaire est un utilisateur individuel.</p><p>- Vous garderez l'accès si le nouveau propriétaire est une organisation et que vous en faites partie.</p>
|
||||
@@ -368,10 +455,34 @@ diff.stats_desc=<strong> %d fichiers modifiés</strong> avec <strong>%d ajouts</
|
||||
diff.bin=BIN
|
||||
diff.view_file=Voir le fichier
|
||||
|
||||
release.releases=Versions
|
||||
release.new_release=Nouvelle version
|
||||
release.draft=Brouillon
|
||||
release.prerelease=Pré-publication
|
||||
release.stable=Stable
|
||||
release.edit=Éditer
|
||||
release.ahead=<strong>%d</strong> commissions à %s depuis cette publication
|
||||
release.source_code=Code Source
|
||||
release.tag_name=Nom du tag
|
||||
release.target=Cible
|
||||
release.tag_helper=Choisissez un tag existant ou créez-en un nouveau à publier.
|
||||
release.release_title=Titre de la publication
|
||||
release.content_with_md=Contenu avec <a href="%s">Démarque(s)</a>
|
||||
release.write=Écrire
|
||||
release.preview=Prévisualiser
|
||||
release.content_placeholder=Rédiger du contenu
|
||||
release.loading=Chargement…
|
||||
release.prerelease_desc=Il s'agit d'une version préliminaire
|
||||
release.prerelease_helper=Nous soulignerons que cette version est considérée comme non prête pour la production.
|
||||
release.publish=Publier
|
||||
release.save_draft=Sauvegarder le Brouillon
|
||||
release.edit_release=Éditer la publication
|
||||
release.tag_name_already_exist=Une publication avec ce nom de tag a déjà existée.
|
||||
|
||||
[org]
|
||||
org_name_holder=Nom d'organisation
|
||||
org_name_helper=Idéalement, un nom d'organisation devrait être court et mémorable.
|
||||
org_email_helper=L'e-mail de l'organisation recevra toutes les notifications et confirmations.
|
||||
org_email_helper=Le courriel de l'organisation recevra toutes les notifications et confirmations.
|
||||
create_org=Créer une organisation
|
||||
repo_updated=Mis à jour
|
||||
people=Contacts
|
||||
@@ -387,6 +498,9 @@ team_name_helper=Ce nom sera utilisé pour mentionner l'équipe dans les convers
|
||||
team_desc_helper=Présentation de l'équipe
|
||||
team_permission_desc=Quel niveau d'accès cette équipe devrait-elle posséder ?
|
||||
|
||||
form.name_reserved=Le nom d'organisation '%s' est réservé.
|
||||
form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'organisation.
|
||||
|
||||
settings=Paramètres
|
||||
settings.options=Options
|
||||
settings.full_name=Non Complet
|
||||
@@ -432,7 +546,7 @@ teams.update_settings=Valider
|
||||
teams.delete_team=Supprimer cette Équipe
|
||||
teams.add_team_member=Ajouter un Membre
|
||||
teams.delete_team_title=Suppression de l'équipe
|
||||
teams.delete_team_desc=Cette équipe sera supprimée. Les membres pourraient perdre leurs accès à certains Référentiels.
|
||||
teams.delete_team_desc=Cette équipe sera supprimée. Les membres pourraient perdre leurs accès à certains dépôts.
|
||||
teams.delete_team_success=Équipe supprimée avec succès.
|
||||
teams.read_permission_desc=Cette équipe permet l'accès en <strong>lecture</strong> : les membres peuvent voir et dupliquer ses Référentiels.
|
||||
teams.write_permission_desc=Cette équipe permet l'accès en <strong>écriture</strong> : les membres peuvent participer à ses Référentiels.
|
||||
@@ -467,6 +581,13 @@ dashboard.delete_inactivate_accounts=Supprimer tous les comptes inactifs
|
||||
dashboard.delete_inactivate_accounts_success=Inactivent tous les comptes ont été supprimés avec succès.
|
||||
dashboard.delete_repo_archives=Supprimer toutes les archives de référentiels
|
||||
dashboard.delete_repo_archives_success=Toutes les archives de référentiels ont été supprimés avec succès.
|
||||
dashboard.git_gc_repos=Collecter les déchets des référentiels
|
||||
dashboard.git_gc_repos_success=Tous les dépôts ont effectué la collecte avec succès.
|
||||
dashboard.resync_all_sshkeys=Ré-écrire le fichier '.ssh/authorized_keys' (attention : les clés hors-Gogs vont être perdues)
|
||||
dashboard.resync_all_sshkeys_success=Toutes les clés publiques ont été ré-écrites avec succès.
|
||||
dashboard.resync_all_update_hooks=Ré-écrire tous les hooks de mises à jour des dépôts (requis quand le chemin de la configuration personnalisé est modifié)
|
||||
dashboard.resync_all_update_hooks_success=Les mises à jour de hook des référentiels ont toutes été réécrites avec succès.
|
||||
|
||||
dashboard.server_uptime=Durée de Marche Serveur
|
||||
dashboard.current_goroutine=Goroutines actuelles
|
||||
dashboard.current_memory_usage=Utilisation Mémoire actuelle
|
||||
@@ -502,7 +623,7 @@ users.new_account=Créer un nouveau compte
|
||||
users.name=Nom
|
||||
users.activated=Activés
|
||||
users.admin=Administrateur
|
||||
users.repos=Repos
|
||||
users.repos=Dépôts
|
||||
users.created=Créés
|
||||
users.edit=Éditer
|
||||
users.auth_source=Source d'Autorisation
|
||||
@@ -515,7 +636,7 @@ users.is_admin=Ce compte possède un niveau d'accès administrateur
|
||||
users.allow_git_hook=Ce compte dispose des autorisations pour créer des crochets de Git
|
||||
users.update_profile=Mettre le profil à jour
|
||||
users.delete_account=Supprimer ce Compte
|
||||
users.still_own_repo=Ce compte comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
|
||||
users.still_own_repo=Ce compte possède toujours des dépôts. Vous devez d'abord les supprimer ou les transférer.
|
||||
users.still_has_org=Ce compte a toujours membres de l'organisation, vous avez à gauche ou supprimez tout d'abord.
|
||||
|
||||
orgs.org_manage_panel=Gestion des Organisations
|
||||
@@ -543,13 +664,17 @@ auths.domain=Domaine
|
||||
auths.host=Hôte
|
||||
auths.port=Port
|
||||
auths.base_dn=Base DN (Nom Distingué)
|
||||
auths.attributes=Rechercher les Attributs
|
||||
auths.attribute_username=Attribut du nom d'utilisateur
|
||||
auths.attribute_name=Attribut du prénom
|
||||
auths.attribute_surname=Attribut du nom de famille
|
||||
auths.attribute_mail=Attribut de l'e-mail
|
||||
auths.filter=Filtre de recherche
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=Type d'Autorisation SMTP
|
||||
auths.smtphost=Hôte SMTP
|
||||
auths.smtpport=Port SMTP
|
||||
auths.enable_tls=Activer le Chiffrement TLS
|
||||
auths.pam_service_name=Nom du Service PAM
|
||||
auths.enable_auto_register=Connexion Automatique
|
||||
auths.tips=Conseils
|
||||
auths.edit=Modifier les Paramètres d'Autorisation
|
||||
@@ -584,18 +709,21 @@ config.db_ssl_mode_helper=("postgres" uniquement)
|
||||
config.db_path=Emplacement
|
||||
config.db_path_helper=("sqlite3" uniquement)
|
||||
config.service_config=Configuration du Service
|
||||
config.register_email_confirm=E-mail de Confirmation d'Enregistrement
|
||||
config.register_email_confirm=Nécessite une confirmation par courriel
|
||||
config.disable_register=Désactiver l'Enregistrement
|
||||
config.show_registration_button=Afficher le bouton d'enregistrement
|
||||
config.require_sign_in_view=Connexion Obligatoire pour Visualiser
|
||||
config.mail_notify=Mailer les Notifications
|
||||
config.enable_cache_avatar=Activer le Cache d'Avatar
|
||||
config.active_code_lives=Limites de Code Actif
|
||||
config.reset_password_code_lives=Réinitialiser le Mot De Passe des Limites de Code
|
||||
config.webhook_config=Configuration Webhook
|
||||
config.task_interval=Intervalles de Tâches
|
||||
config.task_interval=Intervalles des Tâches
|
||||
config.deliver_timeout=Expiration d'Envoi
|
||||
config.skip_tls_verify=Ne pas vérifier TLS
|
||||
config.mailer_config=Configuration du Maileur
|
||||
config.mailer_enabled=Activé
|
||||
config.mailer_disable_helo=Désactiver HELO
|
||||
config.mailer_name=Nom
|
||||
config.mailer_host=Hôte
|
||||
config.mailer_user=Utilisateur
|
||||
@@ -635,16 +763,16 @@ notices.system_notice_list=Notes Systèmes
|
||||
notices.type=Type
|
||||
notices.type_1=Référentiel
|
||||
notices.desc=Description
|
||||
notices.op=Auteur
|
||||
notices.op=Opération
|
||||
notices.delete_success=Note système supprimée avec succès.
|
||||
|
||||
[action]
|
||||
create_repo=a crée le Référentiel <a href="%s/%s">%s</a>
|
||||
commit_repo=a soumis à <a href="%s/%s/src/%s">%s</a> chez <a href="%s/%s">%s</a>
|
||||
create_issue=a ouvert un problème <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
comment_issue=a commenté le problème <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
transfer_repo=a transféré le Référentiel <code>%s</code> à <a href="/%s%s">%s</a>
|
||||
push_tag=a tagé <a href="%s/%s/src/%s">%s</a> à <a href="%s/%s">%s</a>
|
||||
create_repo=a crée le Référentiel <a href="%s">%s</a>
|
||||
commit_repo=a soumis à <a href="%s/src/%s">%[2]s</a> chez <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`a ouvert un 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>`
|
||||
transfer_repo=a transféré le Référentiel <code>%s</code> à <a href="%s">%s</a>
|
||||
push_tag=a tagé <a href="%s/src/%s">%[2]s</a> à <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits=Comparer ces 2 commissions
|
||||
|
||||
[tool]
|
||||
@@ -668,16 +796,3 @@ years=%d ans %s
|
||||
raw_seconds=secondes
|
||||
raw_minutes=minutes
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
798
conf/locale/locale_it-IT.ini
Executable file
798
conf/locale/locale_it-IT.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Un servizio Git auto-ospitato pronto all'uso
|
||||
|
||||
home=Home
|
||||
dashboard=Pannello di controllo
|
||||
explore=Esplora
|
||||
help=Aiuto
|
||||
sign_in=Accedi
|
||||
social_sign_in=Login Sociale: Passo 2 <small>associare l'account</small>
|
||||
sign_out=Esci
|
||||
sign_up=Registrati
|
||||
register=Registrati
|
||||
website=Sito Web
|
||||
version=Versione
|
||||
page=Pagina
|
||||
template=Template
|
||||
language=Lingua
|
||||
|
||||
username=Nome utente
|
||||
email=E-mail
|
||||
password=Password
|
||||
re_type=Conferma
|
||||
captcha=Captcha
|
||||
|
||||
repository=Repository
|
||||
organization=Organizzazione
|
||||
mirror=Mirror
|
||||
new_repo=Nuovo Repository
|
||||
new_migrate=Nuova Migrazione
|
||||
new_fork=Nuovo Fork Repository
|
||||
new_org=Nuova organizzazione
|
||||
manage_org=Gestisci le organizzazioni
|
||||
admin_panel=Pannello di amministrazione
|
||||
account_settings=Impostazioni dell'account
|
||||
settings=Impostazioni
|
||||
|
||||
news_feed=Notizie
|
||||
pull_requests=Pull Requests
|
||||
issues=Problemi
|
||||
|
||||
cancel=Annulla
|
||||
|
||||
[search]
|
||||
search=Ricerca...
|
||||
repository=Repository
|
||||
user=Utente
|
||||
issue=Problema
|
||||
code=Codice
|
||||
|
||||
[install]
|
||||
install=Installazione
|
||||
title=Passi d'installazione per il primo avvio
|
||||
requite_db_desc=Gogs richiede MySql, PostgresSQL o SQLite.
|
||||
db_title=Impostazioni Database
|
||||
db_type=Tipo di database
|
||||
host=Host
|
||||
user=Utente
|
||||
password=Password
|
||||
db_name=Nome del database
|
||||
db_helper=Utilizza il motore INNODB con codifica utf8_general_ci per MySQL.
|
||||
ssl_mode=Modalità SSL
|
||||
path=Percorso
|
||||
sqlite_helper=Percorso per database SQLite3.
|
||||
err_empty_sqlite_path=Il percorso del database SQLite3 non può essere vuoto.
|
||||
|
||||
general_title=Impostazioni di Base dell'Applicazione
|
||||
app_name=Nome Applicazione
|
||||
app_name_helper=Scrivi qui il nome della tua organizzazione forte e chiaro!
|
||||
repo_path=Percorso Root del Repository
|
||||
repo_path_helper=Tutti i repository Git remoti saranno salvati in questa directory.
|
||||
run_user=Esegui con l'utente
|
||||
run_user_helper=L'utente deve avere accesso al percorso root del repository e avviare Gogs.
|
||||
domain=Dominio
|
||||
domain_helper=Questo modifica lo SSH clone URLs.
|
||||
http_port=Porta HTTP
|
||||
http_port_helper=Porta di ascolto dell'applicazione.
|
||||
app_url=URL Applicazione
|
||||
app_url_helper=Questo influisce sugli URL per il clonaggio via HTTP/HTTPS e da qualche parte nella posta elettronica.
|
||||
|
||||
optional_title=Impostazioni Facoltative
|
||||
email_title=Impostazioni E-mail
|
||||
smtp_host=Host SMTP
|
||||
smtp_from=Da
|
||||
smtp_from_helper=Mail da indirizzo, RFC 5322. Può essere solo un indirizzo email o il formato "Nome" <email@esempio.com>.
|
||||
mailer_user=E-mail del Mittente
|
||||
mailer_password=Password del Mittente
|
||||
register_confirm=Abilita Conferma di Registrazione
|
||||
mail_notify=Abilita Notifiche via Email
|
||||
server_service_title=Impostazioni del Server e Altri Servizi
|
||||
offline_mode=Abilita Modalità Offline
|
||||
offline_mode_popup=Disabilita il CDN anche in modalità produttiva, tutte le risorse saranno servite localmente.
|
||||
disable_registration=Disabilita Registrazione Manuale
|
||||
disable_registration_popup=Disabilita la registrazione manuale degli utenti, solo gli amministratori possono creare account.
|
||||
require_sign_in_view=Abilita Richiesta di Accesso per Vedere le Pagine
|
||||
require_sign_in_view_popup=Solo gli utenti loggati possono vedere le pagine, i visitatori potranno vedere solo le pagine di accesso e registrazione.
|
||||
admin_setting_desc=Non devi per forza creare un account admin proprio adesso, ma comunque l'utente ID=1 otterrà l'accesso da amministratore automaticamente.
|
||||
admin_title=Impostazioni Account Amministratore
|
||||
admin_name=Nome utente
|
||||
admin_password=Password
|
||||
confirm_password=Conferma Password
|
||||
admin_email=E-mail
|
||||
install_gogs=Installare Gogs
|
||||
test_git_failed=Fallito il test del comando git: %v
|
||||
sqlite3_not_available=Questa versione non supporta SQLite3, si prega di scaricare la versione binaria ufficiale da %s, NON la versione gobuild.
|
||||
invalid_db_setting=La configurazione del database non è corretta: %v
|
||||
invalid_repo_path=Percorso root del repository invalido: %v
|
||||
run_user_not_match=Run user non è l'utente corrente: %s -> %s
|
||||
save_config_failed=Fallito il salvataggio della configurazione: %v
|
||||
invalid_admin_setting=Impostazioni account Admin non valide: %v
|
||||
install_success=Benvenuto! Siamo felici che tu abbia scelto Gogs, buon divertimento.
|
||||
|
||||
[home]
|
||||
uname_holder=Nome Utente o E-mail
|
||||
password_holder=Password
|
||||
switch_dashboard_context=Cambia Dashboard Context
|
||||
my_repos=I miei Repository
|
||||
collaborative_repos=Repository Condivisi
|
||||
my_orgs=Le mie Organizzazioni
|
||||
my_mirrors=I miei Mirror
|
||||
|
||||
[explore]
|
||||
repos=Repository
|
||||
|
||||
[auth]
|
||||
create_new_account=Crea un nuovo Account
|
||||
register_hepler_msg=Hai già un account? Accedi ora!
|
||||
social_register_hepler_msg=Hai già un account? Associalo ora!
|
||||
disable_register_prompt=Siamo spiacenti, registrazione è stata disabilitata. Si prega di contattare l'amministratore del sito.
|
||||
disable_register_mail=Siamo spiacenti, la conferma di registrazione via Mail è stata disattivata.
|
||||
remember_me=Ricordami
|
||||
forgot_password=Password dimenticata
|
||||
forget_password=Password dimenticata?
|
||||
sign_up_now=Bisogno di un account? Iscriviti ora.
|
||||
confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a <b>%s</b>, verifica la tua casella di posta entro le prossime %d ore per completare la registrazione.
|
||||
sign_in_email=Accedi al tuo indirizzo e-mail
|
||||
active_your_account=Attiva il tuo Account
|
||||
resent_limit_prompt=Siamo spiacenti, si stanno inviando e-mail di attivazione troppo spesso. Si prega di attendere 3 minuti.
|
||||
has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (<b>%s</b>). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto.
|
||||
resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione
|
||||
email_not_associate=Questo indirizzo e-mail non è associato ad alcun account.
|
||||
send_reset_mail=Clicca qui per (ri)inviare la tua e-mail di reimpostazione password
|
||||
reset_password=Reimposta la tua Password
|
||||
invalid_code=Siamo spiacenti, il codice di conferma è scaduto o non valido.
|
||||
reset_password_helper=Clicca qui per reimpostare la password
|
||||
password_too_short=La lunghezza della password non può essere meno 6 caratteri.
|
||||
|
||||
[modal]
|
||||
yes=Sì
|
||||
no=No
|
||||
modify=Modifica
|
||||
|
||||
[form]
|
||||
UserName=Nome utente
|
||||
RepoName=Nome Repository
|
||||
Email=Indirizzo E-mail
|
||||
Password=Password
|
||||
Retype=Reinserisci password
|
||||
SSHTitle=Nome chiave SSH
|
||||
HttpsUrl=URL HTTPS
|
||||
PayloadUrl=URL Payload
|
||||
TeamName=Nome Team
|
||||
AuthName=Nome autorizzazione
|
||||
AdminEmail=Email dell'Admin
|
||||
|
||||
require_error=` non può essere vuoto.`
|
||||
alpha_dash_error=` ammessi solo caratteri alfanumerici o trattini(-_).`
|
||||
alpha_dash_dot_error=` ammessi solo caratteri alfanumerici o trattini(-_) o punti.`
|
||||
size_error='deve essere %s.'
|
||||
min_size_error=` deve contenere almeno %s caratteri.`
|
||||
max_size_error=` deve contenere massimo %s caratteri.`
|
||||
email_error=` non è un indirizzo e-mail valido.`
|
||||
url_error=` non è un URL valido.`
|
||||
unknown_error=Errore sconosciuto:
|
||||
captcha_incorrect=Il Captcha non corrisponde.
|
||||
password_not_match=Le due password non corrispondono.
|
||||
|
||||
username_been_taken=Il nome utente è già utilizzato.
|
||||
repo_name_been_taken=Il nome del Repository è già utilizzato.
|
||||
org_name_been_taken=Il nome dell'Organizzazione è già utlizzato.
|
||||
team_name_been_taken=Il nome del Team è già utilizzato.
|
||||
email_been_used=L'indirizzo E-mail è già utilizzato.
|
||||
ssh_key_been_used=Il nome della chiave pubblica è già utilizzato.
|
||||
illegal_team_name=Il nome del Team contiene caratteri non validi.
|
||||
username_password_incorrect=Nome utente o password incorretti.
|
||||
enterred_invalid_repo_name=Si prega di assicurarsi che il nome del repository inserito sia corretto.
|
||||
enterred_invalid_owner_name=Si prega di assicurarsi che il nome del proprietario inserito sia corretto.
|
||||
enterred_invalid_password=Verificare che la password inserita sia corretta.
|
||||
user_not_exist=L'utente inserito non esiste.
|
||||
last_org_owner=L'utente che si vuole rimuovere è l'ultimo membro admin del team. Ci deve essere un altro proprietario.
|
||||
|
||||
invalid_ssh_key=Siamo spiacenti, non siamo in grado di verificare la chiave SSH: %s
|
||||
unable_verify_ssh_key=Gogs non può verificare la chiave SSH, ma assumiamo che sia valida, si prega di verificare voi stessi.
|
||||
auth_failed=Autenticazione non riuscita: %v
|
||||
|
||||
still_own_repo=Il tuo account possiede ancora almeno un repository, dovete prima cancellarli o trasferirne la proprietà.
|
||||
still_has_org=Il tuo account è ancora associato ad almeno un'organizzazione, disassociarsi prima.
|
||||
org_still_own_repo=Questa organizzazione ha ancora la proprietà del repository, dovete cancellarla o trasferirli prima.
|
||||
|
||||
still_own_user=Questa autenticazione è ancora in uso da almeno un utente, per favore rimuovili dall'autenticazione e riprova.
|
||||
|
||||
target_branch_not_exist=Il ramo (branch) di destinazione non esiste.
|
||||
|
||||
[user]
|
||||
change_avatar=Cambia il tuo avatar su gravatar.com
|
||||
change_custom_avatar=Cambia il tuo avatar nelle impostazioni
|
||||
join_on=Si è unito il
|
||||
repositories=Repository
|
||||
activity=Attività pubblica
|
||||
followers=Seguaci
|
||||
starred=Votate
|
||||
following=Seguiti
|
||||
|
||||
form.name_reserved=L'username '%s' è riservato.
|
||||
form.name_pattern_not_allowed=La struttura del nome utente '%s' non è consentita.
|
||||
|
||||
[settings]
|
||||
profile=Profilo
|
||||
password=Password
|
||||
ssh_keys=Chiavi SSH
|
||||
social=Account Sociali
|
||||
applications=Applicazioni
|
||||
orgs=Organizzazioni
|
||||
delete=Elimina account
|
||||
uid=Uid
|
||||
|
||||
public_profile=Profilo pubblico
|
||||
profile_desc=Il tuo indirizzo e-mail è pubblico e sarà usato per ogni notifica inerente al tuo account, e per qualsiasi operazione web effettuata attraverso il sito.
|
||||
full_name=Nome Completo
|
||||
website=Sito web
|
||||
location=Posizione
|
||||
update_profile=Aggiorna Profilo
|
||||
update_profile_success=Il tuo profilo è stato aggiornato con successo.
|
||||
change_username=Username Cambiato
|
||||
change_username_desc=Hai cambiato il tuo username. Questo influenzerà il modo in cui i link si relazionano al tuo account. Vuoi proseguire?
|
||||
continue=Continua
|
||||
cancel=Annulla
|
||||
|
||||
enable_custom_avatar=Abilita avatar personalizzato
|
||||
enable_custom_avatar_helper=Seleziona per disabilitare il fetch da Gravatar
|
||||
choose_new_avatar=Scegli un nuovo avatar
|
||||
update_avatar=Aggiorna le impostazioni avatar
|
||||
uploaded_avatar_not_a_image=Il file caricato non è un'immagine.
|
||||
no_custom_avatar_available=Nessun avatar personalizzato disponibile, impossibile abilitarlo.
|
||||
update_avatar_success=Le tue impostazioni avatar sono state aggiornate con successo.
|
||||
|
||||
change_password=Cambia Password
|
||||
old_password=Password attuale
|
||||
new_password=Nuova Password
|
||||
password_incorrect=La Password attuale non è corretta.
|
||||
change_password_success=La tua password è stata cambiata con successo. Ora puoi accedere usando la nuova password.
|
||||
|
||||
emails=Indirizzi e-mail
|
||||
manage_emails=Gestisci indirizzi email
|
||||
email_desc=Il tuo indirizzo e-mail primario sarà usato per le notifiche e altre operazioni.
|
||||
primary=Primario
|
||||
primary_email=Imposta come primario
|
||||
delete_email=Elimina
|
||||
add_new_email=Aggiungi un nuovo indirizzo E-mail
|
||||
add_email=Aggiungi E-mail
|
||||
add_email_confirmation_sent=Una nuova email di conferma è stata inviata a <b>%s</b>, per favore controlla la tua posta in arrivo nelle prossime %d ore per completare il processo di registrazione.
|
||||
add_email_success=Il tuo nuovo indirizzo e-mail è stato aggiunto con successo.
|
||||
|
||||
manage_ssh_keys=Gestisci chiavi SSH
|
||||
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_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
|
||||
key_name=Nome della Chiave
|
||||
key_content=Contenuto
|
||||
add_key_success=La nuova chiave SSH è stata aggiunta!
|
||||
delete_key=Elimina
|
||||
add_on=Aggiunto il
|
||||
last_used=Ultimo accesso il
|
||||
no_activity=Nessuna attività recente
|
||||
|
||||
manage_social=Gestisci gli Account Sociali Associati
|
||||
social_desc=Questa è un elenco degli account sociali associati. Rimuovere qualsiasi account che non si riconosce.
|
||||
unbind=Disassocia
|
||||
unbind_success=Account sociale disassociato.
|
||||
|
||||
manage_access_token=Gestisci i Token di Accesso Personale
|
||||
generate_new_token=Genera Nuovo Token
|
||||
tokens_desc=I Token che hai generato e che possono essere utilizzati per accedere alle API Gogs.
|
||||
new_token_desc=Da questo momento, ogni token avrà pieno accesso al tuo account.
|
||||
token_name=Nome Token
|
||||
generate_token=Genera Token
|
||||
generate_token_succees=Nuovo token di accesso generato con successo! Assicurarsi di copiare il nuovo token di accesso personale ora: non sarà possibile visualizzarlo nuovamente!
|
||||
delete_token=Elimina
|
||||
delete_token_success=Token di accesso personale eliminato con successo! Non dimenticare di aggiornare anche le applicazioni.
|
||||
|
||||
delete_account=Elimina Account
|
||||
delete_prompt=L'operazione eliminerà permanentemente l'account e <strong>NON POTRÀ</strong> essere annullata!
|
||||
confirm_delete_account=Conferma Eliminazione
|
||||
delete_account_title=Eliminazione account
|
||||
delete_account_desc=Questo account sta per essere eliminato in modo definitivo, vuoi continuare?
|
||||
|
||||
[repo]
|
||||
owner=Proprietario
|
||||
repo_name=Nome Repository
|
||||
repo_name_helper=I migliori nomi dei repository sono brevi, facili da memorizzare e <strong>univoci</strong>.
|
||||
visibility=Visibilità
|
||||
visiblity_helper=Questo repository è <span class="label label-red label-radius">Privato</span>
|
||||
fork_repo=Forka Repository
|
||||
fork_from=Forka da
|
||||
fork_visiblity_helper=Non puoi cambiare la visibilità di un repository forkato.
|
||||
repo_desc=Descrizione
|
||||
repo_lang=Lingua
|
||||
repo_lang_helper=Selezionare un file .gitignore
|
||||
license=Licenza
|
||||
license_helper=Selezionare un file di licenza
|
||||
init_readme=Inizializzare questo repository con un file README.md
|
||||
create_repo=Crea Repository
|
||||
default_branch=Ramo (Branch) predefinito
|
||||
mirror_interval=Intervallo Mirror (in ore)
|
||||
|
||||
form.name_reserved=Il nome repository %s è riservato.
|
||||
form.name_pattern_not_allowed=La struttura del nome del repository %s non è consentita.
|
||||
|
||||
need_auth=Richiesta di autorizzazione
|
||||
migrate_type=Tipo di migrazione
|
||||
migrate_type_helper=Questo repository sarà un <span class="label label-blue label-radius">Mirror</span>
|
||||
migrate_repo=Migra Repository
|
||||
migrate.clone_address=Duplica Indirizzo
|
||||
migrate.invalid_local_path=Percorso locale non valido, non esiste o non è una cartella.
|
||||
|
||||
forked_from=forkato da
|
||||
fork_from_self=Non puoi forkare il tuo stesso repository!
|
||||
copy_link=Copia
|
||||
click_to_copy=Copia negli appunti
|
||||
copied=OK copiato
|
||||
clone_helper=Hai bisogno di aiuto per la clonazione? Visita <a target="_blank" href="%s">Aiuto</a>!
|
||||
unwatch=Non seguire più
|
||||
watch=Segui
|
||||
unstar=Togli il voto
|
||||
star=Vota
|
||||
fork=Forka
|
||||
|
||||
no_desc=Nessuna descrizione
|
||||
quick_guide=Guida rapida
|
||||
clone_this_repo=Clona questo repository
|
||||
create_new_repo_command=Crea nuovo repository da riga di comando
|
||||
push_exist_repo=Push un repo esistente dalla riga di comando
|
||||
|
||||
branch=Ramo (Branch)
|
||||
tree=Albero (Tree)
|
||||
branch_and_tags=Rami (Branch) & Tag
|
||||
branches=Rami (Branch)
|
||||
tags=Tag
|
||||
issues=Problemi
|
||||
labels=Etichette
|
||||
milestones=Traguardi
|
||||
commits=Commit
|
||||
releases=Rilasci
|
||||
file_raw=Originale
|
||||
file_history=Cronologia
|
||||
file_view_raw=Vedi originale
|
||||
file_permalink=Permalink
|
||||
|
||||
commits.commits=Commits
|
||||
commits.search=Ricerca una versione
|
||||
commits.find=Cerca
|
||||
commits.author=Autore
|
||||
commits.message=Messaggio
|
||||
commits.date=Data
|
||||
commits.older=Più vecchio
|
||||
commits.newer=Più recente
|
||||
|
||||
issues.new=Nuovo Problema
|
||||
issues.new_label=Nuova etichetta
|
||||
issues.new_label_placeholder=Nome dell'etichetta...
|
||||
issues.open_tab=%d Aperti
|
||||
issues.close_tab=%d Chiusi
|
||||
issues.filter_label=Etichetta
|
||||
issues.filter_label_no_select=Nessuna etichetta selezionata
|
||||
issues.filter_milestone=Traguardo
|
||||
issues.filter_assignee=Assegnatario
|
||||
issues.filter_type=Tipo
|
||||
issues.filter_type.all_issues=Tutti i problemi
|
||||
issues.filter_type.assigned_to_you=Assegnati a te
|
||||
issues.filter_type.created_by_you=Creati da te
|
||||
issues.filter_type.mentioning_you=Che ti riguardano
|
||||
issues.opened_by=aperto %[1]s da <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Pagina precedente
|
||||
issues.next=Pagina successiva
|
||||
issues.label_title=Nome etichetta
|
||||
issues.label_color=Colore etichetta
|
||||
issues.label_count=%d etichette
|
||||
issues.label_open_issues=%d problemi aperti
|
||||
issues.label_edit=Modifica
|
||||
issues.label_delete=Elimina
|
||||
issues.label_modify=Modifica Etichetta
|
||||
issues.label_deletion=Elimina Etichetta
|
||||
issues.label_deletion_desc=Eliminare l'etichetta rimuovera le sue informazioni in tutti i problemi correlati. Vuoi continuare?
|
||||
issues.label_deletion_success=Etichetta eliminata con successo!
|
||||
|
||||
settings=Impostazioni
|
||||
settings.options=Opzioni
|
||||
settings.collaboration=Collaborazione
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Git Hooks
|
||||
settings.deploy_keys=Dispiega Chiavi
|
||||
settings.basic_settings=Impostazioni di Base
|
||||
settings.danger_zone=Zona Pericolosa
|
||||
settings.site=Sito Ufficiale
|
||||
settings.update_settings=Aggiorna Impostazioni
|
||||
settings.change_reponame=Nome Repository Cambiato
|
||||
settings.change_reponame_desc=Il nome repository è stato cambiato. Questo influenzerà il modo in cui i link si relazionano alla repository. Vuoi continuare?
|
||||
settings.transfer=Trasferisci proprietà
|
||||
settings.transfer_desc=Trasferisci questa repository a un altro utente o a un'organizzazione nella quale hai diritti d'amministratore.
|
||||
settings.new_owner_has_same_repo=Il nuovo proprietario ha già un repository con lo stesso nome. Per favore scegli un altro nome.
|
||||
settings.delete=Elimina questo repository
|
||||
settings.delete_desc=Una volta che hai cancellato il repository, non puoi tornare indietro. Si prega di fare attenzione.
|
||||
settings.transfer_notices=<p>- Perderai accesso se il nuovo proprietario è un utente individuale.</p><p>- Conserverai l'accesso se il nuovo proprietario è un'organizzazione di cui sei uno dei proprietari.</p>
|
||||
settings.update_settings_success=Le opzioni repository sono state aggiornate con successo.
|
||||
settings.transfer_owner=Nuovo Proprietario
|
||||
settings.make_transfer=Trasferisci
|
||||
settings.transfer_succeed=Proprietà del repository trasferita con successo.
|
||||
settings.confirm_delete=Conferma eliminazione
|
||||
settings.add_collaborator=Aggiungi nuovo collaboratore
|
||||
settings.add_collaborator_success=Il nuovo collaboratore è stato aggiunto.
|
||||
settings.remove_collaborator_success=Il collaboratore è stato rimosso.
|
||||
settings.user_is_org_member=L'utente è un membro dell'organizzazione che non può essere aggiunto come collaboratore.
|
||||
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 Gogs, tratteremo la notifica all'host di destinazione specificato. Ulteriori informazioni in questa <a target="_blank" href="%s">Guida ai Webhooks</a>.
|
||||
settings.githooks_desc=Gli Hooks di Git sono una funzionalità di Git stesso, puoi modificare i file degli hooks supportati nell'elenco qui sotto per compiere azioni personalizzate.
|
||||
settings.githook_edit_desc=Se l'hook è inattivo, sarà presentato un contenuto esempio. Lasciando il contenuto vuoto disattiverai questo hook.
|
||||
settings.githook_name=Nome hook
|
||||
settings.githook_content=Contenuto hook
|
||||
settings.update_githook=Aggiorna Hook
|
||||
settings.remove_hook_success=Il webhook è stato rimosso.
|
||||
settings.add_webhook_desc=Gogs 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" href="%s">Guida ai Webhook</a>.
|
||||
settings.payload_url=Payload URL
|
||||
settings.content_type=Content Type
|
||||
settings.secret=Secret
|
||||
settings.event_desc=Quali eventi dovrebbero innescare questo webhook?
|
||||
settings.event_push_only=Solo l'evento <code>push</code>.
|
||||
settings.active=Attivo
|
||||
settings.active_helper=Anche i dettagli riguardanti l'evento che ha innescato l'hook saranno inviati.
|
||||
settings.add_hook_success=Il nuovo webhook è stato aggiunto.
|
||||
settings.update_webhook=Aggiorna Webhook
|
||||
settings.update_hook_success=Il webhook è stato aggiornato.
|
||||
settings.delete_webhook=Eliminare Webhook
|
||||
settings.recent_deliveries=Recenti Deliveries
|
||||
settings.hook_type=Tipo di Hook
|
||||
settings.add_slack_hook_desc=Aggiungi <a href="%s"> Slack</a> integrazione al tuo repository.
|
||||
settings.slack_token=Token
|
||||
settings.slack_domain=Dominio
|
||||
settings.slack_channel=Canale
|
||||
|
||||
diff.browse_source=Sfoglia il codice sorgente
|
||||
diff.parent=parent
|
||||
diff.commit=commit
|
||||
diff.data_not_available=Diff Data non disponibile.
|
||||
diff.show_diff_stats=Mostra Diff Stats
|
||||
diff.stats_desc=<strong>%d ha cambiato i file</strong> con <strong>%d aggiunte</strong> e <strong>%d eliminazioni</strong>
|
||||
diff.bin=BIN
|
||||
diff.view_file=Vedi File
|
||||
|
||||
release.releases=Rilasci
|
||||
release.new_release=Nuovo Rilascio
|
||||
release.draft=Bozza
|
||||
release.prerelease=Pre-Rilascio
|
||||
release.stable=Stabile
|
||||
release.edit=modifica
|
||||
release.ahead=<strong>%d</strong> commits da %s da questo rilascio
|
||||
release.source_code=Codice Sorgente
|
||||
release.tag_name=Nome tag
|
||||
release.target=Obbiettivo
|
||||
release.tag_helper=Scegli un tag esistente o crea un nuovo tag una volta pubblicato.
|
||||
release.release_title=Nome release
|
||||
release.content_with_md=Contenuto in <a href="%s">Markdown</a>
|
||||
release.write=Scrivi
|
||||
release.preview=Anteprima
|
||||
release.content_placeholder=Scrivi qualcosa
|
||||
release.loading=Caricamento...
|
||||
release.prerelease_desc=Questo è un pre-rilascio
|
||||
release.prerelease_helper=Precisiamo che questo rilascio non è pronta per la produzione.
|
||||
release.publish=Pubblica Rilascio
|
||||
release.save_draft=Salva Bozza
|
||||
release.edit_release=Modifica Rilascio
|
||||
release.tag_name_already_exist=Un rilascio con questo tag esiste già.
|
||||
|
||||
[org]
|
||||
org_name_holder=Nome dell'Organizzazione
|
||||
org_name_helper=Le migliori organizzazioni hanno nomi brevi e memorabili.
|
||||
org_email_helper=L'Email dell'organizzazione riceve tutte le notifiche e le conferme.
|
||||
create_org=Crea Organizzazione
|
||||
repo_updated=Aggiornato
|
||||
people=Utenti
|
||||
invite_someone=Invita Qualcuno
|
||||
teams=Team
|
||||
lower_members=membri
|
||||
lower_repositories=repository
|
||||
create_new_team=Crea Nuovo Team
|
||||
org_desc=Descrizione
|
||||
team_name=Nome Team
|
||||
team_desc=Descrizione
|
||||
team_name_helper=Verrà usato questo nome per riferirsi a questo team nella conversazioni.
|
||||
team_desc_helper=In cosa consiste questo team?
|
||||
team_permission_desc=Quale livello di autorizzazione dovrebbe avere questa squadra?
|
||||
|
||||
form.name_reserved=Il nome organizzazione '%s' è riservato.
|
||||
form.name_pattern_not_allowed=La struttura del nome dell'organizzazione '%s' non è consentita.
|
||||
|
||||
settings=Impostazioni
|
||||
settings.options=Opzioni
|
||||
settings.full_name=Nome Completo
|
||||
settings.website=Sito Web
|
||||
settings.location=Residenza
|
||||
settings.update_settings=Aggiorna Impostazioni
|
||||
settings.change_orgname=Il nome dell'organizzazione è cambiato
|
||||
settings.change_orgname_desc=Il nome dell'organizzazione name è cambiato. Questo influenzerà come collegamenti si riferiscono all'organizzazione. Si desidera continuare?
|
||||
settings.update_setting_success=Impostazioni dell'organizzazione aggiornate con successo.
|
||||
settings.delete=Elimina organizzazione
|
||||
settings.delete_account=Elimina questa organizzazione
|
||||
settings.delete_prompt=L'organizzazione verrà rimossa definitivamente, e questa operazione <strong>NON PUÒ</strong> essere annullata!
|
||||
settings.confirm_delete_account=Conferma Eliminazione
|
||||
settings.delete_org_title=Eliminazione Organizzazione
|
||||
settings.delete_org_desc=Questa organizzazione sta per essere eliminato in modo permanente, vuoi continuare?
|
||||
settings.hooks_desc=Aggiungi i webhooks che verranno attivati per <strong>tutti i repository</strong> sotto questa organizzazione.
|
||||
|
||||
members.public=Pubblico
|
||||
members.public_helper=rendi privato
|
||||
members.private=Privato
|
||||
members.private_helper=rendi pubblico
|
||||
members.owner=Proprietario
|
||||
members.member=Membro
|
||||
members.conceal=Nascondere
|
||||
members.remove=Rimuovere
|
||||
members.leave=Abbandona
|
||||
members.invite_desc=Digita un nome utente per invitare un nuovo membro a %s:
|
||||
members.invite_now=Invita ora
|
||||
|
||||
teams.join=Iscriviti
|
||||
teams.leave=Abbandona
|
||||
teams.read_access=Accesso di Lettura
|
||||
teams.read_access_helper=Questo team sarà in grado di visualizzare e clonare i suoi repository.
|
||||
teams.write_access=Accesso di Scrittura
|
||||
teams.write_access_helper=Questo team sarà in grado di leggere i suoi repository, come pure pusharli.
|
||||
teams.admin_access=Accesso Amministratore
|
||||
teams.admin_access_helper=Questo team sarà in grado di pushare/pullare i propri repo, così come aggiungere altri collaboratori.
|
||||
teams.no_desc=Questo team non ha alcuna descrizione
|
||||
teams.settings=Impostazioni
|
||||
teams.owners_permission_desc=I Proprietari hanno pieno accesso a <strong>tutti i repository</strong> e hanno <strong>diritti di amministatore</strong> nell'organizzazione.
|
||||
teams.members=Membri del Team
|
||||
teams.update_settings=Aggiorna Impostazioni
|
||||
teams.delete_team=Elimina questo Team
|
||||
teams.add_team_member=Aggiungere un Membro al Team
|
||||
teams.delete_team_title=Eliminazione Team
|
||||
teams.delete_team_desc=Quando questo team verrà eliminato, i membri di questa squadra potrebbero perdere l'accesso ad alcuni repository. Si desidera continuare?
|
||||
teams.delete_team_success=Team eliminato con successo.
|
||||
teams.read_permission_desc=Questo Team concede accesso di <strong>Lettura</strong>: i membri possono visualizzare e clonare i repository del Team.
|
||||
teams.write_permission_desc=Questo Team concede accesso di <strong>Scrittura</strong>: i membri possono leggere e pushare i repository del Team.
|
||||
teams.admin_permission_desc=Questo Team concede accesso di <strong>Amministratore</strong>: i membri possono leggere i, pushare a, e aggiungere collaboratori ai repository del Team.
|
||||
teams.repositories=Repository di Squadra
|
||||
teams.add_team_repository=Aggiungere Repository di Squadra
|
||||
teams.remove_repo=Rimuovi
|
||||
teams.add_nonexistent_repo=Il repository che stai tentando di aggiungere non esiste, crealo prima.
|
||||
|
||||
[admin]
|
||||
dashboard=Pannello di Controllo
|
||||
users=Utenti
|
||||
organizations=Organizzazioni
|
||||
repositories=Repository
|
||||
authentication=Autenticazioni
|
||||
config=Configurazione
|
||||
notices=Avvisi di sistema
|
||||
monitor=Monitoraggio
|
||||
prev=Prec.
|
||||
next=Succ.
|
||||
|
||||
dashboard.statistic=Statistiche
|
||||
dashboard.operations=Operazioni
|
||||
dashboard.system_status=Stato del Monitor di Sistema
|
||||
dashboard.statistic_info=Il database di Gogs ha <b>%d</b> utenti, <b>%d</b> organizzazioni, <b>%d</b> chiavi pubbliche, <b>%d</b> repository, <b>%d</b> utenti che seguono, <b>%d</b> voti, <b>%d</b> azioni, <b>%d</b> accessi, <b>%d</b> problemi, <b>%d</b> commenti, <b>%d</b> account sociali, <b>%d</b> utenti seguiti, <b>%d</b> mirror, <b>%d</b> rilasci, <b>%d</b> fonti di accesso, <b>%d</b> webhook, <b>%d</b> traguardi, <b>%d</b> etichette, <b>%d</b> incarichi hook, <b>%d</b> team, <b>%d</b> attività di aggiornamento, <b>%d</b> allegati.
|
||||
dashboard.operation_name=Nome Operazione
|
||||
dashboard.operation_switch=Cambia
|
||||
dashboard.operation_run=Esegui
|
||||
dashboard.clean_unbind_oauth=Pulire OAuthes non associati
|
||||
dashboard.clean_unbind_oauth_success=Tutti gli OAuthes non associati eliminati con successo.
|
||||
dashboard.delete_inactivate_accounts=Elimina tutti gli account inattivi
|
||||
dashboard.delete_inactivate_accounts_success=Tutti gli account inattivi eliminati con successo.
|
||||
dashboard.delete_repo_archives=Elimina tutti gli archivi dei repository
|
||||
dashboard.delete_repo_archives_success=Tutti gli archivi del repository sono stati eliminati con successo.
|
||||
dashboard.git_gc_repos=Fare la procedura di garbage collection sui repository
|
||||
dashboard.git_gc_repos_success=Tutti i repository hanno fatto la procedura di garbage collection con successo.
|
||||
dashboard.resync_all_sshkeys=Riscrivi il file '.ssh/authorized_keys' (attenzione: le chiavi non appartenenti a Gogs saranno perse)
|
||||
dashboard.resync_all_sshkeys_success=Tutte le chiavi pubbliche riscritte con successo.
|
||||
dashboard.resync_all_update_hooks=Riscrivere tutti gli update hook dei repository (necessario quando il percorso di configurazione personalizzata viene modificato)
|
||||
dashboard.resync_all_update_hooks_success=Tutti gli update hook dei repository riscritti con successo.
|
||||
|
||||
dashboard.server_uptime=Tempo in Attività del Server
|
||||
dashboard.current_goroutine=Goroutine Correnti
|
||||
dashboard.current_memory_usage=Utilizzo di Memoria Corrente
|
||||
dashboard.total_memory_allocated=Memoria Allocata Totale
|
||||
dashboard.memory_obtained=Memoria Ottenuta
|
||||
dashboard.pointer_lookup_times=Ricerche del Puntatore
|
||||
dashboard.memory_allocate_times=Allocazioni Memoria
|
||||
dashboard.memory_free_times=Svuotamenti di Memoria
|
||||
dashboard.current_heap_usage=Utilizzo Heap Corrente
|
||||
dashboard.heap_memory_obtained=Memoria Heap Ottenuta
|
||||
dashboard.heap_memory_idle=Memoria Heap Inattiva
|
||||
dashboard.heap_memory_in_use=Memoria Heap In Uso
|
||||
dashboard.heap_memory_released=Memoria Heap Rilasciata
|
||||
dashboard.heap_objects=Oggetti dell'Heap
|
||||
dashboard.bootstrap_stack_usage=Utilizzo Pila di Bootstrap
|
||||
dashboard.stack_memory_obtained=Memoria Stack Ottenuta
|
||||
dashboard.mspan_structures_usage=Utilizzo Strutture MSpan
|
||||
dashboard.mspan_structures_obtained=Strutture MSpan Ottenute
|
||||
dashboard.mcache_structures_usage=Utilizzo di Strutture MCache
|
||||
dashboard.mcache_structures_obtained=Strutture MCache Ottenute
|
||||
dashboard.profiling_bucket_hash_table_obtained=Tabella di Hash del Bucket Ottenuta
|
||||
dashboard.gc_metadata_obtained=Metadata della GC ottenuta
|
||||
dashboard.other_system_allocation_obtained=Altre Allocazioni di Sistema Ottenute
|
||||
dashboard.next_gc_recycle=Prossimo Riciclaggio GC
|
||||
dashboard.last_gc_time=Dall'Ultimo GC
|
||||
dashboard.total_gc_time=Pausa Totale della GC
|
||||
dashboard.total_gc_pause=Pausa Totale della GC
|
||||
dashboard.last_gc_pause=Ultima pausa della GC
|
||||
dashboard.gc_times=Esecuzioni GC
|
||||
|
||||
users.user_manage_panel=Pannello Gestione Utenti
|
||||
users.new_account=Crea Nuovo Account
|
||||
users.name=Nome
|
||||
users.activated=Attivato
|
||||
users.admin=Amministratore
|
||||
users.repos=Repo
|
||||
users.created=Creato
|
||||
users.edit=Modifica
|
||||
users.auth_source=Origine Autorizzazione
|
||||
users.local=Locale
|
||||
users.auth_login_name=Nome di Accesso dell'Autorizzazione
|
||||
users.update_profile_success=Profilo dell'account aggiornato con successo.
|
||||
users.edit_account=Modifica Account
|
||||
users.is_activated=Questo account è attivato
|
||||
users.is_admin=Questo account ha permessi di amministratore
|
||||
users.allow_git_hook=Questo account ha il permesso di creare hooks di Git
|
||||
users.update_profile=Aggiornare Profilo Account
|
||||
users.delete_account=Elimina Questo Account
|
||||
users.still_own_repo=Questo account possiede ancora almeno un repository, devi prima cancellarli o trasferirli.
|
||||
users.still_has_org=Questo account appartiene ancora ad almeno un'organizzazione, è necessario prima abbandonarle o eliminale.
|
||||
|
||||
orgs.org_manage_panel=Pannello Gestione Organizzazioni
|
||||
orgs.name=Nome
|
||||
orgs.teams=Team
|
||||
orgs.members=Membri
|
||||
|
||||
repos.repo_manage_panel=Pannello Organizzazione Repository
|
||||
repos.owner=Proprietario
|
||||
repos.name=Nome
|
||||
repos.private=Privati
|
||||
repos.watches=Segue
|
||||
repos.stars=Voti
|
||||
repos.issues=Problemi
|
||||
|
||||
auths.auth_manage_panel=Pannello Gestione Autorizzazioni
|
||||
auths.new=Aggiungi Nuova Origine Autorizzazione
|
||||
auths.name=Nome
|
||||
auths.type=Tipo
|
||||
auths.enabled=Attivo
|
||||
auths.updated=Aggiornato
|
||||
auths.auth_type=Tipo di Autorizzazione
|
||||
auths.auth_name=Nome Autorizzazione
|
||||
auths.domain=Dominio
|
||||
auths.host=Host
|
||||
auths.port=Porta
|
||||
auths.base_dn=Base DN
|
||||
auths.attribute_username=Attributo Nome Utente
|
||||
auths.attribute_name=Attributo Nome
|
||||
auths.attribute_surname=Attributo Cognome
|
||||
auths.attribute_mail=Attributo Email
|
||||
auths.filter=Filtro di Ricerca
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=Tipo di Autorizzazione SMTP
|
||||
auths.smtphost=Host SMTP
|
||||
auths.smtpport=Porta SMTP
|
||||
auths.enable_tls=Abilitare Crittografia TLS
|
||||
auths.pam_service_name=Nome del Servizio PAM
|
||||
auths.enable_auto_register=Abilitare Registrazione Automatica
|
||||
auths.tips=Consigli
|
||||
auths.edit=Modificare Impostazioni Autorizzazioni
|
||||
auths.activated=Questa Autenticazione è stata attivata
|
||||
auths.update_success=Impostazione dell'Autorizzazione aggiornate con successo.
|
||||
auths.update=Aggiorna Impostazioni Autorizzazioni
|
||||
auths.delete=Elimina Questa Autorizzazione
|
||||
auths.delete_auth_title=Eliminazione Autorizzazione
|
||||
auths.delete_auth_desc=Questa autorizzazione sarà cancellata, vuoi continuare?
|
||||
|
||||
config.server_config=Configurazione Server
|
||||
config.app_name=Nome Applicazione
|
||||
config.app_ver=Versione Applicazione
|
||||
config.app_url=URL Applicazione
|
||||
config.domain=Dominio
|
||||
config.offline_mode=Modalità Offline
|
||||
config.disable_router_log=Disattivare Log del Router
|
||||
config.run_user=Utente Esecutore
|
||||
config.run_mode=Modalità Esecuzione
|
||||
config.repo_root_path=Percorso Root del Repository
|
||||
config.static_file_root_path=Percorso Root del File Statico
|
||||
config.log_file_root_path=Percorso Root del File di Log
|
||||
config.script_type=Tipo di Script
|
||||
config.reverse_auth_user=Autenticazione Utente Inversa
|
||||
config.db_config=Configurazione Database
|
||||
config.db_type=Tipo
|
||||
config.db_host=Host
|
||||
config.db_name=Nome
|
||||
config.db_user=Utente
|
||||
config.db_ssl_mode=Modalità SSL
|
||||
config.db_ssl_mode_helper=(solo per "postgres")
|
||||
config.db_path=Percorso
|
||||
config.db_path_helper=(solo per "sqlite3")
|
||||
config.service_config=Configurazione Servizio
|
||||
config.register_email_confirm=Richiedono Conferma dell'Email
|
||||
config.disable_register=Disabilita Registrazione
|
||||
config.show_registration_button=Mostra Pulsane Registrazione
|
||||
config.require_sign_in_view=Richiesto Accesso per Vedere
|
||||
config.mail_notify=Email di Notifica
|
||||
config.enable_cache_avatar=Abilitare Cache dell'Avatar
|
||||
config.active_code_lives=Attiva Vita del Codice
|
||||
config.reset_password_code_lives=Reimpostare Password della Vita del Codice
|
||||
config.webhook_config=Configurazione Webhook
|
||||
config.task_interval=Intervallo Attività
|
||||
config.deliver_timeout=Tempo Limite di Consegna
|
||||
config.skip_tls_verify=Salta verifiche TLS
|
||||
config.mailer_config=Configurazione Mailer
|
||||
config.mailer_enabled=Attivo
|
||||
config.mailer_disable_helo=Disattiva HELO
|
||||
config.mailer_name=Nome
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Utente
|
||||
config.oauth_config=Configurazione OAuth
|
||||
config.oauth_enabled=Attivo
|
||||
config.cache_config=Configurazione Cache
|
||||
config.cache_adapter=Adattatore Cache
|
||||
config.cache_interval=Intervallo Cache
|
||||
config.cache_conn=Connessione Cache
|
||||
config.session_config=Configurazione Sessione
|
||||
config.session_provider=Fornitore Sessione
|
||||
config.provider_config=Impostazioni Provider
|
||||
config.cookie_name=Nome del Cookie
|
||||
config.enable_set_cookie=Abilita Uso dei Cookie
|
||||
config.gc_interval_time=Intervallo di tempo della GC
|
||||
config.session_life_time=Durata Sessione
|
||||
config.https_only=Solo HTTPS
|
||||
config.cookie_life_time=Durata Cookie
|
||||
config.picture_config=Configurazione Foto
|
||||
config.picture_service=Servizio foto
|
||||
config.disable_gravatar=Disabilita Gravatar
|
||||
config.log_config=Configurazione Log
|
||||
config.log_mode=Modalità Log
|
||||
|
||||
monitor.cron=Incarici di cron
|
||||
monitor.name=Nome
|
||||
monitor.schedule=Agenda
|
||||
monitor.next=La Prossima Volta
|
||||
monitor.previous=La Scorsa Volta
|
||||
monitor.execute_times=Numero di Esecuzioni
|
||||
monitor.process=Processi in Esecuzione
|
||||
monitor.desc=Descrizione
|
||||
monitor.start=Orario Avvio
|
||||
monitor.execute_time=Tempo di Esecuzione
|
||||
|
||||
notices.system_notice_list=Avvisi di Sistema
|
||||
notices.type=Tipo
|
||||
notices.type_1=Repository
|
||||
notices.desc=Descrizione
|
||||
notices.op=Op.
|
||||
notices.delete_success=Avviso di sistema cancellato con successo.
|
||||
|
||||
[action]
|
||||
create_repo=ha creato il repository <a href="%s">%s</a>
|
||||
commit_repo=ha pushato nel <a href="%s/src/%s">%[2]s</a> in <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`ha aperto 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>
|
||||
push_tag=ha pushato il tag <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits=Vedi confronto per questi 2 commit
|
||||
|
||||
[tool]
|
||||
ago=fa
|
||||
from_now=da adesso
|
||||
now=ora
|
||||
1s=1 secondo %s
|
||||
1m=1 minuto %s
|
||||
1h=1 ora %s
|
||||
1d=1 giorno %s
|
||||
1w=1 settimana %s
|
||||
1mon=1 mese %s
|
||||
1y=1 anno %s
|
||||
seconds=%d secondi %s
|
||||
minutes=%d minuti %s
|
||||
hours=%d ore %s
|
||||
days=%d giorni %s
|
||||
weeks=%d settimane %s
|
||||
months=%d mesi %s
|
||||
years=%d anni %s
|
||||
raw_seconds=secondi
|
||||
raw_minutes=minuti
|
||||
|
||||
798
conf/locale/locale_ja-JP.ini
Executable file
798
conf/locale/locale_ja-JP.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Go言語で実装したセルフホストGitサービス
|
||||
|
||||
home=ホーム
|
||||
dashboard=ダッシュボード
|
||||
explore=エスクプローラ
|
||||
help=ヘルプ
|
||||
sign_in=サインイン
|
||||
social_sign_in=SNSでサインイン: ステップ2 <small>アカウント連携</small>
|
||||
sign_out=サインアウト
|
||||
sign_up=サインアップ
|
||||
register=登録
|
||||
website=WEBサイト
|
||||
version=バージョン
|
||||
page=ページ
|
||||
template=テンプレート
|
||||
language=言語
|
||||
|
||||
username=ユーザ名
|
||||
email=E-mail
|
||||
password=パスワード
|
||||
re_type=再入力
|
||||
captcha=キャプチャ
|
||||
|
||||
repository=リポジトリ
|
||||
organization=組織
|
||||
mirror=ミラー
|
||||
new_repo=新しいリポジトリ
|
||||
new_migrate=新しい移行
|
||||
new_fork=新しいフォークのリポジトリ
|
||||
new_org=新しい組織
|
||||
manage_org=組織を管理
|
||||
admin_panel=管理者パネル
|
||||
account_settings=アカウント設定
|
||||
settings=設定
|
||||
|
||||
news_feed=ニュースのフィード
|
||||
pull_requests=プルリクエスト
|
||||
issues=課題
|
||||
|
||||
cancel=キャンセル
|
||||
|
||||
[search]
|
||||
search=検索...
|
||||
repository=リポジトリ
|
||||
user=ユーザ
|
||||
issue=課題
|
||||
code=コード
|
||||
|
||||
[install]
|
||||
install=インストール
|
||||
title=初回実行のインストール手順
|
||||
requite_db_desc=Gogs には、MySQL や PostgreSQL 、SQLite3 が必要です。
|
||||
db_title=データベース設定
|
||||
db_type=データベースの種類
|
||||
host=ホスト
|
||||
user=ユーザ
|
||||
password=パスワード
|
||||
db_name=データベース名
|
||||
db_helper=Mysql INNODB エンジン utf8_general_ci の文字セットを使用してください。
|
||||
ssl_mode=SSL モード
|
||||
path=パス
|
||||
sqlite_helper=SQLite3 データベースのファイル パス
|
||||
err_empty_sqlite_path=SQLite3 データベースのパスは、空にすることはできません。
|
||||
|
||||
general_title=Gogs の全般設定
|
||||
app_name=アプリケーション名
|
||||
app_name_helper=素晴らしい組織名を入れてください!
|
||||
repo_path=リポジトリのルートパス
|
||||
repo_path_helper=すべての Git リモート リポジトリはこのディレクトリに保存されます。
|
||||
run_user=実行ユーザ
|
||||
run_user_helper=ユーザーはリポジトリ ルートパスへのアクセス、及びGogs を実行する権限を所有する必要があります。
|
||||
domain=ドメイン
|
||||
domain_helper=これはSSHクローンURLに影響する。
|
||||
http_port=HTTP ポート
|
||||
http_port_helper=アプリケーションが待ち受けするポート番号。
|
||||
app_url=アプリケーションの URL
|
||||
app_url_helper=この設定は、HTTP / HTTPSのクローンURLおよび、一部のメールボックスへのリンクに影響を与えます。
|
||||
|
||||
optional_title=オプション設定
|
||||
email_title=E-mailサービス設定
|
||||
smtp_host=SMTP ホスト
|
||||
smtp_from=差出人
|
||||
smtp_from_helper=送信者メールアドレス、RFC 5322。フォーマットはメールアドレスのみ、または"Name" <email@example.com>。
|
||||
mailer_user=送信者の電子メール
|
||||
mailer_password=送信者のパスワード
|
||||
register_confirm=登録の確認を有効にする
|
||||
mail_notify=メール通知を有効にする
|
||||
server_service_title=サーバーとその他のサービスの設定
|
||||
offline_mode=オフラインモード有効化
|
||||
offline_mode_popup=プロダクション モードでCDN を無効にし、すべてのリソースファイルをローカルで提供します 。
|
||||
disable_registration=自己登録を無効にする
|
||||
disable_registration_popup=自己登録を無効にし、管理者のみがアカウント作成できる
|
||||
require_sign_in_view=サインインしたユーザのみページ閲覧を許可
|
||||
require_sign_in_view_popup=サインインしたユーザのみがページを閲覧できます。ビジターはサインインもしくはサインアップページのみ見られます。
|
||||
admin_setting_desc=今管理者アカウントを作成する必要はありません。ID = 1のユーザ は自動的に管理者の権限を獲得します。
|
||||
admin_title=管理者アカウントの設定
|
||||
admin_name=ユーザ名
|
||||
admin_password=パスワード
|
||||
confirm_password=パスワード確認
|
||||
admin_email=E-mail
|
||||
install_gogs=Gogs をインストール
|
||||
test_git_failed='Git' コマンドテストに失敗: %v
|
||||
sqlite3_not_available=このリリース バージョンは SQLite3 をサポートしていません。gobuild バージョンではない、公式のバイナリ バージョンを %s からダウンロードしてください。
|
||||
invalid_db_setting=データベースの設定が正しくありません: %v
|
||||
invalid_repo_path=リポジトリのルート パスが無効です: %v
|
||||
run_user_not_match=実行ユーザーは、現在のユーザーではない: %s-> %s
|
||||
save_config_failed=構成の保存に失敗した: %v
|
||||
invalid_admin_setting=管理者アカウントの設定が無効です: %v
|
||||
install_success=ようこそ!我々はあなたが Gogs を選んでくれて嬉しいです!楽しみましょう!
|
||||
|
||||
[home]
|
||||
uname_holder=ユーザー名またはEメール
|
||||
password_holder=パスワード
|
||||
switch_dashboard_context=ダッシュ ボードのコンテキストを切替
|
||||
my_repos=私のリポジトリ
|
||||
collaborative_repos=共同リポジトリ
|
||||
my_orgs=私の組織
|
||||
my_mirrors=私のミラー
|
||||
|
||||
[explore]
|
||||
repos=リポジトリ
|
||||
|
||||
[auth]
|
||||
create_new_account=新規アカウントを作成
|
||||
register_hepler_msg=すでにアカウントをお持ちですか?今すぐログイン !
|
||||
social_register_hepler_msg=すでにアカウントをお持ちですか?今すぐバインド !
|
||||
disable_register_prompt=申し訳ありませんが、登録が無効になっています。サイト管理者に問い合わせてください。
|
||||
disable_register_mail=申し訳ありませんが、登録メールの確認機能が無効になっています。
|
||||
remember_me=ログイン状態を保持する
|
||||
forgot_password=パスワードを忘れた
|
||||
forget_password=パスワードを忘れた?
|
||||
sign_up_now=アカウントが必要ですか?今すぐサインアップ
|
||||
confirmation_mail_sent_prompt=新しい確認メールを <b>%s</b> に送りました。登録を完了させるために、%d時間以内にあなたのメールボックスを確認してください。
|
||||
sign_in_email=E-mailでサイイン
|
||||
active_your_account=アカウントをアクティブ
|
||||
resent_limit_prompt=申し訳ありませんが、アクティベーションメールは頻繁に送信しています。3 分お待ちください。
|
||||
has_unconfirmed_mail=こんにちは %s さん、あなたの電子メール アドレス (<b>%s</b>) は未確認です。もし確認メールをまだ確認できていないか、改めて再送信する場合は、下のボタンをクリックしてください。
|
||||
resend_mail=アクティベーションメールを再送信するにはここをクリック
|
||||
email_not_associate=この電子メール アドレスは、アカウントには関連付けられません。
|
||||
send_reset_mail=パスワードリセットのメールを再送するにはここをクリック
|
||||
reset_password=パスワードリセット
|
||||
invalid_code=申し訳ありませんが、確認用コードが期限切れまたは無効です。
|
||||
reset_password_helper=パスワードをリセットするにはここをクリック
|
||||
password_too_short=6文字未満のパスワードは設定できません。
|
||||
|
||||
[modal]
|
||||
yes=はい
|
||||
no=いいえ
|
||||
modify=変更
|
||||
|
||||
[form]
|
||||
UserName=ユーザ名
|
||||
RepoName=リポジトリ名
|
||||
Email=Eメールアドレス
|
||||
Password=パスワード
|
||||
Retype=パスワードを再入力
|
||||
SSHTitle=SSH キーの名前
|
||||
HttpsUrl=HTTPS URL
|
||||
PayloadUrl=ペイロードの URL
|
||||
TeamName=チーム名
|
||||
AuthName=承認名
|
||||
AdminEmail=管理者の電子メール
|
||||
|
||||
require_error=空にできません
|
||||
alpha_dash_error=アルファベット、数字、ハイフン"-"、アンダースコア"_"のいずれかの必要があります
|
||||
alpha_dash_dot_error=' アルファベット、数値、ダッシュ(-)、アンダースコア(_) 、ドット(.)のいずれかを入力する必要があります。 '
|
||||
size_error=`サイズは %s である必要があります`
|
||||
min_size_error=' 少なくとも %s 文字の必要があります '
|
||||
max_size_error=' %s 文字以下の必要があります '
|
||||
email_error=' は有効な電子メール アドレスではない '
|
||||
url_error=' は有効な URL はありません。 '
|
||||
unknown_error=不明なエラー:
|
||||
captcha_incorrect=Captcha が一致しませんでした。
|
||||
password_not_match=パスワードと確認用パスワードが一致同していません。
|
||||
|
||||
username_been_taken=ユーザー名は既に使用されています。
|
||||
repo_name_been_taken=リポジトリ名は既に使用されています。
|
||||
org_name_been_taken=組織名は既に使用されています。
|
||||
team_name_been_taken=チーム名は既に使用されています。
|
||||
email_been_used=電子メール アドレスは既に使用されています。
|
||||
ssh_key_been_used=パブリック キー名が使用されています。
|
||||
illegal_team_name=チーム名に無効な文字が含まれています。
|
||||
username_password_incorrect=ユーザー名またはパスワードが正しくありません。
|
||||
enterred_invalid_repo_name=入力したリポジトリの名前が正しいかどうかを確認してください。
|
||||
enterred_invalid_owner_name=入力された所有者名が正しいかどうかを確認してください。
|
||||
enterred_invalid_password=入力したパスワードが正しいかを確認してください。
|
||||
user_not_exist=指定されたユーザーは存在しません。
|
||||
last_org_owner=削除するユーザーはチームの最後のメンバーです。別の所有者設定が必要です。
|
||||
|
||||
invalid_ssh_key=SSHを確認できません:%s
|
||||
unable_verify_ssh_key=GogsはあなたのSSH keyを確認できません。しかし、我々は有効とみなしますので、自分自身で確認してください。
|
||||
auth_failed=認証に失敗しました: %v
|
||||
|
||||
still_own_repo=アカウント所有のリポジトリがあり、リポジトリの削除または所有者の移譲が必要です。
|
||||
still_has_org=アカウントはまだ組織のメンバーであり、組織から退出するか削除する必要があります。
|
||||
org_still_own_repo=この組織はまだリポジトリの所有しています、リポジトリを削除または転送する必要があります。
|
||||
|
||||
still_own_user=この認証はまだ一部のユーザーによって使用されています。一部のユーザを移動させてから、もう一度削除してください。
|
||||
|
||||
target_branch_not_exist=ターゲットブランチが存在しない
|
||||
|
||||
[user]
|
||||
change_avatar=gravatar.com で自分のアバターを変更
|
||||
change_custom_avatar=設定で自分のアバターを変更
|
||||
join_on=参加しました
|
||||
repositories=リポジトリ
|
||||
activity=パブリック・アクティビティ
|
||||
followers=フォロワー
|
||||
starred=スター
|
||||
following=フォロー
|
||||
|
||||
form.name_reserved=ユーザー名 '%s' は予約されています。
|
||||
form.name_pattern_not_allowed=ユーザ名のパターン '%s' は許可されていません。
|
||||
|
||||
[settings]
|
||||
profile=プロフィール
|
||||
password=パスワード
|
||||
ssh_keys=SSH キー
|
||||
social=SNSアカウント
|
||||
applications=アプリケーション
|
||||
orgs=組織
|
||||
delete=アカウントを削除
|
||||
uid=Uid
|
||||
|
||||
public_profile=パブリック プロフィール
|
||||
profile_desc=あなたのメールアドレスは公開され、任意のアカウント関連の通知に使用されます。また、Webベースの操作はサイトを介して行います。
|
||||
full_name=フルネーム
|
||||
website=WEBサイト
|
||||
location=ロケーション
|
||||
update_profile=プロファイル更新
|
||||
update_profile_success=あなたのプロフィールが更新されました。
|
||||
change_username=ユーザー名が変更されました
|
||||
change_username_desc=ユーザー名が変更されている、継続したいですか?これはあなたのアカウントに関連するすべてのリンクに影響を与える。
|
||||
continue=続行
|
||||
cancel=キャンセル
|
||||
|
||||
enable_custom_avatar=カスタムのアバターを有効にする
|
||||
enable_custom_avatar_helper=Gravatarからのフェッチを無効にするのを、有効にします
|
||||
choose_new_avatar=新しいアバターを選択
|
||||
update_avatar=アバターの設定を更新
|
||||
uploaded_avatar_not_a_image=アップロードされたファイルは画像ではない。
|
||||
no_custom_avatar_available=利用可能なカスタム アバターがないため、有効にできません。
|
||||
update_avatar_success=あなたのアバターの設定が更新されました。
|
||||
|
||||
change_password=パスワードを変更
|
||||
old_password=現在のパスワード
|
||||
new_password=新しいパスワード
|
||||
password_incorrect=現在のパスワードが正しくありません。
|
||||
change_password_success=パスワードが正常に変更されました。今すぐ新しいパスワード経由でサインインすることができます。
|
||||
|
||||
emails=E-mail アドレス
|
||||
manage_emails=E-mail アドレスを管理
|
||||
email_desc=あなたのプライマリメールアドレスは、通知やその他の操作に使用されます。
|
||||
primary=プライマリー
|
||||
primary_email=プライマリに設定
|
||||
delete_email=削除
|
||||
add_new_email=新しいe-mailアドレスを追加
|
||||
add_email=電子メールを追加します。
|
||||
add_email_confirmation_sent=<b>%s</b> に新しい確認メールを送信しました、次の %d 時間以内に受信トレイを確認し、確認プロセスを完了してください。
|
||||
add_email_success=新しいe-mail アドレスが追加されました。
|
||||
|
||||
manage_ssh_keys=SSH キーを管理
|
||||
add_key=キーを追加
|
||||
ssh_desc=これはあなたのアカウントに関連付けられている SSH キーの一覧です。あなたが認識していないキーを削除します。
|
||||
ssh_helper=<strong>ヘルプが必要ですか?</strong> 我々のガイドをご覧ください。 <a href="%s"> SSH キーを生成</a> <a href="%s"> SSH の一般的な問題</a>
|
||||
add_new_key=SSH キーを追加
|
||||
key_name=キーの名前
|
||||
key_content=コンテンツ
|
||||
add_key_success=新しい SSH キーが追加されました !
|
||||
delete_key=削除
|
||||
add_on=追加された
|
||||
last_used=最終使用日
|
||||
no_activity=最近の活動なし
|
||||
|
||||
manage_social=関連付けられているSNSアカウントを管理
|
||||
social_desc=これは関連付けられたソーシャルアカウントのリストです。あなたが認識していない結び付けを削除します。
|
||||
unbind=バインド解除
|
||||
unbind_success=SNSアカウントがバインドされていない。
|
||||
|
||||
manage_access_token=個人のアクセス トークンを管理
|
||||
generate_new_token=新しいトークンを生成
|
||||
tokens_desc=生成したトークンを利用して Gogs の API にアクセスすることができます。
|
||||
new_token_desc=今のところ、全てのトークンはあなたのアカウントにフルアクセスできます。
|
||||
token_name=トークン名
|
||||
generate_token=トークンを生成
|
||||
generate_token_succees=新しいアクセス トークンは正常に生成されました !今すぐあなたの新しいアクセス トークンをコピーしておいてください。二度と見ることはできませんので確認してください!
|
||||
delete_token=削除
|
||||
delete_token_success=個人のアクセス トークンは正常に削除されました!同時にあなたのアプリケーションを更新することを忘れないでください。
|
||||
|
||||
delete_account=アカウントを削除
|
||||
delete_prompt=この操作はあなたのアカウントを完全に削除し、復旧<strong>できない</strong> !
|
||||
confirm_delete_account=削除の確認
|
||||
delete_account_title=アカウントの削除
|
||||
delete_account_desc=このアカウントは永久に削除しようとしている、継続しますか?
|
||||
|
||||
[repo]
|
||||
owner=オーナー
|
||||
repo_name=リポジトリ名
|
||||
repo_name_helper=偉大なリポジトリ名は短い。思い出に残り、そして<strong>一意</strong>だ。
|
||||
visibility=ビジビリティ
|
||||
visiblity_helper=このリポジトリは <span class="label label-red label-radius"> プライベート</span> です。
|
||||
fork_repo=フォークのリポジトリ
|
||||
fork_from=フォーク元
|
||||
fork_visiblity_helper=フォークされたリポジトリは可視状態を変更できません
|
||||
repo_desc=説明
|
||||
repo_lang=言語
|
||||
repo_lang_helper=.gitignore ファイルを選択
|
||||
license=ライセンス
|
||||
license_helper=ライセンス ファイルを選択
|
||||
init_readme=README.md 付きでリポジトリを初期化
|
||||
create_repo=リポジトリを作成
|
||||
default_branch=デフォルトのブランチ
|
||||
mirror_interval=ミラー 間隔(時)
|
||||
|
||||
form.name_reserved=リポジトリ名 '%s' は予約されています。
|
||||
form.name_pattern_not_allowed=リポジトリ名のパターン '%s' は許可されていません。
|
||||
|
||||
need_auth=認証が必要
|
||||
migrate_type=マイグレーションの種類
|
||||
migrate_type_helper=このリポジトリは <span class="label label-blue label-radius"> ミラー</span> になります
|
||||
migrate_repo=リポジトリを移行
|
||||
migrate.clone_address=クローンアドレス
|
||||
migrate.invalid_local_path=ローカルパスが無効です。存在しないかディレクトリではありません。
|
||||
|
||||
forked_from=フォーク元
|
||||
fork_from_self=すでにあなたの所有しているリポジトリはフォークできません
|
||||
copy_link=コピー
|
||||
click_to_copy=クリップボードにコピー
|
||||
copied=コピー成功
|
||||
clone_helper=クローニングのヘルプが必要ですか?<a target="_blank"href="%s"> ヘルプ</a> を参照してください!
|
||||
unwatch=Unwatch
|
||||
watch=Watch
|
||||
unstar=Unstar
|
||||
star=Star
|
||||
fork=Fork
|
||||
|
||||
no_desc=説明なし
|
||||
quick_guide=クイック ガイド
|
||||
clone_this_repo=このリポジトリのクローンを作成
|
||||
create_new_repo_command=コマンドラインで新しいリポジトリを作成します。
|
||||
push_exist_repo=コマンド ・ ラインから既存のリポジトリをプッシュ
|
||||
|
||||
branch=ブランチ
|
||||
tree=ツリー
|
||||
branch_and_tags=ブランチ& タグ
|
||||
branches=ブランチ
|
||||
tags=タグ
|
||||
issues=課題
|
||||
labels=ラベル
|
||||
milestones=マイルストーン
|
||||
commits=コミット
|
||||
releases=リリース
|
||||
file_raw=生データ
|
||||
file_history=履歴
|
||||
file_view_raw=生データを見る
|
||||
file_permalink=パーマリンク
|
||||
|
||||
commits.commits=コミット
|
||||
commits.search=コミットの検索
|
||||
commits.find=検索
|
||||
commits.author=作者
|
||||
commits.message=メッセージ
|
||||
commits.date=日付
|
||||
commits.older=古い
|
||||
commits.newer=新しい
|
||||
|
||||
issues.new=新しい問題
|
||||
issues.new_label=新しいラベル
|
||||
issues.new_label_placeholder=ラベル名...
|
||||
issues.open_tab=%d オープン
|
||||
issues.close_tab=%d クローズ
|
||||
issues.filter_label=ラベル
|
||||
issues.filter_label_no_select=選択したラベルがありません。
|
||||
issues.filter_milestone=マイルストーン
|
||||
issues.filter_assignee=アサインされた人
|
||||
issues.filter_type=タイプ
|
||||
issues.filter_type.all_issues=すべての問題
|
||||
issues.filter_type.assigned_to_you=あなたに割り当てられました。
|
||||
issues.filter_type.created_by_you=あなたが作成しました。
|
||||
issues.filter_type.mentioning_you=あなたに伝える
|
||||
issues.opened_by=<a href="/%[2]s"> %[2]s</a>によって開かれた %[1]s
|
||||
issues.previous=前ページ
|
||||
issues.next=次ページ
|
||||
issues.label_title=ラベル名
|
||||
issues.label_color=ラベルの色
|
||||
issues.label_count=%d ラベル
|
||||
issues.label_open_issues=%d 未解決の問題
|
||||
issues.label_edit=編集
|
||||
issues.label_delete=削除
|
||||
issues.label_modify=ラベルの変更
|
||||
issues.label_deletion=ラベルの削除
|
||||
issues.label_deletion_desc=ラベルを削除すると、関連するすべての問題の情報が削除されます。続行しますか。
|
||||
issues.label_deletion_success=ラベルは正常に削除されました。
|
||||
|
||||
settings=設定
|
||||
settings.options=オプション
|
||||
settings.collaboration=コラボレーション
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Git のフック
|
||||
settings.deploy_keys=デプロイキー
|
||||
settings.basic_settings=基本設定
|
||||
settings.danger_zone=危険地帯
|
||||
settings.site=公式サイト
|
||||
settings.update_settings=設定の更新
|
||||
settings.change_reponame=リポジトリ名が変更されました
|
||||
settings.change_reponame_desc=リポジトリの名前が変更されています、継続しますか?このリポジトリ関連すべてのリンクに影響を与えます。
|
||||
settings.transfer=オーナー移転
|
||||
settings.transfer_desc=リポジトリをあなたが管理者権限を持っている別のユーザーまた組織に移譲します。
|
||||
settings.new_owner_has_same_repo=新しいオーナーは、既に同じ名前のリポジトリを持っています。
|
||||
settings.delete=このリポジトリを削除
|
||||
settings.delete_desc=リポジトリを削除すると元に戻せません。確実に確認してください。
|
||||
settings.transfer_notices=<p>-新オーナーは個人ユーザの場合、あなたはにアクセスできなくなります。</p><p>-新オーナーは組織であり、かつあなたが組織のオーナーに所属する場合、あなたはアクセス権を維持します。</p>
|
||||
settings.update_settings_success=リポジトリ オプションが更新されました。
|
||||
settings.transfer_owner=新しいオーナー
|
||||
settings.make_transfer=転送
|
||||
settings.transfer_succeed=リポジトリの所有権は正常に転送されました。
|
||||
settings.confirm_delete=削除の確認
|
||||
settings.add_collaborator=新しい共同編集者を追加
|
||||
settings.add_collaborator_success=新しい共同編集者が追加されました。
|
||||
settings.remove_collaborator_success=共同編集者が削除されました。
|
||||
settings.user_is_org_member=ユーザーは組織の一員なので、共同編集者として追加することはできません。
|
||||
settings.add_webhook=Webhook を追加
|
||||
settings.hooks_desc=Webhooksは、Gogsで特定のイベントの発生時に指定された外部サービスに通知を許可します。イベントが発生すると、それぞれ指定されたUrlに、POSTリクエストが送られます。詳細はこちらのの <a target="_blank"href="%s"> Webhooks ガイド</a>をご覧ください。
|
||||
settings.githooks_desc=Git のフックは Git 自体によって提供されています。以下のリストのファイルを編集して、サポートされているフックのカスタム操作を適用することができます。
|
||||
settings.githook_edit_desc=もしフックがアクティブではない場合は、サンプルコンテンツが表示されます。コンテンツを空白にするにはこのフックを無効にします。
|
||||
settings.githook_name=フックの名前
|
||||
settings.githook_content=コンテンツをフック
|
||||
settings.update_githook=フックを更新
|
||||
settings.remove_hook_success=Webhookが削除されました。
|
||||
settings.add_webhook_desc=私たちは、指定されたURLに購読されたイベントの詳細を <code>POST</code>リクエストとして送信します。あなたは、異なるデータ受信モード(JSONまたは, <code>x-www-form-urlencoded</code>, <em>その他</em>) を設定することができます。詳細については、<a target="_blank" href="%s">Webhookガイド</a>を参照してください。
|
||||
settings.payload_url=ペイロードの URL
|
||||
settings.content_type=コンテンツ タイプ
|
||||
settings.secret=秘密
|
||||
settings.event_desc=どのイベントをこのWEBフックのトリガーにしますか?
|
||||
settings.event_push_only=<code>push</code> イベントのみ
|
||||
settings.active=アクティブ
|
||||
settings.active_helper=このフックのトリガーが引かれた時に、イベントの詳細を配信します。
|
||||
settings.add_hook_success=新しい webhook が追加されました。
|
||||
settings.update_webhook=Webhookを更新
|
||||
settings.update_hook_success=Webhook を更新しました。
|
||||
settings.delete_webhook=Webhook を削除
|
||||
settings.recent_deliveries=最近のデリバリー
|
||||
settings.hook_type=フックタイプ
|
||||
settings.add_slack_hook_desc=<a href="%s"> Slack</a> インテグレーションをリポジトリに追加します。
|
||||
settings.slack_token=トークン
|
||||
settings.slack_domain=ドメイン
|
||||
settings.slack_channel=チャンネル
|
||||
|
||||
diff.browse_source=ソースを参照
|
||||
diff.parent=親
|
||||
diff.commit=コミット
|
||||
diff.data_not_available=差分データは利用できません。
|
||||
diff.show_diff_stats=差分情報を表示
|
||||
diff.stats_desc=共有<strong>%d 個のファイルを変更した</strong>、<strong>%d 個の追加</strong> と <strong>%d 個の削除</strong>を含む
|
||||
diff.bin=BIN
|
||||
diff.view_file=ファイルの表示
|
||||
|
||||
release.releases=リリース
|
||||
release.new_release=新しいリリース
|
||||
release.draft=ドラフト
|
||||
release.prerelease=プレリリース
|
||||
release.stable=安定
|
||||
release.edit=編集
|
||||
release.ahead=このリリース以降 %s へ <strong>%d</strong> コミット
|
||||
release.source_code=ソース コード
|
||||
release.tag_name=タグ名
|
||||
release.target=ターゲット
|
||||
release.tag_helper=既存のタグを選択するか、新しいタグを作成し発行します。
|
||||
release.release_title=リリース タイトル
|
||||
release.content_with_md=<a href="%s"> Markdown</a> コンテンツ
|
||||
release.write=書込み
|
||||
release.preview=プレビュー
|
||||
release.content_placeholder=コンテンツを書く
|
||||
release.loading=読み込み中…
|
||||
release.prerelease_desc=これはリリース前のものです
|
||||
release.prerelease_helper=このリリースは非プロダクション利用として識別します。
|
||||
release.publish=リリースを発行
|
||||
release.save_draft=下書きを保存
|
||||
release.edit_release=リリースを編集
|
||||
release.tag_name_already_exist=このタグ名には既にリリースが存在します。
|
||||
|
||||
[org]
|
||||
org_name_holder=組織名
|
||||
org_name_helper=偉大な組織の名は短く覚えやすいです。
|
||||
org_email_helper=組織の電子メールはすべての通知や確認を受け取ります。
|
||||
create_org=組織を作成
|
||||
repo_updated=更新した
|
||||
people=人々
|
||||
invite_someone=誰かを招待
|
||||
teams=チーム
|
||||
lower_members=メンバー
|
||||
lower_repositories=リポジトリ
|
||||
create_new_team=新しいチームを作成
|
||||
org_desc=説明
|
||||
team_name=チーム名
|
||||
team_desc=説明
|
||||
team_name_helper=会話の時、この名前を使用しチーム名を表明します。
|
||||
team_desc_helper=このチームに関する全ての情報は?
|
||||
team_permission_desc=このチームに必要な権限レベルは?
|
||||
|
||||
form.name_reserved=組織名 '%s' は予約されています。
|
||||
form.name_pattern_not_allowed=組織名のパターン '%s' は許可されていません。
|
||||
|
||||
settings=設定
|
||||
settings.options=オプション
|
||||
settings.full_name=フルネーム
|
||||
settings.website=WEBサイト
|
||||
settings.location=ロケーション
|
||||
settings.update_settings=設定の更新
|
||||
settings.change_orgname=組織名が変更されました
|
||||
settings.change_orgname_desc=組織名が変更されています、継続しますか?これはすべての関連リンクに影響を与えます。
|
||||
settings.update_setting_success=組織の設定が更新されました。
|
||||
settings.delete=組織を削除
|
||||
settings.delete_account=この組織を削除
|
||||
settings.delete_prompt=操作はこの組織を完全に削除し、復旧<strong>できない</strong>!
|
||||
settings.confirm_delete_account=削除の確認
|
||||
settings.delete_org_title=組織の削除
|
||||
settings.delete_org_desc=この組織は完全に削除されます、継続しますか?
|
||||
settings.hooks_desc=この組織のもとで <strong>すべてのリポジトリ</strong> に対してトリガーされる webhook を追加します。
|
||||
|
||||
members.public=パブリック
|
||||
members.public_helper=プライベートにする
|
||||
members.private=プライベート
|
||||
members.private_helper=公開する
|
||||
members.owner=オーナー
|
||||
members.member=メンバー
|
||||
members.conceal=隠す
|
||||
members.remove=削除
|
||||
members.leave=退出
|
||||
members.invite_desc=%s に招待する新しいメンバーをユーザ名を入力してください:
|
||||
members.invite_now=今すぐ招待
|
||||
|
||||
teams.join=参加
|
||||
teams.leave=退出
|
||||
teams.read_access=読み取りアクセス権
|
||||
teams.read_access_helper=このチームはリポジトリの閲覧とクローンをすることができます。
|
||||
teams.write_access=書き込みアクセス権
|
||||
teams.write_access_helper=このチームはリポジトリを読むだけではなく、プッシュすることもできます。
|
||||
teams.admin_access=管理者のアクセス権
|
||||
teams.admin_access_helper=このチームはリポジトリにプッシュ/プル、及び他の共同編集者を追加することができます。
|
||||
teams.no_desc=このチームは説明がありません。
|
||||
teams.settings=設定
|
||||
teams.owners_permission_desc=オーナーは<strong>すべてのリポジトリ</strong> へのフルアクセス権、組織の <strong>管理権限</strong>を持ちます。
|
||||
teams.members=チーム メンバー
|
||||
teams.update_settings=設定の更新
|
||||
teams.delete_team=このチームを削除
|
||||
teams.add_team_member=チーム メンバーを追加
|
||||
teams.delete_team_title=チームの削除
|
||||
teams.delete_team_desc=このチームを削除します、継続しますか?このチームのメンバーはいくつかのリポジトリへのアクセスを失う可能性があります。
|
||||
teams.delete_team_success=指定のチームが正常に削除されました。
|
||||
teams.read_permission_desc=このチームは<strong>読み取り</strong>権限を持ち: メンバーはリポジトリの表示及びクローンの作成ができます。
|
||||
teams.write_permission_desc=このチームは<strong>書き込み</strong>権限を持ち: メンバーはリポジトリの表示及リポジトリへのプッシュができます。
|
||||
teams.admin_permission_desc=このチームは<strong>管理者</strong>の権限を持ち: メンバーはチームのリポジトリに対して、読み取り、プッシュや共同編集者の追加ができます。
|
||||
teams.repositories=チームのリポジトリ
|
||||
teams.add_team_repository=チームのリポジトリを追加
|
||||
teams.remove_repo=削除(Remove)
|
||||
teams.add_nonexistent_repo=追加しようとしているリポジトリは存在しません。まずはじめに作成してください。
|
||||
|
||||
[admin]
|
||||
dashboard=ダッシュボード
|
||||
users=ユーザ
|
||||
organizations=組織
|
||||
repositories=リポジトリ
|
||||
authentication=認証
|
||||
config=コンフィギュレーション
|
||||
notices=システム通知
|
||||
monitor=モニタリング
|
||||
prev=前へ
|
||||
next=次へ
|
||||
|
||||
dashboard.statistic=統計
|
||||
dashboard.operations=操作
|
||||
dashboard.system_status=システム モニターのステータス
|
||||
dashboard.statistic_info=Gogs データベースは <b>%d</b> ユーザ, <b>%d</b> 組織, <b>%d</b> 公開鍵, <b>%d</b> リポジトリ, <b>%d</b> ウォッチ, <b>%d</b> スター, <b>%d</b> 行動, <b>%d</b> アクセス, <b>%d</b> 問題, <b>%d</b> コメント, <b>%d</b> ソーシャルアカウント, <b>%d</b> フォロー, <b>%d</b> ミラー, <b>%d</b> リリース, <b>%d</b> ログイン元, <b>%d</b> webhook, <b>%d</b> マイルストーン, <b>%d</b> ラベル, <b>%d</b> フックタスク, <b>%d</b> チーム, <b>%d</b> アップデートタスク, <b>%d</b> 添付ファイル の情報を持っています。
|
||||
dashboard.operation_name=操作の名前
|
||||
dashboard.operation_switch=スイッチ
|
||||
dashboard.operation_run=実行
|
||||
dashboard.clean_unbind_oauth=結び付けられていない OAuth をクリーン
|
||||
dashboard.clean_unbind_oauth_success=結び付けられていない全ての OAuth を正常に削除しました。
|
||||
dashboard.delete_inactivate_accounts=非アクティブのアカウントをすべて削除
|
||||
dashboard.delete_inactivate_accounts_success=すべての非アクティブアカウントは正常に削除されました。
|
||||
dashboard.delete_repo_archives=リポジトリのすべてのアーカイブを削除
|
||||
dashboard.delete_repo_archives_success=リポジトリのすべてのアーカイブが正常に削除されました。
|
||||
dashboard.git_gc_repos=リポジトリでのガベージコレクションを実行します。
|
||||
dashboard.git_gc_repos_success=すべてのリポジトリは正常にガベージ コレクションを行いました。
|
||||
dashboard.resync_all_sshkeys='.ssh/ authorized_keys' ファイルを再生成します。(警告:Gogsキー以外は失われます)
|
||||
dashboard.resync_all_sshkeys_success=すべての公開鍵が正常に書き換えられました。
|
||||
dashboard.resync_all_update_hooks=リポジトリの update フックをすべて再更新する(カスタムの設定パスが変更されたときに必要)
|
||||
dashboard.resync_all_update_hooks_success=リポジトリの update フックがすべて正常に再更新されました。
|
||||
|
||||
dashboard.server_uptime=サーバーの稼働時間
|
||||
dashboard.current_goroutine=現在のGoroutine
|
||||
dashboard.current_memory_usage=現在のメモリ使用量
|
||||
dashboard.total_memory_allocated=割り当てられたメモリの合計
|
||||
dashboard.memory_obtained=配分されたメモリ量
|
||||
dashboard.pointer_lookup_times=ポインタ参照回数
|
||||
dashboard.memory_allocate_times=メモリ割当回数
|
||||
dashboard.memory_free_times=メモリ解放回数
|
||||
dashboard.current_heap_usage=現在のヒープ使用量
|
||||
dashboard.heap_memory_obtained=配分されたヒープ メモリ量
|
||||
dashboard.heap_memory_idle=アイドルのヒープ メモリ量
|
||||
dashboard.heap_memory_in_use=使用中のヒープ メモリ
|
||||
dashboard.heap_memory_released=ヒープ メモリが解放されました
|
||||
dashboard.heap_objects=ヒープ オブジェクト
|
||||
dashboard.bootstrap_stack_usage=ブートストラップスタック使用量
|
||||
dashboard.stack_memory_obtained=配分されたスタック メモリ量
|
||||
dashboard.mspan_structures_usage=MSpan 構造体の使用量
|
||||
dashboard.mspan_structures_obtained=配分されたMSpan 構造体
|
||||
dashboard.mcache_structures_usage=MCache 構造体の使用量
|
||||
dashboard.mcache_structures_obtained=分配されたMCache 構造体
|
||||
dashboard.profiling_bucket_hash_table_obtained=ハッシュテーブル分析に割り当てられたメモリ
|
||||
dashboard.gc_metadata_obtained=GCメタデータ取得
|
||||
dashboard.other_system_allocation_obtained=他のシステムに割り当てられたメモリ
|
||||
dashboard.next_gc_recycle=次回のGCリサイクル
|
||||
dashboard.last_gc_time=前回GCからの時間
|
||||
dashboard.total_gc_time=GC一時停止の合計
|
||||
dashboard.total_gc_pause=GC一時停止の合計
|
||||
dashboard.last_gc_pause=直近のGC一時停止
|
||||
dashboard.gc_times=GC実行回数
|
||||
|
||||
users.user_manage_panel=ユーザー管理パネル
|
||||
users.new_account=新規アカウントを作成
|
||||
users.name=名前
|
||||
users.activated=アクティブ化
|
||||
users.admin=アドミン
|
||||
users.repos=リポジトリ
|
||||
users.created=作成されました
|
||||
users.edit=編集
|
||||
users.auth_source=認証元
|
||||
users.local=ローカル
|
||||
users.auth_login_name=認証ログイン名
|
||||
users.update_profile_success=アカウントのプロファイルが更新されました。
|
||||
users.edit_account=アカウントの編集
|
||||
users.is_activated=アカウントがアクティブされました
|
||||
users.is_admin=このアカウントには管理者の権限を持つ
|
||||
users.allow_git_hook=このアカウントには Git のフックを作成する権限を持つ
|
||||
users.update_profile=アカウント ・ プロファイルを更新
|
||||
users.delete_account=このアカウントを削除
|
||||
users.still_own_repo=アカウント所有のリポジトリがあり、リポジトリの削除または所有者の移譲が必要です。
|
||||
users.still_has_org=アカウントはまだ組織のメンバーであり、組織から退出するか削除する必要があります。
|
||||
|
||||
orgs.org_manage_panel=組織の管理パネル
|
||||
orgs.name=名前
|
||||
orgs.teams=チーム
|
||||
orgs.members=メンバー
|
||||
|
||||
repos.repo_manage_panel=リポジトリの管理パネル
|
||||
repos.owner=オーナー
|
||||
repos.name=名前
|
||||
repos.private=プライベート
|
||||
repos.watches=Watches
|
||||
repos.stars=Stars
|
||||
repos.issues=課題
|
||||
|
||||
auths.auth_manage_panel=承認の管理パネル
|
||||
auths.new=新しい認証元を追加
|
||||
auths.name=名前
|
||||
auths.type=タイプ
|
||||
auths.enabled=Enabled
|
||||
auths.updated=Updated
|
||||
auths.auth_type=認証の種類
|
||||
auths.auth_name=認証名
|
||||
auths.domain=ドメイン
|
||||
auths.host=ホスト
|
||||
auths.port=ポート
|
||||
auths.base_dn=ベースのドメイン名
|
||||
auths.attribute_username=ユーザー名属性
|
||||
auths.attribute_name=名前属性
|
||||
auths.attribute_surname=名字属性
|
||||
auths.attribute_mail=Eメール属性
|
||||
auths.filter=検索フィルター
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=SMTP 認証の種類
|
||||
auths.smtphost=SMTP ホスト
|
||||
auths.smtpport=SMTP ポート
|
||||
auths.enable_tls=TLS 暗号化を有効にする
|
||||
auths.pam_service_name=PAMサービス名
|
||||
auths.enable_auto_register=自動登録を有効にする
|
||||
auths.tips=ヒント
|
||||
auths.edit=認証設定を編集
|
||||
auths.activated=認証がアクティブされました
|
||||
auths.update_success=認証の設定が正常に更新されました。
|
||||
auths.update=認証設定の更新
|
||||
auths.delete=この権限を削除
|
||||
auths.delete_auth_title=認証の削除
|
||||
auths.delete_auth_desc=認証を削除します、継続しますか?
|
||||
|
||||
config.server_config=サーバーの構成
|
||||
config.app_name=アプリケーション名
|
||||
config.app_ver=アプリケーションのバージョン
|
||||
config.app_url=アプリケーションの URL
|
||||
config.domain=ドメイン
|
||||
config.offline_mode=オフラインモード
|
||||
config.disable_router_log=ルーターのログを無効にする
|
||||
config.run_user=実行ユーザ
|
||||
config.run_mode=実行モード
|
||||
config.repo_root_path=リポジトリのルートパス
|
||||
config.static_file_root_path=静的ファイルのルートパス
|
||||
config.log_file_root_path=ログ ファイルのルート パス
|
||||
config.script_type=スクリプトの種類
|
||||
config.reverse_auth_user=リバース認証ユーザ
|
||||
config.db_config=データベースの構成
|
||||
config.db_type=タイプ
|
||||
config.db_host=ホスト
|
||||
config.db_name=名前
|
||||
config.db_user=ユーザ
|
||||
config.db_ssl_mode=SSL モード
|
||||
config.db_ssl_mode_helper=(「postgres」のみ)
|
||||
config.db_path=パス
|
||||
config.db_path_helper=(「sqlite3」のみ)
|
||||
config.service_config=サービスの構成
|
||||
config.register_email_confirm=電子メールの確認を必要
|
||||
config.disable_register=登録を無効にする
|
||||
config.show_registration_button=登録ボタンを表示します。
|
||||
config.require_sign_in_view=サインインを要求
|
||||
config.mail_notify=メール通知
|
||||
config.enable_cache_avatar=アバターのキャッシュを有効にします。
|
||||
config.active_code_lives=コードリンクの有効期限をアクティブ
|
||||
config.reset_password_code_lives=パスワードリンクの有効期限をリセット
|
||||
config.webhook_config=Webhook設定
|
||||
config.task_interval=タスクの間隔
|
||||
config.deliver_timeout=送信タイムアウト
|
||||
config.skip_tls_verify=TLSの確認を省略
|
||||
config.mailer_config=メーラーの構成
|
||||
config.mailer_enabled=有効にした
|
||||
config.mailer_disable_helo=HELOコマンド無効
|
||||
config.mailer_name=名前
|
||||
config.mailer_host=ホスト
|
||||
config.mailer_user=ユーザ
|
||||
config.oauth_config=OAuth 構成
|
||||
config.oauth_enabled=Enabled
|
||||
config.cache_config=キャッシュの構成
|
||||
config.cache_adapter=キャッシュ アダプター
|
||||
config.cache_interval=キャッシュ間隔
|
||||
config.cache_conn=キャッシュ接続
|
||||
config.session_config=セッションの構成
|
||||
config.session_provider=セッション プロバイダー
|
||||
config.provider_config=プロバイダーの構成
|
||||
config.cookie_name=クッキー名
|
||||
config.enable_set_cookie=クッキーの設定を有効にする
|
||||
config.gc_interval_time=GC 間隔
|
||||
config.session_life_time=セッションのライフタイム
|
||||
config.https_only=HTTPS のみ
|
||||
config.cookie_life_time=クッキーのライフタイム
|
||||
config.picture_config=画像構成
|
||||
config.picture_service=画像サービス
|
||||
config.disable_gravatar=グラバターを無効にする
|
||||
config.log_config=ログの構成
|
||||
config.log_mode=ログ モード
|
||||
|
||||
monitor.cron=Cron タスク
|
||||
monitor.name=名前
|
||||
monitor.schedule=スケジュール
|
||||
monitor.next=次回
|
||||
monitor.previous=前回
|
||||
monitor.execute_times=実行回数
|
||||
monitor.process=実行中のプロセス
|
||||
monitor.desc=説明
|
||||
monitor.start=開始日時
|
||||
monitor.execute_time=実行時間:
|
||||
|
||||
notices.system_notice_list=システム通知
|
||||
notices.type=タイプ
|
||||
notices.type_1=リポジトリ
|
||||
notices.desc=説明
|
||||
notices.op=Op。
|
||||
notices.delete_success=システム通知が正常に削除されました。
|
||||
|
||||
[action]
|
||||
create_repo=リポジトリ <a href="%s"> %s</a>を作成しました
|
||||
commit_repo=<a href="%[1]s">%[3]s</a>を<a href="%[1]s/src/%[2]s">%[2]s</a>にプッシュしました
|
||||
create_issue=`問題 <a href="%s/issues/%s">%s#%[2]s</a> を開きました`
|
||||
comment_issue=`問題 <a href="%s/issues/%s">%s#%[2]s</a> のコメント`
|
||||
transfer_repo=リポジトリ <code>%s</code> を <a href="%s">%s</a> へ転送しました
|
||||
push_tag=<a href="%[1]s">%[3]s</a> に タグ <a href="%[1]s/src/%[2]s">%[2]s</a> をプッシュしました
|
||||
compare_2_commits=これら 2 のコミットの比較を閲覧する
|
||||
|
||||
[tool]
|
||||
ago=前
|
||||
from_now=今から
|
||||
now=今
|
||||
1s=1 秒 %s
|
||||
1m=1 分 %s
|
||||
1h=1 時間 %s
|
||||
1d=1 日 %s
|
||||
1w=1 週間 %s
|
||||
1mon=1 ヶ月 %s
|
||||
1y=1 年間 %s
|
||||
seconds=%d 秒 %s
|
||||
minutes=%d 分の %s
|
||||
hours=%d 時間 %s
|
||||
days=%d 日 %s
|
||||
weeks=%d 週間 %s
|
||||
months=%d ヶ月 %s
|
||||
years=%d 年 %s
|
||||
raw_seconds=秒
|
||||
raw_minutes=分
|
||||
|
||||
798
conf/locale/locale_lv-LV.ini
Executable file
798
conf/locale/locale_lv-LV.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Viegli uzstādāms Git serviss, kas rakstīts valodā Go
|
||||
|
||||
home=Sākums
|
||||
dashboard=Infopanelis
|
||||
explore=Izpētīt
|
||||
help=Palīdzība
|
||||
sign_in=Pierakstīties
|
||||
social_sign_in=Sociālā pieteikšanās: 2. solis <small>piesaistīt kontu</small>
|
||||
sign_out=Izrakstīties
|
||||
sign_up=Pieteikties
|
||||
register=Reģistrēties
|
||||
website=Mājas lapa
|
||||
version=Versija
|
||||
page=Lapa
|
||||
template=Sagatave
|
||||
language=Valoda
|
||||
|
||||
username=Lietotājvārds
|
||||
email=E-pasts
|
||||
password=Parole
|
||||
re_type=Parole atkārtoti
|
||||
captcha=Pārbaudes kods
|
||||
|
||||
repository=Repozitorijs
|
||||
organization=Organizācija
|
||||
mirror=Spogulis
|
||||
new_repo=Jauns repozitorijs
|
||||
new_migrate=Jauna migrācija
|
||||
new_fork=Jauns atdalītais repozitorijs
|
||||
new_org=Jauna organizācija
|
||||
manage_org=Pārvaldīt organizācijas
|
||||
admin_panel=Admin panelis
|
||||
account_settings=Konta iestatījumi
|
||||
settings=Iestatījumi
|
||||
|
||||
news_feed=Jaunumu plūsma
|
||||
pull_requests=Izmaiņu pieprasījumi
|
||||
issues=Problēmas
|
||||
|
||||
cancel=Atcelt
|
||||
|
||||
[search]
|
||||
search=Search...
|
||||
repository=Repository
|
||||
user=User
|
||||
issue=Issue
|
||||
code=Code
|
||||
|
||||
[install]
|
||||
install=Instalācija
|
||||
title=Instalācijas soļi pirmo reizi palaižot
|
||||
requite_db_desc=Gogs ir nepieciešama MySQL, PostgreSQL vai SQLite3 datu bāze.
|
||||
db_title=Database Settings
|
||||
db_type=Datu bāzes veids
|
||||
host=Resursdators
|
||||
user=Lietotājs
|
||||
password=Parole
|
||||
db_name=Datu bāzes nosaukums
|
||||
db_helper=Nepieciešams izmantot MySQL INNODB dzini ar rakstzīmju kopu utf8_general_ci.
|
||||
ssl_mode=SSL režīms
|
||||
path=Ceļš
|
||||
sqlite_helper=SQLite 3 datu bāzes faila atrašanās vieta.
|
||||
err_empty_sqlite_path=SQLite3 database path cannot be empty.
|
||||
|
||||
general_title=Gogs vispārīgie iestatījumi
|
||||
app_name=Application Name
|
||||
app_name_helper=Put your organization name here huge and loud!
|
||||
repo_path=Repozitoriju glabāšanas vieta
|
||||
repo_path_helper=Visi Git attālinātie repozitoriji tiks glabāti šajā direktorijā.
|
||||
run_user=Izpildes lietotājs
|
||||
run_user_helper=Lietotājam ir jābūt rakstīšanas tiesībām repozitorija saknes direktorijai un Gogs jābūt palaistam zem šī lietotāja.
|
||||
domain=Domēns
|
||||
domain_helper=Tas ietekmē SSH klonēšanas URL.
|
||||
http_port=HTTP ports
|
||||
http_port_helper=Porta numurs pēc kura lietojumprogrammai būs iespējams pieslēgties.
|
||||
app_url=Lietotnes URL
|
||||
app_url_helper=Tas ietekmē HTTP/HTTPS klonēšanas URL un e-pasta saturā izsūtītās saites.
|
||||
|
||||
optional_title=Optional Settings
|
||||
email_title=E-pasta pakalpojuma iestatījumi
|
||||
smtp_host=SMTP resursdators
|
||||
smtp_from=From
|
||||
smtp_from_helper=Mail from address, RFC 5322. It can be just an email address, or the "Name" <email@example.com> format.
|
||||
mailer_user=Sūtītāja e-pasta adrese
|
||||
mailer_password=Sūtītāja parole
|
||||
register_confirm=Iespējot reģistrēšanās apstiprināšanu
|
||||
mail_notify=Iespējot e-pasta paziņojumus
|
||||
server_service_title=Server and Other Services Settings
|
||||
offline_mode=Enable Offline Mode
|
||||
offline_mode_popup=Disable CDN even in production mode, all resource files will be served locally.
|
||||
disable_registration=Disable Self-registration
|
||||
disable_registration_popup=Disable user self-registration, only admin can create accounts.
|
||||
require_sign_in_view=Enable Require Sign In to View Pages
|
||||
require_sign_in_view_popup=Only signed in users can view pages, visitors will only be able to see sign in/up pages.
|
||||
admin_setting_desc=You do not have to create an admin account right now, user whoever ID=1 will gain admin access automatically.
|
||||
admin_title=Admin konta iestatījumi
|
||||
admin_name=Lietotājvārds
|
||||
admin_password=Parole
|
||||
confirm_password=Apstipriniet paroli
|
||||
admin_email=E-pasts
|
||||
install_gogs=Instalēt Gogs
|
||||
test_git_failed=Kļūda pārbaudot 'git' komandu: %v
|
||||
sqlite3_not_available=Jūsu versija neatbalsta SQLite3, lūdzu lejupielādējiet oficiālo bināro versiju no %s, NEVIS gobuild versiju.
|
||||
invalid_db_setting=Datu bāzes iestatījums nav pareizs: %v
|
||||
invalid_repo_path=Repozitorija atrašanās vieta ir nekorekta: %v
|
||||
run_user_not_match=Izpildes lietotājs nav pašreizējais lietotājs: %s -> %s
|
||||
save_config_failed=Neizdevās saglabāt konfigurāciju: %v
|
||||
invalid_admin_setting=Nekorekts admin konta iestatījums: %v
|
||||
install_success=Laipni lūdzam! Mēs priecājamies, ka Jūs izvēlaties Gogs, patīkamu lietošanu!
|
||||
|
||||
[home]
|
||||
uname_holder=Lietotājvārds vai e-pasts
|
||||
password_holder=Parole
|
||||
switch_dashboard_context=Mainīt infopaneļa kontekstu
|
||||
my_repos=Mani repozitoriji
|
||||
collaborative_repos=Sadarbības repozitoriji
|
||||
my_orgs=Manas organizācijas
|
||||
my_mirrors=Mani spoguļi
|
||||
|
||||
[explore]
|
||||
repos=Repozitoriji
|
||||
|
||||
[auth]
|
||||
create_new_account=Izveidot jaunu kontu
|
||||
register_hepler_msg=Jau ir konts? Pieraksties tagad!
|
||||
social_register_hepler_msg=Jau ir konts? Sasaisti tagad!
|
||||
disable_register_prompt=Atvainojiet, reģistrācija ir atspējota. Lūdzu, sazinieties ar vietnes administratoru.
|
||||
disable_register_mail=Atvainojiet, reģistrācijas e-pasta apstiprināšana ir atspējota.
|
||||
remember_me=Atcerēties mani
|
||||
forgot_password=Aizmirsu paroli
|
||||
forget_password=Aizmirsi paroli?
|
||||
sign_up_now=Nepieciešams konts? Reģistrējies tagad.
|
||||
confirmation_mail_sent_prompt=Jauns apstiprināšanas e-pasts ir nosūtīts uz <b>%s</b>, lūdzu, pārbaudies savu e-pasta kontu tuvāko %d stundu laikā, lai pabeigtu reģistrācijas procesu.
|
||||
sign_in_email=Atvērt savu e-pasta kontu
|
||||
active_your_account=Aktivizēt savu kontu
|
||||
resent_limit_prompt=Atvainojiet, Jūs sūtījāt aktivizācijas e-pastu pārāk bieži. Lūdzu, gaidiet 3 minūtes.
|
||||
has_unconfirmed_mail=Sveiki %s, Jums ir neapstiprināta e-pasta adrese (<b>%s</b>). Ja neesat saņēmis apstiprināšanas e-pastu vai Jums ir nepieciešams nosūtīt jaunu, lūdzu, nospiediet pogu, kas atrodas zemāk.
|
||||
resend_mail=Nospiediet šeit, lai vēlreiz nosūtītu aktivizācijas e-pastu
|
||||
email_not_associate=Šī e-pasta adrese nav saistīta ar Jūsu kontu.
|
||||
send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu
|
||||
reset_password=Atjaunot savu paroli
|
||||
invalid_code=Atvainojiet, Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs.
|
||||
reset_password_helper=Nospiediet šeit, lai atjaunotu paroli
|
||||
password_too_short=Paroles garums nedrīkst būt mazāks par 6.
|
||||
|
||||
[modal]
|
||||
yes=Yes
|
||||
no=No
|
||||
modify=Modify
|
||||
|
||||
[form]
|
||||
UserName=Lietotājvārds
|
||||
RepoName=Repozitorija nosaukums
|
||||
Email=E-pasta adrese
|
||||
Password=Parole
|
||||
Retype=Parole atkārtoti
|
||||
SSHTitle=SSH atslēgas nosaukums
|
||||
HttpsUrl=HTTPS URL
|
||||
PayloadUrl=Vērtuma URL
|
||||
TeamName=Komandas nosaukums
|
||||
AuthName=Autorizācijas nosaukums
|
||||
AdminEmail=Admin e-pasta adrese
|
||||
|
||||
require_error=` nedrīkst būt tukšs.`
|
||||
alpha_dash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus vai domuzīmes (-_).`
|
||||
alpha_dash_dot_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus, domuzīmes (-_) vai punktu.`
|
||||
size_error=` must be size %s.`
|
||||
min_size_error=` jabūt vismaz %s simbolu garumā.`
|
||||
max_size_error=` jabūt ne mazāk kā %s simbolu garumā.`
|
||||
email_error=` nav derīga e-pasta adrese.`
|
||||
url_error=` nav korekts URL.`
|
||||
unknown_error=Nezināma kļūda:
|
||||
captcha_incorrect=Pārbaudes kods nesakrīt ar attēlā redzamo.
|
||||
password_not_match=Parole un atkārtoti ievadītā parole nav vienādas.
|
||||
|
||||
username_been_taken=Lietotājvārds ir jau aizņemts.
|
||||
repo_name_been_taken=Repozitorija vārds ir jau aizņemts.
|
||||
org_name_been_taken=Organizācijas nosaukums ir jau aizņemts.
|
||||
team_name_been_taken=Komandas nosaukums ir jau aizņemts.
|
||||
email_been_used=E-pasta adrese jau tiek izmantota.
|
||||
ssh_key_been_used=Publiskās atslēgas nosaukums jau tiek izmantos.
|
||||
illegal_team_name=Grupas nosaukums satur neatļautas rakstzīmes.
|
||||
username_password_incorrect=Lietotājvārds vai parole nav pareiza.
|
||||
enterred_invalid_repo_name=Lūdzu, pārliecinieties, vai ievadītā repozitorija nosaukums ir pareizs.
|
||||
enterred_invalid_owner_name=Lūdzu, pārliecinieties, vai ievadītā īpašnieka vārds ir pareizs.
|
||||
enterred_invalid_password=Lūdzu pārliecinieties, vai Jūsu ievadītā parole ir pareiza.
|
||||
user_not_exist=Šāds lietotājs neeksistē.
|
||||
last_org_owner=Nav iespējams noņemt vienīgo komandas īpašnieku. Pirms tam ir nepieciešams norādīt jauno īpašnieku.
|
||||
|
||||
invalid_ssh_key=Atvainojiet, nav iespējams pārbaudīt Jūsu SSH atslēgu: %s
|
||||
unable_verify_ssh_key=Nav iespējams pārbaudīt jūsu SSH atslēgu, bet tiks pieņemts, ka tā ir derīga, lūdzu, pārliecinieties par to pats.
|
||||
auth_failed=Autentifikācija neizdevās: %v
|
||||
|
||||
still_own_repo=Jūsu esat vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku.
|
||||
still_has_org=Jūsu esat vismaz vienas organizācijas biedrs, sākumā nepieciešams pamest vai izdzēst šo organizāciju.
|
||||
org_still_own_repo=Šī organizācija ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku.
|
||||
|
||||
still_own_user=Šo autentifikāciju joprojām izmanto vismaz viens lietotājs, nepieciešams šiem lietotājiem nomainīt autentifikācijas veidu vai tos izdzēst.
|
||||
|
||||
target_branch_not_exist=Mērķa atzars neeksistē
|
||||
|
||||
[user]
|
||||
change_avatar=Mainīt savu profila attēlu vietnē gravatar.com
|
||||
change_custom_avatar=Mainīt savu profila attēlu iestatījumos
|
||||
join_on=Pievienojās
|
||||
repositories=Repozitoriji
|
||||
activity=Publiskā aktivitāte
|
||||
followers=Sekotāji
|
||||
starred=Atzīmēti ar zvaigznīti
|
||||
following=Seko
|
||||
|
||||
form.name_reserved=Username '%s' is reserved.
|
||||
form.name_pattern_not_allowed=Username pattern '%s' is not allowed.
|
||||
|
||||
[settings]
|
||||
profile=Profils
|
||||
password=Parole
|
||||
ssh_keys=SSH atslēgas
|
||||
social=Sociālie konti
|
||||
applications=Lietotnes
|
||||
orgs=Organizācijas
|
||||
delete=Dzēst kontu
|
||||
uid=Lietotāja ID
|
||||
|
||||
public_profile=Publiskais profils
|
||||
profile_desc=Jūsu e-pasta adrese ir publiska un tiks izmantota, lai nosūtītju Jums paziņojumus, kas saistīti ar Jūsu kontu vai darbībām veiktām caur šo mājas lapu.
|
||||
full_name=Pilns vārds
|
||||
website=Mājas lapa
|
||||
location=Atrašanās vieta
|
||||
update_profile=Mainīt profilu
|
||||
update_profile_success=Jūsu profila dati ir veiksmīgi saglabāti.
|
||||
change_username=Lietotāja vārds mainīts
|
||||
change_username_desc=Lietotājvārds tiks mainīts, vai vēlaties turpināt? Tas ietekmēs visas saites, kas attiecas uz Jūsu kontu.
|
||||
continue=Turpināt
|
||||
cancel=Atcelt
|
||||
|
||||
enable_custom_avatar=Iespējot maināmu profila attēlu
|
||||
enable_custom_avatar_helper=Iespējojiet šo, lai atslēgtu profilu attēlu ņemšanu no gravatar.com
|
||||
choose_new_avatar=Izvēlēties jaunu profila attēlu
|
||||
update_avatar=Saglabāt profila bildi
|
||||
uploaded_avatar_not_a_image=Augšupielādētais fails nav attēls.
|
||||
no_custom_avatar_available=Nav iespējams mainīt profila bildi.
|
||||
update_avatar_success=Jūsu profila bilde tika veiksmīgi saglabāta.
|
||||
|
||||
change_password=Mainīt paroli
|
||||
old_password=Pašreizējā parole
|
||||
new_password=Jauna parole
|
||||
password_incorrect=Ievadīta nepareiza pašreizējā parole.
|
||||
change_password_success=Parole tika veiksmīgi nomainīta. Tagad jūs varat pieraksītites, izmantojot jauno paroli.
|
||||
|
||||
emails=E-pasta adreses
|
||||
manage_emails=Pārvaldīt e-pasta adreses
|
||||
email_desc=Primārā e-pasta adrese tiks izmantota sūtot notifikācijas un citām dabībām.
|
||||
primary=Primārā
|
||||
primary_email=Iestatīt kā primāro
|
||||
delete_email=Dzēst
|
||||
add_new_email=Pievienot jaunu e-pasta adresi
|
||||
add_email=Pievienot e-pastu
|
||||
add_email_confirmation_sent=A new confirmation e-mail has been sent to <b>%s</b>, please check your inbox within the next %d hours to complete the confirmation process.
|
||||
add_email_success=Jūsu jaunā e-pasta adrese tika veiksmīgi pievienota.
|
||||
|
||||
manage_ssh_keys=Pārvaldīt SSH atslēgas
|
||||
add_key=Pievienot atslēgu
|
||||
ssh_desc=Šis ir saraksts ar Jūsu kontam piesaistītajām SSH atslēgām. Dzēsiet visas, kuras Jūs neatpazīstat.
|
||||
ssh_helper=<strong>Vajadzīga palīdzība?</strong> Apskatieties pamācību kā <a href="%s">ģenerēt SSH atslēgas</a> vai kā novērst <a href="%s">biežāk sastopamās SSH problēmas</a>.
|
||||
add_new_key=Pievienot SSH atslēgu
|
||||
key_name=Atslēgas nosaukums
|
||||
key_content=Saturs
|
||||
add_key_success=Pievienota jauna SSH atslēga!
|
||||
delete_key=Dzēst
|
||||
add_on=Pievienota
|
||||
last_used=Pēdējo reizi izmantota
|
||||
no_activity=Nav nesenas aktivitātes
|
||||
|
||||
manage_social=Pārvaldīt piesaistītos sociālos kontus
|
||||
social_desc=Šeit tiek attēloti visi sociālie konti, kas ir piesaistīti Jūsu kontam. Dzēsiet visus, kurus Jūs neatpazīstat.
|
||||
unbind=Atsaistīt
|
||||
unbind_success=Sociālais konts tika atsaistīts.
|
||||
|
||||
manage_access_token=Pārvaldīt personīgos piekļuves talonus
|
||||
generate_new_token=Ģenerēt jaunu talonu
|
||||
tokens_desc=Talons tika uzģēnerēts, tagad varat to izmantot, lai piekļūtu Gogs API.
|
||||
new_token_desc=Pašlaik visiem taloniem ir pilna piekļuve Jūsu kontam.
|
||||
token_name=Talona nosaukums
|
||||
generate_token=Ģenerēt talonu
|
||||
generate_token_succees=Jauns piekļuves talons tika veiksmīgi uzģenerēts! Pārliecinieties, ka esat to nokopējis, jo to Jums vairāk nebūs iespēja izdarīt!
|
||||
delete_token=Dzēst
|
||||
delete_token_success=Jūsu personīgās piekļuves talons tika veiksmīgi izdzēsts! Neazimistiet veikt nepieciešamos labojumus savās lietojumprogrammās, kas to izmantoja.
|
||||
|
||||
delete_account=Dzēst savu kontu
|
||||
delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir <strong>NEATGRIEZENISKA</strong>!
|
||||
confirm_delete_account=Apstiprināt dzēšanu
|
||||
delete_account_title=Konta dzēšana
|
||||
delete_account_desc=Šis konts tiks neatgriezeniski dzēsts, vai vēlaties turpināt?
|
||||
|
||||
[repo]
|
||||
owner=Īpašnieks
|
||||
repo_name=Repozitorija nosaukums
|
||||
repo_name_helper=Labi repzotoriju nosaukumi ir īsi, tādi kurus viegli atcerēties un <strong>unikāli</strong>.
|
||||
visibility=Redzamība
|
||||
visiblity_helper=Šis repozitorijs ir <span class="label label-red label-radius">Privāts</span>
|
||||
fork_repo=Atdalīt repozitoriju
|
||||
fork_from=Atdalīt no
|
||||
fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību
|
||||
repo_desc=Apraksts
|
||||
repo_lang=Valoda
|
||||
repo_lang_helper=Izvēlieties .gitignore failu
|
||||
license=Licence
|
||||
license_helper=Izvēlieties licences failu
|
||||
init_readme=Inicializēt šo repozitoriju ar README.md failu
|
||||
create_repo=Izveidot repozitoriju
|
||||
default_branch=Noklusējuma atzars
|
||||
mirror_interval=Spoguļošanas intervāls (stundās)
|
||||
|
||||
form.name_reserved=Repository name '%s' is reserved.
|
||||
form.name_pattern_not_allowed=Repository name pattern '%s' is not allowed.
|
||||
|
||||
need_auth=Nepieciešama autorizācija
|
||||
migrate_type=Migrācijas veids
|
||||
migrate_type_helper=Šis repozitorijs būs <span class="label label-blue label-radius">Spoguļots</span>
|
||||
migrate_repo=Migrēt repozitoriju
|
||||
migrate.clone_address=Clone Address
|
||||
migrate.invalid_local_path=Invalid local path, it does not exist or not a directory.
|
||||
|
||||
forked_from=forked from
|
||||
fork_from_self=You cannot fork repository you already owned!
|
||||
copy_link=Kopēt
|
||||
click_to_copy=Kopēt uz starpliktuvi
|
||||
copied=Kopēšana notikusi veiksmīgi
|
||||
clone_helper=Nepieciešama palīdzība kā veikt klonēšana? Apmeklējiet <a target="_blank" href="%s">Palīdzība</a> lapu!
|
||||
unwatch=Nevērot
|
||||
watch=Vērot
|
||||
unstar=Noņemt zvaigznīti
|
||||
star=Pievienot zvaigznīti
|
||||
fork=Atdalīts
|
||||
|
||||
no_desc=Nav apraksta
|
||||
quick_guide=Īsa pamācība
|
||||
clone_this_repo=Klonēt šo repozitoriju
|
||||
create_new_repo_command=Izveidot jaunu repozitoriju komandrindā
|
||||
push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam
|
||||
|
||||
branch=Atzars
|
||||
tree=Koks
|
||||
branch_and_tags=Atzari un tagi
|
||||
branches=Atzari
|
||||
tags=Tagi
|
||||
issues=Problēmas
|
||||
labels=Labels
|
||||
milestones=Milestones
|
||||
commits=Revīzijas
|
||||
releases=Laidieni
|
||||
file_raw=Neapstrādāts
|
||||
file_history=Vēsture
|
||||
file_view_raw=Rādīt neapstrādātu
|
||||
file_permalink=Permalink
|
||||
|
||||
commits.commits=Revīzijas
|
||||
commits.search=Meklēt revīzijas
|
||||
commits.find=Meklēt
|
||||
commits.author=Autors
|
||||
commits.message=Ziņojums
|
||||
commits.date=Datums
|
||||
commits.older=Vecāki
|
||||
commits.newer=Jaunāki
|
||||
|
||||
issues.new=New Issue
|
||||
issues.new_label=New Label
|
||||
issues.new_label_placeholder=Label name...
|
||||
issues.open_tab=%d Open
|
||||
issues.close_tab=%d Closed
|
||||
issues.filter_label=Label
|
||||
issues.filter_label_no_select=No selected label
|
||||
issues.filter_milestone=Milestone
|
||||
issues.filter_assignee=Assignee
|
||||
issues.filter_type=Type
|
||||
issues.filter_type.all_issues=All issues
|
||||
issues.filter_type.assigned_to_you=Assigned to you
|
||||
issues.filter_type.created_by_you=Created by you
|
||||
issues.filter_type.mentioning_you=Mentioning you
|
||||
issues.opened_by=opened %[1]s by <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Previous Page
|
||||
issues.next=Next Page
|
||||
issues.label_title=Label name
|
||||
issues.label_color=Label color
|
||||
issues.label_count=%d labels
|
||||
issues.label_open_issues=%d open issues
|
||||
issues.label_edit=Edit
|
||||
issues.label_delete=Delete
|
||||
issues.label_modify=Label Modification
|
||||
issues.label_deletion=Label Deletion
|
||||
issues.label_deletion_desc=Delete label will remove its information in all related issues. Do you want to continue?
|
||||
issues.label_deletion_success=Label has been deleted successfully!
|
||||
|
||||
settings=Iestatījumi
|
||||
settings.options=Opcijas
|
||||
settings.collaboration=Sadarbība
|
||||
settings.hooks=Tīmekļa āķi
|
||||
settings.githooks=Git āķi
|
||||
settings.deploy_keys=Izvietot atslēgas
|
||||
settings.basic_settings=Pamatiestatījumi
|
||||
settings.danger_zone=Bīstamā zona
|
||||
settings.site=Oficiālā mājas lapa
|
||||
settings.update_settings=Mainīt iestatījumus
|
||||
settings.change_reponame=Mainīts repozitorija nosaukums
|
||||
settings.change_reponame_desc=Repozitorija nosaukums tiks mainīts, vai vēlaties turpināt? Tas ietekmēs visas saites, kas saistītas ar šo repozitoriju.
|
||||
settings.transfer=Mainīt īpašnieku
|
||||
settings.transfer_desc=Mainīt šī repozitorija īpašnieku uz citu lietotāju vai organizāciju, kurai Jums ir administratora tiesībs.
|
||||
settings.new_owner_has_same_repo=Jaunajam īpašniekam jau ir repozitorijs ar šādu nosaukumu.
|
||||
settings.delete=Dzēst šo repozitoriju
|
||||
settings.delete_desc=Dzēšot repozitoriju, tā datus vairs nebūs iespējams atgūt. Pirms dzēšanas pārliecinieites vai patiešām vēlaties to darīt.
|
||||
settings.transfer_notices=<p>- Jūs zaudēsiet piekļuvi repozitorijam, ja jaunais īpašnieks ir individuāls lietotājs.</p><p>- Jūs saglabāsiet piekļuvi repzitorijam, ja jaunais īpašneiks ir organizācija un Jūs esat viens no tās īpašniekiem.</p>
|
||||
settings.update_settings_success=Repozitorija opcijas ir veiksmīgi saglabātas.
|
||||
settings.transfer_owner=Jaunais īpašnieks
|
||||
settings.make_transfer=Mainīt
|
||||
settings.transfer_succeed=Repozitorija īpašnieks ir veiksmīgi nomainīts.
|
||||
settings.confirm_delete=Apstiprināt dzēšanu
|
||||
settings.add_collaborator=Pievienot jaunu līdzstrādnieku
|
||||
settings.add_collaborator_success=Jauns līdzstrādnieks ir pievienots.
|
||||
settings.remove_collaborator_success=Līdzstrādnieks tika noņemts.
|
||||
settings.user_is_org_member=Lietotājs ir organizācijas biedrs, kas nevar tikt pievienots kā līdzstrādnieks.
|
||||
settings.add_webhook=Pievienot tīmekļa āķi
|
||||
settings.hooks_desc=Tīmekļa āķi ļauj paziņot ārējiem servisiem par noteiktiem notikomiem, kas notiek Git servisā. Kad iestāsies kāds notikums, katram ārējā servisa URL tiks nosūtīts POST pieprasījums. Lai uzzinātu sīkāk skatieties <a target="_blank" href="%s">Tīmekļa āķu rokasgrāmatā</a>.
|
||||
settings.githooks_desc=Git āķus apstrādā pats Git. Jūs varat labot atbalsīto āku failus sarakstā zemāk, lai veiktu pielāgotas darbības.
|
||||
settings.githook_edit_desc=Ja āķis nav aktīvs, tiks attēlots piemērs kā to izmantot. Atstājot āķa saturu tukšu, tas tiks atspējots.
|
||||
settings.githook_name=Āķa nosaukums
|
||||
settings.githook_content=Āķa saturs
|
||||
settings.update_githook=Labot āķi
|
||||
settings.remove_hook_success=Tīmekļa āķis tika noņemts.
|
||||
settings.add_webhook_desc=Uz norādīto URL tiks nosūtīts <code>POST</code> pieprasījums ar notikuma datiem. Jūs varat norādīt arī datu formātu, kādā datus vēlaties saņemt (JSON, <code>x-www-form-urlencoded</code> <em>utt.</em>). Detalizētāku informāciju ir iespējams uzzināt <a target="_blank" href="%s">Tīmekļa āķu rokasgrāmatā</a>.
|
||||
settings.payload_url=Vērtuma URL
|
||||
settings.content_type=Satura tips
|
||||
settings.secret=Noslēpums
|
||||
settings.event_desc=Kādu notikumu rezultātā tiktu izsaukts tīmekļā āķis?
|
||||
settings.event_push_only=Tikai izmaiņu nosūtīšanas notikumiem.
|
||||
settings.active=Aktīvs
|
||||
settings.active_helper=Tiks nosūtīti notikuma dati, kad nostrādās šis āķis.
|
||||
settings.add_hook_success=Jauns tīmekļa āķis tika veiksmīgi pievienots.
|
||||
settings.update_webhook=Mainīt tīmekļa āķi
|
||||
settings.update_hook_success=Tīmekļa āķist tika veiksmīgi saglabāts.
|
||||
settings.delete_webhook=Dzēst tīmekļa āķi
|
||||
settings.recent_deliveries=Pēdējās piegādes
|
||||
settings.hook_type=Āķa veids
|
||||
settings.add_slack_hook_desc=PIevienot <a href="%s">Slack</a> integrāciju Jūsu repozitorijā.
|
||||
settings.slack_token=Talons
|
||||
settings.slack_domain=Domēns
|
||||
settings.slack_channel=Kanāls
|
||||
|
||||
diff.browse_source=Pārlūkot izejas kodu
|
||||
diff.parent=vecāks
|
||||
diff.commit=revīzija
|
||||
diff.data_not_available=Salīdzināšanas dati nav pieejami.
|
||||
diff.show_diff_stats=Rādīt salīdzināšanas statistiku
|
||||
diff.stats_desc=<strong>%d mainītis faili</strong> ar <strong>%d papildinājumiem</strong> un <strong>%d dzēšanām</strong>
|
||||
diff.bin=BIN
|
||||
diff.view_file=Parādīt failu
|
||||
|
||||
release.releases=Laidieni
|
||||
release.new_release=Jauns laidiens
|
||||
release.draft=Melnraksts
|
||||
release.prerelease=Pirmsizlaides versija
|
||||
release.stable=Stabila
|
||||
release.edit=labot
|
||||
release.ahead=<strong>%d</strong> revīzijas atzarā %s kopš šī laidiena
|
||||
release.source_code=Izejas kods
|
||||
release.tag_name=Taga nosaukums
|
||||
release.target=Mērķis
|
||||
release.tag_helper=Publicējot, izvēlieties esošu vai izveidojiet jaunu tagu.
|
||||
release.release_title=Laidiena virsraksts
|
||||
release.content_with_md=Saturs ar <a href="%s">Markdown</a>
|
||||
release.write=Rakstīt
|
||||
release.preview=Priekšskatītījums
|
||||
release.content_placeholder=Uzrakstiet kādu aprakstu
|
||||
release.loading=Notiek ielāde...
|
||||
release.prerelease_desc=Šī ir pirmslaidiena versija
|
||||
release.prerelease_helper=Tiks norādīts, ka šis laidiens nav gatavs lietošanai produkcijas režīmā.
|
||||
release.publish=Publicēt laidienu
|
||||
release.save_draft=Saglabāt melnrakstu
|
||||
release.edit_release=Labot laidienu
|
||||
release.tag_name_already_exist=Laidiens ar šādu taga nosaukumu jau eksistē.
|
||||
|
||||
[org]
|
||||
org_name_holder=Organizācijas nosaukums
|
||||
org_name_helper=Labi organizāciju nosaukumi ir īsi un tādi, kurus viegli atcerēties.
|
||||
org_email_helper=Uz organizācijas e-pastu tiks sūtītas visas notifikācias un apstiprinājumi.
|
||||
create_org=Izveidot organizāciju
|
||||
repo_updated=Atjaunināts
|
||||
people=Personas
|
||||
invite_someone=Uzaicināt kādu
|
||||
teams=Komandas
|
||||
lower_members=dalībnieki
|
||||
lower_repositories=repozitoriji
|
||||
create_new_team=Izveidot jaunu komandu
|
||||
org_desc=Apraksts
|
||||
team_name=Komandas nosaukums
|
||||
team_desc=Apraksts
|
||||
team_name_helper=Šo nosaukumu varēs izmantot, lai pieminētu komandu sarunās.
|
||||
team_desc_helper=Komandas apraksts
|
||||
team_permission_desc=Kādām tiesībām šai komandai būtu jābūt?
|
||||
|
||||
form.name_reserved=Organization name '%s' is reserved.
|
||||
form.name_pattern_not_allowed=Organization name pattern '%s' is not allowed.
|
||||
|
||||
settings=Iestatījumi
|
||||
settings.options=Opcijas
|
||||
settings.full_name=Pilns vārds, uzvārds
|
||||
settings.website=Mājas lapa
|
||||
settings.location=Atrašanās vieta
|
||||
settings.update_settings=Mainīt iestatījumus
|
||||
settings.change_orgname=Mainīts organizācijas nosaukums
|
||||
settings.change_orgname_desc=Organizācijas nosaukums tiks mainīts, vai vēlaties turpinat? Tas ietekmēs saites, kas attiecas uz šo organizāciju.
|
||||
settings.update_setting_success=Organizācijas iestatījumi tika veiksmīgi saglabāti.
|
||||
settings.delete=Dzēst organizāciju
|
||||
settings.delete_account=Dzēst šo organizāciju
|
||||
settings.delete_prompt=Šī darbība pilnībā dzēsīs šo organizāciju, kā arī tā ir <strong>NEATGRIEZENISKA</strong>!
|
||||
settings.confirm_delete_account=Apstiprināt dzēšanu
|
||||
settings.delete_org_title=Organizācijas dzēšana
|
||||
settings.delete_org_desc=Šī organizācija tiks pilnībā izdzēsta, vai vēlaties turpināt?
|
||||
settings.hooks_desc=Pievienot tīmekļa āķus, kas nostrādās <strong>visiem repozitorijiem</strong> šajā organizācijā.
|
||||
|
||||
members.public=Publisks
|
||||
members.public_helper=padarīt privātu
|
||||
members.private=Privāts
|
||||
members.private_helper=padarīt publisku
|
||||
members.owner=Īpašnieks
|
||||
members.member=Biedri
|
||||
members.conceal=Noslēpt
|
||||
members.remove=Noņemt
|
||||
members.leave=Atstāt
|
||||
members.invite_desc=Sāciet rakstīt lietotājvārdu, lai uzaicinātu jaunu biedru organizācijā %s:
|
||||
members.invite_now=Uzaicināt tagad
|
||||
|
||||
teams.join=Pievienoties
|
||||
teams.leave=Atstāt
|
||||
teams.read_access=Lasīšanas piekļuve
|
||||
teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus.
|
||||
teams.write_access=Rakstīšanas piekļuve
|
||||
teams.write_access_helper=Komanda varēs skatīties un klonēt, kā arī nosūtīt izmaiņas šīs organizācijas repozitorijiem.
|
||||
teams.admin_access=Administratora piekļuve
|
||||
teams.admin_access_helper=Šī komanda varēs veikt push/pull komandas tās repozitorijiem, kā arī tiem pievienot citus līdzstrādniekus.
|
||||
teams.no_desc=Komandai nav apraksta
|
||||
teams.settings=Iestatījumi
|
||||
teams.owners_permission_desc=Īpašniekiem ir pilna piekļuve <strong>visiem repozitorijiem</strong> un ir organizācijas <strong>administratora tiesības</strong>.
|
||||
teams.members=Komandas biedri
|
||||
teams.update_settings=Saglabāt iestatījumus
|
||||
teams.delete_team=Dzēst komandu
|
||||
teams.add_team_member=Pievienot komandas biedru
|
||||
teams.delete_team_title=Komandas dzēšana
|
||||
teams.delete_team_desc=Komanda tiks dzēsta, vai vēlaties turpināt? Komandas biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem.
|
||||
teams.delete_team_success=Komanda tika veiksmīgi izdzēsta.
|
||||
teams.read_permission_desc=Šai komandai ir <strong>lasīšanas</strong> tiesības: dalībnieki var skatīties un klonēt komandas repozitorijus.
|
||||
teams.write_permission_desc=Šai komandai ir <strong>rakstīšanas</strong> tiesības: dalībnieki var lasīt un nosūtīt izmaiņas repozitorijiem.
|
||||
teams.admin_permission_desc=Šai komandai ir <strong>administratora</strong> tiesības: dalībnieki var lasīt, rakstīt un pievienot citus dalībniekus komandas repozitorijiem.
|
||||
teams.repositories=Komandas repozitoriji
|
||||
teams.add_team_repository=Pievienot komandas repozitoriju
|
||||
teams.remove_repo=Noņemt
|
||||
teams.add_nonexistent_repo=Repozitorijs, kuram Jūs mēģinat pievienot neeksistē, sākumā izveidojiet to.
|
||||
|
||||
[admin]
|
||||
dashboard=Infopanelis
|
||||
users=Lietotāji
|
||||
organizations=Organizācijas
|
||||
repositories=Repozitoriji
|
||||
authentication=Autentifikācijas
|
||||
config=Konfigurācija
|
||||
notices=Sistēmas paziņojumi
|
||||
monitor=Uzraudzība
|
||||
prev=Iepr.
|
||||
next=Tālāk
|
||||
|
||||
dashboard.statistic=Statistika
|
||||
dashboard.operations=Darbības
|
||||
dashboard.system_status=Sistēmas uzraudzības statuss
|
||||
dashboard.statistic_info=Gogs datu bāze satur <b>%d</b> lietotājus, <b>%d</b> organizācijas, <b>%d</b> publiskās atslēgas, <b>%d</b> repozitorijus, <b>%d</b> vērošanas, <b>%d</b> atzīmētas zvaigznītes, <b>%d</b> darbības, <b>%d</b> piekļuves, <b>%d</b> problēmas, <b>%d</b> komentārus, <b>%d</b> sociālos kontus, <b>%d</b> sekošanas, <b>%d</b> spoguļošanas, <b>%d</b> izlaides, <b>%d</b> login sources, <b>%d</b> tīmekļa āķus, <b>%d</b> starpposmus, <b>%d</b> etiķetes, <b>%d</b> āķu uzdevumus, <b>%d</b> komandas, <b>%d</b> labotus uzdevumus, <b>%d</b> pielikumus.
|
||||
dashboard.operation_name=Darbības nosaukums
|
||||
dashboard.operation_switch=Pārslēgt
|
||||
dashboard.operation_run=Palaist
|
||||
dashboard.clean_unbind_oauth=Notīrīt nesaistītās OAuth biļetes
|
||||
dashboard.clean_unbind_oauth_success=Visas nesaistītās OAuth biļetes tika veiksmīgi izdzēstas.
|
||||
dashboard.delete_inactivate_accounts=Dzēst visus neaktīvos kontus
|
||||
dashboard.delete_inactivate_accounts_success=Visi neaktīvie kotni tika veiksmīgi izdzēsti.
|
||||
dashboard.delete_repo_archives=Dzēst visu repozitoriju arhīvus
|
||||
dashboard.delete_repo_archives_success=Visu repozitoriju arhīvi tika veiksmīgi izdzēsti.
|
||||
dashboard.git_gc_repos=Veikt repozitoriju datu sakārtošānu (git gc)
|
||||
dashboard.git_gc_repos_success=Datu sakārtošana visiem repozitorijiem veiksmīgi pabeigta.
|
||||
dashboard.resync_all_sshkeys=Pārrakstīt '.ssh/authorized_keys' failu (brīdinājums: ne-Git atslēgas tiks pazaudētas)
|
||||
dashboard.resync_all_sshkeys_success=Visas publiskās atslēgas tika veiksmīgi pārrakstītas.
|
||||
dashboard.resync_all_update_hooks=Pārrakstīt visu repozitoriju izmaiņu āķus (nepieciešams, ja tiek mainīta konfigurācijas faila atrašanās vieta)
|
||||
dashboard.resync_all_update_hooks_success=Visu repozitoriju izmaiņu āķi tika veiksmīgi pārrakstīti.
|
||||
|
||||
dashboard.server_uptime=Servera darbības laiks
|
||||
dashboard.current_goroutine=Izmantotās Gorutīnas
|
||||
dashboard.current_memory_usage=Pašreiz izmantotā atmiņa
|
||||
dashboard.total_memory_allocated=Kopējā piešķirtā atmiņa
|
||||
dashboard.memory_obtained=Iegūtā atmiņa
|
||||
dashboard.pointer_lookup_times=Rādītāju meklēšanas reizes
|
||||
dashboard.memory_allocate_times=Atmiņas piešķiršanas reizes
|
||||
dashboard.memory_free_times=Atmiņas atbrīvošanas reizes
|
||||
dashboard.current_heap_usage=Pašreizējā kaudzes izmantošana
|
||||
dashboard.heap_memory_obtained=Iegūtā kaudzes atmiņa
|
||||
dashboard.heap_memory_idle=Neizmantotā kaudzes atmiņa
|
||||
dashboard.heap_memory_in_use=Izmantotā kaudzes atmiņa
|
||||
dashboard.heap_memory_released=Atbrīvotā kaudzes atmiņa
|
||||
dashboard.heap_objects=Kaudzes atmiņas objekti
|
||||
dashboard.bootstrap_stack_usage=Izmantotais sāknēšanas steka lielums
|
||||
dashboard.stack_memory_obtained=Iegūtā steka atmiņa
|
||||
dashboard.mspan_structures_usage=Izmantotās MSpan struktūras
|
||||
dashboard.mspan_structures_obtained=Iegūtās MSpan struktūras
|
||||
dashboard.mcache_structures_usage=Izmantotās MCache struktūras
|
||||
dashboard.mcache_structures_obtained=Iegūtās MCache struktūras
|
||||
dashboard.profiling_bucket_hash_table_obtained=Iegūtā profilēšanas kausa jaucējtabula
|
||||
dashboard.gc_metadata_obtained=Iegūtie GC metadati
|
||||
dashboard.other_system_allocation_obtained=Iegūtās citas sistēmas sadales
|
||||
dashboard.next_gc_recycle=Nākošā GC atkritne
|
||||
dashboard.last_gc_time=Laiks kopš pēdējās GC
|
||||
dashboard.total_gc_time=Kopējais GC izpildes laiks
|
||||
dashboard.total_gc_pause=Kopējais GC izpildes laiks
|
||||
dashboard.last_gc_pause=Pedējās GC izpildes laiks
|
||||
dashboard.gc_times=GC reizes
|
||||
|
||||
users.user_manage_panel=Lietotāju pārvaldības panelis
|
||||
users.new_account=Izveidot jaunu kontu
|
||||
users.name=Vārds
|
||||
users.activated=Aktivizēts
|
||||
users.admin=Administrators
|
||||
users.repos=Repozitoriji
|
||||
users.created=Izveidots
|
||||
users.edit=Labot
|
||||
users.auth_source=Autorizācijas avots
|
||||
users.local=Iebūvētā
|
||||
users.auth_login_name=Autorizāciju, pietiekšanās vārds
|
||||
users.update_profile_success=Konta profils tika veiksmīgi saglabāts.
|
||||
users.edit_account=Labot kontu
|
||||
users.is_activated=Konts ir aktivizēts
|
||||
users.is_admin=Šim kontam ir administratora piekļuves tiesības
|
||||
users.allow_git_hook=Šim kontam ir tiesības pievienot/labot Git āķus
|
||||
users.update_profile=Mainīt konta profilu
|
||||
users.delete_account=Dzēst šo kontu
|
||||
users.still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku.
|
||||
users.still_has_org=Šis konts ir vismaz vienas organizācijas biedrs, sākumā nepieciešams pamest vai izdzēst šo organizāciju.
|
||||
|
||||
orgs.org_manage_panel=Organizāciju pārvaldības panelis
|
||||
orgs.name=Nosaukums
|
||||
orgs.teams=Komandas
|
||||
orgs.members=Dalībnieki
|
||||
|
||||
repos.repo_manage_panel=Repozitoriju pārvaldības panelis
|
||||
repos.owner=Īpašnieks
|
||||
repos.name=Vārds
|
||||
repos.private=Privāts
|
||||
repos.watches=Vērošana
|
||||
repos.stars=Atzīmētās zvaigznītes
|
||||
repos.issues=Problēmas
|
||||
|
||||
auths.auth_manage_panel=Autorizāciju pārvaldības panelis
|
||||
auths.new=Pievienot jaunu autorizācijas veidu
|
||||
auths.name=Nosaukums
|
||||
auths.type=Veids
|
||||
auths.enabled=Iespējota
|
||||
auths.updated=Atjaunināta
|
||||
auths.auth_type=Autorizācijas veids
|
||||
auths.auth_name=Autorizācijas nosaukums
|
||||
auths.domain=Domēns
|
||||
auths.host=Resursdators
|
||||
auths.port=Ports
|
||||
auths.base_dn=Pamata DN
|
||||
auths.attribute_username=Username attribute
|
||||
auths.attribute_name=First name attribute
|
||||
auths.attribute_surname=Surname attribute
|
||||
auths.attribute_mail=E-mail attribute
|
||||
auths.filter=Meklēšanas filtrs
|
||||
auths.ms_ad_sa=MS Ad SA
|
||||
auths.smtp_auth=SMTP autorizācijas veids
|
||||
auths.smtphost=SMTP resursdators
|
||||
auths.smtpport=SMTP ports
|
||||
auths.enable_tls=Iespējot TLS šifrēšanu
|
||||
auths.pam_service_name=PAM Service Name
|
||||
auths.enable_auto_register=Iespējot automātisko reģistrāciju
|
||||
auths.tips=Padomi
|
||||
auths.edit=Labot autorizācijas iestatījumus
|
||||
auths.activated=Autentifikācija ir aktivizēta
|
||||
auths.update_success=Autorizācijas iestatījumi tika veiksmīgi saglabāti.
|
||||
auths.update=Mainīt autorizācijas iestatījumus
|
||||
auths.delete=Dzēst šo autorizāciju
|
||||
auths.delete_auth_title=Autorizācijas dzēšana
|
||||
auths.delete_auth_desc=Šī autorizācija tiks dzēsta, vai vēlaties turpināt?
|
||||
|
||||
config.server_config=Servera konfigurācija
|
||||
config.app_name=Lietotnes nosaukums
|
||||
config.app_ver=Lietotnes versija
|
||||
config.app_url=Lietotnes URL
|
||||
config.domain=Domēns
|
||||
config.offline_mode=Bezsaistes režīms
|
||||
config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu
|
||||
config.run_user=Izpildes lietotājs
|
||||
config.run_mode=Izpildes režīms
|
||||
config.repo_root_path=Repozitoriju glabāšanas vieta
|
||||
config.static_file_root_path=Statisko failu atrašanās vieta
|
||||
config.log_file_root_path=Žurnalizēšanas failu glabāšanas vieta
|
||||
config.script_type=Skripta veids
|
||||
config.reverse_auth_user=Reversā lietotāja autentifikācija
|
||||
config.db_config=Datu bāzes konfigurācija
|
||||
config.db_type=Veids
|
||||
config.db_host=Resursdators
|
||||
config.db_name=Nosaukums
|
||||
config.db_user=Lietotājs
|
||||
config.db_ssl_mode=SSL režīms
|
||||
config.db_ssl_mode_helper=(tikai PostgreSQL datu bāzei)
|
||||
config.db_path=Ceļš
|
||||
config.db_path_helper=(tikai Sqlite3 datu bāzei)
|
||||
config.service_config=Pakalpojuma konfigurācija
|
||||
config.register_email_confirm=Pieprasīt e-pasta apstiprināšanu
|
||||
config.disable_register=Atspējot jaunu lietotāju reģistrāciju
|
||||
config.show_registration_button=Rādīt reģistrēšanās pogu
|
||||
config.require_sign_in_view=Nepieciešama autorizācija
|
||||
config.mail_notify=Pasta paziņojumi
|
||||
config.enable_cache_avatar=Glabāt profila attēlus kešatmiņā
|
||||
config.active_code_lives=Aktīvā koda ilgums
|
||||
config.reset_password_code_lives=Paroles atiestatīšanas koda ilgums
|
||||
config.webhook_config=Tīkla āķu konfigurācija
|
||||
config.task_interval=Uzdevuma intervāls
|
||||
config.deliver_timeout=Piegādes noildze
|
||||
config.skip_tls_verify=Izlaist TLS pārbaudi
|
||||
config.mailer_config=Sūtītāja konfigurācija
|
||||
config.mailer_enabled=Iespējots
|
||||
config.mailer_disable_helo=Disable HELO
|
||||
config.mailer_name=Nosaukums
|
||||
config.mailer_host=Resursdators
|
||||
config.mailer_user=Lietotājs
|
||||
config.oauth_config=OAuth konfigurācija
|
||||
config.oauth_enabled=Iespējota
|
||||
config.cache_config=Kešatmiņas konfigurācija
|
||||
config.cache_adapter=Kešatmiņas adapteris
|
||||
config.cache_interval=Kešatmiņas intervāls
|
||||
config.cache_conn=Kešatmiņas pieslēguma parametri
|
||||
config.session_config=Sesijas konfigurācja
|
||||
config.session_provider=Sesijas nodrošinātājs
|
||||
config.provider_config=Pakalpojumu sniedzēja konfigurācija
|
||||
config.cookie_name=Sīkdatnes nosaukums
|
||||
config.enable_set_cookie=Ļaut izmantot sīkdatnes
|
||||
config.gc_interval_time=GC laika intervāls
|
||||
config.session_life_time=Sesijas ilgums
|
||||
config.https_only=Tikai HTTPS
|
||||
config.cookie_life_time=Sīkdatņu glabāšanas ilgums
|
||||
config.picture_config=Attēlu konfigurācija
|
||||
config.picture_service=Lokāli attēli
|
||||
config.disable_gravatar=Atspējot Gravatar
|
||||
config.log_config=Žurnalizēšanas konfigurācija
|
||||
config.log_mode=Žurnalizēšanas veids
|
||||
|
||||
monitor.cron=Cron uzdevumi
|
||||
monitor.name=Nosaukums
|
||||
monitor.schedule=Grafiks
|
||||
monitor.next=Nākošās izpildes laiks
|
||||
monitor.previous=Pēdējās izpildes laiks
|
||||
monitor.execute_times=Izpilžu skaits
|
||||
monitor.process=Darbojošies procesi
|
||||
monitor.desc=Apraksts
|
||||
monitor.start=Sākuma laiks
|
||||
monitor.execute_time=Izpildes laiks
|
||||
|
||||
notices.system_notice_list=Sistēmas paziņojumi
|
||||
notices.type=Veids
|
||||
notices.type_1=Repozitorijs
|
||||
notices.desc=Apraksts
|
||||
notices.op=Op.
|
||||
notices.delete_success=Sistēmas paziņojums tika veiksmīgi izdzēsts.
|
||||
|
||||
[action]
|
||||
create_repo=izveidoja repozitoriju <a href="%s">%s</a>
|
||||
commit_repo=veica izmaiņu nosūtīšanu atzaram <a href="%s/src/%s">%[2]s</a> repozitorijā <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`reģistrēja problēmu <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue=`pievienoja komentāru problēmai <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
transfer_repo=mainīja repozitorija <code>%s</code> īpašnieku uz <a href="%s">%s</a>
|
||||
push_tag=pievienoja tagu <a href="%s/src/%s">%[2]s</a> repozitorijam <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits=Veikt salīdzināšanu starp šīm 2 revīzijām
|
||||
|
||||
[tool]
|
||||
ago=atpakaļ
|
||||
from_now=no šī brīža
|
||||
now=tagad
|
||||
1s=1 sekundi %s
|
||||
1m=1 minūti %s
|
||||
1h=1 stundu %s
|
||||
1d=1 dienu %s
|
||||
1w=1 nedēļu %s
|
||||
1mon=1 mēnesi %s
|
||||
1y=1 gadu %s
|
||||
seconds=%d sekundes %s
|
||||
minutes=%d minūtes %s
|
||||
hours=%d stundas %s
|
||||
days=%d dienas %s
|
||||
weeks=%d nedēļas %s
|
||||
months=%d mēneši %s
|
||||
years=%d gadi %s
|
||||
raw_seconds=sekundes
|
||||
raw_minutes=minūtes
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
app_desc=Een pijnloze self-hosted Git-dienst geschreven in Go
|
||||
app_desc=Een eenvoudige zelfgehoste Git service geschreven in Go
|
||||
|
||||
home=Huis
|
||||
dashboard=Dashboard
|
||||
@@ -39,10 +39,18 @@ issues=Kwesties
|
||||
|
||||
cancel=Annuleer
|
||||
|
||||
[search]
|
||||
search=Zoeken...
|
||||
repository=Opslagplaats
|
||||
user=Gebruiker
|
||||
issue=Probleem
|
||||
code=Code
|
||||
|
||||
[install]
|
||||
install=Installatie
|
||||
title=Installatiestappen voor de eerste keer opstarten
|
||||
requite_db_desc=Om Gogs te gebruiken is MySQL, PostgreSQL of SQLite3 vereist (SQLite3 is beschikbaar in de officiële versie).
|
||||
db_title=Database instellingen
|
||||
db_type=Database-type
|
||||
host=Host
|
||||
user=Gebruikersnaam
|
||||
@@ -52,22 +60,39 @@ db_helper=Gebruik InnoDB engine met utf8_general_ci karakterset voor MySQL.
|
||||
ssl_mode=SSL-modus
|
||||
path=Pad
|
||||
sqlite_helper=Het pad naar de SQLite3 database.
|
||||
general_title=Algemene instellingen van Gogs
|
||||
err_empty_sqlite_path=SQLite3 database pad mag niet leeg zijn.
|
||||
|
||||
general_title=Toepassing algemene instellingen
|
||||
app_name=Applicatienaam
|
||||
app_name_helper=Plaats hier je organisatienaam in grote letters!
|
||||
repo_path=Repositories basis directorie
|
||||
repo_path_helper=Alle remote Git repositories worden in deze directorie opgeslagen
|
||||
run_user=Uitvoerende gebruikersnaam
|
||||
run_user_helper=Deze gebruiker moet toegang hebben tot de git repositorie directorie en moet Gogs kunnen starten
|
||||
domain=Domein
|
||||
domain_helper=Dit heeft invloed op de SSH kloon URLs
|
||||
http_port=HTTP-poort
|
||||
http_port_helper=Poortnummer waar het programma naar luistert.
|
||||
app_url=Applicatie URL
|
||||
app_url_helper=Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in de email worden gebruikt
|
||||
email_title=Email service instellingen (Optioneel)
|
||||
|
||||
optional_title=Optionele instellingen
|
||||
email_title=E-mail service instellingen
|
||||
smtp_host=SMTP host
|
||||
smtp_from=Afzender
|
||||
smtp_from_helper=Email afzender, RFC 5322. Dit kan gewoon een email adres zijn of het "Naam"<email@example.com> formaat.
|
||||
mailer_user=Afzender e-mail / gebruikersnaam
|
||||
mailer_password=Wachtwoord
|
||||
notify_title=Notificatie-instelligen (optioneel)
|
||||
register_confirm=Activeer registratie emails
|
||||
mail_notify=Activeer e-mailnotificaties
|
||||
server_service_title=Server en andere Services-instellingen
|
||||
offline_mode=Off line modus inschakelen
|
||||
offline_mode_popup=Schakel CDN uit in productiemodus, alle bestanden worden lokaal aangeboden.
|
||||
disable_registration=Schakel zelfregistratie uit
|
||||
disable_registration_popup=Schakel zelfregistratie uit, alleen admins kunnen accounts maken.
|
||||
require_sign_in_view=Schakel vereiste aanmelding om pagina's te zien in
|
||||
require_sign_in_view_popup=Alleen ingelogde gebruikers kunnen pagina's bekijken, bezoekers kunnen alleen de login/registratie pagina's zien.
|
||||
admin_setting_desc=U hoeft niet meteen een administratie account te maken, de gebruiker met ID=1 krijgt automatisch administratierechten.
|
||||
admin_title=Instellingen beheerdersaccount
|
||||
admin_name=Gebruikersnaam
|
||||
admin_password=Wachtwoord
|
||||
@@ -109,7 +134,7 @@ confirmation_mail_sent_prompt=Een bevestigingsemail is gestuurd naar <b>%s</b>,
|
||||
sign_in_email=Meld u aan met uw e-mailadres
|
||||
active_your_account=Activeer uw account
|
||||
resent_limit_prompt=Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag.
|
||||
has_unconfirmed_mail=Beste %s, u heeft een onbevestigde e-mailadres (<b>%s</b>). Als u nog geen bevestiging per e-mail heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop.
|
||||
has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (<b>%s</b>). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop.
|
||||
resend_mail=Klik hier om uw activatie mail nog een keer te verzenden
|
||||
email_not_associate=Dit e-mailadres is niet gekoppeld aan een account.
|
||||
send_reset_mail=Klik hier om uw wachtwoord reset mail (nogmaals) te versturen
|
||||
@@ -118,6 +143,11 @@ invalid_code=Sorry, uw bevestigingscode is verlopen of niet meer geldig.
|
||||
reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen.
|
||||
password_too_short=De lengte van uw wachtwoord moet minimaal zes karakters zijn.
|
||||
|
||||
[modal]
|
||||
yes=Ja
|
||||
no=Nee
|
||||
modify=Aanpassen
|
||||
|
||||
[form]
|
||||
UserName=Gebruikersnaam
|
||||
RepoName=Repositorie naam
|
||||
@@ -134,6 +164,7 @@ AdminEmail=E-mail beheerder
|
||||
require_error=kan niet leeg zijn.
|
||||
alpha_dash_error=moet een valide alfanumeriek of dash(-_) karakter zijn.
|
||||
alpha_dash_dot_error=moet een valide alfanumeriek, dash(-_) of (.) punt karakter zijn.
|
||||
size_error=moet groter zijn dan %s
|
||||
min_size_error=moet minimaal %s karakters bevatten.
|
||||
max_size_error=mag maximaal %s karakters bevatten.
|
||||
email_error=is niet een valide e-mail adres.
|
||||
@@ -148,9 +179,6 @@ org_name_been_taken=Organisatie naam is al in gebruik.
|
||||
team_name_been_taken=Team naam is al in gebruik.
|
||||
email_been_used=e-mailadres is al in gebruik.
|
||||
ssh_key_been_used=Openbare sleutel naam is al in gebruik.
|
||||
illegal_username=Gebruikersnaam bevat illegale karakters.
|
||||
illegal_repo_name=Repositorie naam bevat illegale karakters.
|
||||
illegal_org_name=Organisatie naam bevat illegale karakters.
|
||||
illegal_team_name=Team naam bevat illegale karakters.
|
||||
username_password_incorrect=Gebruikersnaam of wachtwoord is niet correct.
|
||||
enterred_invalid_repo_name=U heeft een onjuiste repositorie naam ingevoerd.
|
||||
@@ -173,6 +201,7 @@ target_branch_not_exist=Doel branch bestaat niet
|
||||
|
||||
[user]
|
||||
change_avatar=Verander uw avatar op Gravatar.com
|
||||
change_custom_avatar=Wijzig uw avatar in de instellingen
|
||||
join_on=Aangemeld op
|
||||
repositories=repositories
|
||||
activity=Openbare activiteit
|
||||
@@ -180,6 +209,9 @@ followers=Volgers
|
||||
starred=Sterren
|
||||
following=Volgt
|
||||
|
||||
form.name_reserved=De gebruikersnaam '%s' is gereserveerd.
|
||||
form.name_pattern_not_allowed=Het gebruikersnaam patroon '%s' is niet toegestaan.
|
||||
|
||||
[settings]
|
||||
profile=Profiel
|
||||
password=Wachtwoord
|
||||
@@ -191,7 +223,7 @@ delete=Verwijder account
|
||||
uid=uid
|
||||
|
||||
public_profile=Openbaar profiel
|
||||
profile_desc=Uw e-mailadres is openbaar zichtbaar en zal gebruikt worden gebruikt voor alle account gerlateerde berichtgevingen en web bewerking gemaakt via de website.
|
||||
profile_desc=Uw e-mailadres is openbaar en zal gebruikt worden voor alle account gerelateerde berichtgevingen en bewerkingingen die via de website worden gedaan.
|
||||
full_name=Volledige naam
|
||||
website=Website
|
||||
location=Locatie
|
||||
@@ -202,12 +234,31 @@ change_username_desc=Gebruikersnaam is gewijzigd. Wilt u doorgaan? Dit zal gevol
|
||||
continue=Doorgaan
|
||||
cancel=Annuleren
|
||||
|
||||
enable_custom_avatar=Aangepaste avatar inschakelen
|
||||
enable_custom_avatar_helper=Avatar niet ophalen van Gravatar
|
||||
choose_new_avatar=Kies een nieuwe avatar
|
||||
update_avatar=Avatar instelling bijwerken
|
||||
uploaded_avatar_not_a_image=Geüpload bestand is geen afbeelding.
|
||||
no_custom_avatar_available=Geen aangepaste avatar beschikbaar, kan niet worden ingeschakeld.
|
||||
update_avatar_success=Instellingen voor avatar succesvol bijgewerkt.
|
||||
|
||||
change_password=Verander wachtwoord
|
||||
old_password=Huidige wachtwoord
|
||||
new_password=Nieuw wachtwoord
|
||||
password_incorrect=Huidig wachtwoord is niet correct.
|
||||
change_password_success=Wachtwoord is succesvol gewijzigd. U kunt nu met uw nieuwe wachtwoord inloggen.
|
||||
|
||||
emails=E-mailadressen
|
||||
manage_emails=E-mailadressen beheren
|
||||
email_desc=Uw primaire e-mailadres zal worden gebruikt voor meldingen en andere administratieve taken.
|
||||
primary=Primair
|
||||
primary_email=Instellen als primair
|
||||
delete_email=Verwijder
|
||||
add_new_email=Nieuw e-mailadres toevoegen
|
||||
add_email=E-mailadres toevoegen
|
||||
add_email_confirmation_sent=Een nieuwe bevestiging e-mail werd verstuurd naar <b>%s</b>, gelieve uw inbox in de komende %d uren te controleren om het bevestigingsproces te voltooien.
|
||||
add_email_success=Het e-mailadres was toegevoegd.
|
||||
|
||||
manage_ssh_keys=Beheer SSH sleutels
|
||||
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.
|
||||
@@ -260,14 +311,19 @@ init_readme=Initialiseer deze repositorie met een README.md
|
||||
create_repo=Nieuwe Repositorie
|
||||
default_branch=Standaard branch
|
||||
mirror_interval=Mirror interval(uur)
|
||||
goget_meta=Go-Get Meta
|
||||
goget_meta_helper=Deze repositorie is nu beschikbaar voor <span class="label label-blue label-radius">Go-Get</span>
|
||||
|
||||
form.name_reserved=Repositorienaam '%s' is gereserveerd.
|
||||
form.name_pattern_not_allowed=Repositorie naampatroon '%s' is niet toegestaan.
|
||||
|
||||
need_auth=Autorisatie vereist
|
||||
migrate_type=Migratie type
|
||||
migrate_type_helper=Deze repositorie zal een <span class="label label-blue label-radius">mirror</span> worden
|
||||
migrate_repo=Migreer repositorie
|
||||
migrate.clone_address=Clone adres
|
||||
migrate.invalid_local_path=Ongeldig lokaal pad, het pad bestaat niet of het is geen map.
|
||||
|
||||
forked_from=geforked van
|
||||
fork_from_self=U kunt geen repository forken die u al beheert!
|
||||
copy_link=Kopieer
|
||||
click_to_copy=Kopieer link naar plakbord
|
||||
copied=Gekopieerd
|
||||
@@ -290,11 +346,14 @@ branch_and_tags=Aftakkingen & labels
|
||||
branches=Aftakkingen
|
||||
tags=Labels
|
||||
issues=Kwesties
|
||||
labels=Labels
|
||||
milestones=Mijlpalen
|
||||
commits=Commits
|
||||
releases=Publicaties
|
||||
file_raw=Ruwe
|
||||
file_history=Geschiedenis
|
||||
file_view_raw=Weergave ruwe
|
||||
file_permalink=Permalink
|
||||
|
||||
commits.commits=Commits
|
||||
commits.search=Zoeken
|
||||
@@ -305,6 +364,34 @@ commits.date=Datum
|
||||
commits.older=Ouder
|
||||
commits.newer=Nieuwer
|
||||
|
||||
issues.new=New Issue
|
||||
issues.new_label=Nieuw Label
|
||||
issues.new_label_placeholder=Tekst label...
|
||||
issues.open_tab=%d Open
|
||||
issues.close_tab=%d gesloten
|
||||
issues.filter_label=Label
|
||||
issues.filter_label_no_select=Geen label geselecteerd
|
||||
issues.filter_milestone=Mijlpaal
|
||||
issues.filter_assignee=Aangewezene
|
||||
issues.filter_type=Type
|
||||
issues.filter_type.all_issues=Alle kwesties
|
||||
issues.filter_type.assigned_to_you=Aan jou toegewezen
|
||||
issues.filter_type.created_by_you=Created by you
|
||||
issues.filter_type.mentioning_you=Mentioning you
|
||||
issues.opened_by=opened %[1]s by <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Previous Page
|
||||
issues.next=Next Page
|
||||
issues.label_title=Label name
|
||||
issues.label_color=Label color
|
||||
issues.label_count=%d labels
|
||||
issues.label_open_issues=%d open issues
|
||||
issues.label_edit=Edit
|
||||
issues.label_delete=Delete
|
||||
issues.label_modify=Label Modification
|
||||
issues.label_deletion=Label Deletion
|
||||
issues.label_deletion_desc=Delete label will remove its information in all related issues. Do you want to continue?
|
||||
issues.label_deletion_success=Label has been deleted successfully!
|
||||
|
||||
settings=Instellingen
|
||||
settings.options=Opties
|
||||
settings.collaboration=Samenwerking
|
||||
@@ -368,10 +455,34 @@ diff.stats_desc=<strong>%d gewijzigde bestanden</strong> met <strong>toevoeginge
|
||||
diff.bin=BIN
|
||||
diff.view_file=Bestand weergeven
|
||||
|
||||
release.releases=Releases
|
||||
release.new_release=Nieuwe release
|
||||
release.draft=Concept
|
||||
release.prerelease=Voorlopige versie
|
||||
release.stable=Stabiel
|
||||
release.edit=bewerken
|
||||
release.ahead=<strong>%d</strong> aanpassingen aan %s sinds deze versie
|
||||
release.source_code=Broncode
|
||||
release.tag_name=Tagnaam
|
||||
release.target=Doel
|
||||
release.tag_helper=Kies een bestaande tag, of creëer een nieuwe tag bij publiceren.
|
||||
release.release_title=Release titel
|
||||
release.content_with_md=Inhoud met <a href="%s">Markeringen</a>
|
||||
release.write=Schrijf
|
||||
release.preview=Voorbeeld
|
||||
release.content_placeholder=Schrijf enige inhoud
|
||||
release.loading=Laden...
|
||||
release.prerelease_desc=Dit is een beta-versie
|
||||
release.prerelease_helper=Wij wijzen u erop dat deze release is niet geschikt voor productie doeleinden.
|
||||
release.publish=Release publiceren
|
||||
release.save_draft=Concept opslaan
|
||||
release.edit_release=Release bewerken
|
||||
release.tag_name_already_exist=Versie met deze naam bestaat al.
|
||||
|
||||
[org]
|
||||
org_name_holder=Organisatienaam
|
||||
org_name_helper=Een goede organisatienaam is kort en memorabel.
|
||||
org_email_helper=Alle notificaties en bevestigingen worden op het e-mailadres van de organisatie ontvangen.
|
||||
org_email_helper=Alle notificaties en bevestigingen worden gestuurd naar het e-mailadres van de organisatie.
|
||||
create_org=Nieuwe organisatie aanmaken
|
||||
repo_updated=Geupdate
|
||||
people=Mensen
|
||||
@@ -387,6 +498,9 @@ team_name_helper=U gebruikt deze naam om dit team te vermelden in conversaties.
|
||||
team_desc_helper=Waar gaat dit team doen?
|
||||
team_permission_desc=Welke privileges zou dit team moeten hebben?
|
||||
|
||||
form.name_reserved=Organisatienaam '%s' is gereserveerd.
|
||||
form.name_pattern_not_allowed=Organisatie naampatroon '%s' is niet toegestaan.
|
||||
|
||||
settings=Instellingen
|
||||
settings.options=Opties
|
||||
settings.full_name=Volledige naam
|
||||
@@ -467,6 +581,13 @@ dashboard.delete_inactivate_accounts=Verwijder alle inactieve accounts
|
||||
dashboard.delete_inactivate_accounts_success=Alle inactivering van rekeningen hebben verwijderd.
|
||||
dashboard.delete_repo_archives=Verwijderen van alle repositories archieven
|
||||
dashboard.delete_repo_archives_success=Alle repositories archieven hebben verwijderd.
|
||||
dashboard.git_gc_repos=Garbage collectie uitvoeren
|
||||
dashboard.git_gc_repos_success=Garbage collectie met succes uitgevoerd.
|
||||
dashboard.resync_all_sshkeys=Herschrijf '.ssh/authorized_keys' (Let op: alle sleutels die niet van Gogs zijn zullen verloren gaan!)
|
||||
dashboard.resync_all_sshkeys_success=Alle publieke sleutels zijn herschreven.
|
||||
dashboard.resync_all_update_hooks=Herschrijf alle repositorie-hooks (nodig als de configuratie bestandslocatie is gewijzigd)
|
||||
dashboard.resync_all_update_hooks_success=Alle repositorie-hooks zijn herschreven.
|
||||
|
||||
dashboard.server_uptime=Uptime server
|
||||
dashboard.current_goroutine=Huidige Goroutines
|
||||
dashboard.current_memory_usage=Huidige geheugen gebruik
|
||||
@@ -543,13 +664,17 @@ auths.domain=Domein
|
||||
auths.host=Host
|
||||
auths.port=Poort
|
||||
auths.base_dn=Base DN
|
||||
auths.attributes=Zoek attributen
|
||||
auths.attribute_username=Gebruikersnaam attribuut
|
||||
auths.attribute_name=Voornaam attribuut
|
||||
auths.attribute_surname=Achternaam attribuut
|
||||
auths.attribute_mail=E-mail attribuut
|
||||
auths.filter=Zoek filter
|
||||
auths.ms_ad_sa=MS Ad SA
|
||||
auths.smtp_auth=SMTP authenticatietype
|
||||
auths.smtphost=SMTP host
|
||||
auths.smtpport=SMTP poort
|
||||
auths.enable_tls=Activeer TLS-encryptie
|
||||
auths.pam_service_name=PAM servicenaam
|
||||
auths.enable_auto_register=Activeer automatische registratie
|
||||
auths.tips=Tips
|
||||
auths.edit=Bewerk autorisatie-instellingen
|
||||
@@ -586,6 +711,7 @@ config.db_path_helper=(alleen voor "sqlite3")
|
||||
config.service_config=Serviceconfiguratie
|
||||
config.register_email_confirm=E-mailbevestiging registreren
|
||||
config.disable_register=Registratie uitgeschakeld
|
||||
config.show_registration_button=Registeren knop weergeven
|
||||
config.require_sign_in_view=Inloggen vereist om te kunnen inzien
|
||||
config.mail_notify=E-mailnotificaties
|
||||
config.enable_cache_avatar=Avatar Cache inschakelen
|
||||
@@ -594,8 +720,10 @@ config.reset_password_code_lives=Reset wachtwoord Code leven
|
||||
config.webhook_config=Webhook configuratie
|
||||
config.task_interval=Taakinterval
|
||||
config.deliver_timeout=Bezorging verlooptijd
|
||||
config.skip_tls_verify=TLS certificaat controle overslaan
|
||||
config.mailer_config=Mailerconfiguatie
|
||||
config.mailer_enabled=Ingeschakeld
|
||||
config.mailer_disable_helo=Schakel HELO uit
|
||||
config.mailer_name=Naam
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Gebruiker
|
||||
@@ -639,12 +767,12 @@ notices.op=Op.
|
||||
notices.delete_success=Systeem bericht is met succes verwijderd.
|
||||
|
||||
[action]
|
||||
create_repo=repositorie aangemaakt in <a href="%s/%s">%s</a>
|
||||
commit_repo=push update naar <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a
|
||||
create_issue=opende issue in <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
comment_issue=reactie op issue <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
transfer_repo=repositorie verplaatst naar <code>%s</code> naar <a href="/%s%s">%s</a>
|
||||
push_tag=geduwd label <a href="%s/%s/src/%s"> %s</a> naar <a href="%s/%s"> %s</a>
|
||||
create_repo=repositorie aangemaakt in <a href="%s">%s</a>
|
||||
commit_repo=push update naar <a href="%s/src/%s">%[2]s</a> in <a href="%[1]s">%[3]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>`
|
||||
transfer_repo=repositorie 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>
|
||||
compare_2_commits=Weergave vergelijking voor deze 2 commits
|
||||
|
||||
[tool]
|
||||
@@ -668,16 +796,3 @@ years=%d jaren %s
|
||||
raw_seconds=seconden
|
||||
raw_minutes=minuten
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
798
conf/locale/locale_pl-PL.ini
Executable file
798
conf/locale/locale_pl-PL.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Bezbolesna usługa Git napisana w Go działająca na własnym serwerze
|
||||
|
||||
home=Strona główna
|
||||
dashboard=Pulpit
|
||||
explore=Odkrywaj
|
||||
help=Pomoc
|
||||
sign_in=Zaloguj się
|
||||
social_sign_in=Rejestracja przy pomocy sieci społecznościowych: 2 krok <small>kojarzenie konta</small>
|
||||
sign_out=Wyloguj
|
||||
sign_up=Zarejestruj się
|
||||
register=Zarejestruj się
|
||||
website=Strona
|
||||
version=Wersja
|
||||
page=Strona
|
||||
template=Szablon
|
||||
language=Język
|
||||
|
||||
username=Nazwa Użytkownika
|
||||
email=E-mail
|
||||
password=Hasło
|
||||
re_type=Wpisz ponownie
|
||||
captcha=Captcha
|
||||
|
||||
repository=Repozytorium
|
||||
organization=Organizacja
|
||||
mirror=Mirror
|
||||
new_repo=Nowe repozytorium
|
||||
new_migrate=Nowa migracja
|
||||
new_fork=Forkuj repozytorium
|
||||
new_org=Nowa organizacja
|
||||
manage_org=Zarządzaj organizacjami
|
||||
admin_panel=Panel admina
|
||||
account_settings=Ustawienia konta
|
||||
settings=Ustawienia
|
||||
|
||||
news_feed=Kanał aktualności
|
||||
pull_requests=Oczekujące zmiany
|
||||
issues=Problemy
|
||||
|
||||
cancel=Anuluj
|
||||
|
||||
[search]
|
||||
search=Wyszukiwanie...
|
||||
repository=Repozytorium
|
||||
user=Użytkownik
|
||||
issue=Zgłoszenie
|
||||
code=Kod
|
||||
|
||||
[install]
|
||||
install=Instalacja
|
||||
title=Kroki instalacyjne dla pierwszego uruchomienia
|
||||
requite_db_desc=Gogs wymaga MySQL, PostgreSQL lub SQLite3.
|
||||
db_title=Ustawienia bazy danych
|
||||
db_type=Typ bazy danych
|
||||
host=Host
|
||||
user=Użytkownik
|
||||
password=Hasło
|
||||
db_name=Nazwa bazy danych
|
||||
db_helper=Proszę użyć silnika INNODB z kodowaniem utf8_general_ci dla MySQL.
|
||||
ssl_mode=Tryb SSL
|
||||
path=Ścieżka
|
||||
sqlite_helper=Ścieżka do bazy SQLite3.
|
||||
err_empty_sqlite_path=Ścieżka do bazy danych SQLite3 nie może być pusta.
|
||||
|
||||
general_title=Ustawienia ogólne Gogs
|
||||
app_name=Nazwa aplikacji
|
||||
app_name_helper=Umieść tutaj wielką i głośną nazwę swojej organizacji!
|
||||
repo_path=Katalog repozytoriów
|
||||
repo_path_helper=W tym katalogu zostaną zapisane wszystkie repozytoria Git.
|
||||
run_user=Nazwa użytkownika uruchomieniowego
|
||||
run_user_helper=Użytkownik musi mieć dostęp do katalogu repozytoriów i uruchamiania Gogs.
|
||||
domain=Domena
|
||||
domain_helper=To wpłynie na URLe do klonowania poprzez SSH.
|
||||
http_port=Port HTTP
|
||||
http_port_helper=Numer portu na którym aplikacja jest dostępna.
|
||||
app_url=Adres URL aplikacji
|
||||
app_url_helper=To wpłynie na adresy klonowania HTTP/HTTPS i w wiadomościach e-mail.
|
||||
|
||||
optional_title=Ustawienia opcjonalne
|
||||
email_title=Ustawienia serwera e-mail
|
||||
smtp_host=Serwer SMTP
|
||||
smtp_from=Od
|
||||
smtp_from_helper=Adres w polu "Od", zgodnie z RFC 5322. Może być to po prostu adres email, bądź adres w formacie "Nazwa" <email@example.com>.
|
||||
mailer_user=Nadawca wiadomości E-mail
|
||||
mailer_password=Hasło nadawcy
|
||||
register_confirm=Włącz potwierdzenia rejestracji
|
||||
mail_notify=Włącz powiadomienia e-mail
|
||||
server_service_title=Ustawienia serwera i innych usług
|
||||
offline_mode=Włącz tryb offline
|
||||
offline_mode_popup=Wyłącz CDN, nawet w trybie produkcyjnym, wszystkie pliki zasobów będą podawane lokalnie.
|
||||
disable_registration=Wyłącz samodzielną rejestrację
|
||||
disable_registration_popup=Wyłącz samodzielną rejestrację użytkownika, tylko administrator będzie mógł tworzyć konta.
|
||||
require_sign_in_view=Włącz wymóg zalogowania do przeglądania stron
|
||||
require_sign_in_view_popup=Tylko zalogowani użytkownicy będą mogli przeglądać strony, goście zobaczą tylko stronę logowania.
|
||||
admin_setting_desc=Nie musisz tworzyć konta administratora teraz, użytkownik z ID = 1 zyska dostęp administratora automatycznie.
|
||||
admin_title=Ustawienia konta administratora
|
||||
admin_name=Nazwa Użytkownika
|
||||
admin_password=Hasło
|
||||
confirm_password=Potwierdź hasło
|
||||
admin_email=E-mail
|
||||
install_gogs=Zainstaluj Gogs
|
||||
test_git_failed=Nie udało się przetestować polecenia "git": %v
|
||||
sqlite3_not_available=Twoje wydanie nie obsługuje SQLite3, proszę pobrać oficjalne wydanie z %s, a NIE wersję z gobuild.
|
||||
invalid_db_setting=Ustawienia bazy danych nie są poprawne: %v
|
||||
invalid_repo_path=Ścieżka repozytoriów nie jest poprawna: %v
|
||||
run_user_not_match=Użytkownik aplikacji nie jest aktualnym użytkownikiem: %s -> %s
|
||||
save_config_failed=Nie udało się zapisać konfiguracji: %v
|
||||
invalid_admin_setting=Nieprawidłowe ustawienia konta admina: %v
|
||||
install_success=Cześć! Cieszymy się, że wybierałeś Gogs, baw się dobrze.
|
||||
|
||||
[home]
|
||||
uname_holder=Nazwa użytkownika lub e-mail
|
||||
password_holder=Hasło
|
||||
switch_dashboard_context=Przełącz kontekst strony głównej
|
||||
my_repos=Moje repozytoria
|
||||
collaborative_repos=Wspólne repozytoria
|
||||
my_orgs=Moje organizacje
|
||||
my_mirrors=Moje mirrory
|
||||
|
||||
[explore]
|
||||
repos=Repozytoria
|
||||
|
||||
[auth]
|
||||
create_new_account=Załóż nowe konto
|
||||
register_hepler_msg=Masz już konto? Zaloguj się teraz!
|
||||
social_register_hepler_msg=Masz już konto? Powiąż je teraz!
|
||||
disable_register_prompt=Przepraszamy rejestracja została wyłączona. Prosimy o kontakt z administratorem serwisu.
|
||||
disable_register_mail=Przepraszamy, potwierdzenia rejestracji zostały wyłączone przez administratora.
|
||||
remember_me=Zapamiętaj mnie
|
||||
forgot_password=Zapomniałem hasła
|
||||
forget_password=Zapomniałeś hasła?
|
||||
sign_up_now=Potrzebujesz konta? Zarejestruj się teraz.
|
||||
confirmation_mail_sent_prompt=Nowa wiadomość e-mail z potwierdzeniem została wysłana do <b>%s</b>, proszę sprawdzić swoją skrzynkę odbiorczą w ciągu najbliższych godzin %d aby dokończyć proces rejestracji.
|
||||
sign_in_email=Zaloguj się na swój adres e-mail
|
||||
active_your_account=Aktywuj swoje konto
|
||||
resent_limit_prompt=Niestety, zbyt często wysyłasz e-mail aktywacyjny. Proszę odczekać 3 minuty.
|
||||
has_unconfirmed_mail=Witaj, %s, masz niepotwierdzony adres e-mail (<b>%s</b>). Jeśli nie otrzymałeś wiadomości e-mail z potwierdzeniem lub potrzebujesz wysłać nową, kliknij na poniższy przycisk.
|
||||
resend_mail=Kliknij tutaj, aby wysłać e-mail aktywacyjny
|
||||
email_not_associate=Ten adres e-mail nie jest skojarzony z żadnym kontem.
|
||||
send_reset_mail=Kliknij tutaj, aby (ponownie) wysłać e-mail z instrukcjami resetowania hasła
|
||||
reset_password=Resetowanie hasła
|
||||
invalid_code=Niestety, twój kod potwierdzający wygasł lub jest nieprawidłowy.
|
||||
reset_password_helper=Kliknij tutaj, aby zresetować hasło
|
||||
password_too_short=Długość hasła nie może być mniejsza niż 6 znaków.
|
||||
|
||||
[modal]
|
||||
yes=Yes
|
||||
no=No
|
||||
modify=Modify
|
||||
|
||||
[form]
|
||||
UserName=Nazwa Użytkownika
|
||||
RepoName=Nazwa repozytorium
|
||||
Email=Adres e-mail
|
||||
Password=Hasło
|
||||
Retype=Wpisz ponownie hasło
|
||||
SSHTitle=Nazwa klucza SSH
|
||||
HttpsUrl=HTTPS URL
|
||||
PayloadUrl=URL do wywołania
|
||||
TeamName=Nazwa zespołu
|
||||
AuthName=Nazwa autoryzacji
|
||||
AdminEmail=E-mail administratora
|
||||
|
||||
require_error=` nie może być puste.`
|
||||
alpha_dash_error=` musi się składać z prawidłowych znaków alfanumerycznych, myślników oraz podkreśleń.`
|
||||
alpha_dash_dot_error=` musi się składać z prawidłowych znaków alfanumerycznych, myślników, podkreśleń oraz kropek.`
|
||||
size_error=` must be size %s.`
|
||||
min_size_error=` musi zawierać co najwyżej %s znaków.`
|
||||
max_size_error=` musi zawierać co najwyżej %s znaków.`
|
||||
email_error=` nie jest poprawnym adresem e-mail.`
|
||||
url_error=` nie jest poprawnym adresem URL.`
|
||||
unknown_error=Nieznany błąd:
|
||||
captcha_incorrect=Kod captcha nie zgadza się.
|
||||
password_not_match=Hasło i potwierdzenie nie zgadzają się.
|
||||
|
||||
username_been_taken=Nazwa użytkownika jest już zajęta.
|
||||
repo_name_been_taken=Nazwa repozytorium jest już zajęta.
|
||||
org_name_been_taken=Nazwa organizacji jest już zajęta.
|
||||
team_name_been_taken=Nazwa zespołu jest już zajęta.
|
||||
email_been_used=Adres e-mail jest już zarejestrowany.
|
||||
ssh_key_been_used=Nazwa klucza publicznego jest już używana.
|
||||
illegal_team_name=Nazwa zespołu zawiera niedozwolone znaki.
|
||||
username_password_incorrect=Nazwa użytkownika lub hasło nie jest prawidłowe.
|
||||
enterred_invalid_repo_name=Upewnij się, że wprowadzona nazwa repozytorium jest poprawna.
|
||||
enterred_invalid_owner_name=Upewnij się, że nazwa właściciela repozytorium jest poprawna.
|
||||
enterred_invalid_password=Proszę upewnij się, że wprowadzono hasło jest poprawne.
|
||||
user_not_exist=Podany użytkownik nie istnieje.
|
||||
last_org_owner=Usuwany użytkownik jest ostatnim członkiem ekipy właścicieli. Musi być inny właściciel.
|
||||
|
||||
invalid_ssh_key=Niestety, nie jesteśmy stanie zweryfikować twojego klucza SSH: %s
|
||||
unable_verify_ssh_key=Gogs nie może zweryfikować twojego klucza SSH, ale zakładamy, że jest poprawny, proszę sprawdź to samodzielnie.
|
||||
auth_failed=Uwierzytelnianie nie powiodło się: %v
|
||||
|
||||
still_own_repo=Twoje konto jest dalej właścicielem repozytorium, musisz je usunąć lub przekazać.
|
||||
still_has_org=Twoje konto dalej posiada członkostwo w organizacji, musisz ją opuścić bądź usunąć.
|
||||
org_still_own_repo=Ta organizacja dalej jest właścicielem repozytorium, musisz je usunąć bądź przekazać.
|
||||
|
||||
still_own_user=To uwierzytelnienie dalej jest używane przez kilku użytkowników, musisz je przenieść i usunąć ponownie.
|
||||
|
||||
target_branch_not_exist=Podana gałąź nie istnieje
|
||||
|
||||
[user]
|
||||
change_avatar=Zmień swój avatar na gravatar.com
|
||||
change_custom_avatar=Zmień awatar w ustawieniach
|
||||
join_on=Dołączył
|
||||
repositories=Repozytoria
|
||||
activity=Publiczna aktywność
|
||||
followers=Obserwujący
|
||||
starred=Polubionych
|
||||
following=Obserwowani
|
||||
|
||||
form.name_reserved=Nazwa użytkownika "%s" jest zarezerwowana.
|
||||
form.name_pattern_not_allowed=Wzorzec nazwy użytkownika "%s" jest niedozwolony.
|
||||
|
||||
[settings]
|
||||
profile=Profil
|
||||
password=Hasło
|
||||
ssh_keys=Klucze SSH
|
||||
social=Konta społecznościowe
|
||||
applications=Aplikacje
|
||||
orgs=Organizacje
|
||||
delete=Usuń konto
|
||||
uid=UID
|
||||
|
||||
public_profile=Profil publiczny
|
||||
profile_desc=Twój adres e-mail jest publiczny i będzie używany dla wszystkich powiadomień związanych z kontem i dla każdej operacji wykonanej przez tę stronę.
|
||||
full_name=Imię i Nazwisko
|
||||
website=Strona
|
||||
location=Lolalizacja
|
||||
update_profile=Zaktualizuj profil
|
||||
update_profile_success=Twój profil został pomyślnie zaktualizowany.
|
||||
change_username=Zmieniono nazwę użytkownika
|
||||
change_username_desc=Zmieniono nazwę użytkownika, czy chcesz kontynuować? To wpłynie na wszystkie linki odnoszą się do swojego konta.
|
||||
continue=Konynuuj
|
||||
cancel=Anuluj
|
||||
|
||||
enable_custom_avatar=Włącz niestandardowe awatary
|
||||
enable_custom_avatar_helper=Włącz to by wyłączyć grawatary
|
||||
choose_new_avatar=Wybierz nowy avatar
|
||||
update_avatar=Zaktualizuj ustawienia awatara
|
||||
uploaded_avatar_not_a_image=Załadowany plik nie jest obrazem.
|
||||
no_custom_avatar_available=Własny avatar niedostępny, nie można go włączyć.
|
||||
update_avatar_success=Ustawienia awatarów zostały pomyślnie zaktualizowane.
|
||||
|
||||
change_password=Zmień hasło
|
||||
old_password=Aktualne hasło
|
||||
new_password=Nowe hasło
|
||||
password_incorrect=Bieżące hasło nie jest prawidłowe.
|
||||
change_password_success=Hasło zostało zmienione pomyślnie. Możesz teraz zalogować się za pomocą nowego hasła.
|
||||
|
||||
emails=Adresy e-mail
|
||||
manage_emails=Zarządzaj adresami e-mail
|
||||
email_desc=Twój podstawowy adres e-mail będzie używany dla powiadomień i innych działań.
|
||||
primary=Podstawowy
|
||||
primary_email=Ustaw jako podstawowy
|
||||
delete_email=Usuń
|
||||
add_new_email=Dodaj nowy e-mail
|
||||
add_email=Dodaj e-mail
|
||||
add_email_confirmation_sent=Nowa wiadomość e-mail z potwierdzeniem została wysłana do <b>%s</b>, proszę sprawdzić swoją skrzynkę odbiorczą w ciągu %d godzin, aby dokończyć proces potwierdzania.
|
||||
add_email_success=Twój nowy e-mail został dodany pomyślnie.
|
||||
|
||||
manage_ssh_keys=Zarządzaj kluczami SSH
|
||||
add_key=Dodaj klucz
|
||||
ssh_desc=To jest lista kluczy SSH powiązanych z Twoim kontem. Usuń klucze, które nie rozpoznajesz.
|
||||
ssh_helper=<strong>Potrzebujesz pomocy?</strong> Sprawdź nasz przewodnik <a href="%s"> generowania kluczy SSH</a> lub rozwiązywanie <a href="%s">typowych problemów z SSH</a>.
|
||||
add_new_key=Dodaj klucz SSH
|
||||
key_name=Nazwa klucza
|
||||
key_content=Treść
|
||||
add_key_success=Nowy klucz SSH został dodany!
|
||||
delete_key=Usuń
|
||||
add_on=Dodano
|
||||
last_used=Ostatnio użyto
|
||||
no_activity=Brak aktywności
|
||||
|
||||
manage_social=Zarządzaj powiązanymi kontami społecznościowymi
|
||||
social_desc=To jest lista powiązanych kont społecznościowych. Usuń powiązania, których nie rozpoznajesz.
|
||||
unbind=Usuń powiązanie
|
||||
unbind_success=Konto społecznościowe zostało odpięte.
|
||||
|
||||
manage_access_token=Zarządzaj osobistymi tokenami dostępu
|
||||
generate_new_token=Wygeneruj nowy token
|
||||
tokens_desc=Tokeny, które wygenerowałeś, służą do dostępu do API Gogs.
|
||||
new_token_desc=Jak na razie, każdy token zapewnia pełen dostęp do Twojego konta.
|
||||
token_name=Nazwa tokena
|
||||
generate_token=Wygeneruj token
|
||||
generate_token_succees=Nowy token dostępu został wygenerowany pomyślnie! Upewnij się, że teraz go skopiowałeś. Nie będziesz mógł go zobaczyć ponownie!
|
||||
delete_token=Usuń
|
||||
delete_token_success=Token dostępu osobowych został usunięty pomyślnie! Nie zapomnij również zaktualizować swoich aplikacji.
|
||||
|
||||
delete_account=Usuń konto
|
||||
delete_prompt=Ta operacja trwale usuwa konto, i <strong>NIE MOŻE</strong> zostać cofnięta!
|
||||
confirm_delete_account=Potwierdź usunięcie
|
||||
delete_account_title=Usunięcie konta
|
||||
delete_account_desc=To konto będzie usunięte na zawsze, chcesz kontynuować?
|
||||
|
||||
[repo]
|
||||
owner=Właściciel
|
||||
repo_name=Nazwa repozytorium
|
||||
repo_name_helper=Dobre nazwy repozytorium są krótkie, wpadające w pamięć i <strong>unikalne</strong>.
|
||||
visibility=Widoczność
|
||||
visiblity_helper=To repozytorium jest <span class="label label-red label-radius">prywatne</span>
|
||||
fork_repo=Sforkowane
|
||||
fork_from=Forkuj z
|
||||
fork_visiblity_helper=Fork nie może zmieniać swojej widoczności
|
||||
repo_desc=Opis
|
||||
repo_lang=Język
|
||||
repo_lang_helper=Wybierz plik .gitignore
|
||||
license=Licencja
|
||||
license_helper=Wybierz plik licencji
|
||||
init_readme=Zainicjować to repozytorium używając README.md
|
||||
create_repo=Utwórz repozytorium
|
||||
default_branch=Domyślna gałąź
|
||||
mirror_interval=Odświeżanie mirrorów (godziny)
|
||||
|
||||
form.name_reserved=Nazwa repozytorium "%s" jest zarezerwowana.
|
||||
form.name_pattern_not_allowed=Wzorzec nazwy repozytorium "%s" jest niedozwolony.
|
||||
|
||||
need_auth=Wymaga autoryzacji
|
||||
migrate_type=Typ migracji
|
||||
migrate_type_helper=Repozytorium będzie <span class="label label-blue label-radius">mirrorem</span>
|
||||
migrate_repo=Przenieś repozytorium
|
||||
migrate.clone_address=Sklonuj adres
|
||||
migrate.invalid_local_path=Ścieżka jest niepoprawna. Nie istnieje lub nie jest katalogiem.
|
||||
|
||||
forked_from=forked from
|
||||
fork_from_self=You cannot fork repository you already owned!
|
||||
copy_link=Kopiuj
|
||||
click_to_copy=Kopiuj do schowka
|
||||
copied=Skopiowano
|
||||
clone_helper=Potrzebujesz pomocy z klonowaniem? Odwiedź <a target="_blank" href="%s">Pomoc</a>!
|
||||
unwatch=Przestań obserwować
|
||||
watch=Obserwuj
|
||||
unstar=Usuń gwiazdkę
|
||||
star=Polub
|
||||
fork=Fork
|
||||
|
||||
no_desc=Brak opisu
|
||||
quick_guide=Skrócona instrukcja
|
||||
clone_this_repo=Klonuj repozytorium
|
||||
create_new_repo_command=Utwórz nowe repozytorium z wiersza poleceń
|
||||
push_exist_repo=Wyślij istniejące repozytorium z wiersza poleceń
|
||||
|
||||
branch=Gałąź
|
||||
tree=Drzewo
|
||||
branch_and_tags=Gałęzie i tagi
|
||||
branches=Gałęzie
|
||||
tags=Tagi
|
||||
issues=Problemy
|
||||
labels=Labels
|
||||
milestones=Milestones
|
||||
commits=Commity
|
||||
releases=Wydania
|
||||
file_raw=Czysty
|
||||
file_history=Historia
|
||||
file_view_raw=Zobacz czysty
|
||||
file_permalink=Permalink
|
||||
|
||||
commits.commits=Commity
|
||||
commits.search=Przeszukaj commity
|
||||
commits.find=Szukaj
|
||||
commits.author=Autor
|
||||
commits.message=Wiadomość
|
||||
commits.date=Data
|
||||
commits.older=Starsze
|
||||
commits.newer=Nowsze
|
||||
|
||||
issues.new=New Issue
|
||||
issues.new_label=New Label
|
||||
issues.new_label_placeholder=Label name...
|
||||
issues.open_tab=%d Open
|
||||
issues.close_tab=%d Closed
|
||||
issues.filter_label=Label
|
||||
issues.filter_label_no_select=No selected label
|
||||
issues.filter_milestone=Milestone
|
||||
issues.filter_assignee=Assignee
|
||||
issues.filter_type=Type
|
||||
issues.filter_type.all_issues=All issues
|
||||
issues.filter_type.assigned_to_you=Assigned to you
|
||||
issues.filter_type.created_by_you=Created by you
|
||||
issues.filter_type.mentioning_you=Mentioning you
|
||||
issues.opened_by=opened %[1]s by <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Previous Page
|
||||
issues.next=Next Page
|
||||
issues.label_title=Label name
|
||||
issues.label_color=Label color
|
||||
issues.label_count=%d labels
|
||||
issues.label_open_issues=%d open issues
|
||||
issues.label_edit=Edit
|
||||
issues.label_delete=Delete
|
||||
issues.label_modify=Label Modification
|
||||
issues.label_deletion=Label Deletion
|
||||
issues.label_deletion_desc=Delete label will remove its information in all related issues. Do you want to continue?
|
||||
issues.label_deletion_success=Label has been deleted successfully!
|
||||
|
||||
settings=Ustawienia
|
||||
settings.options=Opcje
|
||||
settings.collaboration=Współpraca
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Skrypty Git
|
||||
settings.deploy_keys=Klucze wdrożeniowe
|
||||
settings.basic_settings=Ustawienia podstawowe
|
||||
settings.danger_zone=Strefa niebezpieczeństwa
|
||||
settings.site=Oficjalna Strona
|
||||
settings.update_settings=Aktualizuj ustawienia
|
||||
settings.change_reponame=Zmieniono nazwę repozytorium
|
||||
settings.change_reponame_desc=Nazwa repozytorium została zmieniona, czy chcesz kontynuować? To wpłynie na wszystkie linki odnoszą się do niego.
|
||||
settings.transfer=Przeniesienie własności
|
||||
settings.transfer_desc=Przenieś to repozytorium do innego użytkownika lub organizacji gdzie masz uprawnienia administratora.
|
||||
settings.new_owner_has_same_repo=Nowy właściciel już posiada repozytorium o tej samej nazwie.
|
||||
settings.delete=Usuń to repozytorium
|
||||
settings.delete_desc=Po usunięciu repozytorium nie ma odwrotu. Upewnij się, że tego chcesz.
|
||||
settings.transfer_notices=<p>-Stracisz dostęp, jeśli nowy właściciel jest indywidualnym użytkownikiem.</p><p>-Będziesz posiadał dostęp nadal, jeśli nowy właściciel jest organizacją i ty jesteś jednym z właścicieli.</p>
|
||||
settings.update_settings_success=Opcje repozytorium zostały pomyślnie zaktualizowane.
|
||||
settings.transfer_owner=Nowy właściciel
|
||||
settings.make_transfer=Przenieś
|
||||
settings.transfer_succeed=Własność repozytorium została przeniesiona pomyślnie.
|
||||
settings.confirm_delete=Potwierdź usunięcie
|
||||
settings.add_collaborator=Dodaj nowego współpracownika
|
||||
settings.add_collaborator_success=Został dodany nowy współpracownik.
|
||||
settings.remove_collaborator_success=Współpracownik został usunięty.
|
||||
settings.user_is_org_member=Użytkownik jest członkiem organizacji, który nie może być dodany jako współpracownik.
|
||||
settings.add_webhook=Dodaj Webhooka
|
||||
settings.hooks_desc=Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gogs, we will handle the notification to the target host you specify. Learn more in this <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||
settings.githooks_desc=Doczepki Git są napędzane przez samego Git, można edytować pliki obsługiwanych doczepek z poniższej listy, aby wykonywać niestandardowe operacje.
|
||||
settings.githook_edit_desc=Jeżeli doczepka jest nieaktywna, prezentowana będzie przykładowa treść. Pozostawienie pustej wartości wyłączy tą doczepkę.
|
||||
settings.githook_name=Nazwa skryptu
|
||||
settings.githook_content=Treść skryptu
|
||||
settings.update_githook=Zaktualizuj skrypt
|
||||
settings.remove_hook_success=Skrypt internetowy został usunięty.
|
||||
settings.add_webhook_desc=Wyślemy żądanie <code>POST</code> pod poniższy adres ze szczegółami zdarzeń. Możesz również ustalić format danych zapytania (JSON, <code>x-www-form-urlencoded</code>, <em>itp</em>). Więcej informacji można znaleźć w <a target="_blank" href="%s">przewodniku skryptów internetowych</a>.
|
||||
settings.payload_url=URL do wywołania
|
||||
settings.content_type=Typ zawartości
|
||||
settings.secret=Sekret
|
||||
settings.event_desc=Jakie zdarzenia mają wywoływać ten skrypt internetowy?
|
||||
settings.event_push_only=Tylko zdarzenia <code>push</code>.
|
||||
settings.active=Aktywny
|
||||
settings.active_helper=Dostarczymy szczegóły zdarzenia, gdy ten skrypt zostanie wywołany.
|
||||
settings.add_hook_success=Nowy skrypt został dodany.
|
||||
settings.update_webhook=Zaktualizuj skrypt internetowy
|
||||
settings.update_hook_success=Skrypt internetowy został zaktualizowany.
|
||||
settings.delete_webhook=Usuń skrypt internetowy
|
||||
settings.recent_deliveries=Ostatnie wywołania
|
||||
settings.hook_type=Typ skryptu
|
||||
settings.add_slack_hook_desc=Dodać integrację ze <a href="%s">Slackiem</a> do twojego repozytorium.
|
||||
settings.slack_token=Token
|
||||
settings.slack_domain=Domena
|
||||
settings.slack_channel=Kanał
|
||||
|
||||
diff.browse_source=Przeglądaj źródła
|
||||
diff.parent=rodzic
|
||||
diff.commit=commit
|
||||
diff.data_not_available=Informacje nt. zmiany nie są dostępne.
|
||||
diff.show_diff_stats=Pokaż statystyki zmian
|
||||
diff.stats_desc=<strong>%d zmienionych plików</strong> z <strong>%d dodań</strong> i <strong>%d usunięć</strong>
|
||||
diff.bin=BIN
|
||||
diff.view_file=Wyświetl plik
|
||||
|
||||
release.releases=Wydania
|
||||
release.new_release=Nowe wydanie
|
||||
release.draft=Szkic
|
||||
release.prerelease=Wersja wstępna
|
||||
release.stable=Stabilny
|
||||
release.edit=edytuj
|
||||
release.ahead=<strong>%d</strong> commitów w %s od tego wydania
|
||||
release.source_code=Kod źródłowy
|
||||
release.tag_name=Nazwa tagu
|
||||
release.target=Cel
|
||||
release.tag_helper=Wybierz istniejący tag, bądź utwórz nowy podczas publikacji.
|
||||
release.release_title=Nazwa wydania
|
||||
release.content_with_md=Treść sformatowana za pomocą <a href="%s">Markdown</a>
|
||||
release.write=Napisz
|
||||
release.preview=Pogdląd
|
||||
release.content_placeholder=Napisz jakąś treść
|
||||
release.loading=Ładowanie...
|
||||
release.prerelease_desc=To jest wersja wstępna
|
||||
release.prerelease_helper=Chcemy zwrócić uwagę, że ta wersja jest oznaczona jako eksperymentalna.
|
||||
release.publish=Publikuj wersję
|
||||
release.save_draft=Zapisz szkic
|
||||
release.edit_release=Edytuj wydanie
|
||||
release.tag_name_already_exist=Wersja o tej nazwie tagu już istnieje.
|
||||
|
||||
[org]
|
||||
org_name_holder=Nazwa organizacji
|
||||
org_name_helper=Świetne nazwy organizacji są krótkie i łatwe do zapamiętania.
|
||||
org_email_helper=Adres e-mail organizacji otrzymuje wszystkie powiadomienia i potwierdzenia.
|
||||
create_org=Utwórz organizację
|
||||
repo_updated=Zaktualizowano
|
||||
people=Ludzie
|
||||
invite_someone=Zaproś kogoś
|
||||
teams=Zespoły
|
||||
lower_members=członkowie
|
||||
lower_repositories=repozytoria
|
||||
create_new_team=Utwórz nowy zespół
|
||||
org_desc=Opis
|
||||
team_name=Nazwa zespołu
|
||||
team_desc=Opis
|
||||
team_name_helper=Będziesz używał tej nazwy do wywoływania tego zespołu w dyskusjach.
|
||||
team_desc_helper=Czym zajmuje się ten zespół?
|
||||
team_permission_desc=Jaki poziom uprawnień powinien mieć ten zespół?
|
||||
|
||||
form.name_reserved=Nazwa organizacji "%s" jest zarezerwowana.
|
||||
form.name_pattern_not_allowed=Wzorzec nazwy organizacji "%s" jest niedozwolony.
|
||||
|
||||
settings=Ustawienia
|
||||
settings.options=Opcje
|
||||
settings.full_name=Imię i Nazwisko
|
||||
settings.website=Strona
|
||||
settings.location=Lolalizacja
|
||||
settings.update_settings=Aktualizuj ustawienia
|
||||
settings.change_orgname=Zmieniono nazwę organizacji
|
||||
settings.change_orgname_desc=Zmieniono nazwę organizacji. Wpływa to na powiązanie odnośników z organizacją. Czy chcesz kontynuować?
|
||||
settings.update_setting_success=Ustawienia organizacji zostały pomyślnie zaktualizowane.
|
||||
settings.delete=Usuń Organizację
|
||||
settings.delete_account=Usuń tą organizację
|
||||
settings.delete_prompt=Organizacja zostanie trwale usunięta, a to <strong>NIE MOŻE</strong> być cofnięte!
|
||||
settings.confirm_delete_account=Potwierdź usunięcie
|
||||
settings.delete_org_title=Usunięcie organizacji
|
||||
settings.delete_org_desc=Ta organizacja zostanie trwale usunięta, czy chcesz kontynuować?
|
||||
settings.hooks_desc=Add webhooks that will be triggered for <strong>all repositories</strong> under this organization.
|
||||
|
||||
members.public=Publiczne
|
||||
members.public_helper=sprywatyzuj
|
||||
members.private=Prywatne
|
||||
members.private_helper=upublicznij
|
||||
members.owner=Właściciel
|
||||
members.member=Członek
|
||||
members.conceal=Ukryj
|
||||
members.remove=Usuń
|
||||
members.leave=Opuść
|
||||
members.invite_desc=Zacznij wpisywać nazwę użytkownika by zaprosić nowego członka do %s:
|
||||
members.invite_now=Zaproś teraz
|
||||
|
||||
teams.join=Dołącz
|
||||
teams.leave=Opuść
|
||||
teams.read_access=Dostęp do odczytu
|
||||
teams.read_access_helper=Ten zespół będzie mógł wyświetlać i klonować swoje repozytoria.
|
||||
teams.write_access=Dostęp do zapisu
|
||||
teams.write_access_helper=Ten zespół będzie mógł odczytywać i wysyłać do swoich repozytoriów.
|
||||
teams.admin_access=Uprawnienia admina
|
||||
teams.admin_access_helper=Ten zespół będzie mógł wysyłać i pobierać swoje repozytoria, oraz dodawać do nich współpracowników.
|
||||
teams.no_desc=Ten zespół nie ma opisu
|
||||
teams.settings=Ustawienia
|
||||
teams.owners_permission_desc=Właściciele mają pełny dostęp do <strong>wszystkich repozytoriów</strong> i mają <strong>prawa administratora</strong> w organizacji.
|
||||
teams.members=Członkowie zespołu
|
||||
teams.update_settings=Aktualizuj ustawienia
|
||||
teams.delete_team=Usuń ten zespół
|
||||
teams.add_team_member=Dodaj członka zespołu
|
||||
teams.delete_team_title=Usuwanie zespołu
|
||||
teams.delete_team_desc=Ten zespół zostanie usunięty, czy na pewno chcesz kontynuować? Jego członkowie mogą utracić dostęp do części repozytoriów.
|
||||
teams.delete_team_success=Zespół został usunięty pomyślnie.
|
||||
teams.read_permission_desc=Ten zespół daje dostęp do <strong>odczytu</strong>: członkowie mogą wyświetlać i klonować repozytoria zespołu.
|
||||
teams.write_permission_desc=Ten zespół daje dostęp do <strong>zapisu</strong>: członkowie mogą wyświetlać i wysyłać do repozytoriów zespołu.
|
||||
teams.admin_permission_desc=Ten zespół daje dostęp <strong>pełny</strong>: członkowie mogą wyświetlać, wysyłać i dodawać współpracowników do repozytoriów zespołu.
|
||||
teams.repositories=Repozytoria zespołu
|
||||
teams.add_team_repository=Dodaj repozytorium zespołu
|
||||
teams.remove_repo=Usuń
|
||||
teams.add_nonexistent_repo=Repozytorium, które próbujesz dodać, nie istnieje, wpierw je utwórz.
|
||||
|
||||
[admin]
|
||||
dashboard=Pulpit
|
||||
users=Użytkownicy
|
||||
organizations=Organizacje
|
||||
repositories=Repozytoria
|
||||
authentication=Uwierzytelnienia
|
||||
config=Konfiguracja
|
||||
notices=Powiadomienia systemowe
|
||||
monitor=Monitorowanie
|
||||
prev=Wstecz
|
||||
next=Następny
|
||||
|
||||
dashboard.statistic=Statystyki
|
||||
dashboard.operations=Operacje
|
||||
dashboard.system_status=Stan monitora systemu
|
||||
dashboard.statistic_info=Baza danych Gogs zawiera <b>%d</b> użytkowników, <b>%d</b> organizacji, <b>%d</b> kluczy publicznych, <b>%d</b> repozytoriów, <b>%d</b> obserwujących, <b>%d</b> polubionych, <b>%d</b> akcji, <b>%d</b> tokenów, <b>%d</b> problemów, <b>%d</b> komenatrzy, <b>%d</b> kont społecznościowych, <b>%d</b> obserwacji, <b>%d</b> mirrorów, <b>%d</b> wydań, <b>%d</b> login sources, <b>%d</b> webhooków, <b>%d</b> kamieni milowych, <b>%d</b> labels, <b>%d</b> zadań hooków, <b>%d</b> zespołów, <b>%d</b> zadań aktualizacji, <b>%d</b> załączników.
|
||||
dashboard.operation_name=Nazwa operacji
|
||||
dashboard.operation_switch=Przełącz
|
||||
dashboard.operation_run=Uruchom
|
||||
dashboard.clean_unbind_oauth=Usuń niepowiązane wpisy OAuth
|
||||
dashboard.clean_unbind_oauth_success=Wszystkie niepowiązane wpisy OAuth zostały pomyślnie usunięte.
|
||||
dashboard.delete_inactivate_accounts=Usuń wszystkie nieaktywne konta
|
||||
dashboard.delete_inactivate_accounts_success=Wszystkie nieaktywne konta zostały usunięte pomyślnie.
|
||||
dashboard.delete_repo_archives=Usuń wszystkie archiwa repozytoriów
|
||||
dashboard.delete_repo_archives_success=Pomyślnie usunięto wszystkie archiwa repozytoriów.
|
||||
dashboard.git_gc_repos=Usuń śmieci z repozytoriów
|
||||
dashboard.git_gc_repos_success=Wszystkie repozytoria zakończyły odśmiecanie pomyślnie.
|
||||
dashboard.resync_all_sshkeys=Przeładuj klucze publiczne w pliku '.ssh/authorized_keys' (uwaga: klucze poza Gogs zostaną usunięte)
|
||||
dashboard.resync_all_sshkeys_success=Przeładowanie kluczy publicznych zakończyło się sukcesem.
|
||||
dashboard.resync_all_update_hooks=Rewrite all update hook of repositories (needed when custom config path is changed)
|
||||
dashboard.resync_all_update_hooks_success=All repositories' update hook have been rewritten successfully.
|
||||
|
||||
dashboard.server_uptime=Uptime serwera
|
||||
dashboard.current_goroutine=Current Goroutines
|
||||
dashboard.current_memory_usage=Bieżące użycie pamięci
|
||||
dashboard.total_memory_allocated=Całkowita przydzielona pamięć
|
||||
dashboard.memory_obtained=Memory Obtained
|
||||
dashboard.pointer_lookup_times=Pointer Lookup Times
|
||||
dashboard.memory_allocate_times=Memory Allocate Times
|
||||
dashboard.memory_free_times=Memory Free Times
|
||||
dashboard.current_heap_usage=Bieżące użycie stosu
|
||||
dashboard.heap_memory_obtained=Heap Memory Obtained
|
||||
dashboard.heap_memory_idle=Heap Memory Idle
|
||||
dashboard.heap_memory_in_use=Użycie pamięci stosu
|
||||
dashboard.heap_memory_released=Heap Memory Released
|
||||
dashboard.heap_objects=Ilość obiektów na stercie
|
||||
dashboard.bootstrap_stack_usage=Bootstrap Stack Usage
|
||||
dashboard.stack_memory_obtained=Stack Memory Obtained
|
||||
dashboard.mspan_structures_usage=MSpan Structures Usage
|
||||
dashboard.mspan_structures_obtained=MSpan Structures Obtained
|
||||
dashboard.mcache_structures_usage=MCache Structures Usage
|
||||
dashboard.mcache_structures_obtained=MCache Structures Obtained
|
||||
dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained
|
||||
dashboard.gc_metadata_obtained=Ilość uzyskanych danych przez GC
|
||||
dashboard.other_system_allocation_obtained=Other System Allocation Obtained
|
||||
dashboard.next_gc_recycle=Następne wywołanie GC
|
||||
dashboard.last_gc_time=Czas od ostatniego wywołania GC
|
||||
dashboard.total_gc_time=Sumaryczny czas wstrzymania przez GC
|
||||
dashboard.total_gc_pause=Sumaryczny czas wstrzymania przez GC
|
||||
dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC
|
||||
dashboard.gc_times=Ilość wywołań GC
|
||||
|
||||
users.user_manage_panel=Panel zarządzania kontem użytkownika
|
||||
users.new_account=Załóż nowe konto
|
||||
users.name=Nazwa
|
||||
users.activated=Aktywowany
|
||||
users.admin=Admin
|
||||
users.repos=Repozytoria
|
||||
users.created=Utworzony
|
||||
users.edit=Edytuj
|
||||
users.auth_source=Źródła autoryzacji
|
||||
users.local=Lokalne
|
||||
users.auth_login_name=Login Autoryzacyjny
|
||||
users.update_profile_success=Profil konta został pomyślnie zaktualizowany.
|
||||
users.edit_account=Edytuj konto
|
||||
users.is_activated=To konto jest aktywne
|
||||
users.is_admin=To konto ma uprawnienia administratora
|
||||
users.allow_git_hook=To konto posiada uprawnienia do tworzenia skryptów Git
|
||||
users.update_profile=Zaktualizuj profil konta
|
||||
users.delete_account=Usuń to konto
|
||||
users.still_own_repo=Twoje konto jest dalej właścicielem repozytorium, musisz je usunąć lub przekazać.
|
||||
users.still_has_org=Twoje konto dalej posiada członkostwo w organizacji, musisz ją opuścić bądź usunąć.
|
||||
|
||||
orgs.org_manage_panel=Panel zarządzania organizacją
|
||||
orgs.name=Nazwa
|
||||
orgs.teams=Zespoły
|
||||
orgs.members=Członkowie
|
||||
|
||||
repos.repo_manage_panel=Panel zarządzania repozytorium
|
||||
repos.owner=Właściciel
|
||||
repos.name=Nazwa
|
||||
repos.private=Prywatne
|
||||
repos.watches=Obserwujących
|
||||
repos.stars=Polubienia
|
||||
repos.issues=Problemy
|
||||
|
||||
auths.auth_manage_panel=Zarzadzanie Autoryzacja
|
||||
auths.new=Dodaj nowe źródło autoryzacji
|
||||
auths.name=Nazwa
|
||||
auths.type=Typ
|
||||
auths.enabled=Włączono
|
||||
auths.updated=Zaktualizowano
|
||||
auths.auth_type=Typ autoryzacji
|
||||
auths.auth_name=Nazwa autoryzacji
|
||||
auths.domain=Domena
|
||||
auths.host=Host
|
||||
auths.port=Port
|
||||
auths.base_dn=Base DN
|
||||
auths.attribute_username=Atrybut username
|
||||
auths.attribute_name=Atrybut imienia
|
||||
auths.attribute_surname=Atrybut nazwiska
|
||||
auths.attribute_mail=Atrybut email
|
||||
auths.filter=Filtr wyszukiwania
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=Typ autoryzacji SMTP
|
||||
auths.smtphost=Serwer SMTP
|
||||
auths.smtpport=Port SMTP
|
||||
auths.enable_tls=Włącz szyfrowanie TLS
|
||||
auths.pam_service_name=Nazwa usługi PAM
|
||||
auths.enable_auto_register=Włącz automatyczną rejestrację
|
||||
auths.tips=Wskazówki
|
||||
auths.edit=Edytuj ustawienia autoryzacji
|
||||
auths.activated=To uwierzytelnienie zostało aktywowane
|
||||
auths.update_success=Ustawienia uwierzytelnienia zostały zaktualizowane pomyślnie.
|
||||
auths.update=Zaktualizuj ustawienia autoryzacji
|
||||
auths.delete=Usuń tą autoryzację
|
||||
auths.delete_auth_title=Usuwanie autoryzacji
|
||||
auths.delete_auth_desc=To uwierzytelnienie zostanie usunięte, czy chcesz kontynuować?
|
||||
|
||||
config.server_config=Konfiguracja serwera
|
||||
config.app_name=Nazwa Aplikacji
|
||||
config.app_ver=Wersja aplikacji
|
||||
config.app_url=Adres URL aplikacji
|
||||
config.domain=Domena
|
||||
config.offline_mode=Tryb offline
|
||||
config.disable_router_log=Wyłącz dziennik routera
|
||||
config.run_user=Nazwa użytkownika uruchomieniowego
|
||||
config.run_mode=Tryb uruchamienia
|
||||
config.repo_root_path=Ścieżka repozytoriów
|
||||
config.static_file_root_path=Ścieżka plików statycznych
|
||||
config.log_file_root_path=Ścieżka plików dziennika
|
||||
config.script_type=Typ skryptu
|
||||
config.reverse_auth_user=Użytkownik dostarczony przez odwrotne proxy
|
||||
config.db_config=Konfiguracja bazy danych
|
||||
config.db_type=Typ
|
||||
config.db_host=Host
|
||||
config.db_name=Nazwa
|
||||
config.db_user=Użytkownik
|
||||
config.db_ssl_mode=Tryb SSL
|
||||
config.db_ssl_mode_helper=(tylko dla "postgres")
|
||||
config.db_path=Ścieżka
|
||||
config.db_path_helper=(tylko dla "sqlite3")
|
||||
config.service_config=Konfiguracja usługi
|
||||
config.register_email_confirm=Wymagaj potwierdzenia e-mail
|
||||
config.disable_register=Wyłącz rejestrację
|
||||
config.show_registration_button=Pokazuj przycisk rejestracji
|
||||
config.require_sign_in_view=Wymagaj bycia zalogowanym
|
||||
config.mail_notify=Powiadomienia e-mail
|
||||
config.enable_cache_avatar=Włącz cache awatarów
|
||||
config.active_code_lives=Ważność kodów aktywacyjnych
|
||||
config.reset_password_code_lives=Czas życia kodu resetowania hasła
|
||||
config.webhook_config=Konfiguracja skryptów internetowych
|
||||
config.task_interval=Interwał zadań
|
||||
config.deliver_timeout=Limit czasu zdarzenia
|
||||
config.skip_tls_verify=Pomiń weryfikację protokołu TLS
|
||||
config.mailer_config=Konfiguracja poczty
|
||||
config.mailer_enabled=Aktywne
|
||||
config.mailer_disable_helo=Wyłącz HELO
|
||||
config.mailer_name=Nazwa
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Użytkownik
|
||||
config.oauth_config=Konfiguracja OAuth
|
||||
config.oauth_enabled=Aktywne
|
||||
config.cache_config=Konfiguracja cache
|
||||
config.cache_adapter=Adapter cache
|
||||
config.cache_interval=Interwał pamięci podręcznej
|
||||
config.cache_conn=Połączenie z pamięcią podręczną
|
||||
config.session_config=Konfiguracja sesji
|
||||
config.session_provider=Dostawca sesji
|
||||
config.provider_config=Konfiguracja dostawcy
|
||||
config.cookie_name=Nazwa ciasteczka
|
||||
config.enable_set_cookie=Włącz ciasteczka
|
||||
config.gc_interval_time=Interwał odśmiecania
|
||||
config.session_life_time=Czas życia sesji
|
||||
config.https_only=Tylko HTTPS
|
||||
config.cookie_life_time=Czas życia ciasteczka
|
||||
config.picture_config=Ustawienia obrazów
|
||||
config.picture_service=Serwis obrazów
|
||||
config.disable_gravatar=Wyłącz Gravatara
|
||||
config.log_config=Konfiguracja dziennika
|
||||
config.log_mode=Tryb dziennika
|
||||
|
||||
monitor.cron=Zadania cron
|
||||
monitor.name=Nazwa
|
||||
monitor.schedule=Harmonogram
|
||||
monitor.next=Następny czas
|
||||
monitor.previous=Poprzedni czas
|
||||
monitor.execute_times=Czas wykonania
|
||||
monitor.process=Procesy
|
||||
monitor.desc=Opis
|
||||
monitor.start=Czas rozpoczęcia
|
||||
monitor.execute_time=Czas wykonania
|
||||
|
||||
notices.system_notice_list=Powiadomienia systemu
|
||||
notices.type=Typ
|
||||
notices.type_1=Repozytorium
|
||||
notices.desc=Opis
|
||||
notices.op=Op.
|
||||
notices.delete_success=Powiadomienia systemowe zostały usunięte pomyślnie.
|
||||
|
||||
[action]
|
||||
create_repo=utworzono repozytorium <a href="%s"> %s</a>
|
||||
commit_repo=wypchnął do <a href="%s/src/%s">%[2]s</a> w <a href="%[1]s"> %[3]s</a>
|
||||
create_issue=`zgłosił problem <a href="%s/issues/%s">#%[2]s %[3]s</a>`
|
||||
comment_issue=`skomentował problem <a href="%s/issues/%s">#%[2]s %[3]s</a>`
|
||||
transfer_repo=przeniósł repozytorium <code>%s</code> do <a href="%s">%s</a>
|
||||
push_tag=opublikował tag <a href="%s/src/%s">%[2]s</a> w <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits=Zobacz porównanie tych 2 commitów
|
||||
|
||||
[tool]
|
||||
ago=temu
|
||||
from_now=od teraz
|
||||
now=teraz
|
||||
1s=1 sekundę %s
|
||||
1m=1 minutę %s
|
||||
1h=1 godzinę %s
|
||||
1d=1 dzień %s
|
||||
1w=1 tydzień %s
|
||||
1mon=1 miesiąc %s
|
||||
1y=1 rok %s
|
||||
seconds=%d sekund %s
|
||||
minutes=%d minut %s
|
||||
hours=%d godzin %s
|
||||
days=%d dni %s
|
||||
weeks=%d tygodni %s
|
||||
months=%d miesięcy %s
|
||||
years=%d lat %s
|
||||
raw_seconds=sekund
|
||||
raw_minutes=minut
|
||||
|
||||
798
conf/locale/locale_pt-BR.ini
Executable file
798
conf/locale/locale_pt-BR.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Um serviço de Git auto-hospedado e amigável escrito em Go
|
||||
|
||||
home=Página Inicial
|
||||
dashboard=Painel de controle
|
||||
explore=Explorar
|
||||
help=Ajuda
|
||||
sign_in=Entrar
|
||||
social_sign_in=Entrada Social: 2ª etapa <small>associar uma conta</small>
|
||||
sign_out=Sair
|
||||
sign_up=Cadastrar
|
||||
register=Registrar
|
||||
website=Site
|
||||
version=Versão
|
||||
page=Página
|
||||
template=Modelo
|
||||
language=Idioma
|
||||
|
||||
username=Usuário
|
||||
email=E-mail
|
||||
password=Senha
|
||||
re_type=Redigite
|
||||
captcha=Captcha
|
||||
|
||||
repository=Repositório
|
||||
organization=Organização
|
||||
mirror=Espelho
|
||||
new_repo=Novo Repositório
|
||||
new_migrate=Nova Migração
|
||||
new_fork=Novo Fork de Repositório
|
||||
new_org=Nova Organização
|
||||
manage_org=Gerenciar Organizações
|
||||
admin_panel=Painel do Administrador
|
||||
account_settings=Configurações da Conta
|
||||
settings=Configurações
|
||||
|
||||
news_feed=Feed de Notícias
|
||||
pull_requests=Solicitações de Pull
|
||||
issues=Problemas
|
||||
|
||||
cancel=Cancelar
|
||||
|
||||
[search]
|
||||
search=Pesquisar...
|
||||
repository=Repositório
|
||||
user=Usuário
|
||||
issue=Problema
|
||||
code=Código
|
||||
|
||||
[install]
|
||||
install=Instalação
|
||||
title=Etapas de instalação para Primeira Execução
|
||||
requite_db_desc=Gogs requer MySQL, PostgreSQL ou SQLite3.
|
||||
db_title=Configurações de Banco de Dados
|
||||
db_type=Tipo do Banco de Dados
|
||||
host=Host
|
||||
user=Usuário
|
||||
password=Senha
|
||||
db_name=Nome do Banco de Dados
|
||||
db_helper=Por favor, use o mecanismo INNODB com o conjunto de caracteres utf8_general_ci para MySQL.
|
||||
ssl_mode=Modo SSL
|
||||
path=Caminho
|
||||
sqlite_helper=O caminho do arquivo do banco de dados do SQLite3.
|
||||
err_empty_sqlite_path=O caminho do arquivo de banco de dados SQLite3 não pode estar em branco.
|
||||
|
||||
general_title=Configurações Gerais do Gogs
|
||||
app_name=Nome do Aplicativo
|
||||
app_name_helper=Coloque o nome da sua organização aqui!
|
||||
repo_path=Caminho da Raiz do Repositório
|
||||
repo_path_helper=Todos os repositórios remotos do Git serão salvos neste diretório.
|
||||
run_user=Executar Usuário
|
||||
run_user_helper=O usuário deve ter acesso ao caminho raiz do repositório e executar o Gogs
|
||||
domain=Domínio
|
||||
domain_helper=Isto afeta URLs para clonagem via SSH.
|
||||
http_port=Porta HTTP
|
||||
http_port_helper=Número da porta em que a aplicação irá executar.
|
||||
app_url=URL do Aplicativo
|
||||
app_url_helper=Isto afeta a URL de clonagem via HTTP/HTTPs e também o email.
|
||||
|
||||
optional_title=Configurações Opcionais
|
||||
email_title=Configurações do Serviço de E-mail
|
||||
smtp_host=Host SMTP
|
||||
smtp_from=De
|
||||
smtp_from_helper=O endereço de email deve atender a especificação RFC 5322. O formato deve ser um email ou "Nome" <email@example.com>.
|
||||
mailer_user=E-mail do Remetente
|
||||
mailer_password=Senha do Remetente
|
||||
register_confirm=Habilitar Confirmação de Registro
|
||||
mail_notify=Habilitar Notificação de Correio
|
||||
server_service_title=Configurações de Servidor e Outros Serviços
|
||||
offline_mode=Ativar Modo Offline
|
||||
offline_mode_popup=Desative o CDN mesmo em modo de produção, todos os recursos serão disponibilizados localmente.
|
||||
disable_registration=Desativar auto-registro
|
||||
disable_registration_popup=Desativar o auto-registro de usuário, para que somente o administrador possa criar contas.
|
||||
require_sign_in_view=Requerer autenticação para a visualização de páginas
|
||||
require_sign_in_view_popup=Somente usuários autenticados podem ver todas as páginas, visitantes somente podem entrar ou se cadastrar.
|
||||
admin_setting_desc=Você não precisa criar uma conta de administrador agora, no entanto o primeiro usuário (ID=1) automaticamente terá acesso de administrador.
|
||||
admin_title=Configurações da Conta de Administrador
|
||||
admin_name=Nome de Usuário
|
||||
admin_password=Senha
|
||||
confirm_password=Confirmar Senha
|
||||
admin_email=E-mail
|
||||
install_gogs=Instalar Gogs
|
||||
test_git_failed=Falha ao testar o comando 'git': %v
|
||||
sqlite3_not_available=Sua versão não suporta SQLite3, por favor faça o download da versão binária oficial em %s, NÃO da versão gobuild.
|
||||
invalid_db_setting=Configuração do banco de dados não está correta: %v
|
||||
invalid_repo_path=A raiz do repositório é inválida: %v
|
||||
run_user_not_match=O usuário da execução não é o usuário atual: %s -> %s
|
||||
save_config_failed=Falha ao salvar a configuração: %v
|
||||
invalid_admin_setting=Configuração da conta de administrador está inválida: %v
|
||||
install_success=Bem-vindo! Estamos contentes que você escolheu o Gogs, divirta-se e tenha cuidado.
|
||||
|
||||
[home]
|
||||
uname_holder=Nome de Usuário ou E-mail
|
||||
password_holder=Senha
|
||||
switch_dashboard_context=Trocar Contexto do Painel de Controle
|
||||
my_repos=Meus Repositórios
|
||||
collaborative_repos=Repositórios Colaborativos
|
||||
my_orgs=Minhas Organizações
|
||||
my_mirrors=Meus Espelhos
|
||||
|
||||
[explore]
|
||||
repos=Repositórios
|
||||
|
||||
[auth]
|
||||
create_new_account=Criar Nova Conta
|
||||
register_hepler_msg=Já tem uma conta? Entre agora!
|
||||
social_register_hepler_msg=Já tem uma conta? Junte-se agora!
|
||||
disable_register_prompt=Desculpe, novos registros estão desabilitados. Por favor entre em contato com o administrador do site.
|
||||
disable_register_mail=Desculpe, a confirmação de registro por email foi desabilitada.
|
||||
remember_me=Lembrar de Mim
|
||||
forgot_password=Esqueci a Senha
|
||||
forget_password=Esqueceu a senha?
|
||||
sign_up_now=Precisa de uma conta? Cadastre-se agora.
|
||||
confirmation_mail_sent_prompt=Um novo e-mail de confirmação foi enviado para <b>%s</b>, por favor, verifique sua caixa de entrada nas próximas %d horas para completar seu registro.
|
||||
sign_in_email=Entre com seu e-mail
|
||||
active_your_account=Ativar Sua Conta
|
||||
resent_limit_prompt=Desculpe, você está enviando um e-mail de ativação com muita frequência. Por favor, aguarde 3 minutos.
|
||||
has_unconfirmed_mail=Oi %s, você possui um endereço de e-mail não confirmado (<b>%s</b>). Se você não recebeu um e-mail de confirmação ou precisa reenviar um novo, clique no botão abaixo.
|
||||
resend_mail=Clique aqui para reenviar seu e-mail de ativação
|
||||
email_not_associate=Este endereço de e-mail não é associado à nenhuma conta.
|
||||
send_reset_mail=Clique aqui para (re)enviar seu e-mail de redefinição da senha
|
||||
reset_password=Redefinir Sua Senha
|
||||
invalid_code=Desculpe, seu código de confirmação expirou ou não é válido.
|
||||
reset_password_helper=Clique aqui para redefinir sua senha
|
||||
password_too_short=O comprimento da senha não pode ser menor que 6.
|
||||
|
||||
[modal]
|
||||
yes=Sim
|
||||
no=Não
|
||||
modify=Alterar
|
||||
|
||||
[form]
|
||||
UserName=Nome de usuário
|
||||
RepoName=Nome do repositório
|
||||
Email=Endereço de e-mail
|
||||
Password=Senha
|
||||
Retype=Redigite a senha
|
||||
SSHTitle=Nome da chave SSH
|
||||
HttpsUrl=URL HTTPS
|
||||
PayloadUrl=URL de carga
|
||||
TeamName=Nome da equipe
|
||||
AuthName=Nome de autorização
|
||||
AdminEmail=E-mail do Administrador
|
||||
|
||||
require_error=` não pode estar vazio.`
|
||||
alpha_dash_error=` devem ser caracteres alfanuméricos ou hífen (-) ou sublinhado (_).`
|
||||
alpha_dash_dot_error=` devem ser caracteres alfanuméricos ou hífen (-) ou sublinhado (_).`
|
||||
size_error=` deve ter %s.`
|
||||
min_size_error=` deve conter pelo menos %s caracteres.`
|
||||
max_size_error=` deve conter no máximo %s caracteres.`
|
||||
email_error=` não é um endereço de e-mail válido.`
|
||||
url_error=`não é uma URL válida.`
|
||||
unknown_error=Erro desconhecido:
|
||||
captcha_incorrect=O captcha não correspondeu.
|
||||
password_not_match=Senha e confirmar senha não são as mesmas.
|
||||
|
||||
username_been_taken=Nome de usuário já foi tomado.
|
||||
repo_name_been_taken=Nome do repositório já foi tomado.
|
||||
org_name_been_taken=Nome da organização já foi tomado.
|
||||
team_name_been_taken=Nome da equipe já foi tomado.
|
||||
email_been_used=Endereço de e-mail já foi usado.
|
||||
ssh_key_been_used=Nome da chave pública foi usado.
|
||||
illegal_team_name=O nome da equipe contém caracteres ilegais.
|
||||
username_password_incorrect=Usuário ou senha incorretos.
|
||||
enterred_invalid_repo_name=Por favor certifique-se que informou o nome do repositório corretamente.
|
||||
enterred_invalid_owner_name=Por favor, verifique se o nome do proprietário está correto.
|
||||
enterred_invalid_password=Por favor, verifique se a senha que você digitou está correta.
|
||||
user_not_exist=O usuário dado não existe.
|
||||
last_org_owner=O usuário a ser removido é o último membro na equipe de proprietários. Deve haver um outro proprietário.
|
||||
|
||||
invalid_ssh_key=Desculpe, não conseguimos verificar a sua chave SSH: %s
|
||||
unable_verify_ssh_key=Gogs não pode verificar sua chave SSH, mas assumimos que é válida, por favor, verifique a chave pessoalmente.
|
||||
auth_failed=A autenticação falhou: %v
|
||||
|
||||
still_own_repo=Sua conta ainda tem propriedade do repositório, você tem que excluir ou transferí-la primeiro.
|
||||
still_has_org=Sua conta ainda faz parte da organização, você deve sair ou excluí-la primeiro.
|
||||
org_still_own_repo=Esta organização ainda tem a propriedade do repositório, você deve excluir ou transferí-la primeiro.
|
||||
|
||||
still_own_user=Esta autenticação ainda é usada por alguns usuários, você deve movê-los e depois apagar novamente.
|
||||
|
||||
target_branch_not_exist=O ramo de destino não existe.
|
||||
|
||||
[user]
|
||||
change_avatar=Altere o seu avatar em gravatar.com
|
||||
change_custom_avatar=Altere seu avatar nas configurações
|
||||
join_on=Inscreveu-se em
|
||||
repositories=Repositórios
|
||||
activity=Atividade Pública
|
||||
followers=Seguidores
|
||||
starred=Marcado
|
||||
following=Seguindo
|
||||
|
||||
form.name_reserved=O nome de usuário '%s' não pode ser usado.
|
||||
form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de usuário.
|
||||
|
||||
[settings]
|
||||
profile=Perfil
|
||||
password=Senha
|
||||
ssh_keys=Chaves SSH
|
||||
social=Contas Sociais
|
||||
applications=Aplicativos
|
||||
orgs=Organizações
|
||||
delete=Deletar Conta
|
||||
uid=Uid
|
||||
|
||||
public_profile=Perfil Público
|
||||
profile_desc=Seu endereço de E-mail é publico e será usado para qualquer notificação relacionada à conta, e qualquer operação na web feita através do site.
|
||||
full_name=Nome Completo
|
||||
website=Site
|
||||
location=Localização
|
||||
update_profile=Atualizar o Perfil
|
||||
update_profile_success=O seu perfil foi atualizado com sucesso.
|
||||
change_username=Nome de Usuário Alterado
|
||||
change_username_desc=O nome de usuário foi alterado, você quer continuar? Isto afetará todos os links relacionados à sua conta.
|
||||
continue=Continuar
|
||||
cancel=Cancelar
|
||||
|
||||
enable_custom_avatar=Habilitar Avatar Customizado
|
||||
enable_custom_avatar_helper=Habilite para desativar a busca no Gravatar
|
||||
choose_new_avatar=Escolha um novo avatar
|
||||
update_avatar=Atualizar configuração de Avatar
|
||||
uploaded_avatar_not_a_image=O arquivo enviado não é uma imagem.
|
||||
no_custom_avatar_available=Nenhum avatar personalizado disponível, não pode habilitá-lo.
|
||||
update_avatar_success=Sua configuração de avatar foi atualizada com sucesso.
|
||||
|
||||
change_password=Alterar a Senha
|
||||
old_password=Senha Atual
|
||||
new_password=Nova Senha
|
||||
password_incorrect=A senha atual não está correta.
|
||||
change_password_success=A senha está alterada com sucesso. Você pode agora entrar com a senha nova.
|
||||
|
||||
emails=Endereços de E-mail
|
||||
manage_emails=Gerenciar endereços de e-mail
|
||||
email_desc=Seu endereço de email principal será usado para notificações e outras operações.
|
||||
primary=Principal
|
||||
primary_email=Definir como principal
|
||||
delete_email=Deletar
|
||||
add_new_email=Adicionar novo endereço de e-mail
|
||||
add_email=Adicionar e-mail
|
||||
add_email_confirmation_sent=Um novo e-mail de confirmação foi enviado para <b>%s</b>. Por favor, verifique sua Caixa de Entrada dentro das próximas %d horas, para concluir o processo de confirmação.
|
||||
add_email_success=Seu novo endereço de E-mail foi adicionado com sucesso.
|
||||
|
||||
manage_ssh_keys=Gerenciar Chaves SSH
|
||||
add_key=Adicionar Chave
|
||||
ssh_desc=Esta é uma lista de chaves SSH associadas com a sua conta. Remova quaisquer chaves que você não reconheç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
|
||||
key_name=Nome da Chave
|
||||
key_content=Conteúdo
|
||||
add_key_success=Nova Chave SSH foi adicionada!
|
||||
delete_key=Deletar
|
||||
add_on=Adicionado em
|
||||
last_used=Última vez usado em
|
||||
no_activity=Nenhuma atividade recente
|
||||
|
||||
manage_social=Gerenciar Contas Sociais Associadas
|
||||
social_desc=Esta é uma lista de contas sociais. Remova qualquer ligação que você não reconheça.
|
||||
unbind=Desvincular
|
||||
unbind_success=A conta social foi desvinculada.
|
||||
|
||||
manage_access_token=Gerenciar Tokens de Acesso Pessoal
|
||||
generate_new_token=Gerar novo Token
|
||||
tokens_desc=Tokens gerados por você que podem ser usados para acessar a API Gogs.
|
||||
new_token_desc=Por enquanto, todo token terá acesso completo à sua conta.
|
||||
token_name=Nome do Token
|
||||
generate_token=Gerar Token
|
||||
generate_token_succees=Novo token de acesso gerado com sucesso! Certifique-se de copiar seu novo token de acesso pessoal agora. Você não poderá vê-lo novamente!
|
||||
delete_token=Excluir
|
||||
delete_token_success=Token de acesso pessoal deletado com sucesso! Não esqueça-se de atualizar seus aplicativos também.
|
||||
|
||||
delete_account=Deletar Sua Conta
|
||||
delete_prompt=A operação deletará sua conta permanentemente, e <strong>NÃO PODERÁ</strong> ser desfeita!
|
||||
confirm_delete_account=Confirmar Deleção
|
||||
delete_account_title=Deleção da Conta
|
||||
delete_account_desc=Esta conta será deletada permanentemente, você quer continuar?
|
||||
|
||||
[repo]
|
||||
owner=Dono
|
||||
repo_name=Nome do Repositório
|
||||
repo_name_helper=Nomes de repositórios bons são pequenos, memorizáveis e <strong>únicos</strong>.
|
||||
visibility=Visibilidade
|
||||
visiblity_helper=Este repositório é <span class="label label-red label-radius">Privado</span>
|
||||
fork_repo=Fork o Repositório
|
||||
fork_from=Fork de
|
||||
fork_visiblity_helper=Não é possível alterar a visibilidade de um repositório bifurcado
|
||||
repo_desc=Descrição
|
||||
repo_lang=Idioma
|
||||
repo_lang_helper=Selecione um arquivo .gitignore
|
||||
license=Licença
|
||||
license_helper=Selecione um arquivo de licença
|
||||
init_readme=Inicialize este repositório com um LEIAME.md
|
||||
create_repo=Criar Repositório
|
||||
default_branch=Ramo padrão
|
||||
mirror_interval=Intervalo de Espelho (hora)
|
||||
|
||||
form.name_reserved=O nome de repositório '%s' não pode ser usado.
|
||||
form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de repositório.
|
||||
|
||||
need_auth=Precisa de Autorização
|
||||
migrate_type=Tipo de Migração
|
||||
migrate_type_helper=Este repositório será um <span class="label label-blue label-radius">Espelho</span>
|
||||
migrate_repo=Migrar Repositório
|
||||
migrate.clone_address=Endereço de Clone
|
||||
migrate.invalid_local_path=Caminho local inválido, não existe ou não é um diretório.
|
||||
|
||||
forked_from=bifurcação de
|
||||
fork_from_self=Você não pode criar fork de um repositório que já é seu!
|
||||
copy_link=Copiar
|
||||
click_to_copy=Copiar para a área de transferência
|
||||
copied=Copiado com sucesso
|
||||
clone_helper=Precisa de ajuda com a clonagem? Visite a <a target="_blank" href="%s">Ajuda</a>!
|
||||
unwatch=Deixar de Observar
|
||||
watch=Observar
|
||||
unstar=Remover favorito
|
||||
star=Favorito
|
||||
fork=Fork
|
||||
|
||||
no_desc=Nenhuma Descrição
|
||||
quick_guide=Guia Rápido
|
||||
clone_this_repo=Clonar este repositório
|
||||
create_new_repo_command=Criar um novo repositório na linha de comando
|
||||
push_exist_repo=Push um repositório existente na linha de comando
|
||||
|
||||
branch=Ramo
|
||||
tree=Árvore
|
||||
branch_and_tags=Ramos & Tags
|
||||
branches=Ramos
|
||||
tags=Tags
|
||||
issues=Problemas
|
||||
labels=Etiquetas
|
||||
milestones=Marcos
|
||||
commits=Commits
|
||||
releases=Lançamentos
|
||||
file_raw=Cru
|
||||
file_history=Histórico
|
||||
file_view_raw=Ver cru
|
||||
file_permalink=Link permanente
|
||||
|
||||
commits.commits=Commits
|
||||
commits.search=Pesquisar commits
|
||||
commits.find=Buscar
|
||||
commits.author=Autor
|
||||
commits.message=Mensagem
|
||||
commits.date=Data
|
||||
commits.older=Mais Antigo
|
||||
commits.newer=Mais Novo
|
||||
|
||||
issues.new=Novo problema
|
||||
issues.new_label=Nova etiqueta
|
||||
issues.new_label_placeholder=Nome de etiqueta...
|
||||
issues.open_tab=%d aberto
|
||||
issues.close_tab=%d fechado
|
||||
issues.filter_label=Etiqueta
|
||||
issues.filter_label_no_select=Nenhuma etiqueta selecionada
|
||||
issues.filter_milestone=Marco
|
||||
issues.filter_assignee=Atribuído
|
||||
issues.filter_type=Tipo
|
||||
issues.filter_type.all_issues=Todos os problemas
|
||||
issues.filter_type.assigned_to_you=Atribuídos a você
|
||||
issues.filter_type.created_by_you=Criados por você
|
||||
issues.filter_type.mentioning_you=Mencionando você
|
||||
issues.opened_by=%[1]s foi aberto por <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Página anterior
|
||||
issues.next=Próxima página
|
||||
issues.label_title=Nome da etiqueta
|
||||
issues.label_color=Cor da etiqueta
|
||||
issues.label_count=%d etiquetas
|
||||
issues.label_open_issues=%d problemas abertos
|
||||
issues.label_edit=Editar
|
||||
issues.label_delete=Excluir
|
||||
issues.label_modify=Alteração de etiqueta
|
||||
issues.label_deletion=Exclusão de etiqueta
|
||||
issues.label_deletion_desc=Excluir uma etiqueta a retirará de todos os problemas que ela estiver marcando. Quer mesmo continuar?
|
||||
issues.label_deletion_success=A etiqueta foi excluída com sucesso!
|
||||
|
||||
settings=Configurações
|
||||
settings.options=Opções
|
||||
settings.collaboration=Colaboração
|
||||
settings.hooks=Hooks da web
|
||||
settings.githooks=Hooks do Git
|
||||
settings.deploy_keys=Chaves de Deploy
|
||||
settings.basic_settings=Configurações Básicas
|
||||
settings.danger_zone=Zona de Perigo
|
||||
settings.site=Site Oficial
|
||||
settings.update_settings=Configurações de Atualização
|
||||
settings.change_reponame=Nome do Repositório Alterado
|
||||
settings.change_reponame_desc=O nome do repositório foi alterado, você quer continuar? Isto afetará todos os links relacionados à este repositório.
|
||||
settings.transfer=Transferir Propriedade
|
||||
settings.transfer_desc=Transferir este repositório para outro usuário ou para uma organização onde você tem direitos de administrador.
|
||||
settings.new_owner_has_same_repo=O novo dono já tem um repositório com o mesmo nome.
|
||||
settings.delete=Deletar Este Repositório
|
||||
settings.delete_desc=Uma vez que você deleta um repositório, não tem volta. Por favor, tenha certeza.
|
||||
settings.transfer_notices=<p>- Você perderá acesso se o novo dono é um usuário individual.</p><p>- Você permanecerá com o acesso se o novo dono é uma organização e você é um dos donos.</p>
|
||||
settings.update_settings_success=As opções do repositório foram atualizadas com sucesso.
|
||||
settings.transfer_owner=Novo Dono
|
||||
settings.make_transfer=Fazer Transferência
|
||||
settings.transfer_succeed=A posse do repositório foi transferido com sucesso.
|
||||
settings.confirm_delete=Confirmar Deleção
|
||||
settings.add_collaborator=Adicionar um Novo Colaborador
|
||||
settings.add_collaborator_success=O novo colaborador foi adicionado.
|
||||
settings.remove_collaborator_success=O colaborador foi removido.
|
||||
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.hooks_desc=Hooks da web ou Webhooks permitem serviços externos serem notificados quando certos eventos acontecem no Gogs. 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" href="%s"> Guia de Webhooks</a>.
|
||||
settings.githooks_desc=Hooks do Git são ofertados pelo próprio Git, você pode editar arquivos de hooks suportados na lista abaixo para aplicar operações personalizadas.
|
||||
settings.githook_edit_desc=Se o hook não estiver ativo, o conteúdo de exemplo será apresentado. Deixar o conteúdo em branco irá desativar esse hook.
|
||||
settings.githook_name=Nome do Hook
|
||||
settings.githook_content=Conteúdo do Hook
|
||||
settings.update_githook=Atualizar Hook
|
||||
settings.remove_hook_success=O hook da web foi removido.
|
||||
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" href="%s">Webhooks Guide</a>.
|
||||
settings.payload_url=URL de carga
|
||||
settings.content_type=Tipo de Conteúdo
|
||||
settings.secret=Secreto
|
||||
settings.event_desc=Quais eventos você gostaria de acionar a esse hook da web?
|
||||
settings.event_push_only=Apenas o evento <code>push</code>.
|
||||
settings.active=Ativar
|
||||
settings.active_helper=Enviaremos detalhes do evento quando este hook for acionado.
|
||||
settings.add_hook_success=Novos hooks de web foram adicionados.
|
||||
settings.update_webhook=Atualizar Hook da Web
|
||||
settings.update_hook_success=Hook da web atualizado.
|
||||
settings.delete_webhook=Excluir Hook da Web
|
||||
settings.recent_deliveries=Entregas Recentes
|
||||
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.slack_token=Token
|
||||
settings.slack_domain=Domínio
|
||||
settings.slack_channel=Canal
|
||||
|
||||
diff.browse_source=Ver Fontes
|
||||
diff.parent=pai
|
||||
diff.commit=commit
|
||||
diff.data_not_available=Dados Diff não disponíveis.
|
||||
diff.show_diff_stats=Mostrar estatísticas do Diff
|
||||
diff.stats_desc=<strong> %d arquivos alterados</strong> com <strong>%d adições</strong> e <strong>%d exclusões</strong>
|
||||
diff.bin=BIN
|
||||
diff.view_file=Ver Arquivo
|
||||
|
||||
release.releases=Lançamentos
|
||||
release.new_release=Novo Lançamento
|
||||
release.draft=Rascunho
|
||||
release.prerelease=Pré-Lançamento
|
||||
release.stable=Estável
|
||||
release.edit=editar
|
||||
release.ahead=<strong>%d</strong> commits para %s depois desta versão
|
||||
release.source_code=Código-fonte
|
||||
release.tag_name=Nome da tag
|
||||
release.target=Destino
|
||||
release.tag_helper=Escolha uma tag existente, ou crie uma nova tag em publicar.
|
||||
release.release_title=Título da Versão
|
||||
release.content_with_md=Conteúdo com <a href="%s">Markdown</a>
|
||||
release.write=Escrever
|
||||
release.preview=Visualizar
|
||||
release.content_placeholder=Escreva algum conteúdo
|
||||
release.loading=Carregando...
|
||||
release.prerelease_desc=Esta é uma versão prévia
|
||||
release.prerelease_helper=Vou salientar que esta versão é identificada como não pronta para produção.
|
||||
release.publish=Publicar Versão
|
||||
release.save_draft=Salvar Rascunho
|
||||
release.edit_release=Editar Versão
|
||||
release.tag_name_already_exist=Já existiu versão com esse nome de tag.
|
||||
|
||||
[org]
|
||||
org_name_holder=Nome da Organização
|
||||
org_name_helper=Nomes de grandes organizações são curtos e memoráveis.
|
||||
org_email_helper=O E-mail da organização receberá todas as notificações e as confirmações.
|
||||
create_org=Criar Organização
|
||||
repo_updated=Atualizado
|
||||
people=Pessoas
|
||||
invite_someone=Convidar Alguém
|
||||
teams=Equipes
|
||||
lower_members=membros
|
||||
lower_repositories=repositórios
|
||||
create_new_team=Criar Nova Equipe
|
||||
org_desc=Descrição
|
||||
team_name=Nome da Equipe
|
||||
team_desc=Descrição
|
||||
team_name_helper=Você usará este nome para mencionar esta equipe em conversas.
|
||||
team_desc_helper=Do que trata essa equipe?
|
||||
team_permission_desc=Que nível de permissão esta equipe deve ter?
|
||||
|
||||
form.name_reserved=O nome de organização '%s' não pode ser usado.
|
||||
form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de organização.
|
||||
|
||||
settings=Configurações
|
||||
settings.options=Opções
|
||||
settings.full_name=Nome Completo
|
||||
settings.website=Site
|
||||
settings.location=Localização
|
||||
settings.update_settings=Atualizar Configurações
|
||||
settings.change_orgname=Nome da Organização Alterado
|
||||
settings.change_orgname_desc=O nome da organização foi alterado, você quer continuar? Isto afetará todos os links que se relacionam a esta organização.
|
||||
settings.update_setting_success=Configuração da organização atualizada com sucesso.
|
||||
settings.delete=Deletar Organização
|
||||
settings.delete_account=Deletar Esta Organização
|
||||
settings.delete_prompt=A operação deletará esta organização permanentemente, e <strong>NÃO PODERÁ</strong> ser desfeita!
|
||||
settings.confirm_delete_account=Confirmar Deleção
|
||||
settings.delete_org_title=Deleção da Organização
|
||||
settings.delete_org_desc=Esta organização será deletada permanentemente, você quer continuar?
|
||||
settings.hooks_desc=Adicionar Hooks da Web que serão acionados para <strong>todos os repositórios</strong> dessa organização.
|
||||
|
||||
members.public=Público
|
||||
members.public_helper=tornar privado
|
||||
members.private=Privado
|
||||
members.private_helper=torar público
|
||||
members.owner=Dono
|
||||
members.member=Membro
|
||||
members.conceal=Ocultar
|
||||
members.remove=Remover
|
||||
members.leave=Sair
|
||||
members.invite_desc=Comece digitando um nome de usuário para convidá-lo como novo membro para %s:
|
||||
members.invite_now=Convidar Agora
|
||||
|
||||
teams.join=Juntar-se
|
||||
teams.leave=Deixar
|
||||
teams.read_access=Acesso de Leitura
|
||||
teams.read_access_helper=Esta equipe poderá ver e clonar os repositórios dela.
|
||||
teams.write_access=Acesso de Escrita
|
||||
teams.write_access_helper=Esta equipa será capaz de ler os seus repositórios, bem como fazer push para eles.
|
||||
teams.admin_access=Acesso do Administrador
|
||||
teams.admin_access_helper=Esta equipe será capaz de fazer push/pull em seus repositórios, bem como adicionar-lhes outros colaboradores.
|
||||
teams.no_desc=Esta equipe não tem descrição
|
||||
teams.settings=Configurações
|
||||
teams.owners_permission_desc=Donos tem acesso total a <strong>todos repositórios</strong> e também <strong>direitos de administrador</strong> para a organização.
|
||||
teams.members=Membros da Equipe
|
||||
teams.update_settings=Atualizar Configurações
|
||||
teams.delete_team=Deletar Esta Equipe
|
||||
teams.add_team_member=Adicionar Membro da Equipe
|
||||
teams.delete_team_title=Deleção da Equipe
|
||||
teams.delete_team_desc=Este equipe será deletada, você quer continuar? Membros desta equipe poderão perder acesso a alguns repositórios.
|
||||
teams.delete_team_success=A equipe dada foi deletada com sucesso.
|
||||
teams.read_permission_desc=Essa equipe concede acesso para <strong>Leitura</strong>: membros podem ver e clonar os repositórios da equipe.
|
||||
teams.write_permission_desc=Esta equipe concede acesso para <strong>escrita</strong>: Membros podem ler e fazer push para os repositórios da equipe.
|
||||
teams.admin_permission_desc=Esta equipe concede acesso de <strong>Administrador</strong>: Membros podem ler, fazer push e adicionar outros colaboradores para os repositórios da equipe.
|
||||
teams.repositories=Repositórios da Equipe
|
||||
teams.add_team_repository=Adicionar Repositório da Equipe
|
||||
teams.remove_repo=Remover
|
||||
teams.add_nonexistent_repo=O repositório que você está tentando adicionar não existe, por favor, crie-o primeiro.
|
||||
|
||||
[admin]
|
||||
dashboard=Painel de controle
|
||||
users=Usuários
|
||||
organizations=Organizações
|
||||
repositories=Repositórios
|
||||
authentication=Autenticações
|
||||
config=Configuração
|
||||
notices=Sistema de notificações
|
||||
monitor=Monitoramento
|
||||
prev=Anterior
|
||||
next=Próximo
|
||||
|
||||
dashboard.statistic=Estatística
|
||||
dashboard.operations=Operações
|
||||
dashboard.system_status=Status do Monitor de Sistema
|
||||
dashboard.statistic_info=O banco de dados do Gogs contém <b>%d</b> usuários, <b>%d</b> organizações, <b>%d</b> chaves públicas, <b>%d</b> repositórios, <b>%d</b> observadores, <b>%d</b> estrelas, <b>%d</b> ações, <b>%d</b> acessos, <b>%d</b> questões, <b>%d</b> comentários, <b>%d</b> contas sociais, <b>%d</b> seguidores, <b>%d</b> espelhos, <b>%d</b> versões, <b>%d</b> origens de login, <b>%d</b> Hooks da Web, <b>%d</b> milestones, <b>%d</b> labels, <b>%d</b> tarefas hook, <b>%d</b> equipes, <b>%d</b> tarefas de atualização, <b>%d</b> anexos.
|
||||
dashboard.operation_name=Nome da Operação
|
||||
dashboard.operation_switch=Trocar
|
||||
dashboard.operation_run=Executar
|
||||
dashboard.clean_unbind_oauth=Limpar OAuthes não acoplados
|
||||
dashboard.clean_unbind_oauth_success=Todos OAuthes desvinculados foram excluídos com sucesso.
|
||||
dashboard.delete_inactivate_accounts=Excluir todas as contas inativas
|
||||
dashboard.delete_inactivate_accounts_success=Todas as contas inativas foram excluídas com sucesso.
|
||||
dashboard.delete_repo_archives=Excluir todos os arquivos dos repositórios
|
||||
dashboard.delete_repo_archives_success=Todos os arquivos dos repositórios foram excluídos com sucesso.
|
||||
dashboard.git_gc_repos=Fazer coleta de lixo nos repositórios
|
||||
dashboard.git_gc_repos_success=Em todos repositórios, a coleta de lixo foi realizada com sucesso.
|
||||
dashboard.resync_all_sshkeys=Reescrever o arquivo '.ssh/authorized_keys' (atenção: chaves que não sejam do Gogs serão perdidas)
|
||||
dashboard.resync_all_sshkeys_success=Todas as chaves públicas foram reescritas com sucesso.
|
||||
dashboard.resync_all_update_hooks=Reescrever todos os hooks de atualização dos repositórios (necessário quando o caminho de configuração customizado é alterado)
|
||||
dashboard.resync_all_update_hooks_success=Os hooks de atualização de todos os repositórios foram reescritos com sucesso.
|
||||
|
||||
dashboard.server_uptime=Servidor Ligado
|
||||
dashboard.current_goroutine=Goroutines Atuais
|
||||
dashboard.current_memory_usage=Uso de Memória Atual
|
||||
dashboard.total_memory_allocated=Total de Memória Alocada
|
||||
dashboard.memory_obtained=Memória Obtida
|
||||
dashboard.pointer_lookup_times=Nº de Consultas a Ponteiros
|
||||
dashboard.memory_allocate_times=Nº de Alocações de Memória
|
||||
dashboard.memory_free_times=Nº de Liberações de Memória
|
||||
dashboard.current_heap_usage=Uso Atual da Heap
|
||||
dashboard.heap_memory_obtained=Memória de Heap Obtida
|
||||
dashboard.heap_memory_idle=Memória da Heap Ociosa
|
||||
dashboard.heap_memory_in_use=Memória da Heap em Uso
|
||||
dashboard.heap_memory_released=Memória da Heap Liberada
|
||||
dashboard.heap_objects=Objetos na Heap
|
||||
dashboard.bootstrap_stack_usage=Uso de Pilha Bootstrap
|
||||
dashboard.stack_memory_obtained=Memória de Pilha Obtida
|
||||
dashboard.mspan_structures_usage=Uso de Estruturas de MSpan
|
||||
dashboard.mspan_structures_obtained=Estruturas de MSpan Obtidas
|
||||
dashboard.mcache_structures_usage=Uso de Estruturas de MCache
|
||||
dashboard.mcache_structures_obtained=Estruturas de MCache Obtidas
|
||||
dashboard.profiling_bucket_hash_table_obtained=Perfil Obtido da Bucket Hash Table
|
||||
dashboard.gc_metadata_obtained=Metadados do GC Obtidos
|
||||
dashboard.other_system_allocation_obtained=Outra Alocação de Sistema Obtida
|
||||
dashboard.next_gc_recycle=Próxima Reciclagem do GC
|
||||
dashboard.last_gc_time=Desde da Última Vez do GC
|
||||
dashboard.total_gc_time=Pausa Total do GC
|
||||
dashboard.total_gc_pause=Pausa Total do GC
|
||||
dashboard.last_gc_pause=Última Pausa do GC
|
||||
dashboard.gc_times=Nº Execuções do GC
|
||||
|
||||
users.user_manage_panel=Painel de Gerenciamento do Usuário
|
||||
users.new_account=Criar Nova Conta
|
||||
users.name=Nome
|
||||
users.activated=Ativado
|
||||
users.admin=Administrador
|
||||
users.repos=Repos
|
||||
users.created=Criado
|
||||
users.edit=Editar
|
||||
users.auth_source=Fonte de Autorização
|
||||
users.local=Local
|
||||
users.auth_login_name=Nome de Autorização de Login
|
||||
users.update_profile_success=O perfil da conta foi atualizado com sucesso.
|
||||
users.edit_account=Editar Conta
|
||||
users.is_activated=Esta conta está ativada
|
||||
users.is_admin=Esta conta tem permissões de administrador
|
||||
users.allow_git_hook=Esta conta tem permissões para criar ganchos Git
|
||||
users.update_profile=Atualizar Perfil da Conta
|
||||
users.delete_account=Deletar Esta Conta
|
||||
users.still_own_repo=Sua conta ainda é proprietária do repositório, você tem que excluir ou transferi-lo primeiro.
|
||||
users.still_has_org=Sua conta ainda faz parte da organização, você deve sair ou excluí-la primeiro.
|
||||
|
||||
orgs.org_manage_panel=Painel de Gerenciamento da Organização
|
||||
orgs.name=Nome
|
||||
orgs.teams=Equipes
|
||||
orgs.members=Membros
|
||||
|
||||
repos.repo_manage_panel=Painel de Gerenciamento do Repositório
|
||||
repos.owner=Dono
|
||||
repos.name=Nome
|
||||
repos.private=Privado
|
||||
repos.watches=Observadores
|
||||
repos.stars=Estrelas
|
||||
repos.issues=Problemas
|
||||
|
||||
auths.auth_manage_panel=Painel de Gerenciamento da Autorização
|
||||
auths.new=Adicionar Nova Fonte de Autorização
|
||||
auths.name=Nome
|
||||
auths.type=Tipo
|
||||
auths.enabled=Habilitado
|
||||
auths.updated=Atualizado
|
||||
auths.auth_type=Tipo da Autorização
|
||||
auths.auth_name=Nome da Autorização
|
||||
auths.domain=Domínio
|
||||
auths.host=Host
|
||||
auths.port=Porta
|
||||
auths.base_dn=Base DN
|
||||
auths.attribute_username=Atributo nome de usuário
|
||||
auths.attribute_name=Atributo primeiro nome
|
||||
auths.attribute_surname=Atributo sobrenome
|
||||
auths.attribute_mail=Atributo e-mail
|
||||
auths.filter=Filtro de Pesquisa
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=Tipo de Autorização de SMTP
|
||||
auths.smtphost=Host SMTP
|
||||
auths.smtpport=Porta SMTP
|
||||
auths.enable_tls=Habilitar Criptografia TLS
|
||||
auths.pam_service_name=Nome de Serviço PAM
|
||||
auths.enable_auto_register=Habilitar Registro Automático
|
||||
auths.tips=Dicas
|
||||
auths.edit=Editar Configuração da Autorização
|
||||
auths.activated=Esta autenticação foi ativada
|
||||
auths.update_success=A configuração da autorização foi atualizada com sucesso.
|
||||
auths.update=Atualizar Configuração da Autorização
|
||||
auths.delete=Excluir Esta Autorização
|
||||
auths.delete_auth_title=Exclusão da Autorização
|
||||
auths.delete_auth_desc=Esta autorização será excluída, deseja continuar?
|
||||
|
||||
config.server_config=Configuração do Servidor
|
||||
config.app_name=Nome do Aplicativo
|
||||
config.app_ver=Versão do Aplicativo
|
||||
config.app_url=URL do Aplicativo
|
||||
config.domain=Domínio
|
||||
config.offline_mode=Modo Offline
|
||||
config.disable_router_log=Desabilitar o Log do Roteador
|
||||
config.run_user=Usuário de Execução
|
||||
config.run_mode=Modo de Execução
|
||||
config.repo_root_path=Caminho Raiz do Repositório
|
||||
config.static_file_root_path=Caminho Raiz para Arquivo Estático
|
||||
config.log_file_root_path=Caminho Raiz para Arquivo de Log
|
||||
config.script_type=Tipo de Script
|
||||
config.reverse_auth_user=Usuário de Autenticação Reversa
|
||||
config.db_config=Configuração do Banco de Dados
|
||||
config.db_type=Tipo
|
||||
config.db_host=Host
|
||||
config.db_name=Nome
|
||||
config.db_user=Usuário
|
||||
config.db_ssl_mode=Modo SSL
|
||||
config.db_ssl_mode_helper=(apenas para "postgres")
|
||||
config.db_path=Caminho
|
||||
config.db_path_helper=(apenas para "sqlite3")
|
||||
config.service_config=Configuração do Serviço
|
||||
config.register_email_confirm=Requerer Confirmação de E-mail
|
||||
config.disable_register=Desabilitar Registro
|
||||
config.show_registration_button=Mostrar Botão de Registo
|
||||
config.require_sign_in_view=Requerer Entrar no Gogs para Ver
|
||||
config.mail_notify=Notificação de Correio
|
||||
config.enable_cache_avatar=Habilitar Cache de Avatar
|
||||
config.active_code_lives=Ativar Code Lives
|
||||
config.reset_password_code_lives=Redefinir Senha de Code Lives
|
||||
config.webhook_config=Configuração de Hook da Web
|
||||
config.task_interval=Intervalo da Tarefa
|
||||
config.deliver_timeout=Intervalo de Entrega
|
||||
config.skip_tls_verify=Pular Verificar TLS
|
||||
config.mailer_config=Configuração de Correio
|
||||
config.mailer_enabled=Habilitado
|
||||
config.mailer_disable_helo=Desabilitar HELO
|
||||
config.mailer_name=Nome
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Usuário
|
||||
config.oauth_config=Configuração do OAuth
|
||||
config.oauth_enabled=Habilitado
|
||||
config.cache_config=Configuração de Cache
|
||||
config.cache_adapter=Adaptador de Cache
|
||||
config.cache_interval=Intervalo de Cache
|
||||
config.cache_conn=Conexão de Cache
|
||||
config.session_config=Configuração da Sessão
|
||||
config.session_provider=Provedor da Sessão
|
||||
config.provider_config=Configuração do Provedor
|
||||
config.cookie_name=Nome do Cookie
|
||||
config.enable_set_cookie=Habilitar Uso de Cookie
|
||||
config.gc_interval_time=Tempo de Intervalo do GC
|
||||
config.session_life_time=Tempo de Vida da Sessão
|
||||
config.https_only=Apenas HTTPS
|
||||
config.cookie_life_time=Tempo de Vida do Cookie
|
||||
config.picture_config=Configuração da Imagem
|
||||
config.picture_service=Serviço de Imagens
|
||||
config.disable_gravatar=Desativar Gravatar
|
||||
config.log_config=Configuração de Log
|
||||
config.log_mode=Modo do Log
|
||||
|
||||
monitor.cron=Tarefas Cron
|
||||
monitor.name=Nome
|
||||
monitor.schedule=Cronograma
|
||||
monitor.next=Próxima Vez
|
||||
monitor.previous=Última Vez
|
||||
monitor.execute_times=Nº de Execuções
|
||||
monitor.process=Processos em Execução
|
||||
monitor.desc=Descrição
|
||||
monitor.start=Hora de Início
|
||||
monitor.execute_time=Tempo de Execução
|
||||
|
||||
notices.system_notice_list=Sistema de Notificações
|
||||
notices.type=Tipo
|
||||
notices.type_1=Repositório
|
||||
notices.desc=Descrição
|
||||
notices.op=Op.
|
||||
notices.delete_success=Aviso do sistema foi deletado com sucesso.
|
||||
|
||||
[action]
|
||||
create_repo=repositório criado <a href="%s"> %s</a>
|
||||
commit_repo=pushed para <a href="%s/src/%s">%[2]s</a> em <a href="%[1]s">%[3]s</a>
|
||||
create_issue='questão aberta <a href="%s/issues/%s">%s#%[2]s</a>'
|
||||
comment_issue='comentou sobre a questão <a href="%s/issues/%s">%s#%[2]s</a>'
|
||||
transfer_repo=repositório transferido de <code>%s</code> para <a href="%s">%s</a>
|
||||
push_tag=Foi feito push na tag <a href="%s/src/%s">%[2]s</a> para <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits=Ver comparação desses 2 commits
|
||||
|
||||
[tool]
|
||||
ago=atrás
|
||||
from_now=a partir de agora
|
||||
now=agora
|
||||
1s=1 segundo %s
|
||||
1m=1 minuto %s
|
||||
1h=1 hora %s
|
||||
1d=1 dia %s
|
||||
1w=1 semana %s
|
||||
1mon=1 mês %s
|
||||
1y=1 ano %s
|
||||
seconds=%d segundos %s
|
||||
minutes=%d minutos %s
|
||||
hours=%d horas %s
|
||||
days=%d dias %s
|
||||
weeks=%d semanas %s
|
||||
months=%d meses %s
|
||||
years=%d anos %s
|
||||
raw_seconds=segundos
|
||||
raw_minutes=minutos
|
||||
|
||||
798
conf/locale/locale_ru-RU.ini
Executable file
798
conf/locale/locale_ru-RU.ini
Executable file
@@ -0,0 +1,798 @@
|
||||
app_desc=Удобная служба для собственного Git-репозитория, написанная на языке Go
|
||||
|
||||
home=Главная
|
||||
dashboard=Панель мониторинга
|
||||
explore=Обзор
|
||||
help=Помощь
|
||||
sign_in=Войти
|
||||
social_sign_in=Вход через соцсеть: 2-й шаг <small>свяжите учетную запись</small>
|
||||
sign_out=Выход
|
||||
sign_up=Регистрация
|
||||
register=Зарегистрироваться
|
||||
website=Веб-сайт
|
||||
version=Версия
|
||||
page=Страница
|
||||
template=Шаблон
|
||||
language=Язык
|
||||
|
||||
username=Имя пользователя
|
||||
email=Эл. почта
|
||||
password=Пароль
|
||||
re_type=Повтор
|
||||
captcha=Captcha
|
||||
|
||||
repository=Репозиторий
|
||||
organization=Организация
|
||||
mirror=Зеркало
|
||||
new_repo=Новый репозиторий
|
||||
new_migrate=Новая Миграция
|
||||
new_fork=Новый проект из репозитория
|
||||
new_org=Новая Организация
|
||||
manage_org=Управление Организацией
|
||||
admin_panel=Панель администратора
|
||||
account_settings=Настройки аккаунта
|
||||
settings=Настройки
|
||||
|
||||
news_feed=Лента новостей
|
||||
pull_requests=Pull Requests
|
||||
issues=Вопросы
|
||||
|
||||
cancel=Отмена
|
||||
|
||||
[search]
|
||||
search=Поиск...
|
||||
repository=Репозиторий
|
||||
user=Пользователь
|
||||
issue=Проблема
|
||||
code=Код
|
||||
|
||||
[install]
|
||||
install=Установка
|
||||
title=Установочные шаги для первого запуска
|
||||
requite_db_desc=Для Gogs требуется MySQL, PostgreSQL или SQLite3.
|
||||
db_title=Настройки базы данных
|
||||
db_type=Тип базы данных
|
||||
host=Хост
|
||||
user=Пользователь
|
||||
password=Пароль
|
||||
db_name=Имя базы данных
|
||||
db_helper=Для MySQL используйте тип таблиц InnoDB с кодировкой utf8_general_ci.
|
||||
ssl_mode=Режим SSL
|
||||
path=Путь
|
||||
sqlite_helper=Путь к файлу базы данных SQLite3.
|
||||
err_empty_sqlite_path=Путь к базе данных SQLite3 не может быть пустым.
|
||||
|
||||
general_title=Общие параметры Gogs
|
||||
app_name=Имя приложения
|
||||
app_name_helper=Укажите здесь название вашей потрясающей организации!
|
||||
repo_path=Путь корня репозитория
|
||||
repo_path_helper=Все удаленные репозитории Git будут сохранены в этой директории.
|
||||
run_user=Пользователь
|
||||
run_user_helper=У пользователя должен быть доступ к пути к корню репозитория и к запуску Gogs.
|
||||
domain=Домен
|
||||
domain_helper=Влияет на URL-адреса для клонирования по SSH.
|
||||
http_port=Порт HTTP
|
||||
http_port_helper=Номер порта, который приложение будет слушать.
|
||||
app_url=URL приложения
|
||||
app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на адреса в электронной почте.
|
||||
|
||||
optional_title=Расширенные настройки
|
||||
email_title=Настройки службы электронной почты
|
||||
smtp_host=Узел SMTP
|
||||
smtp_from=Из
|
||||
smtp_from_helper=Почта от адреса, RFC 5322. Это может быть email адрес или формат "Имя" <email@example.com>.
|
||||
mailer_user=Электронная почта отправителя
|
||||
mailer_password=Пароль отправителя
|
||||
register_confirm=Включить подтверждение регистрации
|
||||
mail_notify=Разрешить почтовые уведомления
|
||||
server_service_title=Сервер и другие настройки служб
|
||||
offline_mode=Включение офлайн режима
|
||||
offline_mode_popup=Отключить CDN даже в производственном режиме, все файлы ресурсов будут раздаваться локально.
|
||||
disable_registration=Отключить самостоятельную регистрацию
|
||||
disable_registration_popup=Запретить пользователям самостоятельную регистрацию, только администратор может создавать аккаунты.
|
||||
require_sign_in_view=Разрешить требовать авторизацию для просмотра страниц
|
||||
require_sign_in_view_popup=Только авторизированные пользователи могут просматривать страницы, посетители смогут увидеть только ссылку на авторизацию вверху страницы.
|
||||
admin_setting_desc=Вы не должны создать учетную запись администратора прямо сейчас, пользователь с ID = 1 получит доступ с правами администратора автоматически.
|
||||
admin_title=Настройки учётной записи администратора
|
||||
admin_name=Имя пользователя
|
||||
admin_password=Пароль
|
||||
confirm_password=Подтвердить пароль
|
||||
admin_email=Эл. почта
|
||||
install_gogs=Установить Gogs
|
||||
test_git_failed=Не удалось проверить 'git' команду: %v
|
||||
sqlite3_not_available=Ваша версия не поддерживает SQLite3, пожалуйста скачайте официальную бинарную версию от %s, а не версию gobuild.
|
||||
invalid_db_setting=Настройки базы данных не правильные: %v
|
||||
invalid_repo_path=Недопустимый путь к корню репозитория: %v
|
||||
run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s
|
||||
save_config_failed=Не удалось сохранить конфигурацию: %v
|
||||
invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v
|
||||
install_success=Добро пожаловать! Мы рады, что вы выбрали Gogs. Веселитесь и берегите себя.
|
||||
|
||||
[home]
|
||||
uname_holder=Имя пользователь или E-mail
|
||||
password_holder=Пароль
|
||||
switch_dashboard_context=Переключить контекст панели управления
|
||||
my_repos=Мои репозитории
|
||||
collaborative_repos=Совместные репозитории
|
||||
my_orgs=Моя Организация
|
||||
my_mirrors=Мои зеркала
|
||||
|
||||
[explore]
|
||||
repos=Репозитории
|
||||
|
||||
[auth]
|
||||
create_new_account=Создать новый аккаунт
|
||||
register_hepler_msg=Уже есть аккаунт? Авторизуйтесь!
|
||||
social_register_hepler_msg=Уже есть учетная запись? Свяжите ее с соцсетью!
|
||||
disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта.
|
||||
disable_register_mail=К сожалению подтверждение регистрации по почте отключено.
|
||||
remember_me=Запомнить меня
|
||||
forgot_password=Забыли пароль
|
||||
forget_password=Забыли пароль?
|
||||
sign_up_now=Нужен аккаунт? Зарегистрируйтесь.
|
||||
confirmation_mail_sent_prompt=Новое письмо для подтверждения было направлено на <b>%s</b>, пожалуйста, проверьте ваш почтовый ящик в течение %d часов для завершения регистрации.
|
||||
sign_in_email=Войдите в свой адрес электронной почты
|
||||
active_your_account=Активируйте свой аккаунт
|
||||
resent_limit_prompt=Вы слишком часто отправляете письмо с активацией. Подождите 3 минуты, пожалуйста.
|
||||
has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес электронной почты (<b>%s</b>). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже.
|
||||
resend_mail=Нажмите здесь, чтобы переотправить активационное письмо
|
||||
email_not_associate=Этот адрес электронной почты не связан ни с одной учетной записью.
|
||||
send_reset_mail=Нажмите сюда, чтобы отправить письмо для сброса пароля
|
||||
reset_password=Сброс пароля
|
||||
invalid_code=Извините, ваш код подтверждения истек или не является допустимым.
|
||||
reset_password_helper=Нажмите здесь, чтобы сбросить свой пароль
|
||||
password_too_short=Длина пароля не менее 6 символов.
|
||||
|
||||
[modal]
|
||||
yes=Да
|
||||
no=Нет
|
||||
modify=Изменить
|
||||
|
||||
[form]
|
||||
UserName=Пользователь
|
||||
RepoName=Имя репозитория
|
||||
Email=Адрес эл. почты
|
||||
Password=Пароль
|
||||
Retype=Введите пароль еще раз
|
||||
SSHTitle=Имя SSH ключа
|
||||
HttpsUrl=URL HTTPS
|
||||
PayloadUrl=URL обработчика
|
||||
TeamName=Название команды
|
||||
AuthName=Имя авторизации
|
||||
AdminEmail=Электронная почта администратора
|
||||
|
||||
require_error=` не может быть пустым.`
|
||||
alpha_dash_error=«должен быть допустимым символьным, числовым или dash(-_) значением.»
|
||||
alpha_dash_dot_error=«должен быть допустимым символьным, числовым или dash(-_) символами, включая точку.»
|
||||
size_error=` должен быть размер %s.`
|
||||
min_size_error=«должен содержать по крайней мере %s символов.»
|
||||
max_size_error=` должен содержать максимум %s символов.`
|
||||
email_error=«не является адресом электронной почты.»
|
||||
url_error=«не является допустимым URL-адресом.»
|
||||
unknown_error=Неизвестная ошибка:
|
||||
captcha_incorrect=CAPTCHA не совпадает.
|
||||
password_not_match=Пароль и подтверждение пароля не совпадают.
|
||||
|
||||
username_been_taken=Имя пользователя уже принято.
|
||||
repo_name_been_taken=Имя репозитория уже принято.
|
||||
org_name_been_taken=Название организации было уже принято.
|
||||
team_name_been_taken=Название команды было уже принято.
|
||||
email_been_used=Адрес электронной почты уже используется.
|
||||
ssh_key_been_used=Имя открытого ключа уже используется.
|
||||
illegal_team_name=Имя группы содержит недопустимые знаки.
|
||||
username_password_incorrect=Имя пользователя или пароль не правильный.
|
||||
enterred_invalid_repo_name=Пожалуйста, убедитесь, что введенно правильное имя хранилища.
|
||||
enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное.
|
||||
enterred_invalid_password=Убедитесь, что введенный пароль верен.
|
||||
user_not_exist=Данный пользователь не существует.
|
||||
last_org_owner=Удаляемый пользователь является последним в команде владельцев. Должен быть хотя бы один владелец.
|
||||
|
||||
invalid_ssh_key=К сожалению, мы не смогли проверить ваш SSH-ключ: %s
|
||||
unable_verify_ssh_key=Gogs не может проверить ваш SSH-ключ, но мы допускаем, что он действителен. Пожалуйста, удостоверьтесь самостоятельно, что ключ действителен.
|
||||
auth_failed=Ошибка аутентификации: %v
|
||||
|
||||
still_own_repo=На вашем аккаунте все еще остается как минимум один репозиторий, сначала вам нужно удалить или передать его.
|
||||
still_has_org=Вы находитесь в организации, сперва Вам необходимо покинуть ее или удалить.
|
||||
org_still_own_repo=Данная организация все еще является владельцем репозиториев, необходимо удалить или переместить их в начале.
|
||||
|
||||
still_own_user=Эта проверка подлинности по-прежнему используется некоторыми пользователями, вы должны переместить их и затем снова удалить.
|
||||
|
||||
target_branch_not_exist=Целевая ветка не существует
|
||||
|
||||
[user]
|
||||
change_avatar=Измените ваш аватар на gravatar.com
|
||||
change_custom_avatar=Измените ваш аватар в настройках
|
||||
join_on=Присоединилась к
|
||||
repositories=Репозитории
|
||||
activity=Активность
|
||||
followers=Подписчики
|
||||
starred=Избранное
|
||||
following=Подписан
|
||||
|
||||
form.name_reserved=Имя пользователя '%s' зарезервировано.
|
||||
form.name_pattern_not_allowed=Имя пользователя «%s» не допускается.
|
||||
|
||||
[settings]
|
||||
profile=Профиль
|
||||
password=Пароль
|
||||
ssh_keys=SSH ключи
|
||||
social=Учетные записи в соцсетях
|
||||
applications=Приложения
|
||||
orgs=Организации
|
||||
delete=Удалить аккаунт
|
||||
uid=UID
|
||||
|
||||
public_profile=Открытый профиль
|
||||
profile_desc=Адрес вашей электронной почты является публичным и будет использован для любых уведомлений, связанных с аккаунтом, а также для любых действий, совершенных через сайт.
|
||||
full_name=ФИО
|
||||
website=Веб-сайт
|
||||
location=Местоположение
|
||||
update_profile=Обновить профиль
|
||||
update_profile_success=Ваш профиль был успешно обновлен.
|
||||
change_username=Имя пользователя изменено
|
||||
change_username_desc=Имя пользователя изменено, вы хотите продолжить? Это повлияет на все ссылки, связанные с вашей учетной записью.
|
||||
continue=Далее
|
||||
cancel=Отмена
|
||||
|
||||
enable_custom_avatar=Включить собственный аватар
|
||||
enable_custom_avatar_helper=Включите эту опцию, чтоб отключить загрузку с Gravatar
|
||||
choose_new_avatar=Выбрать новый аватар
|
||||
update_avatar=Обновить настройку аватара
|
||||
uploaded_avatar_not_a_image=Загружаемый файл не является изображением.
|
||||
no_custom_avatar_available=Собственный аватар недоступен, включить его невозможно.
|
||||
update_avatar_success=Настройка вашего аватара обновлена успешно.
|
||||
|
||||
change_password=Сменить пароль
|
||||
old_password=Текущий пароль
|
||||
new_password=Новый пароль
|
||||
password_incorrect=Текущий пароль не правильный.
|
||||
change_password_success=Пароль сменен успешно. Теперь вы можете войти с новым паролем.
|
||||
|
||||
emails=Адреса электронной почты
|
||||
manage_emails=Управление адресами электронной почты
|
||||
email_desc=Ваш основной адрес электронной почты будет использован для уведомлений и других операций.
|
||||
primary=Основной
|
||||
primary_email=Установить как основной
|
||||
delete_email=Удалить
|
||||
add_new_email=Добавить новый адрес электронной почты
|
||||
add_email=Добавить электронную почту
|
||||
add_email_confirmation_sent=Новое подтверждение по электронной почте было отправлено<b>%s</b>, пожалуйста, проверьте свой почтовый ящик в течение следующих %d часов, чтобы завершить процесс подтверждения.
|
||||
add_email_success=Новый адрес электронной почты успешно добавлен.
|
||||
|
||||
manage_ssh_keys=Управление SSH ключами
|
||||
add_key=Добавить ключ
|
||||
ssh_desc=Это список ключей SSH связанных с вашей учетной записью. Удаляйте любые неизвестные вам ключи.
|
||||
ssh_helper=<strong>Нужна помощь?</strong> Ознакомьтесь с нашим путеводителем по <a href="%s">созданию SSH-ключей</a> или посмотрите решения <a href="%s">частых проблем, связанных с SSH</a>.
|
||||
add_new_key=Добавить SSH ключ
|
||||
key_name=Имя ключа
|
||||
key_content=Содержимое
|
||||
add_key_success=Был добавлен новый ключ SSH!
|
||||
delete_key=Удалить
|
||||
add_on=Добавлено
|
||||
last_used=Последний раз использовался
|
||||
no_activity=Еще не применялся
|
||||
|
||||
manage_social=Управление привязанными учетными записями в соцсетях
|
||||
social_desc=Это список привязанных учетных записей в соцсетях. Удаляйте любые неизвестные вам привязки.
|
||||
unbind=Отвязать
|
||||
unbind_success=Социальная учетная запись отвязана.
|
||||
|
||||
manage_access_token=Управление Токенами Персонального Доступа
|
||||
generate_new_token=Создать новый token
|
||||
tokens_desc=Созданные вами токены могут использоваться для доступа к Gogs API.
|
||||
new_token_desc=Пока что каждый токен будет иметь полный доступ к вашей учетной записи.
|
||||
token_name=Имя маркера
|
||||
generate_token=Генерировать маркер
|
||||
generate_token_succees=Успешно создан новый токен доступа! Пожалуйста сделайте копию вашего нового токена персонального доступа. Вы не сможете увидеть его снова!
|
||||
delete_token=Удалить
|
||||
delete_token_success=Персональный токен доступа был успешно удален! Не забудьте так же обновить ваши приложения.
|
||||
|
||||
delete_account=Удалить свой аккаунт
|
||||
delete_prompt=Этим действием вы удалите свою учетную запись навсегда и <strong>НЕ СМОЖЕТЕ</strong> ее вернуть!
|
||||
confirm_delete_account=Подтвердите удаление
|
||||
delete_account_title=Удаление аккаунта
|
||||
delete_account_desc=Эта учетная запись будет удалена насовсем. Вы хотите продолжить?
|
||||
|
||||
[repo]
|
||||
owner=Владелец
|
||||
repo_name=Имя репозитория
|
||||
repo_name_helper=Лучшие названия репозиториев коротки, запоминаемы и <strong>уникальны</strong>.
|
||||
visibility=Видимость
|
||||
visiblity_helper=Это хранилище — <span class="label label-red label-radius">частное</span>
|
||||
fork_repo=Ответвить репозиторий
|
||||
fork_from=Ответвление от
|
||||
fork_visiblity_helper=Ответвленному репозиторию нельзя поменять уровень видимости
|
||||
repo_desc=Описание
|
||||
repo_lang=Язык
|
||||
repo_lang_helper=Выберите файл .gitignore
|
||||
license=Лицензия
|
||||
license_helper=Выберите файл лицензии
|
||||
init_readme=Создать репозиторий с файлом README.md
|
||||
create_repo=Создать репозиторий
|
||||
default_branch=Ветка по умолчанию
|
||||
mirror_interval=Интервал зеркалирования (час)
|
||||
|
||||
form.name_reserved=Имя репозитория '%s' зарезервировано.
|
||||
form.name_pattern_not_allowed=Шаблон имени репозитория '%s' не допускается.
|
||||
|
||||
need_auth=Требуется авторизация
|
||||
migrate_type=Тип миграции
|
||||
migrate_type_helper=Этот репозиторий будет <span class="label label-blue label-radius">зеркалом</span>
|
||||
migrate_repo=Перенос репозитория
|
||||
migrate.clone_address=Скопировать адрес
|
||||
migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или является не папкой.
|
||||
|
||||
forked_from=forked from
|
||||
fork_from_self=Вы не можете форкнуть репозитарий, так как Вы уже его владелец!
|
||||
copy_link=Скопировать
|
||||
click_to_copy=Скопировать в буфер обмена
|
||||
copied=Успешно скопировано
|
||||
clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" href="%s">помощи</a>!
|
||||
unwatch=Перестать следить
|
||||
watch=Следить
|
||||
unstar=Убрать из избранного
|
||||
star=В избранное
|
||||
fork=Ответвить
|
||||
|
||||
no_desc=Нет описания
|
||||
quick_guide=Краткое руководство
|
||||
clone_this_repo=Клонировать репозиторий
|
||||
create_new_repo_command=Создать новый репозиторий из командной строки
|
||||
push_exist_repo=Отправить существующий репозиторий из командной строки
|
||||
|
||||
branch=Ветка
|
||||
tree=Дерево
|
||||
branch_and_tags=Ветки и метки
|
||||
branches=Ветки
|
||||
tags=Метки
|
||||
issues=Обсуждения
|
||||
labels=Метки
|
||||
milestones=Этапы
|
||||
commits=Коммиты
|
||||
releases=Релизы
|
||||
file_raw=Исходник
|
||||
file_history=История
|
||||
file_view_raw=Посмотреть исходник
|
||||
file_permalink=Постоянная ссылка
|
||||
|
||||
commits.commits=Коммиты
|
||||
commits.search=Поиск коммитов
|
||||
commits.find=Найти
|
||||
commits.author=Автор
|
||||
commits.message=Сообщение
|
||||
commits.date=Дата
|
||||
commits.older=Раньше
|
||||
commits.newer=Новее
|
||||
|
||||
issues.new=Новая задача
|
||||
issues.new_label=Новая метка
|
||||
issues.new_label_placeholder=Имя метки...
|
||||
issues.open_tab=%d Открыть
|
||||
issues.close_tab=%d Закрыть
|
||||
issues.filter_label=Метка
|
||||
issues.filter_label_no_select=Нет выбранной метки
|
||||
issues.filter_milestone=Этап
|
||||
issues.filter_assignee=Назначено
|
||||
issues.filter_type=Тип
|
||||
issues.filter_type.all_issues=Все задачи
|
||||
issues.filter_type.assigned_to_you=Назначено Вам
|
||||
issues.filter_type.created_by_you=Созданные вами
|
||||
issues.filter_type.mentioning_you=Вы упомянуты
|
||||
issues.opened_by=opened %[1]s by <a href="/%[2]s">%[2]s</a>
|
||||
issues.previous=Предыдущая страница
|
||||
issues.next=Следующая страница
|
||||
issues.label_title=Имя метки
|
||||
issues.label_color=Цвет метки
|
||||
issues.label_count=%d меток
|
||||
issues.label_open_issues=%d открытых задач
|
||||
issues.label_edit=Редактировать
|
||||
issues.label_delete=Удалить
|
||||
issues.label_modify=Изменение метки
|
||||
issues.label_deletion=Удаление метки
|
||||
issues.label_deletion_desc=Удаление ярлыка затронет все связанные задачи. Продолжить?
|
||||
issues.label_deletion_success=Метка была удалена успешно!
|
||||
|
||||
settings=Настройки
|
||||
settings.options=Опции
|
||||
settings.collaboration=Сотрудничество
|
||||
settings.hooks=Автоматическое обновление
|
||||
settings.githooks=Git хуки
|
||||
settings.deploy_keys=Ключи развертывания
|
||||
settings.basic_settings=Основные параметры
|
||||
settings.danger_zone=Опасная зона
|
||||
settings.site=Официальный сайт
|
||||
settings.update_settings=Обновить настройки
|
||||
settings.change_reponame=Имя репозитория изменено
|
||||
settings.change_reponame_desc=Имя хранилища изменено, вы хотите продолжить? Это действие повлияет на все ссылки, относящиеся к этому репозиторию.
|
||||
settings.transfer=Передать права собственности
|
||||
settings.transfer_desc=Передать репозиторий другому пользователю или организации где у вас есть права администратора.
|
||||
settings.new_owner_has_same_repo=У нового владельца уже есть хранилище с таким названием.
|
||||
settings.delete=Удалить этот репозиторий
|
||||
settings.delete_desc=Как только вы удалите репозиторий — пути назад не будет. Удостоверьтесь, что вам это точно нужно.
|
||||
settings.transfer_notices=<p>- Вы потеряете доступ, если новый владелец является индивидуальным пользователем.</p><p>- У Вас останется доступ, если новый владелец является организацией, и вы один из её владельцев.</p>
|
||||
settings.update_settings_success=Настройка репозитория обновлена успешно.
|
||||
settings.transfer_owner=Новый владелец
|
||||
settings.make_transfer=Выполнить передачу
|
||||
settings.transfer_succeed=Владение репозиторием было успешно передано.
|
||||
settings.confirm_delete=Подтвердить удаление
|
||||
settings.add_collaborator=Добавить нового соавтора
|
||||
settings.add_collaborator_success=Был добавлен новый соавтор.
|
||||
settings.remove_collaborator_success=Соавтор был удален.
|
||||
settings.user_is_org_member=Пользователь является членом организации, члены которой не могут быть добавлены в качестве соавтора.
|
||||
settings.add_webhook=Добавить Webhook
|
||||
settings.hooks_desc=Webhooks позволяют внешним службам получать уведомления при возникновении определенных событий на Gogs. При возникновении указанных событий мы отправим запрос POST на каждый заданный вами URL. Узнать больше можно в нашем <a target="_blank" href="%s">Руководстве по Webhooks</a>.
|
||||
settings.githooks_desc=Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to perform custom operations.
|
||||
settings.githook_edit_desc=If the hook is inactive, sample content will be presented. Leaving content to an empty value will disable this hook.
|
||||
settings.githook_name=Название Hook'a
|
||||
settings.githook_content=Перехватить содержание
|
||||
settings.update_githook=Обновить Hook
|
||||
settings.remove_hook_success=Webhook удален.
|
||||
settings.add_webhook_desc=Мы отправим запрос <code>POST</code> на указанный ниже URL с информацией о событиях. Можно также указать формат, в котором вы бы хотели получить данные (JSON, <code>x-www-form-urlencoded</code>, <em>и т.д.</em>). Дополнительную информацию можно найти в <a target="_blank" href="%s">Руководстве по Webhook</a>.
|
||||
settings.payload_url=URL обработчика
|
||||
settings.content_type=Тип содержимого
|
||||
settings.secret=Secret
|
||||
settings.event_desc=На какие события этот webhook должен срабатывать?
|
||||
settings.event_push_only=Просто <code>push</code> событие.
|
||||
settings.active=Активен
|
||||
settings.active_helper=Details regarding the event which triggered the hook will be delivered as well.
|
||||
settings.add_hook_success=Был добавлен новый webhook.
|
||||
settings.update_webhook=Обновление Webhook
|
||||
settings.update_hook_success=Webhook обновлен.
|
||||
settings.delete_webhook=Удалить автоматическое обновление
|
||||
settings.recent_deliveries=Недавние рассылки
|
||||
settings.hook_type=Тип перехватчика
|
||||
settings.add_slack_hook_desc=Добавить интеграцию с <a href="%s">Slack</a> в ваш репозиторий.
|
||||
settings.slack_token=Token
|
||||
settings.slack_domain=Домен
|
||||
settings.slack_channel=Канал
|
||||
|
||||
diff.browse_source=Просмотр исходного кода
|
||||
diff.parent=Родитель
|
||||
diff.commit=Сommit
|
||||
diff.data_not_available=Данные Diff не доступны.
|
||||
diff.show_diff_stats=Показать статистику Diff
|
||||
diff.stats_desc=<strong> %d измененных файлов</strong> с <strong>%d добавлено</strong> и <strong>%d удалено</strong>
|
||||
diff.bin=BIN
|
||||
diff.view_file=Просмотреть файл
|
||||
|
||||
release.releases=Релизы
|
||||
release.new_release=Новый релиз
|
||||
release.draft=Черновик
|
||||
release.prerelease=Предрелиз
|
||||
release.stable=Стабильный
|
||||
release.edit=Редактировать
|
||||
release.ahead=<strong>%d</strong> коммитов %s начиная с этого релиза
|
||||
release.source_code=Исходный код
|
||||
release.tag_name=Имя тега
|
||||
release.target=Цель
|
||||
release.tag_helper=Выберите существующий тег, или создайте новый.
|
||||
release.release_title=Название релиза
|
||||
release.content_with_md=Содержимое с <a href="%s">Markdown</a>
|
||||
release.write=Запись
|
||||
release.preview=Предварительный просмотр
|
||||
release.content_placeholder=Напишите что-нибудь
|
||||
release.loading=Загрузка...
|
||||
release.prerelease_desc=Это предварительный релиз
|
||||
release.prerelease_helper=We’ll point out that this release is not production-ready.
|
||||
release.publish=Опубликовать релиз
|
||||
release.save_draft=Сохранить черновик
|
||||
release.edit_release=Редактировать релиз
|
||||
release.tag_name_already_exist=Релиз с этим именем тега уже существует.
|
||||
|
||||
[org]
|
||||
org_name_holder=Название организации
|
||||
org_name_helper=Лучшие названия организаций коротки и запоминаемы.
|
||||
org_email_helper=Почта организации получает все уведомления и подтверждения.
|
||||
create_org=Создать Организацию
|
||||
repo_updated=Обновлено
|
||||
people=Люди
|
||||
invite_someone=Пригласить кого-нибудь
|
||||
teams=Команды
|
||||
lower_members=Участники
|
||||
lower_repositories=Репозитории
|
||||
create_new_team=Создать Новую Команду
|
||||
org_desc=Описание
|
||||
team_name=Название команды
|
||||
team_desc=Описание
|
||||
team_name_helper=Вы будете использовать это имя для упоминания этой команды в обсуждении.
|
||||
team_desc_helper=What is this team all about?
|
||||
team_permission_desc=Какой уровень разрешений должен быть у этой команды?
|
||||
|
||||
form.name_reserved=Наименование организации '%s' зарезервированно.
|
||||
form.name_pattern_not_allowed=Шаблон организации '%s' не допускается.
|
||||
|
||||
settings=Настройки
|
||||
settings.options=Опции
|
||||
settings.full_name=Полное имя
|
||||
settings.website=Сайт
|
||||
settings.location=Местоположение
|
||||
settings.update_settings=Обновить настройки
|
||||
settings.change_orgname=Имя Организации изменено
|
||||
settings.change_orgname_desc=Изменилось название организации, вы хотите продолжить? Это повлияет на все ссылки относящиеся к этой Организации.
|
||||
settings.update_setting_success=Настройки Организации были успешно обновлены.
|
||||
settings.delete=Удалить Организацию
|
||||
settings.delete_account=Удалить Эту Организацию
|
||||
settings.delete_prompt=Это действие безвозвратно удалит эту организацию навсегда.
|
||||
settings.confirm_delete_account=Подтвердить удаление
|
||||
settings.delete_org_title=Удаление Организации
|
||||
settings.delete_org_desc=Эта организация будет удалена навсегда. Хотите всё-равно продолжить?
|
||||
settings.hooks_desc=Добавьте автоматическое обновление, который будет вызываться для <strong>всех репозиций</strong> под этой Группой.
|
||||
|
||||
members.public=Публичный
|
||||
members.public_helper=Сделать Приватным
|
||||
members.private=Приватный
|
||||
members.private_helper=Сделать Публичным
|
||||
members.owner=Владелец
|
||||
members.member=Участник
|
||||
members.conceal=Скрыть
|
||||
members.remove=Удалить
|
||||
members.leave=Покинуть
|
||||
members.invite_desc=Начните вводить имя пользователя чтобы пригласить нового члена %s:
|
||||
members.invite_now=Пригласите сейчас
|
||||
|
||||
teams.join=Объединить
|
||||
teams.leave=Выйти
|
||||
teams.read_access=Доступ на чтение
|
||||
teams.read_access_helper=Эта команда будет иметь возможность просматривать и клонировать ее репозитории.
|
||||
teams.write_access=Доступ на запись
|
||||
teams.write_access_helper=Эта команда будет в состоянии прочитать ее репозитории, а также посылать изменения.
|
||||
teams.admin_access=Доступ администратора
|
||||
teams.admin_access_helper=Эта команда будет иметь возможность выполнять push/pull в его репозиториях, а также добавлять других сотрудников к нему.
|
||||
teams.no_desc=Эта группа не имеет описания
|
||||
teams.settings=Настройки
|
||||
teams.owners_permission_desc=Владельцы имеют полный доступ ко <strong>всем репозиториям</strong> и имеют <strong>права администратора</strong> организации.
|
||||
teams.members=Члены группы разработки
|
||||
teams.update_settings=Обновить настройки
|
||||
teams.delete_team=Удалить эту группу разработки
|
||||
teams.add_team_member=Добавление члена группы разработки
|
||||
teams.delete_team_title=Удалить группу разработки
|
||||
teams.delete_team_desc=Эта команда будет удалена. Вы хотите продолжить? Члены этой группы могут потерять доступ к некоторым репозиториям.
|
||||
teams.delete_team_success=Данная команда была удалена успешно.
|
||||
teams.read_permission_desc=Эта команда предоставляет доступ на <strong>Чтение</strong>: члены могут просматривать и клонировать репозитории команды.
|
||||
teams.write_permission_desc=Эта команда предоставляет доступ на <strong>Запись</strong>: члены могут получать и выполнять push команды в репозитории.
|
||||
teams.admin_permission_desc=This team grants <strong>Admin</strong> access: members can read from, push to, and add collaborators to the team's repositories.
|
||||
teams.repositories=Репозитории группы разработки
|
||||
teams.add_team_repository=Добавить репозиторий группы разработки
|
||||
teams.remove_repo=Удалить
|
||||
teams.add_nonexistent_repo=Вы добавляете в отсутствующий репозиторий, пожалуйста сначала его создайте.
|
||||
|
||||
[admin]
|
||||
dashboard=Панель управления
|
||||
users=Пользователи
|
||||
organizations=Организации
|
||||
repositories=Репозитории
|
||||
authentication=Авторизация
|
||||
config=Настройки
|
||||
notices=Системные уведомления
|
||||
monitor=Мониторинг
|
||||
prev=Предыдущий.
|
||||
next=Следующий
|
||||
|
||||
dashboard.statistic=Статистика
|
||||
dashboard.operations=Операции
|
||||
dashboard.system_status=Статус системного монитора
|
||||
dashboard.statistic_info=В базе данных Gogs записано <b>%d</b> пользователей, <b>%d</b> организаций, <b>%d</b> публичных ключей, <b>%d</b> репозиторий, <b>%d</b> подписок на репозитории, <b>%d</b> добавлений в избранное, <b>%d</b> действий, <b>%d</b> доступов, <b>%d</b> обсуждений, <b>%d</b> комментариев, <b>%d</b> социальных учетных записей, <b>%d</b> подписок на пользователей, <b>%d</b> зеркал, <b>%d</b> релизов, <b>%d</b> источников входа, <b>%d</b> веб-хуков, <b>%d</b> вех, <b>%d</b> меток, <b>%d</b> задач хуков, <b>%d</b> команд, <b>%d</b> задач по обновлению, <b>%d</b> присоединенных файлов.
|
||||
dashboard.operation_name=Наименование Операции
|
||||
dashboard.operation_switch=Переключить
|
||||
dashboard.operation_run=Запуск
|
||||
dashboard.clean_unbind_oauth=Удалить не привязанные OAUth
|
||||
dashboard.clean_unbind_oauth_success=Не привязанные OAuth аккаунты успешно удалены.
|
||||
dashboard.delete_inactivate_accounts=Удалить все неактивированные учетные записи
|
||||
dashboard.delete_inactivate_accounts_success=Все неактивированные учетные записи удалены успешно.
|
||||
dashboard.delete_repo_archives=Удаление всех архивов репозиториев
|
||||
dashboard.delete_repo_archives_success=Все архивы репозиториев были успешно удалены.
|
||||
dashboard.git_gc_repos=Выполнить сборку мусора на репозиториях
|
||||
dashboard.git_gc_repos_success=Сборка мусора на всех репозиториях успешно выполнена.
|
||||
dashboard.resync_all_sshkeys=Переписать файл «.ssh/authorized_keys» (осторожно: не Gogs ключи будут утеряны)
|
||||
dashboard.resync_all_sshkeys_success=Были успешно переписаны все открытые ключи.
|
||||
dashboard.resync_all_update_hooks=Rewrite all update hook of repositories (needed when custom config path is changed)
|
||||
dashboard.resync_all_update_hooks_success=All repositories' update hook have been rewritten successfully.
|
||||
|
||||
dashboard.server_uptime=Время непрерывной работы сервера
|
||||
dashboard.current_goroutine=Текущий Goroutines
|
||||
dashboard.current_memory_usage=Текущее использование памяти
|
||||
dashboard.total_memory_allocated=Всего памяти выделено
|
||||
dashboard.memory_obtained=Memory Obtained
|
||||
dashboard.pointer_lookup_times=Pointer Lookup Times
|
||||
dashboard.memory_allocate_times=Memory Allocate Times
|
||||
dashboard.memory_free_times=Memory Free Times
|
||||
dashboard.current_heap_usage=Текущее использование кучи
|
||||
dashboard.heap_memory_obtained=Heap Memory Obtained
|
||||
dashboard.heap_memory_idle=Heap Memory Idle
|
||||
dashboard.heap_memory_in_use=Кучи памяти в работе
|
||||
dashboard.heap_memory_released=Heap Memory Released
|
||||
dashboard.heap_objects=Heap Objects
|
||||
dashboard.bootstrap_stack_usage=Bootstrap Stack Usage
|
||||
dashboard.stack_memory_obtained=Stack Memory Obtained
|
||||
dashboard.mspan_structures_usage=MSpan Structures Usage
|
||||
dashboard.mspan_structures_obtained=MSpan Structures Obtained
|
||||
dashboard.mcache_structures_usage=MCache Structures Usage
|
||||
dashboard.mcache_structures_obtained=MCache Structures Obtained
|
||||
dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained
|
||||
dashboard.gc_metadata_obtained=GC Metadada Obtained
|
||||
dashboard.other_system_allocation_obtained=Other System Allocation Obtained
|
||||
dashboard.next_gc_recycle=Next GC Recycle
|
||||
dashboard.last_gc_time=Since Last GC Time
|
||||
dashboard.total_gc_time=Total GC Pause
|
||||
dashboard.total_gc_pause=Total GC Pause
|
||||
dashboard.last_gc_pause=Last GC Pause
|
||||
dashboard.gc_times=GC Times
|
||||
|
||||
users.user_manage_panel=User Manage Panel
|
||||
users.new_account=Создать новый аккаунт
|
||||
users.name=Имя
|
||||
users.activated=Активирован
|
||||
users.admin=Администратор
|
||||
users.repos=Репозитории
|
||||
users.created=Создано
|
||||
users.edit=Редактировать
|
||||
users.auth_source=Источник авторизации
|
||||
users.local=Локальный
|
||||
users.auth_login_name=Authorization Login Name
|
||||
users.update_profile_success=Профиль учетной записи обновлен успешно.
|
||||
users.edit_account=Изменение учетной записи
|
||||
users.is_activated=Эта учетная запись активирована
|
||||
users.is_admin=У этой учетной записи есть права администратора
|
||||
users.allow_git_hook=Пользователь имеет право создать Git перехватчик
|
||||
users.update_profile=Обновить профиль учетной записи
|
||||
users.delete_account=Удалить эту учетную запись
|
||||
users.still_own_repo=На вашем аккаунте все еще остается как минимум один репозиторий, сначала вам нужно удалить или передать его.
|
||||
users.still_has_org=This account still has membership in at least one organization, you have to leave or delete the organizations first.
|
||||
|
||||
orgs.org_manage_panel=Управление группами
|
||||
orgs.name=Имя
|
||||
orgs.teams=Команды
|
||||
orgs.members=Участники
|
||||
|
||||
repos.repo_manage_panel=Repository Manage Panel
|
||||
repos.owner=Владелец
|
||||
repos.name=Имя
|
||||
repos.private=Приватный
|
||||
repos.watches=Следят
|
||||
repos.stars=В избранном
|
||||
repos.issues=Вопросы
|
||||
|
||||
auths.auth_manage_panel=Authorization Manage Panel
|
||||
auths.new=Add New Authorization Source
|
||||
auths.name=Имя
|
||||
auths.type=Тип
|
||||
auths.enabled=Включено
|
||||
auths.updated=Обновлено
|
||||
auths.auth_type=Тип авторизации
|
||||
auths.auth_name=Название авторизации
|
||||
auths.domain=Домен
|
||||
auths.host=Хост
|
||||
auths.port=Порт
|
||||
auths.base_dn=Base DN
|
||||
auths.attribute_username=Username attribute
|
||||
auths.attribute_name=First name attribute
|
||||
auths.attribute_surname=Surname attribute
|
||||
auths.attribute_mail=E-mail attribute
|
||||
auths.filter=Фильтр поиска
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=Тип авторизации SMTP
|
||||
auths.smtphost=Узел SMTP
|
||||
auths.smtpport=SMTP-порт
|
||||
auths.enable_tls=Включение шифрования TLS
|
||||
auths.pam_service_name=PAM Service Name
|
||||
auths.enable_auto_register=Включить автоматическую регистрацию
|
||||
auths.tips=Советы
|
||||
auths.edit=Редактировать параметры авторизации
|
||||
auths.activated=Эта аутентификация активирована
|
||||
auths.update_success=Настройка авторизации обновлена успешно.
|
||||
auths.update=Обновить параметры авторизации
|
||||
auths.delete=Удалить эту авторизацию
|
||||
auths.delete_auth_title=Удаление авторизации
|
||||
auths.delete_auth_desc=Эта авторизация будет удалена. Вы хотите продолжить?
|
||||
|
||||
config.server_config=Конфигурация сервера
|
||||
config.app_name=Имя приложения
|
||||
config.app_ver=Версия приложения
|
||||
config.app_url=URL приложения
|
||||
config.domain=Домен
|
||||
config.offline_mode=Автономный режим
|
||||
config.disable_router_log=Отключение журнала маршрутизатора
|
||||
config.run_user=Запуск пользователем
|
||||
config.run_mode=Режим выполнения
|
||||
config.repo_root_path=Repository Root Path
|
||||
config.static_file_root_path=Static File Root Path
|
||||
config.log_file_root_path=Log File Root Path
|
||||
config.script_type=Тип сценария
|
||||
config.reverse_auth_user=Reverse Authentication User
|
||||
config.db_config=Конфигурация базы данных
|
||||
config.db_type=Тип
|
||||
config.db_host=Хост
|
||||
config.db_name=Имя
|
||||
config.db_user=Пользователь
|
||||
config.db_ssl_mode=Режим SSL
|
||||
config.db_ssl_mode_helper=(только для «postgres»)
|
||||
config.db_path=Путь
|
||||
config.db_path_helper=(for "sqlite3" only)
|
||||
config.service_config=Service Configuration
|
||||
config.register_email_confirm=Require E-mail Confirmation
|
||||
config.disable_register=Отключить регистрацию
|
||||
config.show_registration_button=Show Register Button
|
||||
config.require_sign_in_view=Для просмотра необходима авторизация
|
||||
config.mail_notify=Почтовые уведомления
|
||||
config.enable_cache_avatar=Кешировать аватар
|
||||
config.active_code_lives=Active Code Lives
|
||||
config.reset_password_code_lives=Reset Password Code Lives
|
||||
config.webhook_config=Настройка автоматического обновления репозиции
|
||||
config.task_interval=Интервал задания
|
||||
config.deliver_timeout=Задержка доставки
|
||||
config.skip_tls_verify=Пропустить TLS проверка
|
||||
config.mailer_config=Настройки почты
|
||||
config.mailer_enabled=Включено
|
||||
config.mailer_disable_helo=Отключить HELO
|
||||
config.mailer_name=Имя
|
||||
config.mailer_host=Сервер
|
||||
config.mailer_user=Пользователь
|
||||
config.oauth_config=Конфигурация OAuth
|
||||
config.oauth_enabled=Включено
|
||||
config.cache_config=Настройки кеша
|
||||
config.cache_adapter=Cache Adapter
|
||||
config.cache_interval=Cache Interval
|
||||
config.cache_conn=Cache Connection
|
||||
config.session_config=Session Configuration
|
||||
config.session_provider=Session Provider
|
||||
config.provider_config=Provider Config
|
||||
config.cookie_name=Имя файла cookie
|
||||
config.enable_set_cookie=Enable Set Cookie
|
||||
config.gc_interval_time=GC Interval Time
|
||||
config.session_life_time=Время жизни сессии
|
||||
config.https_only=Только HTTPS
|
||||
config.cookie_life_time=Время жизни файла cookie
|
||||
config.picture_config=Настройка изображения
|
||||
config.picture_service=Picture Service
|
||||
config.disable_gravatar=Отключить Gravatar
|
||||
config.log_config=Конфигурация журнала
|
||||
config.log_mode=Режим журналирования
|
||||
|
||||
monitor.cron=Задачи cron
|
||||
monitor.name=Имя
|
||||
monitor.schedule=Расписание
|
||||
monitor.next=В следующий раз
|
||||
monitor.previous=Предыдущий раз
|
||||
monitor.execute_times=Execute Times
|
||||
monitor.process=Запущенные процессы
|
||||
monitor.desc=Описание
|
||||
monitor.start=Момент начала
|
||||
monitor.execute_time=Время выполнения
|
||||
|
||||
notices.system_notice_list=Система уведомлений
|
||||
notices.type=Тип
|
||||
notices.type_1=Репозиторий
|
||||
notices.desc=Описание
|
||||
notices.op=Op.
|
||||
notices.delete_success=Системное уведомление успешно удалено.
|
||||
|
||||
[action]
|
||||
create_repo=создан репозиторий <a href="%s"> %s</a>
|
||||
commit_repo=pushed to <a href="%s/src/%s">%[2]s</a> at <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`opened issue <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue=`commented on issue <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
transfer_repo=transfered repository <code>%s</code> to <a href="%s">%s</a>
|
||||
push_tag=pushed tag <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a>
|
||||
compare_2_commits=Просмотреть сравнение двух коммитов
|
||||
|
||||
[tool]
|
||||
ago=назад
|
||||
from_now=from now
|
||||
now=сейчас
|
||||
1s=1 second %s
|
||||
1m=1 минута %s
|
||||
1h=1 час %s
|
||||
1d=1 день %s
|
||||
1w=1 неделя %s
|
||||
1mon=1 month %s
|
||||
1y=1 год %s
|
||||
seconds=%d секунд %s
|
||||
minutes=%d минут %s
|
||||
hours=%d часов %s
|
||||
days=%d дней %s
|
||||
weeks=%d weeks %s
|
||||
months=%d months %s
|
||||
years=%d years %s
|
||||
raw_seconds=секунд
|
||||
raw_minutes=минут
|
||||
|
||||
@@ -39,10 +39,18 @@ issues=工单管理
|
||||
|
||||
cancel=取消
|
||||
|
||||
[search]
|
||||
search=搜索...
|
||||
repository=仓库
|
||||
user=用户
|
||||
issue=工单
|
||||
code=代码
|
||||
|
||||
[install]
|
||||
install=安装页面
|
||||
title=首次运行安装程序
|
||||
requite_db_desc=Gogs 允许后端数据库为 MySQL、PostgreSQL 或 SQLite3。
|
||||
db_title=数据库设置
|
||||
db_type=数据库类型
|
||||
host=数据库主机
|
||||
user=数据库用户
|
||||
@@ -52,22 +60,39 @@ db_helper=如果您使用 MySQL,请使用 INNODB 引擎以及 utf8_general_ci
|
||||
ssl_mode=SSL 模式
|
||||
path=数据库文件路径
|
||||
sqlite_helper=SQLite3 数据库的文件路径。
|
||||
err_empty_sqlite_path=SQLite 数据库文件路径不能为空。
|
||||
|
||||
general_title=应用基本设置
|
||||
app_name=应用名称
|
||||
app_name_helper=快用狂拽酷炫的组织名称闪瞎我们!
|
||||
repo_path=仓库根目录
|
||||
repo_path_helper=所有 Git 远程仓库都将被存放于该目录。
|
||||
run_user=运行系统用户
|
||||
run_user_helper=该用户必须具有对仓库根目录和运行 Gogs 的操作权限。
|
||||
domain=域名
|
||||
domain_helper=该设置影响 SSH 克隆地址。
|
||||
http_port=HTTP 端口号
|
||||
http_port_helper=应用监听的端口号
|
||||
app_url=应用 URL
|
||||
app_url_helper=该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。
|
||||
email_title=邮件服务设置(可选)
|
||||
|
||||
optional_title=可选设置
|
||||
email_title=邮件服务设置
|
||||
smtp_host=SMTP 主机
|
||||
smtp_from=邮件来自
|
||||
smtp_from_helper=邮件来自地址,遵循 RFC 5322 标准。可以是一个单纯的邮箱地址或使用 "Name" <email@example.com> 的格式。
|
||||
mailer_user=发送邮箱
|
||||
mailer_password=发送邮箱密码
|
||||
notify_title=通知提醒设置(可选)
|
||||
register_confirm=启用注册邮箱确认
|
||||
mail_notify=启用邮件通知提醒
|
||||
server_service_title=服务器和其它服务设置
|
||||
offline_mode=启用离线模式
|
||||
offline_mode_popup=在部署模式下也禁用从 CDN 获取文件,所以的资源都将从本地服务器获取。
|
||||
disable_registration=禁止用户自主注册
|
||||
disable_registration_popup=禁止用户自行注册功能,只有管理员可以添加帐号。
|
||||
require_sign_in_view=启用登录访问限制
|
||||
require_sign_in_view_popup=只有已登录的用户才能够访问页面,否则将只能看到登录或注册页面。
|
||||
admin_setting_desc=创建管理员帐号并不是必须的,因为 ID=1 的用户将自动获得管理员权限。
|
||||
admin_title=管理员帐号设置
|
||||
admin_name=管理员用户名
|
||||
admin_password=管理员密码
|
||||
@@ -118,6 +143,11 @@ invalid_code=对不起,您的确认代码已过期或已失效。
|
||||
reset_password_helper=单击此处重置密码
|
||||
password_too_short=密码长度不能少于 6 位!
|
||||
|
||||
[modal]
|
||||
yes=确认操作
|
||||
no=取消操作
|
||||
modify=确认修改
|
||||
|
||||
[form]
|
||||
UserName=用户名
|
||||
RepoName=仓库名称
|
||||
@@ -134,6 +164,7 @@ AdminEmail=管理员邮箱
|
||||
require_error=不能为空。
|
||||
alpha_dash_error=必须为英文字母、阿拉伯数字或横线(-_)。
|
||||
alpha_dash_dot_error=必须为英文字母、阿拉伯数字、横线(-_)或点。
|
||||
size_error=长度必须为 %s。
|
||||
min_size_error=长度最小为 %s 个字符。
|
||||
max_size_error=长度最大为 %s 个字符。
|
||||
email_error=不是一个有效的邮箱地址。
|
||||
@@ -148,9 +179,6 @@ org_name_been_taken=组织名称已经被占用。
|
||||
team_name_been_taken=团队名称已经被占用。
|
||||
email_been_used=邮箱地址已经被使用。
|
||||
ssh_key_been_used=SSH 密钥已经被使用。
|
||||
illegal_username=您的用户名包含非法字符。
|
||||
illegal_repo_name=仓库名称包含非法字符。
|
||||
illegal_org_name=组织名称包含非法字符。
|
||||
illegal_team_name=团队名称包含非法字符。
|
||||
username_password_incorrect=用户名或密码不正确。
|
||||
enterred_invalid_repo_name=请检查您输入的仓库名称是正确。
|
||||
@@ -173,6 +201,7 @@ target_branch_not_exist=目标分支不存在。
|
||||
|
||||
[user]
|
||||
change_avatar=到 gravatar.com 上修改您的头像
|
||||
change_custom_avatar=到个人设置中修改头像
|
||||
join_on=加入于
|
||||
repositories=仓库列表
|
||||
activity=公开活动
|
||||
@@ -180,6 +209,9 @@ followers=关注者
|
||||
starred=已点赞
|
||||
following=关注中
|
||||
|
||||
form.name_reserved=用户名 '%s' 是被保留的。
|
||||
form.name_pattern_not_allowed=用户名不允许 '%s' 的格式。
|
||||
|
||||
[settings]
|
||||
profile=个人信息
|
||||
password=修改密码
|
||||
@@ -202,12 +234,31 @@ change_username_desc=用户名被修改,您确定要继续操作吗?这将
|
||||
continue=继续操作
|
||||
cancel=取消操作
|
||||
|
||||
enable_custom_avatar=启动自定义头像
|
||||
enable_custom_avatar_helper=激活该选项来禁止从 Gravatar 获取头像
|
||||
choose_new_avatar=选择新的头像
|
||||
update_avatar=更新头像设置
|
||||
uploaded_avatar_not_a_image=上传的文件不是一张图片!
|
||||
no_custom_avatar_available=未上传过自定义头像,无法激活该选项。
|
||||
update_avatar_success=您的头像设置更新成功!
|
||||
|
||||
change_password=修改密码
|
||||
old_password=当前密码
|
||||
new_password=新的密码
|
||||
password_incorrect=当前密码不正确!
|
||||
change_password_success=密码修改成功!您现在可以使用新的密码登录。
|
||||
|
||||
emails=邮箱地址
|
||||
manage_emails=管理邮箱地址
|
||||
email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。
|
||||
primary=主要
|
||||
primary_email=设为主要
|
||||
delete_email=删除
|
||||
add_new_email=添加新的邮箱地址
|
||||
add_email=添加邮箱
|
||||
add_email_confirmation_sent=一封待确认的电子邮件已发送到 <b>%s</b>,请在 %d 小时内检查您的收件箱,并完成确认过程。
|
||||
add_email_success=新的邮箱地址添加成功!
|
||||
|
||||
manage_ssh_keys=管理 SSH 密钥
|
||||
add_key=增加密钥
|
||||
ssh_desc=以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它!
|
||||
@@ -260,14 +311,19 @@ init_readme=使用 README.md 文件初始化仓库
|
||||
create_repo=创建仓库
|
||||
default_branch=默认分支
|
||||
mirror_interval=镜像同步周期(小时)
|
||||
goget_meta=Go-Get 支持
|
||||
goget_meta_helper=本仓库将可以通过 <span class="label label-blue label-radius">Go Get</span> 获取
|
||||
|
||||
form.name_reserved=仓库名称 '%s' 是被保留的。
|
||||
form.name_pattern_not_allowed=仓库名称不允许 '%s' 的格式。
|
||||
|
||||
need_auth=需要授权验证
|
||||
migrate_type=迁移类型
|
||||
migrate_type_helper=本仓库将是 <span class="label label-blue label-radius">镜像</span>
|
||||
migrate_repo=迁移仓库
|
||||
migrate.clone_address=克隆地址
|
||||
migrate.invalid_local_path=无效的本地路径,不存在或不是一个目录!
|
||||
|
||||
forked_from=派生自
|
||||
fork_from_self=无法派生已经拥有的仓库!
|
||||
copy_link=复制链接
|
||||
click_to_copy=复制到剪切板
|
||||
copied=复制成功
|
||||
@@ -290,11 +346,14 @@ branch_and_tags=分支与标签
|
||||
branches=分支列表
|
||||
tags=标签列表
|
||||
issues=工单管理
|
||||
labels=标签管理
|
||||
milestones=里程碑
|
||||
commits=提交历史
|
||||
releases=版本发布
|
||||
file_raw=原始文件
|
||||
file_history=文件历史
|
||||
file_view_raw=查看原始文件
|
||||
file_permalink=永久链接
|
||||
|
||||
commits.commits=次代码提交
|
||||
commits.search=搜索提交历史
|
||||
@@ -305,6 +364,34 @@ commits.date=提交日期
|
||||
commits.older=更旧的提交
|
||||
commits.newer=更新的提交
|
||||
|
||||
issues.new=创建工单
|
||||
issues.new_label=创建标签
|
||||
issues.new_label_placeholder=标签名称...
|
||||
issues.open_tab=%d 个开启中
|
||||
issues.close_tab=%d 个已关闭
|
||||
issues.filter_label=标签筛选
|
||||
issues.filter_label_no_select=无筛选标签
|
||||
issues.filter_milestone=里程碑筛选
|
||||
issues.filter_assignee=指派人筛选
|
||||
issues.filter_type=类型筛选
|
||||
issues.filter_type.all_issues=所有工单
|
||||
issues.filter_type.assigned_to_you=指派给您的
|
||||
issues.filter_type.created_by_you=由您创建的
|
||||
issues.filter_type.mentioning_you=提及您的
|
||||
issues.opened_by=由 <a href="/%[2]s">%[2]s</a> 于%[1]s创建
|
||||
issues.previous=上一页
|
||||
issues.next=下一页
|
||||
issues.label_title=标签名称
|
||||
issues.label_color=标签颜色
|
||||
issues.label_count=%d 个标签
|
||||
issues.label_open_issues=%d 个开启的工单
|
||||
issues.label_edit=编辑
|
||||
issues.label_delete=删除
|
||||
issues.label_modify=修改标签
|
||||
issues.label_deletion=删除标签
|
||||
issues.label_deletion_desc=删除该标签将会移除所有工单中相关的信息。是否继续?
|
||||
issues.label_deletion_success=标签删除成功!
|
||||
|
||||
settings=仓库设置
|
||||
settings.options=基本设置
|
||||
settings.collaboration=管理协作者
|
||||
@@ -368,6 +455,30 @@ diff.stats_desc=共有 <strong> %d 个文件被更改</strong>,包括 <strong>
|
||||
diff.bin=二进制
|
||||
diff.view_file=查看文件
|
||||
|
||||
release.releases=版本发布
|
||||
release.new_release=发布新版
|
||||
release.draft=草稿
|
||||
release.prerelease=预发行
|
||||
release.stable=稳定
|
||||
release.edit=编辑
|
||||
release.ahead=在该版本发布之后已有 <strong>%d</strong> 次代码提交到 %s 分支
|
||||
release.source_code=源代码
|
||||
release.tag_name=标签名称
|
||||
release.target=目标分支
|
||||
release.tag_helper=选择或创建一个已经存在的标签
|
||||
release.release_title=发布标题
|
||||
release.content_with_md=使用 <a href="%s">Markdown</a> 编辑内容
|
||||
release.write=内容编辑
|
||||
release.preview=效果预览
|
||||
release.content_placeholder=请输入内容
|
||||
release.loading=正在加载...
|
||||
release.prerelease_desc=这是一个预发行版本
|
||||
release.prerelease_helper=我们会告知用户不建议将本次发布投入生产环境使用。
|
||||
release.publish=发布版本
|
||||
release.save_draft=保存草稿
|
||||
release.edit_release=编辑发布信息
|
||||
release.tag_name_already_exist=已经存在使用相同标签进行发布的版本。
|
||||
|
||||
[org]
|
||||
org_name_holder=组织名称
|
||||
org_name_helper=伟大的组织都有一个简短而寓意深刻的名字。
|
||||
@@ -387,6 +498,9 @@ team_name_helper=您可以使用该名称来通知改组全体成员。
|
||||
team_desc_helper=一句话描述这个团队是做什么的。
|
||||
team_permission_desc=请选择该团队所具有的权限等级:
|
||||
|
||||
form.name_reserved=组织名称 '%s' 是被保留的。
|
||||
form.name_pattern_not_allowed=组织名称不允许 '%s' 的格式。
|
||||
|
||||
settings=组织设置
|
||||
settings.options=基本设置
|
||||
settings.full_name=组织全名
|
||||
@@ -467,6 +581,13 @@ dashboard.delete_inactivate_accounts=删除所有未激活帐户
|
||||
dashboard.delete_inactivate_accounts_success=所有未激活帐号清除成功!
|
||||
dashboard.delete_repo_archives=删除所有仓库存档
|
||||
dashboard.delete_repo_archives_success=所有仓库存档清除成功!
|
||||
dashboard.git_gc_repos=对仓库进行垃圾回收
|
||||
dashboard.git_gc_repos_success=所有仓库垃圾回收成功!
|
||||
dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gogs 的密钥也会被删除)
|
||||
dashboard.resync_all_sshkeys_success=所有公钥重新生成成功!
|
||||
dashboard.resync_all_update_hooks=重新生成所有仓库的 Update 钩子(用于自定义配置文件被修改)
|
||||
dashboard.resync_all_update_hooks_success=所有仓库的 Update 钩子重新生成成功!
|
||||
|
||||
dashboard.server_uptime=服务运行时间
|
||||
dashboard.current_goroutine=当前 Goroutines 数量
|
||||
dashboard.current_memory_usage=当前内存使用量
|
||||
@@ -543,13 +664,17 @@ auths.domain=域名
|
||||
auths.host=主机地址
|
||||
auths.port=主机端口
|
||||
auths.base_dn=Base DN
|
||||
auths.attributes=Search Attributes
|
||||
auths.attribute_username=用户名属性
|
||||
auths.attribute_name=名字属性
|
||||
auths.attribute_surname=姓氏属性
|
||||
auths.attribute_mail=邮箱属性
|
||||
auths.filter=Search Filter
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=SMTP 授权类型
|
||||
auths.smtphost=SMTP 主机地址
|
||||
auths.smtpport=SMTP 主机端口
|
||||
auths.enable_tls=启用 TLS 加密
|
||||
auths.pam_service_name=PAM 服务名称
|
||||
auths.enable_auto_register=允许授权用户自动注册
|
||||
auths.tips=帮助提示
|
||||
auths.edit=修改授权认证设置
|
||||
@@ -586,6 +711,7 @@ config.db_path_helper=(仅限 "sqlite3" 使用)
|
||||
config.service_config=服务配置
|
||||
config.register_email_confirm=注册邮件确认
|
||||
config.disable_register=关闭注册功能
|
||||
config.show_registration_button=显示注册按钮
|
||||
config.require_sign_in_view=强制登录浏览
|
||||
config.mail_notify=邮件通知提醒
|
||||
config.enable_cache_avatar=开启缓存头像
|
||||
@@ -594,8 +720,10 @@ config.reset_password_code_lives=重置密码链接有效期
|
||||
config.webhook_config=Web 钩子配置
|
||||
config.task_interval=任务周期
|
||||
config.deliver_timeout=推送超时
|
||||
config.skip_tls_verify=忽略 TLS 验证
|
||||
config.mailer_config=邮件配置
|
||||
config.mailer_enabled=启用服务
|
||||
config.mailer_disable_helo=禁用 HELO 操作
|
||||
config.mailer_name=发送者名称
|
||||
config.mailer_host=邮件主机地址
|
||||
config.mailer_user=发送者帐号
|
||||
@@ -639,12 +767,12 @@ notices.op=操作
|
||||
notices.delete_success=系统提示删除成功!
|
||||
|
||||
[action]
|
||||
create_repo=创建了仓库 <a href="%s/%s">%s</a>
|
||||
commit_repo=推送了 <a href="%s/%s/src/%s">%s</a> 分支的代码到 <a href="%s/%s">%s</a>
|
||||
create_issue=创建了工单 <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
comment_issue=评论了工单 <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
transfer_repo=将仓库 <code>%s</code> 转移至 <a href="/%s%s">%s</a>
|
||||
push_tag=推送了标签 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
|
||||
create_repo=创建了仓库 <a href="%s">%s</a>
|
||||
commit_repo=推送了 <a href="%s/src/%s">%[2]s</a> 分支的代码到 <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`创建了工单 <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue=`评论了工单 <a href="%s/issues/%s">%s#%[2]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>
|
||||
compare_2_commits=查看 2 次提交的内容对比
|
||||
|
||||
[tool]
|
||||
@@ -668,16 +796,3 @@ years=%d 年%s
|
||||
raw_seconds=秒
|
||||
raw_minutes=分钟
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -39,10 +39,18 @@ issues=問題管理
|
||||
|
||||
cancel=取消
|
||||
|
||||
[search]
|
||||
search=搜尋...
|
||||
repository=倉庫
|
||||
user=用戶
|
||||
issue=工單
|
||||
code=程式碼
|
||||
|
||||
[install]
|
||||
install=安裝頁面
|
||||
title=首次執行安裝程序
|
||||
requite_db_desc=Gogs 允許後端數據庫為 MySQL、PostgreSQL 或 SQLite3,但是 SQLite3 一般只有官方二進制發行版才支持。
|
||||
db_title=數據庫設置
|
||||
db_type=數據庫類型
|
||||
host=數據庫主機
|
||||
user=數據庫用戶
|
||||
@@ -52,22 +60,39 @@ db_helper=如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci
|
||||
ssl_mode=SSL 模式
|
||||
path=數據庫文件路徑
|
||||
sqlite_helper=SQLite3 數據庫的文件路徑。
|
||||
err_empty_sqlite_path=SQLite 數據庫文件路徑不能為空。
|
||||
|
||||
general_title=應用基本設置
|
||||
app_name=應用名稱
|
||||
app_name_helper=為您的組織取個響亮而又偉大的名稱
|
||||
repo_path=倉庫根目錄
|
||||
repo_path_helper=所有 Git 遠程倉庫都將被存放於該目錄。
|
||||
run_user=執行系統用戶
|
||||
run_user_helper=該用戶必須具有對倉庫根目錄和執行 Gogs 的操作權限。
|
||||
domain=域名
|
||||
domain_helper=該設置影響 SSH 復製地址。
|
||||
domain_helper=該設置影響 SSH 複製地址。
|
||||
http_port=HTTP 端口號
|
||||
http_port_helper=應用監聽的端口號
|
||||
app_url=應用 URL
|
||||
app_url_helper=該設置影響 HTTP/HTTPS 復製地址和一些郵箱中的連結。
|
||||
email_title=郵件服務設置(可選)
|
||||
app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。
|
||||
|
||||
optional_title=可選設置
|
||||
email_title=電子郵件服務設定
|
||||
smtp_host=SMTP 主機
|
||||
smtp_from=郵件來自
|
||||
smtp_from_helper=郵件來自地址,遵循 RFC 5322 標准。可以是一個單純的郵箱地址或使用 "name" <email@example.com> 的格式。
|
||||
mailer_user=發送郵箱
|
||||
mailer_password=發送郵箱密碼
|
||||
notify_title=通知提醒設置(可選)
|
||||
register_confirm=啟用註冊郵箱確認
|
||||
mail_notify=啟用郵件通知提醒
|
||||
server_service_title=伺服器和其他服務設置
|
||||
offline_mode=啓用離線模式
|
||||
offline_mode_popup=在部署模式下也禁用從 CDN 獲取文件,所有的資源將從本地伺服器獲取。
|
||||
disable_registration=禁止用戶自主註冊
|
||||
disable_registration_popup=禁止用戶自主註冊功能,只有管理員可以添加帳號。
|
||||
require_sign_in_view=啓用登錄訪問限制
|
||||
require_sign_in_view_popup=只有已登錄的用戶才能夠訪問頁面,否則將只能看到登錄或註冊頁面。
|
||||
admin_setting_desc=創建管理員帳號並不是必須的,因為 ID=1 的用戶將自動獲得管理員權限。
|
||||
admin_title=管理員帳號設置
|
||||
admin_name=管理員用戶名
|
||||
admin_password=管理員密碼
|
||||
@@ -109,7 +134,7 @@ confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 <b>%s</
|
||||
sign_in_email=登錄到您的郵箱
|
||||
active_your_account=激活您的帳戶
|
||||
resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試!
|
||||
has_unconfirmed_mail=%s 您好,系統檢測到您有一封發送至 <b>%s</b> 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。
|
||||
has_unconfirmed_mail=%s 您好,您有一封發送至( <b>%s</b>) 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。
|
||||
resend_mail=單擊此處重新發送確認郵件
|
||||
email_not_associate=您輸入的郵箱地址未被關聯到任何帳號!
|
||||
send_reset_mail=單擊此處(重新)發送您的密碼重置郵件
|
||||
@@ -118,6 +143,11 @@ invalid_code=對不起,您的確認代碼已過期或已失效。
|
||||
reset_password_helper=單擊此處重置密碼
|
||||
password_too_short=密碼長度不能少於 6 位!
|
||||
|
||||
[modal]
|
||||
yes=確認操作
|
||||
no=取消操作
|
||||
modify=確認修改
|
||||
|
||||
[form]
|
||||
UserName=用戶名
|
||||
RepoName=倉庫名稱
|
||||
@@ -134,6 +164,7 @@ AdminEmail=管理員郵箱
|
||||
require_error=不能為空。
|
||||
alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。
|
||||
alpha_dash_dot_error=必須為英文字母、阿拉伯數字、橫線(-_)或點。
|
||||
size_error=長度必須為 %s。
|
||||
min_size_error=長度最小為 %s 個字符。
|
||||
max_size_error=長度最大為 %s 個字符。
|
||||
email_error=不是一個有效的郵箱地址。
|
||||
@@ -148,9 +179,6 @@ org_name_been_taken=組織名稱已經被佔用。
|
||||
team_name_been_taken=團隊名稱已經被佔用。
|
||||
email_been_used=郵箱地址已經被使用。
|
||||
ssh_key_been_used=SSH 密鑰已經被使用。
|
||||
illegal_username=您的用戶名包含不合法字符。
|
||||
illegal_repo_name=倉庫名稱包含不合法字符。
|
||||
illegal_org_name=組織名稱包含不合法字符。
|
||||
illegal_team_name=團隊名稱包含不合法字符。
|
||||
username_password_incorrect=用戶名或密碼不正確。
|
||||
enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。
|
||||
@@ -173,6 +201,7 @@ target_branch_not_exist=目標分支不存在
|
||||
|
||||
[user]
|
||||
change_avatar=到 gravatar.com 上修改您的頭像
|
||||
change_custom_avatar=到個人設置中修改頭像
|
||||
join_on=加入於
|
||||
repositories=倉庫列表
|
||||
activity=公開活動
|
||||
@@ -180,6 +209,9 @@ followers=關註者
|
||||
starred=已讚好
|
||||
following=關註中
|
||||
|
||||
form.name_reserved=用戶名 '%s' 是被保留的。
|
||||
form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。
|
||||
|
||||
[settings]
|
||||
profile=個人信息
|
||||
password=修改密碼
|
||||
@@ -202,12 +234,31 @@ change_username_desc=用戶名被修改,您確定要繼續操作嗎?這將
|
||||
continue=繼續操作
|
||||
cancel=取消操作
|
||||
|
||||
enable_custom_avatar=啟動自定義頭像
|
||||
enable_custom_avatar_helper=激活該選項來禁止從 Gravatar 獲取頭像
|
||||
choose_new_avatar=選擇新的頭像
|
||||
update_avatar=更新頭像設置
|
||||
uploaded_avatar_not_a_image=上傳的文件不是一張圖片!
|
||||
no_custom_avatar_available=沒有任何自定義頭像,無法激活該選項。
|
||||
update_avatar_success=您的頭像設置更新成功!
|
||||
|
||||
change_password=修改密碼
|
||||
old_password=當前密碼
|
||||
new_password=新的密碼
|
||||
password_incorrect=當前密碼不正確!
|
||||
change_password_success=密碼修改成功!您現在可以使用新的密碼登錄。
|
||||
|
||||
emails=電子郵件地址
|
||||
manage_emails=管理電子郵件地址
|
||||
email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。
|
||||
primary=主要
|
||||
primary_email=设为主要
|
||||
delete_email=刪除
|
||||
add_new_email=添加新的電子郵件地址
|
||||
add_email=添加電子郵件
|
||||
add_email_confirmation_sent=一封待確認的電子郵件已發送到<b>%s</b>,請在%d 小時內檢查您的收件箱,並完成確認過程。
|
||||
add_email_success=新的邮箱地址添加成功。
|
||||
|
||||
manage_ssh_keys=管理 SSH 密鑰
|
||||
add_key=增加密鑰
|
||||
ssh_desc=以下是與您帳戶所關聯的 SSH 密鑰,如果您發現有陌生的密鑰,請立即刪除它!
|
||||
@@ -232,7 +283,7 @@ tokens_desc=您可以使用這些已生成的令牌來操作 Gogs API。
|
||||
new_token_desc=目前為止,任何令牌都對您的帳戶擁有完整的操作權限。
|
||||
token_name=令牌名稱
|
||||
generate_token=生成令牌
|
||||
generate_token_succees=新的操作令牌生成成功!您必須立即復製到一個安全的地方,因為該令牌只會顯示一次!
|
||||
generate_token_succees=新的操作令牌生成成功!您必須立即複製到一個安全的地方,因為該令牌只會顯示一次!
|
||||
delete_token=删除令牌
|
||||
delete_token_success=個人操作令牌刪除成功!請更新與該令牌有關的所有應用。
|
||||
|
||||
@@ -260,17 +311,22 @@ init_readme=使用 README.md 文件初始化倉庫
|
||||
create_repo=創建倉庫
|
||||
default_branch=默認分支
|
||||
mirror_interval=鏡像同步周期(小時)
|
||||
goget_meta=Go-Get 支持
|
||||
goget_meta_helper=本倉庫將可以通過 <span class="label label-blue label-radius">Go Get</span> 獲取
|
||||
|
||||
form.name_reserved=倉庫名稱 '%s' 是被保留的。
|
||||
form.name_pattern_not_allowed=倉庫名稱不允許 '%s' 的格式。
|
||||
|
||||
need_auth=需要授權驗證
|
||||
migrate_type=遷移類型
|
||||
migrate_type_helper=本倉庫將是 <span class="label label-blue label-radius">鏡像</span>
|
||||
migrate_repo=遷移倉庫
|
||||
migrate.clone_address=複製地址
|
||||
migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄!
|
||||
|
||||
copy_link=復製連結
|
||||
click_to_copy=復製到剪切簿
|
||||
copied=復製成功
|
||||
forked_from=派生自
|
||||
fork_from_self=無法派生已經擁有的倉庫!
|
||||
copy_link=複製連結
|
||||
click_to_copy=複製到剪切簿
|
||||
copied=複製成功
|
||||
clone_helper=不知道如何操作?訪問 <a target="_blank"href="%s"> 帮助説明</a> !
|
||||
unwatch=取消關註
|
||||
watch=關註
|
||||
@@ -280,7 +336,7 @@ fork=派生
|
||||
|
||||
no_desc=暫無描述
|
||||
quick_guide=快速幫助
|
||||
clone_this_repo=復製當前倉庫
|
||||
clone_this_repo=複製當前倉庫
|
||||
create_new_repo_command=從命令行創建一個新的倉庫
|
||||
push_exist_repo=從命令行推送已經創建的倉庫
|
||||
|
||||
@@ -290,11 +346,14 @@ branch_and_tags=分支與標籤
|
||||
branches=分支列表
|
||||
tags=標籤列表
|
||||
issues=問題管理
|
||||
labels=標籤
|
||||
milestones=里程碑
|
||||
commits=提交歷史
|
||||
releases=版本發佈
|
||||
file_raw=原始文件
|
||||
file_history=文件歷史
|
||||
file_view_raw=查看原始文件
|
||||
file_permalink=永久連結
|
||||
|
||||
commits.commits=次代碼提交
|
||||
commits.search=搜索提交歷史
|
||||
@@ -305,6 +364,34 @@ commits.date=提交日期
|
||||
commits.older=更舊的提交
|
||||
commits.newer=更新的提交
|
||||
|
||||
issues.new=創建問題
|
||||
issues.new_label=創建標籤
|
||||
issues.new_label_placeholder=標籤名稱...
|
||||
issues.open_tab=%d 個開啓中
|
||||
issues.close_tab=%d 個已關閉
|
||||
issues.filter_label=標籤篩選
|
||||
issues.filter_label_no_select=無篩選標籤
|
||||
issues.filter_milestone=里程碑篩選
|
||||
issues.filter_assignee=指派人篩選
|
||||
issues.filter_type=類型篩選
|
||||
issues.filter_type.all_issues=所有問題
|
||||
issues.filter_type.assigned_to_you=指派給您的
|
||||
issues.filter_type.created_by_you=由您創建的
|
||||
issues.filter_type.mentioning_you=提及您的
|
||||
issues.opened_by=由 <a href="/%[2]s">%[2]s</a> 於%[1]s創建
|
||||
issues.previous=上一頁
|
||||
issues.next=下一頁
|
||||
issues.label_title=標籤名稱
|
||||
issues.label_color=標籤顏色
|
||||
issues.label_count=%d 個標籤
|
||||
issues.label_open_issues=%d 個開啓的問題
|
||||
issues.label_edit=編輯
|
||||
issues.label_delete=刪除
|
||||
issues.label_modify=修改標籤
|
||||
issues.label_deletion=刪除標籤
|
||||
issues.label_deletion_desc=刪除該標籤將會移除所有問題中相關的訊息。是否繼續?
|
||||
issues.label_deletion_success=標籤刪除成功!
|
||||
|
||||
settings=倉庫設置
|
||||
settings.options=基本設置
|
||||
settings.collaboration=管理協作者
|
||||
@@ -368,6 +455,30 @@ diff.stats_desc=共有 <strong> %d 個文件被更改</strong>,包括 <strong>
|
||||
diff.bin=二進制
|
||||
diff.view_file=查看文件
|
||||
|
||||
release.releases=版本發佈
|
||||
release.new_release=發佈新版本
|
||||
release.draft=草稿
|
||||
release.prerelease=預發佈版本
|
||||
release.stable=穩定
|
||||
release.edit=編輯
|
||||
release.ahead=在該版本發佈之後已有 <strong>%d</strong> 次代碼提交到 %s 分支
|
||||
release.source_code=源代碼
|
||||
release.tag_name=標籤名稱
|
||||
release.target=目標分支
|
||||
release.tag_helper=選擇或創建一個已存在的標籤
|
||||
release.release_title=發佈標題
|
||||
release.content_with_md=使用 <a href="%s">Markdown</a> 編輯內容
|
||||
release.write=內容編輯
|
||||
release.preview=效果預覽
|
||||
release.content_placeholder=請輸入內容
|
||||
release.loading=正在加載...
|
||||
release.prerelease_desc=這是一個預發佈版本
|
||||
release.prerelease_helper=我們會告知用戶不建議將本發佈投入生產環境使用。
|
||||
release.publish=發佈版本
|
||||
release.save_draft=保在草稿
|
||||
release.edit_release=編輯發佈信息
|
||||
release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。
|
||||
|
||||
[org]
|
||||
org_name_holder=組織名稱
|
||||
org_name_helper=偉大的組織都有一個簡短而寓意深刻的名字。
|
||||
@@ -387,6 +498,9 @@ team_name_helper=您可以使用該名稱來通知改組全體成員。
|
||||
team_desc_helper=一句話描述這個團隊是做什麼的。
|
||||
team_permission_desc=請選擇該團隊所具有的權限等級:
|
||||
|
||||
form.name_reserved=組織名稱 '%s' 是被保留的。
|
||||
form.name_pattern_not_allowed=組織名稱不允許 '%s' 的格式。
|
||||
|
||||
settings=組織設置
|
||||
settings.options=基本設置
|
||||
settings.full_name=組織全名
|
||||
@@ -419,11 +533,11 @@ members.invite_now=立即邀請
|
||||
teams.join=加入團隊
|
||||
teams.leave=離開團隊
|
||||
teams.read_access=讀取權限
|
||||
teams.read_access_helper=這個團隊將擁有查看和復製所屬倉庫的權限。
|
||||
teams.read_access_helper=這個團隊將擁有查看和複製所屬倉庫的權限。
|
||||
teams.write_access=寫入權限
|
||||
teams.write_access_helper=這個團隊將擁有查看、復製和推送所屬倉庫的權限。
|
||||
teams.write_access_helper=這個團隊將擁有查看、複製和推送所屬倉庫的權限。
|
||||
teams.admin_access=管理權限
|
||||
teams.admin_access_helper=這個團隊將擁有查看、復製、推送和添加其他組織成員到團隊的權限。
|
||||
teams.admin_access_helper=這個團隊將擁有查看、複製、推送和添加其他組織成員到團隊的權限。
|
||||
teams.no_desc=該團隊暫無描述
|
||||
teams.settings=團隊設置
|
||||
teams.owners_permission_desc=管理員團隊對 <strong>所有倉庫</strong> 具有操作權限,且對組織具有 <strong>管理員權限</strong>。
|
||||
@@ -434,9 +548,9 @@ teams.add_team_member=添加團隊成員
|
||||
teams.delete_team_title=團隊刪除操作
|
||||
teams.delete_team_desc=刪除操作會永久清除有關該團隊的信息,您確定要繼續操作嗎?團隊成員可能會失去對某些倉庫的操作權限。
|
||||
teams.delete_team_success=指定團隊刪除成功!
|
||||
teams.read_permission_desc=該團隊擁有對所屬倉庫的 <strong>讀取</strong> 權限,團隊成員可以進行查看和復製等只讀操作。
|
||||
teams.read_permission_desc=該團隊擁有對所屬倉庫的 <strong>讀取</strong> 權限,團隊成員可以進行查看和複製等只讀操作。
|
||||
teams.write_permission_desc=該團隊擁有對所屬倉庫的 <strong>讀取</strong> 和 <strong>寫入</strong> 的權限。
|
||||
teams.admin_permission_desc=該團隊擁有一定的 <strong>管理</strong> 權限,團隊成員可以讀取、復製、推送以及添加其它倉庫協作者。
|
||||
teams.admin_permission_desc=該團隊擁有一定的 <strong>管理</strong> 權限,團隊成員可以讀取、複製、推送以及添加其它倉庫協作者。
|
||||
teams.repositories=團隊倉庫
|
||||
teams.add_team_repository=添加團隊倉庫
|
||||
teams.remove_repo=移除倉庫
|
||||
@@ -467,6 +581,13 @@ dashboard.delete_inactivate_accounts=刪除所有未激活帳戶
|
||||
dashboard.delete_inactivate_accounts_success=所有未激活帳號清除成功!
|
||||
dashboard.delete_repo_archives=刪除所有倉庫存檔
|
||||
dashboard.delete_repo_archives_success=所有倉庫存檔清除成功!
|
||||
dashboard.git_gc_repos=對倉庫進行垃圾回收
|
||||
dashboard.git_gc_repos_success=所有倉庫的垃圾回收已成功完成!
|
||||
dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gogs 的密鑰也會被刪除)
|
||||
dashboard.resync_all_sshkeys_success=所有公鑰重新生成成功!
|
||||
dashboard.resync_all_update_hooks=重新生成所有倉庫的 Update 鈎子(用於被修改的自定義配置文件)
|
||||
dashboard.resync_all_update_hooks_success=已成功重新生成所有倉庫的 Update 鈎子!
|
||||
|
||||
dashboard.server_uptime=服務執行時間
|
||||
dashboard.current_goroutine=當前 Goroutines 數量
|
||||
dashboard.current_memory_usage=當前內存使用量
|
||||
@@ -543,13 +664,17 @@ auths.domain=域名
|
||||
auths.host=主機地址
|
||||
auths.port=主機端口
|
||||
auths.base_dn=Base DN
|
||||
auths.attributes=搜尋屬性
|
||||
auths.attribute_username=用戶名屬性
|
||||
auths.attribute_name=名子屬性
|
||||
auths.attribute_surname=姓氏屬性
|
||||
auths.attribute_mail=電子郵箱屬性
|
||||
auths.filter=搜尋過濾
|
||||
auths.ms_ad_sa=Ms Ad SA
|
||||
auths.smtp_auth=SMTP 授權類型
|
||||
auths.smtphost=SMTP 主機地址
|
||||
auths.smtpport=SMTP 主機端口
|
||||
auths.enable_tls=啟用 TLS 加密
|
||||
auths.pam_service_name=PAM 服務名稱
|
||||
auths.enable_auto_register=允許授權用戶自動註冊
|
||||
auths.tips=幫助提示
|
||||
auths.edit=修改授權認證設置
|
||||
@@ -584,8 +709,9 @@ config.db_ssl_mode_helper=(僅限 "postgres" 使用)
|
||||
config.db_path=數據庫路徑
|
||||
config.db_path_helper=(僅限 "sqlite3" 使用)
|
||||
config.service_config=服務配置
|
||||
config.register_email_confirm=註冊郵件確認
|
||||
config.register_email_confirm=註冊電子郵件確認
|
||||
config.disable_register=關閉註冊功能
|
||||
config.show_registration_button=顯示註冊按鈕
|
||||
config.require_sign_in_view=強制登錄瀏覽
|
||||
config.mail_notify=郵件通知提醒
|
||||
config.enable_cache_avatar=開啟緩存頭像
|
||||
@@ -594,8 +720,10 @@ config.reset_password_code_lives=重置密碼連結有效期
|
||||
config.webhook_config=Web 鉤子配置
|
||||
config.task_interval=任務周期
|
||||
config.deliver_timeout=推送超時
|
||||
config.skip_tls_verify=忽略 TLS 驗證
|
||||
config.mailer_config=郵件配置
|
||||
config.mailer_enabled=啟用服務
|
||||
config.mailer_disable_helo=禁用 HELO 操作
|
||||
config.mailer_name=發送者名稱
|
||||
config.mailer_host=郵件主機地址
|
||||
config.mailer_user=發送者帳號
|
||||
@@ -639,12 +767,12 @@ notices.op=操作
|
||||
notices.delete_success=系統提示刪除成功!
|
||||
|
||||
[action]
|
||||
create_repo=創建了倉庫 <a href="%s/%s">%s</a>
|
||||
commit_repo=推送了 <a href="%s/%s/src/%s">%s</a> 分支的代碼到 <a href="%s/%s">%s</a>
|
||||
create_issue=創建了問題 <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
comment_issue=評論了問題 <a href="%s/%s/issues/%s">%s#%s</a>
|
||||
transfer_repo=將倉庫 <code>%s</code> 轉移至 <a href="/%s%s">%s</a>
|
||||
push_tag=推送了標籤 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
|
||||
create_repo=創建了倉庫 <a href="%s">%s</a>
|
||||
commit_repo=推送了 <a href="%s/src/%s">%[2]s</a> 分支的代碼到 <a href="%[1]s">%[3]s</a>
|
||||
create_issue=`創建了問題 <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue=`評論了問題 <a href="%s/issues/%s">%s#%[2]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>
|
||||
compare_2_commits=查看 2 次提交的內容對比
|
||||
|
||||
[tool]
|
||||
@@ -668,16 +796,3 @@ years=%d 年%s
|
||||
raw_seconds=秒
|
||||
raw_minutes=分鐘
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1980
config.codekit
Normal file
1980
config.codekit
Normal file
File diff suppressed because it is too large
Load Diff
12
docker-compose.yml
Normal file
12
docker-compose.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
web:
|
||||
build: .
|
||||
links:
|
||||
- mysql
|
||||
ports:
|
||||
- "3000:3000"
|
||||
|
||||
mysql:
|
||||
image: mysql
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=gogs
|
||||
- MYSQL_DATABASE=gogs
|
||||
@@ -3,13 +3,13 @@ Docker
|
||||
|
||||
TOOLS ARE WRITTEN FOR TESTING AND TO SEE WHAT IT IS!
|
||||
|
||||
For this to work you will need the nifty docker tool [fig].
|
||||
For this to work you will need the nifty docker tool [docker-compose].
|
||||
|
||||
The most simple setup will look like this:
|
||||
|
||||
```sh
|
||||
./assemble_blocks.sh docker_gogs w_db option_db_mysql
|
||||
fig up
|
||||
docker-compose up
|
||||
|
||||
```
|
||||
|
||||
@@ -22,21 +22,21 @@ How does it work
|
||||
----------------
|
||||
|
||||
`./assemble_blocks.sh` will look in `blocks` for subdirectories.
|
||||
In the subdirectories there are three relevant files: `Dockerfile`, `config` and `fig`.
|
||||
In the subdirectories there are three relevant files: `Dockerfile`, `config` and `docker-compose`.
|
||||
|
||||
`Dockerfile` will be copied to `docker/` (also means last `Dockerfile` wins).
|
||||
|
||||
The `config` file contains lines which will in the gogs docker container end up in `$GOGS_PATH/custom/config/app.ini` and by this gogs will be configured.
|
||||
Here you can define things like the MySQL server for your database block.
|
||||
|
||||
The `fig` file will just be added to `fig.yml`, which is used by fig to manage your containers.
|
||||
This inculdes container linking!
|
||||
The `docker-compose` file will just be added to `docker-compose.yml`, which is used by docker-compose to manage your containers.
|
||||
This includes container linking!
|
||||
|
||||
Just have a look at them and it will be clear how to write your own blocks.
|
||||
|
||||
Just some things
|
||||
|
||||
- all files (`Dockerfile`, `fig` and `config`) are optional
|
||||
- all files (`Dockerfile`, `docker-compose` and `config`) are optional
|
||||
- the gogs block should always be the first block
|
||||
|
||||
Currently the blocks are designed that, the blocks that start with `docker` pull in the base docker image.
|
||||
@@ -53,18 +53,15 @@ Example:
|
||||
More sophisticated Example
|
||||
--------------------------
|
||||
|
||||
Her is a more elaborated example
|
||||
Here is a more elaborated example
|
||||
|
||||
```sh
|
||||
./assemble_blocks.sh docker_gogs w_db_cache_session option_db_postgresql option_cache_redis option_session_mysql
|
||||
fig up
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
This will set up four containters and link them proberly. One for each of
|
||||
|
||||
- gogs
|
||||
- database (postgresql)
|
||||
- cache (redis)
|
||||
docker-compose
|
||||
- session (mysql)
|
||||
|
||||
WARNING: This will not work at the Moment! MySQL session is broken!
|
||||
@@ -73,7 +70,7 @@ WARNING: This will not work at the Moment! MySQL session is broken!
|
||||
Remark
|
||||
------
|
||||
|
||||
After you execute `assemble_blocks.sh` you should always trigger `fig build` to inculde the the new init script `init_gogs.sh` in the docker image.
|
||||
After you execute `assemble_blocks.sh` you should always trigger `docker-compose build` to inculde the the new init script `init_gogs.sh` in the docker image.
|
||||
|
||||
If you want to use another GoGS docker file, but keep everything else the same, you can create a block, e.g. `docker_gogs_custom`, with only a `Dockerfile` and call
|
||||
|
||||
@@ -86,4 +83,4 @@ This will pull in the `Dockerfile` from `docker_gogs` instead of the one from `d
|
||||
`Dockerfile`s for the `master` and `dev` branch are provided as `docker_gogs` and `docker_gogs_dev`
|
||||
|
||||
|
||||
[fig]:http://www.fig.sh/
|
||||
[docker-compose]:https://docs.docker.com/compose/
|
||||
|
||||
@@ -10,8 +10,8 @@ gogs_config_file=conf.tmp
|
||||
gogs_config=config
|
||||
gogs_init_file=$docker_dir/init_gogs.sh
|
||||
|
||||
fig_file=fig.yml
|
||||
fig_config=fig
|
||||
compose_file=docker-compose.yml
|
||||
compose_config=docker-compose
|
||||
|
||||
gogs_init_template=$template_dir/init_gogs.sh.tpl
|
||||
|
||||
@@ -28,7 +28,7 @@ if [ "$#" == 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for file in $gogs_config_file $fig_file; do
|
||||
for file in $gogs_config_file $compose_file; do
|
||||
if [ -e $file ]; then
|
||||
echo "Deleting $file"
|
||||
rm $file
|
||||
@@ -53,10 +53,10 @@ for dir in $@; do
|
||||
echo "" >> $gogs_config_file
|
||||
fi
|
||||
|
||||
if [ -e $current_dir/$fig_config ]; then
|
||||
echo "Adding $current_dir/$fig_config to $fig_file"
|
||||
cat $current_dir/fig >> $fig_file
|
||||
echo "" >> $fig_file
|
||||
if [ -e $current_dir/$compose_config ]; then
|
||||
echo "Adding $current_dir/$compose_config to $compose_file"
|
||||
cat $current_dir/$compose_config >> $compose_file
|
||||
echo "" >> $compose_file
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -69,4 +69,4 @@ d
|
||||
if [ -e $gogs_config_file ]; then
|
||||
echo "Removing temporary GoGS config"
|
||||
rm $gogs_config_file
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1,23 +1,20 @@
|
||||
FROM ubuntu:14.04
|
||||
FROM buildpack-deps:trusty-scm
|
||||
|
||||
# This part is taken from the official docker image --------------------
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
build-essential ca-certificates curl \
|
||||
bzr git mercurial \
|
||||
--no-install-recommends
|
||||
build-essential --no-install-recommends
|
||||
|
||||
ENV GOLANG_VERSION 1.3
|
||||
|
||||
RUN curl -sSL http://golang.org/dl/go$GOLANG_VERSION.src.tar.gz \
|
||||
| tar -v -C /usr/src -xz
|
||||
WORKDIR /usr/src/go
|
||||
RUN curl -sSL https://golang.org/dl/go$GOLANG_VERSION.src.tar.gz \
|
||||
| tar -v -C /usr/src -xz
|
||||
|
||||
RUN cd src && ./make.bash --no-clean 2>&1
|
||||
RUN cd /usr/src/go/src && ./make.bash --no-clean 2>&1
|
||||
|
||||
ENV PATH /usr/src/go/bin:$PATH
|
||||
|
||||
RUN mkdir -p /go/src
|
||||
RUN mkdir -p /go/src /go/bin && chmod -R 777 /go
|
||||
ENV GOPATH /go
|
||||
ENV PATH /go/bin:$PATH
|
||||
WORKDIR /go
|
||||
@@ -46,7 +43,7 @@ ENV HOME /home/git
|
||||
ENV USER git
|
||||
ENV PATH $GOGS_PATH:$PATH
|
||||
|
||||
RUN git config --global user.name "GoGS"
|
||||
RUN git config --global user.name "GoGS" && git config --global user.email "gogitservice@gmail.com"
|
||||
|
||||
ENTRYPOINT ["/tmp/init_gogs.sh"]
|
||||
CMD ["gogs", "web"]
|
||||
|
||||
@@ -1,24 +1,20 @@
|
||||
FROM ubuntu:14.04
|
||||
FROM buildpack-deps:trusty-scm
|
||||
|
||||
# This part is derived from the official docker image ------------------
|
||||
# This part is taken from the official docker image --------------------
|
||||
|
||||
RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
|
||||
apt-get install -qy \
|
||||
build-essential ca-certificates curl \
|
||||
bzr git mercurial \
|
||||
--no-install-recommends
|
||||
RUN apt-get update && apt-get install -y \
|
||||
build-essential --no-install-recommends
|
||||
|
||||
ENV GOLANG_VERSION 1.3
|
||||
|
||||
RUN curl -sSL http://golang.org/dl/go$GOLANG_VERSION.src.tar.gz \
|
||||
| tar -v -C /usr/src -xz
|
||||
WORKDIR /usr/src/go
|
||||
RUN curl -sSL https://golang.org/dl/go$GOLANG_VERSION.src.tar.gz \
|
||||
| tar -v -C /usr/src -xz
|
||||
|
||||
RUN cd src && ./make.bash --no-clean 2>&1
|
||||
RUN cd /usr/src/go/src && ./make.bash --no-clean 2>&1
|
||||
|
||||
ENV PATH /usr/src/go/bin:$PATH
|
||||
|
||||
RUN mkdir -p /go/src
|
||||
RUN mkdir -p /go/src /go/bin && chmod -R 777 /go
|
||||
ENV GOPATH /go
|
||||
ENV PATH /go/bin:$PATH
|
||||
WORKDIR /go
|
||||
@@ -47,7 +43,7 @@ ENV HOME /home/git
|
||||
ENV USER git
|
||||
ENV PATH $GOGS_PATH:$PATH
|
||||
|
||||
RUN git config --global user.name "GoGS"
|
||||
RUN git config --global user.name "GoGS" && git config --global user.email "gogitservice@gmail.com"
|
||||
|
||||
ENTRYPOINT ["/tmp/init_gogs.sh"]
|
||||
CMD ["gogs", "web"]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ ! -d "$DIRECTORY" ]; then
|
||||
if [ ! -d "$GOGS_CUSTOM_CONF_PATH" ]; then
|
||||
mkdir -p $GOGS_CUSTOM_CONF_PATH
|
||||
|
||||
echo "
|
||||
|
||||
3
gogs.go
3
gogs.go
@@ -17,7 +17,7 @@ import (
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
const APP_VER = "0.5.8.1118 Beta"
|
||||
const APP_VER = "0.6.3.0802 Beta"
|
||||
|
||||
func init() {
|
||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||
@@ -33,7 +33,6 @@ func main() {
|
||||
cmd.CmdWeb,
|
||||
cmd.CmdServ,
|
||||
cmd.CmdUpdate,
|
||||
cmd.CmdFix,
|
||||
cmd.CmdDump,
|
||||
cmd.CmdCert,
|
||||
}
|
||||
|
||||
243
models/access.go
243
models/access.go
@@ -5,76 +5,219 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
"fmt"
|
||||
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
)
|
||||
|
||||
type AccessType int
|
||||
type AccessMode int
|
||||
|
||||
const (
|
||||
READABLE AccessType = iota + 1
|
||||
WRITABLE
|
||||
ACCESS_MODE_NONE AccessMode = iota
|
||||
ACCESS_MODE_READ
|
||||
ACCESS_MODE_WRITE
|
||||
ACCESS_MODE_ADMIN
|
||||
ACCESS_MODE_OWNER
|
||||
)
|
||||
|
||||
// Access represents the accessibility of user to repository.
|
||||
// Access represents the highest access level of a user to the repository. The only access type
|
||||
// that is not in this table is the real owner of a repository. In case of an organization
|
||||
// repository, the members of the owners team are in this table.
|
||||
type Access struct {
|
||||
Id int64
|
||||
UserName string `xorm:"UNIQUE(s)"`
|
||||
RepoName string `xorm:"UNIQUE(s)"` // <user name>/<repo name>
|
||||
Mode AccessType `xorm:"UNIQUE(s)"`
|
||||
Created time.Time `xorm:"CREATED"`
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
UserID int64 `xorm:"UNIQUE(s)"`
|
||||
RepoID int64 `xorm:"UNIQUE(s)"`
|
||||
Mode AccessMode
|
||||
}
|
||||
|
||||
// AddAccess adds new access record.
|
||||
func AddAccess(access *Access) error {
|
||||
access.UserName = strings.ToLower(access.UserName)
|
||||
access.RepoName = strings.ToLower(access.RepoName)
|
||||
_, err := x.Insert(access)
|
||||
return err
|
||||
func accessLevel(e Engine, u *User, repo *Repository) (AccessMode, error) {
|
||||
mode := ACCESS_MODE_NONE
|
||||
if !repo.IsPrivate {
|
||||
mode = ACCESS_MODE_READ
|
||||
}
|
||||
|
||||
if u != nil {
|
||||
if u.Id == repo.OwnerId {
|
||||
return ACCESS_MODE_OWNER, nil
|
||||
}
|
||||
|
||||
a := &Access{UserID: u.Id, RepoID: repo.Id}
|
||||
if has, err := e.Get(a); !has || err != nil {
|
||||
return mode, err
|
||||
}
|
||||
return a.Mode, nil
|
||||
}
|
||||
|
||||
return mode, nil
|
||||
}
|
||||
|
||||
// UpdateAccess updates access information.
|
||||
func UpdateAccess(access *Access) error {
|
||||
access.UserName = strings.ToLower(access.UserName)
|
||||
access.RepoName = strings.ToLower(access.RepoName)
|
||||
_, err := x.Id(access.Id).Update(access)
|
||||
return err
|
||||
// AccessLevel returns the Access a user has to a repository. Will return NoneAccess if the
|
||||
// user does not have access. User can be nil!
|
||||
func AccessLevel(u *User, repo *Repository) (AccessMode, error) {
|
||||
return accessLevel(x, u, repo)
|
||||
}
|
||||
|
||||
// DeleteAccess deletes access record.
|
||||
func DeleteAccess(access *Access) error {
|
||||
_, err := x.Delete(access)
|
||||
return err
|
||||
func hasAccess(e Engine, u *User, repo *Repository, testMode AccessMode) (bool, error) {
|
||||
mode, err := accessLevel(e, u, repo)
|
||||
return testMode <= mode, err
|
||||
}
|
||||
|
||||
// UpdateAccess updates access information with session for rolling back.
|
||||
func UpdateAccessWithSession(sess *xorm.Session, access *Access) error {
|
||||
if _, err := sess.Id(access.Id).Update(access); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
// HasAccess returns true if someone has the request access level. User can be nil!
|
||||
func HasAccess(u *User, repo *Repository, testMode AccessMode) (bool, error) {
|
||||
return hasAccess(x, u, repo, testMode)
|
||||
}
|
||||
|
||||
// GetAccessibleRepositories finds all repositories where a user has access to,
|
||||
// besides his own.
|
||||
func (u *User) GetAccessibleRepositories() (map[*Repository]AccessMode, error) {
|
||||
accesses := make([]*Access, 0, 10)
|
||||
if err := x.Find(&accesses, &Access{UserID: u.Id}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
repos := make(map[*Repository]AccessMode, len(accesses))
|
||||
for _, access := range accesses {
|
||||
repo, err := GetRepositoryById(access.RepoID)
|
||||
if err != nil {
|
||||
if IsErrRepoNotExist(err) {
|
||||
log.Error(4, "%v", err)
|
||||
continue
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
if err = repo.GetOwner(); err != nil {
|
||||
return nil, err
|
||||
} else if repo.OwnerId == u.Id {
|
||||
continue
|
||||
}
|
||||
repos[repo] = access.Mode
|
||||
}
|
||||
|
||||
// FIXME: should we generate an ordered list here? Random looks weird.
|
||||
return repos, nil
|
||||
}
|
||||
|
||||
func maxAccessMode(modes ...AccessMode) AccessMode {
|
||||
max := ACCESS_MODE_NONE
|
||||
for _, mode := range modes {
|
||||
if mode > max {
|
||||
max = mode
|
||||
}
|
||||
}
|
||||
return max
|
||||
}
|
||||
|
||||
// FIXME: do corss-comparison so reduce deletions and additions to the minimum?
|
||||
func (repo *Repository) refreshAccesses(e Engine, accessMap map[int64]AccessMode) (err error) {
|
||||
minMode := ACCESS_MODE_READ
|
||||
if !repo.IsPrivate {
|
||||
minMode = ACCESS_MODE_WRITE
|
||||
}
|
||||
|
||||
newAccesses := make([]Access, 0, len(accessMap))
|
||||
for userID, mode := range accessMap {
|
||||
if mode < minMode {
|
||||
continue
|
||||
}
|
||||
newAccesses = append(newAccesses, Access{
|
||||
UserID: userID,
|
||||
RepoID: repo.Id,
|
||||
Mode: mode,
|
||||
})
|
||||
}
|
||||
|
||||
// Delete old accesses and insert new ones for repository.
|
||||
if _, err = e.Delete(&Access{RepoID: repo.Id}); err != nil {
|
||||
return fmt.Errorf("delete old accesses: %v", err)
|
||||
} else if _, err = e.Insert(newAccesses); err != nil {
|
||||
return fmt.Errorf("insert new accesses: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// HasAccess returns true if someone can read or write to given repository.
|
||||
// The repoName should be in format <username>/<reponame>.
|
||||
func HasAccess(uname, repoName string, mode AccessType) (bool, error) {
|
||||
if len(repoName) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
access := &Access{
|
||||
UserName: strings.ToLower(uname),
|
||||
RepoName: strings.ToLower(repoName),
|
||||
}
|
||||
has, err := x.Get(access)
|
||||
// FIXME: should be able to have read-only access.
|
||||
// Give all collaborators write access.
|
||||
func (repo *Repository) refreshCollaboratorAccesses(e Engine, accessMap map[int64]AccessMode) error {
|
||||
collaborators, err := repo.getCollaborators(e)
|
||||
if err != nil {
|
||||
return false, err
|
||||
} else if !has {
|
||||
return false, nil
|
||||
} else if mode > access.Mode {
|
||||
return false, nil
|
||||
return fmt.Errorf("getCollaborators: %v", err)
|
||||
}
|
||||
return true, nil
|
||||
for _, c := range collaborators {
|
||||
accessMap[c.Id] = ACCESS_MODE_WRITE
|
||||
}
|
||||
|
||||
// Adds team members access.
|
||||
if repo.Owner.IsOrganization() {
|
||||
if err = repo.Owner.GetTeams(); err != nil {
|
||||
return fmt.Errorf("GetTeams: %v", err)
|
||||
}
|
||||
for _, t := range repo.Owner.Teams {
|
||||
if err = t.GetMembers(); err != nil {
|
||||
return fmt.Errorf("GetMembers: %v", err)
|
||||
}
|
||||
for _, m := range t.Members {
|
||||
if t.IsOwnerTeam() {
|
||||
accessMap[m.Id] = ACCESS_MODE_OWNER
|
||||
} else {
|
||||
accessMap[m.Id] = maxAccessMode(accessMap[m.Id], t.Authorize)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// recalculateTeamAccesses recalculates new accesses for teams of an organization
|
||||
// except the team whose ID is given. It is used to assign a team ID when
|
||||
// remove repository from that team.
|
||||
func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err error) {
|
||||
accessMap := make(map[int64]AccessMode, 20)
|
||||
|
||||
if err = repo.getOwner(e); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = repo.refreshCollaboratorAccesses(e, accessMap); err != nil {
|
||||
return fmt.Errorf("refreshCollaboratorAccesses: %v", err)
|
||||
}
|
||||
if repo.Owner.IsOrganization() {
|
||||
if err = repo.Owner.getTeams(e); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, t := range repo.Owner.Teams {
|
||||
if t.ID == ignTeamID {
|
||||
continue
|
||||
}
|
||||
|
||||
// Owner team gets owner access, and skip for teams that do not
|
||||
// have relations with repository.
|
||||
if t.IsOwnerTeam() {
|
||||
t.Authorize = ACCESS_MODE_OWNER
|
||||
} else if !t.hasRepository(e, repo.Id) {
|
||||
continue
|
||||
}
|
||||
|
||||
if err = t.getMembers(e); err != nil {
|
||||
return fmt.Errorf("getMembers '%d': %v", t.ID, err)
|
||||
}
|
||||
for _, m := range t.Members {
|
||||
accessMap[m.Id] = maxAccessMode(accessMap[m.Id], t.Authorize)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return repo.refreshAccesses(e, accessMap)
|
||||
}
|
||||
|
||||
func (repo *Repository) recalculateAccesses(e Engine) error {
|
||||
accessMap := make(map[int64]AccessMode, 20)
|
||||
if err := repo.refreshCollaboratorAccesses(e, accessMap); err != nil {
|
||||
return fmt.Errorf("refreshCollaboratorAccesses: %v", err)
|
||||
}
|
||||
return repo.refreshAccesses(e, accessMap)
|
||||
}
|
||||
|
||||
// RecalculateAccesses recalculates all accesses for repository.
|
||||
func (r *Repository) RecalculateAccesses() error {
|
||||
return r.recalculateAccesses(x)
|
||||
}
|
||||
|
||||
289
models/action.go
289
models/action.go
@@ -41,24 +41,34 @@ var (
|
||||
|
||||
var (
|
||||
// Same as Github. See https://help.github.com/articles/closing-issues-via-commit-messages
|
||||
IssueKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"}
|
||||
IssueKeywordsPat *regexp.Regexp
|
||||
IssueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"}
|
||||
IssueReopenKeywords = []string{"reopen", "reopens", "reopened"}
|
||||
|
||||
IssueCloseKeywordsPat, IssueReopenKeywordsPat *regexp.Regexp
|
||||
IssueReferenceKeywordsPat *regexp.Regexp
|
||||
)
|
||||
|
||||
func assembleKeywordsPattern(words []string) string {
|
||||
return fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(words, "|"))
|
||||
}
|
||||
|
||||
func init() {
|
||||
IssueKeywordsPat = regexp.MustCompile(fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(IssueKeywords, "|")))
|
||||
IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords))
|
||||
IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords))
|
||||
IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`)
|
||||
}
|
||||
|
||||
// Action represents user operation type and other information to repository.,
|
||||
// it implemented interface base.Actioner so that can be used in template render.
|
||||
type Action struct {
|
||||
Id int64
|
||||
UserId int64 // Receiver user id.
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
UserID int64 // Receiver user id.
|
||||
OpType ActionType
|
||||
ActUserId int64 // Action user id.
|
||||
ActUserID int64 // Action user id.
|
||||
ActUserName string // Action user name.
|
||||
ActEmail string
|
||||
RepoId int64
|
||||
ActAvatar string `xorm:"-"`
|
||||
RepoID int64
|
||||
RepoUserName string
|
||||
RepoName string
|
||||
RefName string
|
||||
@@ -87,10 +97,17 @@ func (a Action) GetRepoName() string {
|
||||
return a.RepoName
|
||||
}
|
||||
|
||||
func (a Action) GetRepoLink() string {
|
||||
func (a Action) GetRepoPath() string {
|
||||
return path.Join(a.RepoUserName, a.RepoName)
|
||||
}
|
||||
|
||||
func (a Action) GetRepoLink() string {
|
||||
if len(setting.AppSubUrl) > 0 {
|
||||
return path.Join(setting.AppSubUrl, a.GetRepoPath())
|
||||
}
|
||||
return "/" + a.GetRepoPath()
|
||||
}
|
||||
|
||||
func (a Action) GetBranch() string {
|
||||
return a.RefName
|
||||
}
|
||||
@@ -109,9 +126,39 @@ func (a Action) GetIssueInfos() []string {
|
||||
|
||||
func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, commits []*base.PushCommit) error {
|
||||
for _, c := range commits {
|
||||
refs := IssueKeywordsPat.FindAllString(c.Message, -1)
|
||||
for _, ref := range IssueReferenceKeywordsPat.FindAllString(c.Message, -1) {
|
||||
ref := ref[strings.IndexByte(ref, byte(' '))+1:]
|
||||
ref = strings.TrimRightFunc(ref, func(c rune) bool {
|
||||
return !unicode.IsDigit(c)
|
||||
})
|
||||
|
||||
for _, ref := range refs {
|
||||
if len(ref) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// Add repo name if missing
|
||||
if ref[0] == '#' {
|
||||
ref = fmt.Sprintf("%s/%s%s", repoUserName, repoName, ref)
|
||||
} else if strings.Contains(ref, "/") == false {
|
||||
// FIXME: We don't support User#ID syntax yet
|
||||
// return ErrNotImplemented
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
issue, err := GetIssueByRef(ref)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppSubUrl, repoUserName, repoName, c.Sha1)
|
||||
message := fmt.Sprintf(`<a href="%s">%s</a>`, url, c.Message)
|
||||
if _, err = CreateComment(userId, issue.RepoId, issue.ID, 0, 0, COMMENT_TYPE_COMMIT, message, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, ref := range IssueCloseKeywordsPat.FindAllString(c.Message, -1) {
|
||||
ref := ref[strings.IndexByte(ref, byte(' '))+1:]
|
||||
ref = strings.TrimRightFunc(ref, func(c rune) bool {
|
||||
return !unicode.IsDigit(c)
|
||||
@@ -132,28 +179,30 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
|
||||
}
|
||||
|
||||
issue, err := GetIssueByRef(ref)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppSubUrl, repoUserName, repoName, c.Sha1)
|
||||
message := fmt.Sprintf(`<a href="%s">%s</a>`, url, c.Message)
|
||||
|
||||
if _, err = CreateComment(userId, issue.RepoId, issue.Id, 0, 0, COMMIT, message, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if issue.RepoId == repoId {
|
||||
if issue.IsClosed {
|
||||
continue
|
||||
}
|
||||
|
||||
issue.IsClosed = true
|
||||
|
||||
if err = issue.GetLabels(); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, label := range issue.Labels {
|
||||
label.NumClosedIssues++
|
||||
|
||||
if err = UpdateLabel(label); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if err = UpdateIssue(issue); err != nil {
|
||||
return err
|
||||
} else if err = UpdateIssueUserPairsByStatus(issue.Id, issue.IsClosed); err != nil {
|
||||
} else if err = UpdateIssueUserPairsByStatus(issue.ID, issue.IsClosed); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -162,13 +211,71 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
|
||||
}
|
||||
|
||||
// If commit happened in the referenced repository, it means the issue can be closed.
|
||||
if _, err = CreateComment(userId, repoId, issue.Id, 0, 0, CLOSE, "", nil); err != nil {
|
||||
if _, err = CreateComment(userId, repoId, issue.ID, 0, 0, COMMENT_TYPE_CLOSE, "", nil); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, ref := range IssueReopenKeywordsPat.FindAllString(c.Message, -1) {
|
||||
ref := ref[strings.IndexByte(ref, byte(' '))+1:]
|
||||
ref = strings.TrimRightFunc(ref, func(c rune) bool {
|
||||
return !unicode.IsDigit(c)
|
||||
})
|
||||
|
||||
if len(ref) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// Add repo name if missing
|
||||
if ref[0] == '#' {
|
||||
ref = fmt.Sprintf("%s/%s%s", repoUserName, repoName, ref)
|
||||
} else if strings.Contains(ref, "/") == false {
|
||||
// We don't support User#ID syntax yet
|
||||
// return ErrNotImplemented
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
issue, err := GetIssueByRef(ref)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if issue.RepoId == repoId {
|
||||
if !issue.IsClosed {
|
||||
continue
|
||||
}
|
||||
issue.IsClosed = false
|
||||
|
||||
if err = issue.GetLabels(); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, label := range issue.Labels {
|
||||
label.NumClosedIssues--
|
||||
|
||||
if err = UpdateLabel(label); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if err = UpdateIssue(issue); err != nil {
|
||||
return err
|
||||
} else if err = UpdateIssueUserPairsByStatus(issue.ID, issue.IsClosed); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = ChangeMilestoneIssueStats(issue); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// If commit happened in the referenced repository, it means the issue can be closed.
|
||||
if _, err = CreateComment(userId, repoId, issue.ID, 0, 0, COMMENT_TYPE_REOPEN, "", nil); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -186,12 +293,12 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
|
||||
repoLink := fmt.Sprintf("%s%s/%s", setting.AppUrl, repoUserName, repoName)
|
||||
// if not the first commit, set the compareUrl
|
||||
if !strings.HasPrefix(oldCommitId, "0000000") {
|
||||
commit.CompareUrl = fmt.Sprintf("%s/compare/%s...%s", repoLink, oldCommitId, newCommitId)
|
||||
commit.CompareUrl = fmt.Sprintf("%s/%s/compare/%s...%s", repoUserName, repoName, oldCommitId, newCommitId)
|
||||
}
|
||||
|
||||
bs, err := json.Marshal(commit)
|
||||
if err != nil {
|
||||
return errors.New("action.CommitRepoAction(json): " + err.Error())
|
||||
return errors.New("json: " + err.Error())
|
||||
}
|
||||
|
||||
refName := git.RefEndName(refFullName)
|
||||
@@ -199,35 +306,43 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
|
||||
// Change repository bare status and update last updated time.
|
||||
repo, err := GetRepositoryByName(repoUserId, repoName)
|
||||
if err != nil {
|
||||
return errors.New("action.CommitRepoAction(GetRepositoryByName): " + err.Error())
|
||||
return errors.New("GetRepositoryByName: " + err.Error())
|
||||
}
|
||||
repo.IsBare = false
|
||||
if err = UpdateRepository(repo); err != nil {
|
||||
return errors.New("action.CommitRepoAction(UpdateRepository): " + err.Error())
|
||||
if err = UpdateRepository(repo, false); err != nil {
|
||||
return errors.New("UpdateRepository: " + err.Error())
|
||||
}
|
||||
|
||||
err = updateIssuesCommit(userId, repoId, repoUserName, repoName, commit.Commits)
|
||||
|
||||
if err != nil {
|
||||
log.Debug("action.CommitRepoAction(updateIssuesCommit): ", err)
|
||||
log.Debug("updateIssuesCommit: ", err)
|
||||
}
|
||||
|
||||
if err = NotifyWatchers(&Action{ActUserId: userId, ActUserName: userName, ActEmail: actEmail,
|
||||
OpType: opType, Content: string(bs), RepoId: repoId, RepoUserName: repoUserName,
|
||||
RepoName: repoName, RefName: refName,
|
||||
IsPrivate: repo.IsPrivate}); err != nil {
|
||||
return errors.New("action.CommitRepoAction(NotifyWatchers): " + err.Error())
|
||||
if err = NotifyWatchers(&Action{
|
||||
ActUserID: userId,
|
||||
ActUserName: userName,
|
||||
ActEmail: actEmail,
|
||||
OpType: opType,
|
||||
Content: string(bs),
|
||||
RepoID: repoId,
|
||||
RepoUserName: repoUserName,
|
||||
RepoName: repoName,
|
||||
RefName: refName,
|
||||
IsPrivate: repo.IsPrivate,
|
||||
}); err != nil {
|
||||
return errors.New("NotifyWatchers: " + err.Error())
|
||||
|
||||
}
|
||||
|
||||
// New push event hook.
|
||||
if err := repo.GetOwner(); err != nil {
|
||||
return errors.New("action.CommitRepoAction(GetOwner): " + err.Error())
|
||||
return errors.New("GetOwner: " + err.Error())
|
||||
}
|
||||
|
||||
ws, err := GetActiveWebhooksByRepoId(repoId)
|
||||
if err != nil {
|
||||
return errors.New("action.CommitRepoAction(GetActiveWebhooksByRepoId): " + err.Error())
|
||||
return errors.New("GetActiveWebhooksByRepoId: " + err.Error())
|
||||
}
|
||||
|
||||
// check if repo belongs to org and append additional webhooks
|
||||
@@ -235,7 +350,7 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
|
||||
// get hooks for org
|
||||
orgws, err := GetActiveWebhooksByOrgId(repo.OwnerId)
|
||||
if err != nil {
|
||||
return errors.New("action.CommitRepoAction(GetActiveWebhooksByOrgId): " + err.Error())
|
||||
return errors.New("GetActiveWebhooksByOrgId: " + err.Error())
|
||||
}
|
||||
ws = append(ws, orgws...)
|
||||
}
|
||||
@@ -293,7 +408,7 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
|
||||
},
|
||||
Before: oldCommitId,
|
||||
After: newCommitId,
|
||||
CompareUrl: commit.CompareUrl,
|
||||
CompareUrl: setting.AppUrl + commit.CompareUrl,
|
||||
}
|
||||
|
||||
for _, w := range ws {
|
||||
@@ -302,79 +417,89 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
|
||||
continue
|
||||
}
|
||||
|
||||
var payload BasePayload
|
||||
switch w.HookTaskType {
|
||||
case SLACK:
|
||||
{
|
||||
s, err := GetSlackPayload(p, w.Meta)
|
||||
if err != nil {
|
||||
return errors.New("action.GetSlackPayload: " + err.Error())
|
||||
}
|
||||
CreateHookTask(&HookTask{
|
||||
Type: w.HookTaskType,
|
||||
Url: w.Url,
|
||||
BasePayload: s,
|
||||
ContentType: w.ContentType,
|
||||
IsSsl: w.IsSsl,
|
||||
})
|
||||
s, err := GetSlackPayload(p, w.Meta)
|
||||
if err != nil {
|
||||
return errors.New("action.GetSlackPayload: " + err.Error())
|
||||
}
|
||||
payload = s
|
||||
default:
|
||||
{
|
||||
p.Secret = w.Secret
|
||||
CreateHookTask(&HookTask{
|
||||
Type: w.HookTaskType,
|
||||
Url: w.Url,
|
||||
BasePayload: p,
|
||||
ContentType: w.ContentType,
|
||||
IsSsl: w.IsSsl,
|
||||
})
|
||||
}
|
||||
payload = p
|
||||
p.Secret = w.Secret
|
||||
}
|
||||
|
||||
if err = CreateHookTask(&HookTask{
|
||||
RepoID: repo.Id,
|
||||
HookID: w.Id,
|
||||
Type: w.HookTaskType,
|
||||
Url: w.Url,
|
||||
BasePayload: payload,
|
||||
ContentType: w.ContentType,
|
||||
EventType: HOOK_EVENT_PUSH,
|
||||
IsSsl: w.IsSsl,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("CreateHookTask: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
go DeliverHooks()
|
||||
return nil
|
||||
}
|
||||
|
||||
// NewRepoAction adds new action for creating repository.
|
||||
func NewRepoAction(u *User, repo *Repository) (err error) {
|
||||
if err = NotifyWatchers(&Action{ActUserId: u.Id, ActUserName: u.Name, ActEmail: u.Email,
|
||||
OpType: CREATE_REPO, RepoId: repo.Id, RepoUserName: repo.Owner.Name, RepoName: repo.Name,
|
||||
IsPrivate: repo.IsPrivate}); err != nil {
|
||||
log.Error(4, "NotifyWatchers: %d/%s", u.Id, repo.Name)
|
||||
return err
|
||||
func newRepoAction(e Engine, u *User, repo *Repository) (err error) {
|
||||
if err = notifyWatchers(e, &Action{
|
||||
ActUserID: u.Id,
|
||||
ActUserName: u.Name,
|
||||
ActEmail: u.Email,
|
||||
OpType: CREATE_REPO,
|
||||
RepoID: repo.Id,
|
||||
RepoUserName: repo.Owner.Name,
|
||||
RepoName: repo.Name,
|
||||
IsPrivate: repo.IsPrivate,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("notify watchers '%d/%s'", u.Id, repo.Id)
|
||||
}
|
||||
|
||||
log.Trace("action.NewRepoAction: %s/%s", u.Name, repo.Name)
|
||||
return err
|
||||
}
|
||||
|
||||
// TransferRepoAction adds new action for transfering repository.
|
||||
func TransferRepoAction(u, newUser *User, repo *Repository) (err error) {
|
||||
// NewRepoAction adds new action for creating repository.
|
||||
func NewRepoAction(u *User, repo *Repository) (err error) {
|
||||
return newRepoAction(x, u, repo)
|
||||
}
|
||||
|
||||
func transferRepoAction(e Engine, actUser, oldOwner, newOwner *User, repo *Repository) (err error) {
|
||||
action := &Action{
|
||||
ActUserId: u.Id,
|
||||
ActUserName: u.Name,
|
||||
ActEmail: u.Email,
|
||||
ActUserID: actUser.Id,
|
||||
ActUserName: actUser.Name,
|
||||
ActEmail: actUser.Email,
|
||||
OpType: TRANSFER_REPO,
|
||||
RepoId: repo.Id,
|
||||
RepoUserName: newUser.Name,
|
||||
RepoID: repo.Id,
|
||||
RepoUserName: newOwner.Name,
|
||||
RepoName: repo.Name,
|
||||
IsPrivate: repo.IsPrivate,
|
||||
Content: path.Join(repo.Owner.LowerName, repo.LowerName),
|
||||
Content: path.Join(oldOwner.LowerName, repo.LowerName),
|
||||
}
|
||||
if err = NotifyWatchers(action); err != nil {
|
||||
log.Error(4, "NotifyWatchers: %d/%s", u.Id, repo.Name)
|
||||
return err
|
||||
if err = notifyWatchers(e, action); err != nil {
|
||||
return fmt.Errorf("notify watchers '%d/%s'", actUser.Id, repo.Id)
|
||||
}
|
||||
|
||||
// Remove watch for organization.
|
||||
if repo.Owner.IsOrganization() {
|
||||
if err = WatchRepo(repo.Owner.Id, repo.Id, false); err != nil {
|
||||
log.Error(4, "WatchRepo", err)
|
||||
if err = watchRepo(e, repo.Owner.Id, repo.Id, false); err != nil {
|
||||
return fmt.Errorf("watch repository: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
log.Trace("action.TransferRepoAction: %s/%s", u.Name, repo.Name)
|
||||
return err
|
||||
log.Trace("action.TransferRepoAction: %s/%s", actUser.Name, repo.Name)
|
||||
return nil
|
||||
}
|
||||
|
||||
// TransferRepoAction adds new action for transferring repository.
|
||||
func TransferRepoAction(actUser, oldOwner, newOwner *User, repo *Repository) (err error) {
|
||||
return transferRepoAction(x, actUser, oldOwner, newOwner, repo)
|
||||
}
|
||||
|
||||
// GetFeeds returns action list of given user in given context.
|
||||
|
||||
136
models/error.go
Normal file
136
models/error.go
Normal file
@@ -0,0 +1,136 @@
|
||||
// Copyright 2015 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 models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ErrNameReserved struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
func IsErrNameReserved(err error) bool {
|
||||
_, ok := err.(ErrNameReserved)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrNameReserved) Error() string {
|
||||
return fmt.Sprintf("name is reserved: [name: %s]", err.Name)
|
||||
}
|
||||
|
||||
type ErrNamePatternNotAllowed struct {
|
||||
Pattern string
|
||||
}
|
||||
|
||||
func IsErrNamePatternNotAllowed(err error) bool {
|
||||
_, ok := err.(ErrNamePatternNotAllowed)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrNamePatternNotAllowed) Error() string {
|
||||
return fmt.Sprintf("name pattern is not allowed: [pattern: %s]", err.Pattern)
|
||||
}
|
||||
|
||||
// ____ ___
|
||||
// | | \______ ___________
|
||||
// | | / ___// __ \_ __ \
|
||||
// | | /\___ \\ ___/| | \/
|
||||
// |______//____ >\___ >__|
|
||||
// \/ \/
|
||||
|
||||
type ErrUserAlreadyExist struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
func IsErrUserAlreadyExist(err error) bool {
|
||||
_, ok := err.(ErrUserAlreadyExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrUserAlreadyExist) Error() string {
|
||||
return fmt.Sprintf("user already exists: [name: %s]", err.Name)
|
||||
}
|
||||
|
||||
type ErrEmailAlreadyUsed struct {
|
||||
Email string
|
||||
}
|
||||
|
||||
func IsErrEmailAlreadyUsed(err error) bool {
|
||||
_, ok := err.(ErrEmailAlreadyUsed)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrEmailAlreadyUsed) Error() string {
|
||||
return fmt.Sprintf("e-mail has been used: [email: %s]", err.Email)
|
||||
}
|
||||
|
||||
type ErrUserOwnRepos struct {
|
||||
UID int64
|
||||
}
|
||||
|
||||
func IsErrUserOwnRepos(err error) bool {
|
||||
_, ok := err.(ErrUserOwnRepos)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrUserOwnRepos) Error() string {
|
||||
return fmt.Sprintf("user still has ownership of repositories: [uid: %d]", err.UID)
|
||||
}
|
||||
|
||||
type ErrUserHasOrgs struct {
|
||||
UID int64
|
||||
}
|
||||
|
||||
func IsErrUserHasOrgs(err error) bool {
|
||||
_, ok := err.(ErrUserHasOrgs)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrUserHasOrgs) Error() string {
|
||||
return fmt.Sprintf("user still has membership of organizations: [uid: %d]", err.UID)
|
||||
}
|
||||
|
||||
// ________ .__ __ .__
|
||||
// \_____ \_______ _________ ____ |__|____________ _/ |_|__| ____ ____
|
||||
// / | \_ __ \/ ___\__ \ / \| \___ /\__ \\ __\ |/ _ \ / \
|
||||
// / | \ | \/ /_/ > __ \| | \ |/ / / __ \| | | ( <_> ) | \
|
||||
// \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| /
|
||||
// \/ /_____/ \/ \/ \/ \/ \/
|
||||
|
||||
type ErrLastOrgOwner struct {
|
||||
UID int64
|
||||
}
|
||||
|
||||
func IsErrLastOrgOwner(err error) bool {
|
||||
_, ok := err.(ErrLastOrgOwner)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrLastOrgOwner) Error() string {
|
||||
return fmt.Sprintf("user is the last member of owner team: [uid: %d]", err.UID)
|
||||
}
|
||||
|
||||
// __________ .__ __
|
||||
// \______ \ ____ ______ ____ _____|__|/ |_ ___________ ___.__.
|
||||
// | _// __ \\____ \ / _ \/ ___/ \ __\/ _ \_ __ < | |
|
||||
// | | \ ___/| |_> > <_> )___ \| || | ( <_> ) | \/\___ |
|
||||
// |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____|
|
||||
// \/ \/|__| \/ \/
|
||||
|
||||
type ErrRepoNotExist struct {
|
||||
ID int64
|
||||
UID int64
|
||||
Name string
|
||||
}
|
||||
|
||||
func IsErrRepoNotExist(err error) bool {
|
||||
_, ok := err.(ErrRepoNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrRepoNotExist) Error() string {
|
||||
return fmt.Sprintf("repository does not exist [id: %d, uid: %d, name: %s]", err.ID, err.UID, err.Name)
|
||||
}
|
||||
@@ -6,6 +6,7 @@ package models
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
@@ -13,8 +14,12 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"golang.org/x/net/html/charset"
|
||||
"golang.org/x/text/transform"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/git"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
@@ -55,6 +60,8 @@ type DiffFile struct {
|
||||
Index int
|
||||
Addition, Deletion int
|
||||
Type int
|
||||
IsCreated bool
|
||||
IsDeleted bool
|
||||
IsBin bool
|
||||
Sections []*DiffSection
|
||||
}
|
||||
@@ -80,6 +87,8 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
|
||||
|
||||
leftLine, rightLine int
|
||||
isTooLong bool
|
||||
// FIXME: Should use cache in the future.
|
||||
buf bytes.Buffer
|
||||
)
|
||||
|
||||
diff := &Diff{Files: make([]*DiffFile, 0)}
|
||||
@@ -101,7 +110,6 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
|
||||
if i == maxlines {
|
||||
isTooLong = true
|
||||
log.Warn("Diff data too large")
|
||||
//return &Diff{}, nil
|
||||
}
|
||||
|
||||
switch {
|
||||
@@ -113,7 +121,7 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
|
||||
continue
|
||||
case line[0] == '@':
|
||||
if isTooLong {
|
||||
return diff, nil
|
||||
break
|
||||
}
|
||||
|
||||
curSection = &DiffSection{}
|
||||
@@ -123,9 +131,14 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
|
||||
curSection.Lines = append(curSection.Lines, diffLine)
|
||||
|
||||
// Parse line number.
|
||||
ranges := strings.Split(ss[len(ss)-2][1:], " ")
|
||||
ranges := strings.Split(ss[1][1:], " ")
|
||||
leftLine, _ = com.StrTo(strings.Split(ranges[0], ",")[0][1:]).Int()
|
||||
rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int()
|
||||
if len(ranges) > 1 {
|
||||
rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int()
|
||||
} else {
|
||||
log.Warn("Parse line number failed: %v", line)
|
||||
rightLine = leftLine
|
||||
}
|
||||
continue
|
||||
case line[0] == '+':
|
||||
curFile.Addition++
|
||||
@@ -150,11 +163,11 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
|
||||
// Get new file.
|
||||
if strings.HasPrefix(line, DIFF_HEAD) {
|
||||
if isTooLong {
|
||||
return diff, nil
|
||||
break
|
||||
}
|
||||
|
||||
fs := strings.Split(line[len(DIFF_HEAD):], " ")
|
||||
a := fs[0]
|
||||
beg := len(DIFF_HEAD)
|
||||
a := line[beg : (len(line)-beg)/2+beg]
|
||||
|
||||
curFile = &DiffFile{
|
||||
Name: a[strings.Index(a, "/")+1:],
|
||||
@@ -169,10 +182,16 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
|
||||
switch {
|
||||
case strings.HasPrefix(scanner.Text(), "new file"):
|
||||
curFile.Type = DIFF_FILE_ADD
|
||||
curFile.IsDeleted = false
|
||||
curFile.IsCreated = true
|
||||
case strings.HasPrefix(scanner.Text(), "deleted"):
|
||||
curFile.Type = DIFF_FILE_DEL
|
||||
curFile.IsCreated = false
|
||||
curFile.IsDeleted = true
|
||||
case strings.HasPrefix(scanner.Text(), "index"):
|
||||
curFile.Type = DIFF_FILE_CHANGE
|
||||
curFile.IsCreated = false
|
||||
curFile.IsDeleted = false
|
||||
}
|
||||
if curFile.Type > 0 {
|
||||
break
|
||||
@@ -181,6 +200,29 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
|
||||
}
|
||||
}
|
||||
|
||||
for _, f := range diff.Files {
|
||||
buf.Reset()
|
||||
for _, sec := range f.Sections {
|
||||
for _, l := range sec.Lines {
|
||||
buf.WriteString(l.Content)
|
||||
buf.WriteString("\n")
|
||||
}
|
||||
}
|
||||
charsetLabel, err := base.DetectEncoding(buf.Bytes())
|
||||
if charsetLabel != "UTF-8" && err == nil {
|
||||
encoding, _ := charset.Lookup(charsetLabel)
|
||||
if encoding != nil {
|
||||
d := encoding.NewDecoder()
|
||||
for _, sec := range f.Sections {
|
||||
for _, l := range sec.Lines {
|
||||
if c, _, err := transform.String(d, l.Content); err == nil {
|
||||
l.Content = c
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return diff, nil
|
||||
}
|
||||
|
||||
|
||||
238
models/issue.go
238
models/issue.go
@@ -14,9 +14,9 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/go-xorm/xorm"
|
||||
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -31,7 +31,7 @@ var (
|
||||
|
||||
// Issue represents an issue or pull request of repository.
|
||||
type Issue struct {
|
||||
Id int64
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
RepoId int64 `xorm:"INDEX"`
|
||||
Index int64 // Index in one repository.
|
||||
Name string
|
||||
@@ -72,7 +72,7 @@ func (i *Issue) GetLabels() error {
|
||||
strIds := strings.Split(strings.TrimSuffix(i.LabelIds[1:], "|"), "|$")
|
||||
i.Labels = make([]*Label, 0, len(strIds))
|
||||
for _, strId := range strIds {
|
||||
id, _ := com.StrTo(strId).Int64()
|
||||
id := com.StrTo(strId).MustInt64()
|
||||
if id > 0 {
|
||||
l, err := GetLabelById(id)
|
||||
if err != nil {
|
||||
@@ -99,34 +99,29 @@ func (i *Issue) GetAssignee() (err error) {
|
||||
}
|
||||
|
||||
func (i *Issue) Attachments() []*Attachment {
|
||||
a, _ := GetAttachmentsForIssue(i.Id)
|
||||
a, _ := GetAttachmentsForIssue(i.ID)
|
||||
return a
|
||||
}
|
||||
|
||||
func (i *Issue) AfterDelete() {
|
||||
_, err := DeleteAttachmentsByIssue(i.Id, true)
|
||||
_, err := DeleteAttachmentsByIssue(i.ID, true)
|
||||
|
||||
if err != nil {
|
||||
log.Info("Could not delete files for issue #%d: %s", i.Id, err)
|
||||
log.Info("Could not delete files for issue #%d: %s", i.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
// CreateIssue creates new issue for repository.
|
||||
func NewIssue(issue *Issue) (err error) {
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
defer sessionRelease(sess)
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Insert(issue); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
rawSql := "UPDATE `repository` SET num_issues = num_issues + 1 WHERE id = ?"
|
||||
if _, err = sess.Exec(rawSql, issue.RepoId); err != nil {
|
||||
sess.Rollback()
|
||||
} else if _, err = sess.Exec("UPDATE `repository` SET num_issues = num_issues + 1 WHERE id = ?", issue.RepoId); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -179,7 +174,7 @@ func GetIssueByIndex(rid, index int64) (*Issue, error) {
|
||||
|
||||
// GetIssueById returns an issue by ID.
|
||||
func GetIssueById(id int64) (*Issue, error) {
|
||||
issue := &Issue{Id: id}
|
||||
issue := &Issue{ID: id}
|
||||
has, err := x.Get(issue)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -190,30 +185,29 @@ func GetIssueById(id int64) (*Issue, error) {
|
||||
}
|
||||
|
||||
// GetIssues returns a list of issues by given conditions.
|
||||
func GetIssues(uid, rid, pid, mid int64, page int, isClosed bool, labelIds, sortType string) ([]Issue, error) {
|
||||
sess := x.Limit(20, (page-1)*20)
|
||||
func GetIssues(uid, assigneeID, repoID, posterID, milestoneID int64, page int, isClosed, isMention bool, labelIds, sortType string) ([]Issue, error) {
|
||||
sess := x.Limit(setting.IssuePagingNum, (page-1)*setting.IssuePagingNum)
|
||||
|
||||
if rid > 0 {
|
||||
sess.Where("repo_id=?", rid).And("is_closed=?", isClosed)
|
||||
if repoID > 0 {
|
||||
sess.Where("issue.repo_id=?", repoID).And("issue.is_closed=?", isClosed)
|
||||
} else {
|
||||
sess.Where("is_closed=?", isClosed)
|
||||
sess.Where("issue.is_closed=?", isClosed)
|
||||
}
|
||||
|
||||
if uid > 0 {
|
||||
sess.And("assignee_id=?", uid)
|
||||
} else if pid > 0 {
|
||||
sess.And("poster_id=?", pid)
|
||||
if assigneeID > 0 {
|
||||
sess.And("issue.assignee_id=?", assigneeID)
|
||||
} else if posterID > 0 {
|
||||
sess.And("issue.poster_id=?", posterID)
|
||||
}
|
||||
|
||||
if mid > 0 {
|
||||
sess.And("milestone_id=?", mid)
|
||||
if milestoneID > 0 {
|
||||
sess.And("issue.milestone_id=?", milestoneID)
|
||||
}
|
||||
|
||||
if len(labelIds) > 0 {
|
||||
for _, label := range strings.Split(labelIds, ",") {
|
||||
// Prevent SQL inject.
|
||||
if com.StrTo(label).MustInt() > 0 {
|
||||
sess.And("label_ids like '%$" + label + "|%'")
|
||||
sess.And("label_ids like ?", "%$"+label+"|%")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -235,9 +229,16 @@ func GetIssues(uid, rid, pid, mid int64, page int, isClosed bool, labelIds, sort
|
||||
sess.Desc("created")
|
||||
}
|
||||
|
||||
if isMention {
|
||||
queryStr := "issue.id = issue_user.issue_id AND issue_user.is_mentioned=1"
|
||||
if uid > 0 {
|
||||
queryStr += " AND issue_user.uid = " + com.ToStr(uid)
|
||||
}
|
||||
sess.Join("INNER", "issue_user", queryStr)
|
||||
}
|
||||
|
||||
var issues []Issue
|
||||
err := sess.Find(&issues)
|
||||
return issues, err
|
||||
return issues, sess.Find(&issues)
|
||||
}
|
||||
|
||||
type IssueStatus int
|
||||
@@ -248,10 +249,9 @@ const (
|
||||
)
|
||||
|
||||
// GetIssuesByLabel returns a list of issues by given label and repository.
|
||||
func GetIssuesByLabel(repoId int64, label string) ([]*Issue, error) {
|
||||
func GetIssuesByLabel(repoID, labelID int64) ([]*Issue, error) {
|
||||
issues := make([]*Issue, 0, 10)
|
||||
err := x.Where("repo_id=?", repoId).And("label_ids like '%$" + label + "|%'").Find(&issues)
|
||||
return issues, err
|
||||
return issues, x.Where("repo_id=?", repoID).And("label_ids like '%$" + com.ToStr(labelID) + "|%'").Find(&issues)
|
||||
}
|
||||
|
||||
// GetIssueCountByPoster returns number of issues of repository by poster.
|
||||
@@ -281,31 +281,47 @@ type IssueUser struct {
|
||||
IsClosed bool
|
||||
}
|
||||
|
||||
// FIXME: organization
|
||||
// NewIssueUserPairs adds new issue-user pairs for new issue of repository.
|
||||
func NewIssueUserPairs(rid, iid, oid, pid, aid int64, repoName string) (err error) {
|
||||
iu := &IssueUser{IssueId: iid, RepoId: rid}
|
||||
|
||||
us, err := GetCollaborators(repoName)
|
||||
func NewIssueUserPairs(repo *Repository, issueID, orgID, posterID, assigneeID int64) error {
|
||||
users, err := repo.GetCollaborators()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
iu := &IssueUser{
|
||||
IssueId: issueID,
|
||||
RepoId: repo.Id,
|
||||
}
|
||||
|
||||
isNeedAddPoster := true
|
||||
for _, u := range us {
|
||||
for _, u := range users {
|
||||
iu.Id = 0
|
||||
iu.Uid = u.Id
|
||||
iu.IsPoster = iu.Uid == pid
|
||||
iu.IsPoster = iu.Uid == posterID
|
||||
if isNeedAddPoster && iu.IsPoster {
|
||||
isNeedAddPoster = false
|
||||
}
|
||||
iu.IsAssigned = iu.Uid == aid
|
||||
iu.IsAssigned = iu.Uid == assigneeID
|
||||
if _, err = x.Insert(iu); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if isNeedAddPoster {
|
||||
iu.Uid = pid
|
||||
iu.Id = 0
|
||||
iu.Uid = posterID
|
||||
iu.IsPoster = true
|
||||
iu.IsAssigned = iu.Uid == aid
|
||||
iu.IsAssigned = iu.Uid == assigneeID
|
||||
if _, err = x.Insert(iu); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Add owner's as well.
|
||||
if repo.OwnerId != posterID {
|
||||
iu.Id = 0
|
||||
iu.Uid = repo.OwnerId
|
||||
iu.IsAssigned = iu.Uid == assigneeID
|
||||
if _, err = x.Insert(iu); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -315,9 +331,10 @@ func NewIssueUserPairs(rid, iid, oid, pid, aid int64, repoName string) (err erro
|
||||
}
|
||||
|
||||
// PairsContains returns true when pairs list contains given issue.
|
||||
func PairsContains(ius []*IssueUser, issueId int64) int {
|
||||
func PairsContains(ius []*IssueUser, issueId, uid int64) int {
|
||||
for i := range ius {
|
||||
if ius[i].IssueId == issueId {
|
||||
if ius[i].IssueId == issueId &&
|
||||
ius[i].Uid == uid {
|
||||
return i
|
||||
}
|
||||
}
|
||||
@@ -384,53 +401,54 @@ type IssueStats struct {
|
||||
|
||||
// Filter modes.
|
||||
const (
|
||||
FM_ASSIGN = iota + 1
|
||||
FM_ALL = iota
|
||||
FM_ASSIGN
|
||||
FM_CREATE
|
||||
FM_MENTION
|
||||
)
|
||||
|
||||
// GetIssueStats returns issue statistic information by given conditions.
|
||||
func GetIssueStats(rid, uid int64, isShowClosed bool, filterMode int) *IssueStats {
|
||||
func GetIssueStats(repoID, uid, labelID int64, isShowClosed bool, filterMode int) *IssueStats {
|
||||
stats := &IssueStats{}
|
||||
issue := new(Issue)
|
||||
tmpSess := &xorm.Session{}
|
||||
|
||||
sess := x.Where("repo_id=?", rid)
|
||||
*tmpSess = *sess
|
||||
stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(issue)
|
||||
*tmpSess = *sess
|
||||
stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(issue)
|
||||
if isShowClosed {
|
||||
stats.AllCount = stats.ClosedCount
|
||||
} else {
|
||||
stats.AllCount = stats.OpenCount
|
||||
queryStr := "issue.repo_id=? AND issue.is_closed=?"
|
||||
if labelID > 0 {
|
||||
queryStr += " AND issue.label_ids like '%$" + com.ToStr(labelID) + "|%'"
|
||||
}
|
||||
switch filterMode {
|
||||
case FM_ALL:
|
||||
stats.OpenCount, _ = x.Where(queryStr, repoID, false).Count(issue)
|
||||
stats.ClosedCount, _ = x.Where(queryStr, repoID, true).Count(issue)
|
||||
return stats
|
||||
|
||||
if filterMode != FM_MENTION {
|
||||
sess = x.Where("repo_id=?", rid)
|
||||
switch filterMode {
|
||||
case FM_ASSIGN:
|
||||
sess.And("assignee_id=?", uid)
|
||||
case FM_CREATE:
|
||||
sess.And("poster_id=?", uid)
|
||||
default:
|
||||
goto nofilter
|
||||
case FM_ASSIGN:
|
||||
queryStr += " AND assignee_id=?"
|
||||
stats.OpenCount, _ = x.Where(queryStr, repoID, false, uid).Count(issue)
|
||||
stats.ClosedCount, _ = x.Where(queryStr, repoID, true, uid).Count(issue)
|
||||
return stats
|
||||
|
||||
case FM_CREATE:
|
||||
queryStr += " AND poster_id=?"
|
||||
stats.OpenCount, _ = x.Where(queryStr, repoID, false, uid).Count(issue)
|
||||
stats.ClosedCount, _ = x.Where(queryStr, repoID, true, uid).Count(issue)
|
||||
return stats
|
||||
|
||||
case FM_MENTION:
|
||||
queryStr += " AND uid=? AND is_mentioned=?"
|
||||
if labelID > 0 {
|
||||
stats.OpenCount, _ = x.Where(queryStr, repoID, false, uid, true).
|
||||
Join("INNER", "issue", "issue.id = issue_id").Count(new(IssueUser))
|
||||
stats.ClosedCount, _ = x.Where(queryStr, repoID, true, uid, true).
|
||||
Join("INNER", "issue", "issue.id = issue_id").Count(new(IssueUser))
|
||||
return stats
|
||||
}
|
||||
*tmpSess = *sess
|
||||
stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(issue)
|
||||
*tmpSess = *sess
|
||||
stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(issue)
|
||||
} else {
|
||||
sess := x.Where("repo_id=?", rid).And("uid=?", uid).And("is_mentioned=?", true)
|
||||
*tmpSess = *sess
|
||||
stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(new(IssueUser))
|
||||
*tmpSess = *sess
|
||||
stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(new(IssueUser))
|
||||
|
||||
queryStr = strings.Replace(queryStr, "issue.", "", 2)
|
||||
stats.OpenCount, _ = x.Where(queryStr, repoID, false, uid, true).Count(new(IssueUser))
|
||||
stats.ClosedCount, _ = x.Where(queryStr, repoID, true, uid, true).Count(new(IssueUser))
|
||||
return stats
|
||||
}
|
||||
nofilter:
|
||||
stats.AssignCount, _ = x.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("assignee_id=?", uid).Count(issue)
|
||||
stats.CreateCount, _ = x.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("poster_id=?", uid).Count(issue)
|
||||
stats.MentionCount, _ = x.Where("repo_id=?", rid).And("uid=?", uid).And("is_closed=?", isShowClosed).And("is_mentioned=?", true).Count(new(IssueUser))
|
||||
return stats
|
||||
}
|
||||
|
||||
@@ -445,7 +463,7 @@ func GetUserIssueStats(uid int64, filterMode int) *IssueStats {
|
||||
|
||||
// UpdateIssue updates information of issue.
|
||||
func UpdateIssue(issue *Issue) error {
|
||||
_, err := x.Id(issue.Id).AllCols().Update(issue)
|
||||
_, err := x.Id(issue.ID).AllCols().Update(issue)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -472,8 +490,8 @@ func UpdateIssueUserPairByAssignee(aid, iid int64) error {
|
||||
if aid == 0 {
|
||||
return nil
|
||||
}
|
||||
rawSql = "UPDATE `issue_user` SET is_assigned = true WHERE uid = ? AND issue_id = ?"
|
||||
_, err := x.Exec(rawSql, aid, iid)
|
||||
rawSql = "UPDATE `issue_user` SET is_assigned = ? WHERE uid = ? AND issue_id = ?"
|
||||
_, err := x.Exec(rawSql, true, aid, iid)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -515,7 +533,7 @@ func UpdateIssueUserPairsByMentions(uids []int64, iid int64) error {
|
||||
|
||||
// Label represents a label of repository for issues.
|
||||
type Label struct {
|
||||
Id int64
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
RepoId int64 `xorm:"INDEX"`
|
||||
Name string
|
||||
Color string `xorm:"VARCHAR(7)"`
|
||||
@@ -542,7 +560,7 @@ func GetLabelById(id int64) (*Label, error) {
|
||||
return nil, ErrLabelNotExist
|
||||
}
|
||||
|
||||
l := &Label{Id: id}
|
||||
l := &Label{ID: id}
|
||||
has, err := x.Get(l)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -561,14 +579,13 @@ func GetLabels(repoId int64) ([]*Label, error) {
|
||||
|
||||
// UpdateLabel updates label information.
|
||||
func UpdateLabel(l *Label) error {
|
||||
_, err := x.Id(l.Id).Update(l)
|
||||
_, err := x.Id(l.ID).AllCols().Update(l)
|
||||
return err
|
||||
}
|
||||
|
||||
// DeleteLabel delete a label of given repository.
|
||||
func DeleteLabel(repoId int64, strId string) error {
|
||||
id, _ := com.StrTo(strId).Int64()
|
||||
l, err := GetLabelById(id)
|
||||
func DeleteLabel(repoID, labelID int64) error {
|
||||
l, err := GetLabelById(labelID)
|
||||
if err != nil {
|
||||
if err == ErrLabelNotExist {
|
||||
return nil
|
||||
@@ -576,27 +593,25 @@ func DeleteLabel(repoId int64, strId string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
issues, err := GetIssuesByLabel(repoId, strId)
|
||||
issues, err := GetIssuesByLabel(repoID, labelID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
defer sessionRelease(sess)
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, issue := range issues {
|
||||
issue.LabelIds = strings.Replace(issue.LabelIds, "$"+strId+"|", "", -1)
|
||||
if _, err = sess.Id(issue.Id).AllCols().Update(issue); err != nil {
|
||||
sess.Rollback()
|
||||
issue.LabelIds = strings.Replace(issue.LabelIds, "$"+com.ToStr(labelID)+"|", "", -1)
|
||||
if _, err = sess.Id(issue.ID).AllCols().Update(issue); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if _, err = sess.Delete(l); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
return sess.Commit()
|
||||
@@ -777,7 +792,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) {
|
||||
}
|
||||
|
||||
rawSql := "UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?"
|
||||
if _, err = sess.Exec(rawSql, issue.Id); err != nil {
|
||||
if _, err = sess.Exec(rawSql, issue.ID); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
@@ -805,7 +820,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) {
|
||||
}
|
||||
|
||||
rawSql := "UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?"
|
||||
if _, err = sess.Exec(rawSql, m.Id, issue.Id); err != nil {
|
||||
if _, err = sess.Exec(rawSql, m.Id, issue.ID); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
@@ -859,22 +874,16 @@ type CommentType int
|
||||
|
||||
const (
|
||||
// Plain comment, can be associated with a commit (CommitId > 0) and a line (Line > 0)
|
||||
COMMENT CommentType = iota
|
||||
|
||||
// Reopen action
|
||||
REOPEN
|
||||
|
||||
// Close action
|
||||
CLOSE
|
||||
|
||||
// Reference from another issue
|
||||
ISSUE
|
||||
COMMENT_TYPE_COMMENT CommentType = iota
|
||||
COMMENT_TYPE_REOPEN
|
||||
COMMENT_TYPE_CLOSE
|
||||
|
||||
// References.
|
||||
COMMENT_TYPE_ISSUE
|
||||
// Reference from some commit (not part of a pull request)
|
||||
COMMIT
|
||||
|
||||
COMMENT_TYPE_COMMIT
|
||||
// Reference from some pull request
|
||||
PULL
|
||||
COMMENT_TYPE_PULL
|
||||
)
|
||||
|
||||
// Comment represents a comment in commit and issue page.
|
||||
@@ -893,7 +902,7 @@ type Comment struct {
|
||||
// CreateComment creates comment of issue or commit.
|
||||
func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType CommentType, content string, attachments []int64) (*Comment, error) {
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
defer sessionRelease(sess)
|
||||
if err := sess.Begin(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -902,16 +911,14 @@ func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType Commen
|
||||
CommitId: commitId, Line: line, Content: content}
|
||||
|
||||
if _, err := sess.Insert(comment); err != nil {
|
||||
sess.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Check comment type.
|
||||
switch cmtType {
|
||||
case COMMENT:
|
||||
case COMMENT_TYPE_COMMENT:
|
||||
rawSql := "UPDATE `issue` SET num_comments = num_comments + 1 WHERE id = ?"
|
||||
if _, err := sess.Exec(rawSql, issueId); err != nil {
|
||||
sess.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -925,20 +932,17 @@ func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType Commen
|
||||
}
|
||||
|
||||
if _, err := sess.Exec(rawSql, comment.Id, strings.Join(astrs, ",")); err != nil {
|
||||
sess.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
case REOPEN:
|
||||
case COMMENT_TYPE_REOPEN:
|
||||
rawSql := "UPDATE `repository` SET num_closed_issues = num_closed_issues - 1 WHERE id = ?"
|
||||
if _, err := sess.Exec(rawSql, repoId); err != nil {
|
||||
sess.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
case CLOSE:
|
||||
case COMMENT_TYPE_CLOSE:
|
||||
rawSql := "UPDATE `repository` SET num_closed_issues = num_closed_issues + 1 WHERE id = ?"
|
||||
if _, err := sess.Exec(rawSql, repoId); err != nil {
|
||||
sess.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
186
models/login.go
186
models/login.go
@@ -17,7 +17,9 @@ import (
|
||||
"github.com/go-xorm/xorm"
|
||||
|
||||
"github.com/gogits/gogs/modules/auth/ldap"
|
||||
"github.com/gogits/gogs/modules/auth/pam"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/uuid"
|
||||
)
|
||||
|
||||
type LoginType int
|
||||
@@ -27,6 +29,7 @@ const (
|
||||
PLAIN
|
||||
LDAP
|
||||
SMTP
|
||||
PAM
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -38,12 +41,14 @@ var (
|
||||
var LoginTypes = map[LoginType]string{
|
||||
LDAP: "LDAP",
|
||||
SMTP: "SMTP",
|
||||
PAM: "PAM",
|
||||
}
|
||||
|
||||
// Ensure structs implmented interface.
|
||||
// Ensure structs implemented interface.
|
||||
var (
|
||||
_ core.Conversion = &LDAPConfig{}
|
||||
_ core.Conversion = &SMTPConfig{}
|
||||
_ core.Conversion = &PAMConfig{}
|
||||
)
|
||||
|
||||
type LDAPConfig struct {
|
||||
@@ -73,6 +78,18 @@ func (cfg *SMTPConfig) ToDB() ([]byte, error) {
|
||||
return json.Marshal(cfg)
|
||||
}
|
||||
|
||||
type PAMConfig struct {
|
||||
ServiceName string // pam service (e.g. system-auth)
|
||||
}
|
||||
|
||||
func (cfg *PAMConfig) FromDB(bs []byte) error {
|
||||
return json.Unmarshal(bs, &cfg)
|
||||
}
|
||||
|
||||
func (cfg *PAMConfig) ToDB() ([]byte, error) {
|
||||
return json.Marshal(cfg)
|
||||
}
|
||||
|
||||
type LoginSource struct {
|
||||
Id int64
|
||||
Type LoginType
|
||||
@@ -96,6 +113,10 @@ func (source *LoginSource) SMTP() *SMTPConfig {
|
||||
return source.Cfg.(*SMTPConfig)
|
||||
}
|
||||
|
||||
func (source *LoginSource) PAM() *PAMConfig {
|
||||
return source.Cfg.(*PAMConfig)
|
||||
}
|
||||
|
||||
func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
|
||||
if colName == "type" {
|
||||
ty := (*val).(int64)
|
||||
@@ -104,6 +125,8 @@ func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
|
||||
source.Cfg = new(LDAPConfig)
|
||||
case SMTP:
|
||||
source.Cfg = new(SMTPConfig)
|
||||
case PAM:
|
||||
source.Cfg = new(PAMConfig)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -168,90 +191,99 @@ func UserSignIn(uname, passwd string) (*User, error) {
|
||||
// For plain login, user must exist to reach this line.
|
||||
// Now verify password.
|
||||
if u.LoginType == PLAIN {
|
||||
newUser := &User{Passwd: passwd, Salt: u.Salt}
|
||||
newUser.EncodePasswd()
|
||||
if u.Passwd != newUser.Passwd {
|
||||
if !u.ValidatePassword(passwd) {
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
return u, nil
|
||||
} else {
|
||||
if !has {
|
||||
var sources []LoginSource
|
||||
if err = x.UseBool().Find(&sources,
|
||||
&LoginSource{IsActived: true, AllowAutoRegister: true}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, source := range sources {
|
||||
if source.Type == LDAP {
|
||||
u, err := LoginUserLdapSource(nil, uname, passwd,
|
||||
source.Id, source.Cfg.(*LDAPConfig), true)
|
||||
if err == nil {
|
||||
return u, nil
|
||||
}
|
||||
log.Warn("Fail to login(%s) by LDAP(%s): %v", uname, source.Name, err)
|
||||
} else if source.Type == SMTP {
|
||||
u, err := LoginUserSMTPSource(nil, uname, passwd,
|
||||
source.Id, source.Cfg.(*SMTPConfig), true)
|
||||
if err == nil {
|
||||
return u, nil
|
||||
}
|
||||
log.Warn("Fail to login(%s) by SMTP(%s): %v", uname, source.Name, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
|
||||
var source LoginSource
|
||||
hasSource, err := x.Id(u.LoginSource).Get(&source)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !hasSource {
|
||||
return nil, ErrLoginSourceNotExist
|
||||
} else if !source.IsActived {
|
||||
return nil, ErrLoginSourceNotActived
|
||||
}
|
||||
|
||||
switch u.LoginType {
|
||||
case LDAP:
|
||||
return LoginUserLdapSource(u, u.LoginName, passwd,
|
||||
source.Id, source.Cfg.(*LDAPConfig), false)
|
||||
case SMTP:
|
||||
return LoginUserSMTPSource(u, u.LoginName, passwd,
|
||||
source.Id, source.Cfg.(*SMTPConfig), false)
|
||||
}
|
||||
return nil, ErrUnsupportedLoginType
|
||||
}
|
||||
|
||||
if !has {
|
||||
var sources []LoginSource
|
||||
if err = x.UseBool().Find(&sources,
|
||||
&LoginSource{IsActived: true, AllowAutoRegister: true}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, source := range sources {
|
||||
if source.Type == LDAP {
|
||||
u, err := LoginUserLdapSource(nil, uname, passwd,
|
||||
source.Id, source.Cfg.(*LDAPConfig), true)
|
||||
if err == nil {
|
||||
return u, nil
|
||||
}
|
||||
log.Warn("Fail to login(%s) by LDAP(%s): %v", uname, source.Name, err)
|
||||
} else if source.Type == SMTP {
|
||||
u, err := LoginUserSMTPSource(nil, uname, passwd,
|
||||
source.Id, source.Cfg.(*SMTPConfig), true)
|
||||
if err == nil {
|
||||
return u, nil
|
||||
}
|
||||
log.Warn("Fail to login(%s) by SMTP(%s): %v", uname, source.Name, err)
|
||||
} else if source.Type == PAM {
|
||||
u, err := LoginUserPAMSource(nil, uname, passwd,
|
||||
source.Id, source.Cfg.(*PAMConfig), true)
|
||||
if err == nil {
|
||||
return u, nil
|
||||
}
|
||||
log.Warn("Fail to login(%s) by PAM(%s): %v", uname, source.Name, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
|
||||
var source LoginSource
|
||||
hasSource, err := x.Id(u.LoginSource).Get(&source)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !hasSource {
|
||||
return nil, ErrLoginSourceNotExist
|
||||
} else if !source.IsActived {
|
||||
return nil, ErrLoginSourceNotActived
|
||||
}
|
||||
|
||||
switch u.LoginType {
|
||||
case LDAP:
|
||||
return LoginUserLdapSource(u, u.LoginName, passwd, source.Id, source.Cfg.(*LDAPConfig), false)
|
||||
case SMTP:
|
||||
return LoginUserSMTPSource(u, u.LoginName, passwd, source.Id, source.Cfg.(*SMTPConfig), false)
|
||||
case PAM:
|
||||
return LoginUserPAMSource(u, u.LoginName, passwd, source.Id, source.Cfg.(*PAMConfig), false)
|
||||
}
|
||||
return nil, ErrUnsupportedLoginType
|
||||
}
|
||||
|
||||
// Query if name/passwd can login against the LDAP direcotry pool
|
||||
// Query if name/passwd can login against the LDAP directory pool
|
||||
// Create a local user if success
|
||||
// Return the same LoginUserPlain semantic
|
||||
// FIXME: https://github.com/gogits/gogs/issues/672
|
||||
func LoginUserLdapSource(u *User, name, passwd string, sourceId int64, cfg *LDAPConfig, autoRegister bool) (*User, error) {
|
||||
mail, logged := cfg.Ldapsource.SearchEntry(name, passwd)
|
||||
name, fn, sn, mail, logged := cfg.Ldapsource.SearchEntry(name, passwd)
|
||||
if !logged {
|
||||
// user not in LDAP, do nothing
|
||||
// User not in LDAP, do nothing
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
if !autoRegister {
|
||||
return u, nil
|
||||
}
|
||||
|
||||
// fake a local user creation
|
||||
// Fallback.
|
||||
if len(mail) == 0 {
|
||||
mail = uuid.NewV4().String() + "@localhost"
|
||||
}
|
||||
|
||||
u = &User{
|
||||
LowerName: strings.ToLower(name),
|
||||
Name: strings.ToLower(name),
|
||||
Name: name,
|
||||
FullName: fn + " " + sn,
|
||||
LoginType: LDAP,
|
||||
LoginSource: sourceId,
|
||||
LoginName: name,
|
||||
IsActive: true,
|
||||
Passwd: passwd,
|
||||
Email: mail,
|
||||
IsActive: true,
|
||||
}
|
||||
|
||||
err := CreateUser(u)
|
||||
return u, err
|
||||
return u, CreateUser(u)
|
||||
}
|
||||
|
||||
type loginAuth struct {
|
||||
@@ -315,7 +347,7 @@ func SmtpAuth(host string, port int, a smtp.Auth, useTls bool) error {
|
||||
return ErrUnsupportedLoginType
|
||||
}
|
||||
|
||||
// Query if name/passwd can login against the LDAP direcotry pool
|
||||
// Query if name/passwd can login against the LDAP directory pool
|
||||
// Create a local user if success
|
||||
// Return the same LoginUserPlain semantic
|
||||
func LoginUserSMTPSource(u *User, name, passwd string, sourceId int64, cfg *SMTPConfig, autoRegister bool) (*User, error) {
|
||||
@@ -358,3 +390,33 @@ func LoginUserSMTPSource(u *User, name, passwd string, sourceId int64, cfg *SMTP
|
||||
err := CreateUser(u)
|
||||
return u, err
|
||||
}
|
||||
|
||||
// Query if name/passwd can login against PAM
|
||||
// Create a local user if success
|
||||
// Return the same LoginUserPlain semantic
|
||||
func LoginUserPAMSource(u *User, name, passwd string, sourceId int64, cfg *PAMConfig, autoRegister bool) (*User, error) {
|
||||
if err := pam.PAMAuth(cfg.ServiceName, name, passwd); err != nil {
|
||||
if strings.Contains(err.Error(), "Authentication failure") {
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !autoRegister {
|
||||
return u, nil
|
||||
}
|
||||
|
||||
// fake a local user creation
|
||||
u = &User{
|
||||
LowerName: strings.ToLower(name),
|
||||
Name: strings.ToLower(name),
|
||||
LoginType: PAM,
|
||||
LoginSource: sourceId,
|
||||
LoginName: name,
|
||||
IsActive: true,
|
||||
Passwd: passwd,
|
||||
Email: name,
|
||||
}
|
||||
err := CreateUser(u)
|
||||
return u, err
|
||||
}
|
||||
|
||||
455
models/migrations/migrations.go
Normal file
455
models/migrations/migrations.go
Normal file
@@ -0,0 +1,455 @@
|
||||
// Copyright 2015 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 migrations
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/go-xorm/xorm"
|
||||
"gopkg.in/ini.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
const _MIN_DB_VER = 0
|
||||
|
||||
type Migration interface {
|
||||
Description() string
|
||||
Migrate(*xorm.Engine) error
|
||||
}
|
||||
|
||||
type migration struct {
|
||||
description string
|
||||
migrate func(*xorm.Engine) error
|
||||
}
|
||||
|
||||
func NewMigration(desc string, fn func(*xorm.Engine) error) Migration {
|
||||
return &migration{desc, fn}
|
||||
}
|
||||
|
||||
func (m *migration) Description() string {
|
||||
return m.description
|
||||
}
|
||||
|
||||
func (m *migration) Migrate(x *xorm.Engine) error {
|
||||
return m.migrate(x)
|
||||
}
|
||||
|
||||
// The version table. Should have only one row with id==1
|
||||
type Version struct {
|
||||
Id int64
|
||||
Version int64
|
||||
}
|
||||
|
||||
// This is a sequence of migrations. Add new migrations to the bottom of the list.
|
||||
// If you want to "retire" a migration, remove it from the top of the list and
|
||||
// update _MIN_VER_DB accordingly
|
||||
var migrations = []Migration{
|
||||
NewMigration("generate collaboration from access", accessToCollaboration), // V0 -> V1:v0.5.13
|
||||
NewMigration("make authorize 4 if team is owners", ownerTeamUpdate), // V1 -> V2:v0.5.13
|
||||
NewMigration("refactor access table to use id's", accessRefactor), // V2 -> V3:v0.5.13
|
||||
NewMigration("generate team-repo from team", teamToTeamRepo), // V3 -> V4:v0.5.13
|
||||
NewMigration("fix locale file load panic", fixLocaleFileLoadPanic), // V4 -> V5:v0.6.0
|
||||
NewMigration("trim action compare URL prefix", trimCommitActionAppUrlPrefix), // V5 -> V6:v0.6.3 // V4 -> V5:v0.6.0
|
||||
}
|
||||
|
||||
// Migrate database to current version
|
||||
func Migrate(x *xorm.Engine) error {
|
||||
if err := x.Sync(new(Version)); err != nil {
|
||||
return fmt.Errorf("sync: %v", err)
|
||||
}
|
||||
|
||||
currentVersion := &Version{Id: 1}
|
||||
has, err := x.Get(currentVersion)
|
||||
if err != nil {
|
||||
return fmt.Errorf("get: %v", err)
|
||||
} else if !has {
|
||||
// If the user table does not exist it is a fresh installation and we
|
||||
// can skip all migrations.
|
||||
needsMigration, err := x.IsTableExist("user")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if needsMigration {
|
||||
isEmpty, err := x.IsTableEmpty("user")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// If the user table is empty it is a fresh installation and we can
|
||||
// skip all migrations.
|
||||
needsMigration = !isEmpty
|
||||
}
|
||||
if !needsMigration {
|
||||
currentVersion.Version = int64(_MIN_DB_VER + len(migrations))
|
||||
}
|
||||
|
||||
if _, err = x.InsertOne(currentVersion); err != nil {
|
||||
return fmt.Errorf("insert: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
v := currentVersion.Version
|
||||
for i, m := range migrations[v-_MIN_DB_VER:] {
|
||||
log.Info("Migration: %s", m.Description())
|
||||
if err = m.Migrate(x); err != nil {
|
||||
return fmt.Errorf("do migrate: %v", err)
|
||||
}
|
||||
currentVersion.Version = v + int64(i) + 1
|
||||
if _, err = x.Id(1).Update(currentVersion); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func sessionRelease(sess *xorm.Session) {
|
||||
if !sess.IsCommitedOrRollbacked {
|
||||
sess.Rollback()
|
||||
}
|
||||
sess.Close()
|
||||
}
|
||||
|
||||
func accessToCollaboration(x *xorm.Engine) (err error) {
|
||||
type Collaboration struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
|
||||
UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
|
||||
Created time.Time
|
||||
}
|
||||
|
||||
if err = x.Sync(new(Collaboration)); err != nil {
|
||||
return fmt.Errorf("sync: %v", err)
|
||||
}
|
||||
|
||||
results, err := x.Query("SELECT u.id AS `uid`, a.repo_name AS `repo`, a.mode AS `mode`, a.created as `created` FROM `access` a JOIN `user` u ON a.user_name=u.lower_name")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sessionRelease(sess)
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
offset := strings.Split(time.Now().String(), " ")[2]
|
||||
for _, result := range results {
|
||||
mode := com.StrTo(result["mode"]).MustInt64()
|
||||
// Collaborators must have write access.
|
||||
if mode < 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
userID := com.StrTo(result["uid"]).MustInt64()
|
||||
repoRefName := string(result["repo"])
|
||||
|
||||
var created time.Time
|
||||
switch {
|
||||
case setting.UseSQLite3:
|
||||
created, _ = time.Parse(time.RFC3339, string(result["created"]))
|
||||
case setting.UseMySQL:
|
||||
created, _ = time.Parse("2006-01-02 15:04:05-0700", string(result["created"])+offset)
|
||||
case setting.UsePostgreSQL:
|
||||
created, _ = time.Parse("2006-01-02T15:04:05Z-0700", string(result["created"])+offset)
|
||||
}
|
||||
|
||||
// find owner of repository
|
||||
parts := strings.SplitN(repoRefName, "/", 2)
|
||||
ownerName := parts[0]
|
||||
repoName := parts[1]
|
||||
|
||||
results, err := sess.Query("SELECT u.id as `uid`, ou.uid as `memberid` FROM `user` u LEFT JOIN org_user ou ON ou.org_id=u.id WHERE u.lower_name=?", ownerName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(results) < 1 {
|
||||
continue
|
||||
}
|
||||
|
||||
ownerID := com.StrTo(results[0]["uid"]).MustInt64()
|
||||
if ownerID == userID {
|
||||
continue
|
||||
}
|
||||
|
||||
// test if user is member of owning organization
|
||||
isMember := false
|
||||
for _, member := range results {
|
||||
memberID := com.StrTo(member["memberid"]).MustInt64()
|
||||
// We can skip all cases that a user is member of the owning organization
|
||||
if memberID == userID {
|
||||
isMember = true
|
||||
}
|
||||
}
|
||||
if isMember {
|
||||
continue
|
||||
}
|
||||
|
||||
results, err = sess.Query("SELECT id FROM `repository` WHERE owner_id=? AND lower_name=?", ownerID, repoName)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if len(results) < 1 {
|
||||
continue
|
||||
}
|
||||
|
||||
collaboration := &Collaboration{
|
||||
UserID: userID,
|
||||
RepoID: com.StrTo(results[0]["id"]).MustInt64(),
|
||||
}
|
||||
has, err := sess.Get(collaboration)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if has {
|
||||
continue
|
||||
}
|
||||
|
||||
collaboration.Created = created
|
||||
if _, err = sess.InsertOne(collaboration); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
||||
func ownerTeamUpdate(x *xorm.Engine) (err error) {
|
||||
if _, err := x.Exec("UPDATE `team` SET authorize=4 WHERE lower_name=?", "owners"); err != nil {
|
||||
return fmt.Errorf("update owner team table: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func accessRefactor(x *xorm.Engine) (err error) {
|
||||
type (
|
||||
AccessMode int
|
||||
Access struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
UserID int64 `xorm:"UNIQUE(s)"`
|
||||
RepoID int64 `xorm:"UNIQUE(s)"`
|
||||
Mode AccessMode
|
||||
}
|
||||
UserRepo struct {
|
||||
UserID int64
|
||||
RepoID int64
|
||||
}
|
||||
)
|
||||
|
||||
// We consiously don't start a session yet as we make only reads for now, no writes
|
||||
|
||||
accessMap := make(map[UserRepo]AccessMode, 50)
|
||||
|
||||
results, err := x.Query("SELECT r.id AS `repo_id`, r.is_private AS `is_private`, r.owner_id AS `owner_id`, u.type AS `owner_type` FROM `repository` r LEFT JOIN `user` u ON r.owner_id=u.id")
|
||||
if err != nil {
|
||||
return fmt.Errorf("select repositories: %v", err)
|
||||
}
|
||||
for _, repo := range results {
|
||||
repoID := com.StrTo(repo["repo_id"]).MustInt64()
|
||||
isPrivate := com.StrTo(repo["is_private"]).MustInt() > 0
|
||||
ownerID := com.StrTo(repo["owner_id"]).MustInt64()
|
||||
ownerIsOrganization := com.StrTo(repo["owner_type"]).MustInt() > 0
|
||||
|
||||
results, err := x.Query("SELECT `user_id` FROM `collaboration` WHERE repo_id=?", repoID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("select collaborators: %v", err)
|
||||
}
|
||||
for _, user := range results {
|
||||
userID := com.StrTo(user["user_id"]).MustInt64()
|
||||
accessMap[UserRepo{userID, repoID}] = 2 // WRITE ACCESS
|
||||
}
|
||||
|
||||
if !ownerIsOrganization {
|
||||
continue
|
||||
}
|
||||
|
||||
// The minimum level to add a new access record,
|
||||
// because public repository has implicit open access.
|
||||
minAccessLevel := AccessMode(0)
|
||||
if !isPrivate {
|
||||
minAccessLevel = 1
|
||||
}
|
||||
|
||||
repoString := "$" + string(repo["repo_id"]) + "|"
|
||||
|
||||
results, err = x.Query("SELECT `id`,`authorize`,`repo_ids` FROM `team` WHERE org_id=? AND authorize>? ORDER BY `authorize` ASC", ownerID, int(minAccessLevel))
|
||||
if err != nil {
|
||||
return fmt.Errorf("select teams from org: %v", err)
|
||||
}
|
||||
|
||||
for _, team := range results {
|
||||
if !strings.Contains(string(team["repo_ids"]), repoString) {
|
||||
continue
|
||||
}
|
||||
teamID := com.StrTo(team["id"]).MustInt64()
|
||||
mode := AccessMode(com.StrTo(team["authorize"]).MustInt())
|
||||
|
||||
results, err := x.Query("SELECT `uid` FROM `team_user` WHERE team_id=?", teamID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("select users from team: %v", err)
|
||||
}
|
||||
for _, user := range results {
|
||||
userID := com.StrTo(user["uid"]).MustInt64()
|
||||
accessMap[UserRepo{userID, repoID}] = mode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Drop table can't be in a session (at least not in sqlite)
|
||||
if _, err = x.Exec("DROP TABLE `access`"); err != nil {
|
||||
return fmt.Errorf("drop access table: %v", err)
|
||||
}
|
||||
|
||||
// Now we start writing so we make a session
|
||||
sess := x.NewSession()
|
||||
defer sessionRelease(sess)
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = sess.Sync2(new(Access)); err != nil {
|
||||
return fmt.Errorf("sync: %v", err)
|
||||
}
|
||||
|
||||
accesses := make([]*Access, 0, len(accessMap))
|
||||
for ur, mode := range accessMap {
|
||||
accesses = append(accesses, &Access{UserID: ur.UserID, RepoID: ur.RepoID, Mode: mode})
|
||||
}
|
||||
|
||||
if _, err = sess.Insert(accesses); err != nil {
|
||||
return fmt.Errorf("insert accesses: %v", err)
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
||||
func teamToTeamRepo(x *xorm.Engine) error {
|
||||
type TeamRepo struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
OrgID int64 `xorm:"INDEX"`
|
||||
TeamID int64 `xorm:"UNIQUE(s)"`
|
||||
RepoID int64 `xorm:"UNIQUE(s)"`
|
||||
}
|
||||
|
||||
teamRepos := make([]*TeamRepo, 0, 50)
|
||||
|
||||
results, err := x.Query("SELECT `id`,`org_id`,`repo_ids` FROM `team`")
|
||||
if err != nil {
|
||||
return fmt.Errorf("select teams: %v", err)
|
||||
}
|
||||
for _, team := range results {
|
||||
orgID := com.StrTo(team["org_id"]).MustInt64()
|
||||
teamID := com.StrTo(team["id"]).MustInt64()
|
||||
|
||||
// #1032: legacy code can have duplicated IDs for same repository.
|
||||
mark := make(map[int64]bool)
|
||||
for _, idStr := range strings.Split(string(team["repo_ids"]), "|") {
|
||||
repoID := com.StrTo(strings.TrimPrefix(idStr, "$")).MustInt64()
|
||||
if repoID == 0 || mark[repoID] {
|
||||
continue
|
||||
}
|
||||
|
||||
mark[repoID] = true
|
||||
teamRepos = append(teamRepos, &TeamRepo{
|
||||
OrgID: orgID,
|
||||
TeamID: teamID,
|
||||
RepoID: repoID,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sessionRelease(sess)
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = sess.Sync2(new(TeamRepo)); err != nil {
|
||||
return fmt.Errorf("sync: %v", err)
|
||||
} else if _, err = sess.Insert(teamRepos); err != nil {
|
||||
return fmt.Errorf("insert team-repos: %v", err)
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
||||
func fixLocaleFileLoadPanic(_ *xorm.Engine) error {
|
||||
cfg, err := ini.Load(setting.CustomConf)
|
||||
if err != nil {
|
||||
return fmt.Errorf("load custom config: %v", err)
|
||||
}
|
||||
|
||||
cfg.DeleteSection("i18n")
|
||||
if err = cfg.SaveTo(setting.CustomConf); err != nil {
|
||||
return fmt.Errorf("save custom config: %v", err)
|
||||
}
|
||||
|
||||
setting.Langs = strings.Split(strings.Replace(strings.Join(setting.Langs, ","), "fr-CA", "fr-FR", 1), ",")
|
||||
return nil
|
||||
}
|
||||
|
||||
func trimCommitActionAppUrlPrefix(x *xorm.Engine) error {
|
||||
type PushCommit struct {
|
||||
Sha1 string
|
||||
Message string
|
||||
AuthorEmail string
|
||||
AuthorName string
|
||||
}
|
||||
|
||||
type PushCommits struct {
|
||||
Len int
|
||||
Commits []*PushCommit
|
||||
CompareUrl string
|
||||
}
|
||||
|
||||
type Action struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
Content string `xorm:"TEXT"`
|
||||
}
|
||||
|
||||
results, err := x.Query("SELECT `id`,`content` FROM `action` WHERE `op_type`=?", 5)
|
||||
if err != nil {
|
||||
return fmt.Errorf("select commit actions: %v", err)
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sessionRelease(sess)
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var pushCommits *PushCommits
|
||||
for _, action := range results {
|
||||
actID := com.StrTo(string(action["id"])).MustInt64()
|
||||
if actID == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
pushCommits = new(PushCommits)
|
||||
if err = json.Unmarshal(action["content"], pushCommits); err != nil {
|
||||
return fmt.Errorf("unmarshal action content[%s]: %v", actID, err)
|
||||
}
|
||||
|
||||
infos := strings.Split(pushCommits.CompareUrl, "/")
|
||||
if len(infos) <= 4 {
|
||||
continue
|
||||
}
|
||||
pushCommits.CompareUrl = strings.Join(infos[len(infos)-4:], "/")
|
||||
|
||||
p, err := json.Marshal(pushCommits)
|
||||
if err != nil {
|
||||
return fmt.Errorf("marshal action content[%s]: %v", actID, err)
|
||||
}
|
||||
|
||||
if _, err = sess.Id(actID).Update(&Action{
|
||||
Content: string(p),
|
||||
}); err != nil {
|
||||
return fmt.Errorf("update action[%s]: %v", actID, err)
|
||||
}
|
||||
}
|
||||
return sess.Commit()
|
||||
}
|
||||
@@ -12,9 +12,11 @@ import (
|
||||
"strings"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/go-xorm/core"
|
||||
"github.com/go-xorm/xorm"
|
||||
_ "github.com/lib/pq"
|
||||
|
||||
"github.com/gogits/gogs/models/migrations"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
@@ -22,7 +24,20 @@ import (
|
||||
type Engine interface {
|
||||
Delete(interface{}) (int64, error)
|
||||
Exec(string, ...interface{}) (sql.Result, error)
|
||||
Find(interface{}, ...interface{}) error
|
||||
Get(interface{}) (bool, error)
|
||||
Insert(...interface{}) (int64, error)
|
||||
InsertOne(interface{}) (int64, error)
|
||||
Id(interface{}) *xorm.Session
|
||||
Sql(string, ...interface{}) *xorm.Session
|
||||
Where(string, ...interface{}) *xorm.Session
|
||||
}
|
||||
|
||||
func sessionRelease(sess *xorm.Session) {
|
||||
if !sess.IsCommitedOrRollbacked {
|
||||
sess.Rollback()
|
||||
}
|
||||
sess.Close()
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -31,44 +46,56 @@ var (
|
||||
HasEngine bool
|
||||
|
||||
DbCfg struct {
|
||||
Type, Host, Name, User, Pwd, Path, SslMode string
|
||||
Type, Host, Name, User, Passwd, Path, SSLMode string
|
||||
}
|
||||
|
||||
EnableSQLite3 bool
|
||||
UseSQLite3 bool
|
||||
)
|
||||
|
||||
func init() {
|
||||
tables = append(tables,
|
||||
new(User), new(PublicKey), new(Follow), new(Oauth2), new(AccessToken),
|
||||
new(Repository), new(Watch), new(Star), new(Action), new(Access),
|
||||
new(User), new(PublicKey), new(Oauth2), new(AccessToken),
|
||||
new(Repository), new(Collaboration), new(Access),
|
||||
new(Watch), new(Star), new(Follow), new(Action),
|
||||
new(Issue), new(Comment), new(Attachment), new(IssueUser), new(Label), new(Milestone),
|
||||
new(Mirror), new(Release), new(LoginSource), new(Webhook),
|
||||
new(UpdateTask), new(HookTask), new(Team), new(OrgUser), new(TeamUser),
|
||||
new(Notice))
|
||||
new(UpdateTask), new(HookTask),
|
||||
new(Team), new(OrgUser), new(TeamUser), new(TeamRepo),
|
||||
new(Notice), new(EmailAddress))
|
||||
}
|
||||
|
||||
func LoadModelsConfig() {
|
||||
DbCfg.Type = setting.Cfg.MustValue("database", "DB_TYPE")
|
||||
if DbCfg.Type == "sqlite3" {
|
||||
UseSQLite3 = true
|
||||
sec := setting.Cfg.Section("database")
|
||||
DbCfg.Type = sec.Key("DB_TYPE").String()
|
||||
switch DbCfg.Type {
|
||||
case "sqlite3":
|
||||
setting.UseSQLite3 = true
|
||||
case "mysql":
|
||||
setting.UseMySQL = true
|
||||
case "postgres":
|
||||
setting.UsePostgreSQL = true
|
||||
}
|
||||
DbCfg.Host = setting.Cfg.MustValue("database", "HOST")
|
||||
DbCfg.Name = setting.Cfg.MustValue("database", "NAME")
|
||||
DbCfg.User = setting.Cfg.MustValue("database", "USER")
|
||||
if len(DbCfg.Pwd) == 0 {
|
||||
DbCfg.Pwd = setting.Cfg.MustValue("database", "PASSWD")
|
||||
DbCfg.Host = sec.Key("HOST").String()
|
||||
DbCfg.Name = sec.Key("NAME").String()
|
||||
DbCfg.User = sec.Key("USER").String()
|
||||
if len(DbCfg.Passwd) == 0 {
|
||||
DbCfg.Passwd = sec.Key("PASSWD").String()
|
||||
}
|
||||
DbCfg.SslMode = setting.Cfg.MustValue("database", "SSL_MODE")
|
||||
DbCfg.Path = setting.Cfg.MustValue("database", "PATH", "data/gogs.db")
|
||||
DbCfg.SSLMode = sec.Key("SSL_MODE").String()
|
||||
DbCfg.Path = sec.Key("PATH").MustString("data/gogs.db")
|
||||
}
|
||||
|
||||
func getEngine() (*xorm.Engine, error) {
|
||||
cnnstr := ""
|
||||
switch DbCfg.Type {
|
||||
case "mysql":
|
||||
cnnstr = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8",
|
||||
DbCfg.User, DbCfg.Pwd, DbCfg.Host, DbCfg.Name)
|
||||
if DbCfg.Host[0] == '/' { // looks like a unix socket
|
||||
cnnstr = fmt.Sprintf("%s:%s@unix(%s)/%s?charset=utf8",
|
||||
DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name)
|
||||
} else {
|
||||
cnnstr = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8",
|
||||
DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name)
|
||||
}
|
||||
case "postgres":
|
||||
var host, port = "127.0.0.1", "5432"
|
||||
fields := strings.Split(DbCfg.Host, ":")
|
||||
@@ -78,8 +105,8 @@ func getEngine() (*xorm.Engine, error) {
|
||||
if len(fields) > 1 && len(strings.TrimSpace(fields[1])) > 0 {
|
||||
port = fields[1]
|
||||
}
|
||||
cnnstr = fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s",
|
||||
DbCfg.User, DbCfg.Pwd, host, port, DbCfg.Name, DbCfg.SslMode)
|
||||
cnnstr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=%s",
|
||||
DbCfg.User, DbCfg.Passwd, host, port, DbCfg.Name, DbCfg.SSLMode)
|
||||
case "sqlite3":
|
||||
if !EnableSQLite3 {
|
||||
return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type)
|
||||
@@ -95,28 +122,31 @@ func getEngine() (*xorm.Engine, error) {
|
||||
func NewTestEngine(x *xorm.Engine) (err error) {
|
||||
x, err = getEngine()
|
||||
if err != nil {
|
||||
return fmt.Errorf("models.init(fail to connect to database): %v", err)
|
||||
return fmt.Errorf("Connect to database: %v", err)
|
||||
}
|
||||
|
||||
x.SetMapper(core.GonicMapper{})
|
||||
return x.Sync(tables...)
|
||||
}
|
||||
|
||||
func SetEngine() (err error) {
|
||||
x, err = getEngine()
|
||||
if err != nil {
|
||||
return fmt.Errorf("models.init(fail to connect to database): %v", err)
|
||||
return fmt.Errorf("Connect to database: %v", err)
|
||||
}
|
||||
|
||||
// WARNNING: for serv command, MUST remove the output to os.stdout,
|
||||
x.SetMapper(core.GonicMapper{})
|
||||
|
||||
// WARNING: for serv command, MUST remove the output to os.stdout,
|
||||
// so use log file to instead print to stdout.
|
||||
logPath := path.Join(setting.LogRootPath, "xorm.log")
|
||||
os.MkdirAll(path.Dir(logPath), os.ModePerm)
|
||||
|
||||
f, err := os.Create(logPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("models.init(fail to create xorm.log): %v", err)
|
||||
return fmt.Errorf("Fail to create xorm.log: %v", err)
|
||||
}
|
||||
x.Logger = xorm.NewSimpleLogger(f)
|
||||
x.SetLogger(xorm.NewSimpleLogger(f))
|
||||
|
||||
x.ShowSQL = true
|
||||
x.ShowInfo = true
|
||||
@@ -130,9 +160,15 @@ func NewEngine() (err error) {
|
||||
if err = SetEngine(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = migrations.Migrate(x); err != nil {
|
||||
return fmt.Errorf("migrate: %v", err)
|
||||
}
|
||||
|
||||
if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil {
|
||||
return fmt.Errorf("sync database struct error: %v\n", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ func UpdateOauth2(oa *Oauth2) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// GetOauthByUserId returns list of oauthes that are releated to given user.
|
||||
// GetOauthByUserId returns list of oauthes that are related to given user.
|
||||
func GetOauthByUserId(uid int64) ([]*Oauth2, error) {
|
||||
socials := make([]*Oauth2, 0, 5)
|
||||
err := x.Find(&socials, Oauth2{Uid: uid})
|
||||
|
||||
809
models/org.go
809
models/org.go
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,8 @@ package models
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/base64"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -27,11 +29,11 @@ import (
|
||||
|
||||
const (
|
||||
// "### autogenerated by gitgos, DO NOT EDIT\n"
|
||||
_TPL_PUBLICK_KEY = `command="%s serv key-%d",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty %s` + "\n"
|
||||
_TPL_PUBLICK_KEY = `command="%s serv key-%d --config='%s'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty %s` + "\n"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrKeyAlreadyExist = errors.New("Public key already exist")
|
||||
ErrKeyAlreadyExist = errors.New("Public key already exists")
|
||||
ErrKeyNotExist = errors.New("Public key does not exist")
|
||||
ErrKeyUnableVerify = errors.New("Unable to verify public key")
|
||||
)
|
||||
@@ -39,7 +41,7 @@ var (
|
||||
var sshOpLocker = sync.Mutex{}
|
||||
|
||||
var (
|
||||
SshPath string // SSH directory.
|
||||
SSHPath string // SSH directory.
|
||||
appPath string // Execution(binary) path.
|
||||
)
|
||||
|
||||
@@ -70,9 +72,9 @@ func init() {
|
||||
appPath = strings.Replace(appPath, "\\", "/", -1)
|
||||
|
||||
// Determine and create .ssh path.
|
||||
SshPath = filepath.Join(homeDir(), ".ssh")
|
||||
if err = os.MkdirAll(SshPath, 0700); err != nil {
|
||||
log.Fatal(4, "fail to create SshPath(%s): %v\n", SshPath, err)
|
||||
SSHPath = filepath.Join(homeDir(), ".ssh")
|
||||
if err = os.MkdirAll(SSHPath, 0700); err != nil {
|
||||
log.Fatal(4, "fail to create '%s': %v", SSHPath, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,22 +91,103 @@ type PublicKey struct {
|
||||
HasUsed bool `xorm:"-"`
|
||||
}
|
||||
|
||||
// GetAuthorizedString generates and returns formatted public key string for authorized_keys file.
|
||||
func (key *PublicKey) GetAuthorizedString() string {
|
||||
return fmt.Sprintf(_TPL_PUBLICK_KEY, appPath, key.Id, key.Content)
|
||||
// OmitEmail returns content of public key but without e-mail address.
|
||||
func (k *PublicKey) OmitEmail() string {
|
||||
return strings.Join(strings.Split(k.Content, " ")[:2], " ")
|
||||
}
|
||||
|
||||
var (
|
||||
MinimumKeySize = map[string]int{
|
||||
"(ED25519)": 256,
|
||||
"(ECDSA)": 256,
|
||||
"(NTRU)": 1087,
|
||||
"(MCE)": 1702,
|
||||
"(McE)": 1702,
|
||||
"(RSA)": 2048,
|
||||
"(DSA)": 1024,
|
||||
// GetAuthorizedString generates and returns formatted public key string for authorized_keys file.
|
||||
func (key *PublicKey) GetAuthorizedString() string {
|
||||
return fmt.Sprintf(_TPL_PUBLICK_KEY, appPath, key.Id, setting.CustomConf, key.Content)
|
||||
}
|
||||
|
||||
var minimumKeySizes = map[string]int{
|
||||
"(ED25519)": 256,
|
||||
"(ECDSA)": 256,
|
||||
"(NTRU)": 1087,
|
||||
"(MCE)": 1702,
|
||||
"(McE)": 1702,
|
||||
"(RSA)": 2048,
|
||||
"(DSA)": 1024,
|
||||
}
|
||||
|
||||
func extractTypeFromBase64Key(key string) (string, error) {
|
||||
b, err := base64.StdEncoding.DecodeString(key)
|
||||
if err != nil || len(b) < 4 {
|
||||
return "", errors.New("Invalid key format")
|
||||
}
|
||||
)
|
||||
|
||||
keyLength := int(binary.BigEndian.Uint32(b))
|
||||
|
||||
if len(b) < 4+keyLength {
|
||||
return "", errors.New("Invalid key format")
|
||||
}
|
||||
|
||||
return string(b[4 : 4+keyLength]), nil
|
||||
}
|
||||
|
||||
// Parse any key string in openssh or ssh2 format to clean openssh string (rfc4253)
|
||||
func ParseKeyString(content string) (string, error) {
|
||||
// Transform all legal line endings to a single "\n"
|
||||
s := strings.Replace(strings.Replace(strings.TrimSpace(content), "\r\n", "\n", -1), "\r", "\n", -1)
|
||||
|
||||
lines := strings.Split(s, "\n")
|
||||
|
||||
var keyType, keyContent, keyComment string
|
||||
|
||||
if len(lines) == 1 {
|
||||
// Parse openssh format
|
||||
parts := strings.Fields(lines[0])
|
||||
switch len(parts) {
|
||||
case 0:
|
||||
return "", errors.New("Empty key")
|
||||
case 1:
|
||||
keyContent = parts[0]
|
||||
case 2:
|
||||
keyType = parts[0]
|
||||
keyContent = parts[1]
|
||||
default:
|
||||
keyType = parts[0]
|
||||
keyContent = parts[1]
|
||||
keyComment = parts[2]
|
||||
}
|
||||
|
||||
// If keyType is not given, extract it from content. If given, validate it
|
||||
if len(keyType) == 0 {
|
||||
if t, err := extractTypeFromBase64Key(keyContent); err == nil {
|
||||
keyType = t
|
||||
} else {
|
||||
return "", err
|
||||
}
|
||||
} else {
|
||||
if t, err := extractTypeFromBase64Key(keyContent); err != nil || keyType != t {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Parse SSH2 file format.
|
||||
continuationLine := false
|
||||
|
||||
for _, line := range lines {
|
||||
// Skip lines that:
|
||||
// 1) are a continuation of the previous line,
|
||||
// 2) contain ":" as that are comment lines
|
||||
// 3) contain "-" as that are begin and end tags
|
||||
if continuationLine || strings.ContainsAny(line, ":-") {
|
||||
continuationLine = strings.HasSuffix(line, "\\")
|
||||
} else {
|
||||
keyContent = keyContent + line
|
||||
}
|
||||
}
|
||||
|
||||
if t, err := extractTypeFromBase64Key(keyContent); err == nil {
|
||||
keyType = t
|
||||
} else {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
return keyType + " " + keyContent + " " + keyComment, nil
|
||||
}
|
||||
|
||||
// CheckPublicKeyString checks if the given public key string is recognized by SSH.
|
||||
func CheckPublicKeyString(content string) (bool, error) {
|
||||
@@ -143,48 +226,56 @@ func CheckPublicKeyString(content string) (bool, error) {
|
||||
}
|
||||
|
||||
// Check if key type and key size match.
|
||||
keySize := com.StrTo(sshKeygenOutput[0]).MustInt()
|
||||
if keySize == 0 {
|
||||
return false, errors.New("cannot get key size of the given key")
|
||||
}
|
||||
keyType := strings.TrimSpace(sshKeygenOutput[len(sshKeygenOutput)-1])
|
||||
if minimumKeySize := MinimumKeySize[keyType]; minimumKeySize == 0 {
|
||||
return false, errors.New("sorry, unrecognized public key type")
|
||||
} else if keySize < minimumKeySize {
|
||||
return false, fmt.Errorf("the minimum accepted size of a public key %s is %d", keyType, minimumKeySize)
|
||||
if !setting.Service.DisableMinimumKeySizeCheck {
|
||||
keySize := com.StrTo(sshKeygenOutput[0]).MustInt()
|
||||
if keySize == 0 {
|
||||
return false, errors.New("cannot get key size of the given key")
|
||||
}
|
||||
keyType := strings.TrimSpace(sshKeygenOutput[len(sshKeygenOutput)-1])
|
||||
if minimumKeySize := minimumKeySizes[keyType]; minimumKeySize == 0 {
|
||||
return false, errors.New("sorry, unrecognized public key type")
|
||||
} else if keySize < minimumKeySize {
|
||||
return false, fmt.Errorf("the minimum accepted size of a public key %s is %d", keyType, minimumKeySize)
|
||||
}
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// saveAuthorizedKeyFile writes SSH key content to authorized_keys file.
|
||||
func saveAuthorizedKeyFile(key *PublicKey) error {
|
||||
func saveAuthorizedKeyFile(keys ...*PublicKey) error {
|
||||
sshOpLocker.Lock()
|
||||
defer sshOpLocker.Unlock()
|
||||
|
||||
fpath := filepath.Join(SshPath, "authorized_keys")
|
||||
fpath := filepath.Join(SSHPath, "authorized_keys")
|
||||
f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
finfo, err := f.Stat()
|
||||
|
||||
fi, err := f.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// FIXME: following command does not support in Windows.
|
||||
if !setting.IsWindows {
|
||||
if finfo.Mode().Perm() > 0600 {
|
||||
log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", finfo.Mode().Perm().String())
|
||||
// .ssh directory should have mode 700, and authorized_keys file should have mode 600.
|
||||
if fi.Mode().Perm() > 0600 {
|
||||
log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String())
|
||||
if err = f.Chmod(0600); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_, err = f.WriteString(key.GetAuthorizedString())
|
||||
return err
|
||||
for _, key := range keys {
|
||||
if _, err = f.WriteString(key.GetAuthorizedString()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddPublicKey adds new public key to database and authorized_keys file.
|
||||
@@ -327,8 +418,8 @@ func DeletePublicKey(key *PublicKey) error {
|
||||
return err
|
||||
}
|
||||
|
||||
fpath := filepath.Join(SshPath, "authorized_keys")
|
||||
tmpPath := filepath.Join(SshPath, "authorized_keys.tmp")
|
||||
fpath := filepath.Join(SSHPath, "authorized_keys")
|
||||
tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp")
|
||||
if err = rewriteAuthorizedKeys(key, fpath, tmpPath); err != nil {
|
||||
return err
|
||||
} else if err = os.Remove(fpath); err != nil {
|
||||
@@ -336,3 +427,37 @@ func DeletePublicKey(key *PublicKey) error {
|
||||
}
|
||||
return os.Rename(tmpPath, fpath)
|
||||
}
|
||||
|
||||
// RewriteAllPublicKeys removes any authorized key and rewrite all keys from database again.
|
||||
func RewriteAllPublicKeys() error {
|
||||
sshOpLocker.Lock()
|
||||
defer sshOpLocker.Unlock()
|
||||
|
||||
tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp")
|
||||
f, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer os.Remove(tmpPath)
|
||||
|
||||
err = x.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) {
|
||||
_, err = f.WriteString((bean.(*PublicKey)).GetAuthorizedString())
|
||||
return err
|
||||
})
|
||||
f.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fpath := filepath.Join(SSHPath, "authorized_keys")
|
||||
if com.IsExist(fpath) {
|
||||
if err = os.Remove(fpath); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err = os.Rename(tmpPath, fpath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
1322
models/repo.go
1322
models/repo.go
File diff suppressed because it is too large
Load Diff
508
models/user.go
508
models/user.go
@@ -5,18 +5,23 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"container/list"
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/jpeg"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/nfnt/resize"
|
||||
|
||||
"github.com/gogits/gogs/modules/avatar"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/git"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
@@ -31,12 +36,10 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrUserOwnRepos = errors.New("User still have ownership of repositories")
|
||||
ErrUserHasOrgs = errors.New("User still have membership of organization")
|
||||
ErrUserAlreadyExist = errors.New("User already exist")
|
||||
ErrUserNotExist = errors.New("User does not exist")
|
||||
ErrUserNotKeyOwner = errors.New("User does not the owner of public key")
|
||||
ErrEmailAlreadyUsed = errors.New("E-mail already used")
|
||||
ErrEmailNotExist = errors.New("E-mail does not exist")
|
||||
ErrEmailNotActivated = errors.New("E-mail address has not been activated")
|
||||
ErrUserNameIllegal = errors.New("User name contains illegal characters")
|
||||
ErrLoginSourceNotExist = errors.New("Login source does not exist")
|
||||
ErrLoginSourceNotActived = errors.New("Login source is not actived")
|
||||
@@ -45,33 +48,41 @@ var (
|
||||
|
||||
// User represents the object of individual and member of organization.
|
||||
type User struct {
|
||||
Id int64
|
||||
LowerName string `xorm:"UNIQUE NOT NULL"`
|
||||
Name string `xorm:"UNIQUE NOT NULL"`
|
||||
FullName string
|
||||
Email string `xorm:"UNIQUE NOT NULL"`
|
||||
Passwd string `xorm:"NOT NULL"`
|
||||
LoginType LoginType
|
||||
LoginSource int64 `xorm:"NOT NULL DEFAULT 0"`
|
||||
LoginName string
|
||||
Type UserType
|
||||
Orgs []*User `xorm:"-"`
|
||||
Repos []*Repository `xorm:"-"`
|
||||
Id int64
|
||||
LowerName string `xorm:"UNIQUE NOT NULL"`
|
||||
Name string `xorm:"UNIQUE NOT NULL"`
|
||||
FullName string
|
||||
// Email is the primary email address (to be used for communication).
|
||||
Email string `xorm:"UNIQUE(s) NOT NULL"`
|
||||
Passwd string `xorm:"NOT NULL"`
|
||||
LoginType LoginType
|
||||
LoginSource int64 `xorm:"NOT NULL DEFAULT 0"`
|
||||
LoginName string
|
||||
Type UserType `xorm:"UNIQUE(s)"`
|
||||
Orgs []*User `xorm:"-"`
|
||||
Repos []*Repository `xorm:"-"`
|
||||
Location string
|
||||
Website string
|
||||
Rands string `xorm:"VARCHAR(10)"`
|
||||
Salt string `xorm:"VARCHAR(10)"`
|
||||
Created time.Time `xorm:"CREATED"`
|
||||
Updated time.Time `xorm:"UPDATED"`
|
||||
|
||||
// Permissions.
|
||||
IsActive bool
|
||||
IsAdmin bool
|
||||
AllowGitHook bool
|
||||
|
||||
// Avatar.
|
||||
Avatar string `xorm:"VARCHAR(2048) NOT NULL"`
|
||||
AvatarEmail string `xorm:"NOT NULL"`
|
||||
UseCustomAvatar bool
|
||||
|
||||
// Counters.
|
||||
NumFollowers int
|
||||
NumFollowings int
|
||||
NumStars int
|
||||
NumRepos int
|
||||
Avatar string `xorm:"VARCHAR(2048) NOT NULL"`
|
||||
AvatarEmail string `xorm:"NOT NULL"`
|
||||
Location string
|
||||
Website string
|
||||
IsActive bool
|
||||
IsAdmin bool
|
||||
AllowGitHook bool
|
||||
Rands string `xorm:"VARCHAR(10)"`
|
||||
Salt string `xorm:"VARCHAR(10)"`
|
||||
Created time.Time `xorm:"CREATED"`
|
||||
Updated time.Time `xorm:"UPDATED"`
|
||||
|
||||
// For organization.
|
||||
Description string
|
||||
@@ -81,6 +92,16 @@ type User struct {
|
||||
Members []*User `xorm:"-"`
|
||||
}
|
||||
|
||||
// EmailAdresses is the list of all email addresses of a user. Can contain the
|
||||
// primary email address, but is not obligatory
|
||||
type EmailAddress struct {
|
||||
Id int64
|
||||
Uid int64 `xorm:"INDEX NOT NULL"`
|
||||
Email string `xorm:"UNIQUE NOT NULL"`
|
||||
IsActivated bool
|
||||
IsPrimary bool `xorm:"-"`
|
||||
}
|
||||
|
||||
// DashboardLink returns the user dashboard page link.
|
||||
func (u *User) DashboardLink() string {
|
||||
if u.IsOrganization() {
|
||||
@@ -96,9 +117,12 @@ func (u *User) HomeLink() string {
|
||||
|
||||
// AvatarLink returns user gravatar link.
|
||||
func (u *User) AvatarLink() string {
|
||||
if setting.DisableGravatar {
|
||||
switch {
|
||||
case u.UseCustomAvatar:
|
||||
return setting.AppSubUrl + "/avatars/" + com.ToStr(u.Id)
|
||||
case setting.DisableGravatar, setting.OfflineMode:
|
||||
return setting.AppSubUrl + "/img/avatar_default.jpg"
|
||||
} else if setting.Service.EnableCacheAvatar {
|
||||
case setting.Service.EnableCacheAvatar:
|
||||
return setting.AppSubUrl + "/avatar/" + u.Avatar
|
||||
}
|
||||
return setting.GravatarSource + u.Avatar
|
||||
@@ -119,13 +143,55 @@ func (u *User) EncodePasswd() {
|
||||
u.Passwd = fmt.Sprintf("%x", newPasswd)
|
||||
}
|
||||
|
||||
// ValidtePassword checks if given password matches the one belongs to the user.
|
||||
func (u *User) ValidtePassword(passwd string) bool {
|
||||
// ValidatePassword checks if given password matches the one belongs to the user.
|
||||
func (u *User) ValidatePassword(passwd string) bool {
|
||||
newUser := &User{Passwd: passwd, Salt: u.Salt}
|
||||
newUser.EncodePasswd()
|
||||
return u.Passwd == newUser.Passwd
|
||||
}
|
||||
|
||||
// CustomAvatarPath returns user custom avatar file path.
|
||||
func (u *User) CustomAvatarPath() string {
|
||||
return filepath.Join(setting.AvatarUploadPath, com.ToStr(u.Id))
|
||||
}
|
||||
|
||||
// UploadAvatar saves custom avatar for user.
|
||||
// FIXME: split uploads to different subdirs in case we have massive users.
|
||||
func (u *User) UploadAvatar(data []byte) error {
|
||||
u.UseCustomAvatar = true
|
||||
|
||||
img, _, err := image.Decode(bytes.NewReader(data))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
m := resize.Resize(200, 200, img, resize.NearestNeighbor)
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Id(u.Id).AllCols().Update(u); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
os.MkdirAll(setting.AvatarUploadPath, os.ModePerm)
|
||||
fw, err := os.Create(u.CustomAvatarPath())
|
||||
if err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
defer fw.Close()
|
||||
if err = jpeg.Encode(fw, m, nil); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
||||
// IsOrganization returns true if user is actually a organization.
|
||||
func (u *User) IsOrganization() bool {
|
||||
return u.Type == ORGANIZATION
|
||||
@@ -161,7 +227,7 @@ func (u *User) GetOrganizations() error {
|
||||
|
||||
u.Orgs = make([]*User, len(ous))
|
||||
for i, ou := range ous {
|
||||
u.Orgs[i], err = GetUserById(ou.OrgId)
|
||||
u.Orgs[i], err = GetUserById(ou.OrgID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -179,11 +245,13 @@ func (u *User) GetFullNameFallback() string {
|
||||
|
||||
// IsUserExist checks if given user name exist,
|
||||
// the user name should be noncased unique.
|
||||
func IsUserExist(name string) (bool, error) {
|
||||
// If uid is presented, then check will rule out that one,
|
||||
// it is used when update a user name in settings page.
|
||||
func IsUserExist(uid int64, name string) (bool, error) {
|
||||
if len(name) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
return x.Get(&User{LowerName: strings.ToLower(name)})
|
||||
return x.Where("id!=?", uid).Get(&User{LowerName: strings.ToLower(name)})
|
||||
}
|
||||
|
||||
// IsEmailUsed returns true if the e-mail has been used.
|
||||
@@ -191,6 +259,9 @@ func IsEmailUsed(email string) (bool, error) {
|
||||
if len(email) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
if has, err := x.Get(&EmailAddress{Email: email}); has || err != nil {
|
||||
return has, err
|
||||
}
|
||||
return x.Get(&User{Email: email})
|
||||
}
|
||||
|
||||
@@ -200,28 +271,28 @@ func GetUserSalt() string {
|
||||
}
|
||||
|
||||
// CreateUser creates record of a new user.
|
||||
func CreateUser(u *User) error {
|
||||
if !IsLegalName(u.Name) {
|
||||
return ErrUserNameIllegal
|
||||
func CreateUser(u *User) (err error) {
|
||||
if err = IsUsableName(u.Name); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
isExist, err := IsUserExist(u.Name)
|
||||
isExist, err := IsUserExist(0, u.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if isExist {
|
||||
return ErrUserAlreadyExist
|
||||
return ErrUserAlreadyExist{u.Name}
|
||||
}
|
||||
|
||||
isExist, err = IsEmailUsed(u.Email)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if isExist {
|
||||
return ErrEmailAlreadyUsed
|
||||
return ErrEmailAlreadyUsed{u.Email}
|
||||
}
|
||||
|
||||
u.LowerName = strings.ToLower(u.Name)
|
||||
u.Avatar = base.EncodeMd5(u.Email)
|
||||
u.AvatarEmail = u.Email
|
||||
u.Avatar = avatar.HashEmail(u.AvatarEmail)
|
||||
u.Rands = GetUserSalt()
|
||||
u.Salt = GetUserSalt()
|
||||
u.EncodePasswd()
|
||||
@@ -298,69 +369,50 @@ func VerifyUserActiveCode(code string) (user *User) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ChangeUserName changes all corresponding setting from old user name to new one.
|
||||
func ChangeUserName(u *User, newUserName string) (err error) {
|
||||
if !IsLegalName(newUserName) {
|
||||
return ErrUserNameIllegal
|
||||
}
|
||||
// verify active code when active account
|
||||
func VerifyActiveEmailCode(code, email string) *EmailAddress {
|
||||
minutes := setting.Service.ActiveCodeLives
|
||||
|
||||
newUserName = strings.ToLower(newUserName)
|
||||
if user := getVerifyUser(code); user != nil {
|
||||
// time limit code
|
||||
prefix := code[:base.TimeLimitCodeLength]
|
||||
data := com.ToStr(user.Id) + email + user.LowerName + user.Passwd + user.Rands
|
||||
|
||||
// Update accesses of user.
|
||||
accesses := make([]Access, 0, 10)
|
||||
if err = x.Find(&accesses, &Access{UserName: u.LowerName}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i := range accesses {
|
||||
accesses[i].UserName = newUserName
|
||||
if strings.HasPrefix(accesses[i].RepoName, u.LowerName+"/") {
|
||||
accesses[i].RepoName = strings.Replace(accesses[i].RepoName, u.LowerName, newUserName, 1)
|
||||
}
|
||||
if err = UpdateAccessWithSession(sess, &accesses[i]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
repos, err := GetRepositories(u.Id, true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := range repos {
|
||||
accesses = make([]Access, 0, 10)
|
||||
// Update accesses of user repository.
|
||||
if err = x.Find(&accesses, &Access{RepoName: u.LowerName + "/" + repos[i].LowerName}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for j := range accesses {
|
||||
// if the access is not the user's access (already updated above)
|
||||
if accesses[j].UserName != u.LowerName {
|
||||
accesses[j].RepoName = newUserName + "/" + repos[i].LowerName
|
||||
if err = UpdateAccessWithSession(sess, &accesses[j]); err != nil {
|
||||
return err
|
||||
}
|
||||
if base.VerifyTimeLimitCode(data, minutes, prefix) {
|
||||
emailAddress := &EmailAddress{Email: email}
|
||||
if has, _ := x.Get(emailAddress); has {
|
||||
return emailAddress
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Change user directory name.
|
||||
if err = os.Rename(UserPath(u.LowerName), UserPath(newUserName)); err != nil {
|
||||
sess.Rollback()
|
||||
// ChangeUserName changes all corresponding setting from old user name to new one.
|
||||
func ChangeUserName(u *User, newUserName string) (err error) {
|
||||
if err = IsUsableName(newUserName); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
isExist, err := IsUserExist(0, newUserName)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if isExist {
|
||||
return ErrUserAlreadyExist{newUserName}
|
||||
}
|
||||
|
||||
return os.Rename(UserPath(u.LowerName), UserPath(newUserName))
|
||||
}
|
||||
|
||||
// UpdateUser updates user's information.
|
||||
func UpdateUser(u *User) error {
|
||||
has, err := x.Where("id!=?", u.Id).And("type=?", u.Type).And("email=?", u.Email).Get(new(User))
|
||||
if err != nil {
|
||||
return err
|
||||
} else if has {
|
||||
return ErrEmailAlreadyUsed{u.Email}
|
||||
}
|
||||
|
||||
u.LowerName = strings.ToLower(u.Name)
|
||||
|
||||
if len(u.Location) > 255 {
|
||||
@@ -373,55 +425,85 @@ func UpdateUser(u *User) error {
|
||||
u.Description = u.Description[:255]
|
||||
}
|
||||
|
||||
_, err := x.Id(u.Id).AllCols().Update(u)
|
||||
if u.AvatarEmail == "" {
|
||||
u.AvatarEmail = u.Email
|
||||
}
|
||||
u.Avatar = avatar.HashEmail(u.AvatarEmail)
|
||||
|
||||
u.FullName = base.Sanitizer.Sanitize(u.FullName)
|
||||
_, err = x.Id(u.Id).AllCols().Update(u)
|
||||
return err
|
||||
}
|
||||
|
||||
// DeleteBeans deletes all given beans, beans should contain delete conditions.
|
||||
func DeleteBeans(e Engine, beans ...interface{}) (err error) {
|
||||
for i := range beans {
|
||||
if _, err = e.Delete(beans[i]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// FIXME: need some kind of mechanism to record failure. HINT: system notice
|
||||
// DeleteUser completely and permanently deletes everything of user.
|
||||
func DeleteUser(u *User) error {
|
||||
// Check ownership of repository.
|
||||
count, err := GetRepositoryCount(u)
|
||||
if err != nil {
|
||||
return errors.New("GetRepositoryCount: " + err.Error())
|
||||
return fmt.Errorf("GetRepositoryCount: %v", err)
|
||||
} else if count > 0 {
|
||||
return ErrUserOwnRepos
|
||||
return ErrUserOwnRepos{UID: u.Id}
|
||||
}
|
||||
|
||||
// Check membership of organization.
|
||||
count, err = u.GetOrganizationCount()
|
||||
if err != nil {
|
||||
return errors.New("GetOrganizationCount: " + err.Error())
|
||||
return fmt.Errorf("GetOrganizationCount: %v", err)
|
||||
} else if count > 0 {
|
||||
return ErrUserHasOrgs
|
||||
return ErrUserHasOrgs{UID: u.Id}
|
||||
}
|
||||
|
||||
// Get watches before session.
|
||||
watches := make([]*Watch, 0, 10)
|
||||
if err = x.Where("user_id=?", u.Id).Find(&watches); err != nil {
|
||||
return fmt.Errorf("get all watches: %v", err)
|
||||
}
|
||||
repoIDs := make([]int64, 0, len(watches))
|
||||
for i := range watches {
|
||||
repoIDs = append(repoIDs, watches[i].RepoID)
|
||||
}
|
||||
|
||||
// FIXME: check issues, other repos' commits
|
||||
// FIXME: roll backable in some point.
|
||||
|
||||
// Delete all followers.
|
||||
if _, err = x.Delete(&Follow{FollowId: u.Id}); err != nil {
|
||||
sess := x.NewSession()
|
||||
defer sessionRelease(sess)
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
// Delete oauth2.
|
||||
if _, err = x.Delete(&Oauth2{Uid: u.Id}); err != nil {
|
||||
|
||||
if err = DeleteBeans(sess,
|
||||
&Follow{FollowID: u.Id},
|
||||
&Oauth2{Uid: u.Id},
|
||||
&Action{UserID: u.Id},
|
||||
&Access{UserID: u.Id},
|
||||
&Collaboration{UserID: u.Id},
|
||||
&EmailAddress{Uid: u.Id},
|
||||
&Watch{UserID: u.Id},
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
// Delete all feeds.
|
||||
if _, err = x.Delete(&Action{UserId: u.Id}); err != nil {
|
||||
return err
|
||||
}
|
||||
// Delete all watches.
|
||||
if _, err = x.Delete(&Watch{UserId: u.Id}); err != nil {
|
||||
return err
|
||||
}
|
||||
// Delete all accesses.
|
||||
if _, err = x.Delete(&Access{UserName: u.LowerName}); err != nil {
|
||||
return err
|
||||
|
||||
// Decrease all watch numbers.
|
||||
for i := range repoIDs {
|
||||
if _, err = sess.Exec("UPDATE `repository` SET num_watches=num_watches-1 WHERE id=?", repoIDs[i]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Delete all SSH keys.
|
||||
keys := make([]*PublicKey, 0, 10)
|
||||
if err = x.Find(&keys, &PublicKey{OwnerId: u.Id}); err != nil {
|
||||
if err = sess.Find(&keys, &PublicKey{OwnerId: u.Id}); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, key := range keys {
|
||||
@@ -430,18 +512,24 @@ func DeleteUser(u *User) error {
|
||||
}
|
||||
}
|
||||
|
||||
if _, err = sess.Delete(u); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete user directory.
|
||||
if err = os.RemoveAll(UserPath(u.Name)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = x.Delete(u)
|
||||
return err
|
||||
return sess.Commit()
|
||||
}
|
||||
|
||||
// DeleteInactivateUsers deletes all inactivate users.
|
||||
// DeleteInactivateUsers deletes all inactivate users and email addresses.
|
||||
func DeleteInactivateUsers() error {
|
||||
_, err := x.Where("is_active=?", false).Delete(new(User))
|
||||
if err == nil {
|
||||
_, err = x.Where("is_activated=?", false).Delete(new(EmailAddress))
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -452,8 +540,7 @@ func UserPath(userName string) string {
|
||||
|
||||
func GetUserByKeyId(keyId int64) (*User, error) {
|
||||
user := new(User)
|
||||
rawSql := "SELECT a.* FROM `user` AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?"
|
||||
has, err := x.Sql(rawSql, keyId).Get(user)
|
||||
has, err := x.Sql("SELECT a.* FROM `user` AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?", keyId).Get(user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
@@ -462,10 +549,9 @@ func GetUserByKeyId(keyId int64) (*User, error) {
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// GetUserById returns the user object by given ID if exists.
|
||||
func GetUserById(id int64) (*User, error) {
|
||||
func getUserById(e Engine, id int64) (*User, error) {
|
||||
u := new(User)
|
||||
has, err := x.Id(id).Get(u)
|
||||
has, err := e.Id(id).Get(u)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
@@ -474,6 +560,11 @@ func GetUserById(id int64) (*User, error) {
|
||||
return u, nil
|
||||
}
|
||||
|
||||
// GetUserById returns the user object by given ID if exists.
|
||||
func GetUserById(id int64) (*User, error) {
|
||||
return getUserById(x, id)
|
||||
}
|
||||
|
||||
// GetUserByName returns user by given name.
|
||||
func GetUserByName(name string) (*User, error) {
|
||||
if len(name) == 0 {
|
||||
@@ -515,43 +606,154 @@ func GetUserIdsByNames(names []string) []int64 {
|
||||
return ids
|
||||
}
|
||||
|
||||
// UserCommit represtns a commit with validation of user.
|
||||
// GetEmailAddresses returns all e-mail addresses belongs to given user.
|
||||
func GetEmailAddresses(uid int64) ([]*EmailAddress, error) {
|
||||
emails := make([]*EmailAddress, 0, 5)
|
||||
err := x.Where("uid=?", uid).Find(&emails)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
u, err := GetUserById(uid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
isPrimaryFound := false
|
||||
for _, email := range emails {
|
||||
if email.Email == u.Email {
|
||||
isPrimaryFound = true
|
||||
email.IsPrimary = true
|
||||
} else {
|
||||
email.IsPrimary = false
|
||||
}
|
||||
}
|
||||
|
||||
// We alway want the primary email address displayed, even if it's not in
|
||||
// the emailaddress table (yet)
|
||||
if !isPrimaryFound {
|
||||
emails = append(emails, &EmailAddress{
|
||||
Email: u.Email,
|
||||
IsActivated: true,
|
||||
IsPrimary: true,
|
||||
})
|
||||
}
|
||||
return emails, nil
|
||||
}
|
||||
|
||||
func AddEmailAddress(email *EmailAddress) error {
|
||||
used, err := IsEmailUsed(email.Email)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if used {
|
||||
return ErrEmailAlreadyUsed{email.Email}
|
||||
}
|
||||
|
||||
_, err = x.Insert(email)
|
||||
return err
|
||||
}
|
||||
|
||||
func (email *EmailAddress) Activate() error {
|
||||
email.IsActivated = true
|
||||
if _, err := x.Id(email.Id).AllCols().Update(email); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if user, err := GetUserById(email.Uid); err != nil {
|
||||
return err
|
||||
} else {
|
||||
user.Rands = GetUserSalt()
|
||||
return UpdateUser(user)
|
||||
}
|
||||
}
|
||||
|
||||
func DeleteEmailAddress(email *EmailAddress) error {
|
||||
has, err := x.Get(email)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !has {
|
||||
return ErrEmailNotExist
|
||||
}
|
||||
|
||||
if _, err = x.Delete(email); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func MakeEmailPrimary(email *EmailAddress) error {
|
||||
has, err := x.Get(email)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !has {
|
||||
return ErrEmailNotExist
|
||||
}
|
||||
|
||||
if !email.IsActivated {
|
||||
return ErrEmailNotActivated
|
||||
}
|
||||
|
||||
user := &User{Id: email.Uid}
|
||||
has, err = x.Get(user)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !has {
|
||||
return ErrUserNotExist
|
||||
}
|
||||
|
||||
// Make sure the former primary email doesn't disappear
|
||||
former_primary_email := &EmailAddress{Email: user.Email}
|
||||
has, err = x.Get(former_primary_email)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !has {
|
||||
former_primary_email.Uid = user.Id
|
||||
former_primary_email.IsActivated = user.IsActive
|
||||
x.Insert(former_primary_email)
|
||||
}
|
||||
|
||||
user.Email = email.Email
|
||||
_, err = x.Id(user.Id).AllCols().Update(user)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// UserCommit represents a commit with validation of user.
|
||||
type UserCommit struct {
|
||||
UserName string
|
||||
User *User
|
||||
*git.Commit
|
||||
}
|
||||
|
||||
// ValidateCommitWithEmail chceck if author's e-mail of commit is corresponsind to a user.
|
||||
func ValidateCommitWithEmail(c *git.Commit) (uname string) {
|
||||
func ValidateCommitWithEmail(c *git.Commit) *User {
|
||||
u, err := GetUserByEmail(c.Author.Email)
|
||||
if err == nil {
|
||||
uname = u.Name
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return uname
|
||||
return u
|
||||
}
|
||||
|
||||
// ValidateCommitsWithEmails checks if authors' e-mails of commits are corresponding to users.
|
||||
func ValidateCommitsWithEmails(oldCommits *list.List) *list.List {
|
||||
emails := map[string]string{}
|
||||
emails := map[string]*User{}
|
||||
newCommits := list.New()
|
||||
e := oldCommits.Front()
|
||||
for e != nil {
|
||||
c := e.Value.(*git.Commit)
|
||||
|
||||
uname := ""
|
||||
var u *User
|
||||
if v, ok := emails[c.Author.Email]; !ok {
|
||||
u, err := GetUserByEmail(c.Author.Email)
|
||||
if err == nil {
|
||||
uname = u.Name
|
||||
}
|
||||
emails[c.Author.Email] = uname
|
||||
u, _ = GetUserByEmail(c.Author.Email)
|
||||
emails[c.Author.Email] = u
|
||||
} else {
|
||||
uname = v
|
||||
u = v
|
||||
}
|
||||
|
||||
newCommits.PushBack(UserCommit{
|
||||
UserName: uname,
|
||||
Commit: c,
|
||||
User: u,
|
||||
Commit: c,
|
||||
})
|
||||
e = e.Next()
|
||||
}
|
||||
@@ -563,19 +765,31 @@ func GetUserByEmail(email string) (*User, error) {
|
||||
if len(email) == 0 {
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
// First try to find the user by primary email
|
||||
user := &User{Email: strings.ToLower(email)}
|
||||
has, err := x.Get(user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
return user, nil
|
||||
if has {
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// Otherwise, check in alternative list for activated email addresses
|
||||
emailAddress := &EmailAddress{Email: strings.ToLower(email), IsActivated: true}
|
||||
has, err = x.Get(emailAddress)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if has {
|
||||
return GetUserById(emailAddress.Uid)
|
||||
}
|
||||
|
||||
return nil, ErrUserNotExist
|
||||
}
|
||||
|
||||
// SearchUserByName returns given number of users whose name contains keyword.
|
||||
func SearchUserByName(opt SearchOption) (us []*User, err error) {
|
||||
opt.Keyword = FilterSQLInject(opt.Keyword)
|
||||
if len(opt.Keyword) == 0 {
|
||||
return us, nil
|
||||
}
|
||||
@@ -586,11 +800,11 @@ func SearchUserByName(opt SearchOption) (us []*User, err error) {
|
||||
return us, err
|
||||
}
|
||||
|
||||
// Follow is connection request for receiving user notifycation.
|
||||
// Follow is connection request for receiving user notification.
|
||||
type Follow struct {
|
||||
Id int64
|
||||
UserId int64 `xorm:"unique(follow)"`
|
||||
FollowId int64 `xorm:"unique(follow)"`
|
||||
UserID int64 `xorm:"unique(follow)"`
|
||||
FollowID int64 `xorm:"unique(follow)"`
|
||||
}
|
||||
|
||||
// FollowUser marks someone be another's follower.
|
||||
@@ -599,7 +813,7 @@ func FollowUser(userId int64, followId int64) (err error) {
|
||||
defer sess.Close()
|
||||
sess.Begin()
|
||||
|
||||
if _, err = sess.Insert(&Follow{UserId: userId, FollowId: followId}); err != nil {
|
||||
if _, err = sess.Insert(&Follow{UserID: userId, FollowID: followId}); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
@@ -624,7 +838,7 @@ func UnFollowUser(userId int64, unFollowId int64) (err error) {
|
||||
defer session.Close()
|
||||
session.Begin()
|
||||
|
||||
if _, err = session.Delete(&Follow{UserId: userId, FollowId: unFollowId}); err != nil {
|
||||
if _, err = session.Delete(&Follow{UserID: userId, FollowID: unFollowId}); err != nil {
|
||||
session.Rollback()
|
||||
return err
|
||||
}
|
||||
@@ -672,7 +886,7 @@ func UpdateMentions(userNames []string, issueId int64) error {
|
||||
}
|
||||
|
||||
for _, orgUser := range orgUsers {
|
||||
tempIds = append(tempIds, orgUser.Id)
|
||||
tempIds = append(tempIds, orgUser.ID)
|
||||
}
|
||||
|
||||
ids = append(ids, tempIds...)
|
||||
|
||||
@@ -5,9 +5,11 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/gogits/gogs/modules/httplib"
|
||||
@@ -99,7 +101,7 @@ func (w *Webhook) UpdateEvent() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// HasPushEvent returns true if hook enbaled push event.
|
||||
// HasPushEvent returns true if hook enabled push event.
|
||||
func (w *Webhook) HasPushEvent() bool {
|
||||
if w.PushOnly {
|
||||
return true
|
||||
@@ -204,7 +206,7 @@ func IsValidHookTaskType(name string) bool {
|
||||
type HookEventType string
|
||||
|
||||
const (
|
||||
PUSH HookEventType = "push"
|
||||
HOOK_EVENT_PUSH HookEventType = "push"
|
||||
)
|
||||
|
||||
// FIXME: just use go-gogs-client structs maybe?
|
||||
@@ -258,7 +260,9 @@ func (p Payload) GetJSONPayload() ([]byte, error) {
|
||||
|
||||
// HookTask represents a hook task.
|
||||
type HookTask struct {
|
||||
Id int64
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
RepoID int64 `xorm:"INDEX"`
|
||||
HookID int64
|
||||
Uuid string
|
||||
Type HookTaskType
|
||||
Url string
|
||||
@@ -268,6 +272,7 @@ type HookTask struct {
|
||||
EventType HookEventType
|
||||
IsSsl bool
|
||||
IsDelivered bool
|
||||
Delivered int64
|
||||
IsSucceed bool
|
||||
}
|
||||
|
||||
@@ -286,86 +291,137 @@ func CreateHookTask(t *HookTask) error {
|
||||
|
||||
// UpdateHookTask updates information of hook task.
|
||||
func UpdateHookTask(t *HookTask) error {
|
||||
_, err := x.Id(t.Id).AllCols().Update(t)
|
||||
_, err := x.Id(t.ID).AllCols().Update(t)
|
||||
return err
|
||||
}
|
||||
|
||||
var (
|
||||
// Prevent duplicate deliveries.
|
||||
// This happens with massive hook tasks cannot finish delivering
|
||||
// before next shooting starts.
|
||||
isShooting = false
|
||||
)
|
||||
type hookQueue struct {
|
||||
// Make sure one repository only occur once in the queue.
|
||||
lock sync.Mutex
|
||||
repoIDs map[int64]bool
|
||||
|
||||
// DeliverHooks checks and delivers undelivered hooks.
|
||||
// FIXME: maybe can use goroutine to shoot a number of them at same time?
|
||||
func DeliverHooks() {
|
||||
if isShooting {
|
||||
queue chan int64
|
||||
}
|
||||
|
||||
func (q *hookQueue) removeRepoID(id int64) {
|
||||
q.lock.Lock()
|
||||
defer q.lock.Unlock()
|
||||
delete(q.repoIDs, id)
|
||||
}
|
||||
|
||||
func (q *hookQueue) addRepoID(id int64) {
|
||||
q.lock.Lock()
|
||||
if q.repoIDs[id] {
|
||||
q.lock.Unlock()
|
||||
return
|
||||
}
|
||||
isShooting = true
|
||||
defer func() { isShooting = false }()
|
||||
q.repoIDs[id] = true
|
||||
q.lock.Unlock()
|
||||
q.queue <- id
|
||||
}
|
||||
|
||||
tasks := make([]*HookTask, 0, 10)
|
||||
timeout := time.Duration(setting.WebhookDeliverTimeout) * time.Second
|
||||
x.Where("is_delivered=?", false).Iterate(new(HookTask),
|
||||
func(idx int, bean interface{}) error {
|
||||
t := bean.(*HookTask)
|
||||
req := httplib.Post(t.Url).SetTimeout(timeout, timeout).
|
||||
Header("X-Gogs-Delivery", t.Uuid).
|
||||
Header("X-Gogs-Event", string(t.EventType))
|
||||
// AddRepoID adds repository ID to hook delivery queue.
|
||||
func (q *hookQueue) AddRepoID(id int64) {
|
||||
go q.addRepoID(id)
|
||||
}
|
||||
|
||||
switch t.ContentType {
|
||||
case JSON:
|
||||
req = req.Header("Content-Type", "application/json").Body(t.PayloadContent)
|
||||
case FORM:
|
||||
req.Param("payload", t.PayloadContent)
|
||||
var HookQueue *hookQueue
|
||||
|
||||
func deliverHook(t *HookTask) {
|
||||
timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second
|
||||
req := httplib.Post(t.Url).SetTimeout(timeout, timeout).
|
||||
Header("X-Gogs-Delivery", t.Uuid).
|
||||
Header("X-Gogs-Event", string(t.EventType)).
|
||||
SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify})
|
||||
|
||||
switch t.ContentType {
|
||||
case JSON:
|
||||
req = req.Header("Content-Type", "application/json").Body(t.PayloadContent)
|
||||
case FORM:
|
||||
req.Param("payload", t.PayloadContent)
|
||||
}
|
||||
|
||||
t.IsDelivered = true
|
||||
|
||||
// FIXME: record response.
|
||||
switch t.Type {
|
||||
case GOGS:
|
||||
{
|
||||
if resp, err := req.Response(); err != nil {
|
||||
log.Error(5, "Delivery: %v", err)
|
||||
} else {
|
||||
resp.Body.Close()
|
||||
t.IsSucceed = true
|
||||
}
|
||||
|
||||
t.IsDelivered = true
|
||||
|
||||
// FIXME: record response.
|
||||
switch t.Type {
|
||||
case GOGS:
|
||||
{
|
||||
if _, err := req.Response(); err != nil {
|
||||
log.Error(4, "Delivery: %v", err)
|
||||
}
|
||||
case SLACK:
|
||||
{
|
||||
if resp, err := req.Response(); err != nil {
|
||||
log.Error(5, "Delivery: %v", err)
|
||||
} else {
|
||||
defer resp.Body.Close()
|
||||
contents, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Error(5, "%s", err)
|
||||
} else {
|
||||
if string(contents) != "ok" {
|
||||
log.Error(5, "slack failed with: %s", string(contents))
|
||||
} else {
|
||||
t.IsSucceed = true
|
||||
}
|
||||
}
|
||||
case SLACK:
|
||||
{
|
||||
if res, err := req.Response(); err != nil {
|
||||
log.Error(4, "Delivery: %v", err)
|
||||
} else {
|
||||
defer res.Body.Close()
|
||||
contents, err := ioutil.ReadAll(res.Body)
|
||||
if err != nil {
|
||||
log.Error(4, "%s", err)
|
||||
} else {
|
||||
if string(contents) != "ok" {
|
||||
log.Error(4, "slack failed with: %s", string(contents))
|
||||
} else {
|
||||
t.IsSucceed = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
t.Delivered = time.Now().UTC().UnixNano()
|
||||
if t.IsSucceed {
|
||||
log.Trace("Hook delivered(%s): %s", t.Uuid, t.PayloadContent)
|
||||
}
|
||||
}
|
||||
|
||||
// DeliverHooks checks and delivers undelivered hooks.
|
||||
func DeliverHooks() {
|
||||
tasks := make([]*HookTask, 0, 10)
|
||||
x.Where("is_delivered=?", false).Iterate(new(HookTask),
|
||||
func(idx int, bean interface{}) error {
|
||||
t := bean.(*HookTask)
|
||||
deliverHook(t)
|
||||
tasks = append(tasks, t)
|
||||
|
||||
if t.IsSucceed {
|
||||
log.Trace("Hook delivered(%s): %s", t.Uuid, t.PayloadContent)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
// Update hook task status.
|
||||
for _, t := range tasks {
|
||||
if err := UpdateHookTask(t); err != nil {
|
||||
log.Error(4, "UpdateHookTask(%d): %v", t.Id, err)
|
||||
log.Error(4, "UpdateHookTask(%d): %v", t.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
HookQueue = &hookQueue{
|
||||
lock: sync.Mutex{},
|
||||
repoIDs: make(map[int64]bool),
|
||||
queue: make(chan int64, setting.Webhook.QueueLength),
|
||||
}
|
||||
|
||||
// Start listening on new hook requests.
|
||||
for repoID := range HookQueue.queue {
|
||||
HookQueue.removeRepoID(repoID)
|
||||
|
||||
tasks = make([]*HookTask, 0, 5)
|
||||
if err := x.Where("repo_id=? AND is_delivered=?", repoID, false).Find(&tasks); err != nil {
|
||||
log.Error(4, "Get repository(%d) hook tasks: %v", repoID, err)
|
||||
continue
|
||||
}
|
||||
for _, t := range tasks {
|
||||
deliverHook(t)
|
||||
if err := UpdateHookTask(t); err != nil {
|
||||
log.Error(4, "UpdateHookTask(%d): %v", t.ID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func InitDeliverHooks() {
|
||||
go DeliverHooks()
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"reflect"
|
||||
"errors"
|
||||
)
|
||||
|
||||
type Packet struct {
|
||||
@@ -177,6 +178,10 @@ func readBytes(reader io.Reader, buf []byte) error {
|
||||
idx := 0
|
||||
buflen := len(buf)
|
||||
|
||||
if reader == nil {
|
||||
return errors.New("reader was nil, aborting")
|
||||
}
|
||||
|
||||
for idx < buflen {
|
||||
n, err := reader.Read(buf[idx:])
|
||||
if err != nil {
|
||||
@@ -256,11 +261,11 @@ func ReadPacket(reader io.Reader) (*Packet, error) {
|
||||
}
|
||||
|
||||
func DecodeString(data []byte) (ret string) {
|
||||
for _, c := range data {
|
||||
ret += fmt.Sprintf("%c", c)
|
||||
}
|
||||
// for _, c := range data {
|
||||
// ret += fmt.Sprintf("%c", c)
|
||||
// }
|
||||
|
||||
return
|
||||
return string(data)
|
||||
}
|
||||
|
||||
func DecodeInteger(data []byte) (ret uint64) {
|
||||
|
||||
@@ -11,15 +11,16 @@ import (
|
||||
)
|
||||
|
||||
type AdminEditUserForm struct {
|
||||
Email string `form:"email" binding:"Required;Email;MaxSize(50)"`
|
||||
Passwd string `form:"password"`
|
||||
Website string `form:"website" binding:"MaxSize(50)"`
|
||||
Location string `form:"location" binding:"MaxSize(50)"`
|
||||
Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"`
|
||||
Active bool `form:"active"`
|
||||
Admin bool `form:"admin"`
|
||||
AllowGitHook bool `form:"allow_git_hook"`
|
||||
LoginType int `form:"login_type"`
|
||||
FullName string `form:"fullname" binding:"MaxSize(100)"`
|
||||
Email string `binding:"Required;Email;MaxSize(50)"`
|
||||
Password string `binding:"OmitEmpty;MinSize(6);MaxSize(255)"`
|
||||
Website string `binding:"MaxSize(50)"`
|
||||
Location string `binding:"MaxSize(50)"`
|
||||
Avatar string `binding:"Required;Email;MaxSize(50)"`
|
||||
Active bool
|
||||
Admin bool
|
||||
AllowGitHook bool
|
||||
LoginType int
|
||||
}
|
||||
|
||||
func (f *AdminEditUserForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
)
|
||||
|
||||
type MarkdownForm struct {
|
||||
Text string `form:"text" binding:"Required"`
|
||||
Text string `form:"text"`
|
||||
Mode string `form:"mode"`
|
||||
Context string `form:"context"`
|
||||
}
|
||||
@@ -49,19 +49,19 @@ func validateApiReq(errs binding.Errors, data map[string]interface{}, f auth.For
|
||||
|
||||
if errs[0].FieldNames[0] == field.Name {
|
||||
switch errs[0].Classification {
|
||||
case binding.RequiredError:
|
||||
case binding.ERR_REQUIRED:
|
||||
data["ErrorMsg"] = fieldName + " cannot be empty"
|
||||
case binding.AlphaDashError:
|
||||
case binding.ERR_ALPHA_DASH:
|
||||
data["ErrorMsg"] = fieldName + " must be valid alpha or numeric or dash(-_) characters"
|
||||
case binding.AlphaDashDotError:
|
||||
case binding.ERR_ALPHA_DASH_DOT:
|
||||
data["ErrorMsg"] = fieldName + " must be valid alpha or numeric or dash(-_) or dot characters"
|
||||
case binding.MinSizeError:
|
||||
case binding.ERR_MIN_SIZE:
|
||||
data["ErrorMsg"] = fieldName + " must contain at least " + auth.GetMinSize(field) + " characters"
|
||||
case binding.MaxSizeError:
|
||||
case binding.ERR_MAX_SIZE:
|
||||
data["ErrorMsg"] = fieldName + " must contain at most " + auth.GetMaxSize(field) + " characters"
|
||||
case binding.EmailError:
|
||||
case binding.ERR_EMAIL:
|
||||
data["ErrorMsg"] = fieldName + " is not a valid e-mail address"
|
||||
case binding.UrlError:
|
||||
case binding.ERR_URL:
|
||||
data["ErrorMsg"] = fieldName + " is not a valid URL"
|
||||
default:
|
||||
data["ErrorMsg"] = "Unknown error: " + errs[0].Classification
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/Unknwon/macaron"
|
||||
"github.com/macaron-contrib/binding"
|
||||
"github.com/macaron-contrib/session"
|
||||
@@ -17,8 +18,13 @@ import (
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/uuid"
|
||||
)
|
||||
|
||||
func IsAPIPath(url string) bool {
|
||||
return strings.HasPrefix(url, "/api/")
|
||||
}
|
||||
|
||||
// SignedInId returns the id of signed in user.
|
||||
func SignedInId(req *http.Request, sess session.Store) int64 {
|
||||
if !models.HasEngine {
|
||||
@@ -26,7 +32,7 @@ func SignedInId(req *http.Request, sess session.Store) int64 {
|
||||
}
|
||||
|
||||
// API calls need to check access token.
|
||||
if strings.HasPrefix(req.URL.Path, "/api/") {
|
||||
if IsAPIPath(req.URL.Path) {
|
||||
auHead := req.Header.Get("Authorization")
|
||||
if len(auHead) > 0 {
|
||||
auths := strings.Fields(auHead)
|
||||
@@ -60,6 +66,7 @@ func SignedInId(req *http.Request, sess session.Store) int64 {
|
||||
}
|
||||
|
||||
// SignedInUser returns the user object of signed user.
|
||||
// It returns a bool value to indicate whether user uses basic auth or not.
|
||||
func SignedInUser(req *http.Request, sess session.Store) (*models.User, bool) {
|
||||
if !models.HasEngine {
|
||||
return nil, false
|
||||
@@ -75,8 +82,25 @@ func SignedInUser(req *http.Request, sess session.Store) (*models.User, bool) {
|
||||
if err != nil {
|
||||
if err != models.ErrUserNotExist {
|
||||
log.Error(4, "GetUserByName: %v", err)
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// Check if enabled auto-registration.
|
||||
if setting.Service.EnableReverseProxyAutoRegister {
|
||||
u := &models.User{
|
||||
Name: webAuthUser,
|
||||
Email: uuid.NewV4().String() + "@localhost",
|
||||
Passwd: webAuthUser,
|
||||
IsActive: true,
|
||||
}
|
||||
if err = models.CreateUser(u); err != nil {
|
||||
// FIXME: should I create a system notice?
|
||||
log.Error(4, "CreateUser: %v", err)
|
||||
return nil, false
|
||||
} else {
|
||||
return u, false
|
||||
}
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
return u, false
|
||||
}
|
||||
@@ -88,17 +112,16 @@ func SignedInUser(req *http.Request, sess session.Store) (*models.User, bool) {
|
||||
auths := strings.Fields(baHead)
|
||||
if len(auths) == 2 && auths[0] == "Basic" {
|
||||
uname, passwd, _ := base.BasicAuthDecode(auths[1])
|
||||
u, err := models.GetUserByName(uname)
|
||||
|
||||
u, err := models.UserSignIn(uname, passwd)
|
||||
if err != nil {
|
||||
if err != models.ErrUserNotExist {
|
||||
log.Error(4, "GetUserByName: %v", err)
|
||||
log.Error(4, "UserSignIn: %v", err)
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
|
||||
if u.ValidtePassword(passwd) {
|
||||
return u, true
|
||||
}
|
||||
return u, true
|
||||
}
|
||||
}
|
||||
return nil, false
|
||||
@@ -116,6 +139,10 @@ type Form interface {
|
||||
binding.Validator
|
||||
}
|
||||
|
||||
func init() {
|
||||
binding.SetNameMapper(com.ToSnakeCase)
|
||||
}
|
||||
|
||||
// AssignForm assign form values back to the template data.
|
||||
func AssignForm(form interface{}, data map[string]interface{}) {
|
||||
typ := reflect.TypeOf(form)
|
||||
@@ -133,6 +160,8 @@ func AssignForm(form interface{}, data map[string]interface{}) {
|
||||
// Allow ignored fields in the struct
|
||||
if fieldName == "-" {
|
||||
continue
|
||||
} else if len(fieldName) == 0 {
|
||||
fieldName = com.ToSnakeCase(field.Name)
|
||||
}
|
||||
|
||||
data[fieldName] = val.Field(i).Interface()
|
||||
@@ -142,12 +171,16 @@ func AssignForm(form interface{}, data map[string]interface{}) {
|
||||
func getSize(field reflect.StructField, prefix string) string {
|
||||
for _, rule := range strings.Split(field.Tag.Get("binding"), ";") {
|
||||
if strings.HasPrefix(rule, prefix) {
|
||||
return rule[8 : len(rule)-1]
|
||||
return rule[len(prefix) : len(rule)-1]
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func GetSize(field reflect.StructField) string {
|
||||
return getSize(field, "Size(")
|
||||
}
|
||||
|
||||
func GetMinSize(field reflect.StructField) string {
|
||||
return getSize(field, "MinSize(")
|
||||
}
|
||||
@@ -183,21 +216,30 @@ func validate(errs binding.Errors, data map[string]interface{}, f Form, l macaro
|
||||
|
||||
if errs[0].FieldNames[0] == field.Name {
|
||||
data["Err_"+field.Name] = true
|
||||
trName := l.Tr("form." + field.Name)
|
||||
|
||||
trName := field.Tag.Get("locale")
|
||||
if len(trName) == 0 {
|
||||
trName = l.Tr("form." + field.Name)
|
||||
} else {
|
||||
trName = l.Tr(trName)
|
||||
}
|
||||
|
||||
switch errs[0].Classification {
|
||||
case binding.RequiredError:
|
||||
case binding.ERR_REQUIRED:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.require_error")
|
||||
case binding.AlphaDashError:
|
||||
case binding.ERR_ALPHA_DASH:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_error")
|
||||
case binding.AlphaDashDotError:
|
||||
case binding.ERR_ALPHA_DASH_DOT:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_dot_error")
|
||||
case binding.MinSizeError:
|
||||
case binding.ERR_SIZE:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.size_error", GetSize(field))
|
||||
case binding.ERR_MIN_SIZE:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.min_size_error", GetMinSize(field))
|
||||
case binding.MaxSizeError:
|
||||
case binding.ERR_MAX_SIZE:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.max_size_error", GetMaxSize(field))
|
||||
case binding.EmailError:
|
||||
case binding.ERR_EMAIL:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.email_error")
|
||||
case binding.UrlError:
|
||||
case binding.ERR_URL:
|
||||
data["ErrorMsg"] = trName + l.Tr("form.url_error")
|
||||
default:
|
||||
data["ErrorMsg"] = l.Tr("form.unknown_error") + " " + errs[0].Classification
|
||||
|
||||
@@ -10,23 +10,27 @@ import (
|
||||
)
|
||||
|
||||
type AuthenticationForm struct {
|
||||
Id int64 `form:"id"`
|
||||
Type int `form:"type"`
|
||||
AuthName string `form:"name" binding:"Required;MaxSize(50)"`
|
||||
Domain string `form:"domain"`
|
||||
Host string `form:"host"`
|
||||
Port int `form:"port"`
|
||||
ID int64 `form:"id"`
|
||||
Type int
|
||||
Name string `binding:"Required;MaxSize(50)"`
|
||||
Domain string
|
||||
Host string
|
||||
Port int
|
||||
UseSSL bool `form:"usessl"`
|
||||
BaseDN string `form:"base_dn"`
|
||||
Attributes string `form:"attributes"`
|
||||
Filter string `form:"filter"`
|
||||
AttributeUsername string
|
||||
AttributeName string
|
||||
AttributeSurname string
|
||||
AttributeMail string
|
||||
Filter string
|
||||
MsAdSA string `form:"ms_ad_sa"`
|
||||
IsActived bool `form:"is_actived"`
|
||||
SmtpAuth string `form:"smtpauth"`
|
||||
SmtpHost string `form:"smtphost"`
|
||||
SmtpPort int `form:"smtpport"`
|
||||
Tls bool `form:"tls"`
|
||||
IsActived bool
|
||||
SMTPAuth string `form:"smtp_auth"`
|
||||
SMTPHost string `form:"smtp_host"`
|
||||
SMTPPort int `form:"smtp_port"`
|
||||
TLS bool `form:"tls"`
|
||||
AllowAutoRegister bool `form:"allowautoregister"`
|
||||
PAMServiceName string
|
||||
}
|
||||
|
||||
func (f *AuthenticationForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
|
||||
@@ -15,15 +15,18 @@ import (
|
||||
|
||||
// Basic LDAP authentication service
|
||||
type Ldapsource struct {
|
||||
Name string // canonical name (ie. corporate.ad)
|
||||
Host string // LDAP host
|
||||
Port int // port number
|
||||
UseSSL bool // Use SSL
|
||||
BaseDN string // Base DN
|
||||
Attributes string // Attribut to search
|
||||
Filter string // Query filter to validate entry
|
||||
MsAdSAFormat string // in the case of MS AD Simple Authen, the format to use (see: http://msdn.microsoft.com/en-us/library/cc223499.aspx)
|
||||
Enabled bool // if this source is disabled
|
||||
Name string // canonical name (ie. corporate.ad)
|
||||
Host string // LDAP host
|
||||
Port int // port number
|
||||
UseSSL bool // Use SSL
|
||||
BaseDN string // Base DN
|
||||
AttributeUsername string // Username attribute
|
||||
AttributeName string // First name attribute
|
||||
AttributeSurname string // Surname attribute
|
||||
AttributeMail string // E-mail attribute
|
||||
Filter string // Query filter to validate entry
|
||||
MsAdSAFormat string // in the case of MS AD Simple Authen, the format to use (see: http://msdn.microsoft.com/en-us/library/cc223499.aspx)
|
||||
Enabled bool // if this source is disabled
|
||||
}
|
||||
|
||||
//Global LDAP directory pool
|
||||
@@ -32,18 +35,18 @@ var (
|
||||
)
|
||||
|
||||
// Add a new source (LDAP directory) to the global pool
|
||||
func AddSource(name string, host string, port int, usessl bool, basedn string, attributes string, filter string, msadsaformat string) {
|
||||
ldaphost := Ldapsource{name, host, port, usessl, basedn, attributes, filter, msadsaformat, true}
|
||||
func AddSource(name string, host string, port int, usessl bool, basedn string, attribcn string, attribname string, attribsn string, attribmail string, filter string, msadsaformat string) {
|
||||
ldaphost := Ldapsource{name, host, port, usessl, basedn, attribcn, attribname, attribsn, attribmail, filter, msadsaformat, true}
|
||||
Authensource = append(Authensource, ldaphost)
|
||||
}
|
||||
|
||||
//LoginUser : try to login an user to LDAP sources, return requested (attribut,true) if ok, ("",false) other wise
|
||||
//LoginUser : try to login an user to LDAP sources, return requested (attribute,true) if ok, ("",false) other wise
|
||||
//First match wins
|
||||
//Returns first attribute if exists
|
||||
func LoginUser(name, passwd string) (a string, r bool) {
|
||||
func LoginUser(name, passwd string) (cn, fn, sn, mail string, r bool) {
|
||||
r = false
|
||||
for _, ls := range Authensource {
|
||||
a, r = ls.SearchEntry(name, passwd)
|
||||
cn, fn, sn, mail, r = ls.SearchEntry(name, passwd)
|
||||
if r {
|
||||
return
|
||||
}
|
||||
@@ -52,12 +55,12 @@ func LoginUser(name, passwd string) (a string, r bool) {
|
||||
}
|
||||
|
||||
// searchEntry : search an LDAP source if an entry (name, passwd) is valide and in the specific filter
|
||||
func (ls Ldapsource) SearchEntry(name, passwd string) (string, bool) {
|
||||
func (ls Ldapsource) SearchEntry(name, passwd string) (string, string, string, string, bool) {
|
||||
l, err := ldapDial(ls)
|
||||
if err != nil {
|
||||
log.Error(4, "LDAP Connect error, %s:%v", ls.Host, err)
|
||||
ls.Enabled = false
|
||||
return "", false
|
||||
return "", "", "", "", false
|
||||
}
|
||||
defer l.Close()
|
||||
|
||||
@@ -65,26 +68,29 @@ func (ls Ldapsource) SearchEntry(name, passwd string) (string, bool) {
|
||||
err = l.Bind(nx, passwd)
|
||||
if err != nil {
|
||||
log.Debug("LDAP Authan failed for %s, reason: %s", nx, err.Error())
|
||||
return "", false
|
||||
return "", "", "", "", false
|
||||
}
|
||||
|
||||
search := ldap.NewSearchRequest(
|
||||
ls.BaseDN,
|
||||
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
|
||||
fmt.Sprintf(ls.Filter, name),
|
||||
[]string{ls.Attributes},
|
||||
[]string{ls.AttributeUsername, ls.AttributeName, ls.AttributeSurname, ls.AttributeMail},
|
||||
nil)
|
||||
sr, err := l.Search(search)
|
||||
if err != nil {
|
||||
log.Debug("LDAP Authen OK but not in filter %s", name)
|
||||
return "", false
|
||||
return "", "", "", "", false
|
||||
}
|
||||
log.Debug("LDAP Authen OK: %s", name)
|
||||
if len(sr.Entries) > 0 {
|
||||
r := sr.Entries[0].GetAttributeValue(ls.Attributes)
|
||||
return r, true
|
||||
cn := sr.Entries[0].GetAttributeValue(ls.AttributeUsername)
|
||||
name := sr.Entries[0].GetAttributeValue(ls.AttributeName)
|
||||
sn := sr.Entries[0].GetAttributeValue(ls.AttributeSurname)
|
||||
mail := sr.Entries[0].GetAttributeValue(ls.AttributeMail)
|
||||
return cn, name, sn, mail, true
|
||||
}
|
||||
return "", true
|
||||
return "", "", "", "", true
|
||||
}
|
||||
|
||||
func ldapDial(ls Ldapsource) (*ldap.Conn, error) {
|
||||
|
||||
35
modules/auth/pam/pam.go
Normal file
35
modules/auth/pam/pam.go
Normal file
@@ -0,0 +1,35 @@
|
||||
// +build pam
|
||||
|
||||
// Copyright 2014 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 pam
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/msteinert/pam"
|
||||
)
|
||||
|
||||
func PAMAuth(serviceName, userName, passwd string) error {
|
||||
t, err := pam.StartFunc(serviceName, userName, func(s pam.Style, msg string) (string, error) {
|
||||
switch s {
|
||||
case pam.PromptEchoOff:
|
||||
return passwd, nil
|
||||
case pam.PromptEchoOn, pam.ErrorMsg, pam.TextInfo:
|
||||
return "", nil
|
||||
}
|
||||
return "", errors.New("Unrecognized PAM message style")
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = t.Authenticate(0); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
15
modules/auth/pam/pam_stub.go
Normal file
15
modules/auth/pam/pam_stub.go
Normal file
@@ -0,0 +1,15 @@
|
||||
// +build !pam
|
||||
|
||||
// Copyright 2014 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 pam
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
func PAMAuth(serviceName, userName, passwd string) error {
|
||||
return errors.New("PAM not supported")
|
||||
}
|
||||
@@ -21,9 +21,9 @@ type CreateRepoForm struct {
|
||||
RepoName string `form:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"`
|
||||
Private bool `form:"private"`
|
||||
Description string `form:"desc" binding:"MaxSize(255)"`
|
||||
AutoInit bool `form:"auto_init"`
|
||||
Gitignore string `form:"gitignore"`
|
||||
License string `form:"license"`
|
||||
InitReadme bool `form:"init_readme"`
|
||||
}
|
||||
|
||||
func (f *CreateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
@@ -31,14 +31,14 @@ func (f *CreateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) bin
|
||||
}
|
||||
|
||||
type MigrateRepoForm struct {
|
||||
HttpsUrl string `form:"url" binding:"Required;Url"`
|
||||
AuthUserName string `form:"auth_username"`
|
||||
AuthPasswd string `form:"auth_password"`
|
||||
Uid int64 `form:"uid" binding:"Required"`
|
||||
RepoName string `form:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"`
|
||||
Mirror bool `form:"mirror"`
|
||||
Private bool `form:"private"`
|
||||
Description string `form:"desc" binding:"MaxSize(255)"`
|
||||
CloneAddr string `binding:"Required"`
|
||||
AuthUsername string
|
||||
AuthPassword string
|
||||
Uid int64 `binding:"Required"`
|
||||
RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
|
||||
Mirror bool
|
||||
Private bool
|
||||
Description string `binding:"MaxSize(255)"`
|
||||
}
|
||||
|
||||
func (f *MigrateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
@@ -52,7 +52,6 @@ type RepoSettingForm struct {
|
||||
Branch string `form:"branch"`
|
||||
Interval int `form:"interval"`
|
||||
Private bool `form:"private"`
|
||||
GoGet bool `form:"goget"`
|
||||
}
|
||||
|
||||
func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
@@ -135,8 +134,9 @@ func (f *CreateMilestoneForm) Validate(ctx *macaron.Context, errs binding.Errors
|
||||
// \/ \/ \/ \/
|
||||
|
||||
type CreateLabelForm struct {
|
||||
Title string `form:"title" binding:"Required;MaxSize(50)"`
|
||||
Color string `form:"color" binding:"Required;Size(7)"`
|
||||
ID int64
|
||||
Title string `binding:"Required;MaxSize(50)" locale:"repo.issues.label_name"`
|
||||
Color string `binding:"Required;Size(7)" locale:"repo.issues.label_color"`
|
||||
}
|
||||
|
||||
func (f *CreateLabelForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
@@ -164,7 +164,6 @@ func (f *NewReleaseForm) Validate(ctx *macaron.Context, errs binding.Errors) bin
|
||||
}
|
||||
|
||||
type EditReleaseForm struct {
|
||||
Target string `form:"tag_target" binding:"Required"`
|
||||
Title string `form:"title" binding:"Required"`
|
||||
Content string `form:"content" binding:"Required"`
|
||||
Draft string `form:"draft"`
|
||||
|
||||
@@ -5,31 +5,43 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"mime/multipart"
|
||||
|
||||
"github.com/Unknwon/macaron"
|
||||
"github.com/macaron-contrib/binding"
|
||||
)
|
||||
|
||||
type InstallForm struct {
|
||||
Database string `form:"database" binding:"Required"`
|
||||
DbHost string `form:"host"`
|
||||
DbUser string `form:"user"`
|
||||
DbPasswd string `form:"passwd"`
|
||||
DatabaseName string `form:"database_name"`
|
||||
SslMode string `form:"ssl_mode"`
|
||||
DatabasePath string `form:"database_path"`
|
||||
RepoRootPath string `form:"repo_path" binding:"Required"`
|
||||
RunUser string `form:"run_user" binding:"Required"`
|
||||
Domain string `form:"domain" binding:"Required"`
|
||||
AppUrl string `form:"app_url" binding:"Required"`
|
||||
SmtpHost string `form:"smtp_host"`
|
||||
SmtpEmail string `form:"mailer_user"`
|
||||
SmtpPasswd string `form:"mailer_pwd"`
|
||||
RegisterConfirm string `form:"register_confirm"`
|
||||
MailNotify string `form:"mail_notify"`
|
||||
AdminName string `form:"admin_name" binding:"Required;AlphaDashDot;MaxSize(30)"`
|
||||
AdminPasswd string `form:"admin_pwd" binding:"Required;MinSize(6);MaxSize(255)"`
|
||||
ConfirmPasswd string `form:"confirm_passwd" binding:"Required;MinSize(6);MaxSize(255)"`
|
||||
AdminEmail string `form:"admin_email" binding:"Required;Email;MaxSize(50)"`
|
||||
DbType string `binding:"Required"`
|
||||
DbHost string
|
||||
DbUser string
|
||||
DbPasswd string
|
||||
DbName string
|
||||
SSLMode string
|
||||
DbPath string
|
||||
|
||||
AppName string `binding:"Required" locale:"install.app_name"`
|
||||
RepoRootPath string `binding:"Required"`
|
||||
RunUser string `binding:"Required"`
|
||||
Domain string `binding:"Required"`
|
||||
HTTPPort string `binding:"Required"`
|
||||
AppUrl string `binding:"Required"`
|
||||
|
||||
SMTPHost string
|
||||
SMTPFrom string
|
||||
SMTPEmail string `binding:"OmitEmpty;Email;MaxSize(50)" locale:"install.mailer_user"`
|
||||
SMTPPasswd string
|
||||
RegisterConfirm bool
|
||||
MailNotify bool
|
||||
|
||||
OfflineMode bool
|
||||
DisableRegistration bool
|
||||
RequireSignInView bool
|
||||
|
||||
AdminName string `binding:"OmitEmpty;AlphaDashDot;MaxSize(30)" locale:"install.admin_name"`
|
||||
AdminPasswd string `binding:"OmitEmpty;MinSize(6);MaxSize(255)" locale:"install.admin_password"`
|
||||
AdminConfirmPasswd string
|
||||
AdminEmail string `binding:"OmitEmpty;Email;MaxSize(50)" locale:"install.admin_email"`
|
||||
}
|
||||
|
||||
func (f *InstallForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
@@ -86,8 +98,25 @@ func (f *UpdateProfileForm) Validate(ctx *macaron.Context, errs binding.Errors)
|
||||
return validate(errs, ctx.Data, f, ctx.Locale)
|
||||
}
|
||||
|
||||
type UploadAvatarForm struct {
|
||||
Enable bool `form:"enable"`
|
||||
Avatar *multipart.FileHeader `form:"avatar"`
|
||||
}
|
||||
|
||||
func (f *UploadAvatarForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
return validate(errs, ctx.Data, f, ctx.Locale)
|
||||
}
|
||||
|
||||
type AddEmailForm struct {
|
||||
Email string `binding:"Required;Email;MaxSize(50)"`
|
||||
}
|
||||
|
||||
func (f *AddEmailForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
return validate(errs, ctx.Data, f, ctx.Locale)
|
||||
}
|
||||
|
||||
type ChangePasswordForm struct {
|
||||
OldPassword string `form:"old_password" binding:"Required;MinSize(6);MaxSize(255)"`
|
||||
OldPassword string `form:"old_password" binding:"Required;MinSize(1);MaxSize(255)"`
|
||||
Password string `form:"password" binding:"Required;MinSize(6);MaxSize(255)"`
|
||||
Retype string `form:"retype"`
|
||||
}
|
||||
|
||||
@@ -38,18 +38,24 @@ import (
|
||||
|
||||
var gravatarSource string
|
||||
|
||||
func init() {
|
||||
func UpdateGravatarSource() {
|
||||
gravatarSource = setting.GravatarSource
|
||||
log.Debug("avatar.UpdateGravatarSource(gavatar source): %s", gravatarSource)
|
||||
if !strings.HasPrefix(gravatarSource, "http:") {
|
||||
gravatarSource = "http:" + gravatarSource
|
||||
log.Debug("avatar.UpdateGravatarSource(update gavatar source): %s", gravatarSource)
|
||||
}
|
||||
}
|
||||
|
||||
// hash email to md5 string
|
||||
// keep this func in order to make this package indenpent
|
||||
// keep this func in order to make this package independent
|
||||
func HashEmail(email string) string {
|
||||
// https://en.gravatar.com/site/implement/hash/
|
||||
email = strings.TrimSpace(email)
|
||||
email = strings.ToLower(email)
|
||||
|
||||
h := md5.New()
|
||||
h.Write([]byte(strings.ToLower(email)))
|
||||
h.Write([]byte(email))
|
||||
return hex.EncodeToString(h.Sum(nil))
|
||||
}
|
||||
|
||||
@@ -121,17 +127,19 @@ func (this *Avatar) Encode(wr io.Writer, size int) (err error) {
|
||||
if img, err = decodeImageFile(imgPath); err != nil {
|
||||
return
|
||||
}
|
||||
m := resize.Resize(uint(size), 0, img, resize.Lanczos3)
|
||||
m := resize.Resize(uint(size), 0, img, resize.NearestNeighbor)
|
||||
return jpeg.Encode(wr, m, nil)
|
||||
}
|
||||
|
||||
// get image from gravatar.com
|
||||
func (this *Avatar) Update() {
|
||||
UpdateGravatarSource()
|
||||
thunder.Fetch(gravatarSource+this.Hash+"?"+this.reqParams,
|
||||
this.imagePath)
|
||||
}
|
||||
|
||||
func (this *Avatar) UpdateTimeout(timeout time.Duration) (err error) {
|
||||
UpdateGravatarSource()
|
||||
select {
|
||||
case <-time.After(timeout):
|
||||
err = fmt.Errorf("get gravatar image %s timeout", this.Hash)
|
||||
|
||||
@@ -7,6 +7,7 @@ package base
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"path"
|
||||
"path/filepath"
|
||||
@@ -14,6 +15,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/russross/blackfriday"
|
||||
"golang.org/x/net/html"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
@@ -63,12 +65,18 @@ func IsImageFile(data []byte) (string, bool) {
|
||||
return contentType, false
|
||||
}
|
||||
|
||||
// IsReadmeFile returns true if given file name suppose to be a README file.
|
||||
func IsReadmeFile(name string) bool {
|
||||
name = strings.ToLower(name)
|
||||
if len(name) < 6 {
|
||||
return false
|
||||
} else if len(name) == 6 {
|
||||
if name == "readme" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
if name[:6] == "readme" {
|
||||
if name[:7] == "readme." {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@@ -100,38 +108,22 @@ func (options *CustomRender) Image(out *bytes.Buffer, link []byte, title []byte,
|
||||
}
|
||||
|
||||
var (
|
||||
MentionPattern = regexp.MustCompile(`@[0-9a-zA-Z_]{1,}`)
|
||||
commitPattern = regexp.MustCompile(`(\s|^)https?.*commit/[0-9a-zA-Z]+(#+[0-9a-zA-Z-]*)?`)
|
||||
issueFullPattern = regexp.MustCompile(`(\s|^)https?.*issues/[0-9]+(#+[0-9a-zA-Z-]*)?`)
|
||||
issueIndexPattern = regexp.MustCompile(`#[0-9]+`)
|
||||
MentionPattern = regexp.MustCompile(`(\s|^)@[0-9a-zA-Z_\.]+`)
|
||||
commitPattern = regexp.MustCompile(`(\s|^)https?.*commit/[0-9a-zA-Z]+(#+[0-9a-zA-Z-]*)?`)
|
||||
issueFullPattern = regexp.MustCompile(`(\s|^)https?.*issues/[0-9]+(#+[0-9a-zA-Z-]*)?`)
|
||||
issueIndexPattern = regexp.MustCompile(`( |^)#[0-9]+\b`)
|
||||
sha1CurrentPattern = regexp.MustCompile(`\b[0-9a-f]{40}\b`)
|
||||
)
|
||||
|
||||
func RenderSpecialLink(rawBytes []byte, urlPrefix string) []byte {
|
||||
buf := bytes.NewBufferString("")
|
||||
inCodeBlock := false
|
||||
codeBlockPrefix := []byte("```")
|
||||
lineBreak := []byte("\n")
|
||||
tab := []byte("\t")
|
||||
lines := bytes.Split(rawBytes, lineBreak)
|
||||
for _, line := range lines {
|
||||
if bytes.HasPrefix(line, codeBlockPrefix) {
|
||||
inCodeBlock = !inCodeBlock
|
||||
}
|
||||
|
||||
if !inCodeBlock && !bytes.HasPrefix(line, tab) {
|
||||
ms := MentionPattern.FindAll(line, -1)
|
||||
for _, m := range ms {
|
||||
line = bytes.Replace(line, m,
|
||||
[]byte(fmt.Sprintf(`<a href="%s/user/%s">%s</a>`, setting.AppSubUrl, m[1:], m)), -1)
|
||||
}
|
||||
}
|
||||
|
||||
buf.Write(line)
|
||||
buf.Write(lineBreak)
|
||||
ms := MentionPattern.FindAll(rawBytes, -1)
|
||||
for _, m := range ms {
|
||||
m = bytes.TrimSpace(m)
|
||||
rawBytes = bytes.Replace(rawBytes, m,
|
||||
[]byte(fmt.Sprintf(`<a href="%s/%s">%s</a>`, setting.AppSubUrl, m[1:], m)), -1)
|
||||
}
|
||||
|
||||
rawBytes = buf.Bytes()
|
||||
ms := commitPattern.FindAll(rawBytes, -1)
|
||||
ms = commitPattern.FindAll(rawBytes, -1)
|
||||
for _, m := range ms {
|
||||
m = bytes.TrimSpace(m)
|
||||
i := strings.Index(string(m), "commit/")
|
||||
@@ -153,10 +145,31 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string) []byte {
|
||||
rawBytes = bytes.Replace(rawBytes, m, []byte(fmt.Sprintf(
|
||||
` <a href="%s">#%s</a>`, m, ShortSha(string(m[i+7:j])))), -1)
|
||||
}
|
||||
ms = issueIndexPattern.FindAll(rawBytes, -1)
|
||||
rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix)
|
||||
rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix)
|
||||
return rawBytes
|
||||
}
|
||||
|
||||
func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte {
|
||||
ms := sha1CurrentPattern.FindAll(rawBytes, -1)
|
||||
for _, m := range ms {
|
||||
rawBytes = bytes.Replace(rawBytes, m, []byte(fmt.Sprintf(
|
||||
`<a href="%s/issues/%s">%s</a>`, urlPrefix, m[1:], m)), -1)
|
||||
`<a href="%s/commit/%s"><code>%s</code></a>`, urlPrefix, m, ShortSha(string(m)))), -1)
|
||||
}
|
||||
return rawBytes
|
||||
}
|
||||
|
||||
func RenderIssueIndexPattern(rawBytes []byte, urlPrefix string) []byte {
|
||||
ms := issueIndexPattern.FindAll(rawBytes, -1)
|
||||
for _, m := range ms {
|
||||
var space string
|
||||
m2 := m
|
||||
if m2[0] == ' ' {
|
||||
space = " "
|
||||
m2 = m2[1:]
|
||||
}
|
||||
rawBytes = bytes.Replace(rawBytes, m, []byte(fmt.Sprintf(`%s<a href="%s/issues/%s">%s</a>`,
|
||||
space, urlPrefix, m2[1:], m2)), 1)
|
||||
}
|
||||
return rawBytes
|
||||
}
|
||||
@@ -193,11 +206,52 @@ func RenderRawMarkdown(body []byte, urlPrefix string) []byte {
|
||||
return body
|
||||
}
|
||||
|
||||
// PostProcessMarkdown treats different types of HTML differently,
|
||||
// and only renders special links for plain text blocks.
|
||||
func PostProcessMarkdown(rawHtml []byte, urlPrefix string) []byte {
|
||||
var buf bytes.Buffer
|
||||
tokenizer := html.NewTokenizer(bytes.NewReader(rawHtml))
|
||||
for html.ErrorToken != tokenizer.Next() {
|
||||
token := tokenizer.Token()
|
||||
switch token.Type {
|
||||
case html.TextToken:
|
||||
buf.Write(RenderSpecialLink([]byte(token.String()), urlPrefix))
|
||||
|
||||
case html.StartTagToken:
|
||||
buf.WriteString(token.String())
|
||||
tagName := token.Data
|
||||
// If this is an excluded tag, we skip processing all output until a close tag is encountered.
|
||||
if strings.EqualFold("a", tagName) || strings.EqualFold("code", tagName) || strings.EqualFold("pre", tagName) {
|
||||
for html.ErrorToken != tokenizer.Next() {
|
||||
token = tokenizer.Token()
|
||||
// Copy the token to the output verbatim
|
||||
buf.WriteString(token.String())
|
||||
// If this is the close tag, we are done
|
||||
if html.EndTagToken == token.Type && strings.EqualFold(tagName, token.Data) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
buf.WriteString(token.String())
|
||||
}
|
||||
}
|
||||
|
||||
if io.EOF == tokenizer.Err() {
|
||||
return buf.Bytes()
|
||||
}
|
||||
|
||||
// If we are not at the end of the input, then some other parsing error has occurred,
|
||||
// so return the input verbatim.
|
||||
return rawHtml
|
||||
}
|
||||
|
||||
func RenderMarkdown(rawBytes []byte, urlPrefix string) []byte {
|
||||
body := RenderSpecialLink(rawBytes, urlPrefix)
|
||||
body = RenderRawMarkdown(body, urlPrefix)
|
||||
body = XSS(body)
|
||||
return body
|
||||
result := RenderRawMarkdown(rawBytes, urlPrefix)
|
||||
result = PostProcessMarkdown(result, urlPrefix)
|
||||
result = Sanitizer.SanitizeBytes(result)
|
||||
return result
|
||||
}
|
||||
|
||||
func RenderMarkdownString(raw, urlPrefix string) string {
|
||||
|
||||
@@ -7,20 +7,21 @@ package base
|
||||
import (
|
||||
"container/list"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gogits/gogs/modules/mahonia"
|
||||
"golang.org/x/net/html/charset"
|
||||
"golang.org/x/text/transform"
|
||||
|
||||
"github.com/gogits/chardet"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/saintfish/chardet"
|
||||
)
|
||||
|
||||
func Str2html(raw string) template.HTML {
|
||||
return template.HTML(raw)
|
||||
return template.HTML(Sanitizer.Sanitize(raw))
|
||||
}
|
||||
|
||||
func Range(l int) []int {
|
||||
@@ -40,6 +41,10 @@ func List(l *list.List) chan interface{} {
|
||||
return c
|
||||
}
|
||||
|
||||
func Sha1(str string) string {
|
||||
return EncodeSha1(str)
|
||||
}
|
||||
|
||||
func ShortSha(sha1 string) string {
|
||||
if len(sha1) == 40 {
|
||||
return sha1[:10]
|
||||
@@ -47,22 +52,40 @@ func ShortSha(sha1 string) string {
|
||||
return sha1
|
||||
}
|
||||
|
||||
func ToUtf8WithErr(content []byte) (error, string) {
|
||||
func DetectEncoding(content []byte) (string, error) {
|
||||
detector := chardet.NewTextDetector()
|
||||
result, err := detector.DetectBest(content)
|
||||
if result.Charset != "UTF-8" && len(setting.AnsiCharset) > 0 {
|
||||
return setting.AnsiCharset, err
|
||||
}
|
||||
return result.Charset, err
|
||||
}
|
||||
|
||||
func ToUtf8WithErr(content []byte) (error, string) {
|
||||
charsetLabel, err := DetectEncoding(content)
|
||||
if err != nil {
|
||||
return err, ""
|
||||
}
|
||||
|
||||
if result.Charset == "utf8" {
|
||||
if charsetLabel == "UTF-8" {
|
||||
return nil, string(content)
|
||||
}
|
||||
|
||||
decoder := mahonia.NewDecoder(result.Charset)
|
||||
if decoder != nil {
|
||||
return nil, decoder.ConvertString(string(content))
|
||||
encoding, _ := charset.Lookup(charsetLabel)
|
||||
|
||||
if encoding == nil {
|
||||
return fmt.Errorf("unknow char decoder %s", charsetLabel), string(content)
|
||||
}
|
||||
return errors.New("unknow char decoder"), string(content)
|
||||
|
||||
result, n, err := transform.String(encoding.NewDecoder(), string(content))
|
||||
|
||||
// If there is an error, we concatenate the nicely decoded part and the
|
||||
// original left over. This way we won't loose data.
|
||||
if err != nil {
|
||||
result = result + string(content[n:])
|
||||
}
|
||||
|
||||
return err, result
|
||||
}
|
||||
|
||||
func ToUtf8(content string) string {
|
||||
@@ -70,6 +93,11 @@ func ToUtf8(content string) string {
|
||||
return res
|
||||
}
|
||||
|
||||
// RenderCommitMessage renders commit message with XSS-safe and special links.
|
||||
func RenderCommitMessage(msg, urlPrefix string) template.HTML {
|
||||
return template.HTML(string(RenderIssueIndexPattern([]byte(template.HTMLEscapeString(msg)), urlPrefix)))
|
||||
}
|
||||
|
||||
var mailDomains = map[string]string{
|
||||
"gmail.com": "gmail.com",
|
||||
}
|
||||
@@ -93,11 +121,13 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
|
||||
"CdnMode": func() bool {
|
||||
return setting.ProdMode && !setting.OfflineMode
|
||||
},
|
||||
"DisableGravatar": func() bool {
|
||||
return setting.DisableGravatar
|
||||
},
|
||||
"LoadTimes": func(startTime time.Time) string {
|
||||
return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms"
|
||||
},
|
||||
"AvatarLink": AvatarLink,
|
||||
"str2html": Str2html, // TODO: Legacy
|
||||
"Str2html": Str2html,
|
||||
"TimeSince": TimeSince,
|
||||
"FileSize": FileSize,
|
||||
@@ -106,8 +136,13 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
|
||||
return a + b
|
||||
},
|
||||
"ActionIcon": ActionIcon,
|
||||
"DateFormat": DateFormat,
|
||||
"List": List,
|
||||
"DateFmtLong": func(t time.Time) string {
|
||||
return t.Format(time.RFC1123Z)
|
||||
},
|
||||
"DateFmtShort": func(t time.Time) string {
|
||||
return t.Format("Jan 02, 2006")
|
||||
},
|
||||
"List": List,
|
||||
"Mail2Domain": func(mail string) string {
|
||||
if !strings.Contains(mail, "@") {
|
||||
return "try.gogs.io"
|
||||
@@ -135,6 +170,7 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
|
||||
},
|
||||
"DiffTypeToStr": DiffTypeToStr,
|
||||
"DiffLineTypeToStr": DiffLineTypeToStr,
|
||||
"Sha1": Sha1,
|
||||
"ShortSha": ShortSha,
|
||||
"Md5": EncodeMd5,
|
||||
"ActionContent2Commits": ActionContent2Commits,
|
||||
@@ -142,8 +178,9 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
|
||||
"Oauth2Name": Oauth2Name,
|
||||
"ToUtf8": ToUtf8,
|
||||
"EscapePound": func(str string) string {
|
||||
return strings.Replace(str, "#", "%23", -1)
|
||||
return strings.Replace(strings.Replace(str, "%", "%25", -1), "#", "%23", -1)
|
||||
},
|
||||
"RenderCommitMessage": RenderCommitMessage,
|
||||
}
|
||||
|
||||
type Actioner interface {
|
||||
|
||||
@@ -11,21 +11,23 @@ import (
|
||||
"crypto/sha1"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"hash"
|
||||
"html/template"
|
||||
"math"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/Unknwon/i18n"
|
||||
"github.com/microcosm-cc/bluemonday"
|
||||
|
||||
"github.com/gogits/gogs/modules/avatar"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
var Sanitizer = bluemonday.UGCPolicy()
|
||||
|
||||
// Encode string to md5 hex value.
|
||||
func EncodeMd5(str string) string {
|
||||
m := md5.New()
|
||||
@@ -40,20 +42,14 @@ func EncodeSha1(str string) string {
|
||||
return hex.EncodeToString(h.Sum(nil))
|
||||
}
|
||||
|
||||
func BasicAuthDecode(encoded string) (user string, name string, err error) {
|
||||
var s []byte
|
||||
s, err = base64.StdEncoding.DecodeString(encoded)
|
||||
func BasicAuthDecode(encoded string) (string, string, error) {
|
||||
s, err := base64.StdEncoding.DecodeString(encoded)
|
||||
if err != nil {
|
||||
return user, name, err
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
a := strings.Split(string(s), ":")
|
||||
if len(a) == 2 {
|
||||
user, name = a[0], a[1]
|
||||
} else {
|
||||
err = errors.New("decode failed")
|
||||
}
|
||||
return user, name, err
|
||||
auth := strings.SplitN(string(s), ":", 2)
|
||||
return auth[0], auth[1], nil
|
||||
}
|
||||
|
||||
func BasicAuthEncode(username, password string) string {
|
||||
@@ -130,7 +126,7 @@ func VerifyTimeLimitCode(data string, minutes int, code string) bool {
|
||||
retCode := CreateTimeLimitCode(data, minutes, start)
|
||||
if retCode == code && minutes > 0 {
|
||||
// check time is expired or not
|
||||
before, _ := DateParse(start, "YmdHi")
|
||||
before, _ := time.ParseInLocation("200601021504", start, time.Local)
|
||||
now := time.Now()
|
||||
if before.Add(time.Minute*time.Duration(minutes)).Unix() > now.Unix() {
|
||||
return true
|
||||
@@ -145,7 +141,7 @@ const TimeLimitCodeLength = 12 + 6 + 40
|
||||
// create a time limit code
|
||||
// code format: 12 length date time string + 6 minutes string + 40 sha1 encoded string
|
||||
func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string {
|
||||
format := "YmdHi"
|
||||
format := "200601021504"
|
||||
|
||||
var start, end time.Time
|
||||
var startStr, endStr string
|
||||
@@ -153,16 +149,16 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
|
||||
if startInf == nil {
|
||||
// Use now time create code
|
||||
start = time.Now()
|
||||
startStr = DateFormat(start, format)
|
||||
startStr = start.Format(format)
|
||||
} else {
|
||||
// use start string create code
|
||||
startStr = startInf.(string)
|
||||
start, _ = DateParse(startStr, format)
|
||||
startStr = DateFormat(start, format)
|
||||
start, _ = time.ParseInLocation(format, startStr, time.Local)
|
||||
startStr = start.Format(format)
|
||||
}
|
||||
|
||||
end = start.Add(time.Minute * time.Duration(minutes))
|
||||
endStr = DateFormat(end, format)
|
||||
endStr = end.Format(format)
|
||||
|
||||
// create sha1 encode string
|
||||
sh := sha1.New()
|
||||
@@ -175,12 +171,15 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
|
||||
|
||||
// AvatarLink returns avatar link by given e-mail.
|
||||
func AvatarLink(email string) string {
|
||||
if setting.DisableGravatar {
|
||||
if setting.DisableGravatar || setting.OfflineMode {
|
||||
return setting.AppSubUrl + "/img/avatar_default.jpg"
|
||||
} else if setting.Service.EnableCacheAvatar {
|
||||
return setting.AppSubUrl + "/avatar/" + EncodeMd5(email)
|
||||
}
|
||||
return setting.GravatarSource + EncodeMd5(email)
|
||||
|
||||
gravatarHash := avatar.HashEmail(email)
|
||||
if setting.Service.EnableCacheAvatar {
|
||||
return setting.AppSubUrl + "/avatar/" + gravatarHash
|
||||
}
|
||||
return setting.GravatarSource + gravatarHash
|
||||
}
|
||||
|
||||
// Seconds-based time units
|
||||
@@ -421,84 +420,3 @@ func Subtract(left interface{}, right interface{}) interface{} {
|
||||
return fleft + float64(rleft) - (fright + float64(rright))
|
||||
}
|
||||
}
|
||||
|
||||
// DateFormat pattern rules.
|
||||
var datePatterns = []string{
|
||||
// year
|
||||
"Y", "2006", // A full numeric representation of a year, 4 digits Examples: 1999 or 2003
|
||||
"y", "06", //A two digit representation of a year Examples: 99 or 03
|
||||
|
||||
// month
|
||||
"m", "01", // Numeric representation of a month, with leading zeros 01 through 12
|
||||
"n", "1", // Numeric representation of a month, without leading zeros 1 through 12
|
||||
"M", "Jan", // A short textual representation of a month, three letters Jan through Dec
|
||||
"F", "January", // A full textual representation of a month, such as January or March January through December
|
||||
|
||||
// day
|
||||
"d", "02", // Day of the month, 2 digits with leading zeros 01 to 31
|
||||
"j", "2", // Day of the month without leading zeros 1 to 31
|
||||
|
||||
// week
|
||||
"D", "Mon", // A textual representation of a day, three letters Mon through Sun
|
||||
"l", "Monday", // A full textual representation of the day of the week Sunday through Saturday
|
||||
|
||||
// time
|
||||
"g", "3", // 12-hour format of an hour without leading zeros 1 through 12
|
||||
"G", "15", // 24-hour format of an hour without leading zeros 0 through 23
|
||||
"h", "03", // 12-hour format of an hour with leading zeros 01 through 12
|
||||
"H", "15", // 24-hour format of an hour with leading zeros 00 through 23
|
||||
|
||||
"a", "pm", // Lowercase Ante meridiem and Post meridiem am or pm
|
||||
"A", "PM", // Uppercase Ante meridiem and Post meridiem AM or PM
|
||||
|
||||
"i", "04", // Minutes with leading zeros 00 to 59
|
||||
"s", "05", // Seconds, with leading zeros 00 through 59
|
||||
|
||||
// time zone
|
||||
"T", "MST",
|
||||
"P", "-07:00",
|
||||
"O", "-0700",
|
||||
|
||||
// RFC 2822
|
||||
"r", time.RFC1123Z,
|
||||
}
|
||||
|
||||
// Parse Date use PHP time format.
|
||||
func DateParse(dateString, format string) (time.Time, error) {
|
||||
replacer := strings.NewReplacer(datePatterns...)
|
||||
format = replacer.Replace(format)
|
||||
return time.ParseInLocation(format, dateString, time.Local)
|
||||
}
|
||||
|
||||
// Date takes a PHP like date func to Go's time format.
|
||||
func DateFormat(t time.Time, format string) string {
|
||||
replacer := strings.NewReplacer(datePatterns...)
|
||||
format = replacer.Replace(format)
|
||||
return t.Format(format)
|
||||
}
|
||||
|
||||
type xssFilter struct {
|
||||
reg *regexp.Regexp
|
||||
repl []byte
|
||||
}
|
||||
|
||||
var (
|
||||
whiteSpace = []byte(" ")
|
||||
xssFilters = []xssFilter{
|
||||
{regexp.MustCompile(`\ [ONon]\w*=["]*`), whiteSpace},
|
||||
{regexp.MustCompile(`<[SCRIPTscript]{6}`), whiteSpace},
|
||||
{regexp.MustCompile(`=[` + "`" + `'"]*[JAVASCRIPTjavascript \t\0
]*:`), whiteSpace},
|
||||
}
|
||||
)
|
||||
|
||||
// XSS goes through all the XSS filters to make user input content as safe as possible.
|
||||
func XSS(in []byte) []byte {
|
||||
for _, filter := range xssFilters {
|
||||
in = filter.reg.ReplaceAll(in, filter.repl)
|
||||
}
|
||||
return in
|
||||
}
|
||||
|
||||
func XSSString(in string) string {
|
||||
return string(XSS([]byte(in)))
|
||||
}
|
||||
|
||||
1300
modules/bindata/bindata.go
Normal file
1300
modules/bindata/bindata.go
Normal file
File diff suppressed because one or more lines are too long
@@ -15,7 +15,10 @@ var c = New()
|
||||
|
||||
func NewCronContext() {
|
||||
c.AddFunc("Update mirrors", "@every 1h", models.MirrorUpdate)
|
||||
c.AddFunc("Deliver hooks", fmt.Sprintf("@every %dm", setting.WebhookTaskInterval), models.DeliverHooks)
|
||||
if setting.Git.Fsck.Enable {
|
||||
c.AddFunc("Repository health check", fmt.Sprintf("@every %dh", setting.Git.Fsck.Interval), models.GitFsck)
|
||||
}
|
||||
c.AddFunc("Check repository statistics", "@every 24h", models.CheckRepoStats)
|
||||
c.Start()
|
||||
}
|
||||
|
||||
|
||||
@@ -88,11 +88,11 @@ func (c *Commit) GetCommitOfRelPath(relPath string) (*Commit, error) {
|
||||
}
|
||||
|
||||
func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
|
||||
moduels, err := c.GetSubModules()
|
||||
modules, err := c.GetSubModules()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return moduels[entryname], nil
|
||||
return modules[entryname], nil
|
||||
}
|
||||
|
||||
func (c *Commit) GetSubModules() (map[string]*SubModule, error) {
|
||||
|
||||
@@ -27,7 +27,7 @@ func (repo *Repository) GetTags() ([]string, error) {
|
||||
}
|
||||
stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "tag", "-l")
|
||||
if err != nil {
|
||||
return nil, errors.New(stderr)
|
||||
return nil, concatenateError(err, stderr)
|
||||
}
|
||||
tags := strings.Split(stdout, "\n")
|
||||
return tags[:len(tags)-1], nil
|
||||
|
||||
@@ -17,24 +17,35 @@ type Signature struct {
|
||||
When time.Time
|
||||
}
|
||||
|
||||
// Helper to get a signature from the commit line, which looks like this:
|
||||
// Helper to get a signature from the commit line, which looks like these:
|
||||
// author Patrick Gundlach <gundlach@speedata.de> 1378823654 +0200
|
||||
// author Patrick Gundlach <gundlach@speedata.de> Thu, 07 Apr 2005 22:13:13 +0200
|
||||
// but without the "author " at the beginning (this method should)
|
||||
// be used for author and committer.
|
||||
//
|
||||
// FIXME: include timezone!
|
||||
func newSignatureFromCommitline(line []byte) (*Signature, error) {
|
||||
// FIXME: include timezone for timestamp!
|
||||
func newSignatureFromCommitline(line []byte) (_ *Signature, err error) {
|
||||
sig := new(Signature)
|
||||
emailstart := bytes.IndexByte(line, '<')
|
||||
sig.Name = string(line[:emailstart-1])
|
||||
emailstop := bytes.IndexByte(line, '>')
|
||||
sig.Email = string(line[emailstart+1 : emailstop])
|
||||
timestop := bytes.IndexByte(line[emailstop+2:], ' ')
|
||||
timestring := string(line[emailstop+2 : emailstop+2+timestop])
|
||||
seconds, err := strconv.ParseInt(timestring, 10, 64)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
// Check date format.
|
||||
firstChar := line[emailstop+2]
|
||||
if firstChar >= 48 && firstChar <= 57 {
|
||||
timestop := bytes.IndexByte(line[emailstop+2:], ' ')
|
||||
timestring := string(line[emailstop+2 : emailstop+2+timestop])
|
||||
seconds, err := strconv.ParseInt(timestring, 10, 64)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sig.When = time.Unix(seconds, 0)
|
||||
} else {
|
||||
sig.When, err = time.Parse("Mon Jan _2 15:04:05 2006 -0700", string(line[emailstop+2:]))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
sig.When = time.Unix(seconds, 0)
|
||||
return sig, nil
|
||||
}
|
||||
|
||||
@@ -31,6 +31,10 @@ func NewSubModuleFile(c *Commit, refUrl, refId string) *SubModuleFile {
|
||||
|
||||
// RefUrl guesses and returns reference URL.
|
||||
func (sf *SubModuleFile) RefUrl() string {
|
||||
if sf.refUrl == "" {
|
||||
return ""
|
||||
}
|
||||
|
||||
url := strings.TrimSuffix(sf.refUrl, ".git")
|
||||
|
||||
// git://xxx/user/repo
|
||||
|
||||
@@ -7,6 +7,7 @@ package git
|
||||
import (
|
||||
"bytes"
|
||||
"container/list"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@@ -67,3 +68,10 @@ func isFile(filePath string) bool {
|
||||
}
|
||||
return !f.IsDir()
|
||||
}
|
||||
|
||||
func concatenateError(err error, stderr string) error {
|
||||
if len(stderr) == 0 {
|
||||
return err
|
||||
}
|
||||
return fmt.Errorf("%v: %s", err, stderr)
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"github.com/gogits/gogs/modules/asn1-ber"
|
||||
)
|
||||
|
||||
// debbuging type
|
||||
// debugging type
|
||||
// - has a Printf method to write the debug output
|
||||
type debugging bool
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ func newLogger(buffer int64) *Logger {
|
||||
return l
|
||||
}
|
||||
|
||||
// SetLogger sets new logger instanse with given logger adapter and config.
|
||||
// SetLogger sets new logger instance with given logger adapter and config.
|
||||
func (l *Logger) SetLogger(adapter string, config string) error {
|
||||
l.lock.Lock()
|
||||
defer l.lock.Unlock()
|
||||
@@ -214,7 +214,11 @@ func (l *Logger) writerMsg(skip, level int, msg string) error {
|
||||
fnName = strings.TrimLeft(filepath.Ext(fn.Name()), ".") + "()"
|
||||
}
|
||||
|
||||
lm.msg = fmt.Sprintf("[%s:%d %s] %s", filepath.Base(file), line, fnName, msg)
|
||||
fileName := file
|
||||
if len(fileName) > 20 {
|
||||
fileName = "..." + fileName[len(fileName)-20:]
|
||||
}
|
||||
lm.msg = fmt.Sprintf("[%s:%d %s] %s", fileName, line, fnName, msg)
|
||||
} else {
|
||||
lm.msg = msg
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user