Compare commits
963 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80d8af84dd | ||
|
|
aac519bf80 | ||
|
|
d64dffbdda | ||
|
|
4015ccef2f | ||
|
|
b6f985abaf | ||
|
|
2dac8d3d1f | ||
|
|
4f284e1bc0 | ||
|
|
b0280355e8 | ||
|
|
048d88b784 | ||
|
|
bb52ebdc3e | ||
|
|
5f2fda85ba | ||
|
|
1331f0b953 | ||
|
|
736fdabc1d | ||
|
|
7096c0ca49 | ||
|
|
1a984de8e8 | ||
|
|
285d0d13f9 | ||
|
|
63c659bc8f | ||
|
|
af60b45ee7 | ||
|
|
e7effd606d | ||
|
|
5042d23bc4 | ||
|
|
b134467bd3 | ||
|
|
5cc1aab530 | ||
|
|
49d57ce049 | ||
|
|
f1feceaf1a | ||
|
|
1204e1c5e4 | ||
|
|
96cf4c30cf | ||
|
|
a3853611ad | ||
|
|
ef7eaaabfa | ||
|
|
a4a96710b0 | ||
|
|
6d08909b2f | ||
|
|
2615368b1e | ||
|
|
2bd03ca725 | ||
|
|
67dda01fcb | ||
|
|
e9dc54c4d9 | ||
|
|
fde9fc2891 | ||
|
|
6e59798e82 | ||
|
|
5e3cc0a3c6 | ||
|
|
cfb35324d0 | ||
|
|
9bfbc12afa | ||
|
|
b41cddaf5a | ||
|
|
1432a7193d | ||
|
|
20630cb3a0 | ||
|
|
2eb02ae581 | ||
|
|
801f9027aa | ||
|
|
802739a2df | ||
|
|
95b1e1a21d | ||
|
|
b8060a522a | ||
|
|
fe2191a491 | ||
|
|
2891f52817 | ||
|
|
5bdc44c672 | ||
|
|
65d359b57a | ||
|
|
7b6e717e23 | ||
|
|
2820f6a621 | ||
|
|
6f96e05fec | ||
|
|
4c2c762b87 | ||
|
|
81fadfa4ff | ||
|
|
c227641d50 | ||
|
|
dacc713f99 | ||
|
|
a1f794ee05 | ||
|
|
8b2098fc89 | ||
|
|
4436852de0 | ||
|
|
a8ff1e19dc | ||
|
|
d559aa8e6d | ||
|
|
83fedcff3b | ||
|
|
9969cf8816 | ||
|
|
dee48fff12 | ||
|
|
aff80199e5 | ||
|
|
b9f1a55190 | ||
|
|
07d5bce61a | ||
|
|
834edd216c | ||
|
|
4670a3d886 | ||
|
|
78952df364 | ||
|
|
d69df60da4 | ||
|
|
6ca69f6f2e | ||
|
|
8e8428b667 | ||
|
|
5dbe1d448b | ||
|
|
85d8e6f220 | ||
|
|
72fb23f4d5 | ||
|
|
9403ee6495 | ||
|
|
94ce4fa780 | ||
|
|
911f5c1455 | ||
|
|
a6a88af513 | ||
|
|
fad1352d51 | ||
|
|
41cdae07c3 | ||
|
|
3b0daeac3c | ||
|
|
99e4b06468 | ||
|
|
c88576e3e6 | ||
|
|
4de709fe51 | ||
|
|
37e4226c70 | ||
|
|
1a6ed61b91 | ||
|
|
ac641da49c | ||
|
|
933a79af93 | ||
|
|
f36e3c69b4 | ||
|
|
c46bfcc768 | ||
|
|
c65ccd5eb0 | ||
|
|
162a740295 | ||
|
|
9192e98e3f | ||
|
|
fad84203c0 | ||
|
|
622266d200 | ||
|
|
0f6cd3c125 | ||
|
|
0dfc1fcf13 | ||
|
|
efeebd2165 | ||
|
|
69a916d506 | ||
|
|
114803a86a | ||
|
|
7f54c8fa2a | ||
|
|
0af3e15e82 | ||
|
|
f9afebc12e | ||
|
|
fc7268fd12 | ||
|
|
7e7f94d685 | ||
|
|
3ea7a49c1c | ||
|
|
f596a847c2 | ||
|
|
312ba501a3 | ||
|
|
c6531e8609 | ||
|
|
36c2d0082f | ||
|
|
358bb0fc06 | ||
|
|
5a4f6b4ada | ||
|
|
03136caac4 | ||
|
|
e6f78a73ab | ||
|
|
bcdab799d0 | ||
|
|
50251955cd | ||
|
|
2270fbf3ee | ||
|
|
deb6485cc2 | ||
|
|
6de08d07a3 | ||
|
|
f54cd10a04 | ||
|
|
dda7b0c80e | ||
|
|
3ed9e1ff3f | ||
|
|
9c8d26affa | ||
|
|
1e1a7ee858 | ||
|
|
9cfb72810c | ||
|
|
14a774c723 | ||
|
|
8509adf961 | ||
|
|
9d75ec799b | ||
|
|
eed9266ecb | ||
|
|
4a88cb5968 | ||
|
|
50d4de19f0 | ||
|
|
c7456224af | ||
|
|
c1524d9bef | ||
|
|
aa1d2545b3 | ||
|
|
1092818203 | ||
|
|
d67d163c78 | ||
|
|
a973bd56fe | ||
|
|
08b6fda065 | ||
|
|
d0cc145cb3 | ||
|
|
19588647d6 | ||
|
|
09da292f1a | ||
|
|
c8107ff936 | ||
|
|
b44afc1876 | ||
|
|
c26168f22e | ||
|
|
391be342ac | ||
|
|
16549f8f84 | ||
|
|
2d2b65d9fa | ||
|
|
a12ad37522 | ||
|
|
84541faf92 | ||
|
|
c7daaba370 | ||
|
|
f128813a5e | ||
|
|
699a55ea08 | ||
|
|
90a674f99b | ||
|
|
f236d36ed3 | ||
|
|
1b2200ccf4 | ||
|
|
c6353f3502 | ||
|
|
f09b8a78a0 | ||
|
|
5f741ac46e | ||
|
|
a434cfbe0d | ||
|
|
cd4c7689b7 | ||
|
|
3cc2049fb3 | ||
|
|
0d3117e472 | ||
|
|
b335975c97 | ||
|
|
5511b6e013 | ||
|
|
262d5ead51 | ||
|
|
a78b048720 | ||
|
|
e7dd5e155d | ||
|
|
5a3ea38bbf | ||
|
|
786521eba7 | ||
|
|
202cb3048a | ||
|
|
7e642cf700 | ||
|
|
7732aabc1e | ||
|
|
1cf9f52eca | ||
|
|
d1d5e10b72 | ||
|
|
c3fada264f | ||
|
|
45eeb74b83 | ||
|
|
b9a6e551cd | ||
|
|
c610e5ed9b | ||
|
|
c2c2824e50 | ||
|
|
01fab09683 | ||
|
|
e103904a04 | ||
|
|
56678cbac0 | ||
|
|
7fade8939d | ||
|
|
daa557f6a3 | ||
|
|
23a257ed86 | ||
|
|
05d0620491 | ||
|
|
5225139284 | ||
|
|
9b2e996cae | ||
|
|
6a561342a4 | ||
|
|
429bed2f91 | ||
|
|
200d593414 | ||
|
|
9dbe12135d | ||
|
|
318d7f2652 | ||
|
|
5a653531e2 | ||
|
|
c7cc3dcdfd | ||
|
|
61f54f8f74 | ||
|
|
a3b27fe3a1 | ||
|
|
380749051d | ||
|
|
81625f9fc5 | ||
|
|
d6ccb1725b | ||
|
|
5ce412aeda | ||
|
|
fe6d88e410 | ||
|
|
a21357248f | ||
|
|
70d710c9a9 | ||
|
|
183c82fb8d | ||
|
|
62cbb92154 | ||
|
|
7d70126072 | ||
|
|
54bfffa7b9 | ||
|
|
3f5b96bf62 | ||
|
|
3d8bbedf1b | ||
|
|
23c9f6a6ca | ||
|
|
5ba8d4949d | ||
|
|
a6befdd541 | ||
|
|
e5409db0e8 | ||
|
|
678d610cd6 | ||
|
|
466fe9c368 | ||
|
|
13feaea7b7 | ||
|
|
e52f9301fa | ||
|
|
1b58e18a6d | ||
|
|
b779ff08e0 | ||
|
|
811f9c22d7 | ||
|
|
c3529f0691 | ||
|
|
f9f574532e | ||
|
|
92dee53dd6 | ||
|
|
5d42ee2359 | ||
|
|
7c03d37caa | ||
|
|
b128b593c2 | ||
|
|
342e48ed77 | ||
|
|
052f8b265d | ||
|
|
2eedc91d74 | ||
|
|
410b9ad6bc | ||
|
|
24c6dff3e4 | ||
|
|
161db7636a | ||
|
|
796252357e | ||
|
|
b0344d52e9 | ||
|
|
8e6da3a0d9 | ||
|
|
756e4eaeec | ||
|
|
3126d0730a | ||
|
|
748e9f15df | ||
|
|
7c714f5788 | ||
|
|
d3c3ad839b | ||
|
|
168de3c316 | ||
|
|
9e20fc5c88 | ||
|
|
1ff5151786 | ||
|
|
a56738a331 | ||
|
|
2d04a3d6d2 | ||
|
|
e0a55b9100 | ||
|
|
0a57eecb3a | ||
|
|
51f98020f6 | ||
|
|
70123805e1 | ||
|
|
1448b11d00 | ||
|
|
490b81ed05 | ||
|
|
96f675abed | ||
|
|
4cd451c613 | ||
|
|
187792dfc4 | ||
|
|
3dde561fe5 | ||
|
|
a75ec45172 | ||
|
|
3732ddf75f | ||
|
|
b8d8097734 | ||
|
|
1092532292 | ||
|
|
8a79ba0e2b | ||
|
|
ca2949fbb4 | ||
|
|
17b373ac07 | ||
|
|
7aa66f438f | ||
|
|
73641fd78d | ||
|
|
64aac9d6ad | ||
|
|
2be13736c8 | ||
|
|
ff4f5fec1d | ||
|
|
7d64f8abe4 | ||
|
|
88e6929e9f | ||
|
|
5fb0a995dd | ||
|
|
58a04ce1a5 | ||
|
|
f74e0d9123 | ||
|
|
c6249b82d4 | ||
|
|
d6131c0b09 | ||
|
|
e62c810b7c | ||
|
|
2851a1a7ef | ||
|
|
12cd2709d6 | ||
|
|
bf54e58873 | ||
|
|
6b473e3a5c | ||
|
|
4b68abd963 | ||
|
|
0e764a2b3e | ||
|
|
9d1ed1eb0d | ||
|
|
a09a3465a2 | ||
|
|
001969efaf | ||
|
|
e7c515da9a | ||
|
|
8367c7dd49 | ||
|
|
55e6cae240 | ||
|
|
5553c3fb17 | ||
|
|
026265cb1e | ||
|
|
289c76a802 | ||
|
|
7c1bc1d6bc | ||
|
|
90cf0d32b5 | ||
|
|
88d934f922 | ||
|
|
abf11bb03c | ||
|
|
2d1f50303d | ||
|
|
9fb7c4091f | ||
|
|
2fdec27ab0 | ||
|
|
aff56469ed | ||
|
|
419cb7fbad | ||
|
|
7882851539 | ||
|
|
358299cf0e | ||
|
|
5a2af24869 | ||
|
|
6d35872af5 | ||
|
|
559dfdaa80 | ||
|
|
79c49bc926 | ||
|
|
76c538ad25 | ||
|
|
e76e358d98 | ||
|
|
76f37671b4 | ||
|
|
a9fc176c3c | ||
|
|
8b13e3c327 | ||
|
|
c3cd6ad2d2 | ||
|
|
3444b9c9c8 | ||
|
|
ca6fc9cd79 | ||
|
|
4747ae8b61 | ||
|
|
b6c50d63a0 | ||
|
|
52ebf2055e | ||
|
|
d0af2c2a98 | ||
|
|
10216af48a | ||
|
|
d0c8d537f5 | ||
|
|
1903aaf351 | ||
|
|
e6cdf1b995 | ||
|
|
2900d22cdc | ||
|
|
dc072d4706 | ||
|
|
8ae14f146b | ||
|
|
57444c6c3f | ||
|
|
759719d124 | ||
|
|
59782973be | ||
|
|
6c647ea91c | ||
|
|
c9763dabe1 | ||
|
|
da82754659 | ||
|
|
a3cc0ad18b | ||
|
|
2e8e5c2751 | ||
|
|
a60d83b101 | ||
|
|
6d45265763 | ||
|
|
42e84b77e1 | ||
|
|
24121cfadb | ||
|
|
93093dd288 | ||
|
|
53381c04e6 | ||
|
|
c6b64e57f1 | ||
|
|
9158426d0a | ||
|
|
cef26853df | ||
|
|
c0673884c5 | ||
|
|
c98eb64598 | ||
|
|
8836bd4f3b | ||
|
|
a58df29208 | ||
|
|
0d64a17d86 | ||
|
|
c886c09cdb | ||
|
|
e86d0007c6 | ||
|
|
624ee76e71 | ||
|
|
9406079cb7 | ||
|
|
cd2de7f893 | ||
|
|
342061803e | ||
|
|
05b8111c19 | ||
|
|
747a0b1791 | ||
|
|
c05586b53a | ||
|
|
0cfca4a618 | ||
|
|
2b8187f7ab | ||
|
|
291e7e7943 | ||
|
|
535d10f469 | ||
|
|
4cb58c0892 | ||
|
|
6721d27e3f | ||
|
|
da9dd7c423 | ||
|
|
867eb41618 | ||
|
|
6fdff13480 | ||
|
|
e581ead1ed | ||
|
|
7495206db2 | ||
|
|
fe87d16d46 | ||
|
|
0db54386cd | ||
|
|
772258b0b8 | ||
|
|
3ef002e14d | ||
|
|
b90d473ae5 | ||
|
|
f5091d524b | ||
|
|
ee5720df2c | ||
|
|
afe2037985 | ||
|
|
878cd18144 | ||
|
|
e8c8f67a09 | ||
|
|
7b29e7cf7e | ||
|
|
723d3e6871 | ||
|
|
f063dee12a | ||
|
|
db4b315d3d | ||
|
|
64d00b08a3 | ||
|
|
74736a941e | ||
|
|
c40366f20a | ||
|
|
d73e52ac2a | ||
|
|
9fac8a611f | ||
|
|
9c774a50f8 | ||
|
|
4f20ee1909 | ||
|
|
1440c5bc65 | ||
|
|
5829b2a7c1 | ||
|
|
e3c4bc18d0 | ||
|
|
8555ec2f72 | ||
|
|
8d7cefbbbe | ||
|
|
5aa5896b22 | ||
|
|
8a55bdd89d | ||
|
|
6444ef6444 | ||
|
|
701ab6cc68 | ||
|
|
3c6ce7a943 | ||
|
|
1e54afd217 | ||
|
|
4e90fd3a06 | ||
|
|
0463c6bb0f | ||
|
|
f31f986d66 | ||
|
|
c203c8302b | ||
|
|
dea4a7b389 | ||
|
|
0caf9b0706 | ||
|
|
5f655c9fd7 | ||
|
|
44aed53998 | ||
|
|
f9ff621d4a | ||
|
|
23a5a75778 | ||
|
|
a78475844a | ||
|
|
575cf2935e | ||
|
|
ae43aa1bc0 | ||
|
|
0ba71c6a47 | ||
|
|
643f7d1803 | ||
|
|
5d06da4db2 | ||
|
|
2934b09361 | ||
|
|
97341d3fa0 | ||
|
|
a95546ede0 | ||
|
|
7b44727b23 | ||
|
|
debe648a98 | ||
|
|
fda8cf77ed | ||
|
|
8aaab195c6 | ||
|
|
4096ddcbd0 | ||
|
|
ae6cc11ad2 | ||
|
|
dab7e527de | ||
|
|
8b92feac71 | ||
|
|
4beb3e5755 | ||
|
|
55f63229cd | ||
|
|
7827aeb695 | ||
|
|
cce768aaac | ||
|
|
80b83c0624 | ||
|
|
73b683bb4d | ||
|
|
d78a5c0863 | ||
|
|
683e5b6abe | ||
|
|
653b8f6352 | ||
|
|
9ec6afa375 | ||
|
|
adff5382ca | ||
|
|
704aabd703 | ||
|
|
f7b1ef0690 | ||
|
|
929982117f | ||
|
|
56a530d769 | ||
|
|
7ef75fb06b | ||
|
|
112a72abdf | ||
|
|
71813e03ee | ||
|
|
9b05b6ef28 | ||
|
|
54a87b25b3 | ||
|
|
55e97864bd | ||
|
|
95733c9490 | ||
|
|
e19ae644f1 | ||
|
|
ac4ea25267 | ||
|
|
611e4f34dc | ||
|
|
faf017f333 | ||
|
|
5eec896615 | ||
|
|
17f35174ea | ||
|
|
bf71b31123 | ||
|
|
9399a44c82 | ||
|
|
c96418806f | ||
|
|
7945eddef6 | ||
|
|
0ede390fef | ||
|
|
85959a3b9b | ||
|
|
946c3a25b9 | ||
|
|
f9d697128a | ||
|
|
532ef744f4 | ||
|
|
27a961814b | ||
|
|
5a5b65e9bf | ||
|
|
96673ad610 | ||
|
|
a9025aea0d | ||
|
|
f38ab0b973 | ||
|
|
150dac00cf | ||
|
|
bcb1a9c5d3 | ||
|
|
2e55aea584 | ||
|
|
4f5a3f0df5 | ||
|
|
e265b538cc | ||
|
|
b186504718 | ||
|
|
fc27890f13 | ||
|
|
a583939767 | ||
|
|
52e3bcfd29 | ||
|
|
85d29a3f9d | ||
|
|
18944d389d | ||
|
|
e90ac5d6a4 | ||
|
|
cb9a6ae774 | ||
|
|
3ef09aa6b2 | ||
|
|
4db22e45a2 | ||
|
|
f966d0b32c | ||
|
|
ba3879a95a | ||
|
|
c6cef0162d | ||
|
|
6d09aa86e9 | ||
|
|
b711f0f9c6 | ||
|
|
8fefb3a4c9 | ||
|
|
400cdf0f26 | ||
|
|
bce8c5a315 | ||
|
|
f44dc2dd05 | ||
|
|
df950d2fc5 | ||
|
|
5e1f804dd1 | ||
|
|
15de89f2f9 | ||
|
|
df647a415c | ||
|
|
fc66231f8e | ||
|
|
71df3e1566 | ||
|
|
168c22fc98 | ||
|
|
792ec23d7a | ||
|
|
ff625253ce | ||
|
|
8c872c6b22 | ||
|
|
541f5bc0a6 | ||
|
|
77ff7b9df0 | ||
|
|
203cc5075e | ||
|
|
7abfcd06da | ||
|
|
724f81c7f3 | ||
|
|
4d2e98af7b | ||
|
|
08221fdda7 | ||
|
|
c0f72970b9 | ||
|
|
18bc4a49e8 | ||
|
|
f90b6dbed4 | ||
|
|
d2d991ff34 | ||
|
|
190a5e175b | ||
|
|
a05f5a91b8 | ||
|
|
4d02ff27be | ||
|
|
df92b41d25 | ||
|
|
075af96338 | ||
|
|
64bbc55336 | ||
|
|
06c621acc1 | ||
|
|
d040dc19bc | ||
|
|
a38ae4a402 | ||
|
|
772063aade | ||
|
|
31c26354c5 | ||
|
|
64b331c5b2 | ||
|
|
94f8a145ec | ||
|
|
b357afa30a | ||
|
|
fee0437493 | ||
|
|
663b8864c1 | ||
|
|
c6eafdde30 | ||
|
|
f32ff95256 | ||
|
|
0452b75c3e | ||
|
|
97efd23ec8 | ||
|
|
ea3e311528 | ||
|
|
0565454419 | ||
|
|
35c79c2f29 | ||
|
|
e6089aec48 | ||
|
|
dd3f7834c3 | ||
|
|
f8cf18d880 | ||
|
|
2ac7e242b6 | ||
|
|
d8b604a94f | ||
|
|
a1f7b00981 | ||
|
|
b7ee42198c | ||
|
|
d66e4b7ff9 | ||
|
|
7f9789cf65 | ||
|
|
b41c18e033 | ||
|
|
3c73a7ec6d | ||
|
|
182c09d952 | ||
|
|
9fb86aed04 | ||
|
|
b8f7b13b05 | ||
|
|
1ee1d5b6d1 | ||
|
|
154c38c314 | ||
|
|
3c0626752a | ||
|
|
511ef77fb7 | ||
|
|
4df3ede500 | ||
|
|
e83c080af8 | ||
|
|
054220db70 | ||
|
|
97bff010a8 | ||
|
|
487a3079cd | ||
|
|
2d5158c680 | ||
|
|
837be06b72 | ||
|
|
7e0d8dd4d7 | ||
|
|
146fb23d7d | ||
|
|
61455ffe29 | ||
|
|
c267baafdc | ||
|
|
42248a306a | ||
|
|
694ec7ebe1 | ||
|
|
e3b3f8fac1 | ||
|
|
b390363b25 | ||
|
|
f6f8cdbcf2 | ||
|
|
f46f53b8a3 | ||
|
|
a2fcae4383 | ||
|
|
483f043768 | ||
|
|
f8e0f4f21f | ||
|
|
9c3613e96d | ||
|
|
d9cacdc86d | ||
|
|
aa3d2deeaa | ||
|
|
e64912545a | ||
|
|
b247be80cc | ||
|
|
343f2f1f33 | ||
|
|
2d590df900 | ||
|
|
ba56b2b9fd | ||
|
|
bf472b0c5e | ||
|
|
f7961f34c5 | ||
|
|
e369031a28 | ||
|
|
186d7bbfd9 | ||
|
|
60a11f8da5 | ||
|
|
1181fcdceb | ||
|
|
8cb9852058 | ||
|
|
53d46d1cbe | ||
|
|
275e1c8de9 | ||
|
|
d46eca4c87 | ||
|
|
2927fb1597 | ||
|
|
8c72e011d2 | ||
|
|
69662e24c3 | ||
|
|
96099ffe98 | ||
|
|
ae16b45c11 | ||
|
|
cfee87d3ef | ||
|
|
5fcf5bc635 | ||
|
|
14bcb813cc | ||
|
|
6af19794b6 | ||
|
|
8316186695 | ||
|
|
85d3023cd5 | ||
|
|
78414dee29 | ||
|
|
084135141f | ||
|
|
467a21f028 | ||
|
|
6e284c44d6 | ||
|
|
daf9a449e8 | ||
|
|
960268fd33 | ||
|
|
8c331da315 | ||
|
|
b0d626d862 | ||
|
|
a51fbd7316 | ||
|
|
063f372f3c | ||
|
|
987168b863 | ||
|
|
4ee40c3345 | ||
|
|
654daff7ce | ||
|
|
64e10e9619 | ||
|
|
b89cffe98d | ||
|
|
bd76ba702f | ||
|
|
5d52e9ce6b | ||
|
|
3c29027ca3 | ||
|
|
2ff3069d23 | ||
|
|
4198246351 | ||
|
|
2b6389b4dc | ||
|
|
d7df75ae6c | ||
|
|
11c30eccb3 | ||
|
|
ab8c6515b8 | ||
|
|
d4ad36fa41 | ||
|
|
4d688be3df | ||
|
|
d2b75f3501 | ||
|
|
46b78cb4ff | ||
|
|
5d6e0d0f37 | ||
|
|
e19d0a37bb | ||
|
|
dea3e2132e | ||
|
|
91c1ceefbd | ||
|
|
5c50989970 | ||
|
|
2a7e3b9c51 | ||
|
|
ab302df0ae | ||
|
|
21e5809993 | ||
|
|
155da0c6a3 | ||
|
|
c58afc67e8 | ||
|
|
8e344f2deb | ||
|
|
c28f4ffb3f | ||
|
|
2a40240310 | ||
|
|
0e9fba9287 | ||
|
|
2e3dd2a30a | ||
|
|
dda5f6559d | ||
|
|
4152e59638 | ||
|
|
9d5a92bce6 | ||
|
|
30172b92e6 | ||
|
|
8468a9d4c7 | ||
|
|
626cfb61ac | ||
|
|
9603f3fa4f | ||
|
|
619a1b9e53 | ||
|
|
62e76ad588 | ||
|
|
236d72685d | ||
|
|
72a5f7b1e2 | ||
|
|
d1c16a90b4 | ||
|
|
33a9783ae5 | ||
|
|
4d64fd665e | ||
|
|
96443384fe | ||
|
|
69939f1edb | ||
|
|
e3c0058942 | ||
|
|
3dc2361654 | ||
|
|
ec2f709018 | ||
|
|
ea06665c51 | ||
|
|
83b7010d6a | ||
|
|
71654cbe47 | ||
|
|
e8f96e848a | ||
|
|
251abf21d4 | ||
|
|
d103427932 | ||
|
|
74a4bd704c | ||
|
|
c62f3e0e45 | ||
|
|
a56a969433 | ||
|
|
1016f94bbb | ||
|
|
e98cce9aee | ||
|
|
d4bdb5d327 | ||
|
|
db4378415e | ||
|
|
9b594880c8 | ||
|
|
d44fc3db2f | ||
|
|
5133b0a0c0 | ||
|
|
815469304f | ||
|
|
c651921c79 | ||
|
|
d18c835221 | ||
|
|
e38335077e | ||
|
|
34c150cf73 | ||
|
|
24cb3ba091 | ||
|
|
c07eaef2d1 | ||
|
|
5df708ac9f | ||
|
|
38ffbe95e9 | ||
|
|
8bec4042fc | ||
|
|
ee7ef89dfb | ||
|
|
54a5246061 | ||
|
|
fa6eae2937 | ||
|
|
795be20ee1 | ||
|
|
87d3a06dcd | ||
|
|
8b5c917195 | ||
|
|
c7da0e59ff | ||
|
|
eb14acbe0c | ||
|
|
56860a6bef | ||
|
|
735687be21 | ||
|
|
592cdfa910 | ||
|
|
f2ad1a0406 | ||
|
|
fab0cc51b3 | ||
|
|
3a26acbdb2 | ||
|
|
8d0c31bcda | ||
|
|
0b99293d4c | ||
|
|
802153ff9b | ||
|
|
ec73e2d237 | ||
|
|
c32b020535 | ||
|
|
c4441804e2 | ||
|
|
6c9d80d4e8 | ||
|
|
a231f8d26c | ||
|
|
82af9320c0 | ||
|
|
fceebf7388 | ||
|
|
08da258b63 | ||
|
|
5994926440 | ||
|
|
30f2da4215 | ||
|
|
1a2229f886 | ||
|
|
1e166490d9 | ||
|
|
1c57e6f80a | ||
|
|
a6537a8748 | ||
|
|
842b75977b | ||
|
|
9b3dccf60c | ||
|
|
2d533e0cd8 | ||
|
|
9e1925c808 | ||
|
|
142d59be85 | ||
|
|
d9a5e06b5b | ||
|
|
b6889e9ac6 | ||
|
|
dc82203e9b | ||
|
|
6a30d32e7d | ||
|
|
d9780606b3 | ||
|
|
fffa32df48 | ||
|
|
cad49892d3 | ||
|
|
f0a29721c9 | ||
|
|
13caf37991 | ||
|
|
b71a602107 | ||
|
|
e6ce0dd43a | ||
|
|
094a5214f1 | ||
|
|
0932fcd114 | ||
|
|
f26643cea3 | ||
|
|
63b1689155 | ||
|
|
59dc929431 | ||
|
|
deaadc33db | ||
|
|
0ba92a4f29 | ||
|
|
7dc5009ec7 | ||
|
|
0ee827afd3 | ||
|
|
551d1b7f86 | ||
|
|
7ed1b695f5 | ||
|
|
7ad31b9b33 | ||
|
|
edd8992f7f | ||
|
|
96fe42cfcb | ||
|
|
c3872b4a38 | ||
|
|
762945113d | ||
|
|
037e9230fc | ||
|
|
3f59ebf986 | ||
|
|
e51e1d2b09 | ||
|
|
26cc49eb69 | ||
|
|
7987bb491c | ||
|
|
16b7ac5a87 | ||
|
|
5932cb8609 | ||
|
|
dfe694d39f | ||
|
|
278624f2c8 | ||
|
|
899f42c070 | ||
|
|
8ce1d4d6a3 | ||
|
|
52225d703b | ||
|
|
81739af7cb | ||
|
|
25473222cc | ||
|
|
0b7be70935 | ||
|
|
818b71abd6 | ||
|
|
25575e8510 | ||
|
|
6c85adcf23 | ||
|
|
5dc92d7a40 | ||
|
|
4e2b966b80 | ||
|
|
d34f8c3cb9 | ||
|
|
9049ecb1cf | ||
|
|
7bebea087c | ||
|
|
1c79e30436 | ||
|
|
1d7933349b | ||
|
|
d002f67140 | ||
|
|
da3447765b | ||
|
|
cbf5663179 | ||
|
|
b217fba235 | ||
|
|
7f7e6d5aba | ||
|
|
87c5a9d9a6 | ||
|
|
8ca1fe3f0a | ||
|
|
763ae8f1a6 | ||
|
|
c65256d02b | ||
|
|
bd2ac515d1 | ||
|
|
681f372889 | ||
|
|
c2eec272e6 | ||
|
|
bd720491a9 | ||
|
|
a408226509 | ||
|
|
c015e99e6e | ||
|
|
de47a17be7 | ||
|
|
d38fc490ad | ||
|
|
662167e792 | ||
|
|
36c91f03d9 | ||
|
|
33ccee26b5 | ||
|
|
ed5cb991e3 | ||
|
|
bea84ec2bf | ||
|
|
08c176e549 | ||
|
|
810ed50976 | ||
|
|
2684541693 | ||
|
|
a5b12bac54 | ||
|
|
fea1b06e43 | ||
|
|
182ca5d434 | ||
|
|
facde9a75d | ||
|
|
41385640b9 | ||
|
|
7bad9db32e | ||
|
|
af66f0a497 | ||
|
|
95e1b80f41 | ||
|
|
556e2eba95 | ||
|
|
efe530cb17 | ||
|
|
34e7c99283 | ||
|
|
4157ea8bc3 | ||
|
|
550517bbf3 | ||
|
|
eb910cd8a1 | ||
|
|
75131c4e8a | ||
|
|
ee29ab95be | ||
|
|
e97951fc51 | ||
|
|
dfabdef60f | ||
|
|
5a87763193 | ||
|
|
6bb90f56fa | ||
|
|
c883ae1350 | ||
|
|
09e25e6a02 | ||
|
|
bf5d43054b | ||
|
|
63b3c65691 | ||
|
|
f193da7f67 | ||
|
|
40f38c2c0a | ||
|
|
db439ef804 | ||
|
|
56eb896a03 | ||
|
|
68d43e43b6 | ||
|
|
c60517e49a | ||
|
|
3f59d261f2 | ||
|
|
4068d220e5 | ||
|
|
18968e7208 | ||
|
|
38656103c0 | ||
|
|
0f65b1bcc5 | ||
|
|
a628821834 | ||
|
|
6ceff60c1e | ||
|
|
d762a6ce58 | ||
|
|
75a8037a46 | ||
|
|
1179920790 | ||
|
|
b323a160e3 | ||
|
|
b157e9535e | ||
|
|
7668475bd6 | ||
|
|
8bda2a1fb7 | ||
|
|
b092086b5b | ||
|
|
69a0d9034f | ||
|
|
f5be8fd313 | ||
|
|
7f835d7f76 | ||
|
|
ddbb7c5993 | ||
|
|
00a3fe39e8 | ||
|
|
7537fb88d4 | ||
|
|
a81bc71a1e | ||
|
|
0a0aa0e2db | ||
|
|
c56b94ae96 | ||
|
|
e90712706d | ||
|
|
eb0623331f | ||
|
|
d15bd59109 | ||
|
|
60e0b19372 | ||
|
|
922eb937ff | ||
|
|
87573284f1 | ||
|
|
a91c585f55 | ||
|
|
953ea21d5e | ||
|
|
ecb00968bc | ||
|
|
50ad8adb2d | ||
|
|
16878caf09 | ||
|
|
5bc30c5493 | ||
|
|
85d89cf4c4 | ||
|
|
db693f598b | ||
|
|
0494c770a1 | ||
|
|
c473b62aed | ||
|
|
f19ac5320e | ||
|
|
612e3aafbc | ||
|
|
0e97fec451 | ||
|
|
e8c8626ee4 | ||
|
|
d89e0f07f8 | ||
|
|
e7f81a42ce | ||
|
|
ac614148b8 | ||
|
|
5eb02b4901 | ||
|
|
65631525f6 | ||
|
|
969435cfe9 | ||
|
|
c932f7a25b | ||
|
|
42d164dc57 | ||
|
|
a7e60f80bd | ||
|
|
3dd5f313b7 | ||
|
|
883962c393 | ||
|
|
8a30ff1c76 | ||
|
|
e47c354916 | ||
|
|
496f42805d | ||
|
|
c3d34bda37 | ||
|
|
bb6ede2b8f | ||
|
|
822400a1ba | ||
|
|
e3e08843f1 | ||
|
|
ce0d4f77fa | ||
|
|
94fdb4e974 | ||
|
|
4d425fc8a4 | ||
|
|
c6cdfa2f5a | ||
|
|
0fff2e4f16 | ||
|
|
80a2172715 | ||
|
|
5a0a297634 | ||
|
|
948a133b7b | ||
|
|
2ee826c958 | ||
|
|
539409faf8 | ||
|
|
606e46e4d7 | ||
|
|
a179cfd69a | ||
|
|
d8379253d4 | ||
|
|
c3344fbd68 | ||
|
|
4cebd6e84a | ||
|
|
90fbf9dbb0 | ||
|
|
d365b9f634 | ||
|
|
a2f06acaa4 | ||
|
|
8c90cbcbfb | ||
|
|
a4a47772dc | ||
|
|
5dde1f4602 | ||
|
|
9dc0909eeb | ||
|
|
0ed2592e41 | ||
|
|
76cff98220 | ||
|
|
60604b6f51 | ||
|
|
f410b7aecb | ||
|
|
1a61f2cee9 | ||
|
|
78a8293520 | ||
|
|
03cfb4fc8d | ||
|
|
144345a359 | ||
|
|
fd2c01515e | ||
|
|
219570e08b | ||
|
|
69df556ff5 | ||
|
|
5f4a52574f | ||
|
|
5a1f6c5839 | ||
|
|
91d0342fe8 | ||
|
|
8cc236daf8 | ||
|
|
d283ec69f7 | ||
|
|
d1aea7596c | ||
|
|
c934987b14 | ||
|
|
00c9f4a2e5 | ||
|
|
6605c1d07f | ||
|
|
7325d66c52 | ||
|
|
a485061e22 | ||
|
|
1f63f50343 | ||
|
|
cd3170dabd | ||
|
|
841cedc5f8 | ||
|
|
7f4882734d | ||
|
|
e7d647d412 | ||
|
|
913d14a58a | ||
|
|
909272ec3d | ||
|
|
7af40ffbbe | ||
|
|
9df79a3ec9 | ||
|
|
4f2eee06aa | ||
|
|
1b9cf76008 | ||
|
|
d035a43ed6 | ||
|
|
95ee9a6e09 | ||
|
|
02a63cdcb3 | ||
|
|
f02125dd47 | ||
|
|
c11e813146 | ||
|
|
a365849048 | ||
|
|
a493c9f769 | ||
|
|
a13f522b2a |
@@ -4,14 +4,9 @@ executors:
|
||||
default:
|
||||
working_directory: /tmp/workspace
|
||||
docker:
|
||||
- image: misskey/ci:latest
|
||||
- image: circleci/mongo:latest
|
||||
with-redis:
|
||||
working_directory: /tmp/workspace
|
||||
docker:
|
||||
- image: misskey/ci:latest
|
||||
- image: circleci/mongo:latest
|
||||
- image: misskey/ci:v11-node11
|
||||
- image: circleci/redis:latest
|
||||
- image: circleci/postgres:latest
|
||||
docker:
|
||||
working_directory: /tmp/workspace
|
||||
docker:
|
||||
@@ -62,22 +57,10 @@ jobs:
|
||||
executor:
|
||||
type: string
|
||||
default: "default"
|
||||
without_redis:
|
||||
type: boolean
|
||||
default: false
|
||||
executor: <<parameters.executor>>
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: /tmp/workspace
|
||||
- when:
|
||||
condition: <<parameters.without_redis>>
|
||||
steps:
|
||||
- run:
|
||||
name: Configure
|
||||
command: |
|
||||
mv .config/test.yml .config/test_redis.yml
|
||||
touch .config/test.yml
|
||||
cat .config/test_redis.yml | while IFS= read line; do if [[ "$line" = '# __REDIS__' ]]; then break; else echo "$line" >> .config/test.yml; fi; done
|
||||
- run:
|
||||
name: Test
|
||||
command: |
|
||||
@@ -140,32 +123,14 @@ workflows:
|
||||
branches:
|
||||
only: master
|
||||
- test:
|
||||
name: manual-test-with-redis
|
||||
executor: with-redis
|
||||
name: manual-test
|
||||
requires:
|
||||
- manual-build
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- test:
|
||||
name: auto-test-without-redis
|
||||
executor: with-redis
|
||||
requires:
|
||||
- auto-build
|
||||
filters:
|
||||
branches:
|
||||
only: master
|
||||
- test:
|
||||
name: manual-test-with-redis
|
||||
without_redis: true
|
||||
requires:
|
||||
- manual-build
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- test:
|
||||
name: auto-test-without-redis
|
||||
without_redis: true
|
||||
name: auto-test
|
||||
requires:
|
||||
- auto-build
|
||||
filters:
|
||||
|
||||
@@ -6,8 +6,6 @@ mongodb:
|
||||
db: misskey
|
||||
user: syuilo
|
||||
pass: ''
|
||||
drive:
|
||||
storage: 'db'
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
|
||||
@@ -6,8 +6,6 @@ mongodb:
|
||||
db: test-misskey
|
||||
user: admin
|
||||
pass: ''
|
||||
drive:
|
||||
storage: 'db'
|
||||
# __REDIS__
|
||||
redis:
|
||||
host: localhost
|
||||
|
||||
4
.config/docker_example.env
Normal file
4
.config/docker_example.env
Normal file
@@ -0,0 +1,4 @@
|
||||
# db settings
|
||||
POSTGRES_PASSWORD=example-misskey-pass
|
||||
POSTGRES_USER=example-misskey-user
|
||||
POSTGRES_DB=misskey
|
||||
@@ -1,8 +1,16 @@
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌─────┐
|
||||
#───┘ URL └─────────────────────────────────────────────────────
|
||||
|
||||
# Final accessible URL seen by a user.
|
||||
url: https://example.tld/
|
||||
|
||||
# ┌───────────────────────┐
|
||||
#───┘ Port and TLS settings └───────────────────────────────────
|
||||
|
||||
### Port and TLS settings ######################################
|
||||
#
|
||||
# Misskey supports two deployment options for public.
|
||||
#
|
||||
@@ -30,86 +38,83 @@ url: https://example.tld/
|
||||
# You need to set Certificate in 'https' section.
|
||||
|
||||
# To use option 1, uncomment below line.
|
||||
# port: 3000 # A port that your Misskey server should listen.
|
||||
#port: 3000 # A port that your Misskey server should listen.
|
||||
|
||||
# To use option 2, uncomment below lines.
|
||||
# port: 443
|
||||
#
|
||||
# https:
|
||||
# # path for certification
|
||||
# key: /etc/letsencrypt/live/example.tld/privkey.pem
|
||||
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
|
||||
#port: 443
|
||||
|
||||
################################################################
|
||||
#https:
|
||||
# # path for certification
|
||||
# key: /etc/letsencrypt/live/example.tld/privkey.pem
|
||||
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||
|
||||
mongodb:
|
||||
db:
|
||||
host: localhost
|
||||
port: 27017
|
||||
port: 5432
|
||||
|
||||
# Database name
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
user: example-misskey-user
|
||||
pass: example-misskey-pass
|
||||
|
||||
drive:
|
||||
storage: 'db'
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
||||
# OR
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl: true
|
||||
|
||||
# storage: 'minio'
|
||||
# bucket:
|
||||
# prefix:
|
||||
# config:
|
||||
# endPoint:
|
||||
# port:
|
||||
# useSSL:
|
||||
# accessKey:
|
||||
# secretKey:
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
|
||||
# S3 example
|
||||
# storage: 'minio'
|
||||
# bucket: bucket-name
|
||||
# prefix: files
|
||||
# config:
|
||||
# endPoint: s3-us-west-2.amazonaws.com
|
||||
# region: us-west-2
|
||||
# useSSL: true
|
||||
# accessKey: XXX
|
||||
# secretKey: YYY
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
#pass: example-pass
|
||||
|
||||
# S3 example (with CDN, custom domain)
|
||||
# storage: 'minio'
|
||||
# bucket: drive.example.com
|
||||
# prefix: files
|
||||
# baseUrl: https://drive.example.com
|
||||
# config:
|
||||
# endPoint: s3-us-west-2.amazonaws.com
|
||||
# region: us-west-2
|
||||
# useSSL: true
|
||||
# accessKey: XXX
|
||||
# secretKey: YYY
|
||||
# ┌─────────────────────────────┐
|
||||
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||
|
||||
# If enabled:
|
||||
# The first account created is automatically marked as Admin.
|
||||
autoAdmin: true
|
||||
|
||||
#
|
||||
# Below settings are optional
|
||||
#
|
||||
|
||||
# Redis
|
||||
#redis:
|
||||
# host: localhost
|
||||
# port: 6379
|
||||
# pass: example-pass
|
||||
|
||||
# Elasticsearch
|
||||
#elasticsearch:
|
||||
# host: localhost
|
||||
# port: 9200
|
||||
# pass: null
|
||||
|
||||
# ┌───────────────┐
|
||||
#───┘ ID generation └───────────────────────────────────────────
|
||||
|
||||
# You can select the ID generation method.
|
||||
# You don't usually need to change this setting, but you can
|
||||
# change it according to your preferences.
|
||||
|
||||
# Available methods:
|
||||
# aid ... Short, Millisecond accuracy
|
||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||
# ulid ... Millisecond accuracy
|
||||
# objectid ... This is left for backward compatibility
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
# ID SETTINGS AFTER THAT!
|
||||
|
||||
id: 'aid'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
# If enabled:
|
||||
# The first account created is automatically marked as Admin.
|
||||
autoAdmin: true
|
||||
|
||||
# Whether disable HSTS
|
||||
#disableHsts: true
|
||||
|
||||
# Clustering
|
||||
#clusterLimit: 1
|
||||
|
||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||
#outgoingAddressFamily: ipv4
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
var user = {
|
||||
user: 'example-misskey-user',
|
||||
pwd: 'example-misskey-pass',
|
||||
roles: [
|
||||
{
|
||||
role: 'readWrite',
|
||||
db: 'misskey'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
db.createUser(user);
|
||||
|
||||
6
.dockerignore
Executable file → Normal file
6
.dockerignore
Executable file → Normal file
@@ -5,8 +5,8 @@
|
||||
.vscode
|
||||
Dockerfile
|
||||
build/
|
||||
db/
|
||||
docker-compose.yml
|
||||
node_modules/
|
||||
mongo/
|
||||
redis/
|
||||
elasticsearch/
|
||||
node_modules/
|
||||
redis/
|
||||
|
||||
4
.github/CODEOWNERS
vendored
4
.github/CODEOWNERS
vendored
@@ -1,7 +1,7 @@
|
||||
# PATH OWNERS
|
||||
/.autogen/ @acid-chicken
|
||||
/.circleci/ @syuilo @acid-chicken
|
||||
/.config/ @syuilo @AyaMorisawa @mei23 @acid-chicken
|
||||
/.config/ @syuilo @AyaMorisawa @mei23 @acid-chicken @rinsuki
|
||||
# /.config/mongo_initdb_example.js @khws4v1
|
||||
/.github/ @syuilo @AyaMorisawa @acid-chicken
|
||||
/.vscode/ @acid-chicken
|
||||
@@ -12,7 +12,7 @@
|
||||
# /docs/*.fr.md @BoFFire
|
||||
# /docs/docker.*.md @khws4v1
|
||||
/locales/ @syuilo
|
||||
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken
|
||||
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken @rinsuki
|
||||
# /src/crypto_key.cc @akihikodaki
|
||||
# /src/crypto_key.d.ts @akihikodaki
|
||||
/.dockerignore @syuilo # @khws4v1
|
||||
|
||||
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
patreon: syuilo
|
||||
14
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
14
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
@@ -1,30 +1,30 @@
|
||||
---
|
||||
name: Bug Report
|
||||
name: 🐛 Bug Report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug
|
||||
labels: ⚠️bug?
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
## 💡 Summary
|
||||
|
||||
<!-- Tell us what the bug is -->
|
||||
|
||||
# Expected Behavior
|
||||
## 🙂 Expected Behavior
|
||||
|
||||
<!--- Tell us what should happen -->
|
||||
|
||||
# Actual Behavior
|
||||
## ☹️ Actual Behavior
|
||||
|
||||
<!--- Tell us what happens instead of the expected behavior -->
|
||||
|
||||
# Steps to Reproduce
|
||||
## 📝 Steps to Reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
# Environment
|
||||
## 📌 Environment
|
||||
|
||||
<!-- Tell us where on the platform it happens -->
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
---
|
||||
name: Client-side Bug Report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug, client-side
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
<!-- Tell us what the bug is -->
|
||||
|
||||
# Expected Behavior
|
||||
|
||||
<!--- Tell us what should happen -->
|
||||
|
||||
# Actual Behavior
|
||||
|
||||
<!--- Tell us what happens instead of the expected behavior -->
|
||||
|
||||
# Steps to Reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
# Environment
|
||||
|
||||
<!-- Tell us where on the platform it happens -->
|
||||
<!-- e.g. desktop or mobile version, your browser, your OS -->
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
name: Feature Request
|
||||
name: ✨ Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: feature
|
||||
labels: ✨Feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
## Summary
|
||||
|
||||
<!-- Tell us what the suggestion is -->
|
||||
@@ -1,31 +0,0 @@
|
||||
---
|
||||
name: Server-side Bug Report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug, server-side
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
<!-- Tell us what the bug is -->
|
||||
|
||||
# Expected Behavior
|
||||
|
||||
<!--- Tell us what should happen -->
|
||||
|
||||
# Actual Behavior
|
||||
|
||||
<!--- Tell us what happens instead of the expected behavior -->
|
||||
|
||||
# Steps to Reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
# Environment
|
||||
|
||||
<!-- Tell us where on the platform it happens -->
|
||||
<!-- e.g. your Node.js version, your OS -->
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
name: Client-side Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: client-side, feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
<!-- Tell us what the suggestion is -->
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
name: Server-side Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: feature, server-side
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
<!-- Tell us what the suggestion is -->
|
||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,4 +1,4 @@
|
||||
# Summary
|
||||
## Summary
|
||||
|
||||
<!--
|
||||
-
|
||||
|
||||
25
.gitignore
vendored
25
.gitignore
vendored
@@ -1,21 +1,34 @@
|
||||
# Visual Studio Code
|
||||
/.vscode
|
||||
|
||||
# Intelij-IDEA
|
||||
/.idea
|
||||
|
||||
# Node.js
|
||||
/node_modules
|
||||
|
||||
# yarn
|
||||
yarn.lock
|
||||
|
||||
# config
|
||||
/.config/*
|
||||
!/.config/example.yml
|
||||
!/.config/mongo_initdb_example.js
|
||||
/.vscode
|
||||
/node_modules
|
||||
|
||||
# misskey
|
||||
/build
|
||||
/built
|
||||
built
|
||||
/data
|
||||
/.cache-loader
|
||||
/db
|
||||
/elasticsearch
|
||||
npm-debug.log
|
||||
*.pem
|
||||
run.bat
|
||||
api-docs.json
|
||||
*.log
|
||||
/redis
|
||||
/mongo
|
||||
/elasticsearch
|
||||
*.code-workspace
|
||||
yarn.lock
|
||||
.DS_Store
|
||||
/files
|
||||
ormconfig.json
|
||||
|
||||
@@ -1 +1 @@
|
||||
v11.7.0
|
||||
v12.1.0
|
||||
|
||||
702
CHANGELOG.md
702
CHANGELOG.md
@@ -1,6 +1,708 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
If you encounter any problems with updating, please try the following:
|
||||
1. `npm run clean` or `npm run cleanall`
|
||||
2. Retry update (Don't forget `npm i`)
|
||||
|
||||
Migration
|
||||
------------------------------
|
||||
#### 1
|
||||
```
|
||||
npm i -g ts-node
|
||||
```
|
||||
|
||||
#### 2
|
||||
```
|
||||
npm run migrate
|
||||
```
|
||||
|
||||
11.22.0 (2019/06/18)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* 管理画面でデータベースの各テーブルのレコード数やサイズを確認できるように
|
||||
* サーバー情報にPostgreSQLのバージョンを追加
|
||||
|
||||
### 🐛Fixes
|
||||
* リモートファイルのダウンロードに失敗することがある問題を修正
|
||||
* アンケートの期間を日時指定で選択すると日時がUTCになってしまう問題を修正
|
||||
* MFMのパースを修正
|
||||
|
||||
11.21.0 (2019/06/16)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* Unicode 12.0 の絵文字に対応
|
||||
* 閉鎖しているホストにはAP deliverしないように
|
||||
* image以外はproxyしないように
|
||||
|
||||
### 🐛Fixes
|
||||
* サムネイル生成でエラーになるとファイルのアップロードに失敗する問題を修正
|
||||
* オートコンプリートにアニメーション停止が効かない問題を修正
|
||||
|
||||
11.20.4 (2019/06/13)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* 検索結果がループする問題を修正
|
||||
* 設定でPostgreSQLのクエリー結果のキャッシュを無効できるように
|
||||
* 「投稿内の動きのあるテキストを無効にする」だけ反応しない問題を修正
|
||||
* 特定の操作のデータベースのパフォーマンス調整
|
||||
|
||||
11.20.3 (2019/06/10)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* 絵文字サジェストが動作しなくなっていた問題を修正
|
||||
|
||||
11.20.2 (2019/06/10)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* Redisにパスワードを設定している場合接続できない問題を修正
|
||||
* i18n
|
||||
* など
|
||||
|
||||
11.20.1 (2019/06/07)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* リモートファイルのキャッシュをすべて削除するときの動作を修正
|
||||
* ストリームのハッシュタグチャンネルが死んでいる問題を修正
|
||||
* Pagesから他の同一インスタンス内のPagesのページへのリンクができない問題を修正
|
||||
* /api/notes/create 公開範囲private を渡すとタイムアウトする問題を修正
|
||||
* パスワードの確認が完了しなくてもユーザー登録できる問題を修正
|
||||
* 依存関係の更新
|
||||
* i18n
|
||||
|
||||
11.20.0 (2019/05/27)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* 管理画面からリモートファイルのキャッシュをすべて削除できるように
|
||||
* 投稿フォームに投稿のURLをペーストしようとすると引用RNにできるように
|
||||
* モバイル版の投稿フォームにファイルをドロップできるように
|
||||
* モバイル版でも投稿の下書き自動保存ができるように
|
||||
* リモートファイルのキャッシュが期限切れになったときにサムネイルが無くならないように
|
||||
* ジョブキュー管理画面を強化
|
||||
|
||||
### 🐛Fixes
|
||||
* 投稿内のローカルなURLプレビューをクリックしたとき not found になることがある問題を修正
|
||||
* デスクトップでユーザーページに遷移するときページが再度読み込みされることがある問題を修正
|
||||
* フォロー申請自動承認オプションが常にオフで表示される問題を修正
|
||||
* ポートを設定せずに起動したときに適切なエラーメッセージが表示されない問題を修正
|
||||
* i18n
|
||||
|
||||
11.19.1 (2019/05/26)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* タグページを遷移してもタイムラインが変わらない問題を修正
|
||||
* インスタンス名を空にしてもMisskeyロゴが表示されない問題を修正
|
||||
* 投稿内のローカルなURLをクリックしたとき not found になることがある問題を修正
|
||||
* npm run init がプロセス終了しない問題を修正
|
||||
|
||||
11.19.0 (2019/05/25)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* グループのオーナーを変えられるように
|
||||
* PagesでURLプレビューを表示するように
|
||||
* サーバーログを削除できるように
|
||||
* リンク先が同じインスタンスの投稿内のURLをクリックしたときは新しいタブで開かないように
|
||||
* PostgreSQLの接続オプションを設定ファイルで設定できるように
|
||||
* いくつかのAPIでのパフォーマンスを向上
|
||||
* ユーザビリティの向上
|
||||
* デザインの調整
|
||||
|
||||
### 🐛Fixes
|
||||
* デッキでユーザーページを遷移したときに前のユーザーのタイムラインが残り続ける問題を修正
|
||||
* デッキでフォロー申請が見れない問題を修正
|
||||
* グループ情報が更新できない問題を修正
|
||||
* Firefoxでトークの下が隠れてしまう問題を修正
|
||||
* トーク履歴がないと履歴が読み込み中のままになる問題を修正
|
||||
* 通知で長い名前のユーザーがいると横スクロールが発生する問題を修正
|
||||
* iOSでの選択ダイアログの動作を修正
|
||||
|
||||
11.18.1 (2019/05/21)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* 11.18.0からフォロー/フォロワーのもっと読み込む機能が作動していない問題を修正
|
||||
* iOSで投稿フォームに自動フォーカスしない問題を修正
|
||||
* ダークモードでグループ名がみにくい問題を修正
|
||||
* ハッシュタグタイムラインを読み込んだ時にプログレスバーが残り続ける問題を修正
|
||||
* ユーザビリティの修正
|
||||
|
||||
11.18.0 (2019/05/21)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* デザインの調整
|
||||
|
||||
### 🐛Fixes
|
||||
* 投稿の削除が連合しない問題を修正
|
||||
|
||||
11.17.1 (2019/05/20)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* トークの通知インジケーターが点灯し続ける問題を修正
|
||||
* ユーザーグループの読み込みでエラーになることがある問題を修正
|
||||
|
||||
11.17.0 (2019/05/19)
|
||||
--------------------
|
||||
### 注意
|
||||
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||
|
||||
### ✨Improvements
|
||||
* ユーザーグループを招待制に
|
||||
|
||||
### 🐛Fixes
|
||||
* フォロー申請が表示されない問題を修正
|
||||
* トークの通知インジケーターが点灯し続ける問題を修正
|
||||
* 自分を自分のグループから削除できる問題を修正
|
||||
* 新しいタブでグループトークを開くことができない問題を修正
|
||||
|
||||
11.16.1 (2019/05/19)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* Dockerで起動できない問題を修正
|
||||
|
||||
11.16.0 (2019/05/19)
|
||||
--------------------
|
||||
### 注意
|
||||
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||
|
||||
### ✨Improvements
|
||||
* ユーザーグループ機能を追加
|
||||
* ページに「いいね」できるように
|
||||
* UIの改善
|
||||
|
||||
### 🐛Fixes
|
||||
* トークを読み込むときに最大数指定できなかった問題を修正
|
||||
|
||||
11.15.0 (2019/05/16)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* 管理画面でreCAPTCHAのプレビューを表示するように
|
||||
|
||||
### 🐛Fixes
|
||||
* オブジェクトストレージのリージョンの設定が反映されない問題を修正
|
||||
|
||||
11.14.0 (2019/05/16)
|
||||
--------------------
|
||||
### 注意
|
||||
このバージョンからオブジェクトストレージの設定は設定ファイルではなく管理画面から行うようになりました。
|
||||
オブジェクトストレージを使用している場合、アップデートした後管理画面にアクセスしオブジェクトストレージの設定を再度行ってください。
|
||||
|
||||
### ✨Improvements
|
||||
* 特定のユーザーのファイルをすべて削除できるように
|
||||
* インスタンスの設定画面を整理
|
||||
|
||||
### 🐛Fixes
|
||||
* GIF画像のサムネイルが生成されないのを修正
|
||||
* 管理画面の「ログ」で複数の除外条件を設定できない問題を修正
|
||||
|
||||
11.13.0 (2019/05/14)
|
||||
--------------------
|
||||
### 注意
|
||||
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||
|
||||
### ✨Improvements
|
||||
* 利用規約URL、リポジトリURL、フィードバックURLを設定できるように
|
||||
* 特定のインスタンスのファイルをすべて削除できるように
|
||||
* _blankで外部リンクされる可能性がある箇所にnoopenerを追加
|
||||
* ユーザーや外部インスタンスが生成するリンクにnofollowを追加
|
||||
* リモートのユーザーページやノートページにnoindexを追加
|
||||
* 自分のユーザーメニューにはミュートなどを表示しないように
|
||||
* デザインの調整
|
||||
|
||||
### 🐛Fixes
|
||||
* インスタンスブロックを設定できない問題を修正
|
||||
* ピン留め投稿の表示順がおかしい問題を修正
|
||||
* 設定の「アップデートを確認」でメッセージが正しく表示されない問題を修正
|
||||
* Firefoxで自分のメニューが開けない問題を修正
|
||||
* Welcomeページのタグクラウドが動かない問題を修正
|
||||
|
||||
11.12.0 (2019/05/10)
|
||||
--------------------
|
||||
### 注意
|
||||
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||
|
||||
### ✨ Improvements
|
||||
* インスタンス運営者がおすすめアカウントを設定できるように
|
||||
* MisskeyPagesでNAME環境変数がNULLにならないように
|
||||
* MisskeyPagesにNULL環境変数を追加
|
||||
* MisskeyPagesで変数を並べ替えられるように
|
||||
* MisskeyPagesのテキストのリスト内で変数埋め込みできるように
|
||||
* 自分の指定した投稿のRenoteを全て解除するAPIを追加
|
||||
|
||||
### 🐛Fixes
|
||||
* Noteをpull取得した時にhost名がvalidateされていない問題を修正
|
||||
* みつけるで人気のタグが表示されない問題を修正
|
||||
|
||||
### その他
|
||||
* アカウントのisVerifiedフラグを廃止
|
||||
|
||||
11.11.2 (2019/05/07)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* IPv4 onlyホストからDualstackホストにAP deliverできない問題を修正
|
||||
* ストリーミングに接続するまでラグがある問題を修正
|
||||
* 2段階認証のコードが0から始まる時正しく入力できない問題を修正
|
||||
* ユーザーの更新日時が新しい順で更新日時がnullのユーザーが先頭に来る問題を修正
|
||||
* 値選択時の問題を修正
|
||||
* リバーシでマップの変更が反映されない問題を修正
|
||||
* リバーシで対局終了直後に盤面を巻き戻してもすぐ最終ターンまでリセットされる問題を修正
|
||||
|
||||
11.11.1 (2019/05/05)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* MisskeyPagesのリストから選択関数が使えない問題を修正
|
||||
|
||||
11.11.0 (2019/05/05)
|
||||
--------------------
|
||||
### ✨ Improvements
|
||||
* MisskeyPagesにリストから選択関数を追加
|
||||
* MisskeyPagesに確率を指定できるテキストランダム選択関数を追加
|
||||
* 外部サービス連携ログインリンクにアイコン追加
|
||||
|
||||
### 🐛Fixes
|
||||
* MisskeyPagesでifを入れ子にできなくなっていた問題を修正
|
||||
* MisskeyPagesで数値入力を作成するとテキスト入力になる問題を修正
|
||||
* 外部サービス連携に関する問題を修正
|
||||
|
||||
11.10.1 (2019/05/04)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* MisskeyPagesでページブロックを削除できなくなっていた問題を修正
|
||||
|
||||
### その他
|
||||
* Node.js v12対応
|
||||
|
||||
11.10.0 (2019/05/03)
|
||||
--------------------
|
||||
### 注意
|
||||
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||
|
||||
### ✨ Improvements
|
||||
* MisskeyPagesに割った余りを求める関数を追加
|
||||
* Mastodon v2.8.0 のフォローリストをインポートできるように
|
||||
* エクスポートリクエストに失敗したらエラーを表示するように
|
||||
* エクスポートファイルでは同一ハッシュチェックをしないように
|
||||
|
||||
### 🐛Fixes
|
||||
* 2段階認証を設定するとログインできなくなる問題を修正
|
||||
* ファイルをアップロードできないことがある問題を修正
|
||||
* リモートファイルをキャッシュしない設定だとサムネイル時にオリジナル画像が表示されない問題を修正
|
||||
* 外部サービス連携の不具合を修正
|
||||
|
||||
11.9.0 (2019/05/02)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* MisskeyPagesで編集時にページブロックをドラッグで並べ替えられるように
|
||||
* MisskeyPagesにカウンターボタンブロックを追加
|
||||
|
||||
11.8.1 (2019/05/02)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* リモートファイルをキャッシュしないオプション有効時にファイルが作成できない問題を修正
|
||||
|
||||
11.8.0-2 (2019/05/01)
|
||||
-------------------
|
||||
* 11.8.0 のリリース内容が 11.7.0 と同一だったのを修正
|
||||
|
||||
11.8.0 (2019/05/01)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* MisskeyPagesで関数を作成できるように
|
||||
* MisskeyPagesでソースを表示できるように
|
||||
* MisskeyPagesにシードを与えるランダム関数を追加
|
||||
* MisskeyPagesに複数行テキストをテキストのリストに変換する関数を追加
|
||||
|
||||
### 🐛Fixes
|
||||
* APIドキュメントが見れなくなっていたのを修正
|
||||
* mention (あなた宛て) streaming にミュートが効かない問題を修正
|
||||
* デザインの調整
|
||||
|
||||
11.7.0 (2019/04/30)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* MisskeyPagesに ifブロック を追加
|
||||
* MisskeyPagesに テキストエリア を追加
|
||||
* MisskeyPagesに 複数行テキスト入力 を追加
|
||||
* MisskeyPagesに 投稿フォーム を追加
|
||||
* MisskeyPagesに 変換系関数 を追加
|
||||
* MisskeyPagesに 環境変数 URL を追加
|
||||
* MisskeyPagesでボタンやスイッチなどのテキストに変数使えるように
|
||||
|
||||
### 🐛Fixes
|
||||
* OGPのサイト名を修正
|
||||
* デザインの調整
|
||||
|
||||
11.6.0 (2019/04/29)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* AiScriptにいくつかの文字列操作関数を追加
|
||||
* ページ編集画面にページへのリンクを表示するように
|
||||
|
||||
### 🐛Fixes
|
||||
* MisskeyPagesで数値入力が文字列として扱われる問題を修正
|
||||
* デザインの調整
|
||||
|
||||
11.5.1 (2019/04/29)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* MisskeyPagesで環境変数を別の変数内で使えない問題を修正
|
||||
* MisskeyPagesで値が0の変数が表示されない問題を修正
|
||||
|
||||
11.5.0 (2019/04/29)
|
||||
-------------------
|
||||
### 注意
|
||||
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](migration)の手順を実行してください
|
||||
|
||||
### New features
|
||||
#### MisskeyPages
|
||||
ページ(記事)を作成できるように。
|
||||
|
||||
* 後から何度でも編集できる
|
||||
* アイキャッチを設定できる
|
||||
* フォントを設定できる
|
||||
* 画像を好きな位置に挿入できる
|
||||
* URLを決められる
|
||||
* タイトルを設定できる
|
||||
* 見出しを設定できる
|
||||
* ページの要約を設定できる(URLプレビュー時などに便利)
|
||||
* 変数や式(aka AiScript)を使用して動的なページも作れる
|
||||
* 目次自動生成(coming soon)
|
||||
|
||||
ページを気に入ったら「いいね」しよう (coming soon)
|
||||
|
||||
### ✨ Improvements
|
||||
* APIコンソールでパラメータテンプレートを表示するように
|
||||
|
||||
### 🐛Fixes
|
||||
* おすすめユーザーに自分自身が含まれる問題を修正
|
||||
* ユーザーサジェストで表示名が変わらない問題を修正
|
||||
|
||||
11.4.0 (2019/04/25)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* 検索でローカルの投稿のみに絞れるように
|
||||
* 検索で特定のインスタンスの投稿のみに絞れるように
|
||||
* 検索で特定のユーザーの投稿のみに絞れるように
|
||||
|
||||
### 🐛Fixes
|
||||
* 投稿が増殖する問題を修正
|
||||
* ストリームで過去の投稿が流れてくる問題を修正
|
||||
* モバイル版のユーザーページで遷移してもユーザー名が変わらない問題を修正
|
||||
* お知らせを切り替えても内容が変わらない問題を修正
|
||||
|
||||
11.3.1 (2019/04/24)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* Webからファイルがアップロードできない問題を修正
|
||||
|
||||
11.3.0 (2019/04/24)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* お知らせにMFMを使えるように
|
||||
* お知らせに画像を添付できるように
|
||||
|
||||
### 🐛Fixes
|
||||
* 投稿のタグ検索APIで大文字小文字が区別されていたのを修正
|
||||
* 公開範囲がホームの投稿がグローバルTLに流れる問題を修正
|
||||
* モバイルビューの投稿詳細にて acct が長いとアイコンが圧迫面接される問題を修正
|
||||
|
||||
11.2.2 (2019/04/22)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* 2段階認証を有効にするとログインできない問題を修正
|
||||
* リモートユーザーの修復処理が自動的に実行されない問題を修正
|
||||
* リモートユーザー情報が更新されない問題を修正
|
||||
|
||||
11.2.1 (2019/04/21)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* MEIDが25桁になっているのを修正
|
||||
* リモートユーザー情報が更新されない問題を修正
|
||||
|
||||
11.2.0 (2019/04/18)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* 検索で日付(日時)を入力するとタイムラインをその時点まで遡るように
|
||||
* APIコンソールでエンドポイントをサジェストするように
|
||||
* モバイル版でドライブのメニューを使いやすく
|
||||
* サイレンス時に確認を表示するように
|
||||
* ユーザーメニューでブロックなどの操作を行う時に確認するように
|
||||
|
||||
### 🐛Fixes
|
||||
* アプリケーション連携画面でパーミッションが表示されない問題を修正
|
||||
* アンケートウィジットでもMFMを使用するように
|
||||
* フォローしてないユーザーのホーム投稿がSTLに流れてくる問題を修正
|
||||
* モバイル版でウィジェットを設定できない問題を修正
|
||||
* スプラッシュがクリックに反応するように
|
||||
|
||||
11.1.6 (2019/04/18)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* 未認知ユーザーからActivityが飛んできた場合に処理できない問題を修正
|
||||
* その投稿を見たのにも関わらずメンションインジケーターが点灯し続ける問題を修正
|
||||
* ハッシュタグの判定を改善
|
||||
* サーバーのエラーハンドリングを改善
|
||||
|
||||
11.1.5 (2019/04/17)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* ユーザー名に含まれているカスタム絵文字が表示されないことがある問題を修正
|
||||
* 壁紙の設定ができない問題を修正
|
||||
* デザインの調整
|
||||
|
||||
11.1.4 (2019/04/17)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* タイムライン取得時に削除されたファイルを添付している投稿が含まれているとサーバーでエラーになる問題を修正
|
||||
* 管理画面のインスタンスメニューで変更前の設定が読み込まれないことがある問題を修正
|
||||
* 猫ではないのに猫のままで表示される問題を修正
|
||||
* admin/driveのアイコンがずれてる問題を修正
|
||||
* チャートで大きな数値を扱えない問題を修正
|
||||
* UIの修正
|
||||
|
||||
11.1.3 (2019/04/16)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* アプリからAPIにリクエストするときにランダムなユーザーがリクエストしたことになる問題を修正
|
||||
|
||||
11.1.2 (2019/04/15)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* 画像描画の依存関係を変更
|
||||
* リモートユーザーのファイルを削除するときに古い方からではなく新しい方から削除されるのを修正
|
||||
* リアクションしてないのにリアクションしたことになる問題を修正
|
||||
* APIドキュメントの修正
|
||||
|
||||
11.1.1 (2019/04/15)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* Metaタグの application-name を Misskey で固定するように修正
|
||||
* トークメッセージが既読にならない問題を修正
|
||||
* デフォルトでHTLを表示するように
|
||||
|
||||
11.1.0 (2019/04/15)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* アイコン未設定時にランダムな画像を表示するように
|
||||
* 管理者やモデレーターはレートリミット無効に
|
||||
|
||||
### 🐛Fixes
|
||||
* メンションの「あなた」インジケーターが表示されない問題を修正
|
||||
* ブロックAPIでエラーが発生する問題を修正
|
||||
* プッシュ通知の購読に失敗する問題を修正
|
||||
|
||||
11.0.3 (2019/04/15)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* ハッシュタグ検索APIが動作しない問題を修正
|
||||
* モデレーターなのにアカウントメニューに「管理」が表示されない問題を修正
|
||||
* プッシュ通知の購読に失敗する問題を修正
|
||||
* ユーザー取得APIでユーザーを指定しない場合エラーになる問題を修正
|
||||
|
||||
11.0.2 (2019/04/15)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* アプリが作成できない問題を修正
|
||||
* 「ハイライト」が表示されない問題を修正
|
||||
* リモートの投稿に添付されている画像が小さい問題を修正
|
||||
* モバイル版でリストの名前が表示されない問題を修正
|
||||
* APIドキュメントにパーミッション一覧を追加
|
||||
|
||||
11.0.1 (2019/04/15)
|
||||
-------------------
|
||||
### ✨ Improvements
|
||||
* 不要な依存関係を削除
|
||||
|
||||
11.0.0 daybreak (2019/04/14)
|
||||
----------------------------
|
||||
### ✨ Improvements
|
||||
* **データベースがMongoDBからPostgreSQLに変更されました**
|
||||
* **Redisが必須に**
|
||||
* アカウントを完全に削除できるように
|
||||
* 投稿フォームで添付ファイルの閲覧注意を確認/設定できるように
|
||||
* ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように
|
||||
|
||||
### 🐛Fixes
|
||||
* フォロー申請数が実際より1すくなくなる問題を修正
|
||||
* リストからアカウント削除したユーザーを削除できない問題を修正
|
||||
* リストTLでフォローしていないユーザーの非公開投稿が流れる問題を修正
|
||||
* リストTLでダイレクト投稿が流れない問題を修正
|
||||
* ミュートしているユーザーの投稿がタイムラインに流れてくることがある問題を修正
|
||||
|
||||
### APIの破壊的変更
|
||||
* v10時点で deprecated だったパラメータなどを削除
|
||||
* ユーザーリストの title が name に
|
||||
* リバーシの対局の`settings`プロパティがなくなり、その中にあったプロパティがすべて上の階層に
|
||||
* 例えば`game.settings.map`は`game.map`になる
|
||||
|
||||
### 既知の問題
|
||||
* ユーザー認証無しでのアプリが作成できない
|
||||
* 依存ライブラリの問題と思わるため、対応が難しい
|
||||
|
||||
### Migration
|
||||
#### 移行の注意点
|
||||
**以下のデータは引き継がれません**
|
||||
* 通知
|
||||
* リモートの投稿
|
||||
* リバーシの対局
|
||||
|
||||
#### 手順
|
||||
1. v11をインストールしたい場所に syuilo/misskey をクローン
|
||||
2. config を設定する
|
||||
* PostgreSQL(`db`)の設定とは別に、v10からMongoDBの設定をコピペしてくる(例は下にあります)
|
||||
* `id`の設定を`meid`または`objectid`にする
|
||||
|
||||
``` yml
|
||||
db:
|
||||
host: localhost
|
||||
port: 5432
|
||||
db: misskey
|
||||
user: x
|
||||
pass: x
|
||||
|
||||
mongodb:
|
||||
user: x
|
||||
pass: x
|
||||
host: localhost
|
||||
port: 27017
|
||||
db: misskey
|
||||
```
|
||||
3. migration ブランチに切り替え
|
||||
4. `npm i`
|
||||
5. `npm run build`
|
||||
6. `npm run init`
|
||||
7. `npm run migrate`
|
||||
8. master ブランチに戻す
|
||||
9. enjoy
|
||||
|
||||
10.100.0
|
||||
----------
|
||||
* ユーザーリストでフォローボタンを表示するように
|
||||
* ドライブのファイルのサムネイルを修正
|
||||
* 投稿ウィジットでローカルのみの公開範囲で投稿できない問題を修正
|
||||
* TLを遡った時に抜けがある時がある問題を修正
|
||||
* ユーザータイムラインが投稿日時順ではなくなっているのを修正
|
||||
* 10.99.0 でチャートのレンダリングがおかしい問題を修正
|
||||
|
||||
10.99.0
|
||||
----------
|
||||
* manifest.json にインスタンス名を反映させるように
|
||||
* Metaに投稿やユーザーのIDを設定するように
|
||||
* 設定でポートが指定されていない場合、環境変数を参照するように
|
||||
* フォローインポートで途中にエラーになるユーザーがいると途中で終了してしまう問題を修正
|
||||
* フォローインポートで自分が含まれていた場合自分をフォローしてしまう問題を修正
|
||||
* ServiceWorkerの設定がUIで有効にならない問題を修正
|
||||
* ユーザー一覧でのユーザーの自己紹介が複数行になることがある問題を修正
|
||||
* フォローインポートでAPI limitに達していても正常にリクエストされたように表示されてしまう問題を修正
|
||||
* DBに保存されたrepository urlを変更する方法がない問題を修正
|
||||
* デスクトップDeckだとviaが投稿内に2箇所表示される問題を修正
|
||||
* デザインの調整
|
||||
* 依存関係の更新
|
||||
* ローカリゼーション
|
||||
|
||||
10.98.3
|
||||
----------
|
||||
* リアクションのカスタム絵文字の情報がNoteに添付されない問題を修正
|
||||
* フォルダーの移動をするとき親フォルダーに自分自身を指定できてしまう問題を修正
|
||||
* デザインの調整
|
||||
|
||||
10.98.2
|
||||
----------
|
||||
* 他のインスタンスから添付画像が見れない問題を修正
|
||||
|
||||
10.98.1
|
||||
----------
|
||||
* ドライブのファイルのサムネイルが表示されない問題を修正
|
||||
* APでカスタム絵文字を送る時に常にimage/pngで送っている問題を修正
|
||||
* いくらいじってもページリロードするとmisskeyのテーマがdark(future)になっちゃう問題を修正
|
||||
|
||||
10.98.0
|
||||
----------
|
||||
* ドライブのファイルダウンロード時に元のファイル名を尊重するように
|
||||
* ドライブで画像以外のファイルを分かりやすく表示するように
|
||||
* TwemojiのCDNを変更
|
||||
* モバイルで通知の設定がない問題を修正
|
||||
* デザインの調整
|
||||
|
||||
10.97.2
|
||||
----------
|
||||
* ビルド時に警告が出ないように修正
|
||||
|
||||
10.97.1
|
||||
----------
|
||||
* デザインの調整
|
||||
|
||||
10.97.0
|
||||
----------
|
||||
* リアクションに絵文字やカスタム絵文字を使えるように
|
||||
* 不明なリアクションのフォールバックに star を使えるように
|
||||
* デザインの調整
|
||||
|
||||
10.96.0
|
||||
----------
|
||||
* 連合ユーザーの投稿に対してActivityPubオブジェクトを要求されたら元のインスタンスにリダイレクトするように
|
||||
* updatePersonを試行した時点でもlastFetchedAtを更新するように
|
||||
* 管理画面でリモートインスタンスの登録日時を表示
|
||||
* ユーザーサジェストが機能しなくなっていた問題を修正
|
||||
* 最近使ったハッシュタグ表示が機能していない問題を修正
|
||||
* バグ修正
|
||||
* デザインの調整
|
||||
|
||||
10.95.0
|
||||
----------
|
||||
* ジョブを一覧できるように
|
||||
* MFMでURLを明示する構文の追加
|
||||
* Articleタイプのアクティビティを受け入れるように
|
||||
* 凍結されたユーザーをサジェストしないように
|
||||
* ファビコンが保存されないのを修正
|
||||
* キューのジョブクリアの動作を修正
|
||||
* デザインの調整
|
||||
|
||||
10.94.0
|
||||
----------
|
||||
* Faviconを設定できるように
|
||||
* アカウントを凍結したときすべてのフォローを解除するように
|
||||
* シェアページが機能していない問題を修正
|
||||
* インスタンスブロックをしていてもRenote等すると取得されてしまう問題を修正
|
||||
* デザインの調整
|
||||
|
||||
10.93.1
|
||||
----------
|
||||
* データのエクスポートとインポートの動作を修正
|
||||
* デザインの調整
|
||||
|
||||
10.93.0
|
||||
----------
|
||||
* フォローリストをインポートできるように
|
||||
* embedプレイヤーを閉じれるように
|
||||
* リストをインポートしたときにプロキシアカウントがフォローするように修正
|
||||
* Web Share Targetの動作を修正
|
||||
* おすすめアンケートのチョイスを修正
|
||||
* デザインの調整
|
||||
|
||||
10.92.4
|
||||
----------
|
||||
* リストのエクスポートをできるように
|
||||
* ジョブキューウィジェットを追加
|
||||
* URLプレビューのサムネイルが表示されないことがある問題を修正
|
||||
|
||||
10.92.3
|
||||
----------
|
||||
* 管理画面の各種ジョブ数がおかしい問題を修正
|
||||
* ジョブキューの動作を調整
|
||||
|
||||
10.92.2
|
||||
----------
|
||||
* 管理画面で各種ジョブ数を一覧できるように
|
||||
* ジョブキューの動作を修正
|
||||
* notes/children が遅い問題を修正
|
||||
|
||||
10.92.1
|
||||
----------
|
||||
* アンケートの結果をリモートと同期するように
|
||||
* ジョブキューを有効に
|
||||
* 投稿の返信一覧に引用Renoteも含めるように
|
||||
* robots.txt追加
|
||||
* デザインの調整
|
||||
|
||||
10.92.0
|
||||
----------
|
||||
* Mastodonのアンケートに対応
|
||||
|
||||
173
CONTRIBUTING.md
173
CONTRIBUTING.md
@@ -3,11 +3,17 @@
|
||||
|
||||
## Issues
|
||||
Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues .
|
||||
Before creating a new issue, please search existing issues to avoid duplication.
|
||||
If you find the existing issue, please add your reaction or comment to the issue.
|
||||
|
||||
* Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one.
|
||||
* If you have multiple independent issues, please submit them separately.
|
||||
|
||||
|
||||
## Localization (l10n)
|
||||
Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
||||
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
||||
You can improve our translations with your Crowdin account.
|
||||
Changes you make in Crowdin will be merged into develop branch.
|
||||
|
||||
If you can't find the language you want to contribute with, please open an issue.
|
||||
|
||||

|
||||
|
||||
@@ -15,16 +21,16 @@ Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
||||
Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
|
||||
|
||||
## Documentation
|
||||
* Documents for contributors are located in `/docs`.
|
||||
* Documents for instance admins are located in `/docs`.
|
||||
* Documents for end users are located in `src/docs`.
|
||||
* Documents for contributors are located in [`/docs`](/docs).
|
||||
* Documents for instance admins are located in [`/docs`](/docs).
|
||||
* Documents for end users are located in [`/src/docs`](/src/docs).
|
||||
|
||||
## Test
|
||||
* Test codes are located in `/test`.
|
||||
* Test codes are located in [`/test`](/test).
|
||||
|
||||
## Continuous integration
|
||||
Misskey uses CircleCI for automated test.
|
||||
Configuration files are located in `/.circleci`.
|
||||
Configuration files are located in [`/.circleci`](/.circleci).
|
||||
|
||||
## Glossary
|
||||
### AP
|
||||
@@ -46,7 +52,40 @@ Convert な(na) to にゃ(nya)
|
||||
Revert Nyaize
|
||||
|
||||
## Code style
|
||||
### Don't use `export default`
|
||||
### セミコロンを省略しない
|
||||
ASI Hazardを避けるためでもある
|
||||
|
||||
### 中括弧を省略しない
|
||||
Bad:
|
||||
``` ts
|
||||
if (foo)
|
||||
bar;
|
||||
else
|
||||
baz;
|
||||
```
|
||||
|
||||
Good:
|
||||
``` ts
|
||||
if (foo) {
|
||||
bar;
|
||||
} else {
|
||||
baz;
|
||||
}
|
||||
```
|
||||
|
||||
ただし**`if`が一行**の時だけは省略しても良い
|
||||
Good:
|
||||
``` ts
|
||||
if (foo) bar;
|
||||
```
|
||||
|
||||
### `export default`を使わない
|
||||
インテリセンスと相性が悪かったりするため
|
||||
|
||||
参考:
|
||||
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
||||
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
||||
|
||||
Bad:
|
||||
``` ts
|
||||
export default function(foo: string): string {
|
||||
@@ -72,3 +111,119 @@ src ... Source code
|
||||
test ... Test code
|
||||
|
||||
```
|
||||
|
||||
## Notes
|
||||
### placeholder
|
||||
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
||||
例えば
|
||||
``` ts
|
||||
query.andWhere(new Brackets(qb => {
|
||||
for (const type of ps.fileType) {
|
||||
qb.orWhere(`:type = ANY(note.attachedFileTypes)`, { type: type });
|
||||
}
|
||||
}));
|
||||
```
|
||||
と書くと、ループ中で`type`というプレースホルダが複数回使われてしまいおかしくなる
|
||||
だから次のようにする必要がある
|
||||
```ts
|
||||
query.andWhere(new Brackets(qb => {
|
||||
for (const type of ps.fileType) {
|
||||
const i = ps.fileType.indexOf(type);
|
||||
qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
|
||||
}
|
||||
}));
|
||||
```
|
||||
|
||||
### Not `null` in TypeORM
|
||||
```ts
|
||||
const foo = await Foos.findOne({
|
||||
bar: Not(null)
|
||||
});
|
||||
```
|
||||
のようなクエリ(`bar`が`null`ではない)は期待通りに動作しない。
|
||||
次のようにします:
|
||||
```ts
|
||||
const foo = await Foos.findOne({
|
||||
bar: Not(IsNull())
|
||||
});
|
||||
```
|
||||
|
||||
### `null` in SQL
|
||||
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
||||
例えば
|
||||
``` ts
|
||||
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||
```
|
||||
という処理で、`ps.folderId`が`null`だと結果的に`file.folderId = null`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||
だから次のようにする必要がある
|
||||
``` ts
|
||||
if (ps.folderId) {
|
||||
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||
} else {
|
||||
query.where('file.folderId IS NULL');
|
||||
}
|
||||
```
|
||||
|
||||
### `[]` in SQL
|
||||
SQLを発行する際、`IN`のパラメータが`[]`(空の配列)になる可能性のある場合はSQL文を出し分けなければならない
|
||||
例えば
|
||||
``` ts
|
||||
const users = await Users.find({
|
||||
id: In(userIds)
|
||||
});
|
||||
```
|
||||
という処理で、`userIds`が`[]`だと結果的に`user.id IN ()`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||
だから次のようにする必要がある
|
||||
``` ts
|
||||
const users = userIds.length > 0 ? await Users.find({
|
||||
id: In(userIds)
|
||||
}) : [];
|
||||
```
|
||||
|
||||
### 配列のインデックス in SQL
|
||||
SQLでは配列のインデックスは**1始まり**。
|
||||
`[a, b, c]`の `a`にアクセスしたいなら`[0]`ではなく`[1]`と書く
|
||||
|
||||
### `undefined`にご用心
|
||||
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
||||
|
||||
### 簡素な`undefined`チェック
|
||||
データベースからレコードを取得するときに、プログラムの流れ的に(ほぼ)絶対`undefined`にはならない場合でも、`undefined`チェックしないとTypeScriptに怒られます。
|
||||
でもいちいち複数行を費やして、発生するはずのない`undefined`をチェックするのも面倒なので、`ensure`というユーティリティ関数を用意しています。
|
||||
例えば、
|
||||
``` ts
|
||||
const user = await Users.findOne(userId);
|
||||
// この時点で user の型は User | undefined
|
||||
if (user == null) {
|
||||
throw 'missing user';
|
||||
}
|
||||
// この時点で user の型は User
|
||||
```
|
||||
という処理を`ensure`を使うと
|
||||
``` ts
|
||||
const user = await Users.findOne(userId).then(ensure);
|
||||
// この時点で user の型は User
|
||||
```
|
||||
という風に書けます。
|
||||
もちろん`ensure`内部でエラーを握りつぶすようなことはしておらず、万が一`undefined`だった場合はPromiseがRejectされ後続の処理は実行されません。
|
||||
``` ts
|
||||
const user = await Users.findOne(userId).then(ensure);
|
||||
// 万が一 Users.findOne の結果が undefined だったら、ensure でエラーが発生するので
|
||||
// この行に到達することは無い
|
||||
// なので、.then(ensure) は
|
||||
// if (user == null) {
|
||||
// throw 'missing user';
|
||||
// }
|
||||
// の糖衣構文のような扱いです
|
||||
```
|
||||
|
||||
### Migration作成方法
|
||||
コードの変更をした後、`ormconfig.json`(`npm run ormconfig`で生成)を用意し、
|
||||
|
||||
```
|
||||
npm i -g ts-node
|
||||
ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
||||
```
|
||||
|
||||
作成されたスクリプトは不必要な変更を含むため除去してください。
|
||||
|
||||
10
Dockerfile
10
Dockerfile
@@ -1,4 +1,4 @@
|
||||
FROM node:11-alpine AS base
|
||||
FROM node:12.1-alpine AS base
|
||||
|
||||
ENV NODE_ENV=production
|
||||
|
||||
@@ -21,11 +21,11 @@ RUN apk add --no-cache \
|
||||
pkgconfig \
|
||||
python \
|
||||
zlib-dev
|
||||
RUN npm i -g yarn
|
||||
|
||||
COPY package.json ./
|
||||
RUN npm i
|
||||
COPY . ./
|
||||
RUN yarn install
|
||||
RUN yarn build
|
||||
RUN npm run build
|
||||
|
||||
FROM base AS runner
|
||||
|
||||
@@ -39,4 +39,4 @@ COPY --from=builder /misskey/node_modules ./node_modules
|
||||
COPY --from=builder /misskey/built ./built
|
||||
COPY . ./
|
||||
|
||||
CMD ["npm", "start"]
|
||||
CMD ["npm", "run", "migrateandstart"]
|
||||
|
||||
87
README.md
87
README.md
@@ -1,6 +1,6 @@
|
||||
<img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/>
|
||||
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
|
||||
|
||||
[](https://misskey.xyz/)
|
||||
[](https://misskey.io/)
|
||||
================================================================
|
||||
|
||||
[](https://circleci.com/gh/syuilo/misskey)
|
||||
@@ -10,7 +10,7 @@
|
||||
**A forever evolving, sophisticated microblogging platform.**
|
||||
|
||||
<p align="justify">
|
||||
<a href="https://misskey.xyz">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||
<a href="https://misskey.io">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||
it is mutually linked with other social media platforms.
|
||||
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://joinmisskey.github.io/">Find an instance!</a>
|
||||
@@ -59,7 +59,7 @@ Organize and store your files! Want to post a picture you have already uploaded?
|
||||
|
||||
---
|
||||
|
||||
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
||||
...and more! Experience Misskey with your own eyes at [misskey.io](https://misskey.io/) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
||||
|
||||
Screen shots
|
||||
----------------------------------------------------------------
|
||||
@@ -88,12 +88,14 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><img src="https://avatars0.githubusercontent.com/u/10798641?s=460&v=4" alt="AyaMorisawa" width="100"></td>
|
||||
<td><img src="https://avatars1.githubusercontent.com/u/30769358?s=460&v=4" alt="mei23" width="100"></td>
|
||||
<td><img src="https://avatars2.githubusercontent.com/u/20679825?s=460&v=4" alt="acid-chicken" width="100"></td>
|
||||
<td><img src="https://avatars2.githubusercontent.com/u/6533808?s=460&v=4" alt="rinsuki" width="100"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
|
||||
<td align="center"><a href="https://github.com/AyaMorisawa">@AyaMorisawa</a></td>
|
||||
<td align="center"><a href="https://github.com/mei23">@mei23</a></td>
|
||||
<td align="center"><a href="https://github.com/acid-chicken">@acid-chicken</a></td>
|
||||
<td align="center"><a href="https://github.com/rinsuki">@rinsuki</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -101,58 +103,81 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
----------------------------------------------------------------
|
||||
<!-- PATREON_START -->
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/12059069" alt="naga_rus" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1.jpe?token-time=2145916800&token-hash=bqwLTk0Wo0hUJJ8J5y7ii05bLzz-_CDA7Bo0Mp4RFU0%3D" alt="ne_moni" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4.jpe?token-time=2145916800&token-hash=zEyJqVM7u9d8Ri-65fJYSJcWF1jBH1nJ5a3taRzrTmw%3D" alt="Melilot" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
|
||||
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
|
||||
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=19045173">kiritan</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=0xgcpqvFDqRcV_YIEhcPNVH7gs9sLg_BBnTJXCkN4ao%3D" alt="mydarkstar" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1?token-time=2145916800&token-hash=95p8VdGX45E8BitZR_eOcDlqCjumjzNLBPQJrJdeCpI%3D" alt="takimura" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4?token-time=2145916800&token-hash=SbdZeN5SmsuT9stD6v0jN1z0hftg0FmRiCTxysU0Ihw%3D" alt="Damillora" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/935a10339daa4ede8e555903a0707060/1?token-time=2145916800&token-hash=3CrpqH-XtKs_NoIlSsTyVs8wCzP1WFCsG2xwps1IJq0%3D" alt="Atsuko Tominaga" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
|
||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
|
||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4.jpe?token-time=2145916800&token-hash=UslrPVM-8TXOe8AapuNiaFYjcIJgPNcU-fKpGbfGJNI%3D" alt="Damillora" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1.jpeg?token-time=2145916800&token-hash=l4AoMR7Nj7K4yAHrkrk2hAoggPkbSPm12m1nmbe9Pb8%3D" alt="Naoki Hirayama" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
||||
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=xhR1n6NAAyEb-IUXLD6_dshkFa3mefU5ZZuk1L8qKTs%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=uR-48MQ0A4j0irQSrCAQZJ-sJUSs_Fkihlg3-l59b7c%3D" alt="Takashi Shibuya" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
||||
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
|
||||
<td><a href="https://www.patreon.com/Corset">CG</a></td>
|
||||
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
||||
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||
</tr></table>
|
||||
|
||||
**Last updated:** Mon, 04 Mar 2019 09:06:05 UTC
|
||||
**Last updated:** Tue, 11 Jun 2019 01:46:06 UTC
|
||||
<!-- PATREON_END -->
|
||||
|
||||
:four_leaf_clover: Copyright
|
||||
|
||||
4
assets/robots.txt
Normal file
4
assets/robots.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
user-agent: *
|
||||
allow: /
|
||||
|
||||
# todo: sitemap
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'crypto_key',
|
||||
'sources': ['src/crypto_key.cc'],
|
||||
'include_dirs': ['<!(node -e "require(\'nan\')")']
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
const mongo = require('mongodb');
|
||||
const User = require('../built/models/user').default;
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
const user = args[0];
|
||||
|
||||
const q = user.startsWith('@') ? {
|
||||
username: user.split('@')[1],
|
||||
host: user.split('@')[2] || null
|
||||
} : { _id: new mongo.ObjectID(user) };
|
||||
|
||||
console.log(`Mark as admin ${user}...`);
|
||||
|
||||
User.update(q, {
|
||||
$set: {
|
||||
isAdmin: true
|
||||
}
|
||||
}).then(() => {
|
||||
console.log(`Done ${user}`);
|
||||
}, e => {
|
||||
console.error(e);
|
||||
});
|
||||
@@ -1,57 +0,0 @@
|
||||
// for Node.js interpret
|
||||
|
||||
const chalk = require('chalk');
|
||||
const sequential = require('promise-sequential');
|
||||
|
||||
const { default: User } = require('../../built/models/user');
|
||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||
|
||||
async function main() {
|
||||
const promiseGens = [];
|
||||
|
||||
const count = await DriveFile.count({});
|
||||
|
||||
let prev;
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
promiseGens.push(() => {
|
||||
const promise = new Promise(async (res, rej) => {
|
||||
const file = await DriveFile.findOne(prev ? {
|
||||
_id: { $gt: prev._id }
|
||||
} : {}, {
|
||||
sort: {
|
||||
_id: 1
|
||||
}
|
||||
});
|
||||
|
||||
prev = file;
|
||||
|
||||
const user = await User.findOne({ _id: file.metadata.userId });
|
||||
|
||||
DriveFile.update({
|
||||
_id: file._id
|
||||
}, {
|
||||
$set: {
|
||||
'metadata._user': {
|
||||
host: user.host
|
||||
}
|
||||
}
|
||||
}).then(() => {
|
||||
res([i, file]);
|
||||
}).catch(rej);
|
||||
});
|
||||
|
||||
promise.then(([i, file]) => {
|
||||
console.log(chalk`{gray ${i}} {green done: {bold ${file._id}} ${file.filename}}`);
|
||||
});
|
||||
|
||||
return promise;
|
||||
});
|
||||
}
|
||||
|
||||
return await sequential(promiseGens);
|
||||
}
|
||||
|
||||
main().then(() => {
|
||||
console.log('ALL DONE');
|
||||
}).catch(console.error);
|
||||
@@ -1,71 +0,0 @@
|
||||
// for Node.js interpret
|
||||
|
||||
const chalk = require('chalk');
|
||||
const sequential = require('promise-sequential');
|
||||
|
||||
const { default: User } = require('../../built/models/user');
|
||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||
|
||||
async function main() {
|
||||
const promiseGens = [];
|
||||
|
||||
const count = await User.count({});
|
||||
|
||||
let prev;
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
promiseGens.push(() => {
|
||||
const promise = new Promise(async (res, rej) => {
|
||||
const user = await User.findOne(prev ? {
|
||||
_id: { $gt: prev._id }
|
||||
} : {}, {
|
||||
sort: {
|
||||
_id: 1
|
||||
}
|
||||
});
|
||||
|
||||
prev = user;
|
||||
|
||||
const set = {};
|
||||
|
||||
if (user.avatarId != null) {
|
||||
const file = await DriveFile.findOne({ _id: user.avatarId });
|
||||
|
||||
if (file && file.metadata.properties.avgColor) {
|
||||
set.avatarColor = file.metadata.properties.avgColor;
|
||||
}
|
||||
}
|
||||
|
||||
if (user.bannerId != null) {
|
||||
const file = await DriveFile.findOne({ _id: user.bannerId });
|
||||
|
||||
if (file && file.metadata.properties.avgColor) {
|
||||
set.bannerColor = file.metadata.properties.avgColor;
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(set).length === 0) return res([i, user]);
|
||||
|
||||
User.update({
|
||||
_id: user._id
|
||||
}, {
|
||||
$set: set
|
||||
}).then(() => {
|
||||
res([i, user]);
|
||||
}).catch(rej);
|
||||
});
|
||||
|
||||
promise.then(([i, user]) => {
|
||||
console.log(chalk`{gray ${i}} {green done: {bold ${user._id}} @${user.username}}`);
|
||||
});
|
||||
|
||||
return promise;
|
||||
});
|
||||
}
|
||||
|
||||
return await sequential(promiseGens);
|
||||
}
|
||||
|
||||
main().then(() => {
|
||||
console.log('ALL DONE');
|
||||
}).catch(console.error);
|
||||
@@ -1,9 +0,0 @@
|
||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||
|
||||
DriveFile.update({}, {
|
||||
$rename: {
|
||||
'metadata.isMetaOnly': 'metadata.withoutChunks'
|
||||
}
|
||||
}, {
|
||||
multi: true
|
||||
});
|
||||
@@ -1,134 +0,0 @@
|
||||
const { default: Stats } = require('../../built/models/stats');
|
||||
const { default: User } = require('../../built/models/user');
|
||||
const { default: Note } = require('../../built/models/note');
|
||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||
|
||||
const now = new Date();
|
||||
const y = now.getFullYear();
|
||||
const m = now.getMonth();
|
||||
const d = now.getDate();
|
||||
const today = new Date(y, m, d);
|
||||
|
||||
async function main() {
|
||||
const localUsersCount = await User.count({
|
||||
host: null
|
||||
});
|
||||
|
||||
const remoteUsersCount = await User.count({
|
||||
host: { $ne: null }
|
||||
});
|
||||
|
||||
const localNotesCount = await Note.count({
|
||||
'_user.host': null
|
||||
});
|
||||
|
||||
const remoteNotesCount = await Note.count({
|
||||
'_user.host': { $ne: null }
|
||||
});
|
||||
|
||||
const localDriveFilesCount = await DriveFile.count({
|
||||
'metadata._user.host': null
|
||||
});
|
||||
|
||||
const remoteDriveFilesCount = await DriveFile.count({
|
||||
'metadata._user.host': { $ne: null }
|
||||
});
|
||||
|
||||
const localDriveFilesSize = await DriveFile
|
||||
.aggregate([{
|
||||
$match: {
|
||||
'metadata._user.host': null,
|
||||
'metadata.deletedAt': { $exists: false }
|
||||
}
|
||||
}, {
|
||||
$project: {
|
||||
length: true
|
||||
}
|
||||
}, {
|
||||
$group: {
|
||||
_id: null,
|
||||
usage: { $sum: '$length' }
|
||||
}
|
||||
}])
|
||||
.then(aggregates => {
|
||||
if (aggregates.length > 0) {
|
||||
return aggregates[0].usage;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
const remoteDriveFilesSize = await DriveFile
|
||||
.aggregate([{
|
||||
$match: {
|
||||
'metadata._user.host': { $ne: null },
|
||||
'metadata.deletedAt': { $exists: false }
|
||||
}
|
||||
}, {
|
||||
$project: {
|
||||
length: true
|
||||
}
|
||||
}, {
|
||||
$group: {
|
||||
_id: null,
|
||||
usage: { $sum: '$length' }
|
||||
}
|
||||
}])
|
||||
.then(aggregates => {
|
||||
if (aggregates.length > 0) {
|
||||
return aggregates[0].usage;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
await Stats.insert({
|
||||
date: today,
|
||||
users: {
|
||||
local: {
|
||||
total: localUsersCount,
|
||||
diff: 0
|
||||
},
|
||||
remote: {
|
||||
total: remoteUsersCount,
|
||||
diff: 0
|
||||
}
|
||||
},
|
||||
notes: {
|
||||
local: {
|
||||
total: localNotesCount,
|
||||
diff: 0,
|
||||
diffs: {
|
||||
normal: 0,
|
||||
reply: 0,
|
||||
renote: 0
|
||||
}
|
||||
},
|
||||
remote: {
|
||||
total: remoteNotesCount,
|
||||
diff: 0,
|
||||
diffs: {
|
||||
normal: 0,
|
||||
reply: 0,
|
||||
renote: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
drive: {
|
||||
local: {
|
||||
totalCount: localDriveFilesCount,
|
||||
totalSize: localDriveFilesSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
},
|
||||
remote: {
|
||||
totalCount: remoteDriveFilesCount,
|
||||
totalSize: remoteDriveFilesSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
console.log('done');
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -1,144 +0,0 @@
|
||||
const { default: Stats } = require('../../built/models/stats');
|
||||
const { default: User } = require('../../built/models/user');
|
||||
const { default: Note } = require('../../built/models/note');
|
||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||
|
||||
const now = new Date();
|
||||
const y = now.getFullYear();
|
||||
const m = now.getMonth();
|
||||
const d = now.getDate();
|
||||
const h = now.getHours();
|
||||
const date = new Date(y, m, d, h);
|
||||
|
||||
async function main() {
|
||||
await Stats.update({}, {
|
||||
$set: {
|
||||
span: 'day'
|
||||
}
|
||||
}, {
|
||||
multi: true
|
||||
});
|
||||
|
||||
const localUsersCount = await User.count({
|
||||
host: null
|
||||
});
|
||||
|
||||
const remoteUsersCount = await User.count({
|
||||
host: { $ne: null }
|
||||
});
|
||||
|
||||
const localNotesCount = await Note.count({
|
||||
'_user.host': null
|
||||
});
|
||||
|
||||
const remoteNotesCount = await Note.count({
|
||||
'_user.host': { $ne: null }
|
||||
});
|
||||
|
||||
const localDriveFilesCount = await DriveFile.count({
|
||||
'metadata._user.host': null
|
||||
});
|
||||
|
||||
const remoteDriveFilesCount = await DriveFile.count({
|
||||
'metadata._user.host': { $ne: null }
|
||||
});
|
||||
|
||||
const localDriveFilesSize = await DriveFile
|
||||
.aggregate([{
|
||||
$match: {
|
||||
'metadata._user.host': null,
|
||||
'metadata.deletedAt': { $exists: false }
|
||||
}
|
||||
}, {
|
||||
$project: {
|
||||
length: true
|
||||
}
|
||||
}, {
|
||||
$group: {
|
||||
_id: null,
|
||||
usage: { $sum: '$length' }
|
||||
}
|
||||
}])
|
||||
.then(aggregates => {
|
||||
if (aggregates.length > 0) {
|
||||
return aggregates[0].usage;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
const remoteDriveFilesSize = await DriveFile
|
||||
.aggregate([{
|
||||
$match: {
|
||||
'metadata._user.host': { $ne: null },
|
||||
'metadata.deletedAt': { $exists: false }
|
||||
}
|
||||
}, {
|
||||
$project: {
|
||||
length: true
|
||||
}
|
||||
}, {
|
||||
$group: {
|
||||
_id: null,
|
||||
usage: { $sum: '$length' }
|
||||
}
|
||||
}])
|
||||
.then(aggregates => {
|
||||
if (aggregates.length > 0) {
|
||||
return aggregates[0].usage;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
await Stats.insert({
|
||||
date: date,
|
||||
span: 'hour',
|
||||
users: {
|
||||
local: {
|
||||
total: localUsersCount,
|
||||
diff: 0
|
||||
},
|
||||
remote: {
|
||||
total: remoteUsersCount,
|
||||
diff: 0
|
||||
}
|
||||
},
|
||||
notes: {
|
||||
local: {
|
||||
total: localNotesCount,
|
||||
diff: 0,
|
||||
diffs: {
|
||||
normal: 0,
|
||||
reply: 0,
|
||||
renote: 0
|
||||
}
|
||||
},
|
||||
remote: {
|
||||
total: remoteNotesCount,
|
||||
diff: 0,
|
||||
diffs: {
|
||||
normal: 0,
|
||||
reply: 0,
|
||||
renote: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
drive: {
|
||||
local: {
|
||||
totalCount: localDriveFilesCount,
|
||||
totalSize: localDriveFilesSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
},
|
||||
remote: {
|
||||
totalCount: remoteDriveFilesCount,
|
||||
totalSize: remoteDriveFilesSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
console.log('done');
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -5,8 +5,8 @@ services:
|
||||
build: .
|
||||
restart: always
|
||||
links:
|
||||
- mongo
|
||||
# - redis
|
||||
- db
|
||||
- redis
|
||||
# - es
|
||||
ports:
|
||||
- "127.0.0.1:3000:3000"
|
||||
@@ -14,26 +14,23 @@ services:
|
||||
- internal_network
|
||||
- external_network
|
||||
|
||||
# redis:
|
||||
# restart: always
|
||||
# image: redis:4.0-alpine
|
||||
# networks:
|
||||
# - internal_network
|
||||
### Uncomment to enable Redis persistance
|
||||
## volumes:
|
||||
## - ./redis:/data
|
||||
|
||||
mongo:
|
||||
redis:
|
||||
restart: always
|
||||
image: mongo:4.1
|
||||
image: redis:4.0-alpine
|
||||
networks:
|
||||
- internal_network
|
||||
environment:
|
||||
MONGO_INITDB_DATABASE: "misskey"
|
||||
volumes:
|
||||
- ./.config/mongo_initdb.js:/docker-entrypoint-initdb.d/mongo_initdb.js:ro
|
||||
### Uncomment to enable MongoDB persistance
|
||||
# - ./mongo:/data
|
||||
- ./redis:/data
|
||||
|
||||
db:
|
||||
restart: always
|
||||
image: postgres:11.2-alpine
|
||||
networks:
|
||||
- internal_network
|
||||
env_file:
|
||||
- .config/docker.env
|
||||
volumes:
|
||||
- ./db:/var/lib/postgresql/data
|
||||
|
||||
# es:
|
||||
# restart: always
|
||||
@@ -42,9 +39,8 @@ services:
|
||||
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||
# networks:
|
||||
# - internal_network
|
||||
#### Uncomment to enable ES persistence
|
||||
## volumes:
|
||||
## - ./elasticsearch:/usr/share/elasticsearch/data
|
||||
# volumes:
|
||||
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||
|
||||
networks:
|
||||
internal_network:
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
Comment faire une sauvegarde de votre Misskey ?
|
||||
==========================
|
||||
|
||||
Assurez-vous d'avoir installé **mongodb-tools**.
|
||||
|
||||
---
|
||||
|
||||
Dans votre terminal :
|
||||
``` shell
|
||||
$ mongodump --archive=db-backup -u <VotreNomdUtilisateur> -p <VotreMotDePasse>
|
||||
```
|
||||
|
||||
Pour plus de détails, merci de consulter [la documentation de mongodump](https://docs.mongodb.com/manual/reference/program/mongodump/).
|
||||
|
||||
Restauration
|
||||
-------
|
||||
|
||||
``` shell
|
||||
$ mongorestore --archive=db-backup
|
||||
```
|
||||
|
||||
Pour plus de détails, merci de consulter [la documentation de mongorestore](https://docs.mongodb.com/manual/reference/program/mongorestore/).
|
||||
@@ -1,22 +0,0 @@
|
||||
How to backup your Misskey
|
||||
==========================
|
||||
|
||||
Make sure **mongodb-tools** installed.
|
||||
|
||||
---
|
||||
|
||||
In your shell:
|
||||
``` shell
|
||||
$ mongodump --archive=db-backup -u <YourUserName> -p <YourPassword>
|
||||
```
|
||||
|
||||
For details, please see [mongodump docs](https://docs.mongodb.com/manual/reference/program/mongodump/).
|
||||
|
||||
Restore
|
||||
-------
|
||||
|
||||
``` shell
|
||||
$ mongorestore --archive=db-backup
|
||||
```
|
||||
|
||||
For details, please see [mongorestore docs](https://docs.mongodb.com/manual/reference/program/mongorestore/).
|
||||
@@ -9,15 +9,51 @@ This guide describes how to install and setup Misskey with Docker.
|
||||
|
||||
*1.* Download Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch.
|
||||
2. `cd misskey` Move to misskey directory.
|
||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
|
||||
1. Clone Misskey repository's master branch.
|
||||
|
||||
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||
|
||||
2. Move to misskey directory.
|
||||
|
||||
`cd misskey`
|
||||
|
||||
3. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
|
||||
|
||||
`git checkout master`
|
||||
|
||||
*2.* Configure Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
|
||||
3. Edit `default.yml` and `mongo_initdb.js`.
|
||||
|
||||
Create configuration files with following:
|
||||
|
||||
```bash
|
||||
cd .config
|
||||
cp example.yml default.yml
|
||||
cp docker_example.env docker.env
|
||||
```
|
||||
|
||||
### `default.yml`
|
||||
|
||||
Edit this file the same as non-Docker environment.
|
||||
However hostname of Postgresql, Redis and Elasticsearch are not `localhost`, they are set in `docker-compose.yml`.
|
||||
The following is default hostname:
|
||||
|
||||
| Service | Hostname |
|
||||
|---------------|----------|
|
||||
| Postgresql | `db` |
|
||||
| Redis | `redis` |
|
||||
| Elasticsearch | `es` |
|
||||
|
||||
### `docker.env`
|
||||
|
||||
Configure Postgresql in this file.
|
||||
The minimum required settings are:
|
||||
|
||||
| name | Description |
|
||||
|---------------------|---------------|
|
||||
| `POSTGRES_PASSWORD` | Password |
|
||||
| `POSTGRES_USER` | Username |
|
||||
| `POSTGRES_DB` | Database name |
|
||||
|
||||
*3.* Configure Docker
|
||||
----------------------------------------------------------------
|
||||
@@ -29,7 +65,13 @@ Build misskey with the following:
|
||||
|
||||
`docker-compose build`
|
||||
|
||||
*5.* That is it.
|
||||
*5.* Init DB
|
||||
----------------------------------------------------------------
|
||||
``` shell
|
||||
docker-compose run --rm web npm run init
|
||||
```
|
||||
|
||||
*6.* That is it.
|
||||
----------------------------------------------------------------
|
||||
Well done! Now you have an environment to run Misskey.
|
||||
|
||||
@@ -37,9 +79,9 @@ Well done! Now you have an environment to run Misskey.
|
||||
Just `docker-compose up -d`. GLHF!
|
||||
|
||||
### How to update your Misskey server to the latest version
|
||||
1. `git fetch`
|
||||
2. `git stash`
|
||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
1. `git stash`
|
||||
2. `git checkout master`
|
||||
3. `git pull`
|
||||
4. `git stash pop`
|
||||
5. `docker-compose build`
|
||||
6. Check [ChangeLog](../CHANGELOG.md) for migration information
|
||||
|
||||
@@ -10,9 +10,17 @@ Ce guide explique comment installer et configurer Misskey avec Docker.
|
||||
|
||||
*1.* Télécharger Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone le dépôt de Misskey sur la branche master.
|
||||
2. `cd misskey` Naviguez dans le dossier du dépôt.
|
||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
|
||||
1. Clone le dépôt de Misskey sur la branche master.
|
||||
|
||||
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||
|
||||
2. Naviguez dans le dossier du dépôt.
|
||||
|
||||
`cd misskey`
|
||||
|
||||
3. Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
|
||||
|
||||
`git checkout master`
|
||||
|
||||
*2.* Configuration de Misskey
|
||||
----------------------------------------------------------------
|
||||
@@ -38,9 +46,9 @@ Parfait, Vous avez un environnement prêt pour démarrer Misskey.
|
||||
Utilisez la commande `docker-compose up -d`. GLHF!
|
||||
|
||||
### How to update your Misskey server to the latest version
|
||||
1. `git fetch`
|
||||
2. `git stash`
|
||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
1. `git stash`
|
||||
2. `git checkout master`
|
||||
3. `git pull`
|
||||
4. `git stash pop`
|
||||
5. `docker-compose build`
|
||||
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
|
||||
@@ -52,14 +60,28 @@ Utilisez la commande `docker-compose up -d`. GLHF!
|
||||
### Configuration d'ElasticSearch (pour la fonction de recherche)
|
||||
*1.* Préparation de l'environnement
|
||||
----------------------------------------------------------------
|
||||
1. `mkdir elasticsearch && chown 1000:1000 elasticsearch` Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
|
||||
2. `sysctl -w vm.max_map_count=262144` Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
|
||||
1. Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
|
||||
|
||||
`mkdir elasticsearch && chown 1000:1000 elasticsearch`
|
||||
|
||||
2. Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
|
||||
|
||||
`sysctl -w vm.max_map_count=262144`
|
||||
|
||||
*2.* Après lancement du docker-compose, initialisation de la base ElasticSearch
|
||||
----------------------------------------------------------------
|
||||
1. `docker-compose -it web /bin/sh` Connexion dans le conteneur web
|
||||
2. `apk add curl` Ajout du paquet curl
|
||||
3. `curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'` Création de la base ES
|
||||
1. Connexion dans le conteneur web
|
||||
|
||||
`docker-compose -it web /bin/sh`
|
||||
|
||||
2. Ajout du paquet curl
|
||||
|
||||
`apk add curl`
|
||||
|
||||
3. Création de la base ES
|
||||
|
||||
`curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'`
|
||||
|
||||
4. `exit`
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
@@ -9,15 +9,51 @@ Dockerを使ったMisskey構築方法
|
||||
|
||||
*1.* Misskeyのダウンロード
|
||||
----------------------------------------------------------------
|
||||
1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
|
||||
2. `cd misskey` misskeyディレクトリに移動
|
||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||
1. masterブランチからMisskeyレポジトリをクローン
|
||||
|
||||
*2.* 設定ファイルを作成する
|
||||
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||
|
||||
2. misskeyディレクトリに移動
|
||||
|
||||
`cd misskey`
|
||||
|
||||
3. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||
|
||||
`git checkout master`
|
||||
|
||||
*2.* 設定ファイルの作成と編集
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする
|
||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする
|
||||
3. `default.yml`と`mongo_initdb.js`を編集する
|
||||
|
||||
下記コマンドで設定ファイルを作成してください。
|
||||
|
||||
```bash
|
||||
cd .config
|
||||
cp example.yml default.yml
|
||||
cp docker_example.env docker.env
|
||||
```
|
||||
|
||||
### `default.yml`の編集
|
||||
|
||||
非Docker環境と同じ様に編集してください。
|
||||
ただし、Postgresql、RedisとElasticsearchのホストは`localhost`ではなく、`docker-compose.yml`で設定されたサービス名になっています。
|
||||
標準設定では次の通りです。
|
||||
|
||||
| サービス | ホスト名 |
|
||||
|---------------|---------|
|
||||
| Postgresql |`db` |
|
||||
| Redis |`redis` |
|
||||
| Elasticsearch |`es` |
|
||||
|
||||
### `docker.env`の編集
|
||||
|
||||
このファイルはPostgresqlの設定を記述します。
|
||||
最低限記述する必要がある設定は次の通りです。
|
||||
|
||||
| 設定 | 内容 |
|
||||
|---------------------|--------------|
|
||||
| `POSTGRES_PASSWORD` | パスワード |
|
||||
| `POSTGRES_USER` | ユーザー名 |
|
||||
| `POSTGRES_DB` | データベース名 |
|
||||
|
||||
*3.* Dockerの設定
|
||||
----------------------------------------------------------------
|
||||
@@ -29,7 +65,13 @@ Dockerを使ったMisskey構築方法
|
||||
|
||||
`docker-compose build`
|
||||
|
||||
*5.* 以上です!
|
||||
*5.* データベースを初期化
|
||||
----------------------------------------------------------------
|
||||
``` shell
|
||||
docker-compose run --rm web npm run init
|
||||
```
|
||||
|
||||
*6.* 以上です!
|
||||
----------------------------------------------------------------
|
||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||
|
||||
@@ -37,9 +79,9 @@ Dockerを使ったMisskey構築方法
|
||||
`docker-compose up -d`するだけです。GLHF!
|
||||
|
||||
### Misskeyを最新バージョンにアップデートする方法:
|
||||
1. `git fetch`
|
||||
2. `git stash`
|
||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
1. `git stash`
|
||||
2. `git checkout master`
|
||||
3. `git pull`
|
||||
4. `git stash pop`
|
||||
5. `docker-compose build`
|
||||
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||
|
||||
@@ -29,7 +29,7 @@ server {
|
||||
listen [::]:443 http2;
|
||||
server_name example.tld;
|
||||
ssl on;
|
||||
ssl_session_cache shared:ssl_session_cache:10m;
|
||||
ssl_session_cache shared:ssl_session_cache:10m;
|
||||
|
||||
# To use Let's Encrypt certificate
|
||||
ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem;
|
||||
|
||||
106
docs/setup.en.md
106
docs/setup.en.md
@@ -22,37 +22,45 @@ adduser --disabled-password --disabled-login misskey
|
||||
Please install and setup these softwares:
|
||||
|
||||
#### Dependencies :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||
* **[Redis](https://redis.io/)**
|
||||
|
||||
##### Optional
|
||||
* [Redis](https://redis.io/)
|
||||
* Redis is optional, but we strongly recommended to install it
|
||||
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
|
||||
* [FFmpeg](https://www.ffmpeg.org/)
|
||||
|
||||
*3.* Setup MongoDB
|
||||
*3.* Install Misskey
|
||||
----------------------------------------------------------------
|
||||
As root:
|
||||
1. `mongo` Go to the mongo shell
|
||||
2. `use misskey` Use the misskey database
|
||||
3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Create the misskey user.
|
||||
4. `exit` You're done!
|
||||
1. Connect to misskey user.
|
||||
|
||||
*4.* Install Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `su - misskey` Connect to misskey user.
|
||||
2. `git clone -b master git://github.com/syuilo/misskey.git` Clone the misskey repo from master branch.
|
||||
3. `cd misskey` Navigate to misskey directory
|
||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
|
||||
5. `npm install` Install misskey dependencies.
|
||||
`su - misskey`
|
||||
|
||||
*5.* Configure Misskey
|
||||
2. Clone the misskey repo from master branch.
|
||||
|
||||
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||
|
||||
3. Navigate to misskey directory
|
||||
|
||||
`cd misskey`
|
||||
|
||||
4. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
|
||||
|
||||
`git checkout master`
|
||||
|
||||
5. Install misskey dependencies.
|
||||
|
||||
`npm install`
|
||||
|
||||
*4.* Configure Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
||||
1. Copy the `.config/example.yml` and rename it to `default.yml`.
|
||||
|
||||
`cp .config/example.yml .config/default.yml`
|
||||
|
||||
2. Edit `default.yml`
|
||||
|
||||
*6.* Build Misskey
|
||||
*5.* Build Misskey
|
||||
----------------------------------------------------------------
|
||||
|
||||
Build misskey with the following:
|
||||
@@ -68,6 +76,12 @@ If you're still encountering errors about some modules, use node-gyp:
|
||||
3. `node-gyp build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
|
||||
*6.* Init DB
|
||||
----------------------------------------------------------------
|
||||
``` shell
|
||||
npm run init
|
||||
```
|
||||
|
||||
*7.* That is it.
|
||||
----------------------------------------------------------------
|
||||
Well done! Now, you have an environment that run to Misskey.
|
||||
@@ -77,37 +91,45 @@ Just `NODE_ENV=production npm start`. GLHF!
|
||||
|
||||
### Launch with systemd
|
||||
|
||||
1. Create a systemd service here: `/etc/systemd/system/misskey.service`
|
||||
1. Create a systemd service here
|
||||
|
||||
`/etc/systemd/system/misskey.service`
|
||||
|
||||
2. Edit it, and paste this and save:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
3. `systemctl daemon-reload ; systemctl enable misskey` Reload systemd and enable the misskey service.
|
||||
4. `systemctl start misskey` Start the misskey service.
|
||||
3. Reload systemd and enable the misskey service.
|
||||
|
||||
`systemctl daemon-reload ; systemctl enable misskey`
|
||||
|
||||
4. Start the misskey service.
|
||||
|
||||
`systemctl start misskey`
|
||||
|
||||
You can check if the service is running with `systemctl status misskey`.
|
||||
|
||||
### How to update your Misskey server to the latest version
|
||||
1. `git fetch`
|
||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
1. `git checkout master`
|
||||
2. `git pull`
|
||||
3. `npm install`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
||||
|
||||
102
docs/setup.fr.md
102
docs/setup.fr.md
@@ -22,37 +22,45 @@ adduser --disabled-password --disabled-login misskey
|
||||
Installez les paquets suivants :
|
||||
|
||||
#### Dépendences :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||
* **[Redis](https://redis.io/)**
|
||||
|
||||
##### Optionnels
|
||||
* [Redis](https://redis.io/)
|
||||
* Redis est optionnel mais nous vous recommandons vivement de l'installer
|
||||
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
|
||||
* [FFmpeg](https://www.ffmpeg.org/)
|
||||
|
||||
*3.* Paramètrage de MongoDB
|
||||
*3.* Installation de Misskey
|
||||
----------------------------------------------------------------
|
||||
En root :
|
||||
1. `mongo` Ouvrez le shell mongo
|
||||
2. `use misskey` Utilisez la base de données misskey
|
||||
3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
|
||||
4. `exit` Vous avez terminé !
|
||||
1. Basculez vers l'utilisateur misskey.
|
||||
|
||||
*4.* Installation de Misskey
|
||||
----------------------------------------------------------------
|
||||
1. `su - misskey` Basculez vers l'utilisateur misskey.
|
||||
2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey.
|
||||
3. `cd misskey` Accédez au dossier misskey.
|
||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
|
||||
5. `npm install` Installez les dépendances de misskey.
|
||||
`su - misskey`
|
||||
|
||||
*5.* Création du fichier de configuration
|
||||
2. Clonez la branche master du dépôt misskey.
|
||||
|
||||
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||
|
||||
3. Accédez au dossier misskey.
|
||||
|
||||
`cd misskey`
|
||||
|
||||
4. Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
|
||||
|
||||
`git checkout master`
|
||||
|
||||
5. Installez les dépendances de misskey.
|
||||
|
||||
`npm install`
|
||||
|
||||
*4.* Création du fichier de configuration
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le`default.yml`.
|
||||
1. Copiez le fichier `.config/example.yml` et renommez-le`default.yml`.
|
||||
|
||||
`cp .config/example.yml .config/default.yml`
|
||||
|
||||
2. Editez le fichier `default.yml`
|
||||
|
||||
*6.* Construction de Misskey
|
||||
*5.* Construction de Misskey
|
||||
----------------------------------------------------------------
|
||||
|
||||
Construisez Misskey comme ceci :
|
||||
@@ -68,7 +76,7 @@ Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
||||
3. `node-gyp build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
|
||||
*7.* C'est tout.
|
||||
*6.* C'est tout.
|
||||
----------------------------------------------------------------
|
||||
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
||||
|
||||
@@ -77,37 +85,45 @@ Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-v
|
||||
|
||||
### Démarrage avec systemd
|
||||
|
||||
1. Créez un service systemd sur : `/etc/systemd/system/misskey.service`
|
||||
1. Créez un service systemd sur
|
||||
|
||||
`/etc/systemd/system/misskey.service`
|
||||
|
||||
2. Editez-le puis copiez et coller ceci dans le fichier :
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey.
|
||||
4. `systemctl start misskey` Démarre le service misskey.
|
||||
3. Redémarre systemd et active le service misskey.
|
||||
|
||||
`systemctl daemon-reload ; systemctl enable misskey`
|
||||
|
||||
4. Démarre le service misskey.
|
||||
|
||||
`systemctl start misskey`
|
||||
|
||||
Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`.
|
||||
|
||||
### Méthode de mise à jour vers la plus récente version de Misskey
|
||||
1. `git fetch`
|
||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
1. `git checkout master`
|
||||
2. `git pull`
|
||||
3. `npm install`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
||||
|
||||
117
docs/setup.ja.md
117
docs/setup.ja.md
@@ -22,44 +22,46 @@ adduser --disabled-password --disabled-login misskey
|
||||
これらのソフトウェアをインストール・設定してください:
|
||||
|
||||
#### 依存関係 :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** (10.0.0以上)
|
||||
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
||||
* **[Node.js](https://nodejs.org/en/)** (11.7.0以上)
|
||||
* **[PostgreSQL](https://www.postgresql.org/)** (10以上)
|
||||
* **[Redis](https://redis.io/)**
|
||||
|
||||
##### オプション
|
||||
* [Redis](https://redis.io/)
|
||||
* Redisはオプションですが、インストールすることを強く推奨します。
|
||||
* インストールしなくていいのは、あなたのインスタンスが自分専用のときだけとお考えください。
|
||||
* 具体的には、Redisをインストールしないと、次の事が出来なくなります:
|
||||
* Misskeyプロセスを複数起動しての負荷分散
|
||||
* レートリミット
|
||||
* ジョブキュー
|
||||
* Twitter連携
|
||||
* [Elasticsearch](https://www.elastic.co/)
|
||||
* 検索機能を有効にするためにはインストールが必要です。
|
||||
* [FFmpeg](https://www.ffmpeg.org/)
|
||||
|
||||
*3.* MongoDBの設定
|
||||
*3.* Misskeyのインストール
|
||||
----------------------------------------------------------------
|
||||
ルートで:
|
||||
1. `mongo` mongoシェルを起動
|
||||
2. `use misskey` misskeyデータベースを使用
|
||||
3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` misskeyユーザーを作成
|
||||
4. `exit` mongoシェルを終了
|
||||
1. misskeyユーザーを使用
|
||||
|
||||
*4.* Misskeyのインストール
|
||||
----------------------------------------------------------------
|
||||
1. `su - misskey` misskeyユーザーを使用
|
||||
2. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
|
||||
3. `cd misskey` misskeyディレクトリに移動
|
||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||
5. `npm install` Misskeyの依存パッケージをインストール
|
||||
`su - misskey`
|
||||
|
||||
*5.* 設定ファイルを作成する
|
||||
2. masterブランチからMisskeyレポジトリをクローン
|
||||
|
||||
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||
|
||||
3. misskeyディレクトリに移動
|
||||
|
||||
`cd misskey`
|
||||
|
||||
4. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||
|
||||
`git checkout master`
|
||||
|
||||
5. Misskeyの依存パッケージをインストール
|
||||
|
||||
`npm install`
|
||||
|
||||
*4.* 設定ファイルを作成する
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。
|
||||
1. `.config/example.yml`をコピーし名前を`default.yml`にする。
|
||||
|
||||
`cp .config/example.yml .config/default.yml`
|
||||
|
||||
2. `default.yml` を編集する。
|
||||
|
||||
*6.* Misskeyのビルド
|
||||
*5.* Misskeyのビルド
|
||||
----------------------------------------------------------------
|
||||
|
||||
次のコマンドでMisskeyをビルドしてください:
|
||||
@@ -74,6 +76,12 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
||||
3. `node-gyp build`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
|
||||
*6.* データベースを初期化
|
||||
----------------------------------------------------------------
|
||||
``` shell
|
||||
npm run init
|
||||
```
|
||||
|
||||
*7.* 以上です!
|
||||
----------------------------------------------------------------
|
||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||
@@ -82,43 +90,52 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
||||
`NODE_ENV=production npm start`するだけです。GLHF!
|
||||
|
||||
### systemdを用いた起動
|
||||
1. systemdサービスのファイルを作成: `/etc/systemd/system/misskey.service`
|
||||
1. systemdサービスのファイルを作成
|
||||
|
||||
`/etc/systemd/system/misskey.service`
|
||||
|
||||
2. エディタで開き、以下のコードを貼り付けて保存:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
```
|
||||
[Unit]
|
||||
Description=Misskey daemon
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
[Service]
|
||||
Type=simple
|
||||
User=misskey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/misskey/misskey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=misskey
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
|
||||
4. `systemctl start misskey` misskeyサービスの起動
|
||||
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
||||
|
||||
3. systemdを再読み込みしmisskeyサービスを有効化
|
||||
|
||||
`systemctl daemon-reload ; systemctl enable misskey`
|
||||
|
||||
4. misskeyサービスの起動
|
||||
|
||||
`systemctl start misskey`
|
||||
|
||||
`systemctl status misskey`と入力すると、サービスの状態を調べることができます。
|
||||
|
||||
### Misskeyを最新バージョンにアップデートする方法:
|
||||
1. `git fetch`
|
||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
||||
1. `git checkout master`
|
||||
2. `git pull`
|
||||
3. `npm install`
|
||||
4. `NODE_ENV=production npm run build`
|
||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||
|
||||
なにか問題が発生した場合は、`npm run clean`すると直る場合があります。
|
||||
なにか問題が発生した場合は、`npm run clean`または`npm run cleanall`すると直る場合があります。
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ gulp.task('build:copy:views', () =>
|
||||
|
||||
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
||||
gulp.src([
|
||||
'./build/Release/crypto_key.node',
|
||||
'./src/const.json',
|
||||
'./src/server/web/views/**/*',
|
||||
'./src/**/assets/**/*',
|
||||
@@ -120,7 +119,7 @@ gulp.task('copy:client', () =>
|
||||
])
|
||||
.pipe(isProduction ? (imagemin as any)() : gutil.noop())
|
||||
.pipe(rename(path => {
|
||||
path.dirname = path.dirname.replace('assets', '.');
|
||||
path.dirname = path.dirname!.replace('assets', '.');
|
||||
}))
|
||||
.pipe(gulp.dest('./built/client/assets/'))
|
||||
);
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
meta:
|
||||
lang: "Čeština"
|
||||
common:
|
||||
misskey: "⭐ ve fediverse"
|
||||
about-title: "⭐ ve fediverse."
|
||||
about: "Děkujeme, že jste našli Misskey. Misskey je <b>decentralizovaná mikroblogovací platforma</b> zrozená na Zemi. Neboť existuje ve Fediverse (vesmíru, kde jsou organizovány různé sociální sítě), je vzájemně propojena s jinými sociálními sítěmi. Co takhle si chvilku odpočinout od ruchu a shonu města a ponořit se do nového internetu?"
|
||||
misskey: "⭐ ve fedivesmíru"
|
||||
about-title: "⭐ ve fedivesmíru."
|
||||
about: "Děkujeme, že jste našli Misskey. Misskey je <b>decentralizovaná mikroblogovací platforma</b> zrozená na Zemi. Neboť existuje ve fedivesmíru (vesmíru, kde jsou organizovány různé sociální sítě), je vzájemně propojena s jinými sociálními sítěmi. Co takhle si chvilku odpočinout od ruchu a shonu města a ponořit se do nového internetu?"
|
||||
intro:
|
||||
title: "Co je Misskey?"
|
||||
about: "Misskey je open-source <b>decentralizovaný mikroblogovací software</b>. Má sofistikované, zcela přizpůsobitelné uživatelské rozhraní, různé způsoby reagování na příspěvky, bezplatné úložiště souborů nabízející integrovaný management system, a další pokročilé vlastnosti. Misskey je navíc připojeno k systému sítí zvanému „fediverse“, který nám dovoluje komunikovat s uživateli na jiných sociálních sítí. Pokud například něco napíšete, nebude to posláno pouze uživatelů Misskey, ale také lidem na sítích Mastodon a Pleroma. Jen si představte, že planeta posílá jiné planetě rádiový signál, aby s ní komunikovala."
|
||||
about: "Misskey je open-source <b>decentralizovaný mikroblogovací software</b>. Má sofistikované, zcela přizpůsobitelné uživatelské rozhraní, různé způsoby reagování na příspěvky, bezplatné úložiště souborů nabízející integrovaný management system, a další pokročilé vlastnosti. Misskey je navíc připojeno k systému sítí zvanému „fedivesmír“ nebo „fediverse“, který nám dovoluje komunikovat s uživateli na jiných sociálních sítí. Pokud například něco napíšete, nebude to posláno pouze uživatelů Misskey, ale také lidem na sítích Mastodon a Pleroma. Jen si představte, že planeta posílá jiné planetě rádiový signál, aby s ní komunikovala."
|
||||
features: "Vlastnosti"
|
||||
rich-contents: "Příspěvky"
|
||||
rich-contents-desc: "Pouze napište svoje nápady, žhavá témata a cokoliv, co chcete sdílet. Můžete ozdobit svá slova, připojit vaše oblíbené obrázky, posílat soubory včetně videí či vytvořit hlasování – to je jen několik věcí, co můžete dělat s Misskey!"
|
||||
@@ -20,7 +20,7 @@ common:
|
||||
outro: "Podívejte se na unikátní vlastnosti Misskey vlastníma očima! Pokud si myslíte, že tato instance není pro vás, zkuste jiné instance, neboť Misskey je decentralizovaná sociální síť, takže můžete snadno najít své přátele. Hodně štěstí a zábavy!"
|
||||
adblock:
|
||||
detected: "Prosím vypněte svůj blokovač reklam"
|
||||
warning: "<strong>Misskey nepoužívá reklamy</strong>, některé vlastnosti však mohou být nedostupné nebo mohou způsobovat chyby, pokud máte povolený blokovač reklam."
|
||||
warning: "Některé vlastnosti mohou být nedostupné nebo mohou způsobovat chyby, pokud máte povolený blokovač reklam. <strong>Misskey nepoužívá reklamy</strong>."
|
||||
application-authorization: "Autorizované aplikace"
|
||||
close: "Zavřít"
|
||||
do-not-copy-paste: "Prosím nezadávejte ani nevkládejte sem kód. Váš účet může být kompromitován."
|
||||
@@ -61,6 +61,7 @@ common:
|
||||
month-and-day: "{day}. {month}."
|
||||
trash: "Koš"
|
||||
drive: "Disk"
|
||||
pages: "Stránky"
|
||||
messaging: "Konverzace"
|
||||
home: "Domů"
|
||||
deck: "Deck"
|
||||
@@ -69,9 +70,48 @@ common:
|
||||
following: "Sledovaní"
|
||||
followers: "Sledující"
|
||||
favorites: "Oblíbené"
|
||||
permissions:
|
||||
"read:account": "Zobrazit informace o účtu"
|
||||
"write:account": "Narábět s účtem"
|
||||
"read:blocks": "Prohlížet blokování"
|
||||
"write:blocks": "Narábět s blokováním"
|
||||
"read:drive": "Prohlížet Disk"
|
||||
"write:drive": "Pracovat s Diskem"
|
||||
"read:favorites": "Prohlížet oblíbené"
|
||||
"write:favorites": "Narábět s oblíbeními"
|
||||
"read:following": "Prohlížet následování"
|
||||
"write:following": "Pracovat s následováním"
|
||||
"read:messaging": "Prohlížet konverzaci"
|
||||
"write:messaging": "Pracovat s konverzaci"
|
||||
"read:mutes": "Prohlížet ztlumené"
|
||||
"write:mutes": "Narábět s utíšeními"
|
||||
"write:notes": "Narábět s poznámkami"
|
||||
"read:notifications": "Prohlížet oznámení"
|
||||
"write:notifications": "Pracovat s oznámeními"
|
||||
"read:reactions": "Prohlížet reakce"
|
||||
"write:votes": "Hlasovat"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "Poznámky sledujících se zobrazí ve vaší časové ose"
|
||||
explore: "Najít uživatele"
|
||||
post-form:
|
||||
attach-location-information: "Přidat informace o lokaci"
|
||||
hide-contents: "Schovat obsah"
|
||||
reply-placeholder: "Odpovědět na tento příspěvek"
|
||||
quote-placeholder: "Citovat tento příspěvek"
|
||||
submit: "Odeslat"
|
||||
reply: "Odpovědět"
|
||||
renote: "Renotovat"
|
||||
attach-media-from-local: "Uplodovat soubor z vašeho zařízení"
|
||||
insert-a-kao: "v('ω')v"
|
||||
create-poll: "Vytvořit anketu"
|
||||
text-remain: "zbývá ještě {} znaků"
|
||||
recent-tags: "Nejnovější"
|
||||
visibility: "Viditelnost"
|
||||
geolocation-alert: "Vaše zařízení nedalo k dispozici lokaci"
|
||||
error: "Chyba"
|
||||
enter-username: "Zadejte své uživatelské jméno"
|
||||
add-visible-user: "Přidat uživatele"
|
||||
username-prompt: "Zadejte své uživatelské jméno"
|
||||
weekday-short:
|
||||
sunday: "Ne"
|
||||
monday: "Po"
|
||||
@@ -131,7 +171,7 @@ common:
|
||||
other: "Ostatní"
|
||||
appearance: "Vzhled"
|
||||
behavior: "Chování"
|
||||
fetch-on-scroll: "Nekonečné rolování"
|
||||
fetch-on-scroll: "Nekonečné načítaní posuvem"
|
||||
fetch-on-scroll-desc: "Pokud budete rolovat dolů po stránce, automaticky bude načten další obsah."
|
||||
note-visibility: "Viditelnost příspěvku"
|
||||
default-note-visibility: "Výchozí viditelnost příspěvku"
|
||||
@@ -143,7 +183,12 @@ common:
|
||||
i-like-sushi: "Mam radši sushi (než puding)"
|
||||
show-reversi-board-labels: "Zobrazit označení řad a sloupců v Reversi"
|
||||
use-avatar-reversi-stones: "Použít avatar jako figurku v Reversi"
|
||||
disable-animated-mfm: "Vypnout pohyblivé texty v příspěvku"
|
||||
disable-showing-animated-images: "Nepřehrávat animované obrázky"
|
||||
suggest-recent-hashtags: "Navrhovat nedávné hashtagy v rámci psacího pole"
|
||||
always-show-nsfw: "Vždycky ukázat NSFW obsah"
|
||||
always-mark-nsfw: "Označovat všechny příspěvky za delikátní"
|
||||
show-full-acct: "Zaradit hostovací server jako součast přezdívky"
|
||||
show-via: "zobrazit přes"
|
||||
reduce-motion: "Snížit pohyb v rozhraní"
|
||||
this-setting-is-this-device-only: "Pouze pro toto zařízení"
|
||||
@@ -185,6 +230,7 @@ common:
|
||||
remain-deleted-note: "I nadále zobrazovat odstraněné příspěvky"
|
||||
sound: "Zvuk"
|
||||
enable-sounds: "Povolit zvuk"
|
||||
enable-sounds-desc: "Přehrát zvuk, například při odeslání nebo přijetí příspěvku, či zprávy. Toto nastavení je uloženo v prohlížeči."
|
||||
volume: "Hlasitost"
|
||||
test: "Test"
|
||||
update: "Aktualizace Misskey"
|
||||
@@ -198,6 +244,8 @@ common:
|
||||
update-available: "Je dostupná nová verze"
|
||||
update-available-desc: "Aktualizace budou aplikovány po znovunačtení stránky."
|
||||
advanced-settings: "Pokročilá nastavení"
|
||||
debug-mode: "Povolit režim ladění"
|
||||
debug-mode-desc: "Toto nastavení je uloženo v prohlížeči."
|
||||
navbar-position: "Poloha navigačního panelu"
|
||||
navbar-position-top: "Nahoře"
|
||||
navbar-position-left: "Vlevo"
|
||||
@@ -219,9 +267,10 @@ common:
|
||||
cancel: "Zrušit"
|
||||
update-available-title: "Aktualizace k dispozici"
|
||||
update-available: "Je k dispozici nová verze Misskey ({newer},vaše verze je {current}). Pro aplikování nové verze znovunačtěte stránku."
|
||||
verified-user: "Ověřené účty"
|
||||
my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a."
|
||||
hide-password: "Skrýt heslo"
|
||||
show-password: "Zobrazit heslo"
|
||||
enter-username: "Zadejte své uživatelské jméno"
|
||||
do-not-use-in-production: "Tohle je vývojářský build. Nepoužívejte v produkci."
|
||||
user-suspended: "Tomuto uživateli byl pozastaven účet."
|
||||
is-remote-user: "Informace o tomto uživateli nemusí být kompletní."
|
||||
@@ -267,28 +316,39 @@ common:
|
||||
nav: "Navigace"
|
||||
tips: "Tipy"
|
||||
hashtags: "Hashtagy"
|
||||
queue: "Ve frontě"
|
||||
dev: "Nepodařilo se vytvořit aplikace. Prosím zkuste to znovu."
|
||||
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||
you: "Vy"
|
||||
auth/views/form.vue:
|
||||
share-access: "Chcete dovolit aplikaci <i>{name}</i> přístup k vašemu účtu?"
|
||||
permission-ask: "Tato aplikace vyžaduje následující oprávnění:"
|
||||
account-read: "Zobrazit informace účtu"
|
||||
following-write: "Sledovat a přestat sledovat"
|
||||
drive-read: "Přečíst váš Disk"
|
||||
cancel: "Zrušit"
|
||||
accept: "Povolit přístup"
|
||||
auth/views/index.vue:
|
||||
loading: "Načítám..."
|
||||
denied-paragraph: "Tato aplikace nebude mít přístup k Vašemu účtu."
|
||||
already-authorized: "Tato aplikace byla již autorizována."
|
||||
callback-url: "Zpátky do aplikace."
|
||||
please-go-back: "Prosím vraťte se zpátky do aplikace."
|
||||
error: "Taková relace neexistuje."
|
||||
sign-in: "Prosím přihlaste se."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "Ověřené účty"
|
||||
popular-users: "Populární uživatelé"
|
||||
recently-updated-users: "Nedávno aktívni uživatelé"
|
||||
recently-registered-users: "Nedávno registrovaní uživatelé"
|
||||
popular-tags: "Populární tagy"
|
||||
federated: "Z fediverse"
|
||||
federated: "Z fedivesmíru"
|
||||
explore: "Prozkoumat {host}"
|
||||
users-info: "Aktuálně je zde registrováno {users} uživatelů"
|
||||
common/views/components/url-preview.vue:
|
||||
enable-player: "Otevřít v přehrávači"
|
||||
disable-player: "Zavřít přehrávač"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "Žádní uživatelé"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Čeká se na {}"
|
||||
cancel: "Zrušit"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Vzdát se"
|
||||
@@ -302,33 +362,70 @@ common/views/components/games/reversi/reversi.index.vue:
|
||||
my-games: "Moje hra"
|
||||
all-games: "Všechny hry"
|
||||
enter-username: "Zadejte své uživatelské jméno"
|
||||
game-state:
|
||||
ended: "Ukončené"
|
||||
playing: "Probíhají"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
settings-of-the-game: "Nastavení hry"
|
||||
choose-map: "Vybrat mapu"
|
||||
random: "Náhodně"
|
||||
black-or-white: "Černé/bílé"
|
||||
black-is: "Černá je {}"
|
||||
rules: "Pravidla"
|
||||
looped-map: "Zacyklená mapa"
|
||||
settings-of-the-bot: "Nastavení Botu"
|
||||
this-game-is-started-soon: "Hra začne za pár vteřin"
|
||||
waiting-for-other: "Čeká se na protivníka"
|
||||
waiting-for-me: "Čeká se na Vás"
|
||||
waiting-for-both: "Připravuji"
|
||||
cancel: "Zrušit"
|
||||
ready: "Připraveno"
|
||||
cancel-ready: "Pokračovat v přípravě"
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "Nelze se připojit k serveru"
|
||||
description: "Nastal problém s Vaším připojením k internetu, nebo server není dostupný nebo zrovna probíhá údržba. Prosím {zkuste to znova} za pár minut."
|
||||
thanks: "Děkujeme že jste použili Misskey."
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
title: "Poradce při potížích"
|
||||
network: "Síťové připojení"
|
||||
checking-network: "Prověřit síťové připojení"
|
||||
internet: "Připojení k internetu"
|
||||
checking-internet: "Ověřuji připojení k internetu."
|
||||
server: "Připojení k serveru"
|
||||
checking-server: "Spojuji se se serverem"
|
||||
no-network-desc: "Ujistěte se že jste připojeni k Internetu."
|
||||
no-internet: "Nejste připojeni k internetu"
|
||||
no-internet-desc: "Jste připojen k síti, ale zdá se že stále chybí připojení k Internetu. Prosím zkontrolujte Vaše připojení k Internetu."
|
||||
no-server: "Nelze se připojit k serveru Misskey"
|
||||
success: "Úspěšně se podařilo spojit s Misskey serverem"
|
||||
flush: "Vyčistit mezipaměť"
|
||||
common/views/components/media-banner.vue:
|
||||
sensitive: "Choulostivý obsah"
|
||||
click-to-show: "Klikněte pro zobrazení"
|
||||
common/views/components/theme.vue:
|
||||
theme: "Vzhled"
|
||||
light-theme: "Motiv pro použití ve světlém vzhledu"
|
||||
dark-theme: "Motiv pro použití v tmavém vzhledu"
|
||||
light-themes: "Světlý vzhled"
|
||||
dark-themes: "Tmavý vzhled"
|
||||
install-a-theme: "Nainstalovat motiv"
|
||||
theme-code: "Kód motivu"
|
||||
install: "Nainstalovat"
|
||||
installed: "\"{}\" byl nainstalován"
|
||||
create-a-theme: "Vytvořit motiv"
|
||||
save-created-theme: "Uložit motiv"
|
||||
primary-color: "Základní barva"
|
||||
text-color: "Barva textu"
|
||||
base-theme: "Základní vzhled"
|
||||
base-theme-light: "Světlý"
|
||||
base-theme-dark: "Tmavý"
|
||||
find-more-theme: "Najít další vzhledy"
|
||||
theme-name: "Jméno vzhledu"
|
||||
preview-created-theme: "Náhled"
|
||||
invalid-theme: "Vzhled není validní"
|
||||
already-installed: "Tento vzhled je již nainstalován."
|
||||
saved: "Uloženo"
|
||||
manage-themes: "Správa vzhledů"
|
||||
builtin-themes: "Standardní vzhledy"
|
||||
my-themes: "Moje vzhledy"
|
||||
installed-themes: "Nainstalované vzhledy"
|
||||
@@ -339,6 +436,7 @@ common/views/components/theme.vue:
|
||||
desc: "Popis"
|
||||
export: "Exportovat"
|
||||
import: "Importovat"
|
||||
import-by-code: "nebo zkopírujte kód"
|
||||
theme-name-required: "Jméno vzhledu je povinné"
|
||||
common/views/components/cw-button.vue:
|
||||
hide: "Skrýt"
|
||||
@@ -350,13 +448,12 @@ common/views/components/messaging.vue:
|
||||
search-user: "Najít uživatele"
|
||||
you: "Vy"
|
||||
no-history: "Žádná historie"
|
||||
user: "Uživatel"
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "Žádné zprávy"
|
||||
new-message: "Máte novou zprávu"
|
||||
only-one-file-attached: "Jenom JEDEN soubor může být přiložen ke zprávě."
|
||||
common/views/components/messaging-room.form.vue:
|
||||
send: "Odeslat"
|
||||
only-one-file-attached: "Jenom JEDEN soubor může být přiložen ke zprávě."
|
||||
attach-from-local: "Přiložit soubory z Vašeho zařízení"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "Přečtené"
|
||||
deleted: "Tato zpráva byla odstraněna"
|
||||
@@ -368,16 +465,67 @@ common/views/components/nav.vue:
|
||||
donors: "Dárci"
|
||||
repository: "Úložiště"
|
||||
develop: "Vývojáři"
|
||||
feedback: "Zpětná vazba"
|
||||
common/views/components/note-menu.vue:
|
||||
mention: "Zmínění"
|
||||
detail: "Více"
|
||||
copy-content: "Zkopírovat obsah"
|
||||
copy-link: "Zkopírovat odkaz"
|
||||
favorite: "Přidat do oblíbených"
|
||||
unfavorite: "Odebrat z oblízených"
|
||||
watch: "Sledovat"
|
||||
unwatch: "Přestat sledovat"
|
||||
pin: "Připnout"
|
||||
unpin: "Odepnout"
|
||||
delete: "Odstranit"
|
||||
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
|
||||
remote: "Ukázat originální poznámku"
|
||||
common/views/components/user-menu.vue:
|
||||
mention: "Zmínění"
|
||||
mute: "Umlčet"
|
||||
unmute: "Zrušit umlčení"
|
||||
block: "Blokován"
|
||||
unblock: "Odblokovat"
|
||||
push-to-list: "Přidat do seznamu"
|
||||
select-list: "Vyberte seznam"
|
||||
report-abuse: "Nahlásit spam"
|
||||
report-abuse-reported: "Problém byl nahlášen administrátorovi. Děkujeme za Vaší kooperaci."
|
||||
silence: "Ztlumit"
|
||||
suspend: "Zmrazit"
|
||||
common/views/components/poll.vue:
|
||||
vote-count: "{} hlasů"
|
||||
total-votes: "{} hlasů celkem"
|
||||
vote: "Hlasovat"
|
||||
show-result: "Podívat se na výsledky"
|
||||
voted: "Už jste hlasovaly"
|
||||
closed: "Ukončeno"
|
||||
remaining-days: "zbývá {d} dnů, {h} hodin"
|
||||
remaining-hours: "zbývá {h} hodin, a {m} minut"
|
||||
remaining-minutes: "zbývá {m} minut, a {s} sekund"
|
||||
remaining-seconds: "zbývá {s} sekund"
|
||||
common/views/components/poll-editor.vue:
|
||||
no-only-one-choice: "Musíte vybrat alespoň dvě možnosti"
|
||||
choice-n: "Volba {}"
|
||||
remove: "Odstranit tuto možnost"
|
||||
add: "+ Přidat možnost"
|
||||
destroy: "Zahodit dotazník"
|
||||
multiple: "Více odpovědí je povoleno"
|
||||
expiration: "Termín"
|
||||
infinite: "Nekonečne"
|
||||
at: "Výběr data a času"
|
||||
no-more: "Více už přidat nemůžete"
|
||||
deadline-date: "Termín ukončení"
|
||||
deadline-time: "Doba trvání"
|
||||
interval: "Trvání"
|
||||
second: "Sekunda"
|
||||
minute: "Minuta"
|
||||
hour: "Hodina"
|
||||
day: "Ne"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Vyberte svoji reakci"
|
||||
input-reaction-placeholder: "nebo vložte Emoji"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "Emoji"
|
||||
people: "Lidé"
|
||||
animals-and-nature: "Zvířata a příroda"
|
||||
food-and-drink: "Jídlo a pití"
|
||||
@@ -389,6 +537,7 @@ common/views/components/emoji-picker.vue:
|
||||
common/views/components/signin.vue:
|
||||
username: "Přezdívka"
|
||||
password: "Heslo"
|
||||
token: "Token"
|
||||
signing-in: "Přihlašování..."
|
||||
or: "Nebo"
|
||||
signin-with-twitter: "Přihlásit se pomocí účtu Twitter"
|
||||
@@ -416,6 +565,7 @@ common/views/components/signup.vue:
|
||||
password-matched: "OK"
|
||||
password-not-matched: "Neshodují se"
|
||||
recaptcha: "Potvrzení"
|
||||
tos: "Podmínky užívání"
|
||||
create: "Vytvořit účet"
|
||||
some-error: "Pokus o vytvoření účtu selhal. Prosím zkuste to znovu."
|
||||
common/views/components/special-message.vue:
|
||||
@@ -430,20 +580,56 @@ common/views/components/notification-settings.vue:
|
||||
mark-as-read-all-notifications: "Označit všechna oznámení za přečtená"
|
||||
mark-as-read-all-unread-notes: "Označit všechny příspěvky za přečtené"
|
||||
mark-as-read-all-talk-messages: "Označit všechny zprávy za přečtené"
|
||||
common/views/components/integration-settings.vue:
|
||||
connect: "Připojit"
|
||||
disconnect: "Odpojit"
|
||||
common/views/components/github-setting.vue:
|
||||
description: "Jakmile spojíte Váš GitHub účet s Vaším Misskey účtem, uvidíte informace o Vašem GitHub účtu na Vašem profilu a budete se moci přihlásit skrze GitHub."
|
||||
connected-to: "Je připojen k tomuto GitHub účtu"
|
||||
detail: "Více…"
|
||||
reconnect: "Znovu připojit"
|
||||
connect: "Připojit Váš GitHub účet"
|
||||
disconnect: "Odpojit"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "Jakmile spojíte Váš Discord účet s Vaším Misskey účtem, uvidíte informace o Vašem Discord účtu na Vašem profilu a budete se moci přihlásit skrze Discord."
|
||||
connected-to: "Je připojen k tomuto Discord účtu"
|
||||
detail: "Více…"
|
||||
reconnect: "Znovu připojit"
|
||||
connect: "Připojit Váš Discord účet"
|
||||
disconnect: "Odpojit"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Čekáme"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
public: "Veřejné"
|
||||
home: "Domů"
|
||||
specified-desc: "Poslat pouze zmíněným uživatelům"
|
||||
local-public: "Veřejná (pouze místní)"
|
||||
local-public-desc: "Nepublikovat na vzdálených serverech"
|
||||
local-home: "Domovská (pouze místní)"
|
||||
local-followers: "Pro sledující (pouze místní)"
|
||||
common/views/components/trends.vue:
|
||||
count: "{} zmíněných uživatelů"
|
||||
empty: "Žádný trend"
|
||||
common/views/components/language-settings.vue:
|
||||
title: "Zobrazit jazyky"
|
||||
pick-language: "Zvolte jazyk"
|
||||
recommended: "Doporučené"
|
||||
auto: "Automaticky"
|
||||
specify-language: "Vyberte jazyk"
|
||||
info: "Pro aktivování změn musíte znovu načíst stránky."
|
||||
common/views/components/profile-editor.vue:
|
||||
title: "Profil"
|
||||
name: "Jméno"
|
||||
account: "Účet"
|
||||
location: "Lokace"
|
||||
description: "O mně"
|
||||
you-can-include-hashtags: "V popisku o Vás můžete použít i hastagy."
|
||||
language: "Jazyk"
|
||||
birthday: "Datum narození"
|
||||
avatar: "Avatar"
|
||||
banner: "Baner"
|
||||
is-cat: "Tento účet je kočka"
|
||||
is-bot: "Tento účet je Bot"
|
||||
advanced: "Ostatní"
|
||||
privacy: "Osobní údaje"
|
||||
save: "Uložit"
|
||||
@@ -455,10 +641,13 @@ common/views/components/profile-editor.vue:
|
||||
email-verified: "Váš e-mail byl ověřen"
|
||||
email-not-verified: "Váš email není potvrzen. Prosím zkontrolujte si svou schránku."
|
||||
export: "Exportovat"
|
||||
import: "Importovat"
|
||||
export-and-import: "Import / Export"
|
||||
export-targets:
|
||||
following-list: "Seznam sledujících"
|
||||
mute-list: "Seznam ztlumených uživatelů"
|
||||
blocking-list: "Seznam blokovaných uživatelů"
|
||||
user-lists: "Seznamy"
|
||||
enter-password: "Prosím, zadejte Vaše heslo"
|
||||
danger-zone: "Nebezpečná zóna"
|
||||
delete-account: "Smazat účet"
|
||||
@@ -470,7 +659,34 @@ common/views/components/user-list-editor.vue:
|
||||
remove-user: "Odebrat z tohoto seznamu"
|
||||
delete-are-you-sure: "Smazat seznam \"$1\"?"
|
||||
deleted: "Smazáno"
|
||||
add-user: "Přidat uživatele"
|
||||
common/views/components/user-group-editor.vue:
|
||||
users: "Členové"
|
||||
rename: "Přejmenovat skupinu"
|
||||
delete: "Odstranit skupinu"
|
||||
transfer: "Přesunout skupinu"
|
||||
transfer-are-you-sure: "Jste si jistí že chcete přidat @$2 do skupiny: $1?"
|
||||
transferred: "Skupina přesunuta"
|
||||
remove-user: "Odebrat uživatele z této skupiny"
|
||||
delete-are-you-sure: "Jste si jistí že chcete smazat skupinu \"$1\"?"
|
||||
deleted: "Smazáno"
|
||||
invite: "Pozvat"
|
||||
invited: "Pozvánka byla úspěšně odeslána"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Seznamy"
|
||||
create-list: "Vytvořit seznam"
|
||||
list-name: "Název seznamu"
|
||||
common/views/components/user-groups.vue:
|
||||
user-groups: "Skupiny"
|
||||
create-group: "Vytvořit skupinu"
|
||||
group-name: "Název skupiny"
|
||||
owned-groups: "Moje skupiny"
|
||||
invites: "Pozvat"
|
||||
reject-invite: "Odmítnout"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Načítám"
|
||||
no-broadcasts: "Žádná nová oznámení"
|
||||
have-a-nice-day: "Přejeme Vám příjemný den!"
|
||||
next: "Další"
|
||||
common/views/widgets/calendar.vue:
|
||||
year: "Rok {}"
|
||||
@@ -483,18 +699,33 @@ common/views/widgets/photo-stream.vue:
|
||||
no-photos: "Žádné obrázky"
|
||||
common/views/widgets/posts-monitor.vue:
|
||||
title: "Grafy příspěvků"
|
||||
toggle: "Přepnout zobrazení"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "Hashtagy"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Informace o serveru"
|
||||
toggle: "Přepnout zobrazení"
|
||||
common/views/widgets/memo.vue:
|
||||
title: "Poznámky"
|
||||
memo: "Pište sem!"
|
||||
save: "Uložit"
|
||||
common/views/widgets/slideshow.vue:
|
||||
no-image: "V této složce nebyly nalezeny žádné fotky."
|
||||
common/views/pages/not-found.vue:
|
||||
page-not-found: "Stránka nenalezena"
|
||||
common/views/pages/follow.vue:
|
||||
following: "Sledování"
|
||||
follow: "Sledovat"
|
||||
common/views/pages/follow-requests.vue:
|
||||
accept: "Přijmout"
|
||||
reject: "Odmítnout"
|
||||
desktop:
|
||||
banner: "Baner"
|
||||
avatar-crop-title: "Vyberte část, která se zobrazí jako avatar"
|
||||
avatar: "Avatar"
|
||||
uploading-avatar: "Nahrál nový avatar"
|
||||
avatar-updated: "Vaše avatar byl aktualizován"
|
||||
invalid-filetype: "Tento formát souboru není podporován"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Černá ... Celkem"
|
||||
notes: "Modrá ... Poznámky"
|
||||
@@ -502,6 +733,7 @@ desktop/views/components/activity.chart.vue:
|
||||
renotes: "Zelená ... Renoty"
|
||||
desktop/views/components/activity.vue:
|
||||
title: "Aktivita"
|
||||
toggle: "Přepnout zobrazení"
|
||||
desktop/views/components/calendar.vue:
|
||||
title: "{month}. {year}"
|
||||
prev: "Předchozí měsíc"
|
||||
@@ -519,6 +751,8 @@ desktop/views/components/choose-folder-from-drive-window.vue:
|
||||
desktop/views/components/crop-window.vue:
|
||||
cancel: "Zrušit"
|
||||
ok: "OK"
|
||||
desktop/views/components/drive-window.vue:
|
||||
used: "využito"
|
||||
desktop/views/components/drive.file.vue:
|
||||
avatar: "Avatar"
|
||||
banner: "Baner"
|
||||
@@ -550,39 +784,53 @@ desktop/views/components/drive.vue:
|
||||
empty-folder: "Tato složka je prázdná"
|
||||
unable-to-process: "Operace nemohla být dokončena."
|
||||
unhandled-error: "Neznámá chyba"
|
||||
url-upload: "Nahrát z URL adresy"
|
||||
url-of-file: "URL adresa souboru, který chcete nahrát"
|
||||
may-take-time: "Může trvat nějakou dobu, dokud nebude dokončeno nahrávání."
|
||||
create-folder: "Vytvořit složku"
|
||||
folder-name: "Název složky"
|
||||
contextmenu:
|
||||
create-folder: "Vytvořit složku"
|
||||
upload: "Nahrát soubor"
|
||||
url-upload: "Nahrát z URL"
|
||||
desktop/views/components/media-video.vue:
|
||||
click-to-show: "Klikněte pro zobrazení"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
done: "Hotovo"
|
||||
add: "Přidat"
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Zrušit"
|
||||
ok: "OK"
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "Tento příspěvek je soukromý"
|
||||
deleted: "Tento příspěvek byl odstraněn"
|
||||
renote: "Renotovat"
|
||||
add-reaction: "Přidat reakci"
|
||||
undo-reaction: "Odebrat reakci"
|
||||
desktop/views/components/note.vue:
|
||||
reply: "Odpovědět"
|
||||
renote: "Renote"
|
||||
add-reaction: "Přidat reakci"
|
||||
undo-reaction: "Odebrat reakci"
|
||||
detail: "Více"
|
||||
private: "Tento příspěvek je soukromý"
|
||||
deleted: "Tento příspěvek byl odstraněn"
|
||||
desktop/views/components/notes.vue:
|
||||
error: "Načítání selhalo."
|
||||
retry: "Opakovat"
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+Přidat uživatele"
|
||||
attach-location-information: "Přidat informace o lokaci"
|
||||
hide-contents: "Schovat obsah"
|
||||
reply-placeholder: "Odpovědět na tento příspěvěk"
|
||||
quote-placeholder: "Citovat tento příspěvek"
|
||||
reply: "Odpovědět"
|
||||
renote: "Renotovat"
|
||||
posted: "Odesláno!"
|
||||
replied: "Odpověděno!"
|
||||
reposted: "Renotováno!"
|
||||
note-failed: "Nepodařilo se přidat příspěvek"
|
||||
renote-failed: "Renotování neuspělo"
|
||||
insert-a-kao: "v('ω')v"
|
||||
create-poll: "Vytvořit anketu"
|
||||
text-remain: "{0} znaků zbývá"
|
||||
recent-tags: "Nejnovější"
|
||||
visibility: "Viditelnost"
|
||||
error: "Chyba"
|
||||
enter-username: "Zadejte své uživatelské jméno..."
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nový příspěvek"
|
||||
reply: "Odpovědět"
|
||||
desktop/views/components/progress-dialog.vue:
|
||||
waiting: "Čekáme"
|
||||
desktop/views/components/renote-form.vue:
|
||||
quote: "Citovat..."
|
||||
cancel: "Zrušit"
|
||||
@@ -596,14 +844,24 @@ desktop/views/components/renote-form-window.vue:
|
||||
desktop/views/components/settings.2fa.vue:
|
||||
detail: "Více…"
|
||||
url: "https://www.google.cz/landing/2step/"
|
||||
token: "Token"
|
||||
common/views/components/media-image.vue:
|
||||
click-to-show: "Klikněte pro zobrazení"
|
||||
common/views/components/api-settings.vue:
|
||||
token: "Token:"
|
||||
enter-password: "Prosím zadejte heslo"
|
||||
console:
|
||||
title: "API konzole"
|
||||
endpoint: "Endpoint"
|
||||
parameter: "Parametry"
|
||||
send: "Odeslat"
|
||||
sending: "Odesílám"
|
||||
response: "Výsledek"
|
||||
desktop/views/components/settings.apps.vue:
|
||||
no-apps: "Žádné připojené aplikace"
|
||||
common/views/components/drive-settings.vue:
|
||||
max: "Velikost úložiště"
|
||||
in-use: "využito"
|
||||
stats: "Statistiky"
|
||||
common/views/components/mute-and-block.vue:
|
||||
mute-and-block: "Umlčet/blokovat"
|
||||
@@ -628,24 +886,48 @@ desktop/views/components/settings.tags.vue:
|
||||
title: "Tagy"
|
||||
add: "Přidat"
|
||||
save: "Uložit"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Správce úloh"
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "Domů"
|
||||
local: "Lokální"
|
||||
global: "Globální"
|
||||
mentions: "Zmínění"
|
||||
list: "Seznamy"
|
||||
hashtag: "Hashtag"
|
||||
add-list: "Přidat do seznamu"
|
||||
list-name: "Název seznamu"
|
||||
desktop/views/components/ui.header.vue:
|
||||
welcome-back: "Vítejte zpátky,"
|
||||
adjective: "Pán"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "Váš profil"
|
||||
lists: "Seznamy"
|
||||
groups: "Skupiny"
|
||||
admin: "Administrace"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
game: "Hry"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Oznámení"
|
||||
desktop/views/components/ui.header.post.vue:
|
||||
post: "Nový příspěvek"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Vyhledávání"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Příspěvky"
|
||||
desktop/views/components/users-list.vue:
|
||||
all: "Všechny"
|
||||
iknow: "Znáte"
|
||||
fetching: "Načítám…"
|
||||
desktop/views/components/window.vue:
|
||||
close: "Zavřít"
|
||||
admin/views/index.vue:
|
||||
federation: "Z fediversu"
|
||||
hashtags: "Hashtagy"
|
||||
instance: "Instance"
|
||||
emoji: "Emoji"
|
||||
moderators: "Moderátoři"
|
||||
users: "Uživatelé"
|
||||
federation: "Z fedivesmíru"
|
||||
announcements: "Oznámení"
|
||||
queue: "Fronta úloh"
|
||||
logs: "Logy"
|
||||
back-to-misskey: "Zpět na Misskey"
|
||||
admin/views/dashboard.vue:
|
||||
accounts: "Účty"
|
||||
@@ -653,9 +935,12 @@ admin/views/dashboard.vue:
|
||||
drive: "Disk"
|
||||
instances: "Instance"
|
||||
this-instance: "Tato instance"
|
||||
federated: "Z fediversu"
|
||||
admin/views/queue.vue:
|
||||
operation: "Akce"
|
||||
federated: "Z fedivesmíru"
|
||||
admin/views/logs.vue:
|
||||
logs: "Logy"
|
||||
levels:
|
||||
info: "Informace"
|
||||
error: "Chyba"
|
||||
admin/views/abuse.vue:
|
||||
details: "Popis"
|
||||
remove-report: "Odstranit"
|
||||
@@ -670,12 +955,12 @@ admin/views/instance.vue:
|
||||
maintainer-config: "Informace o administrátorovi"
|
||||
maintainer-name: "Jméno administrátora"
|
||||
maintainer-email: "Kontakt na administrátora"
|
||||
object-storage-endpoint: "Endpoint"
|
||||
mb: "V megabajtech"
|
||||
recaptcha-config: "nastavení služby reCAPTCHA"
|
||||
recaptcha-info: "reCAPTCHA token je povinný. Můžete jej získat na https://www.google.com/recaptcha/intro/"
|
||||
enable-recaptcha: "povolit reCAPTCHA"
|
||||
recaptcha-site-key: "reCAPTCHA klíč stránky (site key)"
|
||||
recaptcha-secret-key: "reCAPTCHA tajný klíč"
|
||||
recaptcha-preview: "Náhled"
|
||||
twitter-integration-config: "Nastavení spojení s Twitterem"
|
||||
twitter-integration-info: "The callback URL is set on {url}."
|
||||
enable-twitter-integration: "Povolit připojení k Twitteru"
|
||||
@@ -694,11 +979,20 @@ admin/views/instance.vue:
|
||||
invite: "Pozvat"
|
||||
save: "Uložit"
|
||||
saved: "Uloženo"
|
||||
user-recommendation-config: "Doporučení uživatelé"
|
||||
email: "Emailová adresa"
|
||||
smtp-port: "SMTP Port"
|
||||
smtp-auth: "Provést SMTP autentikaci"
|
||||
smtp-user: "SMTP uživatel"
|
||||
smtp-pass: "SMTP heslo"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
enable-serviceworker: "Povolit ServiceWorker"
|
||||
vapid-publickey: "VAPID veřejný klíč"
|
||||
vapid-privatekey: "VAPID osobní klíč"
|
||||
admin/views/charts.vue:
|
||||
title: "Graf"
|
||||
per-day: "za den"
|
||||
per-hour: "za hodinu"
|
||||
federation: "Federace"
|
||||
notes: "Příspěvky"
|
||||
users: "Uživatelé"
|
||||
drive: "Disk"
|
||||
@@ -706,11 +1000,20 @@ admin/views/charts.vue:
|
||||
charts:
|
||||
federation-instances: "Počet instancí: zvýšení/snížení"
|
||||
federation-instances-total: "Celkový počet instancí"
|
||||
notes-total: "Celkem příspěvků"
|
||||
users-total: "Celkem uživatelů"
|
||||
active-users: "Aktivní uživatelé"
|
||||
network-requests: "Požadavek"
|
||||
network-time: "Doba odezvy"
|
||||
network-usage: "Síťový provoz"
|
||||
admin/views/drive.vue:
|
||||
operation: "Operace"
|
||||
fileid-or-url: "ID nebo URL souboru"
|
||||
file-not-found: "Soubor nebyl nalezen"
|
||||
sort:
|
||||
title: "Seřadit"
|
||||
createdAtAsc: "Věk - od nejstaršího"
|
||||
createdAtDesc: "Věk - od nejmladšího"
|
||||
sizeAsc: "Velikost - od nejmenších"
|
||||
sizeDesc: "Velikost – od největších"
|
||||
origin:
|
||||
@@ -727,11 +1030,13 @@ admin/views/users.vue:
|
||||
reset-password: "Resetovat heslo"
|
||||
reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?"
|
||||
password-updated: "Heslo je nyní \"{password}\""
|
||||
update-remote-user: "Aktualizovat informace o vzdáleném účtu"
|
||||
users:
|
||||
title: "Uživatel"
|
||||
state:
|
||||
all: "Všechny"
|
||||
moderator: "Moderátor"
|
||||
adminOrModerator: "Admin/Moderátor"
|
||||
verified: "Ověřený účet"
|
||||
origin:
|
||||
title: "Původ"
|
||||
combined: "Lokální + Vzdálené"
|
||||
@@ -774,68 +1079,180 @@ admin/views/announcements.vue:
|
||||
admin/views/hashtags.vue:
|
||||
hided-tags: "Skryté tagy"
|
||||
admin/views/federation.vue:
|
||||
federation: "Z fediversu"
|
||||
instance: "Instance"
|
||||
host: "Hostitel"
|
||||
notes: "Poznámky"
|
||||
users: "Uživatelé"
|
||||
following: "Sledování"
|
||||
caught-at: "Vytvořeno"
|
||||
status: "Status"
|
||||
latest-request-received-at: "Poslední požadavek přijat"
|
||||
block: "Blokován"
|
||||
instances: "Z fedivesmíru"
|
||||
states:
|
||||
all: "Všechny"
|
||||
blocked: "Blokován"
|
||||
not-responding: "Bez odpovědi"
|
||||
marked-as-closed: "Označeno jako uzavřené"
|
||||
charts: "Graf"
|
||||
chart-srcs:
|
||||
requests: "Požadavek"
|
||||
users-total: "Celkem uživatelů"
|
||||
notes-total: "Celkem příspěvků"
|
||||
chart-spans:
|
||||
hour: "za hodinu"
|
||||
day: "za den"
|
||||
blocked-hosts: "Blokován"
|
||||
save: "Uložit"
|
||||
desktop/views/pages/welcome.vue:
|
||||
about: "O Misskey"
|
||||
timeline: "Časová osa"
|
||||
announcements: "Oznámení"
|
||||
photos: "Nedávné obrázky"
|
||||
powered-by-misskey: "Běží na <b>Misskey</b>."
|
||||
info: "Informace"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Disk"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Předchozí příspěvěk"
|
||||
next: "Následující příspěvek"
|
||||
desktop/views/pages/selectdrive.vue:
|
||||
title: "Vyberte soubor(y)"
|
||||
ok: "OK"
|
||||
cancel: "Zrušit"
|
||||
upload: "Nahrajte soubory z vašeho zařízení"
|
||||
desktop/views/pages/search.vue:
|
||||
not-available: "Vyhledávání je vypnuté pro tuto instanci."
|
||||
not-found: "Pro '{q}' nebyly nalezeny žádné příspěvky."
|
||||
desktop/views/pages/tag.vue:
|
||||
no-posts-found: "Nebyly nalezeny žádné příspěvky s \"{q}\"."
|
||||
desktop/views/pages/user-list.users.vue:
|
||||
users: "Uživatel"
|
||||
add-user: "Přidat uživatele"
|
||||
username: "Přezdívka"
|
||||
desktop/views/pages/user/user.followers-you-know.vue:
|
||||
loading: "Načítám..."
|
||||
desktop/views/pages/user/user.friends.vue:
|
||||
title: "Častá zmínění"
|
||||
loading: "Načítám..."
|
||||
no-users: "Žádná častá zmínění"
|
||||
desktop/views/pages/user/user.photos.vue:
|
||||
title: "Fotky"
|
||||
loading: "Načítám..."
|
||||
no-photos: "Žádné obrázky"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Poznámky"
|
||||
following: "Sledovaní"
|
||||
followers: "Sledující"
|
||||
month: "Po"
|
||||
day: "Ne"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Oznámení"
|
||||
desktop/views/widgets/polls.vue:
|
||||
title: "Ankety"
|
||||
desktop/views/widgets/users.vue:
|
||||
title: "Doporučení uživatelé"
|
||||
mobile/views/components/drive.vue:
|
||||
used: "využito"
|
||||
file-count: "Soubor(ů)"
|
||||
folder-is-empty: "Tato složka je prázdná"
|
||||
folder-name: "Název složky"
|
||||
url-prompt: "URL adresa souboru, který chcete nahrát"
|
||||
uploading: "Byl zahájen upload. Může chvilku trvat než bude dokončen."
|
||||
mobile/views/components/drive-file-chooser.vue:
|
||||
select-file: "Vybrat soubory"
|
||||
mobile/views/components/drive-folder-chooser.vue:
|
||||
select-folder: "Vyberte složku"
|
||||
mobile/views/components/drive.file-detail.vue:
|
||||
download: "Stáhnout"
|
||||
rename: "Přejmenovat"
|
||||
move: "Přesunout"
|
||||
hash: "Hash (md5)"
|
||||
exif: "EXIF"
|
||||
mobile/views/components/media-video.vue:
|
||||
click-to-show: "Klikněte pro zobrazení"
|
||||
common/views/components/follow-button.vue:
|
||||
following: "Sledování"
|
||||
follow-processing: "Zpracovávám"
|
||||
mobile/views/components/note.vue:
|
||||
private: "Tento příspěvek je soukromý"
|
||||
deleted: "Tento příspěvek byl odstraněn"
|
||||
location: "Lokace"
|
||||
mobile/views/components/note-detail.vue:
|
||||
reply: "Odpovědět"
|
||||
mobile/views/components/post-form.vue:
|
||||
reply: "Odpovědět"
|
||||
renote: "Renotovat"
|
||||
reply-placeholder: "Odpovědět na tento příspěvěk"
|
||||
reaction: "Reakce"
|
||||
private: "Tento příspěvek je soukromý"
|
||||
deleted: "Tento příspěvek byl odstraněn"
|
||||
location: "Lokace"
|
||||
mobile/views/components/note-preview.vue:
|
||||
admin: "admin"
|
||||
bot: "bot"
|
||||
cat: "kočka"
|
||||
mobile/views/components/note-sub.vue:
|
||||
admin: "admin"
|
||||
bot: "bot"
|
||||
cat: "kočka"
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "Tento příspěvek je soukromý"
|
||||
deleted: "Tento příspěvek byl odstraněn"
|
||||
poll: "Ankety"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "Vítejte zpátky,"
|
||||
adjective: "Pán"
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "Časová osa"
|
||||
notifications: "Oznámení"
|
||||
search: "Vyhledávání"
|
||||
user-lists: "Seznamy"
|
||||
user-groups: "Skupiny"
|
||||
widgets: "Widgety"
|
||||
game: "Hry"
|
||||
admin: "Administrace"
|
||||
about: "O Misskey"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "Nahrát soubor"
|
||||
create-folder: "Vytvořit složku"
|
||||
mobile/views/pages/signup.vue:
|
||||
lets-start: "Váš účet je připraven! 📦"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Domů"
|
||||
local: "Lokální"
|
||||
global: "Globální"
|
||||
mentions: "Zmínění"
|
||||
mobile/views/pages/tag.vue:
|
||||
no-posts-found: "Nebyly nalezeny žádné příspěvky s \"{q}\"."
|
||||
mobile/views/pages/widgets.vue:
|
||||
add-widget: "Přidat"
|
||||
customization-tips: "Tipy pro přizpůsobení"
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
activity: "Aktivita"
|
||||
mobile/views/pages/share.vue:
|
||||
share-with: "Sdílet na {name}"
|
||||
mobile/views/pages/note.vue:
|
||||
prev: "Předchozí příspěvěk"
|
||||
next: "Následující příspěvek"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
not-found: "Pro '{q}' nebyly nalezeny žádné příspěvky."
|
||||
mobile/views/pages/selectdrive.vue:
|
||||
select-file: "Vybrat soubory"
|
||||
mobile/views/pages/user/home.vue:
|
||||
activity: "Aktivita"
|
||||
frequently-replied-users: "Častá zmínění"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Žádné obrázky"
|
||||
deck:
|
||||
widgets: "Widgety"
|
||||
home: "Domů"
|
||||
local: "Lokální"
|
||||
hashtag: "Hashtagy"
|
||||
global: "Globální"
|
||||
mentions: "Zmínění"
|
||||
notifications: "Oznámení"
|
||||
list: "Seznamy"
|
||||
select-list: "Vyberte seznam"
|
||||
swap-left: "Posunout doleva"
|
||||
swap-right: "Posunout doprava"
|
||||
rename: "Přejmenovat"
|
||||
@@ -843,8 +1260,43 @@ deck/deck.user-column.vue:
|
||||
activity: "Aktivita"
|
||||
dev/views/new-app.vue:
|
||||
app-name-desc: "Jméno vaší aplikace"
|
||||
app-desc: "Stručný popis nebo představení vaší aplikace."
|
||||
account-read: "Zobrazit informace účtu"
|
||||
reaction-write: "Přidat nebo odebrat reakce."
|
||||
following-write: "Sledovat a přestat sledovat"
|
||||
drive-read: "Přečíst váš Disk"
|
||||
pages:
|
||||
like: "Lajk"
|
||||
title: "Titulek"
|
||||
blocks:
|
||||
post: "Formulář pro psaní"
|
||||
_post:
|
||||
text: "Obsah"
|
||||
_textInput:
|
||||
text: "Titulek"
|
||||
_textareaInput:
|
||||
text: "Titulek"
|
||||
_numberInput:
|
||||
text: "Titulek"
|
||||
_switch:
|
||||
text: "Titulek"
|
||||
_counter:
|
||||
text: "Titulek"
|
||||
_button:
|
||||
text: "Titulek"
|
||||
_action:
|
||||
_dialog:
|
||||
content: "Obsah"
|
||||
script:
|
||||
categories:
|
||||
random: "Náhodně"
|
||||
list: "Seznamy"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Seznamy"
|
||||
random: "Náhodně"
|
||||
_randomPick:
|
||||
arg1: "Seznamy"
|
||||
_dailyRandomPick:
|
||||
arg1: "Seznamy"
|
||||
_seedRandomPick:
|
||||
arg2: "Seznamy"
|
||||
_pick:
|
||||
arg1: "Seznamy"
|
||||
types:
|
||||
array: "Seznamy"
|
||||
|
||||
1878
locales/da-DK.yml
Normal file
1878
locales/da-DK.yml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7,25 +7,43 @@ common:
|
||||
about: "Danke, dass Du Misskey gefunden hast. Misskey ist eine <b>dezentralisierte Microblogging-Plattform</b>, welche auf der ganzen Welt verteilt ist. Da es innerhalb es Fediversums existiert (ein Universum, in dem verschiedene Soziale Netzwerke organisiert sind), ist es unmittelbar mit anderen sozialen Netzwerken verbunden. Warum nimmst du dir nicht einmal eine Auszeit von dem Trubel der Stadt und tauchst in das neue Internet hinein?"
|
||||
intro:
|
||||
title: "Was ist Misskey?"
|
||||
about: "Misskey ist eine Quelloffene, <b>dezentralisierte microblogging Software</b>. Es bietet eine erweiterbare Benutzeroberfläche, verschiedenste Möglichkeiten auf Beiträge zu reagieren, kostenlosen Datenspeicher, und andere fortschrittliche Funktionen. Zusätzlich ist Misskey dazu in der Lage, sich mittels des Fediverse mit beliebig vielen anderen ActivityPub-kompatiblen Diensten zu verbinden. Wenn du zum Beispiel einen Betrag mit Misskey abschickst, wird dieser auch für Nutzer von Mastodon oder Pleroma sichtbar sein. So ähnlich wie eine Radioübertragung zwischen Planeten."
|
||||
features: "Funktionen"
|
||||
rich-contents: "Notizen"
|
||||
rich-contents-desc: "Poste einfach deine Ideen, Interessen und alles, was du teilen möchtest. Gestalte deine Nachrichten, teile deine Lieblingsbilder, sende Dateien und Videos und erstelle Umfragen – das und mehr kann Misskey!"
|
||||
reaction: "Reaktionen"
|
||||
reaction-desc: "Der einfachste Weg, deine Gefühle mit anderen zu teilen. Mit Misskey kannst du auf verschiedenste Arten auf Beiträge reagieren, statt nur zu „liken“."
|
||||
ui: "Benutzeroberfläche"
|
||||
ui-desc: "Geschmäcker sind verschieden. Deswegen ist Misskeys Oberfläche hochanpassbar und modular. Mache die Startseite zu deiner Startseite, indem du das Layout deiner Timeline änderst und mit Widgets staffierst."
|
||||
drive: "Drive"
|
||||
drive-desc: "Du willst ein hochgeladenes Foto nochmal posten? Deine Dateien benennen und in Ordnern sortieren? Misskeys Drive ist der beste Ort dafür. Damit wird das Teilen zum Kinderspiel!"
|
||||
outro: "Probiere Misskey aus und entdecke Misskeys einzigartige Funktionen. Wenn dir diese Instanz nicht zusagt, nimm einfach eine andere. Dank Misskeys dezentralem System kannst du dich überall mit deinen Freunden verbinden. Also dann, GLHF!"
|
||||
adblock:
|
||||
detected: "Bitte deaktiviere den Werbeblocker."
|
||||
warning: "<strong>Misskey hat keine Werbung.</strong> Allerdings können Werbeblocker für unerwartete Probleme und fehlende Funktionen sorgen."
|
||||
application-authorization: "Autorisierte Anwendungen"
|
||||
close: "Schließen"
|
||||
do-not-copy-paste: "Bitte keinen Code einfügen. Ihr Account könnte gefährdet werden."
|
||||
load-more: "Mehr laden"
|
||||
enter-password: "Bitte Passwort eingeben"
|
||||
2fa: "Zwei-Faktor-Authentifizierung"
|
||||
customize-home: "Layout Anpassen"
|
||||
featured-notes: "Beliebt"
|
||||
dark-mode: "Dunkler Modus"
|
||||
signin: "Einloggen"
|
||||
signup: "Registrieren"
|
||||
signout: "Ausloggen"
|
||||
reload-to-apply-the-setting: "Die Seite muss zum Übernehmen dieser Einstellung aktualisiert werden. Soll die Seite jetzt neu geladen werden?"
|
||||
fetching-as-ap-object: "Hole Daten…"
|
||||
got-it: "Verstanden!"
|
||||
customization-tips:
|
||||
title: "Anpassung-Tipps"
|
||||
paragraph: "<p>Du kannst deine Startseite anpassen, indem du Widgets hinzufügst und verschiebst.</p><p><strong>Klicke <strong>rechts</strong></strong> auf ein Widget, um dessen Aussehen zu verändern.</p><p>Um ein Widget zu löschen, klicke und ziehe es auf den <strong>Papierkorb</strong> am Kopfende der Seite.</p><p>Wenn du fertig bist, drücke auf den Beenden-Knopf oben rechts.</p>"
|
||||
gotit: "Verstanden!"
|
||||
notification:
|
||||
file-uploaded: "Datei hochgeladen!"
|
||||
message-from: "Nachricht von {}:"
|
||||
reversi-invited: "Zu einem Spiel eingeladen"
|
||||
reversi-invited-by: "Eingeladen von {}:"
|
||||
notified-by: "Benachrichtigt von {}:"
|
||||
reply-from: "Antwort von {}:"
|
||||
@@ -44,9 +62,44 @@ common:
|
||||
month-and-day: "{day}/{month}"
|
||||
trash: "Papierkorb"
|
||||
drive: "Drive"
|
||||
pages: "Seite"
|
||||
messaging: "Unterhaltungen"
|
||||
home: "Home"
|
||||
favorites: "Diese Notiz favorisieren"
|
||||
deck: "Deck"
|
||||
timeline: "Zeitleiste"
|
||||
explore: "Entdecken"
|
||||
following: "Folgt"
|
||||
followers: "Folgende"
|
||||
favorites: "Favoriten"
|
||||
permissions:
|
||||
"read:account": "Accountinformationen anzeigen."
|
||||
"write:account": "Accountinformationen bearbeiten."
|
||||
"read:blocks": "Blöcke anzeigen"
|
||||
"write:blocks": "Auf Sperrungen zugreifen"
|
||||
"read:drive": "Dateien anzeigen"
|
||||
"write:drive": "Dateien bearbeiten"
|
||||
"read:favorites": "Favoriten anzeigen"
|
||||
"write:favorites": "Auf Favoriten zugreifen"
|
||||
"read:following": "Follower-Daten lesen"
|
||||
"write:following": "Folgestatus bearbeiten"
|
||||
"read:messaging": "Unterhaltung anzeigen"
|
||||
"write:messaging": "Unterhaltung bearbeiten"
|
||||
"read:mutes": "Stummschaltungen lesen"
|
||||
"write:mutes": "Stummschaltungen bearbeiten"
|
||||
"write:notes": "Beiträge löschen und verfassen"
|
||||
"read:notifications": "Benachrichtigungen lesen"
|
||||
"write:notifications": "Benachrichtigungen bearbeiten"
|
||||
"read:reactions": "Reaktionen sehen"
|
||||
"write:reactions": "Reaktionen hinzufügen und bearbeiten"
|
||||
"write:votes": "Abstimmen"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "Beiträge von Benutzern, denen du folgst, werden in der Zeitleiste angezeigt."
|
||||
explore: "Benutzer finden"
|
||||
post-form:
|
||||
reply: "Antworten"
|
||||
renote: "Anmerkung"
|
||||
enter-username: "Bitte gib einen Benutzernamen ein"
|
||||
username-prompt: "Bitte gib einen Benutzernamen ein"
|
||||
weekday-short:
|
||||
sunday: "So"
|
||||
monday: "Mo"
|
||||
@@ -77,11 +130,11 @@ common:
|
||||
note-visibility:
|
||||
public: "Öffentlich"
|
||||
home: "Startseite"
|
||||
home-desc: "Nur auf die Startseite posten"
|
||||
home-desc: "Auf die Startseite posten"
|
||||
followers: "Abonnenten"
|
||||
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
||||
specified: "Direkt"
|
||||
specified-desc: "Nur für bestimmte Benutzer posten"
|
||||
specified-desc: "Nur für bestimmte Benutzer sichtbar"
|
||||
local-public: "Öffentlich (nur lokal)"
|
||||
local-home: "Home (nur lokal)"
|
||||
local-followers: "Follower (nur lokal)"
|
||||
@@ -91,78 +144,209 @@ common:
|
||||
c: "Was geht dir durch den Kopf?"
|
||||
d: "Willst du etwas sagen?"
|
||||
e: "Schreib hier etwas!"
|
||||
f: "Warte darauf, das du schreibst."
|
||||
f: "Warte darauf, das du schreibst..."
|
||||
settings: "Einstellungen"
|
||||
_settings:
|
||||
profile: "Dein Profil"
|
||||
notification: "Benachrichtigungen"
|
||||
apps: "Anwendungen"
|
||||
tags: "Hashtags"
|
||||
mute-and-block: "Stummschalten/Blocken"
|
||||
blocking: "Blocken"
|
||||
security: "Sicherheit"
|
||||
signin: "Login-Verlauf"
|
||||
password: "Passwort"
|
||||
other: "Mehr"
|
||||
appearance: "Designs"
|
||||
behavior: "Verhalten"
|
||||
fetch-on-scroll: "Unendliches laden beim scrollen"
|
||||
fetch-on-scroll-desc: "Wenn beim scrollen das Ende erreicht wird, lädt die Anwendung automatisch neue Inhalte nach."
|
||||
note-visibility: "Sichtbarkeit von Beiträgen"
|
||||
default-note-visibility: "Die Standardsichtbarkeit"
|
||||
remember-note-visibility: "Erinnerung an Sichtbarkeit von Beiträgen"
|
||||
web-search-engine: "Web-Suchmaschine"
|
||||
web-search-engine-desc: "Beispiel: https://www.google.de/search?q={{query}}"
|
||||
keep-cw: "Inhaltswarnung beibehalten"
|
||||
keep-cw-desc: "Wenn auf einen Beitrag geantwortet wird, wird die Inhaltswarnung des Originalbeitrags übernommen."
|
||||
i-like-sushi: "Ich bevorzuge Sushi anstelle von Pudding"
|
||||
show-reversi-board-labels: "Zeige Reihen- und Spaltenbeschreibungen in Reversi an"
|
||||
use-avatar-reversi-stones: "Avatar als Stein in Reversi anzeigen"
|
||||
disable-animated-mfm: "Animierten Text in Beiträgen deaktivieren"
|
||||
disable-showing-animated-images: "Animierte Grafiken deaktivieren"
|
||||
suggest-recent-hashtags: "Beim Verfassen von Beiträgen letzte Hashtags anzeigen"
|
||||
always-show-nsfw: "Sensible Inhalte (NSFW) immer anzeigen"
|
||||
always-mark-nsfw: "Meine Anhänge immer als NSFW markieren"
|
||||
show-full-acct: "Servername bei Benutzernamen immer anzeigen"
|
||||
show-via: "„via“ anzeigen"
|
||||
reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
|
||||
this-setting-is-this-device-only: "Nur auf diesem Gerät"
|
||||
use-os-default-emojis: "Betriebssystem-Emojis nutzen"
|
||||
line-width: "Linienstärke"
|
||||
line-width-thin: "Dünn"
|
||||
line-width-normal: "Normal"
|
||||
line-width-thick: "Dick"
|
||||
font-size: "Schriftgröße"
|
||||
font-size-x-small: "Sehr klein"
|
||||
font-size-small: "Klein"
|
||||
font-size-medium: "Normal"
|
||||
font-size-large: "Groß"
|
||||
font-size-x-large: "Sehr groß"
|
||||
deck-column-align: "Spaltenaufteilung der Deck-Ansicht"
|
||||
deck-column-align-center: "Mitte"
|
||||
deck-column-align-left: "Links"
|
||||
deck-column-align-flexible: "Flexibel"
|
||||
deck-column-width: "Spaltenbreite des Decks"
|
||||
deck-column-width-narrow: "Sehr eng"
|
||||
deck-column-width-narrower: "Eng"
|
||||
deck-column-width-normal: "Normal"
|
||||
deck-column-width-wider: "Breit"
|
||||
deck-column-width-wide: "Sehr breit"
|
||||
use-shadow: "Nutze Schatten"
|
||||
rounded-corners: "Abgerundete Ecken"
|
||||
circle-icons: "Kreisförmige Icons"
|
||||
contrasted-acct: "Nutzernamen kontrastreicher darstellen"
|
||||
wallpaper: "Hintergrund"
|
||||
choose-wallpaper: "Hintergrund auswählen"
|
||||
delete-wallpaper: "Hintergrund entfernen"
|
||||
post-form-on-timeline: "Beitragsformular über Timeline anzeigen"
|
||||
show-clock-on-header: "Uhr am oberen rechten Rand anzeigen"
|
||||
show-reply-target: "Zeige bei einer Antwort die ursprüngliche Nachricht"
|
||||
timeline: "Timeline"
|
||||
show-my-renotes: "Zeige eigene Renotes in der Timeline"
|
||||
show-renoted-my-notes: "Zeige Renotes deiner Posts in der Timeline"
|
||||
show-local-renotes: "Zeige Renotes lokaler Posts in der Timeline"
|
||||
remain-deleted-note: "Gelöschte Beiträge weiterhin anzeigen"
|
||||
sound: "Töne"
|
||||
enable-sounds: "Töne aktivieren"
|
||||
enable-sounds-desc: "Spiel einen Ton ab beim Erhalten eines Beitrags bzw. einer Nachricht. Diese Einstellung wird im Browser gespeichert."
|
||||
volume: "Lautstärke"
|
||||
test: "Test"
|
||||
update: "Misskey-Update"
|
||||
version: "Version:"
|
||||
latest-version: "Neuste Version:"
|
||||
update-checking: "Suche nach Updates"
|
||||
do-update: "Nach Updates suchen"
|
||||
update-settings: "Erweiterte Einstellungen"
|
||||
no-updates: "Kein Update verfügbar"
|
||||
no-updates-desc: "Misskey ist aktuell."
|
||||
update-available: "Eine neue Version ist verfügbar!"
|
||||
update-available-desc: "Änderungen werden beim Neuladen der Seite angewendet."
|
||||
advanced-settings: "Erweiterte Einstellungen"
|
||||
debug-mode: "Debug-Modus einschalten"
|
||||
debug-mode-desc: "Diese Einstellung wird im Browser gespeichert."
|
||||
navbar-position: "Postion der Navigationsleiste"
|
||||
navbar-position-top: "Oben"
|
||||
navbar-position-left: "Links"
|
||||
navbar-position-right: "Rechts"
|
||||
i-am-under-limited-internet: "Ich möchte Datenvolumen sparen"
|
||||
post-style: "Beitrags-Anzeigestil"
|
||||
post-style-standard: "Standard"
|
||||
post-style-smart: "Smart"
|
||||
notification-position: "Benachrichtigungen anzeigen"
|
||||
notification-position-bottom: "Unten"
|
||||
notification-position-top: "Oben"
|
||||
disable-via-mobile: "Beitrag nicht als „vom Handy“ markieren"
|
||||
load-raw-images: "Anhänge in voller Größe laden"
|
||||
load-remote-media: "Zeige Inhalte von fremden Servern"
|
||||
search: "Suche"
|
||||
delete: "Löschen"
|
||||
loading: "Laden"
|
||||
ok: "Okay"
|
||||
cancel: "Abbrechen"
|
||||
update-available-title: "Aktualisierung verfügbar"
|
||||
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||
verified-user: "Verifizierter Benutzer"
|
||||
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden."
|
||||
hide-password: "Passwort verbergen"
|
||||
show-password: "Passwort zeigen"
|
||||
enter-username: "Kontonamen eingeben"
|
||||
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktivumgebung verwenden."
|
||||
user-suspended: "Dieser Nutzer wurde gesperrt."
|
||||
is-remote-user: "Diese Nutzerinformationen können unvollständig sein."
|
||||
is-remote-post: "Dies ist ein entfernter Post."
|
||||
view-on-remote: "Vollständige Infos auf Ursprungsserver anzeigen"
|
||||
renoted-by: "Renote von {user}"
|
||||
no-notes: "Keine Beiträge"
|
||||
turn-on-darkmode: "Dunkles Design"
|
||||
turn-off-darkmode: "Helles Design"
|
||||
error:
|
||||
title: "Allgemeiner Fehler"
|
||||
retry: "Erneut versuchen"
|
||||
reversi:
|
||||
drawn: "Unentschieden"
|
||||
my-turn: "Du bist am Zug"
|
||||
opponent-turn: "Dein Gegner ist an der Reihe"
|
||||
turn-of: "{name}s Zug"
|
||||
past-turn-of: "Zug von {name}"
|
||||
won: "{name} hat gewonnen"
|
||||
black: "Schwarz"
|
||||
white: "Weiß"
|
||||
total: "Gesamt"
|
||||
this-turn: "{count}. Zug"
|
||||
widgets:
|
||||
analog-clock: "Analoge Uhr"
|
||||
profile: "Profil"
|
||||
calendar: "Kalender"
|
||||
timemachine: "Kalender (Zeitmaschiene)"
|
||||
timemachine: "Kalender (Zeitmaschine)"
|
||||
activity: "Aktivitäten"
|
||||
rss: "RSS Leser"
|
||||
memo: "Notizen"
|
||||
trends: "Trends"
|
||||
photo-stream: "Bilder"
|
||||
posts-monitor: "Beitrags-Aktivität"
|
||||
slideshow: "Diashow"
|
||||
version: "Version"
|
||||
broadcast: "Ankündigungen"
|
||||
notifications: "Benachrichtigungen"
|
||||
users: "Empfohlene Benutzer"
|
||||
polls: "Umfrage"
|
||||
post-form: "Beitragsform"
|
||||
post-form: "\"Neuer Beitrag\"-Formular"
|
||||
server: "Server-Info"
|
||||
nav: "Navigation"
|
||||
tips: "Tipps"
|
||||
hashtags: "Hashtags"
|
||||
queue: "Warteschlange"
|
||||
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
||||
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||
you: "Du"
|
||||
auth/views/form.vue:
|
||||
share-access: "Erlaubst Du <i>{name}</i> auf deinen Account zuzugreifen?"
|
||||
permission-ask: "Diese Applikation benötigt folgende Berechtigungen:"
|
||||
account-read: "Accountinformationen anzeigen."
|
||||
account-write: "Accountinformationen bearbeiten."
|
||||
note-write: "Senden."
|
||||
like-write: "Auf Beiträge reagieren."
|
||||
following-write: "Folgen oder entfolgen."
|
||||
notification-read: "Siehe deine Benachrichtigungen."
|
||||
notification-write: "Benachrichtigungen verwalten."
|
||||
cancel: "Abbrechen"
|
||||
accept: "Zugriff erlauben."
|
||||
auth/views/index.vue:
|
||||
loading: "Lädt"
|
||||
denied: "Autorisierung der Anwendung wurde verweigert."
|
||||
denied-paragraph: "Diese App kann nicht auf deinen Account zugreifen."
|
||||
already-authorized: "Diese Anwendung ist bereits autorisiert."
|
||||
allowed: "Autorisierung der Anwendung wurde erlaubt."
|
||||
callback-url: "Zur App zurückkehren"
|
||||
please-go-back: "Bitte gehe zurück zur Anwendung."
|
||||
error: "Sitzung ist nicht vorhanden."
|
||||
sign-in: "Bitte melde dich an."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "Verifizierter Benutzer"
|
||||
pinned-users: "Vorgeschlagen"
|
||||
popular-users: "Beliebt"
|
||||
recently-updated-users: "Kürzlich aktiv"
|
||||
recently-registered-users: "Neue Benutzer"
|
||||
popular-tags: "Beliebte Tags"
|
||||
federated: "Aus dem Fediverse"
|
||||
explore: "{host} erkunden"
|
||||
users-info: "Momentan sind {users} Nutzer hier registriert"
|
||||
common/views/components/url-preview.vue:
|
||||
enable-player: "Player öffnen"
|
||||
disable-player: "Player schließen"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "Keine Benutzer"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Warten auf {}"
|
||||
cancel: "Abbrechen"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Aufgeben"
|
||||
surrendered: "durch Aufgabe"
|
||||
is-llotheo: "Der niedrigere gewinnt (Llotheo)"
|
||||
looped-map: "Spielbrettenden verbinden"
|
||||
can-put-everywhere: "Setzen ist überall erlaubt"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "Spiele Reversi mit deinen Freunden!"
|
||||
@@ -180,12 +364,19 @@ common/views/components/games/reversi/reversi.room.vue:
|
||||
black-or-white: "Schwarz/Weiß"
|
||||
black-is: "Schwarz ist {}"
|
||||
rules: "Regeln"
|
||||
is-llotheo: "Der niedrigere gewinnt (Llotheo)"
|
||||
looped-map: "Spielbrettenden verbinden"
|
||||
can-put-everywhere: "Setzen ist überall erlaubt"
|
||||
settings-of-the-bot: "Bot-Einstellungen"
|
||||
this-game-is-started-soon: "Spiel beginnt gleich"
|
||||
waiting-for-other: "Warte auf den Gegner"
|
||||
waiting-for-me: "Warten, bis du bereit bist"
|
||||
waiting-for-both: "Vorbereiten…"
|
||||
cancel: "Abbrechen"
|
||||
ready: "Bereit"
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "Verbindung zum Server ist fehlgeschlagen"
|
||||
description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal."
|
||||
description: "Entweder gibt es ein Problem mit deiner Internetverbindung oder der Server ist zur Zeit nicht erreichbar oder wird gewartet. Bitte versuche es später noch einmal."
|
||||
thanks: "Vielen Dank für das nutzen von Misskey."
|
||||
troubleshoot: "Problembehandlung"
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
@@ -202,8 +393,8 @@ common/views/components/connect-failed.troubleshooter.vue:
|
||||
no-internet: "Keine Internetverbindung"
|
||||
no-internet-desc: "Bitte vergewissere dich, dass du mit dem Internet verbunden bist."
|
||||
no-server: "Verbindung mit dem Server nicht möglich"
|
||||
no-server-desc: "Die Internetverbindung scheint in Ordnung zu sein, aber eine Verbindung mit dem Misskey Server konnte nicht hergestellt werden. Möglicherweise ist dieser zur Zeit offline oder in der Wartung, bitte versuche es später noch einmal."
|
||||
success: "Erfolgreich mit dem Misskey Server verbunden"
|
||||
no-server-desc: "Die Internetverbindung scheint in Ordnung zu sein, aber eine Verbindung mit dem Misskey-Server konnte nicht hergestellt werden. Möglicherweise ist dieser zur Zeit offline oder wird gewartet. Bitte versuche es später noch einmal."
|
||||
success: "Erfolgreich mit dem Misskey-Server verbunden"
|
||||
success-desc: "Die Verbindung scheint zu funktionieren. Bitte lade die Seite neu."
|
||||
flush: "Cache leeren"
|
||||
set-version: "Version angeben"
|
||||
@@ -211,10 +402,13 @@ common/views/components/media-banner.vue:
|
||||
sensitive: "Dieser Inhalt ist NSFW"
|
||||
click-to-show: "Klicke zum den Inhalt anzusehen"
|
||||
common/views/components/theme.vue:
|
||||
theme: "Design"
|
||||
light-theme: "Thema"
|
||||
dark-theme: "Thema während des Nachtmodus"
|
||||
light-themes: "Helles Thema"
|
||||
dark-themes: "Dunkles Thema"
|
||||
install-a-theme: "Design wird installiert"
|
||||
theme-code: "Design-Quelltext"
|
||||
install: "Anwenden"
|
||||
installed: "\"{}\" wurde installiert"
|
||||
create-a-theme: "Thema erstellen"
|
||||
@@ -225,23 +419,39 @@ common/views/components/theme.vue:
|
||||
base-theme: "Basisthema"
|
||||
base-theme-light: "Hell"
|
||||
base-theme-dark: "Dunkel"
|
||||
find-more-theme: "Mehr Designs finden"
|
||||
theme-name: "Name des Themas"
|
||||
preview-created-theme: "Vorschau"
|
||||
invalid-theme: "Thema ist ungültig"
|
||||
already-installed: "Thema ist bereits installiert"
|
||||
saved: "Gespeichert"
|
||||
manage-themes: "Designs verwalten"
|
||||
builtin-themes: "Standard-Designs"
|
||||
my-themes: "Meine Designs"
|
||||
installed-themes: "Installierte Designs"
|
||||
select-theme: "Design wählen"
|
||||
uninstall: "Deinstallieren"
|
||||
uninstalled: "„{}“ wurde deinstalliert"
|
||||
author: "Autor"
|
||||
desc: "Beschreibung"
|
||||
export: "Exportieren"
|
||||
import: "Importieren"
|
||||
import-by-code: "oder Quelltext einfügen"
|
||||
theme-name-required: "Design-Name ist erforderlich"
|
||||
common/views/components/cw-button.vue:
|
||||
hide: "Ausblenden"
|
||||
show: "Mehr"
|
||||
chars: "{count} Zeichen"
|
||||
files: "{count} Dateien"
|
||||
poll: "Umfrage"
|
||||
common/views/components/messaging.vue:
|
||||
search-user: "Einen Nutzer suchen"
|
||||
you: "Du"
|
||||
no-history: "Keine Chronik"
|
||||
user: "Benutzer"
|
||||
group: "Gruppen"
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "Keine Unterhaltungen"
|
||||
no-history: "Keine weitere Chronik vorhanden"
|
||||
resize-form: "Ziehen um die Größe zu verändern"
|
||||
new-message: "Neue Nachricht"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "Nachricht hier eingeben"
|
||||
@@ -257,16 +467,32 @@ common/views/components/nav.vue:
|
||||
status: "Status"
|
||||
wiki: "Wiki"
|
||||
donors: "Spender"
|
||||
repository: "Projektarchiv"
|
||||
repository: "Quellcode"
|
||||
develop: "Entwickler"
|
||||
feedback: "Feedback"
|
||||
common/views/components/note-menu.vue:
|
||||
favorite: "Diese Notiz favorisieren"
|
||||
mention: "Erwähnungen"
|
||||
detail: "Details"
|
||||
copy-content: "Inhalt kopieren"
|
||||
copy-link: "Link kopieren"
|
||||
favorite: "Diesen Beitrag favorisieren"
|
||||
unfavorite: "Aus Favoriten entfernen"
|
||||
watch: "Beobachten"
|
||||
unwatch: "Nicht mehr beobachten"
|
||||
pin: "An die Profilseite pinnen"
|
||||
unpin: "Lösen"
|
||||
delete: "Löschen"
|
||||
delete-confirm: "Diesen Post löschen?"
|
||||
delete-confirm: "Diesen Beitrag löschen?"
|
||||
remote: "Auf Quelle anzeigen"
|
||||
common/views/components/user-menu.vue:
|
||||
mention: "Erwähnungen"
|
||||
mute: "Stummschalten"
|
||||
unmute: "Stummschaltung aufheben"
|
||||
mute-confirm: "Bist du sicher, dass du diesen Nutzer stummschalten möchtest?"
|
||||
unmute-confirm: "Stummschaltung für diesen Nutzer aufheben?"
|
||||
block: "Sperren"
|
||||
unblock: "Sperrung aufheben"
|
||||
block-confirm: "Diesen Nutzer wirklich sperren?"
|
||||
common/views/components/poll.vue:
|
||||
vote-to: "Stimme für '{}'"
|
||||
vote-count: "{} Stimmen"
|
||||
@@ -302,8 +528,8 @@ common/views/components/signup.vue:
|
||||
password: "Passwort"
|
||||
password-placeholder: "Wir empfehlen mindestens 8 Zeichen"
|
||||
weak-password: "Schwaches Passwort"
|
||||
normal-password: "Faires Passwort"
|
||||
strong-password: "Schwaches Passwort"
|
||||
normal-password: "Normales Passwort"
|
||||
strong-password: "Starkes Passwort"
|
||||
retype: "Wiederholen"
|
||||
retype-placeholder: "Bitte das Passwort erneut eingeben"
|
||||
password-matched: "OK"
|
||||
@@ -325,21 +551,33 @@ common/views/components/uploader.vue:
|
||||
common/views/components/visibility-chooser.vue:
|
||||
public: "Öffentlich"
|
||||
home: "Home"
|
||||
home-desc: "Nur auf die Startseite posten"
|
||||
home-desc: "Auf die Startseite posten"
|
||||
followers: "Folgende"
|
||||
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
||||
specified: "Direkt"
|
||||
specified-desc: "Poste nur für bestimmte Benutzer"
|
||||
specified-desc: "Nur für bestimmte Benutzer sichtbar"
|
||||
local-public: "Öffentlich (nur lokal)"
|
||||
local-home: "Home (nur lokal)"
|
||||
local-followers: "Follower (nur lokal)"
|
||||
common/views/components/profile-editor.vue:
|
||||
title: "Dein Profil"
|
||||
name: "Name"
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
save: "Speichern"
|
||||
export: "Exportieren"
|
||||
import: "Importieren"
|
||||
export-targets:
|
||||
user-lists: "Listen"
|
||||
enter-password: "Bitte Passwort eingeben"
|
||||
common/views/components/user-group-editor.vue:
|
||||
invite: "Einladen"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Listen"
|
||||
common/views/components/user-groups.vue:
|
||||
user-groups: "Gruppen"
|
||||
owned-groups: "Meine Gruppen"
|
||||
invites: "Einladen"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Laden"
|
||||
no-broadcasts: "Keine Broadcasts"
|
||||
@@ -349,6 +587,7 @@ common/views/widgets/photo-stream.vue:
|
||||
title: "Fotostream"
|
||||
no-photos: "Keine Fotos"
|
||||
common/views/widgets/posts-monitor.vue:
|
||||
title: "Beitrags-Aktivität"
|
||||
toggle: "Sicht umschalten"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Serverinformationen"
|
||||
@@ -403,8 +642,8 @@ desktop/views/components/drive.file.vue:
|
||||
copied: "Kopieren erfolgreich"
|
||||
copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
|
||||
desktop/views/components/drive.folder.vue:
|
||||
unable-to-process: "Der Vorgang konnte nicht beendet werden"
|
||||
circular-reference-detected: "Das Zielverzeichnis ist ein Unterverzeichnis des Verzeichnisses welches du verschieben möchtest"
|
||||
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
|
||||
circular-reference-detected: "Das Zielverzeichnis ist innerhalb des Verzeichnisses, dass du verschieben möchtest"
|
||||
unhandled-error: "Unbekannter Fehler"
|
||||
contextmenu:
|
||||
move-to-this-folder: "Verschiebe in diesen Ordner"
|
||||
@@ -419,7 +658,7 @@ desktop/views/components/drive.vue:
|
||||
empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen."
|
||||
empty-folder: "Dieser Ordner ist leer"
|
||||
unable-to-process: "Der Vorgang konnte nicht beendet werden"
|
||||
circular-reference-detected: "Das Zielverzeichnis ist ein Unterverzeichnis des Verzeichnisses welches du verschieben möchtest"
|
||||
circular-reference-detected: "Das Zielverzeichnis ist innerhalb des Verzeichnisses, dass du verschieben möchtest"
|
||||
unhandled-error: "Unbekannter Fehler"
|
||||
url-upload: "Von einer URL hochladen"
|
||||
url-of-file: "URL der Datei, welche du hochladen möchtest"
|
||||
@@ -436,18 +675,14 @@ desktop/views/components/followers.vue:
|
||||
desktop/views/components/following.vue:
|
||||
empty: "Du folgst niemanden"
|
||||
desktop/views/components/home.vue:
|
||||
done: "Verbunden"
|
||||
done: "Beenden"
|
||||
add-widget: "Widget hinzufügen:"
|
||||
add: "Hinzufügen"
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Abbrechen"
|
||||
ok: "OK"
|
||||
desktop/views/components/messaging-room-window.vue:
|
||||
title: "Nachrichten:"
|
||||
desktop/views/components/messaging-window.vue:
|
||||
title: "Nachrichten"
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "Dieser Post ist privat"
|
||||
private: "Dieser Beitrag ist privat"
|
||||
deleted: "Dieser Beitrag wurde entfernt"
|
||||
location: "Ort"
|
||||
renote: "Anmerkung"
|
||||
@@ -455,7 +690,8 @@ desktop/views/components/note-detail.vue:
|
||||
desktop/views/components/note.vue:
|
||||
reply: "Antworten"
|
||||
renote: "Anmerkung"
|
||||
private: "Dieser Post ist privat"
|
||||
detail: "Details"
|
||||
private: "Dieser Beitrag ist privat"
|
||||
deleted: "Dieser Beitrag wurde entfernt"
|
||||
desktop/views/components/notes.vue:
|
||||
error: "Laden fehlgeschlagen."
|
||||
@@ -463,30 +699,14 @@ desktop/views/components/notes.vue:
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "Keine Benachrichtigungen"
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+Nutzer hinzufügen"
|
||||
hide-contents: "Inhalt verstecken"
|
||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
||||
quote-placeholder: "Zitiere diese Anmerkung..."
|
||||
submit: "Beitragsform"
|
||||
reply: "Antworten"
|
||||
renote: "Anmerkung"
|
||||
posted: "Gepostet!"
|
||||
replied: "Geantwortet!"
|
||||
reposted: "Weitergesagt!"
|
||||
note-failed: "Anmerkung fehlgeschlagen"
|
||||
reply-failed: "Antwort fehlgeschlagen"
|
||||
renote-failed: "Anmerkung fehlgeschlagen"
|
||||
posting: "Posting"
|
||||
attach-media-from-local: "Medien von deinem PC hinzufügen"
|
||||
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
|
||||
attach-cancel: "Hinzufügen abbrechen"
|
||||
create-poll: "Eine Abstimmung erstellen"
|
||||
text-remain: "{} Zeichen verbleibend"
|
||||
visibility: "Sichtbarkeit"
|
||||
error: "Fehler"
|
||||
enter-username: "Bitte gib einen Benutzernamen ein..."
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Neue Notiz"
|
||||
note: "Neuer Beitrag"
|
||||
reply: "Antworten"
|
||||
attaches: "{} Medien hinzugefügt"
|
||||
uploading-media: "Lade {} Medien hoch"
|
||||
@@ -500,7 +720,7 @@ desktop/views/components/renote-form.vue:
|
||||
success: "Weitergesagt!"
|
||||
failure: "Weitersagen fehlgeschlagen"
|
||||
desktop/views/components/renote-form-window.vue:
|
||||
title: "Bist du dir sicher, dass du das reposten willst?"
|
||||
title: "Bist du dir sicher, dass du das weitersagen willst?"
|
||||
desktop/views/components/settings.2fa.vue:
|
||||
url: "https://www.google.de/intl/de/landing/2step/"
|
||||
register: "Ein Gerät registrieren"
|
||||
@@ -512,6 +732,7 @@ desktop/views/components/settings.2fa.vue:
|
||||
common/views/components/api-settings.vue:
|
||||
enter-password: "Bitte Passwort eingeben"
|
||||
console:
|
||||
parameter: "Parameter"
|
||||
send: "Senden"
|
||||
common/views/components/drive-settings.vue:
|
||||
in-use: "benutzt"
|
||||
@@ -519,23 +740,21 @@ common/views/components/drive-settings.vue:
|
||||
common/views/components/mute-and-block.vue:
|
||||
save: "Speichern"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "Dieser Post ist privat"
|
||||
private: "Dieser Beitrag ist privat"
|
||||
deleted: "Dieser Beitrag wurde entfernt"
|
||||
poll: "Umfrage"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
add: "Hinzufügen"
|
||||
save: "Speichern"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Taskmanager"
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "Home"
|
||||
local: "Lokal"
|
||||
global: "Global"
|
||||
messages: "Nachrichten"
|
||||
list: "Listen"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "Dein Profil"
|
||||
lists: "Listen"
|
||||
groups: "Gruppen"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
game: "Spielen"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
@@ -544,17 +763,18 @@ desktop/views/components/ui.header.post.vue:
|
||||
post: "Einen neuen Post erstellen"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Suchen"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Listen"
|
||||
desktop/views/components/users-list.vue:
|
||||
fetching: "Lade…"
|
||||
admin/views/dashboard.vue:
|
||||
drive: "Drive"
|
||||
admin/views/abuse.vue:
|
||||
details: "Details"
|
||||
remove-report: "Löschen"
|
||||
admin/views/instance.vue:
|
||||
recaptcha-preview: "Vorschau"
|
||||
invite: "Einladen"
|
||||
save: "Speichern"
|
||||
saved: "Gespeichert"
|
||||
admin/views/charts.vue:
|
||||
drive: "Drive"
|
||||
admin/views/drive.vue:
|
||||
@@ -563,8 +783,6 @@ admin/views/drive.vue:
|
||||
delete: "Löschen"
|
||||
admin/views/users.vue:
|
||||
users:
|
||||
state:
|
||||
verified: "Verifizierter Benutzer"
|
||||
origin:
|
||||
local: "Lokal"
|
||||
admin/views/emoji.vue:
|
||||
@@ -576,8 +794,10 @@ admin/views/announcements.vue:
|
||||
save: "Speichern"
|
||||
remove: "Löschen"
|
||||
add: "Hinzufügen"
|
||||
saved: "Gespeichert"
|
||||
admin/views/federation.vue:
|
||||
status: "Status"
|
||||
save: "Speichern"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Vorheriger Kommentar"
|
||||
next: "Nächster Kommentar"
|
||||
@@ -597,8 +817,6 @@ desktop/views/pages/user/user.photos.vue:
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
month: "Mo"
|
||||
day: "So"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Nachrichten"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Benachrichtigungen"
|
||||
desktop/views/widgets/polls.vue:
|
||||
@@ -614,40 +832,38 @@ mobile/views/components/drive.file-detail.vue:
|
||||
download: "Download"
|
||||
rename: "Umbenennen"
|
||||
mobile/views/components/note.vue:
|
||||
private: "Dieser Post ist privat"
|
||||
private: "Dieser Beitrag ist privat"
|
||||
deleted: "Dieser Beitrag wurde entfernt"
|
||||
location: "Ort"
|
||||
mobile/views/components/note-detail.vue:
|
||||
reply: "Antworten"
|
||||
private: "Dieser Post ist privat"
|
||||
private: "Dieser Beitrag ist privat"
|
||||
deleted: "Dieser Beitrag wurde entfernt"
|
||||
location: "Ort"
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "Keine Benachrichtigungen"
|
||||
mobile/views/components/post-form.vue:
|
||||
reply: "Antworten"
|
||||
renote: "Anmerkung"
|
||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "Dieser Post ist privat"
|
||||
private: "Dieser Beitrag ist privat"
|
||||
deleted: "Dieser Beitrag wurde entfernt"
|
||||
poll: "Umfrage"
|
||||
mobile/views/components/ui.nav.vue:
|
||||
notifications: "Benachrichtigungen"
|
||||
search: "Suchen"
|
||||
user-lists: "Listen"
|
||||
user-groups: "Gruppen"
|
||||
game: "Spielen"
|
||||
about: "Über"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
title: "Listen"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "Eine Datei hochladen"
|
||||
create-folder: "Ein Verzeichnis erstellen"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Home"
|
||||
local: "Lokal"
|
||||
global: "Global"
|
||||
messages: "Nachrichten"
|
||||
mobile/views/pages/widgets.vue:
|
||||
add-widget: "Hinzufügen"
|
||||
customization-tips: "Anpassung-Tipps"
|
||||
customization-tips: "Anpassungs-Tipps"
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
activity: "Aktivität"
|
||||
mobile/views/pages/note.vue:
|
||||
@@ -668,11 +884,50 @@ deck:
|
||||
list: "Listen"
|
||||
rename: "Umbenennen"
|
||||
deck/deck.user-column.vue:
|
||||
following: "Folgen"
|
||||
followers: "Folgende"
|
||||
images: "Bilder"
|
||||
activity: "Aktivität"
|
||||
timeline: "Zeitleiste"
|
||||
pinned-notes: "Angeheftete Beiträge"
|
||||
docs:
|
||||
edit-this-page-on-github: "Hast Du einen Fehler gefunden oder Lust, diese Dokumentation zu verbessern?"
|
||||
edit-this-page-on-github-link: "Seite auf GitHub bearbeiten!"
|
||||
dev/views/index.vue:
|
||||
manage-apps: "Anwendungen verwalten"
|
||||
dev/views/apps.vue:
|
||||
manage-apps: "Anwendungen verwalten"
|
||||
create-app: "Anwendung erstellen"
|
||||
app-missing: "Keine Anwendungen"
|
||||
dev/views/new-app.vue:
|
||||
account-read: "Accountinformationen anzeigen."
|
||||
account-write: "Accountinformationen bearbeiten."
|
||||
note-write: "Senden."
|
||||
following-write: "Folgen oder entfolgen."
|
||||
notification-read: "Siehe deine Benachrichtigungen."
|
||||
notification-write: "Benachrichtigungen verwalten."
|
||||
create-app: "Erstelle Anwendung"
|
||||
app-name: "Name der Anwendung"
|
||||
app-name-desc: "Der Name der Anwendung"
|
||||
app-overview: "Beschreibung der Anwendung"
|
||||
callback-url: "Callback-URL (optional)"
|
||||
callback-url-desc: "Die URL, auf die nach erfolgreicher Authentifizierung umgeleitet werden soll."
|
||||
authority: "Berechtigungen"
|
||||
authority-desc: "Nur die hier eingetragenen Berechtigungen, werden per API zur Verfügung stehen."
|
||||
authority-warning: "Dies kann auch nach dem erstellen der Anwendung geändert werden, allerdings werden dann alle bisher generierten Token ungültig."
|
||||
pages:
|
||||
like: "Gefällt mir"
|
||||
blocks:
|
||||
post: "\"Neuer Beitrag\"-Formular"
|
||||
script:
|
||||
categories:
|
||||
random: "Zufällige Auswahl"
|
||||
list: "Listen"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Listen"
|
||||
random: "Zufällige Auswahl"
|
||||
_randomPick:
|
||||
arg1: "Listen"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listen"
|
||||
_seedRandomPick:
|
||||
arg2: "Listen"
|
||||
_pick:
|
||||
arg1: "Listen"
|
||||
types:
|
||||
array: "Listen"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,7 +12,9 @@ common:
|
||||
rich-contents: "Posts"
|
||||
rich-contents-desc: "Escribe sobre tus pensamientos, eventos, todo lo que quieras compartir. Si es necesario, puedes usar varias sintaxis, decorar tus posts y añadir tus imágenes favoritas, archivos de viddeo y encuestas."
|
||||
reaction: "Reacciones"
|
||||
reaction-desc: "La forma mas facil de expresar tus emociones. Misskey te permite añadir varios tipos de reacciones a los posts de otros usuarios. La emperiencia emocional en Misskey nunca será igual que en otra red social, donde solo puedes poner \"likes\"."
|
||||
ui: "Interfaz"
|
||||
ui-desc: "No hay ninguna interfaz que le vaya bien a todos. Por eso, Misskey tiene una interfaz altamente personalizable para tus gustos. Puedes hacer tu página principal única editando la interfaz de tu timeline y moviendo varios widgets para conseguir hacer de este lugar uno propio."
|
||||
drive: "Drive"
|
||||
adblock:
|
||||
detected: "Por favor, desactive el bloqueador de publicidad."
|
||||
@@ -20,8 +22,15 @@ common:
|
||||
application-authorization: "Autorizaciones de la aplicación."
|
||||
close: "Cerrar"
|
||||
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
||||
load-more: "Leer más"
|
||||
enter-password: "Escribe una contraseña"
|
||||
2fa: "Autenticación de dos factores"
|
||||
customize-home: "Personaliza la página principal"
|
||||
featured-notes: "Destacados"
|
||||
dark-mode: "Modo oscuro"
|
||||
signin: "Iniciar sesión"
|
||||
signup: "¡Regístrate!"
|
||||
signout: "Cerrar sesión"
|
||||
got-it: "¡Listo!"
|
||||
customization-tips:
|
||||
title: "Consejos de personalización"
|
||||
@@ -48,10 +57,34 @@ common:
|
||||
month-and-day: "{day} de {month}"
|
||||
trash: "Papelera"
|
||||
drive: "Drive"
|
||||
pages: "Páginas"
|
||||
messaging: "Conversación"
|
||||
home: "Inicio"
|
||||
deck: "Deck"
|
||||
timeline: "Timeline"
|
||||
explore: "Explorar"
|
||||
following: "Siguiendo"
|
||||
followers: "Seguidores"
|
||||
favorites: "Me gusta esta nota"
|
||||
permissions:
|
||||
"read:account": "Ver información de la cuenta"
|
||||
"write:account": "Editar información de la cuenta"
|
||||
"read:blocks": "Ver bloques"
|
||||
"write:blocks": "Editar bloques"
|
||||
"read:favorites": "Ver favoritos"
|
||||
"write:favorites": "Editar favoritos"
|
||||
"read:following": "Ver información de seguidor"
|
||||
"read:messaging": "Ver conversación"
|
||||
"read:mutes": "Ver silenciados"
|
||||
"write:notes": "Crear y eliminar articulos"
|
||||
"read:notifications": "Ver notificaciones"
|
||||
"read:reactions": "Ver reacciones"
|
||||
"write:votes": "Vota"
|
||||
post-form:
|
||||
reply: "Responder"
|
||||
renote: "Volver a publicar"
|
||||
enter-username: "Ingresar nombre de usuario"
|
||||
username-prompt: "Ingresar nombre de usuario"
|
||||
weekday-short:
|
||||
sunday: "domingo"
|
||||
monday: "lunes"
|
||||
@@ -97,27 +130,107 @@ common:
|
||||
d: "¿Quieres decir algo?"
|
||||
e: "¡Escribe aquí!"
|
||||
f: "Esperando a que escribas algo..."
|
||||
settings: "Configuración"
|
||||
_settings:
|
||||
profile: "Tu perfil"
|
||||
notification: "Notificaciones"
|
||||
apps: "Aplicaciones"
|
||||
tags: "Etiquetas"
|
||||
mute-and-block: "Silenciar/Bloquear"
|
||||
blocking: "Bloquear"
|
||||
security: "Seguridad"
|
||||
password: "Contraseña"
|
||||
other: "Otros"
|
||||
appearance: "Diseño"
|
||||
behavior: "Comportamiento"
|
||||
fetch-on-scroll-desc: "Cuando te deslizas al final de la página nuevo contenido se carga automáticamente."
|
||||
note-visibility: "Visibilidad de la publicación"
|
||||
default-note-visibility: "Rango de publicación predeterminado"
|
||||
web-search-engine: "Buscador web"
|
||||
web-search-engine-desc: "Ejemplo: https://www.google.com/?#q={{query}}"
|
||||
this-setting-is-this-device-only: "Solo para este dispositivo"
|
||||
use-os-default-emojis: "Usar los emoticonos estándar del sistema operativo"
|
||||
line-width: "Grosor de línea"
|
||||
line-width-thin: "Fino"
|
||||
line-width-normal: "Normal"
|
||||
line-width-thick: "Grosor"
|
||||
font-size: "Tamaño del texto"
|
||||
font-size-x-small: "Muy pequeño"
|
||||
font-size-small: "Pequeño"
|
||||
font-size-medium: "Normal"
|
||||
font-size-large: "Grande"
|
||||
font-size-x-large: "Muy grande"
|
||||
deck-column-align: "Alineamiento de las columnas"
|
||||
deck-column-align-center: "Centrar"
|
||||
deck-column-align-left: "Izquierda"
|
||||
deck-column-align-flexible: "Flexible"
|
||||
deck-column-width: "Ancho de las columnas"
|
||||
deck-column-width-narrow: "Estrecho"
|
||||
deck-column-width-narrower: "Un poco estrecho"
|
||||
deck-column-width-normal: "Normal"
|
||||
deck-column-width-wider: "Un poco ancho"
|
||||
deck-column-width-wide: "Ancho"
|
||||
use-shadow: "Usar sombras en la Interfaz de Usuario"
|
||||
rounded-corners: "Esquinas redondeadas en la Interfaz de Usuario"
|
||||
circle-icons: "Usar iconos circulares"
|
||||
contrasted-acct: "Añadir contraste al nombre de usuario"
|
||||
wallpaper: "Fondo de pantalla"
|
||||
choose-wallpaper: "Escoge un fondo de pantalla"
|
||||
delete-wallpaper: "Quitar fondo de pantalla"
|
||||
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||
show-clock-on-header: "Muestra el reloj en la parte superior derecha"
|
||||
show-reply-target: "Mostrar destinatario de la mención"
|
||||
timeline: "Timeline"
|
||||
show-my-renotes: "Mostrar mis renotes en la timeline"
|
||||
show-renoted-my-notes: "Mostrar renotes de mis posts en la timeline"
|
||||
sound: "Sonido"
|
||||
enable-sounds: "Habilitar sonido"
|
||||
volume: "Volúmen"
|
||||
test: "Prueba"
|
||||
update: "Actualizar Misskey"
|
||||
version: "Versión"
|
||||
latest-version: "Última versión"
|
||||
update-checking: "Buscando actualizaciones"
|
||||
no-updates: "No hay actualizaciones disponibles"
|
||||
no-updates-desc: "Tu Misskey está actualizado"
|
||||
update-available: "¡Una nueva versión está disponible!"
|
||||
update-available-desc: "Las actualizaciones se aplicarán cuando la página se vuelva a cargar."
|
||||
advanced-settings: "Configuraciones avanzadas"
|
||||
navbar-position-left: "Izquierda"
|
||||
search: "Buscar"
|
||||
delete: "eliminar"
|
||||
loading: "cargando"
|
||||
ok: "Confirmar"
|
||||
cancel: "Cancelar"
|
||||
update-available-title: "Actualización disponible"
|
||||
update-available: "Hay disponible una nueva versión de Misskey ({newer}, la versión actual es {current}). Refresca la página para aplicar las actualizaciones."
|
||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||
verified-user: "Cuenta verificada"
|
||||
hide-password: "Ocultar contraseña"
|
||||
show-password: "Mostrar contraseña"
|
||||
enter-username: "Ingresar nombre de usuario"
|
||||
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
|
||||
user-suspended: "Este usuario ha sido suspendido"
|
||||
is-remote-user: "La información sobre este usuario puede no estar completa"
|
||||
is-remote-post: "Es una publicación remota"
|
||||
view-on-remote: "Consultar el perfil completo"
|
||||
renoted-by: "Renotado por {user}"
|
||||
no-notes: "No hay publicaciones"
|
||||
turn-on-darkmode: "Cambiar a modo oscuro"
|
||||
turn-off-darkmode: "Modo claro"
|
||||
error:
|
||||
title: "Se ha producido un problema :("
|
||||
retry: "Inténtalo otra vez"
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
my-turn: "Mi turno"
|
||||
opponent-turn: "Turno del oponente"
|
||||
turn-of: "Turno de {name}"
|
||||
past-turn-of: "Turno de {name}"
|
||||
won: "{name} ha ganado"
|
||||
black: "Negro"
|
||||
white: "Blanco"
|
||||
total: "Total"
|
||||
this-turn: "Turno {count}"
|
||||
widgets:
|
||||
analog-clock: "Reloj analógico"
|
||||
profile: "Perfil"
|
||||
@@ -140,18 +253,13 @@ common:
|
||||
nav: "Navegación"
|
||||
tips: "Consejos"
|
||||
hashtags: "Etiquetas"
|
||||
queue: "En cola"
|
||||
dev: "Se ha producido un error creando la aplicación. Intentelo de nuevo."
|
||||
ai-chan-kawaii: "Ai-chan es muy mona!"
|
||||
you: "Tú"
|
||||
auth/views/form.vue:
|
||||
share-access: "¿Deseas permitir a <i>{name}</i> acceder a tu cuenta?"
|
||||
permission-ask: "La aplicación requiere los siguientes permisos:"
|
||||
account-read: "Viendo información de la cuenta:"
|
||||
account-write: "Modificar información de la cuenta:"
|
||||
note-write: "Publicación."
|
||||
like-write: "Para reaccionar a las publicaciones."
|
||||
following-write: "Seguir o dejar de seguir"
|
||||
drive-read: "Leer tu unidad."
|
||||
drive-write: "Cargar o borrar archivos de tu unidad."
|
||||
notification-read: "Leer tus notificaciones."
|
||||
notification-write: "Administrar tus notificaciones."
|
||||
cancel: "Cancelar"
|
||||
accept: "Garantizar acceso."
|
||||
auth/views/index.vue:
|
||||
@@ -165,7 +273,18 @@ auth/views/index.vue:
|
||||
error: "Esta sesión no existe."
|
||||
sign-in: "Por favor inicia sesión."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "Cuenta verificada"
|
||||
popular-users: "Usuarios populares"
|
||||
recently-updated-users: "Usuarios activos recientemente"
|
||||
recently-registered-users: "Usuarios que se han unido recientemente"
|
||||
popular-tags: "Etiquetas populares"
|
||||
federated: "Desde el fediverso"
|
||||
explore: "Explorar {host}"
|
||||
users-info: "Actualmente hay {users} registrados aquí"
|
||||
common/views/components/url-preview.vue:
|
||||
enable-player: "Activar reproducción"
|
||||
disable-player: "Cerrar el reproductor"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "No hay usuarios."
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Esperando por {}"
|
||||
@@ -181,6 +300,7 @@ common/views/components/games/reversi/reversi.index.vue:
|
||||
sub-title: "¡Juega Reversi con tus amigos!"
|
||||
invite: "Invitar"
|
||||
rule: "Cómo jugar"
|
||||
rule-desc: "Reversi es un juego de estrategia para dos jugadores, el cual se juega en un tablero de 8x8. Hay 64 fichas llamadas discos, las cuales son claras de un lado y oscuras del otro. Los jugadores toman turnos colocando fichas en el tablero con su color asignado mirando hacia arriba. Durante una jugada, cualquier disco del color del oponente que esté en fila entre un disco del oponente y otro del mismo color, será volteado para tener el color del jugador que haya hecho la movida. El objetivo del juego es tener la mayoría de los discos de tu color cuando el último cuadro es llenado."
|
||||
mode-invite: "Invitar"
|
||||
mode-invite-desc: "Invitar un usuario al juego."
|
||||
invitations: "¡Has recibido una invitación!"
|
||||
@@ -237,23 +357,40 @@ common/views/components/media-banner.vue:
|
||||
click-to-show: "Click para mostrar"
|
||||
common/views/components/theme.vue:
|
||||
theme: "Tema"
|
||||
light-theme: "Tema a usar en Light mode"
|
||||
dark-theme: "Tema a usar en dark mode"
|
||||
light-themes: "Tema claro"
|
||||
dark-themes: "Tema oscuro"
|
||||
install-a-theme: "Instalar tema"
|
||||
theme-code: "Código del tema"
|
||||
install: "Instalación"
|
||||
installed: "\"{}\" se ha instalado"
|
||||
create-a-theme: "Crear tema"
|
||||
save-created-theme: "Guardar tema"
|
||||
primary-color: "Color primario"
|
||||
secondary-color: "Color secundario"
|
||||
text-color: "Color del texto"
|
||||
base-theme: "Tema base"
|
||||
base-theme-light: "Claro"
|
||||
base-theme-dark: "Oscuro"
|
||||
find-more-theme: "Obtener más temas"
|
||||
theme-name: "Nombre del tema"
|
||||
preview-created-theme: "Vista previa"
|
||||
invalid-theme: "No es un tema válido"
|
||||
already-installed: "Este tema ya está instalado."
|
||||
saved: "Guardado"
|
||||
manage-themes: "Gestor de temas"
|
||||
builtin-themes: "Temas estandar"
|
||||
my-themes: "Mis temas"
|
||||
installed-themes: "Temas instalados"
|
||||
select-theme: "Elegir tema"
|
||||
uninstall: "Desinstalar"
|
||||
uninstalled: "\"{}\" ha sido desinstalado"
|
||||
author: "Autor"
|
||||
desc: "Descripción"
|
||||
export: "Exportar"
|
||||
import: "Importar"
|
||||
import-by-code: "o pega el código"
|
||||
common/views/components/cw-button.vue:
|
||||
show: "Mostrar"
|
||||
chars: "{count} letras"
|
||||
@@ -264,17 +401,13 @@ common/views/components/messaging.vue:
|
||||
you: "Tu"
|
||||
no-history: "Sin historial"
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "Sin conversaciones"
|
||||
no-history: "El historial se ha acabado"
|
||||
resize-form: "Arrastra para redimensionar"
|
||||
new-message: "Nuevo mensaje"
|
||||
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "Escribe el mensaje aquí"
|
||||
send: "Enviar"
|
||||
attach-from-local: "Adjunta ficheros desde tu PC"
|
||||
attach-from-drive: "Adjunta ficheros desde tu disco"
|
||||
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "Leer"
|
||||
deleted: "El mensaje se ha borrado"
|
||||
@@ -367,10 +500,25 @@ common/views/components/stream-indicator.vue:
|
||||
connected: "Conectado"
|
||||
common/views/components/notification-settings.vue:
|
||||
title: "Notificaciones"
|
||||
common/views/components/integration-settings.vue:
|
||||
title: "Integraciones"
|
||||
connect: "Conectar"
|
||||
disconnect: "Desconectarse"
|
||||
connected-to: "Estas conectado a la siguiente cuenta"
|
||||
common/views/components/github-setting.vue:
|
||||
description: "Una vez conectada tu cuenta de GitHub a Misskey podrás ver la información sobre tu perfil de GitHub y además podrás registrarte mediante tu cuenta de GitHub."
|
||||
connected-to: "Estas conectado a esta cuenta de GitHub"
|
||||
detail: "Ver detalles..."
|
||||
reconnect: "Reconectar"
|
||||
connect: "Vincular tu cuenta de GitHub"
|
||||
disconnect: "Desconectarse"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "Una vez conectada tu cuenta de Discord a Misskey podrás ver la información sobre tu perfil de Discord y además podrás registrarte mediante tu cuenta de Discord."
|
||||
connected-to: "Estas conectado a esta cuenta de Discord"
|
||||
detail: "Ver detalles..."
|
||||
reconnect: "Reconectar"
|
||||
connect: "Vincular tu cuenta de Discord"
|
||||
disconnect: "Desconectarse"
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Un momento"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
@@ -382,25 +530,72 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "Directo"
|
||||
specified-desc: "Publica solo para los seguidores que quieras"
|
||||
local-public: "Público (sólo local)"
|
||||
local-public-desc: "No publicar para remoto"
|
||||
local-home: "Inicio (sólo local)"
|
||||
local-followers: "Seguidores (sólo local)"
|
||||
common/views/components/trends.vue:
|
||||
count: "{} usuarios mencionados"
|
||||
empty: "Ninguna tendencia popular ahora"
|
||||
common/views/components/language-settings.vue:
|
||||
title: "Mostrar idioma"
|
||||
pick-language: "Selecciona un idioma"
|
||||
recommended: "Recomendado"
|
||||
auto: "Automático"
|
||||
specify-language: "Especifica el idioma"
|
||||
info: "Necesitas recargar la página para que los cambios tengan efecto."
|
||||
common/views/components/profile-editor.vue:
|
||||
title: "Perfil"
|
||||
name: "Nombre"
|
||||
account: "Cuenta"
|
||||
location: "Localización"
|
||||
description: "Acerca de mí"
|
||||
you-can-include-hashtags: "También puedes incluir hashtags en la descripción de tu perfil."
|
||||
language: "Idioma"
|
||||
birthday: "Fecha de nacimiento"
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
is-cat: "Esta cuenta es un gato"
|
||||
is-bot: "Esta cuenta es un bot"
|
||||
is-locked: "Las peticiones de seguimiento necesitan aprobación"
|
||||
careful-bot: "Las peticiones de seguimiento de bots necesitan aprobación"
|
||||
auto-accept-followed: "Aprobar automaticamente las peticiones de follow de gente a la que sigues"
|
||||
advanced: "Otros"
|
||||
privacy: "Privacidad"
|
||||
save: "Guardar"
|
||||
saved: "Perfil actualizado con exito"
|
||||
uploading: "Subiendo"
|
||||
upload-failed: "Error al subir"
|
||||
email: "Preferencias de correo"
|
||||
email-address: "Correo electrónico"
|
||||
email-verified: "Tu cuenta de correo ha sido verificada."
|
||||
email-not-verified: "Tu cuenta de correo no está verificada. Por favor comprueba tu bandeja de entrada."
|
||||
export: "Exportar"
|
||||
import: "Importar"
|
||||
export-and-import: "Exportar/Importar"
|
||||
export-targets:
|
||||
all-notes: "Todas las notas publicadas"
|
||||
following-list: "Seguidores"
|
||||
mute-list: "Silenciar"
|
||||
blocking-list: "Bloquear"
|
||||
user-lists: "Listas"
|
||||
export-requested: "Has solicitado una exportación. Esto puede tardar un rato. Después de que termine la exportación el archivo se añadirá al drive."
|
||||
import-requested: "Has empezado una importación. Esto puede tardar un rato."
|
||||
enter-password: "Escribe una contraseña"
|
||||
danger-zone: "Zona de peligro"
|
||||
delete-account: "Eliminar cuenta"
|
||||
account-deleted: "Esta cuenta ha sido eliminada. Puede tardar un rato hasta que toda la información desaparazca."
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Usuarios"
|
||||
rename: "Cambiar el nombre de la lista"
|
||||
delete: "Eliminar lista"
|
||||
remove-user: "Eliminar de la lista"
|
||||
common/views/components/user-group-editor.vue:
|
||||
invite: "Invitar"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Listas"
|
||||
list-name: "Nombre de lista"
|
||||
common/views/components/user-groups.vue:
|
||||
invites: "Invitar"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Recuperando"
|
||||
no-broadcasts: "Sin emisión"
|
||||
@@ -459,6 +654,8 @@ common/views/pages/follow.vue:
|
||||
request-pending: "Solicitud pendiente"
|
||||
follow-processing: "Solicitud en proceso"
|
||||
follow-request: "Solicitar suscripción"
|
||||
common/views/pages/follow-requests.vue:
|
||||
received-follow-requests: "Solicitudes de seguimiento"
|
||||
desktop:
|
||||
banner-crop-title: "Corta la parte que aparece como un banner"
|
||||
banner: "Banner"
|
||||
@@ -567,10 +764,6 @@ desktop/views/components/home.vue:
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Cancelar"
|
||||
ok: "OK"
|
||||
desktop/views/components/messaging-room-window.vue:
|
||||
title: "Mensajes:"
|
||||
desktop/views/components/messaging-window.vue:
|
||||
title: "Mensajes"
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "Esta publicación es privada"
|
||||
deleted: "Esta publicación ha sido removida"
|
||||
@@ -579,7 +772,7 @@ desktop/views/components/note-detail.vue:
|
||||
add-reaction: "Agregar una reacción"
|
||||
desktop/views/components/note.vue:
|
||||
reply: "Responder"
|
||||
renote: "Republicar"
|
||||
renote: "Volver a publicar"
|
||||
add-reaction: "Reacción"
|
||||
detail: "Detalles"
|
||||
private: "Esta publicación es privada"
|
||||
@@ -590,33 +783,12 @@ desktop/views/components/notes.vue:
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "No hay notificaciones"
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+Agregar usuario"
|
||||
attach-location-information: "Agregar localización"
|
||||
hide-contents: "Esconder contenidos"
|
||||
reply-placeholder: "Responder a esta nota..."
|
||||
quote-placeholder: "Citar esta nota..."
|
||||
submit: "Publicar"
|
||||
reply: "Responder"
|
||||
renote: "Republicar"
|
||||
posted: "¡Publicado!"
|
||||
replied: "¡Respondido!"
|
||||
reposted: "¡Republicado!"
|
||||
note-failed: "Error al publicar nota"
|
||||
reply-failed: "Error al responder"
|
||||
renote-failed: "Error al republicar"
|
||||
posting: "Publicando"
|
||||
attach-media-from-local: "Agregar medios de tu dispositivo"
|
||||
attach-media-from-drive: "Adjunta multimedia desde tu Disco"
|
||||
attach-cancel: "Quitar el archivo adjunto"
|
||||
create-poll: "Crea una encuesta"
|
||||
text-remain: "quedan {} caracteres"
|
||||
recent-tags: "Reciente"
|
||||
click-to-tagging: "Click para etiquetar"
|
||||
visibility: "Visibilidad"
|
||||
geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización."
|
||||
error: "Error"
|
||||
enter-username: "Por favor escribe un nombre de usuario..."
|
||||
annotations: "Anotaciones a la publicación (opcional)"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nota nueva"
|
||||
reply: "Responder"
|
||||
@@ -673,6 +845,9 @@ common/views/components/mute-and-block.vue:
|
||||
mute: "Silenciar"
|
||||
block: "Bloquear"
|
||||
save: "Guardar"
|
||||
common/views/components/post-form-attaches.vue:
|
||||
mark-as-sensitive: "Marcar como 'sensible'"
|
||||
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "Esta publicación es privada"
|
||||
deleted: "Esta publicación ha sido removida"
|
||||
@@ -684,9 +859,7 @@ desktop/views/components/settings.tags.vue:
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "Inicio"
|
||||
local: "Local"
|
||||
hybrid: "Social"
|
||||
global: "Global"
|
||||
messages: "Mensajes"
|
||||
list: "Listas"
|
||||
hashtag: "Hashtags"
|
||||
list-name: "Nombre de lista"
|
||||
@@ -706,14 +879,6 @@ desktop/views/components/ui.header.post.vue:
|
||||
post: "Crear una publicación"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Buscar"
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
title: "Solicitudes de seguidores"
|
||||
accept: "Aceptar"
|
||||
reject: "Rechazar"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Listas de usuario"
|
||||
create-list: "Crear lista"
|
||||
list-name: "Nombre de lista"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Publicaciones"
|
||||
following: "Sigue"
|
||||
@@ -727,25 +892,48 @@ admin/views/index.vue:
|
||||
instance: "Instancia"
|
||||
moderators: "Moderadores"
|
||||
users: "Usuarios"
|
||||
hashtags: "Hashtags"
|
||||
federation: "Federado"
|
||||
queue: "Cola de trabajos"
|
||||
logs: "Registros"
|
||||
back-to-misskey: "Volver a Misskey"
|
||||
admin/views/dashboard.vue:
|
||||
dashboard: "Panel de Control"
|
||||
accounts: "Cuenta"
|
||||
notes: "Publicaciones"
|
||||
drive: "Drive"
|
||||
instances: "Instancias"
|
||||
this-instance: "Esta instancia"
|
||||
federated: "Federado"
|
||||
admin/views/queue.vue:
|
||||
title: "Cola"
|
||||
remove-all-jobs: "Limpiar todos los trabajos pendientes"
|
||||
queue: "Cola"
|
||||
admin/views/logs.vue:
|
||||
logs: "Registros"
|
||||
admin/views/abuse.vue:
|
||||
title: "Abuso"
|
||||
target: "Destinatario"
|
||||
reporter: "Informador"
|
||||
details: "Detalles"
|
||||
remove-report: "eliminar"
|
||||
admin/views/instance.vue:
|
||||
instance: "Instancia"
|
||||
instance-name: "Nombre de la instancia"
|
||||
instance-description: "Descripción de la instancia"
|
||||
host: "Host"
|
||||
recaptcha-secret-key: "clave secreta reCAPTCHA"
|
||||
banner-url: "URL de la imagen de banner"
|
||||
error-image-url: "Error en la URL de la imagen"
|
||||
languages: "Idioma de esta instancia"
|
||||
languages-desc: "Puedes añadir mas de uno, separado por espacios."
|
||||
maintainer-config: "Información del administrador"
|
||||
maintainer-name: "Nombre del administrador"
|
||||
maintainer-email: "Contactar con el administrador"
|
||||
drive-config: "Ajustes del Drive"
|
||||
cache-remote-files: "Mantener en cache los archivos remotos"
|
||||
recaptcha-preview: "Vista previa"
|
||||
invite: "Invitar"
|
||||
save: "Guardar"
|
||||
external-user-recommendation-timeout: "Tiempo de espera"
|
||||
saved: "Guardado"
|
||||
email: "Correo electrónico"
|
||||
smtp-host: "Host SMTP"
|
||||
smtp-port: "Puerto SMTP"
|
||||
@@ -774,7 +962,6 @@ admin/views/users.vue:
|
||||
state:
|
||||
all: "Todo"
|
||||
moderator: "Moderadores"
|
||||
verified: "Cuenta verificada"
|
||||
origin:
|
||||
local: "Local"
|
||||
admin/views/emoji.vue:
|
||||
@@ -786,12 +973,14 @@ admin/views/announcements.vue:
|
||||
save: "Guardar"
|
||||
remove: "eliminar"
|
||||
add: "Agregar"
|
||||
saved: "Guardado"
|
||||
admin/views/federation.vue:
|
||||
instance: "Instancia"
|
||||
host: "Host"
|
||||
following: "Siguiendo"
|
||||
status: "Estado"
|
||||
block: "Bloquear"
|
||||
instances: "Instancia"
|
||||
instances: "Federado"
|
||||
states:
|
||||
all: "Todo"
|
||||
blocked: "Bloquear"
|
||||
@@ -799,6 +988,8 @@ admin/views/federation.vue:
|
||||
chart-spans:
|
||||
hour: "Por hora"
|
||||
day: "Por día"
|
||||
blocked-hosts: "Bloquear"
|
||||
save: "Guardar"
|
||||
desktop/views/pages/selectdrive.vue:
|
||||
cancel: "Cancelar"
|
||||
desktop/views/pages/user-list.users.vue:
|
||||
@@ -813,8 +1004,6 @@ desktop/views/pages/user/user.photos.vue:
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
month: "lunes"
|
||||
day: "domingo"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Mensajes"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Notificaciones"
|
||||
desktop/views/widgets/polls.vue:
|
||||
@@ -853,10 +1042,6 @@ mobile/views/components/note-detail.vue:
|
||||
location: "Localización"
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "No hay notificaciones"
|
||||
mobile/views/components/post-form.vue:
|
||||
reply: "Responder"
|
||||
renote: "Republicar"
|
||||
reply-placeholder: "Responder a esta nota..."
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "Esta publicación es privada"
|
||||
deleted: "Esta publicación ha sido removida"
|
||||
@@ -872,24 +1057,20 @@ mobile/views/components/ui.nav.vue:
|
||||
game: "Juegos"
|
||||
admin: "Admin"
|
||||
about: "Sobre"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
title: "Listas"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "Subir fichero"
|
||||
create-folder: "Crear una carpeta"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Inicio"
|
||||
local: "Local"
|
||||
hybrid: "Social"
|
||||
global: "Global"
|
||||
messages: "Mensajes"
|
||||
mobile/views/pages/widgets.vue:
|
||||
dashboard: "Panel de control"
|
||||
add-widget: "Agregar"
|
||||
customization-tips: "Consejos de personalización"
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
activity: "Actividad"
|
||||
mobile/views/pages/received-follow-requests.vue:
|
||||
title: "Solicitudes de seguimiento"
|
||||
accept: "Aceptar"
|
||||
reject: "Rechazar"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -901,7 +1082,6 @@ mobile/views/pages/user/home.photos.vue:
|
||||
deck:
|
||||
home: "Inicio"
|
||||
local: "Local"
|
||||
hybrid: "Social"
|
||||
hashtag: "Etiquetas"
|
||||
global: "Global"
|
||||
notifications: "Notificaciones"
|
||||
@@ -909,12 +1089,25 @@ deck:
|
||||
rename: "Renombrar"
|
||||
deck/deck.user-column.vue:
|
||||
activity: "Actividad"
|
||||
dev/views/new-app.vue:
|
||||
account-read: "Viendo información de la cuenta:"
|
||||
account-write: "Modificar información de la cuenta:"
|
||||
note-write: "Publicación."
|
||||
following-write: "Seguir o dejar de seguir"
|
||||
drive-read: "Leer tu unidad."
|
||||
drive-write: "Cargar o borrar archivos de tu unidad."
|
||||
notification-read: "Leer tus notificaciones."
|
||||
notification-write: "Administrar tus notificaciones."
|
||||
pages:
|
||||
like: "Me gusta"
|
||||
blocks:
|
||||
post: "Formulario"
|
||||
script:
|
||||
categories:
|
||||
random: "Aleatorio"
|
||||
list: "Listas"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Listas"
|
||||
random: "Aleatorio"
|
||||
_randomPick:
|
||||
arg1: "Listas"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listas"
|
||||
_seedRandomPick:
|
||||
arg2: "Listas"
|
||||
_pick:
|
||||
arg1: "Listas"
|
||||
types:
|
||||
array: "Listas"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,8 @@ const merge = (...args) => args.reduce((a, c) => ({
|
||||
}), {});
|
||||
|
||||
const languages = [
|
||||
'cs-CZ',
|
||||
'da-DK',
|
||||
'de-DE',
|
||||
'en-US',
|
||||
'es-ES',
|
||||
@@ -24,10 +26,13 @@ const languages = [
|
||||
'nl-NL',
|
||||
'pl-PL',
|
||||
'zh-CN',
|
||||
'zh-TW',
|
||||
];
|
||||
|
||||
const primaries = {
|
||||
'en': 'US',
|
||||
'ja': 'JP',
|
||||
'zh': 'CN',
|
||||
};
|
||||
|
||||
const locales = languages.reduce((a, c) => (a[c] = yaml.safeLoad(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8')) || {}, a), {});
|
||||
|
||||
@@ -35,6 +35,7 @@ common:
|
||||
signup: "新規登録"
|
||||
signout: "ログアウト"
|
||||
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
||||
fetching-as-ap-object: "連合に照会中"
|
||||
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
@@ -64,6 +65,7 @@ common:
|
||||
|
||||
trash: "ゴミ箱"
|
||||
drive: "ドライブ"
|
||||
pages: "ページ"
|
||||
messaging: "トーク"
|
||||
home: "ホーム"
|
||||
deck: "デッキ"
|
||||
@@ -73,10 +75,60 @@ common:
|
||||
followers: "フォロワー"
|
||||
favorites: "お気に入り"
|
||||
|
||||
permissions:
|
||||
"read:account": "アカウントの情報を見る"
|
||||
"write:account": "アカウントの情報を変更する"
|
||||
"read:blocks": "ブロックを見る"
|
||||
"write:blocks": "ブロックを操作する"
|
||||
"read:drive": "ドライブを見る"
|
||||
"write:drive": "ドライブを操作する"
|
||||
"read:favorites": "お気に入りを見る"
|
||||
"write:favorites": "お気に入りを操作する"
|
||||
"read:following": "フォローの情報を見る"
|
||||
"write:following": "フォロー・フォロー解除する"
|
||||
"read:messaging": "トークを見る"
|
||||
"write:messaging": "トークを操作する"
|
||||
"read:mutes": "ミュートを見る"
|
||||
"write:mutes": "ミュートを操作する"
|
||||
"write:notes": "投稿を作成・削除する"
|
||||
"read:notifications": "通知を見る"
|
||||
"write:notifications": "通知を操作する"
|
||||
"read:reactions": "リアクションを見る"
|
||||
"write:reactions": "リアクションを操作する"
|
||||
"write:votes": "投票する"
|
||||
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
|
||||
post-form:
|
||||
attach-location-information: "位置情報を添付する"
|
||||
hide-contents: "内容を隠す"
|
||||
reply-placeholder: "この投稿への返信..."
|
||||
quote-placeholder: "この投稿を引用..."
|
||||
option-quote-placeholder: "この投稿を引用... (オプション)"
|
||||
quote-attached: "引用付き"
|
||||
quote-question: "引用として添付しますか?"
|
||||
submit: "投稿"
|
||||
reply: "返信"
|
||||
renote: "Renote"
|
||||
posting: "投稿中"
|
||||
attach-media-from-local: "PCからメディアを添付"
|
||||
attach-media-from-drive: "ドライブからメディアを添付"
|
||||
insert-a-kao: "v('ω')v"
|
||||
create-poll: "アンケートを作成"
|
||||
text-remain: "残り{}文字"
|
||||
recent-tags: "最近"
|
||||
local-only-message: "この投稿はローカルにのみ公開されます"
|
||||
click-to-tagging: "クリックでタグ付け"
|
||||
visibility: "公開範囲"
|
||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||
error: "エラー"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
add-visible-user: "ユーザーを追加"
|
||||
cw-placeholder: "内容への注釈 (オプション)"
|
||||
username-prompt: "ユーザー名を入力してください"
|
||||
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@@ -239,9 +291,9 @@ common:
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
verified-user: "公式アカウント"
|
||||
hide-password: "パスワードを隠す"
|
||||
show-password: "パスワードを表示する"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
|
||||
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
|
||||
user-suspended: "このユーザーは凍結されています。"
|
||||
@@ -291,6 +343,7 @@ common:
|
||||
nav: "ナビゲーション"
|
||||
tips: "ヒント"
|
||||
hashtags: "ハッシュタグ"
|
||||
queue: "キュー"
|
||||
|
||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||
ai-chan-kawaii: "藍ちゃかわいい"
|
||||
@@ -299,15 +352,6 @@ common:
|
||||
auth/views/form.vue:
|
||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||
permission-ask: "このアプリは次の権限を要求しています:"
|
||||
account-read: "アカウントの情報を見る。"
|
||||
account-write: "アカウントの情報を操作する。"
|
||||
note-write: "投稿する。"
|
||||
like-write: "いいねしたりいいね解除する。"
|
||||
following-write: "フォローしたりフォロー解除する。"
|
||||
drive-read: "ドライブを見る。"
|
||||
drive-write: "ドライブを操作する。"
|
||||
notification-read: "通知を見る。"
|
||||
notification-write: "通知を操作する。"
|
||||
cancel: "キャンセル"
|
||||
accept: "アクセスを許可"
|
||||
|
||||
@@ -323,7 +367,7 @@ auth/views/index.vue:
|
||||
sign-in: "サインインしてください"
|
||||
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
pinned-users: "ピン留めされたユーザー"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
recently-registered-users: "新規ユーザー"
|
||||
@@ -334,6 +378,7 @@ common/views/pages/explore.vue:
|
||||
|
||||
common/views/components/url-preview.vue:
|
||||
enable-player: "プレイヤーを開く"
|
||||
disable-player: "プレイヤーを閉じる"
|
||||
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
@@ -464,20 +509,25 @@ common/views/components/messaging.vue:
|
||||
search-user: "ユーザーを探す"
|
||||
you: "あなた"
|
||||
no-history: "履歴はありません"
|
||||
user: "ユーザー"
|
||||
group: "グループ"
|
||||
start-with-user: "ユーザーとトークを開始"
|
||||
start-with-group: "グループとトークを開始"
|
||||
select-group: "グループを選択してください"
|
||||
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "このユーザーと話したことはありません"
|
||||
not-talked-user: "このユーザーとの会話はありません"
|
||||
not-talked-group: "このグループでの会話はありません"
|
||||
no-history: "これより過去の履歴はありません"
|
||||
resize-form: "ドラッグしてフォームの広さを調整"
|
||||
new-message: "新しいメッセージがあります"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
only-one-file-attached: "メッセージに添付できるファイルはひとつです"
|
||||
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "ここにメッセージを入力"
|
||||
send: "送信"
|
||||
attach-from-local: "PCからファイルを添付する"
|
||||
attach-from-drive: "ドライブからファイルを添付する"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
only-one-file-attached: "メッセージに添付できるファイルはひとつです"
|
||||
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "既読"
|
||||
@@ -492,6 +542,7 @@ common/views/components/nav.vue:
|
||||
repository: "リポジトリ"
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
tos: "利用規約"
|
||||
|
||||
common/views/components/note-menu.vue:
|
||||
mention: "メンション"
|
||||
@@ -512,8 +563,12 @@ common/views/components/user-menu.vue:
|
||||
mention: "メンション"
|
||||
mute: "ミュート"
|
||||
unmute: "ミュート解除"
|
||||
mute-confirm: "このユーザーをミュートしますか?"
|
||||
unmute-confirm: "このユーザーをミュート解除しますか?"
|
||||
block: "ブロック"
|
||||
unblock: "ブロック解除"
|
||||
block-confirm: "このユーザーをブロックしますか?"
|
||||
unblock-confirm: "このユーザーをブロック解除しますか?"
|
||||
push-to-list: "リストに追加"
|
||||
select-list: "リストを選択してください"
|
||||
report-abuse: "スパムを報告"
|
||||
@@ -521,8 +576,12 @@ common/views/components/user-menu.vue:
|
||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||
silence: "サイレンス"
|
||||
unsilence: "サイレンス解除"
|
||||
silence-confirm: "このユーザーをサイレンスしますか?"
|
||||
unsilence-confirm: "このユーザーをサイレンス解除しますか?"
|
||||
suspend: "凍結"
|
||||
unsuspend: "凍結解除"
|
||||
suspend-confirm: "このユーザーを凍結しますか?"
|
||||
unsuspend-confirm: "このユーザーを凍結解除しますか?"
|
||||
|
||||
common/views/components/poll.vue:
|
||||
vote-to: "「{}」に投票する"
|
||||
@@ -560,6 +619,7 @@ common/views/components/poll-editor.vue:
|
||||
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "リアクションを選択"
|
||||
input-reaction-placeholder: "または絵文字を入力"
|
||||
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
@@ -604,6 +664,8 @@ common/views/components/signup.vue:
|
||||
password-matched: "確認されました"
|
||||
password-not-matched: "一致していません"
|
||||
recaptcha: "認証"
|
||||
agree-to: "{0}に同意します。"
|
||||
tos: "利用規約"
|
||||
create: "アカウント作成"
|
||||
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
|
||||
|
||||
@@ -701,12 +763,16 @@ common/views/components/profile-editor.vue:
|
||||
email-verified: "メールアドレスが確認されました"
|
||||
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||
export: "エクスポート"
|
||||
import: "インポート"
|
||||
export-and-import: "エクスポートとインポート"
|
||||
export-targets:
|
||||
all-notes: "すべての投稿データ"
|
||||
following-list: "フォロー"
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
user-lists: "リスト"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
import-requested: "インポートをリクエストしました。これには時間がかかる場合があります。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
@@ -719,6 +785,35 @@ common/views/components/user-list-editor.vue:
|
||||
remove-user: "このリストから削除"
|
||||
delete-are-you-sure: "リスト「$1」を削除しますか?"
|
||||
deleted: "削除しました"
|
||||
add-user: "ユーザーを追加"
|
||||
|
||||
common/views/components/user-group-editor.vue:
|
||||
users: "メンバー"
|
||||
rename: "グループ名を変更"
|
||||
delete: "グループを削除"
|
||||
transfer: "グループを譲渡"
|
||||
transfer-are-you-sure: "グループ「$1」を「@$2」さんに譲渡しますか?"
|
||||
transferred: "グループを譲渡しました"
|
||||
remove-user: "このグループから削除"
|
||||
delete-are-you-sure: "グループ「$1」を削除しますか?"
|
||||
deleted: "削除しました"
|
||||
invite: "招待"
|
||||
invited: "招待を送信しました"
|
||||
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
|
||||
common/views/components/user-groups.vue:
|
||||
user-groups: "グループ"
|
||||
create-group: "グループを作成"
|
||||
group-name: "グループ名"
|
||||
owned-groups: "自分のグループ"
|
||||
joined-groups: "参加しているグループ"
|
||||
invites: "招待"
|
||||
accept-invite: "参加"
|
||||
reject-invite: "拒否"
|
||||
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
@@ -792,6 +887,11 @@ common/views/pages/follow.vue:
|
||||
follow-processing: "フォロー処理中"
|
||||
follow-request: "フォロー申請"
|
||||
|
||||
common/views/pages/follow-requests.vue:
|
||||
received-follow-requests: "フォロー申請"
|
||||
accept: "承認"
|
||||
reject: "拒否"
|
||||
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
@@ -920,12 +1020,6 @@ desktop/views/input-dialog.vue:
|
||||
cancel: "キャンセル"
|
||||
ok: "決定"
|
||||
|
||||
desktop/views/components/messaging-room-window.vue:
|
||||
title: "メッセージ:"
|
||||
|
||||
desktop/views/components/messaging-window.vue:
|
||||
title: "メッセージ"
|
||||
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@@ -951,35 +1045,12 @@ desktop/views/components/notifications.vue:
|
||||
empty: "ありません!"
|
||||
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+ユーザーを追加"
|
||||
attach-location-information: "位置情報を添付する"
|
||||
hide-contents: "内容を隠す"
|
||||
reply-placeholder: "この投稿への返信..."
|
||||
quote-placeholder: "この投稿を引用..."
|
||||
submit: "投稿"
|
||||
reply: "返信"
|
||||
renote: "Renote"
|
||||
posted: "投稿しました!"
|
||||
replied: "返信しました!"
|
||||
reposted: "Renoteしました!"
|
||||
note-failed: "投稿に失敗しました"
|
||||
reply-failed: "返信に失敗しました"
|
||||
renote-failed: "Renoteに失敗しました"
|
||||
posting: "投稿中"
|
||||
attach-media-from-local: "PCからメディアを添付"
|
||||
attach-media-from-drive: "ドライブからメディアを添付"
|
||||
attach-cancel: "添付取り消し"
|
||||
insert-a-kao: "v('ω')v"
|
||||
create-poll: "アンケートを作成"
|
||||
text-remain: "残り{}文字"
|
||||
recent-tags: "最近"
|
||||
local-only-message: "この投稿はローカルにのみ公開されます"
|
||||
click-to-tagging: "クリックでタグ付け"
|
||||
visibility: "公開範囲"
|
||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||
error: "エラー"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
annotations: "内容への注釈 (オプション)"
|
||||
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "新規投稿"
|
||||
@@ -1074,6 +1145,11 @@ common/views/components/password-settings.vue:
|
||||
changed: "パスワードを変更しました"
|
||||
failed: "パスワード変更に失敗しました"
|
||||
|
||||
common/views/components/post-form-attaches.vue:
|
||||
attach-cancel: "添付取り消し"
|
||||
mark-as-sensitive: "閲覧注意に設定"
|
||||
unmark-as-sensitive: "閲覧注意を解除"
|
||||
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@@ -1086,16 +1162,13 @@ desktop/views/components/settings.tags.vue:
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "ホーム"
|
||||
local: "ローカル"
|
||||
hybrid: "ソーシャル"
|
||||
global: "グローバル"
|
||||
mentions: "あなた宛て"
|
||||
messages: "メッセージ"
|
||||
messages: "ダイレクト投稿"
|
||||
list: "リスト"
|
||||
hashtag: "ハッシュタグ"
|
||||
add-tag-timeline: "ハッシュタグを追加"
|
||||
@@ -1109,6 +1182,7 @@ desktop/views/components/ui.header.vue:
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "プロフィール"
|
||||
lists: "リスト"
|
||||
groups: "グループ"
|
||||
follow-requests: "フォロー申請"
|
||||
admin: "管理"
|
||||
|
||||
@@ -1124,16 +1198,6 @@ desktop/views/components/ui.header.post.vue:
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "検索"
|
||||
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
title: "フォロー申請"
|
||||
accept: "承認"
|
||||
reject: "拒否"
|
||||
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@@ -1159,12 +1223,15 @@ admin/views/index.vue:
|
||||
users: "ユーザー"
|
||||
federation: "連合"
|
||||
announcements: "お知らせ"
|
||||
hashtags: "ハッシュタグ"
|
||||
abuse: "スパム報告"
|
||||
queue: "ジョブキュー"
|
||||
logs: "ログ"
|
||||
db: "データベース"
|
||||
back-to-misskey: "Misskeyに戻る"
|
||||
|
||||
admin/views/db.vue:
|
||||
tables: "テーブル"
|
||||
|
||||
admin/views/dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
accounts: "アカウント"
|
||||
@@ -1175,8 +1242,35 @@ admin/views/dashboard.vue:
|
||||
federated: "連合"
|
||||
|
||||
admin/views/queue.vue:
|
||||
operation: "操作"
|
||||
title: "キュー"
|
||||
remove-all-jobs: "すべてのジョブをクリア"
|
||||
jobs: "ジョブ"
|
||||
queue: "キュー"
|
||||
domains:
|
||||
deliver: "配送"
|
||||
inbox: "受信"
|
||||
db: "データベース"
|
||||
objectStorage: "オブジェクトストレージ"
|
||||
state: "状態"
|
||||
states:
|
||||
active: "処理中"
|
||||
delayed: "予約済み"
|
||||
waiting: "順番待ち"
|
||||
result-is-truncated: "結果は省略されています"
|
||||
other-queues: "その他のキュー"
|
||||
|
||||
admin/views/logs.vue:
|
||||
logs: "ログ"
|
||||
domain: "ドメイン"
|
||||
level: "レベル"
|
||||
levels:
|
||||
all: "全て"
|
||||
info: "情報"
|
||||
success: "成功"
|
||||
warning: "警告"
|
||||
error: "エラー"
|
||||
debug: "デバッグ"
|
||||
delete-all: "全て削除"
|
||||
|
||||
admin/views/abuse.vue:
|
||||
title: "スパム報告"
|
||||
@@ -1190,14 +1284,34 @@ admin/views/instance.vue:
|
||||
instance-name: "インスタンス名"
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
icon-url: "アイコンURL"
|
||||
logo-url: "ロゴURL"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
tos-url: "利用規約URL"
|
||||
repository-url: "リポジトリURL"
|
||||
feedback-url: "フィードバックURL"
|
||||
maintainer-config: "管理者情報"
|
||||
maintainer-name: "管理者名"
|
||||
maintainer-email: "管理者の連絡先"
|
||||
advanced-config: "その他の設定"
|
||||
note-and-tl: "投稿とタイムライン"
|
||||
drive-config: "ドライブの設定"
|
||||
use-object-storage: "オブジェクトストレージを使用する"
|
||||
object-storage-base-url: "URL"
|
||||
object-storage-bucket: "バケット名"
|
||||
object-storage-prefix: "プレフィックス"
|
||||
object-storage-endpoint: "エンドポイント"
|
||||
object-storage-region: "リージョン"
|
||||
object-storage-port: "ポート"
|
||||
object-storage-access-key: "アクセスキー"
|
||||
object-storage-secret-key: "シークレットキー"
|
||||
object-storage-use-ssl: "SSLを使用"
|
||||
object-storage-s3-info: "Amazon S3をオブジェクトストレージとして使用する場合の「エンドポイント」と「リージョン」の設定については{0}をご確認ください。"
|
||||
object-storage-s3-info-here: "こちら"
|
||||
object-storage-gcs-info: "Google Cloud Storageをオブジェクトストレージとして使用する場合、「エンドポイント」は storage.googleapis.com に設定し、「リージョン」は空欄にします。"
|
||||
cache-remote-files: "リモートのファイルをキャッシュする"
|
||||
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
|
||||
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
||||
@@ -1205,9 +1319,14 @@ admin/views/instance.vue:
|
||||
mb: "メガバイト単位"
|
||||
recaptcha-config: "reCAPTCHAの設定"
|
||||
recaptcha-info: "reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。"
|
||||
recaptcha-info2: "v3は非対応です。v2を使用してください。"
|
||||
enable-recaptcha: "reCAPTCHAを有効にする"
|
||||
recaptcha-site-key: "reCAPTCHA site key"
|
||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||
recaptcha-site-key: "サイトキー"
|
||||
recaptcha-secret-key: "シークレットキー"
|
||||
recaptcha-preview: "プレビュー"
|
||||
hidden-tags: "非表示ハッシュタグ"
|
||||
hidden-tags-info: "集計から除外するハッシュタグを改行で区切って記述します。"
|
||||
external-service-integration-config: "外部サービス連携"
|
||||
twitter-integration-config: "Twitter連携の設定"
|
||||
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||
enable-twitter-integration: "Twitter連携を有効にする"
|
||||
@@ -1233,15 +1352,13 @@ admin/views/instance.vue:
|
||||
disable-local-timeline: "ローカルタイムラインを無効にする"
|
||||
disable-global-timeline: "グローバルタイムラインを無効にする"
|
||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
||||
enable-emoji-reaction: "リアクションに絵文字を使えるようにする"
|
||||
use-star-for-reaction-fallback: "不明なリアクションのフォールバックに star を使う"
|
||||
invite: "招待"
|
||||
save: "保存"
|
||||
saved: "保存しました"
|
||||
user-recommendation-config: "おすすめユーザー"
|
||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||
external-user-recommendation-engine: "エンジン"
|
||||
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||
external-user-recommendation-timeout: "タイムアウト"
|
||||
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||
pinned-users: "ピン留めユーザー"
|
||||
pinned-users-info: "ピン留めしたいユーザーを改行で区切って記述します。"
|
||||
email-config: "メールサーバーの設定"
|
||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||
enable-email: "メール配信を有効にする"
|
||||
@@ -1309,6 +1426,9 @@ admin/views/drive.vue:
|
||||
unmark-as-sensitive: "閲覧注意を解除"
|
||||
marked-as-sensitive: "閲覧注意に設定しました"
|
||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
||||
clean-remote-files: "リモートファイルのキャッシュを削除"
|
||||
clean-remote-files-are-you-sure: "すべてのリモートファイルのキャッシュを削除してもよろしいですか?"
|
||||
clean-up: "クリーンアップ"
|
||||
|
||||
admin/views/users.vue:
|
||||
operation: "操作"
|
||||
@@ -1325,15 +1445,13 @@ admin/views/users.vue:
|
||||
unsuspend-confirm: "凍結を解除しますか?"
|
||||
unsuspended: "凍結を解除しました"
|
||||
make-silence: "サイレンス"
|
||||
silence-confirm: "サイレンスしますか?"
|
||||
unmake-silence: "サイレンスの解除"
|
||||
verify: "公式アカウントにする"
|
||||
verify-confirm: "公式アカウントにしますか?"
|
||||
verified: "公式アカウントにしました"
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverify-confirm: "公式アカウントを解除しますか?"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
unsilence-confirm: "サイレンスを解除しますか?"
|
||||
update-remote-user: "リモートユーザー情報の更新"
|
||||
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||
delete-all-files: "すべてのファイルを削除"
|
||||
delete-all-files-confirm: "すべてのファイルを削除しますか?"
|
||||
users:
|
||||
title: "ユーザー"
|
||||
sort:
|
||||
@@ -1348,7 +1466,6 @@ admin/views/users.vue:
|
||||
admin: "管理者"
|
||||
moderator: "モデレーター"
|
||||
adminOrModerator: "管理者+モデレーター"
|
||||
verified: "公式アカウント"
|
||||
silenced: "サイレンス済み"
|
||||
suspended: "凍結済み"
|
||||
origin:
|
||||
@@ -1403,21 +1520,23 @@ admin/views/hashtags.vue:
|
||||
hided-tags: "Hidden Tags"
|
||||
|
||||
admin/views/federation.vue:
|
||||
federation: "連合"
|
||||
instance: "インスタンス"
|
||||
host: "ホスト"
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
caught-at: "登録日時"
|
||||
status: "ステータス"
|
||||
latest-request-sent-at: "直近のリクエスト送信"
|
||||
latest-request-received-at: "直近のリクエスト受信"
|
||||
remove-all-following: "フォローを全解除"
|
||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||
delete-all-files: "ファイルをすべて削除"
|
||||
block: "ブロック"
|
||||
marked-as-closed: "閉鎖されているとマーク"
|
||||
lookup: "照会"
|
||||
instances: "インスタンス"
|
||||
instances: "連合"
|
||||
instance-not-registered: "そのインスタンスは登録されていません"
|
||||
sort: "ソート"
|
||||
sorts:
|
||||
@@ -1460,6 +1579,9 @@ admin/views/federation.vue:
|
||||
chart-spans:
|
||||
hour: "1時間ごと"
|
||||
day: "1日ごと"
|
||||
blocked-hosts: "ブロック"
|
||||
blocked-hosts-info: "ブロックしたいホストを改行で区切って記述します。"
|
||||
save: "保存"
|
||||
|
||||
desktop/views/pages/welcome.vue:
|
||||
about: "詳しく..."
|
||||
@@ -1486,9 +1608,6 @@ desktop/views/pages/search.vue:
|
||||
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||
not-found: "「{q}」に関する投稿は見つかりませんでした。"
|
||||
|
||||
desktop/views/pages/share.vue:
|
||||
share-with: "{name}で共有"
|
||||
|
||||
desktop/views/pages/tag.vue:
|
||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
||||
|
||||
@@ -1530,9 +1649,6 @@ desktop/views/pages/user/user.timeline.vue:
|
||||
with-media: "メディア"
|
||||
my-posts: "私の投稿"
|
||||
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "通知"
|
||||
|
||||
@@ -1544,6 +1660,7 @@ desktop/views/widgets/polls.vue:
|
||||
desktop/views/widgets/post-form.vue:
|
||||
title: "投稿"
|
||||
note: "投稿"
|
||||
something-happened: "何らかの事情で投稿できませんでした。"
|
||||
|
||||
desktop/views/widgets/profile.vue:
|
||||
update-banner: "クリックでバナー編集"
|
||||
@@ -1566,12 +1683,11 @@ mobile/views/components/drive.vue:
|
||||
file-count: "ファイル"
|
||||
nothing-in-drive: "ドライブには何もありません"
|
||||
folder-is-empty: "このフォルダは空です"
|
||||
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
|
||||
deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。"
|
||||
folder-name: "フォルダー名"
|
||||
here-is-root: "現在いる場所はルートで、フォルダではありません。"
|
||||
url-prompt: "アップロードしたいファイルのURL"
|
||||
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
||||
folder-name-cannot-empty: "フォルダ名を空白にすることはできません。"
|
||||
|
||||
mobile/views/components/drive-file-chooser.vue:
|
||||
select-file: "ファイルを選択"
|
||||
@@ -1628,18 +1744,6 @@ mobile/views/components/note-sub.vue:
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "ありません!"
|
||||
|
||||
mobile/views/components/post-form.vue:
|
||||
add-visible-user: "ユーザーを追加"
|
||||
submit: "投稿"
|
||||
reply: "返信"
|
||||
renote: "Renote"
|
||||
quote-placeholder: "この投稿を引用... (オプション)"
|
||||
reply-placeholder: "この投稿への返信..."
|
||||
cw-placeholder: "内容への注釈 (オプション)"
|
||||
location-alert: "お使いの端末は位置情報に対応していません"
|
||||
error: "エラー"
|
||||
username-prompt: "ユーザー名を入力してください"
|
||||
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
@@ -1656,14 +1760,20 @@ mobile/views/components/ui.nav.vue:
|
||||
follow-requests: "フォロー申請"
|
||||
search: "検索"
|
||||
user-lists: "リスト"
|
||||
user-groups: "グループ"
|
||||
widgets: "ウィジェット"
|
||||
game: "ゲーム"
|
||||
admin: "管理"
|
||||
about: "Misskeyについて"
|
||||
|
||||
mobile/views/pages/user-lists.vue:
|
||||
title: "リスト"
|
||||
enter-list-name: "リスト名を入力してください"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "ファイルをアップロード"
|
||||
url-upload: "ファイルをURLでアップロード"
|
||||
create-folder: "フォルダーを作成"
|
||||
rename-folder: "フォルダー名を変更"
|
||||
move-folder: "このフォルダを移動"
|
||||
delete-folder: "このフォルダを削除"
|
||||
|
||||
mobile/views/pages/signup.vue:
|
||||
lets-start: "📦 始めましょう"
|
||||
@@ -1680,7 +1790,7 @@ mobile/views/pages/home.vue:
|
||||
hybrid: "ソーシャル"
|
||||
global: "グローバル"
|
||||
mentions: "あなた宛て"
|
||||
messages: "メッセージ"
|
||||
messages: "ダイレクト投稿"
|
||||
|
||||
mobile/views/pages/tag.vue:
|
||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
||||
@@ -1697,11 +1807,6 @@ mobile/views/pages/widgets/activity.vue:
|
||||
mobile/views/pages/share.vue:
|
||||
share-with: "{name}で共有"
|
||||
|
||||
mobile/views/pages/received-follow-requests.vue:
|
||||
title: "フォロー申請"
|
||||
accept: "承認"
|
||||
reject: "拒否"
|
||||
|
||||
mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前の投稿"
|
||||
@@ -1786,26 +1891,6 @@ docs:
|
||||
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
||||
edit-this-page-on-github-link: "このページをGitHubで編集"
|
||||
|
||||
api:
|
||||
entities:
|
||||
properties: "プロパティ"
|
||||
endpoints:
|
||||
params: "パラメータ"
|
||||
no-params: "パラメータはありません"
|
||||
res: "レスポンス"
|
||||
require-credential: "このエンドポイントは認証情報が必須です。"
|
||||
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
||||
has-limit: "レートリミットがあります。"
|
||||
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
||||
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
||||
show-src: "このエンドポイントのソースコードも閲覧できます。"
|
||||
show-src-link: "コードをGitHubで見る"
|
||||
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
|
||||
props:
|
||||
name: "名前"
|
||||
type: "型"
|
||||
description: "説明"
|
||||
|
||||
dev/views/index.vue:
|
||||
manage-apps: "アプリの管理"
|
||||
|
||||
@@ -1815,24 +1900,283 @@ dev/views/apps.vue:
|
||||
app-missing: "アプリなし"
|
||||
|
||||
dev/views/new-app.vue:
|
||||
new-app: "新しいアプリケーション"
|
||||
new-app-info: "アプリケーションはAPIからでも作成できます。 (app/create)"
|
||||
create-app: "アプリケーションの作成"
|
||||
app-name: "アプリケーション名"
|
||||
app-name-placeholder: "ex) Misskey for iOS"
|
||||
app-name-desc: "あなたのアプリの名称。"
|
||||
app-name-ex: "ex) Misskey for iOS"
|
||||
app-overview: "アプリの概要"
|
||||
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||
app-overview-placeholder: " ex) Misskey iOSクライアント。"
|
||||
app-overview-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||
callback-url: "コールバックURL (オプション)"
|
||||
callback-url-placeholder: "ex) https://your.app.example.com/callback.php"
|
||||
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||
authority: "権限"
|
||||
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||
account-read: "アカウントの情報を見る。"
|
||||
account-write: "アカウントの情報を操作する。"
|
||||
note-write: "投稿する。"
|
||||
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||
following-write: "フォローしたりフォロー解除する。"
|
||||
drive-read: "ドライブを見る。"
|
||||
drive-write: "ドライブを操作する。"
|
||||
notification-read: "通知を見る。"
|
||||
notification-write: "通知を操作する。"
|
||||
|
||||
pages:
|
||||
new-page: "ページの作成"
|
||||
edit-page: "ページの編集"
|
||||
read-page: "ソースを表示中"
|
||||
page-created: "ページを作成しました"
|
||||
page-updated: "ページを更新しました"
|
||||
are-you-sure-delete: "このページを削除しますか?"
|
||||
page-deleted: "ページを削除しました"
|
||||
edit-this-page: "このページを編集"
|
||||
view-source: "ソースを表示"
|
||||
view-page: "ページを見る"
|
||||
like: "いいね"
|
||||
unlike: "いいね解除"
|
||||
liked-pages: "いいねしたページ"
|
||||
my-pages: "自分のページ"
|
||||
inspector: "インスペクター"
|
||||
content: "ページブロック"
|
||||
variables: "変数"
|
||||
variables-info: "変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。"
|
||||
variables-info2: "変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。"
|
||||
variables-info3: "ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。"
|
||||
variables-info4: "関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、AiScript標準で関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。"
|
||||
more-details: "詳しい説明"
|
||||
title: "タイトル"
|
||||
url: "ページURL"
|
||||
summary: "ページの要約"
|
||||
align-center: "中央寄せ"
|
||||
font: "フォント"
|
||||
fontSerif: "セリフ"
|
||||
fontSansSerif: "サンセリフ"
|
||||
set-eye-catching-image: "アイキャッチ画像を設定"
|
||||
remove-eye-catching-image: "アイキャッチ画像を削除"
|
||||
choose-block: "ブロックを追加"
|
||||
select-type: "種類を選択"
|
||||
enter-variable-name: "変数名を決めてください"
|
||||
the-variable-name-is-already-used: "その変数名は既に使われています"
|
||||
content-blocks: "コンテンツ"
|
||||
input-blocks: "入力"
|
||||
special-blocks: "特殊"
|
||||
post-from-post-form: "この内容を投稿"
|
||||
posted-from-post-form: "投稿しました"
|
||||
blocks:
|
||||
text: "テキスト"
|
||||
textarea: "テキストエリア"
|
||||
section: "セクション"
|
||||
image: "画像"
|
||||
button: "ボタン"
|
||||
|
||||
if: "もし"
|
||||
_if:
|
||||
variable: "変数"
|
||||
|
||||
post: "投稿フォーム"
|
||||
_post:
|
||||
text: "内容"
|
||||
|
||||
textInput: "テキスト入力"
|
||||
_textInput:
|
||||
name: "変数名"
|
||||
text: "タイトル"
|
||||
default: "デフォルト値"
|
||||
|
||||
textareaInput: "複数行テキスト入力"
|
||||
_textareaInput:
|
||||
name: "変数名"
|
||||
text: "タイトル"
|
||||
default: "デフォルト値"
|
||||
|
||||
numberInput: "数値入力"
|
||||
_numberInput:
|
||||
name: "変数名"
|
||||
text: "タイトル"
|
||||
default: "デフォルト値"
|
||||
|
||||
switch: "スイッチ"
|
||||
_switch:
|
||||
name: "変数名"
|
||||
text: "タイトル"
|
||||
default: "デフォルト値"
|
||||
|
||||
counter: "カウンター"
|
||||
_counter:
|
||||
name: "変数名"
|
||||
text: "タイトル"
|
||||
inc: "増加値"
|
||||
|
||||
_button:
|
||||
text: "タイトル"
|
||||
action: "ボタンを押したときの動作"
|
||||
_action:
|
||||
dialog: "ダイアログを表示する"
|
||||
_dialog:
|
||||
content: "内容"
|
||||
resetRandom: "乱数をリセット"
|
||||
|
||||
script:
|
||||
categories:
|
||||
flow: "制御"
|
||||
logical: "論理演算"
|
||||
operation: "計算"
|
||||
comparison: "比較"
|
||||
random: "ランダム"
|
||||
value: "値"
|
||||
fn: "関数"
|
||||
text: "テキスト操作"
|
||||
convert: "変換"
|
||||
list: "リスト"
|
||||
blocks:
|
||||
text: "テキスト"
|
||||
multiLineText: "テキスト(複数行)"
|
||||
textList: "テキストのリスト"
|
||||
_textList:
|
||||
info: "ひとつひとつを改行で区切ってください"
|
||||
strLen: "テキストの長さ"
|
||||
_strLen:
|
||||
arg1: "テキスト"
|
||||
strPick: "文字取り出し"
|
||||
_strPick:
|
||||
arg1: "テキスト"
|
||||
arg2: "文字の位置"
|
||||
strReplace: "テキスト置き換え"
|
||||
_strReplace:
|
||||
arg1: "テキスト"
|
||||
arg2: "置き換え前"
|
||||
arg3: "置き換え後"
|
||||
strReverse: "テキストを反転"
|
||||
_strReverse:
|
||||
arg1: "テキスト"
|
||||
join: "テキストを連結"
|
||||
_join:
|
||||
arg1: "リスト"
|
||||
arg2: "区切り"
|
||||
add: "+ 足す"
|
||||
_add:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
subtract: "- 引く"
|
||||
_subtract:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
multiply: "× 掛ける"
|
||||
_multiply:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
divide: "÷ 割る"
|
||||
_divide:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
mod: "÷ 割った余り"
|
||||
_mod:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
eq: "AとBが同じ"
|
||||
_eq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
notEq: "AとBが異なる"
|
||||
_notEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
and: "AかつB"
|
||||
_and:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
or: "AまたはB"
|
||||
_or:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
lt: "< AがBより小さい"
|
||||
_lt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gt: "> AがBより大きい"
|
||||
_gt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
ltEq: "<= AがBと同じか小さい"
|
||||
_ltEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gtEq: ">= AがBと同じか大きい"
|
||||
_gtEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
if: "分岐"
|
||||
_if:
|
||||
arg1: "もし"
|
||||
arg2: "なら"
|
||||
arg3: "そうでなければ"
|
||||
not: "否定"
|
||||
_not:
|
||||
arg1: "否定"
|
||||
random: "ランダム"
|
||||
_random:
|
||||
arg1: "確率"
|
||||
rannum: "乱数"
|
||||
_rannum:
|
||||
arg1: "最小"
|
||||
arg2: "最大"
|
||||
randomPick: "リストからランダムに選択"
|
||||
_randomPick:
|
||||
arg1: "リスト"
|
||||
dailyRandom: "ランダム (ユーザーごとに日替わり)"
|
||||
_dailyRandom:
|
||||
arg1: "確率"
|
||||
dailyRannum: "乱数 (ユーザーごとに日替わり)"
|
||||
_dailyRannum:
|
||||
arg1: "最小"
|
||||
arg2: "最大"
|
||||
dailyRandomPick: "リストからランダムに選択 (ユーザーごとに日替わり)"
|
||||
_dailyRandomPick:
|
||||
arg1: "リスト"
|
||||
seedRandom: "ランダム (シード)"
|
||||
_seedRandom:
|
||||
arg1: "シード"
|
||||
arg2: "確率"
|
||||
seedRannum: "乱数 (シード)"
|
||||
_seedRannum:
|
||||
arg1: "シード"
|
||||
arg2: "最小"
|
||||
arg3: "最大"
|
||||
seedRandomPick: "リストからランダムに選択 (シード)"
|
||||
_seedRandomPick:
|
||||
arg1: "シード"
|
||||
arg2: "リスト"
|
||||
DRPWPM: "確率付きリストからランダムに選択 (ユーザーごとに日替わり)"
|
||||
_DRPWPM:
|
||||
arg1: "テキストのリスト"
|
||||
pick: "リストから選択"
|
||||
_pick:
|
||||
arg1: "リスト"
|
||||
arg2: "位置"
|
||||
number: "数値"
|
||||
stringToNumber: "テキストを数値に"
|
||||
_stringToNumber:
|
||||
arg1: "テキスト"
|
||||
numberToString: "数値をテキストに"
|
||||
_numberToString:
|
||||
arg1: "数値"
|
||||
splitStrByLine: "テキストを行で分割"
|
||||
_splitStrByLine:
|
||||
arg1: "テキスト"
|
||||
ref: "変数"
|
||||
fn: "関数"
|
||||
_fn:
|
||||
slots: "スロット"
|
||||
slots-info: "スロットひとつひとつを改行で区切ってください"
|
||||
arg1: "出力"
|
||||
for: "繰り返し"
|
||||
_for:
|
||||
arg1: "回数"
|
||||
arg2: "処理"
|
||||
typeError: "スロット{slot}は\"{expect}\"を受け付けますが、\"{actual}\"が入れられています!"
|
||||
thereIsEmptySlot: "スロット{slot}が空です!"
|
||||
types:
|
||||
string: "テキスト"
|
||||
number: "数値"
|
||||
boolean: "フラグ"
|
||||
array: "リスト"
|
||||
stringArray: "テキストのリスト"
|
||||
emptySlot: "空のスロット"
|
||||
enviromentVariables: "環境変数"
|
||||
pageVariables: "ページ要素"
|
||||
argVariables: "入力スロット"
|
||||
|
||||
@@ -60,6 +60,16 @@ common:
|
||||
following: "フォローしとる"
|
||||
followers: "フォロワー"
|
||||
favorites: "お気に入り"
|
||||
permissions:
|
||||
"write:votes": "投票するで"
|
||||
post-form:
|
||||
submit: "投稿"
|
||||
reply: "返す"
|
||||
renote: "Renote"
|
||||
error: "エラー"
|
||||
enter-username: "ユーザー名を入力してや"
|
||||
add-visible-user: "ユーザー増やす"
|
||||
username-prompt: "ユーザー名を入力してや"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@@ -119,7 +129,7 @@ common:
|
||||
update-available-title: "更新があんで"
|
||||
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
|
||||
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
|
||||
verified-user: "アメちゃん付きアカウント"
|
||||
enter-username: "ユーザー名を入力してや"
|
||||
do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "ちゃんとした情報見せてや!"
|
||||
@@ -166,15 +176,6 @@ common:
|
||||
auth/views/form.vue:
|
||||
share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
|
||||
permission-ask: "このアプリは次の権限を要求してんで:"
|
||||
account-read: "アカウントの情報を見させてもらうで。"
|
||||
account-write: "アカウントの情報を操作させてもらうで。"
|
||||
note-write: "投稿させてもらうで。"
|
||||
like-write: "いいねしたりいいね解除させてもらうで。"
|
||||
following-write: "フォローしたりフォロー解除させてもらうで。"
|
||||
drive-read: "ドライブを見させてもらうで。"
|
||||
drive-write: "ドライブを操作させてもらうで。"
|
||||
notification-read: "通知を見させてもらうで。"
|
||||
notification-write: "通知を操作させてもらうで。"
|
||||
cancel: "やめとくわ"
|
||||
accept: "アクセスを許可や!"
|
||||
auth/views/index.vue:
|
||||
@@ -188,7 +189,6 @@ auth/views/index.vue:
|
||||
error: "セッションが存在してへん。"
|
||||
sign-in: "サインインしてや"
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "アメちゃん付きアカウント"
|
||||
federated: "連合"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
@@ -303,18 +303,15 @@ common/views/components/messaging.vue:
|
||||
search-user: "ユーザーを探す"
|
||||
you: "あんさん"
|
||||
no-history: "履歴はあらへんで"
|
||||
user: "ユーザー"
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "このユーザーと話したことはあらへんで"
|
||||
no-history: "これより過去の履歴はあらへんで"
|
||||
resize-form: "ドラッグしてフォームの広さを調整"
|
||||
new-message: "新しいメッセージがあるで"
|
||||
only-one-file-attached: "メッセージに添付できんのはひとつのファイルのみやで"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "ここにメッセージ書いてや"
|
||||
send: "送信"
|
||||
attach-from-local: "PCからファイルを添付する"
|
||||
attach-from-drive: "ドライブからファイルを添付する"
|
||||
only-one-file-attached: "メッセージに添付できんのはひとつのファイルのみやで"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "既読"
|
||||
deleted: "このメッセージは削除されたわ"
|
||||
@@ -476,13 +473,23 @@ common/views/components/profile-editor.vue:
|
||||
email-verified: "このメールアドレスOKや!"
|
||||
email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
|
||||
export: "エクスポート"
|
||||
import: "インポート"
|
||||
export-targets:
|
||||
following-list: "フォロー"
|
||||
mute-list: "ミュート"
|
||||
blocking-list: "ブロック"
|
||||
user-lists: "リスト"
|
||||
enter-password: "パスワードを入れてや"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "ユーザー"
|
||||
add-user: "ユーザー増やす"
|
||||
common/views/components/user-group-editor.vue:
|
||||
invite: "招待"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "リスト"
|
||||
list-name: "リスト名"
|
||||
common/views/components/user-groups.vue:
|
||||
invites: "招待"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "見てみるわ…"
|
||||
no-broadcasts: "お知らせはあらへんで"
|
||||
@@ -541,6 +548,8 @@ common/views/pages/follow.vue:
|
||||
request-pending: "フォローの許し待っとる"
|
||||
follow-processing: "今フォロー処理やっとる‥"
|
||||
follow-request: "フォロー許してくれや!言うてみる"
|
||||
common/views/pages/follow-requests.vue:
|
||||
received-follow-requests: "フォロー許してくれや!言うてみる"
|
||||
desktop:
|
||||
banner-crop-title: "どこバナーとして出す?"
|
||||
banner: "バナー"
|
||||
@@ -650,10 +659,6 @@ desktop/views/components/home.vue:
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "やめとくわ"
|
||||
ok: "これや!"
|
||||
desktop/views/components/messaging-room-window.vue:
|
||||
title: "メッセージ:"
|
||||
desktop/views/components/messaging-window.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "この投稿は見せられへんわ"
|
||||
deleted: "この投稿なんか無くなってもうたわ"
|
||||
@@ -673,34 +678,12 @@ desktop/views/components/notes.vue:
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "あらへん!"
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+ユーザー増やす"
|
||||
attach-location-information: "いる場所くっつけるで"
|
||||
hide-contents: "内容を隠す"
|
||||
reply-placeholder: "この投稿への返信..."
|
||||
quote-placeholder: "この投稿を引用..."
|
||||
submit: "投稿"
|
||||
reply: "返信"
|
||||
renote: "Renote"
|
||||
posted: "投稿したで!"
|
||||
replied: "返信したで!"
|
||||
reposted: "Renoteしたで!"
|
||||
note-failed: "投稿に失敗したで"
|
||||
reply-failed: "返信に失敗したで"
|
||||
renote-failed: "Renoteでけへん"
|
||||
posting: "投稿中"
|
||||
attach-media-from-local: "PCからメディア持ってくる"
|
||||
attach-media-from-drive: "ドライブからメディア持ってくる"
|
||||
attach-cancel: "くっつけるのやめよか"
|
||||
create-poll: "アンケートを作成"
|
||||
text-remain: "残り{}文字"
|
||||
recent-tags: "最近のタグ"
|
||||
local-only-message: "この投稿はローカルだけ公開されるで"
|
||||
click-to-tagging: "クリックでタグ付け"
|
||||
visibility: "公開範囲"
|
||||
geolocation-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
|
||||
error: "エラー"
|
||||
enter-username: "ユーザー名を入力してや"
|
||||
annotations: "もっと教えてな(別にええけど)"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "新規投稿"
|
||||
reply: "返す"
|
||||
@@ -781,6 +764,9 @@ common/views/components/password-settings.vue:
|
||||
enter-new-password-again: "もっぺん入れてや"
|
||||
not-match: "パスワードがおうとらん"
|
||||
changed: "パスワード変えたわ"
|
||||
common/views/components/post-form-attaches.vue:
|
||||
mark-as-sensitive: "見たらあかん感じにしとく"
|
||||
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "この投稿は見せられへんわ"
|
||||
deleted: "この投稿なんか無くなってもうたわ"
|
||||
@@ -789,15 +775,12 @@ desktop/views/components/sub-note-content.vue:
|
||||
desktop/views/components/settings.tags.vue:
|
||||
add: "増やす"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "ホーム"
|
||||
local: "ローカル"
|
||||
hybrid: "ソーシャル"
|
||||
global: "グローバル"
|
||||
mentions: "あんた宛て"
|
||||
messages: "メッセージ"
|
||||
messages: "ダイレクト投稿"
|
||||
list: "リスト"
|
||||
hashtag: "ハッシュタグ"
|
||||
add-tag-timeline: "ハッシュタグ増やす"
|
||||
@@ -819,14 +802,6 @@ desktop/views/components/ui.header.post.vue:
|
||||
post: "新規投稿"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "検索"
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
title: "フォロー許してくれや!言うてみる"
|
||||
accept: "許す"
|
||||
reject: "許さん"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "新しいリストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@@ -848,7 +823,6 @@ admin/views/index.vue:
|
||||
users: "ユーザー"
|
||||
federation: "連合"
|
||||
announcements: "知っといてや"
|
||||
hashtags: "ハッシュタグ"
|
||||
back-to-misskey: "Misskeyに戻る"
|
||||
admin/views/dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
@@ -858,8 +832,10 @@ admin/views/dashboard.vue:
|
||||
instances: "インスタンス"
|
||||
this-instance: "ワイのインスタンス"
|
||||
federated: "連合"
|
||||
admin/views/queue.vue:
|
||||
operation: "操作"
|
||||
admin/views/logs.vue:
|
||||
levels:
|
||||
info: "情報"
|
||||
error: "エラー"
|
||||
admin/views/abuse.vue:
|
||||
details: "もっと"
|
||||
remove-report: "削除"
|
||||
@@ -875,6 +851,7 @@ admin/views/instance.vue:
|
||||
maintainer-name: "管理者名"
|
||||
maintainer-email: "管理者の連絡先"
|
||||
drive-config: "ドライブの設定"
|
||||
object-storage-endpoint: "エンドポイント"
|
||||
cache-remote-files: "リモートのファイルをキャッシュする"
|
||||
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをこっちで保管せずに直接リンク張るようになるで。サーバーのストレージは軽くやろうけど、プライバシー設定で直リンクを向こうにしとるユーザーはファイルが見れへんし、サムネイルが無いから通信量が増えたりするから、普通はオンにしといてな。"
|
||||
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
||||
@@ -883,8 +860,7 @@ admin/views/instance.vue:
|
||||
recaptcha-config: "reCAPTCHAの設定"
|
||||
recaptcha-info: "reCAPTCHAを有効にするにはreCAPTCHAトークンが要るで。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してな。"
|
||||
enable-recaptcha: "reCAPTCHAを有効にする"
|
||||
recaptcha-site-key: "reCAPTCHA site key"
|
||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||
recaptcha-preview: "試してみる"
|
||||
twitter-integration-config: "Twitter連携の設定"
|
||||
twitter-integration-info: "コールバックURLは {url} に設定してや。"
|
||||
enable-twitter-integration: "Twitter連携を有効にする"
|
||||
@@ -911,12 +887,6 @@ admin/views/instance.vue:
|
||||
invite: "来てや"
|
||||
save: "保存"
|
||||
saved: "保存したで!"
|
||||
user-recommendation-config: "このユーザーええで"
|
||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを使えるようにする"
|
||||
external-user-recommendation-engine: "エンジン"
|
||||
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||
external-user-recommendation-timeout: "タイムアウト"
|
||||
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||
email-config: "メールサーバーの設定"
|
||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
|
||||
enable-email: "メール配信を有効にする"
|
||||
@@ -973,7 +943,6 @@ admin/views/users.vue:
|
||||
state:
|
||||
all: "すべて"
|
||||
moderator: "モデレーター"
|
||||
verified: "アメちゃん付きアカウント"
|
||||
origin:
|
||||
local: "ローカル"
|
||||
admin/views/emoji.vue:
|
||||
@@ -988,7 +957,7 @@ admin/views/announcements.vue:
|
||||
add: "増やす"
|
||||
saved: "保存したで!"
|
||||
admin/views/federation.vue:
|
||||
federation: "連合"
|
||||
instance: "インスタンス"
|
||||
host: "ホスト"
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
@@ -997,7 +966,7 @@ admin/views/federation.vue:
|
||||
status: "ステータス"
|
||||
block: "ブロック"
|
||||
lookup: "照会"
|
||||
instances: "インスタンス"
|
||||
instances: "連合"
|
||||
states:
|
||||
all: "すべて"
|
||||
blocked: "ブロック"
|
||||
@@ -1012,6 +981,8 @@ admin/views/federation.vue:
|
||||
chart-spans:
|
||||
hour: "1時間ごと"
|
||||
day: "1日ごと"
|
||||
blocked-hosts: "ブロック"
|
||||
save: "保存"
|
||||
desktop/views/pages/welcome.vue:
|
||||
about: "もうちょい……"
|
||||
timeline: "タイムライン"
|
||||
@@ -1061,8 +1032,6 @@ desktop/views/pages/user/user.timeline.vue:
|
||||
default: "投稿"
|
||||
with-replies: "投稿と返信"
|
||||
with-media: "メディア"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "メッセージ"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "通知"
|
||||
desktop/views/widgets/polls.vue:
|
||||
@@ -1090,8 +1059,6 @@ mobile/views/components/drive.vue:
|
||||
file-count: "ファイル"
|
||||
nothing-in-drive: "ドライブには何もあらへんで。"
|
||||
folder-is-empty: "このフォルダ何もないわ"
|
||||
prompt: "何すんの?(数字を入れてや): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
|
||||
deletion-alert: "フォルダの削除は未実装やねん...。堪忍な!"
|
||||
folder-name: "フォルダー名"
|
||||
url-prompt: "このURLのファイルをアップロードしたいねん"
|
||||
uploading: "アップロードをリクエストしたで。アップロードが完了するまで時間がかかるかも分からん、知らんけど。"
|
||||
@@ -1139,17 +1106,6 @@ mobile/views/components/note-sub.vue:
|
||||
cat: "cat"
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "あらへん!"
|
||||
mobile/views/components/post-form.vue:
|
||||
add-visible-user: "ユーザー増やす"
|
||||
submit: "投稿"
|
||||
reply: "返す"
|
||||
renote: "Renote"
|
||||
quote-placeholder: "この投稿を持ってくる(オプション)"
|
||||
reply-placeholder: "この投稿への返信..."
|
||||
cw-placeholder: "内容への注釈 (オプション)"
|
||||
location-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
|
||||
error: "エラー"
|
||||
username-prompt: "ユーザー名を入力してや"
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "この投稿は見せられへんわ"
|
||||
deleted: "この投稿なんか無くなってもうたわ"
|
||||
@@ -1168,9 +1124,10 @@ mobile/views/components/ui.nav.vue:
|
||||
game: "ゲーム"
|
||||
admin: "管理"
|
||||
about: "Misskeyってなんや?"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
title: "リスト"
|
||||
enter-list-name: "リスト名を入力してや"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "ファイル上げる"
|
||||
create-folder: "フォルダー作る"
|
||||
mobile/views/pages/signup.vue:
|
||||
lets-start: "📦 始めようや"
|
||||
mobile/views/pages/followers.vue:
|
||||
@@ -1180,10 +1137,9 @@ mobile/views/pages/following.vue:
|
||||
mobile/views/pages/home.vue:
|
||||
home: "ホーム"
|
||||
local: "ローカル"
|
||||
hybrid: "ソーシャル"
|
||||
global: "グローバル"
|
||||
mentions: "あんた宛て"
|
||||
messages: "メッセージ"
|
||||
messages: "ダイレクト投稿"
|
||||
mobile/views/pages/tag.vue:
|
||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。"
|
||||
mobile/views/pages/widgets.vue:
|
||||
@@ -1194,10 +1150,6 @@ mobile/views/pages/widgets/activity.vue:
|
||||
activity: "やっとること"
|
||||
mobile/views/pages/share.vue:
|
||||
share-with: "{name}で共有"
|
||||
mobile/views/pages/received-follow-requests.vue:
|
||||
title: "フォロー許してくれや!"
|
||||
accept: "許す"
|
||||
reject: "許さん"
|
||||
mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前のやつ"
|
||||
@@ -1235,7 +1187,6 @@ deck:
|
||||
widgets: "ウィジェット"
|
||||
home: "ホーム"
|
||||
local: "ローカル"
|
||||
hybrid: "ソーシャル"
|
||||
hashtag: "ハッシュタグ"
|
||||
global: "グローバル"
|
||||
mentions: "あんた宛て"
|
||||
@@ -1266,25 +1217,6 @@ deck/deck.user-column.vue:
|
||||
docs:
|
||||
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
||||
edit-this-page-on-github-link: "このページをGitHubで編集"
|
||||
api:
|
||||
entities:
|
||||
properties: "プロパティ"
|
||||
endpoints:
|
||||
params: "パラメータ"
|
||||
no-params: "パラメータはありません"
|
||||
res: "レスポンス"
|
||||
require-credential: "このエンドポイントは認証情報が必須です。"
|
||||
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
||||
has-limit: "レートリミットがあります。"
|
||||
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
||||
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
||||
show-src: "このエンドポイントのソースコードも閲覧できます。"
|
||||
show-src-link: "コードをGitHubで見る"
|
||||
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
|
||||
props:
|
||||
name: "名前"
|
||||
type: "型"
|
||||
description: "説明"
|
||||
dev/views/index.vue:
|
||||
manage-apps: "アプリの管理"
|
||||
dev/views/apps.vue:
|
||||
@@ -1295,21 +1227,32 @@ dev/views/new-app.vue:
|
||||
create-app: "アプリケーション作る"
|
||||
app-name: "アプリケーションの名前"
|
||||
app-name-desc: "あんたのアプリの名前。"
|
||||
app-name-ex: "ex) 関西ミスキー保安協会"
|
||||
app-overview: "このアプリどんなん?"
|
||||
app-desc: "あんたのアプリどんなんか教えて"
|
||||
app-desc-ex: "ex) 関西人なら誰でも口ずさめるこのCMがついにMisskeyへ。"
|
||||
callback-url: "コールバックURL (無くてもええで)"
|
||||
callback-url-desc: "ユーザーが認証フォームで認証した後どこに連れてくかを設定できるで"
|
||||
authority: "権限"
|
||||
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
||||
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
||||
account-read: "アカウントの情報見せて"
|
||||
account-write: "アカウントの情報いじらせて"
|
||||
note-write: "投稿させて"
|
||||
reaction-write: "リアクションしたりそれをキャンセルさせて"
|
||||
following-write: "フォローとかフォロー解除させて"
|
||||
drive-read: "ドライブ見せて"
|
||||
drive-write: "ドライブいじらせて"
|
||||
notification-read: "通知見せて"
|
||||
notification-write: "通知いじらせて"
|
||||
pages:
|
||||
like: "ええやん"
|
||||
blocks:
|
||||
image: "画像"
|
||||
post: "投稿フォーム"
|
||||
script:
|
||||
categories:
|
||||
random: "いんじゃんほい"
|
||||
list: "リスト"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "リスト"
|
||||
random: "いんじゃんほい"
|
||||
_randomPick:
|
||||
arg1: "リスト"
|
||||
_dailyRandomPick:
|
||||
arg1: "リスト"
|
||||
_seedRandomPick:
|
||||
arg2: "リスト"
|
||||
_pick:
|
||||
arg1: "リスト"
|
||||
types:
|
||||
array: "リスト"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -23,6 +23,12 @@ common:
|
||||
timeline: "Tijdlijn"
|
||||
followers: "Volgers"
|
||||
favorites: "Deze notitie toevoegen aan favorieten"
|
||||
permissions:
|
||||
"write:votes": "Stemmen"
|
||||
post-form:
|
||||
submit: "Bericht"
|
||||
reply: "Beantwoorden"
|
||||
add-visible-user: "Gebruiker toevoegen"
|
||||
weekday-short:
|
||||
sunday: "Z"
|
||||
monday: "M"
|
||||
@@ -102,10 +108,9 @@ common/views/components/messaging.vue:
|
||||
search-user: "Gebruiker zoeken"
|
||||
you: "Jij"
|
||||
no-history: "Geen geschiedenis"
|
||||
user: "Gebruiker"
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "Geen gesprekken"
|
||||
no-history: "Er is geen verdere geschiedenis"
|
||||
resize-form: "Versleep om grootte te wijzigen"
|
||||
new-message: "Nieuw bericht"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "Voer hier je bericht in"
|
||||
@@ -196,9 +201,13 @@ common/views/components/profile-editor.vue:
|
||||
banner: "Omslagfoto"
|
||||
export-targets:
|
||||
following-list: "Volgend"
|
||||
user-lists: "Lijsten"
|
||||
enter-password: "Voer het wachtwoord in"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Gebruiker"
|
||||
add-user: "Gebruiker toevoegen"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Lijsten"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Bezig met ophalen"
|
||||
no-broadcasts: "Geen uitzendingen"
|
||||
@@ -306,10 +315,6 @@ desktop/views/components/home.vue:
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Annuleren"
|
||||
ok: "Oké"
|
||||
desktop/views/components/messaging-room-window.vue:
|
||||
title: "Berichten:"
|
||||
desktop/views/components/messaging-window.vue:
|
||||
title: "Gesprekken"
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "(dit bericht is privé)"
|
||||
location: "Locatie"
|
||||
@@ -324,22 +329,12 @@ desktop/views/components/notes.vue:
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "Geen meldingen"
|
||||
desktop/views/components/post-form.vue:
|
||||
reply-placeholder: "Deze notitie beantwoorden..."
|
||||
quote-placeholder: "Deze notitie citeren..."
|
||||
submit: "Bericht"
|
||||
reply: "Beantwoorden"
|
||||
posted: "Geplaatst!"
|
||||
replied: "Beantwoord!"
|
||||
reposted: "Hergeplaatst!"
|
||||
note-failed: "Noteren mislukt"
|
||||
reply-failed: "Beantwoorden mislukt"
|
||||
renote-failed: "Renote mislukt"
|
||||
posting: "Bezig met plaatsen"
|
||||
attach-media-from-local: "Media bijvoegen van je computer"
|
||||
attach-media-from-drive: "Media bijvoegen uit je Drive"
|
||||
attach-cancel: "Bijlage annuleren"
|
||||
create-poll: "Peiling creëren"
|
||||
text-remain: "{} resterende tekens"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nieuwe notitie"
|
||||
reply: "Beantwoorden"
|
||||
@@ -387,13 +382,10 @@ desktop/views/components/sub-note-content.vue:
|
||||
poll: "Peilingen"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
add: "Toevoegen"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Taakbeheer"
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "Startpagina"
|
||||
local: "Lokaal"
|
||||
global: "Algemeen"
|
||||
messages: "Gesprekken"
|
||||
list: "Lijsten"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "Je profiel"
|
||||
@@ -406,9 +398,6 @@ desktop/views/components/ui.header.post.vue:
|
||||
post: "Nieuw bericht opstellen"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Zoeken"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Lijsten"
|
||||
create-list: "Lijst creëren"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Berichten"
|
||||
following: "Volgend"
|
||||
@@ -428,8 +417,6 @@ admin/views/dashboard.vue:
|
||||
notes: "Bericht"
|
||||
admin/views/abuse.vue:
|
||||
remove-report: "Verwijderen"
|
||||
admin/views/instance.vue:
|
||||
user-recommendation-config: "Aanbevolen gebruikers"
|
||||
admin/views/charts.vue:
|
||||
notes: "Bericht"
|
||||
users: "Gebruiker"
|
||||
@@ -496,8 +483,6 @@ desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Berichten"
|
||||
with-replies: "Berichten en antwoorden"
|
||||
with-media: "Media"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Gesprekken"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Meldingen"
|
||||
desktop/views/widgets/polls.vue:
|
||||
@@ -548,11 +533,6 @@ mobile/views/components/note-detail.vue:
|
||||
location: "Locatie"
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "Geen meldingen"
|
||||
mobile/views/components/post-form.vue:
|
||||
add-visible-user: "Gebruiker toevoegen"
|
||||
submit: "Plaatsen"
|
||||
reply: "Antwoord"
|
||||
reply-placeholder: "Deze notitie beantwoorden..."
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "(dit bericht is privé)"
|
||||
media-count: "{} media"
|
||||
@@ -564,13 +544,14 @@ mobile/views/components/ui.nav.vue:
|
||||
user-lists: "Lijsten"
|
||||
game: "Othello spelen"
|
||||
about: "Over Misskey"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
title: "Lijsten"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "Bestand uploaden"
|
||||
create-folder: "Map creëren"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Startpagina"
|
||||
local: "Lokaal"
|
||||
global: "Algemeen"
|
||||
messages: "Gesprekken"
|
||||
mobile/views/pages/widgets.vue:
|
||||
add-widget: "Toevoegen"
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
@@ -624,13 +605,23 @@ deck/deck.user-column.vue:
|
||||
docs:
|
||||
edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
|
||||
edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
|
||||
api:
|
||||
entities:
|
||||
properties: "Eigenschappen"
|
||||
endpoints:
|
||||
params: "Parameters"
|
||||
res: "Antwoord"
|
||||
props:
|
||||
name: "Naam"
|
||||
type: "Type"
|
||||
description: "Omschrijving"
|
||||
pages:
|
||||
like: "Leuk"
|
||||
blocks:
|
||||
image: "Afbeeldingen"
|
||||
script:
|
||||
categories:
|
||||
list: "Lijsten"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Lijsten"
|
||||
_randomPick:
|
||||
arg1: "Lijsten"
|
||||
_dailyRandomPick:
|
||||
arg1: "Lijsten"
|
||||
_seedRandomPick:
|
||||
arg2: "Lijsten"
|
||||
_pick:
|
||||
arg1: "Lijsten"
|
||||
types:
|
||||
array: "Lijsten"
|
||||
|
||||
@@ -37,6 +37,12 @@ common:
|
||||
home: "Hjem"
|
||||
followers: "Følgere"
|
||||
favorites: "Merket som favoritt"
|
||||
permissions:
|
||||
"write:votes": "Stem"
|
||||
post-form:
|
||||
submit: "Innlegg"
|
||||
reply: "Svar"
|
||||
error: "Feil"
|
||||
weekday-short:
|
||||
sunday: "S"
|
||||
monday: "M"
|
||||
@@ -128,6 +134,7 @@ common/views/components/cw-button.vue:
|
||||
hide: "Skjul"
|
||||
common/views/components/messaging.vue:
|
||||
you: "Du"
|
||||
user: "Bruker"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
send: "Send"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
@@ -187,8 +194,16 @@ common/views/components/profile-editor.vue:
|
||||
save: "Lagre"
|
||||
export-targets:
|
||||
following-list: "Følger"
|
||||
user-lists: "Lister"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Bruker"
|
||||
common/views/components/user-group-editor.vue:
|
||||
invite: "Inviter"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Lister"
|
||||
list-name: "Liste navn"
|
||||
common/views/components/user-groups.vue:
|
||||
invites: "Inviter"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Henter"
|
||||
next: "Neste"
|
||||
@@ -243,8 +258,6 @@ desktop/views/components/home.vue:
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Avbryt"
|
||||
ok: "Ok"
|
||||
desktop/views/components/messaging-window.vue:
|
||||
title: "Samtaler"
|
||||
desktop/views/components/note-detail.vue:
|
||||
location: "Lokasjon"
|
||||
desktop/views/components/note.vue:
|
||||
@@ -252,13 +265,6 @@ desktop/views/components/note.vue:
|
||||
detail: "Detaljer"
|
||||
desktop/views/components/notes.vue:
|
||||
retry: "Prøv på nytt"
|
||||
desktop/views/components/post-form.vue:
|
||||
submit: "Send"
|
||||
reply: "Svar"
|
||||
posting: "Publiserer"
|
||||
recent-tags: "Nylig"
|
||||
visibility: "Synlighet"
|
||||
error: "Feil"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nytt innlegg"
|
||||
reply: "Svar"
|
||||
@@ -289,7 +295,6 @@ desktop/views/components/timeline.vue:
|
||||
home: "Hjem"
|
||||
local: "Lokalt"
|
||||
global: "Globalt"
|
||||
messages: "Samtaler"
|
||||
list: "Lister"
|
||||
list-name: "Liste navn"
|
||||
desktop/views/components/ui.header.vue:
|
||||
@@ -305,12 +310,6 @@ desktop/views/components/ui.header.post.vue:
|
||||
post: "Skriv nytt innlegg"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Søk"
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
accept: "Godta"
|
||||
reject: "Avslå"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Brukerlister"
|
||||
list-name: "Liste navn"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Innlegg"
|
||||
following: "Følger"
|
||||
@@ -326,6 +325,10 @@ admin/views/index.vue:
|
||||
admin/views/dashboard.vue:
|
||||
notes: "Innlegg"
|
||||
drive: "Disk"
|
||||
admin/views/logs.vue:
|
||||
levels:
|
||||
info: "Informasjon"
|
||||
error: "Feil"
|
||||
admin/views/abuse.vue:
|
||||
details: "Detaljer"
|
||||
remove-report: "Slett"
|
||||
@@ -364,6 +367,7 @@ admin/views/federation.vue:
|
||||
status: "Status"
|
||||
states:
|
||||
all: "Alle"
|
||||
save: "Lagre"
|
||||
desktop/views/pages/welcome.vue:
|
||||
announcements: "Kunngjøringer"
|
||||
info: "Informasjon"
|
||||
@@ -393,8 +397,6 @@ desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Innlegg"
|
||||
with-replies: "Innlegg og svar"
|
||||
with-media: "Media"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Melding"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Notifikasjon"
|
||||
desktop/views/widgets/polls.vue:
|
||||
@@ -437,10 +439,6 @@ mobile/views/components/note-sub.vue:
|
||||
admin: "admin"
|
||||
bot: "bot"
|
||||
cat: "katt"
|
||||
mobile/views/components/post-form.vue:
|
||||
submit: "Send"
|
||||
reply: "Svar"
|
||||
error: "Feil"
|
||||
mobile/views/components/ui.header.vue:
|
||||
adjective: "Mr."
|
||||
mobile/views/components/ui.nav.vue:
|
||||
@@ -449,18 +447,12 @@ mobile/views/components/ui.nav.vue:
|
||||
user-lists: "Lister"
|
||||
game: "Spill"
|
||||
admin: "Admin"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
title: "Lister"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Hjem"
|
||||
local: "Lokalt"
|
||||
global: "Globalt"
|
||||
messages: "Samtaler"
|
||||
mobile/views/pages/widgets.vue:
|
||||
add-widget: "Legg til"
|
||||
mobile/views/pages/received-follow-requests.vue:
|
||||
accept: "Godta"
|
||||
reject: "Avslå"
|
||||
mobile/views/pages/note.vue:
|
||||
title: "Innlegg"
|
||||
prev: "Forrige innlegg"
|
||||
@@ -491,14 +483,25 @@ deck/deck.user-column.vue:
|
||||
following: "Følger"
|
||||
followers: "Følgere"
|
||||
images: "Bilder"
|
||||
docs:
|
||||
api:
|
||||
entities:
|
||||
properties: "Egenskaper"
|
||||
endpoints:
|
||||
params: "Parametere"
|
||||
res: "Respons"
|
||||
props:
|
||||
name: "Navn"
|
||||
type: "Type"
|
||||
description: "Beskrivelse"
|
||||
pages:
|
||||
like: "Lik"
|
||||
blocks:
|
||||
image: "Bilder"
|
||||
script:
|
||||
categories:
|
||||
random: "Tilfeldig"
|
||||
list: "Lister"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Lister"
|
||||
random: "Tilfeldig"
|
||||
_randomPick:
|
||||
arg1: "Lister"
|
||||
_dailyRandomPick:
|
||||
arg1: "Lister"
|
||||
_seedRandomPick:
|
||||
arg2: "Lister"
|
||||
_pick:
|
||||
arg1: "Lister"
|
||||
types:
|
||||
array: "Lister"
|
||||
|
||||
@@ -23,9 +23,11 @@ common:
|
||||
enter-password: "Wprowadź Hasło"
|
||||
2fa: "Uwierzytelnienie dwuetapowe"
|
||||
customize-home: "Dostosuj stronę główną"
|
||||
featured-notes: "Wyróżnienia"
|
||||
dark-mode: "Tryb ciemny"
|
||||
signin: "Zaloguj się"
|
||||
signup: "Rejestracja"
|
||||
signout: "Wyloguj się"
|
||||
got-it: "Rozumiem!"
|
||||
customization-tips:
|
||||
title: "Wskazówki o dostosowywaniu"
|
||||
@@ -52,6 +54,7 @@ common:
|
||||
month-and-day: "{month}-{day}"
|
||||
trash: "Kosz"
|
||||
drive: "Dysk"
|
||||
pages: "Strony"
|
||||
messaging: "Rozmowy"
|
||||
home: "Strona główna"
|
||||
deck: "Tablice"
|
||||
@@ -60,8 +63,29 @@ common:
|
||||
following: "Śledzisz"
|
||||
followers: "Śledzący"
|
||||
favorites: "Moje ulubione"
|
||||
permissions:
|
||||
"read:drive": "Wyświetl dysk"
|
||||
"write:votes": "Zagłosuj"
|
||||
empty-timeline-info:
|
||||
explore: "Poznaj"
|
||||
post-form:
|
||||
hide-contents: "Ukryj zawartość"
|
||||
reply-placeholder: "Odpowiedź na ten wpis…"
|
||||
quote-placeholder: "Zacytuj ten wpis…"
|
||||
submit: "Wpis"
|
||||
reply: "Odpowiedz"
|
||||
renote: "Udostępnij"
|
||||
posting: "Wysyłanie"
|
||||
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
||||
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
||||
create-poll: "Utwórz ankietę"
|
||||
text-remain: "pozostałe znaki: {}"
|
||||
recent-tags: "Ostatnie"
|
||||
visibility: "Widoczność"
|
||||
error: "Błąd"
|
||||
enter-username: "Wprowadź nazwę użytkownika"
|
||||
add-visible-user: "Dodaj użytkownika"
|
||||
username-prompt: "Wprowadź nazwę użytkownika"
|
||||
weekday-short:
|
||||
sunday: "N"
|
||||
monday: "Pn"
|
||||
@@ -120,7 +144,38 @@ common:
|
||||
other: "Inne"
|
||||
appearance: "Wygląd"
|
||||
behavior: "Zachowanie"
|
||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||
note-visibility: "Widoczność wpisów"
|
||||
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||
web-search-engine: "Wyszukiwarka internetowa"
|
||||
line-width: "Szerokości linii"
|
||||
line-width-thin: "Cienka"
|
||||
line-width-normal: "Normalna"
|
||||
line-width-thick: "Gruba"
|
||||
font-size: "Rozmiar tekstu"
|
||||
font-size-x-small: "Małe"
|
||||
font-size-medium: "Normalna"
|
||||
font-size-large: "Trochę duży"
|
||||
font-size-x-large: "Duży"
|
||||
deck-column-align-center: "Po środku"
|
||||
deck-column-align-left: "Z lewej"
|
||||
deck-column-align-flexible: "Elastyczne"
|
||||
deck-column-width: "Szerokość kolumn w talii"
|
||||
deck-column-width-narrow: "Wąska"
|
||||
deck-column-width-narrower: "Trochę wąska"
|
||||
deck-column-width-normal: "Normalna"
|
||||
deck-column-width-wider: "Trochę szerokie"
|
||||
deck-column-width-wide: "Szeroka"
|
||||
wallpaper: "Tapeta"
|
||||
choose-wallpaper: "Wybierz tapetę"
|
||||
timeline: "Oś czasu"
|
||||
sound: "Dźwięk"
|
||||
volume: "Głośność"
|
||||
test: "Test"
|
||||
update: "Aktualizacja Misskey"
|
||||
version: "Wersja:"
|
||||
do-update: "Sprawdź dostępność nowych aktualizacji"
|
||||
navbar-position-left: "Z lewej"
|
||||
search: "Szukaj"
|
||||
delete: "Usuń"
|
||||
loading: "Ładowanie"
|
||||
@@ -129,9 +184,9 @@ common:
|
||||
update-available-title: "Aktualizacja jest dostępna"
|
||||
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
|
||||
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
||||
verified-user: "Zweryfikowane konto"
|
||||
hide-password: "Ukryj hasło"
|
||||
show-password: "Pokaż hasło"
|
||||
enter-username: "Wprowadź nazwę użytkownika"
|
||||
view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
|
||||
renoted-by: "{user} udostępnił(a)"
|
||||
error:
|
||||
@@ -170,15 +225,6 @@ common:
|
||||
you: "Ty"
|
||||
auth/views/form.vue:
|
||||
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
||||
account-read: "Wyświetlanie informacji o koncie:"
|
||||
account-write: "Modyfikowanie informacji o koncie:"
|
||||
note-write: "Publikacja."
|
||||
like-write: "Reagowanie na wpisy."
|
||||
following-write: "Śledzenie i cofanie śledzenia."
|
||||
drive-read: "Odczytywanie Twojego dysku."
|
||||
drive-write: "Wysyłanie i usuwanie plików na Twoim dysku."
|
||||
notification-read: "Odczytywanie Twoich powiadomień."
|
||||
notification-write: "Zarządzanie Twoimi powiadomieniami."
|
||||
cancel: "Anuluj"
|
||||
accept: "Przyznaj dostęp."
|
||||
auth/views/index.vue:
|
||||
@@ -191,7 +237,8 @@ auth/views/index.vue:
|
||||
error: "Sesja nie istnieje."
|
||||
sign-in: "Proszę zalogować się."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "Zweryfikowane konto"
|
||||
popular-users: "Popularni użytkownicy"
|
||||
popular-tags: "Popularne tagi"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Oczekiwanie na {}"
|
||||
@@ -298,18 +345,15 @@ common/views/components/messaging.vue:
|
||||
search-user: "Znajdź użytkownika"
|
||||
you: "Ty"
|
||||
no-history: "Brak historii"
|
||||
user: "Użytkownicy"
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "Brak konwersacji"
|
||||
no-history: "Brak dalszej historii"
|
||||
resize-form: "Przeciągnij aby zmienić rozmiar"
|
||||
new-message: "Nowa wiadomość"
|
||||
only-one-file-attached: "Tylko JEDEN plik może zostać dołączony do wiadomości"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "Wprowadź wiadomość tutaj"
|
||||
send: "Wyślij"
|
||||
attach-from-local: "Załącz pliki z komputera"
|
||||
attach-from-drive: "Załącz pliki z dysku"
|
||||
only-one-file-attached: "Tylko jeden plik może zostać dołączony do wiadomości"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "Przeczytano"
|
||||
deleted: "Wiadomość została usunięta"
|
||||
@@ -472,10 +516,12 @@ common/views/components/profile-editor.vue:
|
||||
email-address: "Adres e-mail"
|
||||
email-verified: "Twój adres e-mail został zweryfikowany."
|
||||
export: "Eksportuj"
|
||||
import: "Importuj"
|
||||
export-targets:
|
||||
following-list: "Śledzeni"
|
||||
mute-list: "Wycisz"
|
||||
blocking-list: "Zablokuj"
|
||||
user-lists: "Listy"
|
||||
enter-password: "Wprowadź hasło"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Użytkownicy"
|
||||
@@ -484,6 +530,15 @@ common/views/components/user-list-editor.vue:
|
||||
remove-user: "Usuń z tej listy"
|
||||
delete-are-you-sure: "Usunąć listę \"$1\"?"
|
||||
deleted: "Usunięto"
|
||||
add-user: "Dodaj użytkownika"
|
||||
common/views/components/user-group-editor.vue:
|
||||
deleted: "Usunięto"
|
||||
invite: "Zaproś"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Listy"
|
||||
list-name: "Nazwa listy"
|
||||
common/views/components/user-groups.vue:
|
||||
invites: "Zaproś"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Sprawdzanie"
|
||||
no-broadcasts: "Brak transmisji"
|
||||
@@ -539,6 +594,8 @@ common/views/pages/follow.vue:
|
||||
request-pending: "Oczekiwanie na pozwolenie"
|
||||
follow-processing: "Przetwarzanie śledzenia"
|
||||
follow-request: "Poproś o śledzenie"
|
||||
common/views/pages/follow-requests.vue:
|
||||
received-follow-requests: "Prośby o śledzenie"
|
||||
desktop:
|
||||
banner: "Baner"
|
||||
uploading-banner: "Wysyłanie baneru"
|
||||
@@ -646,10 +703,6 @@ desktop/views/components/home.vue:
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Anuluj"
|
||||
ok: "OK"
|
||||
desktop/views/components/messaging-room-window.vue:
|
||||
title: "Wiadomości:"
|
||||
desktop/views/components/messaging-window.vue:
|
||||
title: "Wiadomości"
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "ten wpis jest prywatny"
|
||||
deleted: "ten wpis został usunięty"
|
||||
@@ -669,34 +722,12 @@ desktop/views/components/notes.vue:
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "Brak powiadomień"
|
||||
desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+Dodaj użytkownika"
|
||||
attach-location-information: "Załącz informacje o lokalizacji"
|
||||
hide-contents: "Ukryj zawartość"
|
||||
reply-placeholder: "Odpowiedz na ten wpis…"
|
||||
quote-placeholder: "Zacytuj ten wpis…"
|
||||
submit: "Wyślij"
|
||||
reply: "Odpowiedz"
|
||||
renote: "Udostępnienie"
|
||||
posted: "Opublikowano!"
|
||||
replied: "Odpowiedziano!"
|
||||
reposted: "Udostępniono!"
|
||||
note-failed: "Nie udało się wysłać"
|
||||
reply-failed: "Nie udało się odpowiedzieć"
|
||||
renote-failed: "Nie udało się udostępnić"
|
||||
posting: "Wysyłanie"
|
||||
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
||||
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
||||
attach-cancel: "Usuń załącznik"
|
||||
insert-a-kao: "v('ω')v"
|
||||
create-poll: "Utwórz ankietę"
|
||||
text-remain: "pozostałe znaki: {}"
|
||||
recent-tags: "Ostatnie"
|
||||
click-to-tagging: "Naciśnij aby oznaczyć"
|
||||
visibility: "Widoczność"
|
||||
geolocation-alert: "Twoje urządzenie nie obsługuje geolokalizacji."
|
||||
error: "Bład"
|
||||
enter-username: "Wprowadź nazwę użytkownika…"
|
||||
annotations: "Treść ostrzeżenia (opcjonalnie)"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nowy wpis"
|
||||
reply: "Odpowiedz"
|
||||
@@ -766,6 +797,9 @@ common/views/components/password-settings.vue:
|
||||
enter-current-password: "Wprowadź obecne hasło"
|
||||
enter-new-password: "Wprowadź nowe hasło"
|
||||
enter-new-password-again: "Wprowadź ponownie nowe hasło"
|
||||
common/views/components/post-form-attaches.vue:
|
||||
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
||||
unmark-as-sensitive: "Cofnij oznaczenie jako zawartość wrażliwą"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "ten wpis jest prywatny"
|
||||
deleted: "ten wpis został usunięty"
|
||||
@@ -776,15 +810,12 @@ desktop/views/components/settings.tags.vue:
|
||||
query: "Zapytanie (opcjonalne)"
|
||||
add: "Dodaj"
|
||||
save: "Zapisz"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Menedżer zadań"
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "Strona główna"
|
||||
local: "Lokalne"
|
||||
hybrid: "Społeczność"
|
||||
global: "Globalne"
|
||||
mentions: "Wspomnienia"
|
||||
messages: "Wiadomości"
|
||||
messages: "Bezpośrednie wpisy"
|
||||
list: "Listy"
|
||||
hashtag: "Hashtag"
|
||||
add-tag-timeline: "Dodaj hashtag"
|
||||
@@ -805,14 +836,6 @@ desktop/views/components/ui.header.post.vue:
|
||||
post: "Utwórz nowy wpis"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Szukaj"
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
title: "Prośby o śledzenie"
|
||||
accept: "Zatwierdź"
|
||||
reject: "Odmów"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Listy"
|
||||
create-list: "Utwórz listę"
|
||||
list-name: "Nazwa listy"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Wpisy"
|
||||
following: "Śledzeni"
|
||||
@@ -833,18 +856,22 @@ admin/views/index.vue:
|
||||
moderators: "Moderatorzy"
|
||||
users: "Użytkownicy"
|
||||
announcements: "Ogłoszenia"
|
||||
hashtags: "Hashtagi"
|
||||
admin/views/dashboard.vue:
|
||||
dashboard: "Kokpit"
|
||||
accounts: "Konta"
|
||||
notes: "Wpisy"
|
||||
drive: "Dysk"
|
||||
instances: "Instancja"
|
||||
admin/views/logs.vue:
|
||||
levels:
|
||||
info: "Informacje"
|
||||
error: "Błąd"
|
||||
admin/views/abuse.vue:
|
||||
details: "Szczegóły"
|
||||
remove-report: "Usuń"
|
||||
admin/views/instance.vue:
|
||||
instance: "Instancja"
|
||||
recaptcha-preview: "Pokaż podgląd"
|
||||
github-integration-client-id: "Client ID"
|
||||
github-integration-client-secret: "Client Secret"
|
||||
discord-integration-client-id: "Client ID"
|
||||
@@ -852,9 +879,6 @@ admin/views/instance.vue:
|
||||
invite: "Zaproś"
|
||||
save: "Zapisz"
|
||||
saved: "Zapisano"
|
||||
user-recommendation-config: "Polecani użytkownicy"
|
||||
external-user-recommendation-engine: "Silnik"
|
||||
external-user-recommendation-engine-desc: "Np: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||
email: "Adres e-mail"
|
||||
admin/views/charts.vue:
|
||||
notes: "Wpisy"
|
||||
@@ -884,7 +908,6 @@ admin/views/users.vue:
|
||||
state:
|
||||
all: "Wszyscy"
|
||||
moderator: "Moderatorzy"
|
||||
verified: "Zweryfikowane konto"
|
||||
origin:
|
||||
title: "Źródło"
|
||||
local: "Lokalny"
|
||||
@@ -916,19 +939,22 @@ admin/views/announcements.vue:
|
||||
are-you-sure: "Usunąć \"$1\"?"
|
||||
removed: "Usunięto"
|
||||
admin/views/federation.vue:
|
||||
instance: "Instancja"
|
||||
notes: "Wpis"
|
||||
users: "Użytkownicy"
|
||||
following: "Śledzisz"
|
||||
followers: "Śledzący"
|
||||
caught-at: "Utworzono"
|
||||
status: "Stan"
|
||||
block: "Zablokuj"
|
||||
instances: "Instancja"
|
||||
sort: "Sortuj"
|
||||
states:
|
||||
all: "Wszyscy"
|
||||
blocked: "Zablokuj"
|
||||
chart-srcs:
|
||||
requests: "Żądania"
|
||||
blocked-hosts: "Zablokuj"
|
||||
save: "Zapisz"
|
||||
desktop/views/pages/welcome.vue:
|
||||
about: "O Misskey"
|
||||
timeline: "Oś czasu"
|
||||
@@ -977,8 +1003,6 @@ desktop/views/pages/user/user.timeline.vue:
|
||||
with-replies: "Wpisy i odpowiedzi"
|
||||
with-media: "Multimedia"
|
||||
my-posts: "Moje wpisy"
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Wiadomości"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Powiadomienia"
|
||||
desktop/views/widgets/polls.vue:
|
||||
@@ -1006,8 +1030,6 @@ mobile/views/components/drive.vue:
|
||||
file-count: "Plik(i)"
|
||||
nothing-in-drive: "Pusto"
|
||||
folder-is-empty: "Ten katalog jest pusty"
|
||||
prompt: "Co chcesz zrobić? (wprowadź odpowiednią cyfrę): <1 → Wysłać plik | 2 → Wysłać plik z adresu URL | 3 → Utworzyć katalog | 4 → Zmienić nazwę tego katalogu | 5 → Przenieść ten katalog | 6 → Usunąć ten katalog>"
|
||||
deletion-alert: "Przepraszamy. Usuwanie katalogów nie zostało jeszcze zaimplementowane."
|
||||
folder-name: "Nazwa katalogu"
|
||||
url-prompt: "Adres URL pliku, który chcesz wysłać"
|
||||
uploading: "Rozpoczęto wysyłanie. Może to trochę potrwać."
|
||||
@@ -1055,17 +1077,6 @@ mobile/views/components/note-sub.vue:
|
||||
cat: "kot"
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "Brak powiadomień"
|
||||
mobile/views/components/post-form.vue:
|
||||
add-visible-user: "Dodaj użytkownika"
|
||||
submit: "Wyślij"
|
||||
reply: "Odpowiedz"
|
||||
renote: "Udostępnij"
|
||||
quote-placeholder: "Zacytuj ten wpis… (nieobowiązkowe)"
|
||||
reply-placeholder: "Odpowiedź na ten wpis…"
|
||||
cw-placeholder: "Treść ostrzeżenia (opcjonalnie)"
|
||||
location-alert: "Twoje urządzenie nie pozwala na przekazywanie informacji o lokalizacji"
|
||||
error: "Błąd"
|
||||
username-prompt: "Wprowadź nazwę użytkownika"
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "ten wpis jest prywatny"
|
||||
deleted: "ten wpis został usunięty"
|
||||
@@ -1083,28 +1094,24 @@ mobile/views/components/ui.nav.vue:
|
||||
game: "Gry"
|
||||
admin: "Admin"
|
||||
about: "O Misskey"
|
||||
mobile/views/pages/user-lists.vue:
|
||||
title: "Listy"
|
||||
enter-list-name: "Wprowadź nazwę listy"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "Wyślij plik"
|
||||
create-folder: "Utwórz katalog"
|
||||
mobile/views/pages/signup.vue:
|
||||
lets-start: "Rozpocznijmy! 📦"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Strona główna"
|
||||
local: "Lokalne"
|
||||
hybrid: "Społeczność"
|
||||
global: "Globalne"
|
||||
mentions: "Wspomnienia"
|
||||
messages: "Wiadomości"
|
||||
messages: "Bezpośrednie wpisy"
|
||||
mobile/views/pages/widgets.vue:
|
||||
dashboard: "Kokpit"
|
||||
add-widget: "Dodaj"
|
||||
customization-tips: "Wskazówki o dostosowywaniu"
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
activity: "Aktywność"
|
||||
mobile/views/pages/received-follow-requests.vue:
|
||||
title: "Prośby o śledzenie"
|
||||
accept: "Zatwierdź"
|
||||
reject: "Odmów"
|
||||
mobile/views/pages/note.vue:
|
||||
title: "Wpis"
|
||||
prev: "Poprzedni wpis"
|
||||
@@ -1141,7 +1148,6 @@ deck:
|
||||
widgets: "Widżety"
|
||||
home: "Strona główna"
|
||||
local: "Lokalne"
|
||||
hybrid: "Społeczność"
|
||||
hashtag: "Hashtag"
|
||||
global: "Globalne"
|
||||
mentions: "Wspomnienia"
|
||||
@@ -1171,23 +1177,6 @@ deck/deck.user-column.vue:
|
||||
docs:
|
||||
edit-this-page-on-github: "Znalazłeś błąd lub chcesz pomóc w tworzeniu dokumentacji?"
|
||||
edit-this-page-on-github-link: "Edytuj stronę na GitHubie!"
|
||||
api:
|
||||
entities:
|
||||
properties: "Właściwości"
|
||||
endpoints:
|
||||
params: "Parametry"
|
||||
no-params: "Brak parametrów."
|
||||
res: "Odpowiedź"
|
||||
require-credential: "Punkt końcowy wymaga informacji o uwierzytelnieniu."
|
||||
require-permission: "Ten punkt końcowy wymaga uprawnienia {permission}."
|
||||
has-limit: "Istnieje limit częstotliwości."
|
||||
min-interval-limit: "Nie możesz wykonać żądania przed upłynięciem {interval} od ostatniego żądania."
|
||||
show-src: "Możesz zobaczyć kod źródłowy tego punktu końcowego."
|
||||
show-src-link: "Zobacz kod na GitHubie"
|
||||
props:
|
||||
name: "Nazwa"
|
||||
type: "Rodzaj"
|
||||
description: "Opis"
|
||||
dev/views/index.vue:
|
||||
manage-apps: "Zarządzaj aplikacjami"
|
||||
dev/views/apps.vue:
|
||||
@@ -1196,11 +1185,39 @@ dev/views/apps.vue:
|
||||
dev/views/new-app.vue:
|
||||
app-name: "Nazwa Aplikacji"
|
||||
authority: "Uprawnienia"
|
||||
account-read: "Wyświetlanie informacji o koncie:"
|
||||
account-write: "Modyfikowanie informacji o koncie:"
|
||||
note-write: "Publikacja."
|
||||
following-write: "Śledzenie i cofanie śledzenia."
|
||||
drive-read: "Odczytywanie Twojego dysku."
|
||||
drive-write: "Wysyłanie i usuwanie plików na Twoim dysku."
|
||||
notification-read: "Odczytywanie Twoich powiadomień."
|
||||
notification-write: "Zarządzanie Twoimi powiadomieniami."
|
||||
pages:
|
||||
like: "Lubię"
|
||||
title: "Tytuł"
|
||||
blocks:
|
||||
image: "Zdjęcia"
|
||||
post: "Formularz tworzenia"
|
||||
_textInput:
|
||||
text: "Tytuł"
|
||||
_textareaInput:
|
||||
text: "Tytuł"
|
||||
_numberInput:
|
||||
text: "Tytuł"
|
||||
_switch:
|
||||
text: "Tytuł"
|
||||
_counter:
|
||||
text: "Tytuł"
|
||||
_button:
|
||||
text: "Tytuł"
|
||||
script:
|
||||
categories:
|
||||
random: "Losowy"
|
||||
list: "Listy"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Listy"
|
||||
random: "Losowy"
|
||||
_randomPick:
|
||||
arg1: "Listy"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listy"
|
||||
_seedRandomPick:
|
||||
arg2: "Listy"
|
||||
_pick:
|
||||
arg1: "Listy"
|
||||
types:
|
||||
array: "Listy"
|
||||
|
||||
@@ -45,6 +45,9 @@ common:
|
||||
trash: "Lixo"
|
||||
timeline: "Linha do tempo"
|
||||
followers: "Seguidores"
|
||||
post-form:
|
||||
enter-username: "Digite o nome de usuário."
|
||||
username-prompt: "Digite o nome de usuário."
|
||||
weekday-short:
|
||||
sunday: "Dom"
|
||||
monday: "Seg"
|
||||
@@ -89,7 +92,7 @@ common:
|
||||
update-available-title: "Atualização disponível"
|
||||
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
|
||||
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
|
||||
verified-user: "Conta verificada"
|
||||
enter-username: "Digite o nome de usuário."
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
my-turn: "Seu turno"
|
||||
@@ -119,9 +122,6 @@ common:
|
||||
you: "Você"
|
||||
auth/views/form.vue:
|
||||
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
||||
account-read: "Ver informações da conta."
|
||||
account-write: "Modificar informações da conta."
|
||||
note-write: "Publicar"
|
||||
cancel: "Cancelar"
|
||||
accept: "Permitir acesso"
|
||||
auth/views/index.vue:
|
||||
@@ -132,8 +132,6 @@ auth/views/index.vue:
|
||||
please-go-back: "Por favor, volte ao aplicativo."
|
||||
error: "A sessão não existe."
|
||||
sign-in: "Por favor, entre."
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "Conta verificada"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
invite: "Convidar"
|
||||
rule: "Como jogar"
|
||||
@@ -166,6 +164,10 @@ common/views/components/profile-editor.vue:
|
||||
name: "Nome"
|
||||
export-targets:
|
||||
following-list: "Seguindo"
|
||||
common/views/components/user-group-editor.vue:
|
||||
invite: "Convidar"
|
||||
common/views/components/user-groups.vue:
|
||||
invites: "Convidar"
|
||||
common/views/widgets/posts-monitor.vue:
|
||||
title: "Gráfico de publicações"
|
||||
common/views/widgets/memo.vue:
|
||||
@@ -197,10 +199,6 @@ admin/views/instance.vue:
|
||||
invite: "Convidar"
|
||||
admin/views/drive.vue:
|
||||
delete: "Apagar"
|
||||
admin/views/users.vue:
|
||||
users:
|
||||
state:
|
||||
verified: "Conta verificada"
|
||||
admin/views/emoji.vue:
|
||||
emojis:
|
||||
remove: "Apagar"
|
||||
@@ -277,22 +275,10 @@ deck/deck.user-column.vue:
|
||||
timeline: "Linha do tempo"
|
||||
docs:
|
||||
edit-this-page-on-github-link: "Edite esta página no GitHub!"
|
||||
api:
|
||||
entities:
|
||||
properties: "Propriedades"
|
||||
endpoints:
|
||||
params: "Parâmetros"
|
||||
no-params: "Sem parâmetros"
|
||||
res: "Resposta"
|
||||
show-src-link: "Veja o código no GitHub"
|
||||
generated: "Este documento foi gerado pelas definições da API."
|
||||
props:
|
||||
name: "Nome"
|
||||
type: "Tipo"
|
||||
description: "Descrição"
|
||||
dev/views/index.vue:
|
||||
manage-apps: "Gerenciar aplicativos"
|
||||
dev/views/new-app.vue:
|
||||
account-read: "Ver informações da conta."
|
||||
account-write: "Modificar informações da conta."
|
||||
note-write: "Publicar"
|
||||
pages:
|
||||
like: "Curtir"
|
||||
blocks:
|
||||
image: "Imagens"
|
||||
post: "Formulário de publicação"
|
||||
|
||||
@@ -146,3 +146,10 @@ mobile/views/components/sub-note-content.vue:
|
||||
poll: "Голосования"
|
||||
mobile/views/pages/widgets.vue:
|
||||
customization-tips: "Советы по настройке"
|
||||
pages:
|
||||
like: "Нравится"
|
||||
script:
|
||||
categories:
|
||||
random: "Случайно"
|
||||
blocks:
|
||||
random: "Случайно"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
90
locales/zh-TW.yml
Normal file
90
locales/zh-TW.yml
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
meta:
|
||||
lang: "中文(繁体)"
|
||||
common:
|
||||
intro:
|
||||
title: "什麽是 Misskey 呢?"
|
||||
rich-contents: "發佈"
|
||||
reaction: "回應"
|
||||
drive: "雲端硬碟"
|
||||
adblock:
|
||||
detected: "請禁用廣告封鎖器"
|
||||
close: "關閉"
|
||||
enter-password: "請輸入密碼"
|
||||
2fa: "雙重身份驗證"
|
||||
dark-mode: "夜間模式"
|
||||
signup: "註冊"
|
||||
signout: "登出"
|
||||
notification:
|
||||
reversi-invited: "您已被邀請加入壹場遊戲"
|
||||
reversi-invited-by: "來自{}的邀請"
|
||||
notified-by: "來自{}的邀請"
|
||||
time:
|
||||
future: "未來"
|
||||
just_now: "剛剛"
|
||||
drive: "雲端硬碟"
|
||||
weekday:
|
||||
sunday: "週日"
|
||||
monday: "週一"
|
||||
tuesday: "週二"
|
||||
wednesday: "週三"
|
||||
thursday: "週四"
|
||||
friday: "週五"
|
||||
saturday: "週六"
|
||||
reactions:
|
||||
like: "贊"
|
||||
love: "喜歡"
|
||||
congrats: "恭喜"
|
||||
_settings:
|
||||
password: "密碼"
|
||||
font-size: "字體大小"
|
||||
font-size-x-small: "小"
|
||||
font-size-small: "較小"
|
||||
deck-column-width-wide: "寬"
|
||||
timeline: "時間軸"
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
flush: "清除快取"
|
||||
common/views/components/theme.vue:
|
||||
light-themes: "淺色主題"
|
||||
dark-themes: "深色主題"
|
||||
install-a-theme: "安裝主題"
|
||||
save-created-theme: "保存主題"
|
||||
common/views/components/signin.vue:
|
||||
signin-with-twitter: "用 Twitter 帳號登入"
|
||||
signin-with-github: "用 GitHub 帳號登入"
|
||||
signin-with-discord: "用 Discord 帳號登入"
|
||||
login-failed: "登錄失敗。 請檢查用戶名和密碼。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "邀請碼"
|
||||
username: "用戶名"
|
||||
available: "可用"
|
||||
too-long: "請不要超過20個字元"
|
||||
password: "密碼"
|
||||
password-placeholder: "建議至少8個字元"
|
||||
common/views/components/stream-indicator.vue:
|
||||
connecting: "正在連線"
|
||||
reconnecting: "正在重新連線"
|
||||
connected: "已建立連線"
|
||||
common/views/components/integration-settings.vue:
|
||||
disconnect: "中斷連線"
|
||||
common/views/components/github-setting.vue:
|
||||
reconnect: "重新連線"
|
||||
disconnect: "中斷連線"
|
||||
common/views/components/discord-setting.vue:
|
||||
reconnect: "重新連線"
|
||||
disconnect: "中斷連線"
|
||||
common/views/components/language-settings.vue:
|
||||
recommended: "推薦"
|
||||
auto: "自動"
|
||||
specify-language: "指定語言"
|
||||
common/views/components/profile-editor.vue:
|
||||
title: "個人資料"
|
||||
name: "名稱"
|
||||
birthday: "生日:"
|
||||
privacy: "隱私"
|
||||
admin/views/dashboard.vue:
|
||||
drive: "雲端硬碟"
|
||||
admin/views/charts.vue:
|
||||
drive: "雲端硬碟"
|
||||
pages:
|
||||
like: "贊"
|
||||
31
migration/1556348509290-Pages.ts
Normal file
31
migration/1556348509290-Pages.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class Pages1556348509290 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TYPE "page_visibility_enum" AS ENUM('public', 'followers', 'specified')`);
|
||||
await queryRunner.query(`CREATE TABLE "page" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "title" character varying(256) NOT NULL, "name" character varying(256) NOT NULL, "summary" character varying(256), "alignCenter" boolean NOT NULL, "font" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "eyeCatchingImageId" character varying(32), "content" jsonb NOT NULL DEFAULT '[]', "variables" jsonb NOT NULL DEFAULT '[]', "visibility" "page_visibility_enum" NOT NULL, "visibleUserIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_742f4117e065c5b6ad21b37ba1f" PRIMARY KEY ("id"))`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_fbb4297c927a9b85e9cefa2eb1" ON "page" ("createdAt") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_af639b066dfbca78b01a920f8a" ON "page" ("updatedAt") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_b82c19c08afb292de4600d99e4" ON "page" ("name") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_ae1d917992dd0c9d9bbdad06c4" ON "page" ("userId") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_90148bbc2bf0854428786bfc15" ON "page" ("visibleUserIds") `);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_2133ef8317e4bdb839c0dcbf13" ON "page" ("userId", "name") `);
|
||||
await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_ae1d917992dd0c9d9bbdad06c4a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_3126dd7c502c9e4d7597ef7ef10" FOREIGN KEY ("eyeCatchingImageId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_3126dd7c502c9e4d7597ef7ef10"`);
|
||||
await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_ae1d917992dd0c9d9bbdad06c4a"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_2133ef8317e4bdb839c0dcbf13"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_90148bbc2bf0854428786bfc15"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_ae1d917992dd0c9d9bbdad06c4"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_b82c19c08afb292de4600d99e4"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_af639b066dfbca78b01a920f8a"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_fbb4297c927a9b85e9cefa2eb1"`);
|
||||
await queryRunner.query(`DROP TABLE "page"`);
|
||||
await queryRunner.query(`DROP TYPE "page_visibility_enum"`);
|
||||
}
|
||||
|
||||
}
|
||||
16
migration/1556746559567-UserProfile.ts
Normal file
16
migration/1556746559567-UserProfile.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class UserProfile1556746559567 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "githubId" TYPE VARCHAR(64) USING "githubId"::VARCHAR(64)`);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "discordExpiresDate" TYPE VARCHAR(64) USING "discordExpiresDate"::VARCHAR(64)`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`UPDATE "user_profile" SET github = FALSE, discord = FALSE`);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "githubId" TYPE INTEGER USING NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "discordExpiresDate" TYPE INTEGER USING NULL`);
|
||||
}
|
||||
|
||||
}
|
||||
13
migration/1557476068003-PinnedUsers.ts
Normal file
13
migration/1557476068003-PinnedUsers.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class PinnedUsers1557476068003 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedUsers" character varying(256) array NOT NULL DEFAULT '{}'::varchar[]`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedUsers"`);
|
||||
}
|
||||
|
||||
}
|
||||
16
migration/1557761316509-AddSomeUrls.ts
Normal file
16
migration/1557761316509-AddSomeUrls.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class AddSomeUrls1557761316509 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "ToSUrl" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://github.com/syuilo/misskey'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "feedbackUrl" character varying(512) DEFAULT 'https://github.com/syuilo/misskey/issues/new'`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "feedbackUrl"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "repositoryUrl"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "ToSUrl"`);
|
||||
}
|
||||
}
|
||||
31
migration/1557932705754-ObjectStorageSetting.ts
Normal file
31
migration/1557932705754-ObjectStorageSetting.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class ObjectStorageSetting1557932705754 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "useObjectStorage" boolean NOT NULL DEFAULT false`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageBucket" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStoragePrefix" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageBaseUrl" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageEndpoint" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageRegion" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageAccessKey" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageSecretKey" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStoragePort" integer`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageUseSSL" boolean NOT NULL DEFAULT true`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageUseSSL"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStoragePort"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageSecretKey"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageAccessKey"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageRegion"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageEndpoint"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageBaseUrl"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStoragePrefix"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageBucket"`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "useObjectStorage"`);
|
||||
}
|
||||
|
||||
}
|
||||
23
migration/1558072954435-PageLike.ts
Normal file
23
migration/1558072954435-PageLike.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class PageLike1558072954435 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TABLE "page_like" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "pageId" character varying(32) NOT NULL, CONSTRAINT "PK_813f034843af992d3ae0f43c64c" PRIMARY KEY ("id"))`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_0e61efab7f88dbb79c9166dbb4" ON "page_like" ("userId") `);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_4ce6fb9c70529b4c8ac46c9bfa" ON "page_like" ("userId", "pageId") `);
|
||||
await queryRunner.query(`ALTER TABLE "page" ADD "likedCount" integer NOT NULL DEFAULT 0`);
|
||||
await queryRunner.query(`ALTER TABLE "page_like" ADD CONSTRAINT "FK_0e61efab7f88dbb79c9166dbb48" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "page_like" ADD CONSTRAINT "FK_cf8782626dced3176038176a847" FOREIGN KEY ("pageId") REFERENCES "page"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "page_like" DROP CONSTRAINT "FK_cf8782626dced3176038176a847"`);
|
||||
await queryRunner.query(`ALTER TABLE "page_like" DROP CONSTRAINT "FK_0e61efab7f88dbb79c9166dbb48"`);
|
||||
await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "likedCount"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_4ce6fb9c70529b4c8ac46c9bfa"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_0e61efab7f88dbb79c9166dbb4"`);
|
||||
await queryRunner.query(`DROP TABLE "page_like"`);
|
||||
}
|
||||
|
||||
}
|
||||
41
migration/1558103093633-UserGroup.ts
Normal file
41
migration/1558103093633-UserGroup.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class UserGroup1558103093633 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TABLE "user_group" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(256) NOT NULL, "userId" character varying(32) NOT NULL, "isPrivate" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_3c29fba6fe013ec8724378ce7c9" PRIMARY KEY ("id"))`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_20e30aa35180e317e133d75316" ON "user_group" ("createdAt") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_3d6b372788ab01be58853003c9" ON "user_group" ("userId") `);
|
||||
await queryRunner.query(`CREATE TABLE "user_group_joining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userGroupId" character varying(32) NOT NULL, CONSTRAINT "PK_15f2425885253c5507e1599cfe7" PRIMARY KEY ("id"))`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_f3a1b4bd0c7cabba958a0c0b23" ON "user_group_joining" ("userId") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_67dc758bc0566985d1b3d39986" ON "user_group_joining" ("userGroupId") `);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" ADD "groupId" character varying(32)`);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" ADD "reads" character varying(32) array NOT NULL DEFAULT '{}'::varchar[]`);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" ALTER COLUMN "recipientId" DROP NOT NULL`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."recipientId" IS 'The recipient user ID.'`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_2c4be03b446884f9e9c502135b" ON "messaging_message" ("groupId") `);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_2c4be03b446884f9e9c502135be" FOREIGN KEY ("groupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "user_group" ADD CONSTRAINT "FK_3d6b372788ab01be58853003c93" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_joining" ADD CONSTRAINT "FK_f3a1b4bd0c7cabba958a0c0b231" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_joining" ADD CONSTRAINT "FK_67dc758bc0566985d1b3d399865" FOREIGN KEY ("userGroupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "user_group_joining" DROP CONSTRAINT "FK_67dc758bc0566985d1b3d399865"`);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_joining" DROP CONSTRAINT "FK_f3a1b4bd0c7cabba958a0c0b231"`);
|
||||
await queryRunner.query(`ALTER TABLE "user_group" DROP CONSTRAINT "FK_3d6b372788ab01be58853003c93"`);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_2c4be03b446884f9e9c502135be"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_2c4be03b446884f9e9c502135b"`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."recipientId" IS ''`);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" ALTER COLUMN "recipientId" SET NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" DROP COLUMN "reads"`);
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" DROP COLUMN "groupId"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_67dc758bc0566985d1b3d39986"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_f3a1b4bd0c7cabba958a0c0b23"`);
|
||||
await queryRunner.query(`DROP TABLE "user_group_joining"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_3d6b372788ab01be58853003c9"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_20e30aa35180e317e133d75316"`);
|
||||
await queryRunner.query(`DROP TABLE "user_group"`);
|
||||
}
|
||||
|
||||
}
|
||||
25
migration/1558257926829-UserGroupInvite.ts
Normal file
25
migration/1558257926829-UserGroupInvite.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class UserGroupInvite1558257926829 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TABLE "user_group_invite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userGroupId" character varying(32) NOT NULL, CONSTRAINT "PK_3893884af0d3a5f4d01e7921a97" PRIMARY KEY ("id"))`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_1039988afa3bf991185b277fe0" ON "user_group_invite" ("userId") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_e10924607d058004304611a436" ON "user_group_invite" ("userGroupId") `);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_78787741f9010886796f2320a4" ON "user_group_invite" ("userId", "userGroupId") `);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d9ecaed8c6dc43f3592c229282" ON "user_group_joining" ("userId", "userGroupId") `);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invite" ADD CONSTRAINT "FK_1039988afa3bf991185b277fe03" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invite" ADD CONSTRAINT "FK_e10924607d058004304611a436a" FOREIGN KEY ("userGroupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invite" DROP CONSTRAINT "FK_e10924607d058004304611a436a"`);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invite" DROP CONSTRAINT "FK_1039988afa3bf991185b277fe03"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_d9ecaed8c6dc43f3592c229282"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_78787741f9010886796f2320a4"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_e10924607d058004304611a436"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_1039988afa3bf991185b277fe0"`);
|
||||
await queryRunner.query(`DROP TABLE "user_group_invite"`);
|
||||
}
|
||||
|
||||
}
|
||||
13
migration/1558266512381-UserListJoining.ts
Normal file
13
migration/1558266512381-UserListJoining.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class UserListJoining1558266512381 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_90f7da835e4c10aca6853621e1" ON "user_list_joining" ("userId", "userListId") `);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`DROP INDEX "IDX_90f7da835e4c10aca6853621e1"`);
|
||||
}
|
||||
|
||||
}
|
||||
189
package.json
189
package.json
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "10.92.0",
|
||||
"codename": "nighthike",
|
||||
"version": "11.22.0",
|
||||
"codename": "daybreak",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/syuilo/misskey.git"
|
||||
@@ -11,7 +11,10 @@
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "node ./index.js",
|
||||
"debug": "DEBUG=misskey:* node ./index.js",
|
||||
"init": "node ./built/init.js",
|
||||
"ormconfig": "node ./built/ormconfig.js",
|
||||
"migrate": "npm run ormconfig && ts-node ./node_modules/typeorm/cli.js migration:run",
|
||||
"migrateandstart": "npm run migrate && npm run start",
|
||||
"build": "webpack && gulp build",
|
||||
"webpack": "webpack",
|
||||
"watch": "webpack --watch",
|
||||
@@ -22,131 +25,130 @@
|
||||
"test": "gulp test",
|
||||
"format": "gulp format"
|
||||
},
|
||||
"resolutions": {
|
||||
"gulp-cssnano/cssnano/postcss-svgo/svgo/js-yaml": "^3.13.1",
|
||||
"video-thumbnail-generator/lodash": "^4.17.11"
|
||||
},
|
||||
"dependencies": {
|
||||
"@elastic/elasticsearch": "7.0.0-rc.2",
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.15",
|
||||
"@fortawesome/free-brands-svg-icons": "5.7.2",
|
||||
"@fortawesome/free-regular-svg-icons": "5.7.2",
|
||||
"@fortawesome/free-solid-svg-icons": "5.7.2",
|
||||
"@fortawesome/vue-fontawesome": "0.1.5",
|
||||
"@koa/cors": "2.2.3",
|
||||
"@prezzemolo/rap": "0.1.2",
|
||||
"@prezzemolo/zip": "0.0.3",
|
||||
"@types/bcryptjs": "2.4.2",
|
||||
"@types/chai-http": "3.0.5",
|
||||
"@types/bull": "3.5.11",
|
||||
"@types/dateformat": "3.0.0",
|
||||
"@types/deep-equal": "1.0.1",
|
||||
"@types/double-ended-queue": "2.1.0",
|
||||
"@types/elasticsearch": "5.0.30",
|
||||
"@types/file-type": "10.6.0",
|
||||
"@types/gulp": "4.0.5",
|
||||
"@types/gulp": "4.0.6",
|
||||
"@types/gulp-mocha": "0.0.32",
|
||||
"@types/gulp-rename": "0.0.33",
|
||||
"@types/gulp-replace": "0.0.31",
|
||||
"@types/gulp-uglify": "3.0.6",
|
||||
"@types/gulp-util": "3.0.34",
|
||||
"@types/is-root": "1.0.0",
|
||||
"@types/is-svg": "3.0.0",
|
||||
"@types/is-url": "1.2.28",
|
||||
"@types/js-yaml": "3.12.0",
|
||||
"@types/js-yaml": "3.12.1",
|
||||
"@types/jsdom": "12.2.3",
|
||||
"@types/katex": "0.10.1",
|
||||
"@types/koa": "2.0.48",
|
||||
"@types/koa-bodyparser": "5.0.2",
|
||||
"@types/koa-compress": "2.0.8",
|
||||
"@types/koa-compress": "2.0.9",
|
||||
"@types/koa-cors": "0.0.0",
|
||||
"@types/koa-favicon": "2.0.19",
|
||||
"@types/koa-logger": "3.1.1",
|
||||
"@types/koa-mount": "3.0.1",
|
||||
"@types/koa-multer": "1.0.0",
|
||||
"@types/koa-router": "7.0.39",
|
||||
"@types/koa-send": "4.1.1",
|
||||
"@types/koa-router": "7.0.40",
|
||||
"@types/koa-send": "4.1.2",
|
||||
"@types/koa-views": "2.0.3",
|
||||
"@types/koa__cors": "2.2.3",
|
||||
"@types/lolex": "3.1.1",
|
||||
"@types/minio": "7.0.1",
|
||||
"@types/mkdirp": "0.5.2",
|
||||
"@types/mocha": "5.2.5",
|
||||
"@types/mongodb": "3.1.20",
|
||||
"@types/node": "10.12.24",
|
||||
"@types/nodemailer": "4.6.6",
|
||||
"@types/mocha": "5.2.6",
|
||||
"@types/node": "11.13.8",
|
||||
"@types/nodemailer": "4.6.8",
|
||||
"@types/nprogress": "0.0.29",
|
||||
"@types/oauth": "0.9.1",
|
||||
"@types/parse5": "5.0.0",
|
||||
"@types/parsimmon": "1.10.0",
|
||||
"@types/portscanner": "2.1.0",
|
||||
"@types/pug": "2.0.4",
|
||||
"@types/qrcode": "1.3.0",
|
||||
"@types/qrcode": "1.3.2",
|
||||
"@types/random-seed": "0.3.3",
|
||||
"@types/ratelimiter": "2.1.28",
|
||||
"@types/redis": "2.8.10",
|
||||
"@types/redis": "2.8.12",
|
||||
"@types/rename": "1.0.1",
|
||||
"@types/request": "2.48.1",
|
||||
"@types/request-promise-native": "1.0.15",
|
||||
"@types/request-promise-native": "1.0.16",
|
||||
"@types/request-stats": "3.0.0",
|
||||
"@types/rimraf": "2.0.2",
|
||||
"@types/seedrandom": "2.4.27",
|
||||
"@types/sharp": "0.21.2",
|
||||
"@types/seedrandom": "2.4.28",
|
||||
"@types/sharp": "0.22.1",
|
||||
"@types/showdown": "1.9.2",
|
||||
"@types/speakeasy": "2.0.3",
|
||||
"@types/speakeasy": "2.0.4",
|
||||
"@types/systeminformation": "3.23.1",
|
||||
"@types/tinycolor2": "1.4.1",
|
||||
"@types/tmp": "0.0.33",
|
||||
"@types/tmp": "0.1.0",
|
||||
"@types/uuid": "3.4.4",
|
||||
"@types/web-push": "3.3.0",
|
||||
"@types/webpack": "4.4.24",
|
||||
"@types/webpack": "4.4.29",
|
||||
"@types/webpack-stream": "3.2.10",
|
||||
"@types/websocket": "0.0.40",
|
||||
"@types/ws": "6.0.1",
|
||||
"animejs": "3.0.1",
|
||||
"apexcharts": "3.5.0",
|
||||
"apexcharts": "3.8.0",
|
||||
"autobind-decorator": "2.4.0",
|
||||
"autosize": "4.0.2",
|
||||
"autwh": "0.1.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"bee-queue": "1.2.2",
|
||||
"bootstrap-vue": "2.0.0-rc.11",
|
||||
"cafy": "15.1.0",
|
||||
"bootstrap-vue": "2.0.0-rc.13",
|
||||
"bull": "3.10.0",
|
||||
"cafy": "15.1.1",
|
||||
"chai": "4.2.0",
|
||||
"chai-http": "4.2.1",
|
||||
"chalk": "2.4.2",
|
||||
"commander": "2.19.0",
|
||||
"cli-highlight": "2.1.1",
|
||||
"commander": "2.20.0",
|
||||
"content-disposition": "0.5.3",
|
||||
"crc-32": "1.2.0",
|
||||
"css-loader": "2.1.0",
|
||||
"css-loader": "2.1.1",
|
||||
"cssnano": "4.1.10",
|
||||
"dateformat": "3.0.3",
|
||||
"deep-equal": "1.0.1",
|
||||
"deepcopy": "0.6.3",
|
||||
"diskusage": "1.0.0",
|
||||
"diskusage": "1.1.1",
|
||||
"double-ended-queue": "2.1.0-0",
|
||||
"elasticsearch": "15.3.1",
|
||||
"emojilib": "2.4.0",
|
||||
"escape-regexp": "0.0.1",
|
||||
"eslint": "5.12.0",
|
||||
"eslint": "5.16.0",
|
||||
"eslint-plugin-vue": "5.2.2",
|
||||
"eventemitter3": "3.1.0",
|
||||
"feed": "2.0.2",
|
||||
"file-type": "10.7.1",
|
||||
"eventemitter3": "3.1.2",
|
||||
"feed": "2.0.4",
|
||||
"file-type": "10.11.0",
|
||||
"fuckadblock": "3.2.1",
|
||||
"gulp": "4.0.0",
|
||||
"gulp": "4.0.2",
|
||||
"gulp-cssnano": "2.1.3",
|
||||
"gulp-imagemin": "5.0.3",
|
||||
"gulp-mocha": "6.0.0",
|
||||
"gulp-rename": "1.4.0",
|
||||
"gulp-replace": "1.0.0",
|
||||
"gulp-sourcemaps": "2.6.4",
|
||||
"gulp-sourcemaps": "2.6.5",
|
||||
"gulp-stylus": "2.7.0",
|
||||
"gulp-tslint": "8.1.3",
|
||||
"gulp-typescript": "5.0.0",
|
||||
"gulp-uglify": "3.0.1",
|
||||
"gulp-tslint": "8.1.4",
|
||||
"gulp-typescript": "5.0.1",
|
||||
"gulp-uglify": "3.0.2",
|
||||
"gulp-util": "3.0.8",
|
||||
"hard-source-webpack-plugin": "0.13.1",
|
||||
"html-minifier": "3.5.21",
|
||||
"html-minifier": "4.0.0",
|
||||
"http-signature": "1.2.0",
|
||||
"insert-text-at-cursor": "0.1.2",
|
||||
"is-root": "2.0.0",
|
||||
"is-svg": "3.0.0",
|
||||
"js-yaml": "3.12.1",
|
||||
"jsdom": "13.2.0",
|
||||
"insert-text-at-cursor": "0.2.0",
|
||||
"is-root": "2.1.0",
|
||||
"is-svg": "4.2.0",
|
||||
"js-yaml": "3.13.1",
|
||||
"jsdom": "15.1.1",
|
||||
"json5": "2.1.0",
|
||||
"json5-loader": "1.0.1",
|
||||
"katex": "0.10.1",
|
||||
"json5-loader": "2.0.0",
|
||||
"katex": "0.10.2",
|
||||
"koa": "2.7.0",
|
||||
"koa-bodyparser": "4.2.1",
|
||||
"koa-compress": "3.0.0",
|
||||
@@ -158,49 +160,53 @@
|
||||
"koa-router": "7.4.0",
|
||||
"koa-send": "5.0.0",
|
||||
"koa-slow": "2.1.0",
|
||||
"koa-views": "6.1.5",
|
||||
"koa-views": "6.2.0",
|
||||
"langmap": "0.0.16",
|
||||
"loader-utils": "1.2.3",
|
||||
"lolex": "3.1.0",
|
||||
"lookup-dns-cache": "2.1.0",
|
||||
"minio": "7.0.5",
|
||||
"mkdirp": "0.5.1",
|
||||
"mocha": "5.2.0",
|
||||
"minio": "7.0.10",
|
||||
"mocha": "6.1.4",
|
||||
"moji": "0.5.1",
|
||||
"moment": "2.24.0",
|
||||
"mongodb": "3.1.13",
|
||||
"monk": "6.0.6",
|
||||
"ms": "2.1.1",
|
||||
"nan": "2.12.1",
|
||||
"ms": "2.1.2",
|
||||
"nested-property": "0.0.7",
|
||||
"nodemailer": "5.1.1",
|
||||
"node-fetch": "2.6.0",
|
||||
"nodemailer": "6.2.1",
|
||||
"nprogress": "0.2.0",
|
||||
"object-assign-deep": "0.4.0",
|
||||
"os-utils": "0.0.14",
|
||||
"parse5": "5.1.0",
|
||||
"parsimmon": "1.12.0",
|
||||
"pg": "7.11.0",
|
||||
"portscanner": "2.2.0",
|
||||
"postcss-loader": "3.0.0",
|
||||
"prismjs": "1.15.0",
|
||||
"prismjs": "1.16.0",
|
||||
"progress-bar-webpack-plugin": "1.12.1",
|
||||
"promise-any": "0.2.0",
|
||||
"promise-limit": "2.7.0",
|
||||
"promise-sequential": "1.1.1",
|
||||
"pug": "2.0.3",
|
||||
"punycode": "2.1.1",
|
||||
"pureimage": "0.1.6",
|
||||
"qrcode": "1.3.3",
|
||||
"randomcolor": "0.5.3",
|
||||
"ratelimiter": "3.2.0",
|
||||
"random-seed": "0.3.0",
|
||||
"randomcolor": "0.5.4",
|
||||
"ratelimiter": "3.3.0",
|
||||
"recaptcha-promise": "0.1.3",
|
||||
"reconnecting-websocket": "4.1.10",
|
||||
"redis": "2.8.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rename": "1.0.4",
|
||||
"request": "2.88.0",
|
||||
"request-promise-native": "1.0.5",
|
||||
"request-promise-native": "1.0.7",
|
||||
"request-stats": "3.0.0",
|
||||
"require-all": "3.0.0",
|
||||
"rimraf": "2.6.3",
|
||||
"rndstr": "1.0.0",
|
||||
"s-age": "1.1.2",
|
||||
"seedrandom": "2.4.4",
|
||||
"sharp": "0.21.3",
|
||||
"seedrandom": "3.0.1",
|
||||
"sharp": "0.22.1",
|
||||
"showdown": "1.9.0",
|
||||
"showdown-highlightjs-extension": "0.1.2",
|
||||
"speakeasy": "2.0.0",
|
||||
@@ -208,50 +214,51 @@
|
||||
"style-loader": "0.23.1",
|
||||
"stylus": "0.54.5",
|
||||
"stylus-loader": "3.0.2",
|
||||
"summaly": "2.2.0",
|
||||
"systeminformation": "4.0.14",
|
||||
"summaly": "2.3.0",
|
||||
"systeminformation": "4.11.1",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"terser-webpack-plugin": "1.2.3",
|
||||
"terser-webpack-plugin": "1.3.0",
|
||||
"textarea-caret": "3.1.0",
|
||||
"tinycolor2": "1.4.1",
|
||||
"tmp": "0.0.33",
|
||||
"tmp": "0.1.0",
|
||||
"ts-loader": "5.3.3",
|
||||
"ts-node": "8.0.2",
|
||||
"tslint": "5.13.1",
|
||||
"ts-node": "7.0.1",
|
||||
"tslint": "5.15.0",
|
||||
"tslint-sonarts": "1.9.0",
|
||||
"typeorm": "0.2.16-rc.1",
|
||||
"typescript": "3.3.3333",
|
||||
"typescript-eslint-parser": "22.0.0",
|
||||
"uglify-es": "3.3.9",
|
||||
"ulid": "2.3.0",
|
||||
"url-loader": "1.1.2",
|
||||
"uuid": "3.3.2",
|
||||
"v-animate-css": "0.0.3",
|
||||
"v-debounce": "0.1.2",
|
||||
"video-thumbnail-generator": "1.1.3",
|
||||
"vue": "2.6.8",
|
||||
"vue": "2.6.10",
|
||||
"vue-color": "2.7.0",
|
||||
"vue-content-loading": "1.5.3",
|
||||
"vue-content-loading": "1.6.0",
|
||||
"vue-cropperjs": "3.0.0",
|
||||
"vue-i18n": "8.8.2",
|
||||
"vue-js-modal": "1.3.28",
|
||||
"vue-json-pretty": "1.4.1",
|
||||
"vue-i18n": "8.11.2",
|
||||
"vue-js-modal": "1.3.31",
|
||||
"vue-json-pretty": "1.6.0",
|
||||
"vue-loader": "15.7.0",
|
||||
"vue-marquee-text-component": "1.1.1",
|
||||
"vue-prism-component": "1.1.1",
|
||||
"vue-router": "3.0.2",
|
||||
"vue-router": "3.0.6",
|
||||
"vue-sequential-entrance": "1.1.3",
|
||||
"vue-style-loader": "4.1.2",
|
||||
"vue-svg-inline-loader": "1.2.12",
|
||||
"vue-template-compiler": "2.6.8",
|
||||
"vuedraggable": "2.18.1",
|
||||
"vue-svg-inline-loader": "1.2.15",
|
||||
"vue-template-compiler": "2.6.10",
|
||||
"vuedraggable": "2.21.0",
|
||||
"vuewordcloud": "18.7.11",
|
||||
"vuex": "3.1.0",
|
||||
"vuex": "3.1.1",
|
||||
"vuex-persistedstate": "2.5.4",
|
||||
"web-push": "3.3.3",
|
||||
"webfinger.js": "2.7.0",
|
||||
"webpack": "4.28.4",
|
||||
"webpack-cli": "3.2.1",
|
||||
"web-push": "3.3.5",
|
||||
"webpack": "4.34.0",
|
||||
"webpack-cli": "3.3.4",
|
||||
"websocket": "1.0.28",
|
||||
"ws": "6.1.4",
|
||||
"ws": "7.0.0",
|
||||
"xev": "2.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
17
src/@types/deepcopy.d.ts
vendored
17
src/@types/deepcopy.d.ts
vendored
@@ -1,17 +0,0 @@
|
||||
declare module 'deepcopy';
|
||||
|
||||
declare namespace deepcopy {
|
||||
type DeepcopyCustomizerValueType = 'Object';
|
||||
|
||||
type DeepcopyCustomizer<T> = (
|
||||
value: T,
|
||||
valueType: DeepcopyCustomizerValueType) => T;
|
||||
|
||||
interface DeepcopyOptions<T> {
|
||||
customizer: DeepcopyCustomizer<T>;
|
||||
}
|
||||
|
||||
export function deepcopy<T>(
|
||||
value: T,
|
||||
options?: DeepcopyOptions<T> | DeepcopyCustomizer<T>): T;
|
||||
}
|
||||
7
src/@types/escape-regexp.d.ts
vendored
7
src/@types/escape-regexp.d.ts
vendored
@@ -1,7 +0,0 @@
|
||||
declare module 'escape-regexp' {
|
||||
function escapeRegExp(str: string): string;
|
||||
|
||||
namespace escapeRegExp {} // Hack
|
||||
|
||||
export = escapeRegExp;
|
||||
}
|
||||
2
src/@types/koa-slow.d.ts
vendored
2
src/@types/koa-slow.d.ts
vendored
@@ -8,7 +8,7 @@ declare module 'koa-slow' {
|
||||
|
||||
function slow(options?: ISlowOptions): Middleware;
|
||||
|
||||
namespace slow { } // Hack
|
||||
namespace slow {} // Hack
|
||||
|
||||
export = slow;
|
||||
}
|
||||
|
||||
65
src/@types/webfinger.js.d.ts
vendored
65
src/@types/webfinger.js.d.ts
vendored
@@ -1,65 +0,0 @@
|
||||
declare module 'webfinger.js' {
|
||||
interface IWebFingerConstructorConfig {
|
||||
tls_only?: boolean;
|
||||
webfist_fallback?: boolean;
|
||||
uri_fallback?: boolean;
|
||||
request_timeout?: number;
|
||||
}
|
||||
|
||||
type JRDProperties = { [type: string]: string };
|
||||
|
||||
interface IJRDLink {
|
||||
rel: string;
|
||||
type?: string;
|
||||
href?: string;
|
||||
template?: string;
|
||||
titles?: { [lang: string]: string };
|
||||
properties?: JRDProperties;
|
||||
}
|
||||
|
||||
interface IJRD {
|
||||
subject?: string;
|
||||
expires?: Date;
|
||||
aliases?: string[];
|
||||
properties?: JRDProperties;
|
||||
links?: IJRDLink[];
|
||||
}
|
||||
|
||||
interface IIDXLinks {
|
||||
'avatar': IJRDLink[];
|
||||
'remotestorage': IJRDLink[];
|
||||
'blog': IJRDLink[];
|
||||
'vcard': IJRDLink[];
|
||||
'updates': IJRDLink[];
|
||||
'share': IJRDLink[];
|
||||
'profile': IJRDLink[];
|
||||
'webfist': IJRDLink[];
|
||||
'camlistore': IJRDLink[];
|
||||
[type: string]: IJRDLink[];
|
||||
}
|
||||
|
||||
interface IIDXProperties {
|
||||
'name': string;
|
||||
[type: string]: string;
|
||||
}
|
||||
|
||||
interface IIDX {
|
||||
links: IIDXLinks;
|
||||
properties: IIDXProperties;
|
||||
}
|
||||
|
||||
interface ILookupCallbackResult {
|
||||
object: IJRD;
|
||||
json: string;
|
||||
idx: IIDX;
|
||||
}
|
||||
|
||||
type LookupCallback = (err: Error | string, result?: ILookupCallbackResult) => void;
|
||||
|
||||
export class WebFinger {
|
||||
constructor(config?: IWebFingerConstructorConfig);
|
||||
|
||||
public lookup(address: string, cb: LookupCallback): NodeJS.Timeout;
|
||||
public lookupLink(address: string, rel: string, cb: IJRDLink): void;
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,7 @@ program
|
||||
.version(pkg.version)
|
||||
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
|
||||
.option('--disable-clustering', 'Disable clustering')
|
||||
.option('--disable-queue', 'Disable job queue processing')
|
||||
.option('--only-server', 'Run server only (without job queue)')
|
||||
.option('--only-server', 'Run server only (without job queue processing)')
|
||||
.option('--only-queue', 'Pocessing job queue only (without server)')
|
||||
.option('--quiet', 'Suppress all logs')
|
||||
.option('--verbose', 'Enable all logs')
|
||||
@@ -15,7 +14,9 @@ program
|
||||
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
|
||||
.parse(process.argv);
|
||||
|
||||
/*if (process.env.MK_DISABLE_QUEUE)*/ program.disableQueue = true;
|
||||
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
||||
if (process.env.NODE_ENV === 'test') program.disableClustering = true;
|
||||
if (process.env.NODE_ENV === 'test') program.quiet = true;
|
||||
if (process.env.NODE_ENV === 'test') program.noDaemons = true;
|
||||
|
||||
export { program };
|
||||
|
||||
77
src/boot/index.ts
Normal file
77
src/boot/index.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
import * as cluster from 'cluster';
|
||||
import chalk from 'chalk';
|
||||
import Xev from 'xev';
|
||||
|
||||
import Logger from '../services/logger';
|
||||
import { program } from '../argv';
|
||||
|
||||
// for typeorm
|
||||
import 'reflect-metadata';
|
||||
import { masterMain } from './master';
|
||||
import { workerMain } from './worker';
|
||||
|
||||
const logger = new Logger('core', 'cyan');
|
||||
const clusterLogger = logger.createSubLogger('cluster', 'orange', false);
|
||||
const ev = new Xev();
|
||||
|
||||
/**
|
||||
* Init process
|
||||
*/
|
||||
export default async function() {
|
||||
process.title = `Misskey (${cluster.isMaster ? 'master' : 'worker'})`;
|
||||
|
||||
if (cluster.isMaster || program.disableClustering) {
|
||||
await masterMain();
|
||||
|
||||
if (cluster.isMaster) {
|
||||
ev.mount();
|
||||
}
|
||||
}
|
||||
|
||||
if (cluster.isWorker || program.disableClustering) {
|
||||
await workerMain();
|
||||
}
|
||||
|
||||
// ユニットテスト時にMisskeyが子プロセスで起動された時のため
|
||||
// それ以外のときは process.send は使えないので弾く
|
||||
if (process.send) {
|
||||
process.send('ok');
|
||||
}
|
||||
}
|
||||
|
||||
//#region Events
|
||||
|
||||
// Listen new workers
|
||||
cluster.on('fork', worker => {
|
||||
clusterLogger.debug(`Process forked: [${worker.id}]`);
|
||||
});
|
||||
|
||||
// Listen online workers
|
||||
cluster.on('online', worker => {
|
||||
clusterLogger.debug(`Process is now online: [${worker.id}]`);
|
||||
});
|
||||
|
||||
// Listen for dying workers
|
||||
cluster.on('exit', worker => {
|
||||
// Replace the dead worker,
|
||||
// we're not sentimental
|
||||
clusterLogger.error(chalk.red(`[${worker.id}] died :(`));
|
||||
cluster.fork();
|
||||
});
|
||||
|
||||
// Display detail of unhandled promise rejection
|
||||
if (!program.quiet) {
|
||||
process.on('unhandledRejection', console.dir);
|
||||
}
|
||||
|
||||
// Display detail of uncaught exception
|
||||
process.on('uncaughtException', err => {
|
||||
logger.error(err);
|
||||
});
|
||||
|
||||
// Dying away...
|
||||
process.on('exit', code => {
|
||||
logger.info(`The process is going to exit with code ${code}`);
|
||||
});
|
||||
|
||||
//#endregion
|
||||
176
src/boot/master.ts
Normal file
176
src/boot/master.ts
Normal file
@@ -0,0 +1,176 @@
|
||||
import * as os from 'os';
|
||||
import * as cluster from 'cluster';
|
||||
import chalk from 'chalk';
|
||||
import * as portscanner from 'portscanner';
|
||||
import * as isRoot from 'is-root';
|
||||
|
||||
import Logger from '../services/logger';
|
||||
import loadConfig from '../config/load';
|
||||
import { Config } from '../config/types';
|
||||
import { lessThan } from '../prelude/array';
|
||||
import * as pkg from '../../package.json';
|
||||
import { program } from '../argv';
|
||||
import { showMachineInfo } from '../misc/show-machine-info';
|
||||
import { initDb } from '../db/postgre';
|
||||
|
||||
const logger = new Logger('core', 'cyan');
|
||||
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
|
||||
|
||||
function greet() {
|
||||
if (!program.quiet) {
|
||||
//#region Misskey logo
|
||||
const v = `v${pkg.version}`;
|
||||
console.log(' _____ _ _ ');
|
||||
console.log(' | |_|___ ___| |_ ___ _ _ ');
|
||||
console.log(' | | | | |_ -|_ -| \'_| -_| | |');
|
||||
console.log(' |_|_|_|_|___|___|_,_|___|_ |');
|
||||
console.log(' ' + chalk.gray(v) + (' |___|\n'.substr(v.length)));
|
||||
//#endregion
|
||||
|
||||
console.log(' Misskey is maintained by @syuilo, @AyaMorisawa, @mei23, @acid-chicken, and @rinsuki.');
|
||||
console.log(chalk.keyword('orange')(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
|
||||
|
||||
console.log('');
|
||||
console.log(chalk`< ${os.hostname()} {gray (PID: ${process.pid.toString()})} >`);
|
||||
}
|
||||
|
||||
bootLogger.info('Welcome to Misskey!');
|
||||
bootLogger.info(`Misskey v${pkg.version}`, null, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Init master process
|
||||
*/
|
||||
export async function masterMain() {
|
||||
greet();
|
||||
|
||||
let config!: Config;
|
||||
|
||||
try {
|
||||
// initialize app
|
||||
config = await init();
|
||||
|
||||
if (config.port == null || Number.isNaN(config.port)) {
|
||||
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (process.platform === 'linux' && isWellKnownPort(config.port) && !isRoot()) {
|
||||
bootLogger.error('You need root privileges to listen on well-known port on Linux', null, true);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (!await isPortAvailable(config.port)) {
|
||||
bootLogger.error(`Port ${config.port} is already in use`, null, true);
|
||||
process.exit(1);
|
||||
}
|
||||
} catch (e) {
|
||||
bootLogger.error('Fatal error occurred during initialization', null, true);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
bootLogger.succ('Misskey initialized');
|
||||
|
||||
if (!program.disableClustering) {
|
||||
await spawnWorkers(config.clusterLimit);
|
||||
}
|
||||
|
||||
if (!program.noDaemons) {
|
||||
require('../daemons/server-stats').default();
|
||||
require('../daemons/notes-stats').default();
|
||||
require('../daemons/queue-stats').default();
|
||||
}
|
||||
|
||||
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
|
||||
}
|
||||
|
||||
const runningNodejsVersion = process.version.slice(1).split('.').map(x => parseInt(x, 10));
|
||||
const requiredNodejsVersion = [11, 7, 0];
|
||||
const satisfyNodejsVersion = !lessThan(runningNodejsVersion, requiredNodejsVersion);
|
||||
|
||||
function isWellKnownPort(port: number): boolean {
|
||||
return port < 1024;
|
||||
}
|
||||
|
||||
async function isPortAvailable(port: number): Promise<boolean> {
|
||||
return await portscanner.checkPortStatus(port, '127.0.0.1') === 'closed';
|
||||
}
|
||||
|
||||
function showEnvironment(): void {
|
||||
const env = process.env.NODE_ENV;
|
||||
const logger = bootLogger.createSubLogger('env');
|
||||
logger.info(typeof env == 'undefined' ? 'NODE_ENV is not set' : `NODE_ENV: ${env}`);
|
||||
|
||||
if (env !== 'production') {
|
||||
logger.warn('The environment is not in production mode.');
|
||||
logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!', null, true);
|
||||
}
|
||||
|
||||
logger.info(`You ${isRoot() ? '' : 'do not '}have root privileges`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Init app
|
||||
*/
|
||||
async function init(): Promise<Config> {
|
||||
showEnvironment();
|
||||
|
||||
const nodejsLogger = bootLogger.createSubLogger('nodejs');
|
||||
|
||||
nodejsLogger.info(`Version ${runningNodejsVersion.join('.')}`);
|
||||
|
||||
if (!satisfyNodejsVersion) {
|
||||
nodejsLogger.error(`Node.js version is less than ${requiredNodejsVersion.join('.')}. Please upgrade it.`, null, true);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
await showMachineInfo(bootLogger);
|
||||
|
||||
const configLogger = bootLogger.createSubLogger('config');
|
||||
let config;
|
||||
|
||||
try {
|
||||
config = loadConfig();
|
||||
} catch (exception) {
|
||||
if (typeof exception === 'string') {
|
||||
configLogger.error(exception);
|
||||
process.exit(1);
|
||||
}
|
||||
if (exception.code === 'ENOENT') {
|
||||
configLogger.error('Configuration file not found', null, true);
|
||||
process.exit(1);
|
||||
}
|
||||
throw exception;
|
||||
}
|
||||
|
||||
configLogger.succ('Loaded');
|
||||
|
||||
// Try to connect to DB
|
||||
try {
|
||||
bootLogger.info('Connecting database...');
|
||||
await initDb();
|
||||
} catch (e) {
|
||||
bootLogger.error('Cannot connect to database', null, true);
|
||||
bootLogger.error(e);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
async function spawnWorkers(limit: number = Infinity) {
|
||||
const workers = Math.min(limit, os.cpus().length);
|
||||
bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
|
||||
await Promise.all([...Array(workers)].map(spawnWorker));
|
||||
bootLogger.succ('All workers started');
|
||||
}
|
||||
|
||||
function spawnWorker(): Promise<void> {
|
||||
return new Promise(res => {
|
||||
const worker = cluster.fork();
|
||||
worker.on('message', message => {
|
||||
if (message !== 'ready') return;
|
||||
res();
|
||||
});
|
||||
});
|
||||
}
|
||||
20
src/boot/worker.ts
Normal file
20
src/boot/worker.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import * as cluster from 'cluster';
|
||||
import { initDb } from '../db/postgre';
|
||||
|
||||
/**
|
||||
* Init worker process
|
||||
*/
|
||||
export async function workerMain() {
|
||||
await initDb();
|
||||
|
||||
// start server
|
||||
await require('../server').default();
|
||||
|
||||
// start job queue
|
||||
require('../queue').default();
|
||||
|
||||
if (cluster.isWorker) {
|
||||
// Send a 'ready' message to parent process
|
||||
process.send!('ready');
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title><fa icon="broadcast-tower"/> {{ $t('announcements') }}</template>
|
||||
<template #title><fa :icon="faBroadcastTower"/> {{ $t('announcements') }}</template>
|
||||
<section v-for="(announcement, i) in announcements" class="fit-top">
|
||||
<ui-input v-model="announcement.title" @change="save">
|
||||
<span>{{ $t('title') }}</span>
|
||||
@@ -9,13 +9,16 @@
|
||||
<ui-textarea v-model="announcement.text">
|
||||
<span>{{ $t('text') }}</span>
|
||||
</ui-textarea>
|
||||
<ui-input v-model="announcement.image">
|
||||
<span>{{ $t('image-url') }}</span>
|
||||
</ui-input>
|
||||
<ui-horizon-group class="fit-bottom">
|
||||
<ui-button @click="save()"><fa :icon="['far', 'save']"/> {{ $t('save') }}</ui-button>
|
||||
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> {{ $t('remove') }}</ui-button>
|
||||
</ui-horizon-group>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="add"><fa icon="plus"/> {{ $t('add') }}</ui-button>
|
||||
<ui-button @click="add"><fa :icon="faPlus"/> {{ $t('add') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
@@ -24,12 +27,14 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { faBroadcastTower, faPlus } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/announcements.vue'),
|
||||
data() {
|
||||
return {
|
||||
announcements: [],
|
||||
faBroadcastTower, faPlus
|
||||
};
|
||||
},
|
||||
|
||||
@@ -43,7 +48,8 @@ export default Vue.extend({
|
||||
add() {
|
||||
this.announcements.unshift({
|
||||
title: '',
|
||||
text: ''
|
||||
text: '',
|
||||
image: null
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -181,7 +181,12 @@ export default Vue.extend({
|
||||
},
|
||||
grid: {
|
||||
clipMarkers: false,
|
||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||
xaxis: {
|
||||
lines: {
|
||||
show: true,
|
||||
}
|
||||
},
|
||||
},
|
||||
stroke: {
|
||||
curve: 'straight',
|
||||
@@ -240,6 +245,7 @@ export default Vue.extend({
|
||||
federationInstancesChart(total: boolean): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'Instances',
|
||||
data: this.format(total
|
||||
? this.stats.federation.instance.total
|
||||
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
||||
196
src/client/app/admin/views/dashboard.queue-charts.vue
Normal file
196
src/client/app/admin/views/dashboard.queue-charts.vue
Normal file
@@ -0,0 +1,196 @@
|
||||
<template>
|
||||
<div class="mzxlfysy">
|
||||
<div>
|
||||
<header>
|
||||
<span><fa :icon="faInbox"/> In</span>
|
||||
<span v-if="latestStats">{{ latestStats.inbox.activeSincePrevTick | number }} / {{ latestStats.inbox.delayed | number }}</span>
|
||||
</header>
|
||||
<div ref="in"></div>
|
||||
</div>
|
||||
<div>
|
||||
<header>
|
||||
<span><fa :icon="faPaperPlane"/> Out</span>
|
||||
<span v-if="latestStats">{{ latestStats.deliver.activeSincePrevTick | number }} / {{ latestStats.deliver.delayed | number }}</span>
|
||||
</header>
|
||||
<div ref="out"></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { faInbox } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||
import ApexCharts from 'apexcharts';
|
||||
|
||||
const limit = 150;
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
stats: [],
|
||||
inChart: null,
|
||||
outChart: null,
|
||||
faInbox, faPaperPlane
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
latestStats(): any {
|
||||
return this.stats[this.stats.length - 1];
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
stats(stats) {
|
||||
this.inChart.updateSeries([{
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.activeSincePrevTick }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.active }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.waiting }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.delayed }))
|
||||
}]);
|
||||
this.outChart.updateSeries([{
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.activeSincePrevTick }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.active }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.waiting }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.delayed }))
|
||||
}]);
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
const chartOpts = {
|
||||
chart: {
|
||||
type: 'area',
|
||||
height: 200,
|
||||
animations: {
|
||||
dynamicAnimation: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
toolbar: {
|
||||
show: false
|
||||
},
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false
|
||||
},
|
||||
grid: {
|
||||
clipMarkers: false,
|
||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||
},
|
||||
stroke: {
|
||||
curve: 'straight',
|
||||
width: 2
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
legend: {
|
||||
show: false
|
||||
},
|
||||
colors: ['#00E396', '#00BCD4', '#FFB300', '#e53935'],
|
||||
series: [{ data: [] }, { data: [] }, { data: [] }, { data: [] }] as any,
|
||||
xaxis: {
|
||||
type: 'numeric',
|
||||
labels: {
|
||||
show: false
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
show: false,
|
||||
min: 0,
|
||||
}
|
||||
};
|
||||
|
||||
this.inChart = new ApexCharts(this.$refs.in, chartOpts);
|
||||
this.outChart = new ApexCharts(this.$refs.out, chartOpts);
|
||||
|
||||
this.inChart.render();
|
||||
this.outChart.render();
|
||||
|
||||
const connection = this.$root.stream.useSharedConnection('queueStats');
|
||||
connection.on('stats', this.onStats);
|
||||
connection.on('statsLog', this.onStatsLog);
|
||||
connection.send('requestLog', {
|
||||
id: Math.random().toString().substr(2, 8),
|
||||
length: limit
|
||||
});
|
||||
|
||||
this.$once('hook:beforeDestroy', () => {
|
||||
connection.dispose();
|
||||
this.inChart.destroy();
|
||||
this.outChart.destroy();
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
onStats(stats) {
|
||||
this.stats.push(stats);
|
||||
if (this.stats.length > limit) this.stats.shift();
|
||||
},
|
||||
|
||||
onStatsLog(statsLog) {
|
||||
for (const stats of statsLog.reverse()) {
|
||||
this.onStats(stats);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mzxlfysy
|
||||
display flex
|
||||
|
||||
> div
|
||||
display block
|
||||
flex 1
|
||||
padding 20px 12px 0 12px
|
||||
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
|
||||
&:first-child
|
||||
margin-right 16px
|
||||
|
||||
> header
|
||||
display flex
|
||||
padding 0 8px
|
||||
margin-bottom -16px
|
||||
color var(--adminDashboardCardFg)
|
||||
font-size 14px
|
||||
|
||||
> span
|
||||
&:last-child
|
||||
margin-left auto
|
||||
opacity 0.7
|
||||
|
||||
> span
|
||||
opacity 0.7
|
||||
|
||||
> div
|
||||
margin-bottom -10px
|
||||
|
||||
@media (max-width 1000px)
|
||||
display block
|
||||
margin-bottom 26px
|
||||
|
||||
> div
|
||||
&:first-child
|
||||
margin-right 0
|
||||
margin-bottom 26px
|
||||
|
||||
</style>
|
||||
@@ -73,6 +73,10 @@
|
||||
<x-charts ref="charts"/>
|
||||
</div>
|
||||
|
||||
<div class="queue">
|
||||
<x-queue/>
|
||||
</div>
|
||||
|
||||
<div class="cpu-memory">
|
||||
<x-cpu-memory :connection="connection"/>
|
||||
</div>
|
||||
@@ -86,9 +90,10 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import XCpuMemory from "./cpu-memory.vue";
|
||||
import XCharts from "./charts.vue";
|
||||
import XApLog from "./ap-log.vue";
|
||||
import XCpuMemory from "./dashboard.cpu-memory.vue";
|
||||
import XQueue from "./dashboard.queue-charts.vue";
|
||||
import XCharts from "./dashboard.charts.vue";
|
||||
import XApLog from "./dashboard.ap-log.vue";
|
||||
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||
import MarqueeText from 'vue-marquee-text-component';
|
||||
import randomColor from 'randomcolor';
|
||||
@@ -98,6 +103,7 @@ export default Vue.extend({
|
||||
|
||||
components: {
|
||||
XCpuMemory,
|
||||
XQueue,
|
||||
XCharts,
|
||||
XApLog,
|
||||
MarqueeText
|
||||
@@ -118,7 +124,7 @@ export default Vue.extend({
|
||||
this.connection = this.$root.stream.useSharedConnection('serverStats');
|
||||
|
||||
this.updateStats();
|
||||
this.clock = setInterval(this.updateStats, 1000);
|
||||
this.clock = setInterval(this.updateStats, 3000);
|
||||
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.meta = meta;
|
||||
@@ -274,6 +280,9 @@ export default Vue.extend({
|
||||
> .charts
|
||||
margin-bottom 16px
|
||||
|
||||
> .queue
|
||||
margin-bottom 16px
|
||||
|
||||
> .cpu-memory
|
||||
margin-bottom 16px
|
||||
|
||||
|
||||
39
src/client/app/admin/views/db.vue
Normal file
39
src/client/app/admin/views/db.vue
Normal file
@@ -0,0 +1,39 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faDatabase"/> {{ $t('tables') }}</template>
|
||||
<section v-if="tables">
|
||||
<div v-for="table in Object.keys(tables)"><b>{{ table }}</b> {{ tables[table].count | number }} {{ tables[table].size | bytes }}</div>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/db.vue'),
|
||||
|
||||
data() {
|
||||
return {
|
||||
tables: null,
|
||||
faDatabase
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.fetch();
|
||||
},
|
||||
|
||||
methods: {
|
||||
fetch() {
|
||||
this.$root.api('admin/get-table-stats').then(tables => {
|
||||
this.tables = tables;
|
||||
});
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -14,6 +14,10 @@
|
||||
<ui-button @click="show()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||
<ui-textarea v-if="file" :value="file | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="cleanUp()"><fa :icon="faTrashAlt"/> {{ $t('clean-up') }}</ui-button>
|
||||
<ui-button @click="cleanRemoteFiles()"><fa :icon="faTrashAlt"/> {{ $t('clean-remote-files') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
@@ -38,7 +42,7 @@
|
||||
<div class="kidvdlkg" v-for="file in files">
|
||||
<div @click="file._open = !file._open">
|
||||
<div>
|
||||
<div class="thumbnail" :style="thumbnail(file)"></div>
|
||||
<x-file-thumbnail class="thumbnail" :file="file" fit="contain" @click="showFileMenu(file)"/>
|
||||
</div>
|
||||
<div>
|
||||
<header>
|
||||
@@ -48,7 +52,7 @@
|
||||
<div>
|
||||
<div>
|
||||
<span style="margin-right:16px;">{{ file.type }}</span>
|
||||
<span>{{ file.datasize | bytes }}</span>
|
||||
<span>{{ file.size | bytes }}</span>
|
||||
</div>
|
||||
<div><mk-time :time="file.createdAt" mode="detail"/></div>
|
||||
</div>
|
||||
@@ -75,10 +79,15 @@ import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { faCloud, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faTrashAlt, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
||||
import XFileThumbnail from '../../common/views/components/drive-file-thumbnail.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/drive.vue'),
|
||||
|
||||
components: {
|
||||
XFileThumbnail
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
file: null,
|
||||
@@ -151,13 +160,6 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
thumbnail(file: any): any {
|
||||
return {
|
||||
'background-color': file.properties.avgColor && file.properties.avgColor.length == 3 ? `rgb(${file.properties.avgColor.join(',')})` : 'transparent',
|
||||
'background-image': `url(${file.thumbnailUrl})`
|
||||
};
|
||||
},
|
||||
|
||||
async del(file: any) {
|
||||
const process = async () => {
|
||||
await this.$root.api('drive/files/delete', { fileId: file.id });
|
||||
@@ -179,9 +181,9 @@ export default Vue.extend({
|
||||
this.$root.api('drive/files/update', {
|
||||
fileId: file.id,
|
||||
isSensitive: !file.isSensitive
|
||||
}).then(() => {
|
||||
file.isSensitive = !file.isSensitive;
|
||||
});
|
||||
|
||||
file.isSensitive = !file.isSensitive;
|
||||
},
|
||||
|
||||
async show() {
|
||||
@@ -229,6 +231,29 @@ export default Vue.extend({
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
cleanRemoteFiles() {
|
||||
this.$root.dialog({
|
||||
type: 'warning',
|
||||
text: this.$t('clean-remote-files-are-you-sure'),
|
||||
showCancelButton: true
|
||||
}).then(({ canceled }) => {
|
||||
if (canceled) return;
|
||||
this.$root.api('admin/drive/clean-remote-files');
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
cleanUp() {
|
||||
this.$root.api('admin/drive/cleanup');
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -244,7 +269,7 @@ export default Vue.extend({
|
||||
|
||||
> div:nth-child(1)
|
||||
> .thumbnail
|
||||
display block
|
||||
display flex
|
||||
width 64px
|
||||
height 64px
|
||||
background-size cover
|
||||
|
||||
@@ -1,45 +1,59 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faTerminal"/> {{ $t('federation') }}</template>
|
||||
<template #title><fa :icon="faTerminal"/> {{ $t('instance') }}</template>
|
||||
<section class="fit-top">
|
||||
<ui-input class="target" v-model="target" type="text" @enter="showInstance()">
|
||||
<span>{{ $t('host') }}</span>
|
||||
<template #prefix><fa :icon="faServer"/></template>
|
||||
</ui-input>
|
||||
<ui-button @click="showInstance()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||
|
||||
<div class="instance" v-if="instance">
|
||||
<ui-input :value="instance.host" type="text" readonly>
|
||||
<span>{{ $t('host') }}</span>
|
||||
</ui-input>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input :value="instance.host" type="text" readonly>
|
||||
<span>{{ $t('host') }}</span>
|
||||
<template #prefix><fa :icon="faServer"/></template>
|
||||
</ui-input>
|
||||
<ui-input :value="instance.caughtAt | date" type="text" readonly>
|
||||
<span>{{ $t('caught-at') }}</span>
|
||||
<template #prefix><fa :icon="faCrosshairs"/></template>
|
||||
</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input :value="instance.notesCount | number" type="text" readonly>
|
||||
<span>{{ $t('notes') }}</span>
|
||||
<template #prefix><fa :icon="faEnvelopeOpenText"/></template>
|
||||
</ui-input>
|
||||
<ui-input :value="instance.usersCount | number" type="text" readonly>
|
||||
<span>{{ $t('users') }}</span>
|
||||
<template #prefix><fa :icon="faUsers"/></template>
|
||||
</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input :value="instance.followingCount | number" type="text" readonly>
|
||||
<span>{{ $t('following') }}</span>
|
||||
<template #prefix><fa :icon="faCaretDown"/></template>
|
||||
</ui-input>
|
||||
<ui-input :value="instance.followersCount | number" type="text" readonly>
|
||||
<span>{{ $t('followers') }}</span>
|
||||
<template #prefix><fa :icon="faCaretUp"/></template>
|
||||
</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input :value="instance.latestRequestSentAt" type="text" readonly>
|
||||
<ui-input :value="instance.latestRequestSentAt | date" type="text" readonly>
|
||||
<span>{{ $t('latest-request-sent-at') }}</span>
|
||||
<template #prefix><fa :icon="faPaperPlane"/></template>
|
||||
</ui-input>
|
||||
<ui-input :value="instance.latestStatus" type="text" readonly>
|
||||
<span>{{ $t('status') }}</span>
|
||||
<template #prefix><fa :icon="faTrafficLight"/></template>
|
||||
</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-input :value="instance.latestRequestReceivedAt" type="text" readonly>
|
||||
<ui-input :value="instance.latestRequestReceivedAt | date" type="text" readonly>
|
||||
<span>{{ $t('latest-request-received-at') }}</span>
|
||||
<template #prefix><fa :icon="faInbox"/></template>
|
||||
</ui-input>
|
||||
<ui-switch v-model="instance.isBlocked" @change="updateInstance()">{{ $t('block') }}</ui-switch>
|
||||
<ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()">{{ $t('marked-as-closed') }}</ui-switch>
|
||||
<details>
|
||||
<summary>{{ $t('charts') }}</summary>
|
||||
@@ -64,6 +78,10 @@
|
||||
</ui-horizon-group>
|
||||
<div ref="chart"></div>
|
||||
</details>
|
||||
<details>
|
||||
<summary>{{ $t('delete-all-files') }}</summary>
|
||||
<ui-button @click="deleteAllFiles()" style="margin-top: 16px;"><fa :icon="faTrashAlt"/> {{ $t('delete-all-files') }}</ui-button>
|
||||
</details>
|
||||
<details>
|
||||
<summary>{{ $t('remove-all-following') }}</summary>
|
||||
<ui-button @click="removeAllFollowing()" style="margin-top: 16px;"><fa :icon="faMinusCircle"/> {{ $t('remove-all-following') }}</ui-button>
|
||||
@@ -115,7 +133,7 @@
|
||||
<span>{{ $t('status') }}</span>
|
||||
</header>
|
||||
<div v-for="instance in instances" :style="{ opacity: instance.isNotResponding ? 0.5 : 1 }">
|
||||
<a @click.prevent="showInstance(instance.host)" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
|
||||
<a @click.prevent="showInstance(instance.host)" rel="nofollow noopener" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
|
||||
<span>{{ instance.notesCount | number }}</span>
|
||||
<span>{{ instance.usersCount | number }}</span>
|
||||
<span>{{ instance.followingCount | number }}</span>
|
||||
@@ -127,13 +145,24 @@
|
||||
<ui-info v-if="instances.length == limit">{{ $t('result-is-truncated', { n: limit }) }}</ui-info>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faBan"/> {{ $t('blocked-hosts') }}</template>
|
||||
<section class="fit-top">
|
||||
<ui-textarea v-model="blockedHosts">
|
||||
<template #desc>{{ $t('blocked-hosts-info') }}</template>
|
||||
</ui-textarea>
|
||||
<ui-button @click="saveBlockedHosts">{{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { faGlobe, faTerminal, faSearch, faMinusCircle, faServer } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||
import { faTrashAlt, faBan, faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faTrafficLight, faInbox } from '@fortawesome/free-solid-svg-icons';
|
||||
import ApexCharts from 'apexcharts';
|
||||
import * as tinycolor from 'tinycolor2';
|
||||
|
||||
@@ -144,19 +173,24 @@ const negate = arr => arr.map(x => -x);
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/federation.vue'),
|
||||
|
||||
filters: {
|
||||
date: v => v ? new Date(v).toLocaleString() : 'N/A'
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
instance: null,
|
||||
target: null,
|
||||
sort: '+lastCommunicatedAt',
|
||||
state: 'all',
|
||||
limit: 50,
|
||||
limit: 100,
|
||||
instances: [],
|
||||
chart: null,
|
||||
chartSrc: 'requests',
|
||||
chartSpan: 'hour',
|
||||
chartInstance: null,
|
||||
faGlobe, faTerminal, faSearch, faMinusCircle, faServer
|
||||
blockedHosts: '',
|
||||
faTrashAlt, faBan, faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
|
||||
};
|
||||
},
|
||||
|
||||
@@ -226,6 +260,10 @@ export default Vue.extend({
|
||||
|
||||
mounted() {
|
||||
this.fetchInstances();
|
||||
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.blockedHosts = meta.blockedHosts.join('\n');
|
||||
});
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
@@ -273,6 +311,17 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
deleteAllFiles() {
|
||||
this.$root.api('admin/federation/delete-all-files', {
|
||||
host: this.instance.host
|
||||
}).then(() => {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
updateInstance() {
|
||||
this.$root.api('admin/federation/update-instance', {
|
||||
host: this.instance.host,
|
||||
@@ -457,6 +506,22 @@ export default Vue.extend({
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
saveBlockedHosts() {
|
||||
this.$root.api('admin/update-meta', {
|
||||
blockedHosts: this.blockedHosts.split('\n')
|
||||
}).then(() => {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('saved')
|
||||
});
|
||||
}).catch(e => {
|
||||
this.$root.dialog({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title>{{ $t('hided-tags') }}</template>
|
||||
<section>
|
||||
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
|
||||
<ui-button @click="save">{{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/hashtags.vue'),
|
||||
data() {
|
||||
return {
|
||||
hidedTags: '',
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.hidedTags = meta.hidedTags.join('\n');
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
save() {
|
||||
this.$root.api('admin/update-meta', {
|
||||
hidedTags: this.hidedTags.split('\n')
|
||||
}).then(() => {
|
||||
//this.$root.os.apis.dialog({ text: `Saved` });
|
||||
}).catch(e => {
|
||||
//this.$root.os.apis.dialog({ text: `Failed ${e}` });
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -22,13 +22,13 @@
|
||||
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
||||
<li @click="nav('queue')" :class="{ active: page == 'queue' }"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</li>
|
||||
<li @click="nav('logs')" :class="{ active: page == 'logs' }"><fa :icon="faStream" fixed-width/>{{ $t('logs') }}</li>
|
||||
<li @click="nav('db')" :class="{ active: page == 'db' }"><fa :icon="faDatabase" fixed-width/>{{ $t('db') }}</li>
|
||||
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
|
||||
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
|
||||
<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
|
||||
<li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</li>
|
||||
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
|
||||
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
|
||||
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
|
||||
<li @click="nav('abuse')" :class="{ active: page == 'abuse' }"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</li>
|
||||
</ul>
|
||||
<div class="back-to-misskey">
|
||||
@@ -44,11 +44,11 @@
|
||||
<div v-if="page == 'instance'"><x-instance/></div>
|
||||
<div v-if="page == 'queue'"><x-queue/></div>
|
||||
<div v-if="page == 'logs'"><x-logs/></div>
|
||||
<div v-if="page == 'db'"><x-db/></div>
|
||||
<div v-if="page == 'moderators'"><x-moderators/></div>
|
||||
<div v-if="page == 'users'"><x-users/></div>
|
||||
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
||||
<div v-if="page == 'drive'"><x-drive/></div>
|
||||
<div v-if="page == 'federation'"><x-federation/></div>
|
||||
<div v-if="page == 'abuse'"><x-abuse/></div>
|
||||
@@ -61,20 +61,20 @@
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { version } from '../../config';
|
||||
import XDashboard from "./dashboard.vue";
|
||||
import XInstance from "./instance.vue";
|
||||
import XQueue from "./queue.vue";
|
||||
import XLogs from "./logs.vue";
|
||||
import XModerators from "./moderators.vue";
|
||||
import XEmoji from "./emoji.vue";
|
||||
import XAnnouncements from "./announcements.vue";
|
||||
import XHashtags from "./hashtags.vue";
|
||||
import XUsers from "./users.vue";
|
||||
import XDrive from "./drive.vue";
|
||||
import XAbuse from "./abuse.vue";
|
||||
import XFederation from "./federation.vue";
|
||||
import XDashboard from './dashboard.vue';
|
||||
import XInstance from './instance.vue';
|
||||
import XQueue from './queue.vue';
|
||||
import XLogs from './logs.vue';
|
||||
import XDb from './db.vue';
|
||||
import XModerators from './moderators.vue';
|
||||
import XEmoji from './emoji.vue';
|
||||
import XAnnouncements from './announcements.vue';
|
||||
import XUsers from './users.vue';
|
||||
import XDrive from './drive.vue';
|
||||
import XAbuse from './abuse.vue';
|
||||
import XFederation from './federation.vue';
|
||||
|
||||
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream, faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
// Detect the user agent
|
||||
@@ -88,10 +88,10 @@ export default Vue.extend({
|
||||
XInstance,
|
||||
XQueue,
|
||||
XLogs,
|
||||
XDb,
|
||||
XModerators,
|
||||
XEmoji,
|
||||
XAnnouncements,
|
||||
XHashtags,
|
||||
XUsers,
|
||||
XDrive,
|
||||
XAbuse,
|
||||
@@ -112,7 +112,8 @@ export default Vue.extend({
|
||||
faGlobe,
|
||||
faExclamationCircle,
|
||||
faTasks,
|
||||
faStream
|
||||
faStream,
|
||||
faDatabase,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -2,135 +2,242 @@
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title><fa icon="cog"/> {{ $t('instance') }}</template>
|
||||
<section class="fit-top fit-bottom">
|
||||
<section class="fit-top">
|
||||
<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
|
||||
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
||||
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
||||
<ui-input v-model="iconUrl"><template #icon><fa icon="link"/></template>{{ $t('icon-url') }}</ui-input>
|
||||
<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
|
||||
<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
|
||||
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
|
||||
<ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input>
|
||||
<ui-input v-model="ToSUrl"><template #icon><fa icon="link"/></template>{{ $t('tos-url') }}</ui-input>
|
||||
<details>
|
||||
<summary>{{ $t('advanced-config') }}</summary>
|
||||
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
|
||||
<ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input>
|
||||
<ui-input v-model="repositoryUrl"><template #icon><fa icon="link"/></template>{{ $t('repository-url') }}</ui-input>
|
||||
<ui-input v-model="feedbackUrl"><template #icon><fa icon="link"/></template>{{ $t('feedback-url') }}</ui-input>
|
||||
</details>
|
||||
</section>
|
||||
<section class="fit-bottom">
|
||||
<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
|
||||
<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
|
||||
<ui-input v-model="maintainerEmail" type="email"><template #icon><fa :icon="farEnvelope"/></template>{{ $t('maintainer-email') }}</ui-input>
|
||||
</section>
|
||||
<section>
|
||||
<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
|
||||
<ui-button v-if="disableRegistration" @click="invite">{{ $t('invite') }}</ui-button>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faPencilAlt"/> {{ $t('note-and-tl') }}</template>
|
||||
<section class="fit-top fit-bottom">
|
||||
<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input>
|
||||
</section>
|
||||
<section>
|
||||
<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
|
||||
<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
|
||||
<ui-switch v-model="disableGlobalTimeline">{{ $t('disable-global-timeline') }}</ui-switch>
|
||||
<ui-info>{{ $t('disabling-timelines-info') }}</ui-info>
|
||||
</section>
|
||||
<section class="fit-bottom">
|
||||
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
||||
<section>
|
||||
<ui-switch v-model="enableEmojiReaction">{{ $t('enable-emoji-reaction') }}</ui-switch>
|
||||
<ui-switch v-model="useStarForReactionFallback">{{ $t('use-star-for-reaction-fallback') }}</ui-switch>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa icon="cloud"/> {{ $t('drive-config') }}</template>
|
||||
<section>
|
||||
<ui-switch v-model="useObjectStorage">{{ $t('use-object-storage') }}</ui-switch>
|
||||
<template v-if="useObjectStorage">
|
||||
<ui-info>
|
||||
<i18n path="object-storage-s3-info">
|
||||
<a href="https://docs.aws.amazon.com/general/latest/gr/rande.html" target="_blank">{{ $t('object-storage-s3-info-here') }}</a>
|
||||
</i18n>
|
||||
</ui-info>
|
||||
<ui-info>{{ $t('object-storage-gcs-info') }}</ui-info>
|
||||
<ui-input v-model="objectStorageBaseUrl" :disabled="!useObjectStorage">{{ $t('object-storage-base-url') }}</ui-input>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="objectStorageBucket" :disabled="!useObjectStorage">{{ $t('object-storage-bucket') }}</ui-input>
|
||||
<ui-input v-model="objectStoragePrefix" :disabled="!useObjectStorage">{{ $t('object-storage-prefix') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-input v-model="objectStorageEndpoint" :disabled="!useObjectStorage">{{ $t('object-storage-endpoint') }}</ui-input>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="objectStorageRegion" :disabled="!useObjectStorage">{{ $t('object-storage-region') }}</ui-input>
|
||||
<ui-input v-model="objectStoragePort" type="number" :disabled="!useObjectStorage">{{ $t('object-storage-port') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="objectStorageAccessKey" :disabled="!useObjectStorage"><template #icon><fa icon="key"/></template>{{ $t('object-storage-access-key') }}</ui-input>
|
||||
<ui-input v-model="objectStorageSecretKey" :disabled="!useObjectStorage"><template #icon><fa icon="key"/></template>{{ $t('object-storage-secret-key') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-switch v-model="objectStorageUseSSL" :disabled="!useObjectStorage">{{ $t('object-storage-use-ssl') }}</ui-switch>
|
||||
</template>
|
||||
</section>
|
||||
<section>
|
||||
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
|
||||
</section>
|
||||
<section class="fit-top fit-bottom">
|
||||
<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
|
||||
<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
|
||||
</section>
|
||||
<section class="fit-bottom">
|
||||
<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
|
||||
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
||||
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
|
||||
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
</section>
|
||||
<section>
|
||||
<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faThumbtack"/> {{ $t('pinned-users') }}</template>
|
||||
<section class="fit-top">
|
||||
<ui-textarea v-model="pinnedUsers">
|
||||
<template #desc>{{ $t('pinned-users-info') }}</template>
|
||||
</ui-textarea>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</template>
|
||||
<section>
|
||||
<ui-info>{{ $t('proxy-account-info') }}</ui-info>
|
||||
<ui-input v-model="proxyAccount"><template #prefix>@</template>{{ $t('proxy-account-username') }}<template #desc>{{ $t('proxy-account-username-desc') }}</template></ui-input>
|
||||
<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
|
||||
</section>
|
||||
<section>
|
||||
<header><fa :icon="farEnvelope"/> {{ $t('email-config') }}</header>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="farEnvelope"/> {{ $t('email-config') }}</template>
|
||||
<section>
|
||||
<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<template #desc>{{ $t('email-config-info') }}</template></ui-switch>
|
||||
<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
||||
<ui-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
||||
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
||||
<template v-if="enableEmail">
|
||||
<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
||||
<ui-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
||||
<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
||||
</template>
|
||||
</section>
|
||||
<section>
|
||||
<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</template>
|
||||
<section>
|
||||
<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<template #desc>{{ $t('serviceworker-info') }}</template></ui-switch>
|
||||
<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
|
||||
<ui-horizon-group inputs class="fit-bottom">
|
||||
<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
|
||||
<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<template v-if="enableServiceWorker">
|
||||
<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
|
||||
<ui-horizon-group inputs class="fit-bottom">
|
||||
<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
|
||||
<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
</template>
|
||||
</section>
|
||||
<section>
|
||||
<header>summaly Proxy</header>
|
||||
<ui-input v-model="summalyProxy">URL</ui-input>
|
||||
</section>
|
||||
<section>
|
||||
<header><fa :icon="faUserPlus"/> {{ $t('user-recommendation-config') }}</header>
|
||||
<ui-switch v-model="enableExternalUserRecommendation">{{ $t('enable-external-user-recommendation') }}</ui-switch>
|
||||
<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<template #desc>{{ $t('external-user-recommendation-engine-desc') }}</template></ui-input>
|
||||
<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<template #suffix>ms</template><template #desc>{{ $t('external-user-recommendation-timeout-desc') }}</template></ui-input>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title>{{ $t('invite') }}</template>
|
||||
<template #title><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</template>
|
||||
<section :class="enableRecaptcha ? 'fit-bottom' : ''">
|
||||
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
||||
<template v-if="enableRecaptcha">
|
||||
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
||||
<ui-info warn>{{ $t('recaptcha-info2') }}</ui-info>
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
|
||||
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
</template>
|
||||
</section>
|
||||
<section v-if="enableRecaptcha && recaptchaSiteKey">
|
||||
<header>{{ $t('recaptcha-preview') }}</header>
|
||||
<div ref="recaptcha" style="margin: 16px 0 0 0;" :key="recaptchaSiteKey"></div>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="invite">{{ $t('invite') }}</ui-button>
|
||||
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</template>
|
||||
<template #title><fa :icon="faShieldAlt"/> {{ $t('external-service-integration-config') }}</template>
|
||||
<section>
|
||||
<header><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</header>
|
||||
<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
|
||||
<ui-horizon-group>
|
||||
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
||||
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||
<template v-if="enableTwitterIntegration">
|
||||
<ui-horizon-group>
|
||||
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
||||
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
||||
</template>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</template>
|
||||
<section>
|
||||
<header><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</header>
|
||||
<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
|
||||
<ui-horizon-group>
|
||||
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
|
||||
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||
<template v-if="enableGithubIntegration">
|
||||
<ui-horizon-group>
|
||||
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
|
||||
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
||||
</template>
|
||||
</section>
|
||||
<section>
|
||||
<header><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</header>
|
||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||
<template v-if="enableDiscordIntegration">
|
||||
<ui-horizon-group>
|
||||
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input>
|
||||
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
||||
</template>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template>
|
||||
<section>
|
||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||
<ui-horizon-group>
|
||||
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input>
|
||||
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
<details>
|
||||
<summary style="color:var(--text);">{{ $t('advanced-config') }}</summary>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faHashtag"/> {{ $t('hidden-tags') }}</template>
|
||||
<section class="fit-top">
|
||||
<ui-textarea v-model="hiddenTags">
|
||||
<template #desc>{{ $t('hidden-tags-info') }}</template>
|
||||
</ui-textarea>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title>summaly Proxy</template>
|
||||
<section class="fit-top fit-bottom">
|
||||
<ui-input v-model="summalyProxy">URL</ui-input>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</details>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -139,8 +246,8 @@ import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { url, host } from '../../config';
|
||||
import { toUnicode } from 'punycode';
|
||||
import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons';
|
||||
import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt, faThumbtack, faPencilAlt, faHashtag } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faEnvelope as farEnvelope, faSave } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/instance.vue'),
|
||||
@@ -151,12 +258,18 @@ export default Vue.extend({
|
||||
host: toUnicode(host),
|
||||
maintainerName: null,
|
||||
maintainerEmail: null,
|
||||
ToSUrl: null,
|
||||
repositoryUrl: "https://github.com/syuilo/misskey",
|
||||
feedbackUrl: null,
|
||||
disableRegistration: false,
|
||||
disableLocalTimeline: false,
|
||||
disableGlobalTimeline: false,
|
||||
enableEmojiReaction: true,
|
||||
useStarForReactionFallback: false,
|
||||
mascotImageUrl: null,
|
||||
bannerUrl: null,
|
||||
errorImageUrl: null,
|
||||
iconUrl: null,
|
||||
name: null,
|
||||
description: null,
|
||||
languages: null,
|
||||
@@ -177,10 +290,6 @@ export default Vue.extend({
|
||||
discordClientId: null,
|
||||
discordClientSecret: null,
|
||||
proxyAccount: null,
|
||||
inviteCode: null,
|
||||
enableExternalUserRecommendation: false,
|
||||
externalUserRecommendationEngine: null,
|
||||
externalUserRecommendationTimeout: null,
|
||||
summalyProxy: null,
|
||||
enableEmail: false,
|
||||
email: null,
|
||||
@@ -193,20 +302,38 @@ export default Vue.extend({
|
||||
enableServiceWorker: false,
|
||||
swPublicKey: null,
|
||||
swPrivateKey: null,
|
||||
faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt
|
||||
pinnedUsers: '',
|
||||
hiddenTags: '',
|
||||
useObjectStorage: false,
|
||||
objectStorageBaseUrl: null,
|
||||
objectStorageBucket: null,
|
||||
objectStoragePrefix: null,
|
||||
objectStorageEndpoint: null,
|
||||
objectStorageRegion: null,
|
||||
objectStoragePort: null,
|
||||
objectStorageAccessKey: null,
|
||||
objectStorageSecretKey: null,
|
||||
objectStorageUseSSL: false,
|
||||
faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt, faThumbtack, faPencilAlt, faSave, faHashtag
|
||||
};
|
||||
},
|
||||
|
||||
created() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.maintainerName = meta.maintainer.name;
|
||||
this.maintainerEmail = meta.maintainer.email;
|
||||
this.$root.getMeta(true).then(meta => {
|
||||
this.maintainerName = meta.maintainerName;
|
||||
this.maintainerEmail = meta.maintainerEmail;
|
||||
this.ToSUrl = meta.ToSUrl;
|
||||
this.repositoryUrl = meta.repositoryUrl;
|
||||
this.feedbackUrl = meta.feedbackUrl;
|
||||
this.disableRegistration = meta.disableRegistration;
|
||||
this.disableLocalTimeline = meta.disableLocalTimeline;
|
||||
this.disableGlobalTimeline = meta.disableGlobalTimeline;
|
||||
this.enableEmojiReaction = meta.enableEmojiReaction;
|
||||
this.useStarForReactionFallback = meta.useStarForReactionFallback;
|
||||
this.mascotImageUrl = meta.mascotImageUrl;
|
||||
this.bannerUrl = meta.bannerUrl;
|
||||
this.errorImageUrl = meta.errorImageUrl;
|
||||
this.iconUrl = meta.iconUrl;
|
||||
this.name = meta.name;
|
||||
this.description = meta.description;
|
||||
this.languages = meta.langs.join(' ');
|
||||
@@ -227,9 +354,6 @@ export default Vue.extend({
|
||||
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
||||
this.discordClientId = meta.discordClientId;
|
||||
this.discordClientSecret = meta.discordClientSecret;
|
||||
this.enableExternalUserRecommendation = meta.enableExternalUserRecommendation;
|
||||
this.externalUserRecommendationEngine = meta.externalUserRecommendationEngine;
|
||||
this.externalUserRecommendationTimeout = meta.externalUserRecommendationTimeout;
|
||||
this.summalyProxy = meta.summalyProxy;
|
||||
this.enableEmail = meta.enableEmail;
|
||||
this.email = meta.email;
|
||||
@@ -242,13 +366,56 @@ export default Vue.extend({
|
||||
this.enableServiceWorker = meta.enableServiceWorker;
|
||||
this.swPublicKey = meta.swPublickey;
|
||||
this.swPrivateKey = meta.swPrivateKey;
|
||||
this.pinnedUsers = meta.pinnedUsers.join('\n');
|
||||
this.hiddenTags = meta.hiddenTags.join('\n');
|
||||
this.useObjectStorage = meta.useObjectStorage;
|
||||
this.objectStorageBaseUrl = meta.objectStorageBaseUrl;
|
||||
this.objectStorageBucket = meta.objectStorageBucket;
|
||||
this.objectStoragePrefix = meta.objectStoragePrefix;
|
||||
this.objectStorageEndpoint = meta.objectStorageEndpoint;
|
||||
this.objectStorageRegion = meta.objectStorageRegion;
|
||||
this.objectStoragePort = meta.objectStoragePort;
|
||||
this.objectStorageAccessKey = meta.objectStorageAccessKey;
|
||||
this.objectStorageSecretKey = meta.objectStorageSecretKey;
|
||||
this.objectStorageUseSSL = meta.objectStorageUseSSL;
|
||||
});
|
||||
},
|
||||
|
||||
mounted() {
|
||||
const renderRecaptchaPreview = () => {
|
||||
if (!(window as any).grecaptcha) return;
|
||||
if (!this.$refs.recaptcha) return;
|
||||
if (!this.recaptchaSiteKey) return;
|
||||
(window as any).grecaptcha.render(this.$refs.recaptcha, {
|
||||
sitekey: this.recaptchaSiteKey
|
||||
});
|
||||
};
|
||||
|
||||
window.onRecaotchaLoad = () => {
|
||||
renderRecaptchaPreview();
|
||||
};
|
||||
|
||||
const head = document.getElementsByTagName('head')[0];
|
||||
const script = document.createElement('script');
|
||||
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js?onload=onRecaotchaLoad');
|
||||
head.appendChild(script);
|
||||
|
||||
this.$watch('enableRecaptcha', () => {
|
||||
renderRecaptchaPreview();
|
||||
});
|
||||
|
||||
this.$watch('recaptchaSiteKey', () => {
|
||||
renderRecaptchaPreview();
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
invite() {
|
||||
this.$root.api('admin/invite').then(x => {
|
||||
this.inviteCode = x.code;
|
||||
this.$root.dialog({
|
||||
type: 'info',
|
||||
text: x.code
|
||||
});
|
||||
}).catch(e => {
|
||||
this.$root.dialog({
|
||||
type: 'error',
|
||||
@@ -261,12 +428,18 @@ export default Vue.extend({
|
||||
this.$root.api('admin/update-meta', {
|
||||
maintainerName: this.maintainerName,
|
||||
maintainerEmail: this.maintainerEmail,
|
||||
ToSUrl: this.ToSUrl,
|
||||
repositoryUrl: this.repositoryUrl,
|
||||
feedbackUrl: this.feedbackUrl,
|
||||
disableRegistration: this.disableRegistration,
|
||||
disableLocalTimeline: this.disableLocalTimeline,
|
||||
disableGlobalTimeline: this.disableGlobalTimeline,
|
||||
enableEmojiReaction: this.enableEmojiReaction,
|
||||
useStarForReactionFallback: this.useStarForReactionFallback,
|
||||
mascotImageUrl: this.mascotImageUrl,
|
||||
bannerUrl: this.bannerUrl,
|
||||
errorImageUrl: this.errorImageUrl,
|
||||
iconUrl: this.iconUrl,
|
||||
name: this.name,
|
||||
description: this.description,
|
||||
langs: this.languages.split(' '),
|
||||
@@ -287,9 +460,6 @@ export default Vue.extend({
|
||||
enableDiscordIntegration: this.enableDiscordIntegration,
|
||||
discordClientId: this.discordClientId,
|
||||
discordClientSecret: this.discordClientSecret,
|
||||
enableExternalUserRecommendation: this.enableExternalUserRecommendation,
|
||||
externalUserRecommendationEngine: this.externalUserRecommendationEngine,
|
||||
externalUserRecommendationTimeout: parseInt(this.externalUserRecommendationTimeout, 10),
|
||||
summalyProxy: this.summalyProxy,
|
||||
enableEmail: this.enableEmail,
|
||||
email: this.email,
|
||||
@@ -300,7 +470,19 @@ export default Vue.extend({
|
||||
smtpPass: this.smtpAuth ? this.smtpPass : '',
|
||||
enableServiceWorker: this.enableServiceWorker,
|
||||
swPublicKey: this.swPublicKey,
|
||||
swPrivateKey: this.swPrivateKey
|
||||
swPrivateKey: this.swPrivateKey,
|
||||
pinnedUsers: this.pinnedUsers.split('\n'),
|
||||
hiddenTags: this.hiddenTags.split('\n'),
|
||||
useObjectStorage: this.useObjectStorage,
|
||||
objectStorageBaseUrl: this.objectStorageBaseUrl ? this.objectStorageBaseUrl : null,
|
||||
objectStorageBucket: this.objectStorageBucket ? this.objectStorageBucket : null,
|
||||
objectStoragePrefix: this.objectStoragePrefix ? this.objectStoragePrefix : null,
|
||||
objectStorageEndpoint: this.objectStorageEndpoint ? this.objectStorageEndpoint : null,
|
||||
objectStorageRegion: this.objectStorageRegion ? this.objectStorageRegion : null,
|
||||
objectStoragePort: this.objectStoragePort ? this.objectStoragePort : null,
|
||||
objectStorageAccessKey: this.objectStorageAccessKey ? this.objectStorageAccessKey : null,
|
||||
objectStorageSecretKey: this.objectStorageSecretKey ? this.objectStorageSecretKey : null,
|
||||
objectStorageUseSSL: this.objectStorageUseSSL,
|
||||
}).then(() => {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<template #title><fa :icon="faStream"/> {{ $t('logs') }}</template>
|
||||
<section class="fit-top">
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input v-model="domain" debounce>
|
||||
<ui-input v-model="domain" :debounce="true">
|
||||
<span>{{ $t('domain') }}</span>
|
||||
</ui-input>
|
||||
<ui-select v-model="level">
|
||||
@@ -19,13 +19,15 @@
|
||||
</ui-horizon-group>
|
||||
|
||||
<div class="nqjzuvev">
|
||||
<code v-for="log in logs" :key="log._id" :class="log.level">
|
||||
<code v-for="log in logs" :key="log.id" :class="log.level">
|
||||
<details>
|
||||
<summary><mk-time :time="log.createdAt"/> [{{ log.domain.join('.') }}] {{ log.message }}</summary>
|
||||
<vue-json-pretty v-if="log.data" :data="log.data"></vue-json-pretty>
|
||||
</details>
|
||||
</code>
|
||||
</div>
|
||||
|
||||
<ui-button @click="deleteAll()">{{ $t('delete-all') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
@@ -78,6 +80,15 @@ export default Vue.extend({
|
||||
}).then(logs => {
|
||||
this.logs = logs.reverse();
|
||||
});
|
||||
},
|
||||
|
||||
deleteAll() {
|
||||
this.$root.api('admin/delete-logs').then(() => {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -85,11 +96,10 @@ export default Vue.extend({
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.nqjzuvev
|
||||
white-space nowrap
|
||||
overflow auto
|
||||
padding 8px
|
||||
background #000
|
||||
color #fff
|
||||
font-size 14px
|
||||
|
||||
> code
|
||||
display block
|
||||
|
||||
181
src/client/app/admin/views/queue.chart.vue
Normal file
181
src/client/app/admin/views/queue.chart.vue
Normal file
@@ -0,0 +1,181 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-info warn v-if="latestStats && latestStats.waiting > 0">The queue is jammed.</ui-info>
|
||||
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
||||
<ui-input :value="latestStats.activeSincePrevTick | number" type="text" readonly>
|
||||
<span>Process</span>
|
||||
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
||||
<template #suffix>jobs/tick</template>
|
||||
</ui-input>
|
||||
<ui-input :value="latestStats.active | number" type="text" readonly>
|
||||
<span>Active</span>
|
||||
<template #prefix><fa :icon="farPlayCircle"/></template>
|
||||
<template #suffix>jobs</template>
|
||||
</ui-input>
|
||||
<ui-input :value="latestStats.waiting | number" type="text" readonly>
|
||||
<span>Waiting</span>
|
||||
<template #prefix><fa :icon="faStopCircle"/></template>
|
||||
<template #suffix>jobs</template>
|
||||
</ui-input>
|
||||
<ui-input :value="latestStats.delayed | number" type="text" readonly>
|
||||
<span>Delayed</span>
|
||||
<template #prefix><fa :icon="faStopwatch"/></template>
|
||||
<template #suffix>jobs</template>
|
||||
</ui-input>
|
||||
</ui-horizon-group>
|
||||
<div ref="chart" class="wptihjuy"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import ApexCharts from 'apexcharts';
|
||||
import * as tinycolor from 'tinycolor2';
|
||||
import { faStopwatch, faPlayCircle as fasPlayCircle } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faStopCircle, faPlayCircle as farPlayCircle } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/queue.vue'),
|
||||
|
||||
props: {
|
||||
type: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
connection: {
|
||||
required: true
|
||||
},
|
||||
limit: {
|
||||
type: Number,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
stats: [],
|
||||
chart: null,
|
||||
faStopwatch, faStopCircle, farPlayCircle, fasPlayCircle
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
latestStats(): any {
|
||||
return this.stats.length > 0 ? this.stats[this.stats.length - 1][this.type] : null;
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
stats(stats) {
|
||||
this.chart.updateSeries([{
|
||||
name: 'Process',
|
||||
type: 'area',
|
||||
data: stats.map((x, i) => ({ x: i, y: x[this.type].activeSincePrevTick }))
|
||||
}, {
|
||||
name: 'Active',
|
||||
type: 'area',
|
||||
data: stats.map((x, i) => ({ x: i, y: x[this.type].active }))
|
||||
}, {
|
||||
name: 'Waiting',
|
||||
type: 'line',
|
||||
data: stats.map((x, i) => ({ x: i, y: x[this.type].waiting }))
|
||||
}, {
|
||||
name: 'Delayed',
|
||||
type: 'line',
|
||||
data: stats.map((x, i) => ({ x: i, y: x[this.type].delayed }))
|
||||
}]);
|
||||
},
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.chart = new ApexCharts(this.$refs.chart, {
|
||||
chart: {
|
||||
id: this.type,
|
||||
group: 'queue',
|
||||
type: 'area',
|
||||
height: 200,
|
||||
animations: {
|
||||
dynamicAnimation: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
toolbar: {
|
||||
show: false
|
||||
},
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false
|
||||
},
|
||||
grid: {
|
||||
clipMarkers: false,
|
||||
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||
xaxis: {
|
||||
lines: {
|
||||
show: true,
|
||||
}
|
||||
},
|
||||
},
|
||||
stroke: {
|
||||
curve: 'straight',
|
||||
width: 2
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
legend: {
|
||||
labels: {
|
||||
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||
},
|
||||
},
|
||||
series: [] as any,
|
||||
colors: ['#00E396', '#00BCD4', '#FFB300', '#e53935'],
|
||||
xaxis: {
|
||||
type: 'numeric',
|
||||
labels: {
|
||||
show: false
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
show: false,
|
||||
min: 0,
|
||||
}
|
||||
});
|
||||
|
||||
this.chart.render();
|
||||
|
||||
this.connection.on('stats', this.onStats);
|
||||
this.connection.on('statsLog', this.onStatsLog);
|
||||
|
||||
this.$once('hook:beforeDestroy', () => {
|
||||
if (this.chart) this.chart.destroy();
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
onStats(stats) {
|
||||
this.stats.push(stats);
|
||||
if (this.stats.length > this.limit) this.stats.shift();
|
||||
},
|
||||
|
||||
onStatsLog(statsLog) {
|
||||
for (const stats of statsLog.reverse()) {
|
||||
this.onStats(stats);
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.wptihjuy
|
||||
min-height 200px !important
|
||||
margin -8px
|
||||
|
||||
</style>
|
||||
@@ -1,26 +1,121 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title>{{ $t('operation') }}</template>
|
||||
<template #title><fa :icon="faChartBar"/> {{ $t('title') }}</template>
|
||||
<section>
|
||||
<header><fa :icon="faPaperPlane"/> {{ $t('domains.deliver') }}</header>
|
||||
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="deliver"/>
|
||||
</section>
|
||||
<section>
|
||||
<header><fa :icon="faInbox"/> {{ $t('domains.inbox') }}</header>
|
||||
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="inbox"/>
|
||||
</section>
|
||||
<section>
|
||||
<details>
|
||||
<summary>{{ $t('other-queues') }}</summary>
|
||||
<section>
|
||||
<header><fa :icon="faDatabase"/> {{ $t('domains.db') }}</header>
|
||||
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="db"/>
|
||||
</section>
|
||||
<ui-hr/>
|
||||
<section>
|
||||
<header><fa :icon="faCloud"/> {{ $t('domains.objectStorage') }}</header>
|
||||
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="objectStorage"/>
|
||||
</section>
|
||||
</details>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faTasks"/> {{ $t('jobs') }}</template>
|
||||
<section class="fit-top">
|
||||
<ui-horizon-group inputs>
|
||||
<ui-select v-model="domain">
|
||||
<template #label>{{ $t('queue') }}</template>
|
||||
<option value="deliver">{{ $t('domains.deliver') }}</option>
|
||||
<option value="inbox">{{ $t('domains.inbox') }}</option>
|
||||
<option value="db">{{ $t('domains.db') }}</option>
|
||||
<option value="objectStorage">{{ $t('domains.objectStorage') }}</option>
|
||||
</ui-select>
|
||||
<ui-select v-model="state">
|
||||
<template #label>{{ $t('state') }}</template>
|
||||
<option value="active">{{ $t('states.active') }}</option>
|
||||
<option value="waiting">{{ $t('states.waiting') }}</option>
|
||||
<option value="delayed">{{ $t('states.delayed') }}</option>
|
||||
</ui-select>
|
||||
</ui-horizon-group>
|
||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||
<div class="xvvuvgsv" v-for="job in jobs">
|
||||
<b>{{ job.id }}</b>
|
||||
<template v-if="domain === 'deliver'">
|
||||
<span>{{ job.data.to }}</span>
|
||||
</template>
|
||||
<template v-if="domain === 'inbox'">
|
||||
<span>{{ job.activity.id }}</span>
|
||||
</template>
|
||||
</div>
|
||||
</sequential-entrance>
|
||||
<ui-info v-if="jobs.length == jobsLimit">{{ $t('result-is-truncated', { n: jobsLimit }) }}</ui-info>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { faTasks, faInbox, faDatabase, faCloud } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faPaperPlane, faChartBar } from '@fortawesome/free-regular-svg-icons';
|
||||
import i18n from '../../i18n';
|
||||
import XChart from './queue.chart.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/queue.vue'),
|
||||
|
||||
components: {
|
||||
XChart
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
connection: null,
|
||||
chartLimit: 200,
|
||||
jobs: [],
|
||||
jobsLimit: 50,
|
||||
domain: 'deliver',
|
||||
state: 'delayed',
|
||||
faTasks, faPaperPlane, faInbox, faChartBar, faDatabase, faCloud
|
||||
};
|
||||
},
|
||||
|
||||
watch: {
|
||||
domain() {
|
||||
this.jobs = [];
|
||||
this.fetchJobs();
|
||||
},
|
||||
|
||||
state() {
|
||||
this.jobs = [];
|
||||
this.fetchJobs();
|
||||
},
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.fetchJobs();
|
||||
|
||||
this.connection = this.$root.stream.useSharedConnection('queueStats');
|
||||
this.connection.send('requestLog', {
|
||||
id: Math.random().toString().substr(2, 8),
|
||||
length: this.chartLimit
|
||||
});
|
||||
|
||||
this.$once('hook:beforeDestroy', () => {
|
||||
this.connection.dispose();
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
async removeAllJobs() {
|
||||
const process = async () => {
|
||||
@@ -38,6 +133,23 @@ export default Vue.extend({
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
fetchJobs() {
|
||||
this.$root.api('admin/queue/jobs', {
|
||||
domain: this.domain,
|
||||
state: this.state,
|
||||
limit: this.jobsLimit
|
||||
}).then(jobs => {
|
||||
this.jobs = jobs;
|
||||
});
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.xvvuvgsv
|
||||
> b
|
||||
margin-right 16px
|
||||
|
||||
</style>
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
<span class="username">@{{ user | acct }}</span>
|
||||
<span class="is-admin" v-if="user.isAdmin">admin</span>
|
||||
<span class="is-moderator" v-if="user.isModerator">moderator</span>
|
||||
<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
|
||||
<span class="is-silenced" v-if="user.isSilenced" :title="$t('@.silenced-user')"><fa :icon="faMicrophoneSlash"/></span>
|
||||
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
|
||||
</header>
|
||||
@@ -77,7 +76,6 @@ export default Vue.extend({
|
||||
background var(--noteHeaderAdminBg)
|
||||
color var(--noteHeaderAdminFg)
|
||||
|
||||
> .is-verified
|
||||
> .is-silenced
|
||||
> .is-suspended
|
||||
margin 0 0 0 .5em
|
||||
|
||||
@@ -9,13 +9,10 @@
|
||||
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||
|
||||
<div class="user" v-if="user">
|
||||
<x-user :user='user'/>
|
||||
<x-user :user="user"/>
|
||||
<div class="actions">
|
||||
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
|
||||
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
||||
<ui-horizon-group>
|
||||
<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
|
||||
<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
|
||||
</ui-horizon-group>
|
||||
<ui-horizon-group>
|
||||
<ui-button @click="silenceUser"><fa :icon="faMicrophoneSlash"/> {{ $t('make-silence') }}</ui-button>
|
||||
<ui-button @click="unsilenceUser">{{ $t('unmake-silence') }}</ui-button>
|
||||
@@ -24,7 +21,7 @@
|
||||
<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
|
||||
<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
|
||||
</ui-horizon-group>
|
||||
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
|
||||
<ui-button @click="deleteAllFiles"><fa :icon="faTrashAlt"/> {{ $t('delete-all-files') }}</ui-button>
|
||||
<ui-textarea v-if="user" :value="user | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
||||
</div>
|
||||
</div>
|
||||
@@ -47,7 +44,6 @@
|
||||
<option value="all">{{ $t('users.state.all') }}</option>
|
||||
<option value="admin">{{ $t('users.state.admin') }}</option>
|
||||
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
||||
<option value="verified">{{ $t('users.state.verified') }}</option>
|
||||
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
||||
<option value="suspended">{{ $t('users.state.suspended') }}</option>
|
||||
</ui-select>
|
||||
@@ -71,8 +67,8 @@
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import parseAcct from "../../../../misc/acct/parse";
|
||||
import { faCertificate, faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
||||
import { faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faSnowflake, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
|
||||
import XUser from './users.user.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
@@ -84,8 +80,6 @@ export default Vue.extend({
|
||||
return {
|
||||
user: null,
|
||||
target: null,
|
||||
verifying: false,
|
||||
unverifying: false,
|
||||
suspending: false,
|
||||
unsuspending: false,
|
||||
sort: '+createdAt',
|
||||
@@ -95,7 +89,7 @@ export default Vue.extend({
|
||||
offset: 0,
|
||||
users: [],
|
||||
existMore: false,
|
||||
faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash
|
||||
faTerminal, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash, faTrashAlt
|
||||
};
|
||||
},
|
||||
|
||||
@@ -165,7 +159,7 @@ export default Vue.extend({
|
||||
|
||||
/** 処理対象ユーザーの情報を更新する */
|
||||
async refreshUser() {
|
||||
this.$root.api('admin/show-user', { userId: this.user._id }).then(info => {
|
||||
this.$root.api('admin/show-user', { userId: this.user.id }).then(info => {
|
||||
this.user = info;
|
||||
});
|
||||
},
|
||||
@@ -173,7 +167,7 @@ export default Vue.extend({
|
||||
async resetPassword() {
|
||||
if (!await this.getConfirmed(this.$t('reset-password-confirm'))) return;
|
||||
|
||||
this.$root.api('admin/reset-password', { userId: this.user._id }).then(res => {
|
||||
this.$root.api('admin/reset-password', { userId: this.user.id }).then(res => {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('password-updated', { password: res.password })
|
||||
@@ -181,59 +175,11 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
async verifyUser() {
|
||||
if (!await this.getConfirmed(this.$t('verify-confirm'))) return;
|
||||
|
||||
this.verifying = true;
|
||||
|
||||
const process = async () => {
|
||||
await this.$root.api('admin/verify-user', { userId: this.user._id });
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('verified')
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
this.$root.dialog({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
|
||||
this.verifying = false;
|
||||
|
||||
this.refreshUser();
|
||||
},
|
||||
|
||||
async unverifyUser() {
|
||||
if (!await this.getConfirmed(this.$t('unverify-confirm'))) return;
|
||||
|
||||
this.unverifying = true;
|
||||
|
||||
const process = async () => {
|
||||
await this.$root.api('admin/unverify-user', { userId: this.user._id });
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('unverified')
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
this.$root.dialog({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
|
||||
this.unverifying = false;
|
||||
|
||||
this.refreshUser();
|
||||
},
|
||||
|
||||
async silenceUser() {
|
||||
if (!await this.getConfirmed(this.$t('silence-confirm'))) return;
|
||||
|
||||
const process = async () => {
|
||||
await this.$root.api('admin/silence-user', { userId: this.user._id });
|
||||
await this.$root.api('admin/silence-user', { userId: this.user.id });
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
splash: true
|
||||
@@ -251,8 +197,10 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
async unsilenceUser() {
|
||||
if (!await this.getConfirmed(this.$t('unsilence-confirm'))) return;
|
||||
|
||||
const process = async () => {
|
||||
await this.$root.api('admin/unsilence-user', { userId: this.user._id });
|
||||
await this.$root.api('admin/unsilence-user', { userId: this.user.id });
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
splash: true
|
||||
@@ -275,7 +223,7 @@ export default Vue.extend({
|
||||
this.suspending = true;
|
||||
|
||||
const process = async () => {
|
||||
await this.$root.api('admin/suspend-user', { userId: this.user._id });
|
||||
await this.$root.api('admin/suspend-user', { userId: this.user.id });
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('suspended')
|
||||
@@ -300,7 +248,7 @@ export default Vue.extend({
|
||||
this.unsuspending = true;
|
||||
|
||||
const process = async () => {
|
||||
await this.$root.api('admin/unsuspend-user', { userId: this.user._id });
|
||||
await this.$root.api('admin/unsuspend-user', { userId: this.user.id });
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('unsuspended')
|
||||
@@ -320,7 +268,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
async updateRemoteUser() {
|
||||
this.$root.api('admin/update-remote-user', { userId: this.user._id }).then(res => {
|
||||
this.$root.api('admin/update-remote-user', { userId: this.user.id }).then(res => {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('remote-user-updated')
|
||||
@@ -330,6 +278,25 @@ export default Vue.extend({
|
||||
this.refreshUser();
|
||||
},
|
||||
|
||||
async deleteAllFiles() {
|
||||
if (!await this.getConfirmed(this.$t('delete-all-files-confirm'))) return;
|
||||
|
||||
const process = async () => {
|
||||
await this.$root.api('admin/delete-all-files-of-a-user', { userId: this.user.id });
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
splash: true
|
||||
});
|
||||
};
|
||||
|
||||
await process().catch(e => {
|
||||
this.$root.dialog({
|
||||
type: 'error',
|
||||
text: e.toString()
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
async getConfirmed(text: string): Promise<Boolean> {
|
||||
const confirm = await this.$root.dialog({
|
||||
type: 'warning',
|
||||
|
||||
@@ -34,7 +34,7 @@ body
|
||||
.peg
|
||||
display block
|
||||
position absolute
|
||||
right 0px
|
||||
right 0
|
||||
width 100px
|
||||
height 100%
|
||||
box-shadow 0 0 10px var(--primary), 0 0 5px var(--primary)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="form">
|
||||
<header>
|
||||
<h1 v-html="$t('share-access', { name: app.name })"></h1>
|
||||
<h1 v-html="$t('share-access', { name })"></h1>
|
||||
<img :src="app.iconUrl"/>
|
||||
</header>
|
||||
<div class="app">
|
||||
@@ -14,15 +14,7 @@
|
||||
<h2>{{ $t('permission-ask') }}</h2>
|
||||
<ul>
|
||||
<template v-for="p in app.permission">
|
||||
<li v-if="p == 'account-read'">{{ $t('account-read') }}</li>
|
||||
<li v-if="p == 'account-write'">{{ $t('account-write') }}</li>
|
||||
<li v-if="p == 'note-write'">{{ $t('note-write') }}</li>
|
||||
<li v-if="p == 'like-write'">{{ $t('like-write') }}</li>
|
||||
<li v-if="p == 'following-write'">{{ $t('following-write') }}</li>
|
||||
<li v-if="p == 'drive-read'">{{ $t('drive-read') }}</li>
|
||||
<li v-if="p == 'drive-write'">{{ $t('drive-write') }}</li>
|
||||
<li v-if="p == 'notification-read'">{{ $t('notification-read') }}</li>
|
||||
<li v-if="p == 'notification-write'">{{ $t('notification-write') }}</li>
|
||||
<li :key="p">{{ $t(`@.permissions.${p}`) }}</li>
|
||||
</template>
|
||||
</ul>
|
||||
</section>
|
||||
@@ -42,6 +34,11 @@ export default Vue.extend({
|
||||
i18n: i18n('auth/views/form.vue'),
|
||||
props: ['session'],
|
||||
computed: {
|
||||
name(): string {
|
||||
const el = document.createElement('div');
|
||||
el.textContent = this.app.name
|
||||
return el.innerHTML;
|
||||
},
|
||||
app(): any {
|
||||
return this.session.app;
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ export default Vue.extend({
|
||||
margin 0 auto
|
||||
text-align center
|
||||
background #fff
|
||||
box-shadow 0px 4px 16px rgba(#000, 0.2)
|
||||
box-shadow 0 4px 16px rgba(#000, 0.2)
|
||||
|
||||
> .fetching
|
||||
margin 0
|
||||
|
||||
@@ -45,15 +45,9 @@ export default function <T extends object>(data: {
|
||||
this.$watch('props', () => {
|
||||
this.mergeProps();
|
||||
});
|
||||
|
||||
this.bakeProps();
|
||||
},
|
||||
|
||||
methods: {
|
||||
bakeProps() {
|
||||
this.bakedOldProps = JSON.stringify(this.props);
|
||||
},
|
||||
|
||||
mergeProps() {
|
||||
if (data.props) {
|
||||
const defaultProps = data.props();
|
||||
@@ -65,17 +59,10 @@ export default function <T extends object>(data: {
|
||||
},
|
||||
|
||||
save() {
|
||||
if (this.bakedOldProps == JSON.stringify(this.props)) return;
|
||||
|
||||
this.bakeProps();
|
||||
|
||||
if (this.platform == 'deck') {
|
||||
this.$store.commit('device/updateDeckColumn', this.column);
|
||||
} else {
|
||||
this.$root.api('i/update_widget', {
|
||||
id: this.id,
|
||||
data: this.props
|
||||
});
|
||||
this.$store.commit('device/updateWidget', this.widget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ function match(e: KeyboardEvent, patterns: action['patterns']): boolean {
|
||||
pattern.ctrl == e.ctrlKey &&
|
||||
pattern.shift == e.shiftKey &&
|
||||
pattern.alt == e.altKey &&
|
||||
e.metaKey == false
|
||||
!e.metaKey
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user