Compare commits
1189 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
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 | ||
|
|
1ed70b2e2c | ||
|
|
86d5a599b7 | ||
|
|
c226fc8d63 | ||
|
|
bbf4e1c413 | ||
|
|
a24a20a83d | ||
|
|
725600da8f | ||
|
|
f74a32ed9b | ||
|
|
e08e72dd10 | ||
|
|
ce02e1e528 | ||
|
|
0b27d8a717 | ||
|
|
2782e7d26f | ||
|
|
2c83a05e80 | ||
|
|
467f68502a | ||
|
|
d95b0dee6b | ||
|
|
a1f3323fa5 | ||
|
|
494796a7f0 | ||
|
|
94f2c20d35 | ||
|
|
c1deb9438d | ||
|
|
ea86527c66 | ||
|
|
d1a18fe266 | ||
|
|
737064da82 | ||
|
|
606cc85ff5 | ||
|
|
dcfc8f1b30 | ||
|
|
ebe4b84f14 | ||
|
|
699d4897db | ||
|
|
fcdfd8d323 | ||
|
|
db8625c31a | ||
|
|
b65f265c55 | ||
|
|
c55237d09c | ||
|
|
ed698b7b82 | ||
|
|
d4ff19f013 | ||
|
|
972fb8eb40 | ||
|
|
4de75448b6 | ||
|
|
e8ef8f0004 | ||
|
|
a319b30382 | ||
|
|
8278616eeb | ||
|
|
771f011506 | ||
|
|
826865869a | ||
|
|
3c77ae7b62 | ||
|
|
60c30ece10 | ||
|
|
76a0d0fee9 | ||
|
|
d50624f0a0 | ||
|
|
4f9b015d1c | ||
|
|
4f10bd038d | ||
|
|
977af0a24d | ||
|
|
f3ceb32a7c | ||
|
|
15da2de256 | ||
|
|
41ae0ccd6f | ||
|
|
344532662e | ||
|
|
99b365030e | ||
|
|
5cc940c08a | ||
|
|
1d02d9e0fe | ||
|
|
139523b763 | ||
|
|
e7c83db9c7 | ||
|
|
da47782b77 | ||
|
|
4685de88a7 | ||
|
|
0c28ac4907 | ||
|
|
ae2d707c68 | ||
|
|
00a28193a0 | ||
|
|
ea1818284b | ||
|
|
d83efecc94 | ||
|
|
9a9fb37a78 | ||
|
|
b6dc6c6984 | ||
|
|
517084b1fc | ||
|
|
27763e6898 | ||
|
|
57dde1da38 | ||
|
|
0bb961767c | ||
|
|
88515ce677 | ||
|
|
00562e840c | ||
|
|
b7927ba386 | ||
|
|
9c363ff045 | ||
|
|
1dbce5e3e2 | ||
|
|
361a9ca1be | ||
|
|
cde6514839 | ||
|
|
507e2f727e | ||
|
|
8028499d2b | ||
|
|
c2c79c4a87 | ||
|
|
d56f7f3390 | ||
|
|
ef70d17194 | ||
|
|
9789b9a083 | ||
|
|
e6311fdb13 | ||
|
|
2231c54dee | ||
|
|
20de9a5e35 | ||
|
|
ec3a6d7097 | ||
|
|
9d99bf5af8 | ||
|
|
52911cc9fd | ||
|
|
6f71ba376d | ||
|
|
9f439aabba | ||
|
|
33ad60b1f3 | ||
|
|
010d3f8281 | ||
|
|
e27c4bf1b9 | ||
|
|
11cfc58ffc | ||
|
|
91f38a8ddd | ||
|
|
b56fed8ed5 | ||
|
|
4a93dadc1c | ||
|
|
3a5f55c471 | ||
|
|
2919e37586 | ||
|
|
077bdbfdef | ||
|
|
61ac024127 | ||
|
|
8db8d3f39e | ||
|
|
e7032363d7 | ||
|
|
8a9dc26419 | ||
|
|
022f5a18c8 | ||
|
|
eae4b2f2e9 | ||
|
|
d285452dec | ||
|
|
aced183a66 | ||
|
|
77b150c53b | ||
|
|
9b2ddfea5f | ||
|
|
bf2bdaa6ff | ||
|
|
42525bb12a | ||
|
|
bc243c1ea3 | ||
|
|
a2517d1a1d | ||
|
|
c0a60260c2 | ||
|
|
3654f247c4 | ||
|
|
c4ddfef2ed | ||
|
|
28086111e1 | ||
|
|
60c9a6528f | ||
|
|
47d4dcfdf5 | ||
|
|
eb8d1211ba | ||
|
|
495aad6a2d | ||
|
|
77676d18c8 | ||
|
|
68d90caab7 | ||
|
|
31fc43ed16 | ||
|
|
31802c9749 | ||
|
|
192aa89f95 | ||
|
|
b0a0faff7e | ||
|
|
b67f3438e9 | ||
|
|
02e4929a97 | ||
|
|
fcc6a65e08 | ||
|
|
f4ae939124 | ||
|
|
664acb2d0e | ||
|
|
e6e7cecdb6 | ||
|
|
563d604812 | ||
|
|
012d744f4c | ||
|
|
d4c7ca76ac | ||
|
|
1a6aae944f | ||
|
|
71e0241c94 | ||
|
|
d838ef5b76 | ||
|
|
d90a5c9154 | ||
|
|
9b79a411e0 | ||
|
|
b8e0ec9edc | ||
|
|
57009057ae | ||
|
|
5db7b2e193 | ||
|
|
d994c84901 | ||
|
|
febfb97bb4 | ||
|
|
a6c5e62923 | ||
|
|
ac0390fec3 | ||
|
|
97b99867f2 | ||
|
|
a55d5516a6 | ||
|
|
b679163d01 | ||
|
|
76edcdbe45 | ||
|
|
d8d51519c4 | ||
|
|
3446969121 | ||
|
|
0e0c35a701 | ||
|
|
c9a6c9e20a | ||
|
|
3d2b982a94 | ||
|
|
6157d8331b | ||
|
|
3d0fc09fae | ||
|
|
b975751710 | ||
|
|
4530d40537 | ||
|
|
94e3ac9b72 | ||
|
|
e13fe97ebb | ||
|
|
4ad7632113 | ||
|
|
0709cac97f | ||
|
|
7dd4180fba | ||
|
|
558213490a | ||
|
|
78a69e3da8 | ||
|
|
140c78e5a7 | ||
|
|
a8e18e0e22 | ||
|
|
2a8bb23625 | ||
|
|
936a4d1bc4 | ||
|
|
69c34e8d00 | ||
|
|
1a2a190828 | ||
|
|
251cf1d76f | ||
|
|
52774bbe64 | ||
|
|
68a6758302 | ||
|
|
13e43a4f74 | ||
|
|
b7d62d09ec | ||
|
|
321ec18173 | ||
|
|
a44ac3306e | ||
|
|
951288ecf0 | ||
|
|
cc8a7dd588 | ||
|
|
813c52f51e | ||
|
|
be3298639d | ||
|
|
e8d2959717 | ||
|
|
e7680e08eb | ||
|
|
bd792d7661 | ||
|
|
4920983f23 | ||
|
|
2756f553c6 | ||
|
|
fc52e95ad0 | ||
|
|
5d1d6bc028 | ||
|
|
b106acac91 | ||
|
|
a5071db864 | ||
|
|
bae874eb45 | ||
|
|
60da17940d | ||
|
|
385eeed732 | ||
|
|
2e908758d8 | ||
|
|
a164f8ad95 | ||
|
|
372138dfea | ||
|
|
922a657c7e | ||
|
|
3409a51cca | ||
|
|
7174a55846 | ||
|
|
6656a59402 | ||
|
|
7612ead551 | ||
|
|
fa78fe665d | ||
|
|
c89aa7eb95 | ||
|
|
43f4c5b7cd | ||
|
|
2b6c566386 | ||
|
|
91ef328b6b | ||
|
|
5a9d9dc41d | ||
|
|
a48e503caa | ||
|
|
fe00cb9ad5 | ||
|
|
ed0fdaddbd | ||
|
|
893795a31d | ||
|
|
f1047f1ce5 | ||
|
|
9beddc941a | ||
|
|
3a6a01d2d6 | ||
|
|
e0e4bdbdbc | ||
|
|
b3daf79b6a | ||
|
|
81aa21915b | ||
|
|
5aadd80243 | ||
|
|
23350b1cbc | ||
|
|
daff0977cb | ||
|
|
c1e7d56ff8 | ||
|
|
61aef56f83 | ||
|
|
249f591403 | ||
|
|
36599c82d1 | ||
|
|
7615b1ea0a | ||
|
|
d8de9f8eba | ||
|
|
8c0e65ce6f | ||
|
|
9aa24c0552 | ||
|
|
47bf06f432 | ||
|
|
99d291c71b | ||
|
|
d51cafca74 | ||
|
|
7921f8cd43 | ||
|
|
1b8467d5e5 | ||
|
|
e13b2689b5 | ||
|
|
9c167acbd9 | ||
|
|
1bc531edbd | ||
|
|
b4d0db9202 | ||
|
|
bd2b681367 | ||
|
|
f0edf81cc4 | ||
|
|
e81ac05ba6 | ||
|
|
6279ce8f22 | ||
|
|
0fd20cf588 | ||
|
|
f2d55e7f60 | ||
|
|
963b0db3d3 | ||
|
|
aeca115a37 | ||
|
|
6f97142b59 | ||
|
|
b31d1ce61d | ||
|
|
b07cd37a16 | ||
|
|
69b74a46b9 | ||
|
|
882d829558 | ||
|
|
532821d503 | ||
|
|
522ce67498 | ||
|
|
0e046faf4a | ||
|
|
d9092dc81f | ||
|
|
92a4e90026 | ||
|
|
07dccad5b1 | ||
|
|
146b0d2889 | ||
|
|
388565fb10 | ||
|
|
da4ba51a74 | ||
|
|
1edcd136a4 | ||
|
|
9883c751da | ||
|
|
f78b28b995 | ||
|
|
54d40420ad | ||
|
|
ba1492f977 | ||
|
|
efd0368e56 | ||
|
|
a766a57af9 | ||
|
|
3bdd8a2d90 | ||
|
|
7ef1205f8b | ||
|
|
e8db63e788 | ||
|
|
0bcef2453c | ||
|
|
b9f549135c | ||
|
|
87b0017386 | ||
|
|
cc8ff556d4 | ||
|
|
021f74da54 | ||
|
|
f9389802d7 | ||
|
|
18dd172c97 | ||
|
|
1d5a54ff6f | ||
|
|
03e2c7eec6 | ||
|
|
0902727d1c | ||
|
|
496895634d | ||
|
|
9414e9e258 | ||
|
|
357528d139 | ||
|
|
c4efbdf4c7 | ||
|
|
fb4a921cd9 | ||
|
|
683b242215 | ||
|
|
a5660d6c82 | ||
|
|
f632ec50c1 | ||
|
|
a55d15214b | ||
|
|
f1709a2cc2 | ||
|
|
effa542958 | ||
|
|
e8bf742c87 | ||
|
|
2e6652edce | ||
|
|
230c204b48 | ||
|
|
3755c600b1 | ||
|
|
24513fc0a3 | ||
|
|
0a79a6564a | ||
|
|
562bb5842b | ||
|
|
ec3ca3032e | ||
|
|
890770c275 | ||
|
|
9ed58a1b4e | ||
|
|
08984be2fe | ||
|
|
e3ade148ca | ||
|
|
34c0eff89f | ||
|
|
40aba47a47 | ||
|
|
6736f51134 | ||
|
|
9d826d6e52 | ||
|
|
902d9bc7a5 | ||
|
|
b6c86e2845 | ||
|
|
34dffdfc8f | ||
|
|
a56f3f1d89 | ||
|
|
88dc4c83cb | ||
|
|
5a28dc0198 | ||
|
|
40d2650d49 | ||
|
|
545e83efb1 | ||
|
|
d4b00a5482 | ||
|
|
c2b1bbeec5 | ||
|
|
8c8f165a6e | ||
|
|
04553de230 | ||
|
|
2776934728 | ||
|
|
0064dbb010 | ||
|
|
d52e671adf | ||
|
|
6017dc2dff | ||
|
|
937f7cbd60 | ||
|
|
f8b3f66904 | ||
|
|
9d5701f35a | ||
|
|
dff65810c6 | ||
|
|
6752cf1d64 | ||
|
|
8336910a59 | ||
|
|
957a1149e0 | ||
|
|
e8719ff6e6 | ||
|
|
28b63298e5 | ||
|
|
dd4dee8095 | ||
|
|
c47818fed4 | ||
|
|
e53c383908 | ||
|
|
55c9c0436b | ||
|
|
66b79e5e24 | ||
|
|
514b830910 | ||
|
|
e4f799bf1d | ||
|
|
b383427d3d | ||
|
|
e969518139 | ||
|
|
113fe294bd | ||
|
|
a4d92f781f | ||
|
|
414cac49c3 | ||
|
|
95b157ac3e | ||
|
|
8e3d884081 | ||
|
|
9def6fcadd | ||
|
|
7837bd44fc | ||
|
|
a6c3663155 | ||
|
|
0b5afadbb8 | ||
|
|
43864f0da4 | ||
|
|
6a0d9d70ed | ||
|
|
63c6dce68e | ||
|
|
53422ffcb2 | ||
|
|
38ca514f53 | ||
|
|
caea0f0376 | ||
|
|
25a8b26977 | ||
|
|
bcaefe8d62 | ||
|
|
46f1e8c599 | ||
|
|
16230f320e | ||
|
|
ace6419aef | ||
|
|
77fb9eb2be | ||
|
|
aa7fc7c893 | ||
|
|
8fc170109f | ||
|
|
ad12d00d7e | ||
|
|
fa5ea45726 | ||
|
|
4b6c113251 | ||
|
|
3548290ff2 | ||
|
|
b165b90c40 | ||
|
|
4ffe9c908b | ||
|
|
a135f75e71 | ||
|
|
cbc61ba03d | ||
|
|
5aa58da918 | ||
|
|
b083430011 | ||
|
|
a8946b0404 | ||
|
|
0303bccc61 | ||
|
|
f3ce8564ea | ||
|
|
52c3f9e98c | ||
|
|
6c8b4184fe | ||
|
|
a0979f8435 | ||
|
|
faba21d003 | ||
|
|
d82c5dff71 | ||
|
|
59fbc5b054 | ||
|
|
2c1a7f4392 | ||
|
|
769e6182d8 | ||
|
|
88176a17a3 | ||
|
|
fc660e869f | ||
|
|
dc04869650 | ||
|
|
93c3f34813 | ||
|
|
1282eed192 | ||
|
|
962b3ca78e | ||
|
|
62d17c9266 | ||
|
|
f5b928a537 | ||
|
|
c8811894b5 | ||
|
|
e579b49228 | ||
|
|
9561908ad3 | ||
|
|
fac7ebf4f6 | ||
|
|
a0769d65e3 | ||
|
|
d17aa4b24e | ||
|
|
310371658b | ||
|
|
7ca073aafd | ||
|
|
7216d0fb1f | ||
|
|
22a9e950c7 | ||
|
|
6683d50bae | ||
|
|
8f26176273 | ||
|
|
9ea7d446e8 | ||
|
|
757312ba52 | ||
|
|
1675c473d4 | ||
|
|
3a3a5d4bfb | ||
|
|
4a41499c95 | ||
|
|
a1d1cb58e0 | ||
|
|
acb82fe7b6 | ||
|
|
b25df24cea | ||
|
|
39284eb9b2 | ||
|
|
31b0e552a2 | ||
|
|
c4a2a31cf3 | ||
|
|
4497ddb3f3 | ||
|
|
5e0eda9526 | ||
|
|
72b85fc09f | ||
|
|
6c27412c9c | ||
|
|
46bddfc9c2 | ||
|
|
56275bcfcb | ||
|
|
f35688bab8 | ||
|
|
93541f83c8 | ||
|
|
ea0d114833 | ||
|
|
7f6a3ec828 | ||
|
|
732804b6fa | ||
|
|
aba85b977d | ||
|
|
e6612f610c | ||
|
|
5a28632af7 | ||
|
|
4099db0d42 | ||
|
|
9d50a06d9c | ||
|
|
dd7bf9b2a3 | ||
|
|
c463284c2f | ||
|
|
c1d728a616 | ||
|
|
e43c9c0e21 | ||
|
|
15cac10d7b | ||
|
|
49958ca03f | ||
|
|
280dbe9853 | ||
|
|
bf964ee969 | ||
|
|
61dcd51888 | ||
|
|
5448c22031 | ||
|
|
27768081e2 | ||
|
|
c3140f57b9 | ||
|
|
7275bc6d3b | ||
|
|
485f2f460e | ||
|
|
336912e442 | ||
|
|
dd9c94e47e | ||
|
|
055863144d | ||
|
|
0bf602bae6 | ||
|
|
6fc28d1df7 | ||
|
|
2ef795aba8 | ||
|
|
1d2c50fc26 | ||
|
|
cef8aa5e7a | ||
|
|
edf3e75344 | ||
|
|
62835c6011 | ||
|
|
60fb22cb3c | ||
|
|
20dea3a793 | ||
|
|
aba37ae701 | ||
|
|
2c6e6275aa | ||
|
|
20ef362854 | ||
|
|
4692aa8d9b | ||
|
|
f7b6dc08f7 | ||
|
|
7dfe7005e0 | ||
|
|
b91de4ac12 | ||
|
|
d5205d7328 | ||
|
|
f44ce535fa | ||
|
|
7177fd27c8 | ||
|
|
cf304f88d4 | ||
|
|
dff1d84031 | ||
|
|
96bc17aa10 | ||
|
|
41ba06a5e6 | ||
|
|
d7ac0418d7 | ||
|
|
f4319a9c01 | ||
|
|
f4c4d53bbb | ||
|
|
0ed43e1bdf | ||
|
|
d25bd876cb | ||
|
|
b9782397c2 | ||
|
|
ea0abc9f71 | ||
|
|
27d16c6a12 | ||
|
|
ede70d354e | ||
|
|
66fa583f6e | ||
|
|
77bcb58f12 | ||
|
|
61036e3a70 | ||
|
|
bcd886c4f5 | ||
|
|
4d868aaf1f | ||
|
|
80ea747db6 | ||
|
|
960f29ce81 | ||
|
|
20ee57931f | ||
|
|
71ba72e796 | ||
|
|
9835945ee1 | ||
|
|
4f2d52697d | ||
|
|
46c258d77a | ||
|
|
3b5b3cf521 | ||
|
|
5e0bdd8a78 | ||
|
|
b299988bb5 | ||
|
|
e26bec6ab4 | ||
|
|
e9955e01d6 | ||
|
|
1974d8f58b | ||
|
|
08c0be11b2 | ||
|
|
87c7058494 | ||
|
|
b92addffa9 | ||
|
|
e8b49df842 | ||
|
|
18fd39b335 | ||
|
|
8a11322802 | ||
|
|
31929dad61 | ||
|
|
4a41d2fddc | ||
|
|
4c65b0cd6f | ||
|
|
3e89dc603d | ||
|
|
2a1def3cce | ||
|
|
938fe05fef | ||
|
|
5db5bbd1cd | ||
|
|
ba7e05837c | ||
|
|
9dd06a7621 | ||
|
|
2f4434b0d8 | ||
|
|
350328770b | ||
|
|
17e1b49bff | ||
|
|
266c31981d | ||
|
|
803fb0898a | ||
|
|
01983da514 | ||
|
|
6f473aa64a | ||
|
|
574747b9d4 | ||
|
|
dff1122bd5 | ||
|
|
43cb12930a | ||
|
|
8129d4dc23 | ||
|
|
9b780dff04 | ||
|
|
11a0ef485b | ||
|
|
83b2aa72b1 | ||
|
|
c71b24987d | ||
|
|
78d22dbd22 | ||
|
|
8961dab137 | ||
|
|
bcc549fd8e | ||
|
|
5a6c3fc11c | ||
|
|
7d730f676d | ||
|
|
6bda571660 | ||
|
|
d3c7129e1f | ||
|
|
3709ba95cd | ||
|
|
4162981081 | ||
|
|
7b7359fbdc | ||
|
|
70c01c52a8 | ||
|
|
443006c868 | ||
|
|
7c1db1fea5 | ||
|
|
7c2b704bef | ||
|
|
368c3f1e29 | ||
|
|
dd39d6ea37 | ||
|
|
ef618b2431 | ||
|
|
861302f0fd | ||
|
|
f014b7ae0e | ||
|
|
00b2d89f1a | ||
|
|
5410efe9ca | ||
|
|
1d814ba0e1 | ||
|
|
c107333f56 | ||
|
|
9595a56346 | ||
|
|
06707705bf | ||
|
|
68ee9a008e | ||
|
|
3a035c481e | ||
|
|
23a0aead9f | ||
|
|
6cd41f9860 | ||
|
|
baf861ac79 | ||
|
|
0ae1190c08 | ||
|
|
d3b3426ebe | ||
|
|
4982ea8f14 | ||
|
|
3be89e9702 | ||
|
|
4275af2324 | ||
|
|
84d42be090 | ||
|
|
c4c7783691 | ||
|
|
d6dba7fd71 | ||
|
|
30b1b1a5ed | ||
|
|
90b6688057 | ||
|
|
b536ee4dcd | ||
|
|
11101a6aca | ||
|
|
b4a3e5aa4f | ||
|
|
874c0eae6a | ||
|
|
9950b6fbc6 | ||
|
|
42d6ed62f6 | ||
|
|
c7e8c27ce6 | ||
|
|
67792fcb5e | ||
|
|
353fc18f19 | ||
|
|
cf9e8ed39e | ||
|
|
beb1b570d4 | ||
|
|
ba1b5a8ede | ||
|
|
99d8d0a484 | ||
|
|
5891135ac1 | ||
|
|
c4f7491322 | ||
|
|
206b57b962 | ||
|
|
1b0e03704e | ||
|
|
8b71006fbe | ||
|
|
8f2f4b6d2d | ||
|
|
6e0c055faf | ||
|
|
893a3b527d | ||
|
|
fe13c17fcb | ||
|
|
5049870b6e | ||
|
|
ce576dea8f | ||
|
|
ceda3dd72a | ||
|
|
014b58cb40 | ||
|
|
b4859be098 | ||
|
|
df54da9510 | ||
|
|
b97f788d71 | ||
|
|
edd1baa9f4 | ||
|
|
4a23ebe534 | ||
|
|
64c1075b06 | ||
|
|
217e4ee39c | ||
|
|
7e2a7cdff8 |
@@ -2,7 +2,7 @@
|
|||||||
# __MISSKEY_BEARER_TOKEN=
|
# __MISSKEY_BEARER_TOKEN=
|
||||||
# __MISSKEY_CAMPAIGN_ID=
|
# __MISSKEY_CAMPAIGN_ID=
|
||||||
# __MISSKEY_GITHUB_TOKEN=
|
# __MISSKEY_GITHUB_TOKEN=
|
||||||
# __MISSKEY_HEAD=acid-chicken:patch-autogen
|
# __MISSKEY_HEAD=syuilo:patch-autogen
|
||||||
# __MISSKEY_REPO=syuilo/misskey
|
# __MISSKEY_REPO=syuilo/misskey
|
||||||
# __MISSKEY_BRANCH=develop
|
# __MISSKEY_BRANCH=develop
|
||||||
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r -f check_pr.jq | grep $__MISSKEY_HEAD)" && exit 1
|
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r -f check_pr.jq | grep $__MISSKEY_HEAD)" && exit 1
|
||||||
|
|||||||
@@ -5,26 +5,13 @@ executors:
|
|||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
docker:
|
docker:
|
||||||
- image: misskey/ci:latest
|
- image: misskey/ci:latest
|
||||||
- image: circleci/mongo:latest
|
|
||||||
- image: circleci/redis:latest
|
- image: circleci/redis:latest
|
||||||
docker:
|
docker:
|
||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
docker:
|
docker:
|
||||||
- image: docker:latest
|
- image: docker:latest
|
||||||
alpine:
|
|
||||||
working_directory: /tmp/workspace
|
|
||||||
docker:
|
|
||||||
- image: alpine:latest
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ok:
|
|
||||||
executor: alpine
|
|
||||||
steps:
|
|
||||||
- run:
|
|
||||||
name: OK
|
|
||||||
command: |
|
|
||||||
echo -e '\033[0;32mOK\033[0;39m'
|
|
||||||
|
|
||||||
build:
|
build:
|
||||||
executor: default
|
executor: default
|
||||||
steps:
|
steps:
|
||||||
@@ -60,30 +47,19 @@ jobs:
|
|||||||
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||||
paths:
|
paths:
|
||||||
- node_modules
|
- node_modules
|
||||||
# - store_artifacts:
|
|
||||||
# path: built
|
|
||||||
- persist_to_workspace:
|
- persist_to_workspace:
|
||||||
root: .
|
root: .
|
||||||
paths:
|
paths:
|
||||||
- .
|
- .
|
||||||
test:
|
test:
|
||||||
parameters:
|
parameters:
|
||||||
without_redis:
|
executor:
|
||||||
type: string
|
type: string
|
||||||
default: ""
|
default: "default"
|
||||||
executor: default
|
executor: <<parameters.executor>>
|
||||||
steps:
|
steps:
|
||||||
- attach_workspace:
|
- attach_workspace:
|
||||||
at: /tmp/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:
|
- run:
|
||||||
name: Test
|
name: Test
|
||||||
command: |
|
command: |
|
||||||
@@ -94,12 +70,11 @@ jobs:
|
|||||||
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||||
paths:
|
paths:
|
||||||
- node_modules
|
- node_modules
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
parameters:
|
parameters:
|
||||||
with_deploy:
|
with_deploy:
|
||||||
type: string
|
type: boolean
|
||||||
default: ""
|
default: false
|
||||||
executor: docker
|
executor: docker
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
@@ -126,42 +101,58 @@ jobs:
|
|||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
build-and-test:
|
nodejs:
|
||||||
jobs:
|
jobs:
|
||||||
- ok:
|
- hold:
|
||||||
|
name: manual-build-trigger
|
||||||
|
type: approval
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only:
|
ignore: master
|
||||||
- l10n_develop
|
|
||||||
- imgbot
|
|
||||||
- build:
|
- build:
|
||||||
|
name: manual-build
|
||||||
|
requires:
|
||||||
|
- manual-build-trigger
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
ignore:
|
ignore: master
|
||||||
- l10n_develop
|
- build:
|
||||||
- imgbot
|
name: auto-build
|
||||||
- test:
|
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
ignore:
|
|
||||||
# - master
|
|
||||||
- l10n_develop
|
|
||||||
- imgbot
|
|
||||||
- test:
|
|
||||||
without_redis: "true"
|
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: master
|
only: master
|
||||||
# - docker:
|
- test:
|
||||||
# filters:
|
name: manual-test
|
||||||
# branches:
|
requires:
|
||||||
# ignore: master
|
- manual-build
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
ignore: master
|
||||||
|
- test:
|
||||||
|
name: auto-test
|
||||||
|
requires:
|
||||||
|
- auto-build
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
|
docker:
|
||||||
|
jobs:
|
||||||
|
- hold:
|
||||||
|
name: manual-build-trigger
|
||||||
|
type: approval
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
ignore: master
|
||||||
- docker:
|
- docker:
|
||||||
with_deploy: "true"
|
name: manual-build
|
||||||
|
requires:
|
||||||
|
- manual-build-trigger
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
ignore: master
|
||||||
|
- docker:
|
||||||
|
name: auto-build
|
||||||
|
with_deploy: true
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: master
|
only: master
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ mongodb:
|
|||||||
db: misskey
|
db: misskey
|
||||||
user: syuilo
|
user: syuilo
|
||||||
pass: ''
|
pass: ''
|
||||||
|
drive:
|
||||||
|
storage: 'db'
|
||||||
redis:
|
redis:
|
||||||
host: localhost
|
host: localhost
|
||||||
port: 6379
|
port: 6379
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ mongodb:
|
|||||||
db: test-misskey
|
db: test-misskey
|
||||||
user: admin
|
user: admin
|
||||||
pass: ''
|
pass: ''
|
||||||
|
drive:
|
||||||
|
storage: 'db'
|
||||||
# __REDIS__
|
# __REDIS__
|
||||||
redis:
|
redis:
|
||||||
host: localhost
|
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.
|
# Final accessible URL seen by a user.
|
||||||
url: https://example.tld/
|
url: https://example.tld/
|
||||||
|
|
||||||
|
# ┌───────────────────────┐
|
||||||
|
#───┘ Port and TLS settings └───────────────────────────────────
|
||||||
|
|
||||||
### Port and TLS settings ######################################
|
|
||||||
#
|
#
|
||||||
# Misskey supports two deployment options for public.
|
# Misskey supports two deployment options for public.
|
||||||
#
|
#
|
||||||
@@ -30,28 +38,51 @@ url: https://example.tld/
|
|||||||
# You need to set Certificate in 'https' section.
|
# You need to set Certificate in 'https' section.
|
||||||
|
|
||||||
# To use option 1, uncomment below line.
|
# 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.
|
# To use option 2, uncomment below lines.
|
||||||
# port: 443
|
#port: 443
|
||||||
#
|
|
||||||
# https:
|
|
||||||
# # path for certification
|
|
||||||
# key: /etc/letsencrypt/live/example.tld/privkey.pem
|
|
||||||
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
|
|
||||||
|
|
||||||
################################################################
|
#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
|
host: localhost
|
||||||
port: 27017
|
port: 5432
|
||||||
|
|
||||||
|
# Database name
|
||||||
db: misskey
|
db: misskey
|
||||||
|
|
||||||
|
# Auth
|
||||||
user: example-misskey-user
|
user: example-misskey-user
|
||||||
pass: example-misskey-pass
|
pass: example-misskey-pass
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host: localhost
|
||||||
|
port: 6379
|
||||||
|
#pass: example-pass
|
||||||
|
|
||||||
|
# ┌─────────────────────────────┐
|
||||||
|
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||||
|
|
||||||
|
#elasticsearch:
|
||||||
|
# host: localhost
|
||||||
|
# port: 9200
|
||||||
|
# pass: null
|
||||||
|
|
||||||
|
# ┌────────────────────────────────────┐
|
||||||
|
#───┘ File storage (Drive) configuration └──────────────────────
|
||||||
|
|
||||||
drive:
|
drive:
|
||||||
storage: 'db'
|
storage: 'fs'
|
||||||
|
|
||||||
# OR
|
# OR
|
||||||
|
|
||||||
@@ -88,25 +119,30 @@ drive:
|
|||||||
# accessKey: XXX
|
# accessKey: XXX
|
||||||
# secretKey: YYY
|
# secretKey: YYY
|
||||||
|
|
||||||
|
# ┌───────────────┐
|
||||||
|
#───┘ 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
|
||||||
|
|
||||||
|
id: 'aid'
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
# If enabled:
|
# If enabled:
|
||||||
# The first account created is automatically marked as Admin.
|
# The first account created is automatically marked as Admin.
|
||||||
autoAdmin: true
|
autoAdmin: true
|
||||||
|
|
||||||
#
|
# Whether disable HSTS
|
||||||
# Below settings are optional
|
#disableHsts: true
|
||||||
#
|
|
||||||
|
|
||||||
# Redis
|
|
||||||
#redis:
|
|
||||||
# host: localhost
|
|
||||||
# port: 6379
|
|
||||||
# pass: example-pass
|
|
||||||
|
|
||||||
# Elasticsearch
|
|
||||||
#elasticsearch:
|
|
||||||
# host: localhost
|
|
||||||
# port: 9200
|
|
||||||
# pass: null
|
|
||||||
|
|
||||||
# Clustering
|
# Clustering
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|||||||
@@ -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
|
.vscode
|
||||||
Dockerfile
|
Dockerfile
|
||||||
build/
|
build/
|
||||||
|
db/
|
||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
node_modules/
|
|
||||||
mongo/
|
|
||||||
redis/
|
|
||||||
elasticsearch/
|
elasticsearch/
|
||||||
|
node_modules/
|
||||||
|
redis/
|
||||||
|
|||||||
4
.github/CODEOWNERS
vendored
4
.github/CODEOWNERS
vendored
@@ -1,7 +1,7 @@
|
|||||||
# PATH OWNERS
|
# PATH OWNERS
|
||||||
/.autogen/ @acid-chicken
|
/.autogen/ @acid-chicken
|
||||||
/.circleci/ @syuilo @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
|
# /.config/mongo_initdb_example.js @khws4v1
|
||||||
/.github/ @syuilo @AyaMorisawa @acid-chicken
|
/.github/ @syuilo @AyaMorisawa @acid-chicken
|
||||||
/.vscode/ @acid-chicken
|
/.vscode/ @acid-chicken
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
# /docs/*.fr.md @BoFFire
|
# /docs/*.fr.md @BoFFire
|
||||||
# /docs/docker.*.md @khws4v1
|
# /docs/docker.*.md @khws4v1
|
||||||
/locales/ @syuilo
|
/locales/ @syuilo
|
||||||
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken
|
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken @rinsuki
|
||||||
# /src/crypto_key.cc @akihikodaki
|
# /src/crypto_key.cc @akihikodaki
|
||||||
# /src/crypto_key.d.ts @akihikodaki
|
# /src/crypto_key.d.ts @akihikodaki
|
||||||
/.dockerignore @syuilo # @khws4v1
|
/.dockerignore @syuilo # @khws4v1
|
||||||
|
|||||||
@@ -1,22 +1,30 @@
|
|||||||
---
|
---
|
||||||
name: Bug Report
|
name: 🐛 Bug Report
|
||||||
about: Create a report to help us improve
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ⚠️bug?
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Summary
|
## 💡 Summary
|
||||||
|
|
||||||
<!-- Tell us what the bug is -->
|
<!-- Tell us what the bug is -->
|
||||||
|
|
||||||
# Expected Behavior
|
## 🙂 Expected Behavior
|
||||||
|
|
||||||
<!--- Tell us what should happen -->
|
<!--- Tell us what should happen -->
|
||||||
|
|
||||||
# Actual Behavior
|
## ☹️ Actual Behavior
|
||||||
|
|
||||||
<!--- Tell us what happens instead of the expected behavior -->
|
<!--- Tell us what happens instead of the expected behavior -->
|
||||||
|
|
||||||
# Steps to Reproduce
|
## 📝 Steps to Reproduce
|
||||||
|
|
||||||
1.
|
1.
|
||||||
2.
|
2.
|
||||||
3.
|
3.
|
||||||
|
|
||||||
# Environment
|
## 📌 Environment
|
||||||
|
|
||||||
<!-- Tell us where on the platform it happens -->
|
<!-- Tell us where on the platform it happens -->
|
||||||
<!-- e.g. desktop or mobile version, your browser, your OS -->
|
|
||||||
12
.github/ISSUE_TEMPLATE/02_feature-request.md
vendored
Normal file
12
.github/ISSUE_TEMPLATE/02_feature-request.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: ✨ Feature Request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ✨Feature
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
<!-- Tell us what the suggestion is -->
|
||||||
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature Request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
---
|
|
||||||
|
|
||||||
# Summary
|
|
||||||
<!-- Tell us what the suggestion is -->
|
|
||||||
|
|
||||||
# Environment
|
|
||||||
<!-- Tell us where on the platform it related -->
|
|
||||||
<!-- e.g. desktop or mobile version, your browser, your OS -->
|
|
||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,4 +1,4 @@
|
|||||||
# Summary
|
## Summary
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
-
|
-
|
||||||
|
|||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -8,14 +8,15 @@
|
|||||||
built
|
built
|
||||||
/data
|
/data
|
||||||
/.cache-loader
|
/.cache-loader
|
||||||
|
/db
|
||||||
|
/elasticsearch
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
*.pem
|
*.pem
|
||||||
run.bat
|
run.bat
|
||||||
api-docs.json
|
api-docs.json
|
||||||
*.log
|
*.log
|
||||||
/redis
|
/redis
|
||||||
/mongo
|
|
||||||
/elasticsearch
|
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
yarn.lock
|
yarn.lock
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
/files
|
||||||
|
|||||||
538
CHANGELOG.md
538
CHANGELOG.md
@@ -1,6 +1,544 @@
|
|||||||
ChangeLog
|
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`)
|
||||||
|
|
||||||
|
How to migrate to v11 from v10
|
||||||
|
------------------------------
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
coming soon...
|
||||||
|
|
||||||
|
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のアンケートに対応
|
||||||
|
* 複数回答できるアンケートを作成できるように
|
||||||
|
* アンケートに期限を設定できるように
|
||||||
|
* 絵文字ピッカーを改良
|
||||||
|
* ハッシュタグの判定を改善
|
||||||
|
* デッキのタグTLで別のタグをクリックしてもTLが変わらない問題を修正
|
||||||
|
* ユーザーサジェストで表示名が変わらない問題を修正
|
||||||
|
* UIのバグ修正
|
||||||
|
* デザインの調整
|
||||||
|
* など
|
||||||
|
|
||||||
|
10.91.2
|
||||||
|
----------
|
||||||
|
* 10.91.1 で追加した依存関係にXSS脆弱性があったので他のパッケージに差し替え
|
||||||
|
* 初期アクセスでテーマが正しく設定されない問題を修正
|
||||||
|
|
||||||
|
10.91.1
|
||||||
|
----------
|
||||||
|
* ログビューを強化
|
||||||
|
* テーマの切り替えをなめらかに
|
||||||
|
* SVGの判定を修正
|
||||||
|
|
||||||
|
10.91.0
|
||||||
|
----------
|
||||||
|
* ログを管理画面で見れるように
|
||||||
|
* 文字サイズを設定できるように
|
||||||
|
* 返信が表示されない問題を修正
|
||||||
|
* ユーザーページでユーザーを切り替えても前の人の情報が残る問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.90.4
|
||||||
|
----------
|
||||||
|
* url-previewでembedプレイヤー展開をオプトインにするように
|
||||||
|
* デザインの調整
|
||||||
|
* ユーザビリティの強化
|
||||||
|
|
||||||
|
10.90.3
|
||||||
|
----------
|
||||||
|
* モバイルのデッキで投稿フォームウィジェットが設置できなかった問題を修正
|
||||||
|
* ドキュメントの強化
|
||||||
|
* デザインの調整
|
||||||
|
* ユーザビリティの強化
|
||||||
|
|
||||||
|
10.90.2
|
||||||
|
----------
|
||||||
|
* アカウントが削除できない問題を修正
|
||||||
|
* ドキュメントの強化
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.90.1
|
||||||
|
----------
|
||||||
|
* アカウントを作成したときに自動でホームに遷移しない問題を修正
|
||||||
|
* ユーザビリティの強化
|
||||||
|
|
||||||
|
10.90.0
|
||||||
|
----------
|
||||||
|
* モバイル版でもデッキを使えるように
|
||||||
|
* 公開範囲がホームの投稿はハイライトに載せないように
|
||||||
|
* ドキュメントの強化
|
||||||
|
* ユーザーをリストに追加できない問題を修正
|
||||||
|
* UIの修正
|
||||||
|
|
||||||
|
10.89.1
|
||||||
|
----------
|
||||||
|
* リアクション数を表示するように
|
||||||
|
* モバイル版でドライブのフォルダを削除できるように
|
||||||
|
* ドキュメントの強化
|
||||||
|
* プロフィールが更新できない場合がある問題を修正
|
||||||
|
* UIの修正
|
||||||
|
|
||||||
|
10.89.0
|
||||||
|
----------
|
||||||
|
* APIのエラーの形式を統一
|
||||||
|
* APIドキュメント刷新
|
||||||
|
* /api/v1/instance/peers 復活
|
||||||
|
* 「返信が遷移後も残り続ける問題を修正」([9beddc9](https://github.com/syuilo/misskey/commit/9beddc941a716f1322ae0b7d71d159edd642a399)) によって遷移前に返信が表示されなくなった問題を修正
|
||||||
|
* デッキモードにてユーザーのプロフィールを連続で見たとき、アクティビティや画像が前のユーザーのもののまま表示される問題を修正
|
||||||
|
|
||||||
|
10.88.0
|
||||||
|
----------
|
||||||
|
* アカウントの削除を試験的に実装
|
||||||
|
* デッキでメディア投稿のみ表示するオプションが機能していない問題を修正
|
||||||
|
* デッキでユーザーを表示したときにタイムラインが残存する問題を修正
|
||||||
|
* モバイルのユーザーページで、ユーザーAのタイムラインから他のユーザーBを選択してユーザーBのタイムラインに移動したとき、ユーザーAのタイムラインが残る問題を修正
|
||||||
|
* ハイライトでミュートしているユーザーの投稿が含まれる問題を修正
|
||||||
|
* 「みつける」でミュートしているユーザーが含まれる問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.87.5
|
||||||
|
----------
|
||||||
|
* モバイル版でも連携サービスを表示するように
|
||||||
|
* webfingerのacceptが反映されない問題を修正
|
||||||
|
* 返信が遷移後も残り続ける問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.87.4
|
||||||
|
----------
|
||||||
|
* フォローリクエストを許可するときにエラーになる問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.87.3
|
||||||
|
----------
|
||||||
|
* 開発モードでビルドしてもスクリプトが404になる問題を修正
|
||||||
|
* 拡張子判別だとアイコンやバナー設定で対応していないと表示される問題を修正
|
||||||
|
* フォローリクエスト数がおかしい場合の応急処置APIを追加
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.87.2
|
||||||
|
----------
|
||||||
|
* みつけるの人気のタグを第2ソートで連合含めたユーザー数にしたりユーザーのタグ以外は除外するように
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.87.1
|
||||||
|
----------
|
||||||
|
* ハッシュタグ検索で大文字小文字が区別されてしまう問題を修正
|
||||||
|
|
||||||
|
10.87.0
|
||||||
|
----------
|
||||||
|
* ハッシュタグでユーザー検索できるように
|
||||||
|
* Exploreページに新規ユーザー一覧を追加
|
||||||
|
* デッキ使用中にホーム扱いで開かれた時にタイムラインボタン等がない問題を修正
|
||||||
|
* デッキ使用中に / 以外でリロードした際にホームモードになる問題を修正
|
||||||
|
|
||||||
|
10.86.2
|
||||||
|
----------
|
||||||
|
* 別タブでルートより下を開いたときにはデッキにしないように
|
||||||
|
* 横のナビゲーションバーの改善
|
||||||
|
* MIDIファイルがオーディオ扱いになる問題を修正
|
||||||
|
* ミュートワードで正規表現を使えるように
|
||||||
|
* デッキで無効になったタイムラインに警告を表示するように
|
||||||
|
* デザインの調整
|
||||||
|
* その他細かな修正
|
||||||
|
|
||||||
|
10.86.1
|
||||||
|
----------
|
||||||
|
* ナビゲーションバーの「ホーム」を「タイムライン」に改称
|
||||||
|
* モバイル版でユーザーページが二重に描画される問題を修正
|
||||||
|
* ユーザー一覧の「もっと読み込む」の動作がおかしい問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.86.0
|
||||||
|
----------
|
||||||
|
* Exploreページを実装
|
||||||
|
* UIを改良
|
||||||
|
* その他細かな修正
|
||||||
|
|
||||||
|
10.85.2
|
||||||
|
----------
|
||||||
|
* デッキから フォロー/フォロワー ページに行けるように
|
||||||
|
* ナビゲーションが発生したときに最上部までスクロールように
|
||||||
|
* 検索結果でページ遷移が発生する問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.85.1
|
||||||
|
----------
|
||||||
|
* ローカルのみ投稿をログイン画面のタイムラインに表示しないように
|
||||||
|
* ナビゲーションバーを横にしてるとデッキに行けない問題を修正
|
||||||
|
|
||||||
|
10.85.0
|
||||||
|
----------
|
||||||
|
* デスクトップ版のUIを改良
|
||||||
|
* 投稿ハイライトページを実装
|
||||||
|
* 無効化されているタイムラインのフォールバック
|
||||||
|
* 既にフォローされている場合はフォローリクエストを生成しないように
|
||||||
|
* その他細かな修正
|
||||||
|
|
||||||
|
10.84.2
|
||||||
|
----------
|
||||||
|
* GIF画像にGIFバッジを表示
|
||||||
|
* よく話すユーザーからサスペンドされたユーザーを隠すなど
|
||||||
|
* nodeinfoが重い問題を修正
|
||||||
|
* ハッシュタグクラウド取得が重い問題を軽減
|
||||||
|
|
||||||
|
10.84.1
|
||||||
|
----------
|
||||||
|
* deckにフォローされていますマークを追加
|
||||||
|
* URLプレビューのサムネイルの調整
|
||||||
|
* 管理画面でサイレンスされているユーザーを一覧できるように
|
||||||
|
* ドキュメントにアクセスできない問題を修正
|
||||||
|
* ジョブキューを無効化
|
||||||
|
* 軽微なバグ修正
|
||||||
|
|
||||||
|
10.84.0
|
||||||
|
----------
|
||||||
|
* インスタンス管理の強化
|
||||||
|
* パフォーマンスの問題の修正
|
||||||
|
* バグ修正
|
||||||
|
|
||||||
|
10.83.0
|
||||||
|
----------
|
||||||
|
* 特定のインスタンスをブロックをできるように
|
||||||
|
* 特定のインスタンスからのフォローを全解除できるように
|
||||||
|
* インスタンスごとのチャートを追加
|
||||||
|
|
||||||
|
10.82.4
|
||||||
|
----------
|
||||||
|
* 10.82.3でオブジェクトストレージの設定をしていると起動しなくなるバグを修正
|
||||||
|
|
||||||
|
10.82.3
|
||||||
|
----------
|
||||||
|
* フォロー/ミュート/ブロックデータをエクスポート可能に
|
||||||
|
* バグ修正
|
||||||
|
* デザインの調整
|
||||||
|
* ジョブキューの動作を修正
|
||||||
|
|
||||||
|
10.82.2
|
||||||
|
----------
|
||||||
|
* ジョブキューの動作を修正
|
||||||
|
|
||||||
|
10.82.1
|
||||||
|
----------
|
||||||
|
* クラスタリング環境でのジョブキューの動作を修正
|
||||||
|
* その他の軽微な改善
|
||||||
|
|
||||||
|
10.82.0
|
||||||
|
----------
|
||||||
|
* 自分の投稿情報をエクスポートできるように
|
||||||
|
* アニメーションする画像を再生しないで表示するオプションを実装
|
||||||
|
* 個別に投稿のウォッチ/ウォッチ解除をできるように
|
||||||
|
|
||||||
10.81.0
|
10.81.0
|
||||||
----------
|
----------
|
||||||
* 動画のサムネイルを作成するように
|
* 動画のサムネイルを作成するように
|
||||||
|
|||||||
157
CONTRIBUTING.md
157
CONTRIBUTING.md
@@ -40,7 +40,160 @@ Stands for _**M**iss**k**ey_.
|
|||||||
Stands for _**S**ervice**W**orker_.
|
Stands for _**S**ervice**W**orker_.
|
||||||
|
|
||||||
### Nyaize
|
### Nyaize
|
||||||
な を にゃ にすること
|
Convert な(na) to にゃ(nya)
|
||||||
|
|
||||||
#### Denyaize
|
#### Denyaize
|
||||||
Nyaizeを解除すること
|
Revert Nyaize
|
||||||
|
|
||||||
|
## Code style
|
||||||
|
### セミコロンを省略しない
|
||||||
|
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 {
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
``` ts
|
||||||
|
export function something(foo: string): string {
|
||||||
|
```
|
||||||
|
|
||||||
|
## Directory structure
|
||||||
|
```
|
||||||
|
src ... Source code
|
||||||
|
@types ... Type definitions
|
||||||
|
prelude ... Independence utils for coding JavaScript without side effects
|
||||||
|
misc ... Independence utils for Misskey without side effects
|
||||||
|
service ... Common functions with side effects
|
||||||
|
queue ... Job queues and Jobs
|
||||||
|
server ... Web Server
|
||||||
|
client ... Client
|
||||||
|
mfm ... MFM
|
||||||
|
|
||||||
|
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 });
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
|
||||||
|
### `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';
|
||||||
|
// }
|
||||||
|
// の糖衣構文のような扱いです
|
||||||
|
```
|
||||||
|
|||||||
16
Dockerfile
16
Dockerfile
@@ -8,11 +8,9 @@ WORKDIR /misskey
|
|||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
|
|
||||||
RUN unlink /usr/bin/free
|
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
ffmpeg \
|
|
||||||
file \
|
file \
|
||||||
g++ \
|
g++ \
|
||||||
gcc \
|
gcc \
|
||||||
@@ -21,22 +19,20 @@ RUN apk add --no-cache \
|
|||||||
make \
|
make \
|
||||||
nasm \
|
nasm \
|
||||||
pkgconfig \
|
pkgconfig \
|
||||||
procps \
|
|
||||||
python \
|
python \
|
||||||
zlib-dev
|
zlib-dev
|
||||||
RUN npm i -g node-gyp
|
|
||||||
|
|
||||||
COPY ./package.json ./
|
COPY package.json ./
|
||||||
RUN npm i
|
RUN npm i
|
||||||
|
|
||||||
COPY . ./
|
COPY . ./
|
||||||
RUN node-gyp configure \
|
RUN npm run build
|
||||||
&& node-gyp build \
|
|
||||||
&& npm run build
|
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
|
|
||||||
RUN apk add --no-cache tini
|
RUN apk add --no-cache \
|
||||||
|
ffmpeg \
|
||||||
|
tini
|
||||||
|
RUN npm i -g web-push
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
|
||||||
COPY --from=builder /misskey/node_modules ./node_modules
|
COPY --from=builder /misskey/node_modules ./node_modules
|
||||||
|
|||||||
99
README.md
99
README.md
@@ -1,11 +1,11 @@
|
|||||||
<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.xyz/)
|
||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
[](https://circleci.com/gh/syuilo/misskey)
|
[](https://circleci.com/gh/syuilo/misskey)
|
||||||
[](https://david-dm.org/syuilo/misskey)
|
[](https://david-dm.org/syuilo/misskey)
|
||||||
[](http://makeapullrequest.com)
|
[](http://makeapullrequest.com)
|
||||||
|
|
||||||
**A forever evolving, sophisticated microblogging platform.**
|
**A forever evolving, sophisticated microblogging platform.**
|
||||||
|
|
||||||
@@ -59,7 +59,19 @@ 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
|
||||||
|
----------------------------------------------------------------
|
||||||
|
### Profile page
|
||||||
|
<img src="/assets/ss/user.jpg" width="500px"/>
|
||||||
|
|
||||||
|
### Explore users
|
||||||
|
<img src="/assets/ss/explore.jpg" width="500px"/>
|
||||||
|
|
||||||
|
:new: What's new
|
||||||
|
----------------------------------------------------------------
|
||||||
|
Please see the [Release notes](./CHANGELOG.md).
|
||||||
|
|
||||||
:package: Create your own instance
|
:package: Create your own instance
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -76,69 +88,86 @@ 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://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://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/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>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
|
<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/AyaMorisawa">@AyaMorisawa</a></td>
|
||||||
<td align="center"><a href="https://github.com/mei23">@mei23</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/acid-chicken">@acid-chicken</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/rinsuki">@rinsuki</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
:heart: Backers & Sponsors
|
:heart: Backers
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
<table><tr>
|
<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://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://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/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/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" 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/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" 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>
|
||||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" 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/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=Ch3iF81ZGP0LMo894Y9ajpLisgtE91SnxtZE7fxsgrM%3D" alt="べすれい" 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>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
|
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
|
||||||
<td><a href="https://www.patreon.com/negao">negao</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=12913507">Melilot</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</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/user?u=3384329">べすれい</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<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://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1.png?token-time=2145916800&token-hash=FMV7cPKBD1TU2WTbl1jg6AcdKSvTb2BSFcDhgc-EO8w%3D" alt="gutfuckllc" 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://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/18833336" alt="itiradi" 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://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://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/3?token-time=2145916800&token-hash=gMq30aylxu5v3G8pRhWR5jeRBbYWEoRKjGbNeiCQz5g%3D" alt="Acid Chicken" 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://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://c8.patreon.com/2/200/17463605" alt="Sampot" 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/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
||||||
|
<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>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</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=12718187">Peter G.</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
|
<td><a href="https://www.patreon.com/user?u=18833336">itiradi</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</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/yukimochi">YUKIMOCHI</a></td>
|
||||||
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
|
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
||||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<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/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/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/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/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/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/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=uR-48MQ0A4j0irQSrCAQZJ-sJUSs_Fkihlg3-l59b7c%3D" alt="Takashi Shibuya" 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/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/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>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<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>
|
||||||
|
<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/hekovic">Hekovic</a></td>
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
<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/mastodon">Gargron</a></td>
|
||||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<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/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Tue, 29 Jan 2019 04:42:06 UTC
|
**Last updated:** Wed, 24 Apr 2019 05:56:07 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
|||||||
BIN
assets/api-doc.png
Normal file
BIN
assets/api-doc.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
4
assets/robots.txt
Normal file
4
assets/robots.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
user-agent: *
|
||||||
|
allow: /
|
||||||
|
|
||||||
|
# todo: sitemap
|
||||||
BIN
assets/ss/explore.jpg
Normal file
BIN
assets/ss/explore.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 238 KiB |
BIN
assets/ss/user.jpg
Normal file
BIN
assets/ss/user.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 148 KiB |
@@ -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: .
|
build: .
|
||||||
restart: always
|
restart: always
|
||||||
links:
|
links:
|
||||||
- mongo
|
- db
|
||||||
# - redis
|
- redis
|
||||||
# - es
|
# - es
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:3000:3000"
|
- "127.0.0.1:3000:3000"
|
||||||
@@ -14,26 +14,23 @@ services:
|
|||||||
- internal_network
|
- internal_network
|
||||||
- external_network
|
- external_network
|
||||||
|
|
||||||
# redis:
|
redis:
|
||||||
# restart: always
|
|
||||||
# image: redis:4.0-alpine
|
|
||||||
# networks:
|
|
||||||
# - internal_network
|
|
||||||
### Uncomment to enable Redis persistance
|
|
||||||
## volumes:
|
|
||||||
## - ./redis:/data
|
|
||||||
|
|
||||||
mongo:
|
|
||||||
restart: always
|
restart: always
|
||||||
image: mongo:4.1
|
image: redis:4.0-alpine
|
||||||
networks:
|
networks:
|
||||||
- internal_network
|
- internal_network
|
||||||
environment:
|
|
||||||
MONGO_INITDB_DATABASE: "misskey"
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./.config/mongo_initdb.js:/docker-entrypoint-initdb.d/mongo_initdb.js:ro
|
- ./redis:/data
|
||||||
### Uncomment to enable MongoDB persistance
|
|
||||||
# - ./mongo:/data
|
db:
|
||||||
|
restart: always
|
||||||
|
image: postgres:11.2-alpine
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
env_file:
|
||||||
|
- .config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ./db:/var/lib/postgresql/data
|
||||||
|
|
||||||
# es:
|
# es:
|
||||||
# restart: always
|
# restart: always
|
||||||
@@ -42,9 +39,8 @@ services:
|
|||||||
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||||
# networks:
|
# networks:
|
||||||
# - internal_network
|
# - internal_network
|
||||||
#### Uncomment to enable ES persistence
|
# volumes:
|
||||||
## volumes:
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
## - ./elasticsearch:/usr/share/elasticsearch/data
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
internal_network:
|
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.* Download Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch.
|
1. 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.
|
`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
|
*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`.
|
Create configuration files with following:
|
||||||
3. Edit `default.yml` and `mongo_initdb.js`.
|
|
||||||
|
```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
|
*3.* Configure Docker
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -29,7 +65,13 @@ Build misskey with the following:
|
|||||||
|
|
||||||
`docker-compose build`
|
`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.
|
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!
|
Just `docker-compose up -d`. GLHF!
|
||||||
|
|
||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git fetch`
|
1. `git stash`
|
||||||
2. `git stash`
|
2. `git checkout master`
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git stash pop`
|
||||||
5. `docker-compose build`
|
5. `docker-compose build`
|
||||||
6. Check [ChangeLog](../CHANGELOG.md) for migration information
|
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.* 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.
|
1. 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).
|
`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
|
*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!
|
Utilisez la commande `docker-compose up -d`. GLHF!
|
||||||
|
|
||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git fetch`
|
1. `git stash`
|
||||||
2. `git stash`
|
2. `git checkout master`
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git stash pop`
|
||||||
5. `docker-compose build`
|
5. `docker-compose build`
|
||||||
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
|
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)
|
### Configuration d'ElasticSearch (pour la fonction de recherche)
|
||||||
*1.* Préparation de l'environnement
|
*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
|
1. 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)
|
|
||||||
|
`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
|
*2.* Après lancement du docker-compose, initialisation de la base ElasticSearch
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `docker-compose -it web /bin/sh` Connexion dans le conteneur web
|
1. 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
|
`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`
|
4. `exit`
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|||||||
@@ -9,15 +9,51 @@ Dockerを使ったMisskey構築方法
|
|||||||
|
|
||||||
*1.* Misskeyのダウンロード
|
*1.* Misskeyのダウンロード
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
|
1. 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)を確認
|
|
||||||
|
|
||||||
*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の設定
|
*3.* Dockerの設定
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -29,7 +65,13 @@ Dockerを使ったMisskey構築方法
|
|||||||
|
|
||||||
`docker-compose build`
|
`docker-compose build`
|
||||||
|
|
||||||
*5.* 以上です!
|
*5.* データベースを初期化
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
docker-compose run --rm web npm run init
|
||||||
|
```
|
||||||
|
|
||||||
|
*6.* 以上です!
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
|
|
||||||
@@ -37,9 +79,9 @@ Dockerを使ったMisskey構築方法
|
|||||||
`docker-compose up -d`するだけです。GLHF!
|
`docker-compose up -d`するだけです。GLHF!
|
||||||
|
|
||||||
### Misskeyを最新バージョンにアップデートする方法:
|
### Misskeyを最新バージョンにアップデートする方法:
|
||||||
1. `git fetch`
|
1. `git stash`
|
||||||
2. `git stash`
|
2. `git checkout master`
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git stash pop`
|
||||||
5. `docker-compose build`
|
5. `docker-compose build`
|
||||||
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ server {
|
|||||||
listen [::]:443 http2;
|
listen [::]:443 http2;
|
||||||
server_name example.tld;
|
server_name example.tld;
|
||||||
ssl on;
|
ssl on;
|
||||||
ssl_session_cache shared:ssl_session_cache:10m;
|
ssl_session_cache shared:ssl_session_cache:10m;
|
||||||
|
|
||||||
# To use Let's Encrypt certificate
|
# To use Let's Encrypt certificate
|
||||||
ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem;
|
ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem;
|
||||||
|
|||||||
114
docs/setup.en.md
114
docs/setup.en.md
@@ -22,41 +22,50 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Please install and setup these softwares:
|
Please install and setup these softwares:
|
||||||
|
|
||||||
#### Dependencies :package:
|
#### Dependencies :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||||
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optional
|
##### 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
|
* [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. Connect to misskey user.
|
||||||
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!
|
|
||||||
|
|
||||||
*4.* Install Misskey
|
`su - 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.
|
|
||||||
|
|
||||||
*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`
|
2. Edit `default.yml`
|
||||||
|
|
||||||
*6.* Build Misskey
|
*5.* Build Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
Build misskey with the following:
|
Build misskey with the following:
|
||||||
|
|
||||||
`npm run build`
|
`NODE_ENV=production npm run build`
|
||||||
|
|
||||||
If you're on Debian, you will need to install the `build-essential`, `python` package.
|
If you're on Debian, you will need to install the `build-essential`, `python` package.
|
||||||
|
|
||||||
@@ -65,49 +74,64 @@ If you're still encountering errors about some modules, use node-gyp:
|
|||||||
1. `npm install -g node-gyp`
|
1. `npm install -g node-gyp`
|
||||||
2. `node-gyp configure`
|
2. `node-gyp configure`
|
||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
|
|
||||||
|
*6.* Init DB
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
npm run init
|
||||||
|
```
|
||||||
|
|
||||||
*7.* That is it.
|
*7.* That is it.
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Well done! Now, you have an environment that run to Misskey.
|
Well done! Now, you have an environment that run to Misskey.
|
||||||
|
|
||||||
### Launch normally
|
### Launch normally
|
||||||
Just `npm start`. GLHF!
|
Just `NODE_ENV=production npm start`. GLHF!
|
||||||
|
|
||||||
### Launch with systemd
|
### 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:
|
2. Edit it, and paste this and save:
|
||||||
|
|
||||||
```
|
```
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Misskey daemon
|
Description=Misskey daemon
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=misskey
|
User=misskey
|
||||||
ExecStart=/usr/bin/npm start
|
ExecStart=/usr/bin/npm start
|
||||||
WorkingDirectory=/home/misskey/misskey
|
WorkingDirectory=/home/misskey/misskey
|
||||||
TimeoutSec=60
|
Environment="NODE_ENV=production"
|
||||||
StandardOutput=syslog
|
TimeoutSec=60
|
||||||
StandardError=syslog
|
StandardOutput=syslog
|
||||||
SyslogIdentifier=misskey
|
StandardError=syslog
|
||||||
Restart=always
|
SyslogIdentifier=misskey
|
||||||
|
Restart=always
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
|
||||||
3. `systemctl daemon-reload ; systemctl enable misskey` Reload systemd and enable the misskey service.
|
3. Reload systemd and enable the misskey service.
|
||||||
4. `systemctl start misskey` Start 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`.
|
You can check if the service is running with `systemctl status misskey`.
|
||||||
|
|
||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git fetch`
|
1. `git checkout master`
|
||||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `npm install`
|
||||||
4. `npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
||||||
6. Restart your Misskey process to apply changes
|
6. Restart your Misskey process to apply changes
|
||||||
7. Enjoy
|
7. Enjoy
|
||||||
|
|||||||
110
docs/setup.fr.md
110
docs/setup.fr.md
@@ -22,41 +22,50 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Installez les paquets suivants :
|
Installez les paquets suivants :
|
||||||
|
|
||||||
#### Dépendences :package:
|
#### Dépendences :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||||
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optionnels
|
##### 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
|
* [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. Basculez vers l'utilisateur misskey.
|
||||||
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é !
|
|
||||||
|
|
||||||
*4.* Installation de Misskey
|
`su - 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.
|
|
||||||
|
|
||||||
*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`
|
2. Editez le fichier `default.yml`
|
||||||
|
|
||||||
*6.* Construction de Misskey
|
*5.* Construction de Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
Construisez Misskey comme ceci :
|
Construisez Misskey comme ceci :
|
||||||
|
|
||||||
`npm run build`
|
`NODE_ENV=production npm run build`
|
||||||
|
|
||||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
|
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
|
||||||
|
|
||||||
@@ -65,49 +74,58 @@ Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
|||||||
1. `npm install -g node-gyp`
|
1. `npm install -g node-gyp`
|
||||||
2. `node-gyp configure`
|
2. `node-gyp configure`
|
||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `npm run 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
|
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
||||||
|
|
||||||
### Lancement conventionnel
|
### Lancement conventionnel
|
||||||
Lancez tout simplement `npm start`. Bonne chance et amusez-vous bien !
|
Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-vous bien !
|
||||||
|
|
||||||
### Démarrage avec systemd
|
### 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 :
|
2. Editez-le puis copiez et coller ceci dans le fichier :
|
||||||
|
|
||||||
```
|
```
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Misskey daemon
|
Description=Misskey daemon
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=misskey
|
User=misskey
|
||||||
ExecStart=/usr/bin/npm start
|
ExecStart=/usr/bin/npm start
|
||||||
WorkingDirectory=/home/misskey/misskey
|
WorkingDirectory=/home/misskey/misskey
|
||||||
TimeoutSec=60
|
Environment="NODE_ENV=production"
|
||||||
StandardOutput=syslog
|
TimeoutSec=60
|
||||||
StandardError=syslog
|
StandardOutput=syslog
|
||||||
SyslogIdentifier=misskey
|
StandardError=syslog
|
||||||
Restart=always
|
SyslogIdentifier=misskey
|
||||||
|
Restart=always
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
|
||||||
3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey.
|
3. Redémarre systemd et active le service misskey.
|
||||||
4. `systemctl start misskey` Démarre 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`.
|
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
|
### Méthode de mise à jour vers la plus récente version de Misskey
|
||||||
1. `git fetch`
|
1. `git checkout master`
|
||||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `npm install`
|
||||||
4. `npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|||||||
124
docs/setup.ja.md
124
docs/setup.ja.md
@@ -22,47 +22,51 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
これらのソフトウェアをインストール・設定してください:
|
これらのソフトウェアをインストール・設定してください:
|
||||||
|
|
||||||
#### 依存関係 :package:
|
#### 依存関係 :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)** (10.0.0以上)
|
* **[Node.js](https://nodejs.org/en/)** (11.7.0以上)
|
||||||
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
* **[PostgreSQL](https://www.postgresql.org/)** (10以上)
|
||||||
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### オプション
|
##### オプション
|
||||||
* [Redis](https://redis.io/)
|
|
||||||
* Redisはオプションですが、インストールすることを強く推奨します。
|
|
||||||
* インストールしなくていいのは、あなたのインスタンスが自分専用のときだけとお考えください。
|
|
||||||
* 具体的には、Redisをインストールしないと、次の事が出来なくなります:
|
|
||||||
* Misskeyプロセスを複数起動しての負荷分散
|
|
||||||
* レートリミット
|
|
||||||
* Twitter連携
|
|
||||||
* [Elasticsearch](https://www.elastic.co/)
|
* [Elasticsearch](https://www.elastic.co/)
|
||||||
* 検索機能を有効にするためにはインストールが必要です。
|
* 検索機能を有効にするためにはインストールが必要です。
|
||||||
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
|
|
||||||
*3.* MongoDBの設定
|
*3.* Misskeyのインストール
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
ルートで:
|
1. misskeyユーザーを使用
|
||||||
1. `mongo` mongoシェルを起動
|
|
||||||
2. `use misskey` misskeyデータベースを使用
|
|
||||||
3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` misskeyユーザーを作成
|
|
||||||
4. `exit` mongoシェルを終了
|
|
||||||
|
|
||||||
*4.* Misskeyのインストール
|
`su - 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の依存パッケージをインストール
|
|
||||||
|
|
||||||
*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` を編集する。
|
2. `default.yml` を編集する。
|
||||||
|
|
||||||
*6.* Misskeyのビルド
|
*5.* Misskeyのビルド
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
次のコマンドでMisskeyをビルドしてください:
|
次のコマンドでMisskeyをビルドしてください:
|
||||||
|
|
||||||
`npm run build`
|
`NODE_ENV=production npm run build`
|
||||||
|
|
||||||
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
|
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
|
||||||
|
|
||||||
@@ -70,51 +74,69 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
|||||||
1. `npm install -g node-gyp`
|
1. `npm install -g node-gyp`
|
||||||
2. `node-gyp configure`
|
2. `node-gyp configure`
|
||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
|
|
||||||
|
*6.* データベースを初期化
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
npm run init
|
||||||
|
```
|
||||||
|
|
||||||
*7.* 以上です!
|
*7.* 以上です!
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
|
|
||||||
### 通常起動
|
### 通常起動
|
||||||
`npm start`するだけです。GLHF!
|
`NODE_ENV=production npm start`するだけです。GLHF!
|
||||||
|
|
||||||
### systemdを用いた起動
|
### systemdを用いた起動
|
||||||
1. systemdサービスのファイルを作成: `/etc/systemd/system/misskey.service`
|
1. systemdサービスのファイルを作成
|
||||||
|
|
||||||
|
`/etc/systemd/system/misskey.service`
|
||||||
|
|
||||||
2. エディタで開き、以下のコードを貼り付けて保存:
|
2. エディタで開き、以下のコードを貼り付けて保存:
|
||||||
|
|
||||||
```
|
```
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Misskey daemon
|
Description=Misskey daemon
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=misskey
|
User=misskey
|
||||||
ExecStart=/usr/bin/npm start
|
ExecStart=/usr/bin/npm start
|
||||||
WorkingDirectory=/home/misskey/misskey
|
WorkingDirectory=/home/misskey/misskey
|
||||||
TimeoutSec=60
|
Environment="NODE_ENV=production"
|
||||||
StandardOutput=syslog
|
TimeoutSec=60
|
||||||
StandardError=syslog
|
StandardOutput=syslog
|
||||||
SyslogIdentifier=misskey
|
StandardError=syslog
|
||||||
Restart=always
|
SyslogIdentifier=misskey
|
||||||
|
Restart=always
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
|
||||||
|
|
||||||
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
|
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
||||||
4. `systemctl start misskey` misskeyサービスの起動
|
|
||||||
|
3. systemdを再読み込みしmisskeyサービスを有効化
|
||||||
|
|
||||||
|
`systemctl daemon-reload ; systemctl enable misskey`
|
||||||
|
|
||||||
|
4. misskeyサービスの起動
|
||||||
|
|
||||||
|
`systemctl start misskey`
|
||||||
|
|
||||||
`systemctl status misskey`と入力すると、サービスの状態を調べることができます。
|
`systemctl status misskey`と入力すると、サービスの状態を調べることができます。
|
||||||
|
|
||||||
### Misskeyを最新バージョンにアップデートする方法:
|
### Misskeyを最新バージョンにアップデートする方法:
|
||||||
1. `git fetch`
|
1. `git checkout master`
|
||||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `npm install`
|
||||||
4. `npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||||
|
|
||||||
|
なにか問題が発生した場合は、`npm run clean`または`npm run cleanall`すると直る場合があります。
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
なにかお困りのことがありましたらお気軽にご連絡ください。
|
なにかお困りのことがありましたらお気軽にご連絡ください。
|
||||||
|
|||||||
11
gulpfile.ts
11
gulpfile.ts
@@ -5,7 +5,6 @@
|
|||||||
import * as gulp from 'gulp';
|
import * as gulp from 'gulp';
|
||||||
import * as gutil from 'gulp-util';
|
import * as gutil from 'gulp-util';
|
||||||
import * as ts from 'gulp-typescript';
|
import * as ts from 'gulp-typescript';
|
||||||
const yaml = require('gulp-yaml');
|
|
||||||
const sourcemaps = require('gulp-sourcemaps');
|
const sourcemaps = require('gulp-sourcemaps');
|
||||||
import tslint from 'gulp-tslint';
|
import tslint from 'gulp-tslint';
|
||||||
const cssnano = require('gulp-cssnano');
|
const cssnano = require('gulp-cssnano');
|
||||||
@@ -50,7 +49,6 @@ gulp.task('build:copy:views', () =>
|
|||||||
|
|
||||||
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./build/Release/crypto_key.node',
|
|
||||||
'./src/const.json',
|
'./src/const.json',
|
||||||
'./src/server/web/views/**/*',
|
'./src/server/web/views/**/*',
|
||||||
'./src/**/assets/**/*',
|
'./src/**/assets/**/*',
|
||||||
@@ -121,17 +119,11 @@ gulp.task('copy:client', () =>
|
|||||||
])
|
])
|
||||||
.pipe(isProduction ? (imagemin as any)() : gutil.noop())
|
.pipe(isProduction ? (imagemin as any)() : gutil.noop())
|
||||||
.pipe(rename(path => {
|
.pipe(rename(path => {
|
||||||
path.dirname = path.dirname.replace('assets', '.');
|
path.dirname = path.dirname!.replace('assets', '.');
|
||||||
}))
|
}))
|
||||||
.pipe(gulp.dest('./built/client/assets/'))
|
.pipe(gulp.dest('./built/client/assets/'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('locales', () =>
|
|
||||||
gulp.src('./locales/*.yml')
|
|
||||||
.pipe(yaml({ schema: 'DEFAULT_SAFE_SCHEMA' }))
|
|
||||||
.pipe(gulp.dest('./built/client/assets/locales/'))
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task('doc', () =>
|
gulp.task('doc', () =>
|
||||||
gulp.src('./src/docs/**/*.styl')
|
gulp.src('./src/docs/**/*.styl')
|
||||||
.pipe(stylus())
|
.pipe(stylus())
|
||||||
@@ -149,7 +141,6 @@ gulp.task('build', gulp.parallel(
|
|||||||
'build:ts',
|
'build:ts',
|
||||||
'build:copy',
|
'build:copy',
|
||||||
'build:client',
|
'build:client',
|
||||||
'locales',
|
|
||||||
'doc'
|
'doc'
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|||||||
1612
locales/ca-ES.yml
1612
locales/ca-ES.yml
File diff suppressed because it is too large
Load Diff
1200
locales/cs-CZ.yml
Normal file
1200
locales/cs-CZ.yml
Normal file
File diff suppressed because it is too large
Load Diff
1336
locales/de-DE.yml
1336
locales/de-DE.yml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1102
locales/es-ES.yml
1102
locales/es-ES.yml
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
meta:
|
meta:
|
||||||
lang: "Français"
|
lang: "Français"
|
||||||
divider: ""
|
|
||||||
common:
|
common:
|
||||||
misskey: "Une ⭐ du fédiverse"
|
misskey: "Une ⭐ du fédiverse"
|
||||||
about-title: "Une ⭐ du fédiverse."
|
about-title: "Une ⭐ du fédiverse."
|
||||||
@@ -14,10 +13,10 @@ common:
|
|||||||
rich-contents-desc: "Partagez vos idées, les événements et les sujets qui vous tiennent à cœur ainsi que tout autre chose que vous souhaitez partager avec les autres. Si vous le désirez, vous pouvez décorer vos messages en utilisant une syntaxe différente ou en y joignant des sondages et des fichiers, tels que les photos ou les vidéos que vous aimez."
|
rich-contents-desc: "Partagez vos idées, les événements et les sujets qui vous tiennent à cœur ainsi que tout autre chose que vous souhaitez partager avec les autres. Si vous le désirez, vous pouvez décorer vos messages en utilisant une syntaxe différente ou en y joignant des sondages et des fichiers, tels que les photos ou les vidéos que vous aimez."
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
reaction-desc: "Une manière simple d'exprimer vos émotions. Misskey peut attacher diverses réactions aux publications des autres utilisateurs. Si vous essayez les réactions sur Misskey, vous ne pourrez plus retourner sur une autre plateforme de réseaux sociaux n'offrant que des « J'aime »."
|
reaction-desc: "Une manière simple d'exprimer vos émotions. Misskey peut attacher diverses réactions aux publications des autres utilisateurs. Si vous essayez les réactions sur Misskey, vous ne pourrez plus retourner sur une autre plateforme de réseaux sociaux n'offrant que des « J'aime »."
|
||||||
ui: "Interface utilisateur"
|
ui: "Interface"
|
||||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
ui-desc: "Aucune interface graphique ne peut plaire à tout le monde. Par conséquent, Misskey possède une interface utilisateur hautement personnalisable selon vos goûts. Vous pouvez rendre votre page d'accueil originale en modifiant la mise en page de votre fil et en déplaçant les widgets que vous pouvez facilement ajuster pour vous approprier cet espace."
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "Vous voulez poster une photo que vous avez déjà transférée ? Vous souhaitez organiser, nommer et créer un dossier pour vos fichiers téléversés ? Misskey Drive est la meilleure solution pour vous. Très facile de partager vos fichiers en ligne."
|
||||||
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseau social fédéré, vous pouvez essayer d’autres instances afin de trouver vos amis si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien !"
|
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseau social fédéré, vous pouvez essayer d’autres instances afin de trouver vos amis si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien !"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Veuillez désactiver votre bloqueur de publicités"
|
detected: "Veuillez désactiver votre bloqueur de publicités"
|
||||||
@@ -28,10 +27,16 @@ common:
|
|||||||
load-more: "Charger plus"
|
load-more: "Charger plus"
|
||||||
enter-password: "Veuillez entrer le mot de passe"
|
enter-password: "Veuillez entrer le mot de passe"
|
||||||
2fa: "Authentification à deux facteurs"
|
2fa: "Authentification à deux facteurs"
|
||||||
|
customize-home: "Personnaliser la disposition de votre accueil"
|
||||||
|
featured-notes: "Les notes mises en avant"
|
||||||
|
dark-mode: "Mode nuit"
|
||||||
|
signin: "Se connecter"
|
||||||
|
signup: "S'enregistrer"
|
||||||
|
signout: "Se déconnecter"
|
||||||
|
reload-to-apply-the-setting: "Le rechargement de la page est nécessaire pour appliquer ces paramètres. Désirez-vous la recharger maintenant ?"
|
||||||
got-it: "J’ai compris !"
|
got-it: "J’ai compris !"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
paragraph: "<p>ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。</p><p>一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。</p><p>ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。</p><p>カスタマイズを終了するには、右上の「完了」をクリックします。</p>"
|
|
||||||
gotit: "Compris !"
|
gotit: "Compris !"
|
||||||
notification:
|
notification:
|
||||||
file-uploaded: "Le fichier a été téléversé !"
|
file-uploaded: "Le fichier a été téléversé !"
|
||||||
@@ -56,6 +61,26 @@ common:
|
|||||||
trash: "Corbeille"
|
trash: "Corbeille"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
messaging: "Conversations"
|
messaging: "Conversations"
|
||||||
|
home: "Principal"
|
||||||
|
deck: "Deck"
|
||||||
|
timeline: "Fil"
|
||||||
|
explore: "Découvrir"
|
||||||
|
following: "Suit"
|
||||||
|
followers: "Abonné·e·s"
|
||||||
|
favorites: "Mettre cette note en favoris"
|
||||||
|
permissions:
|
||||||
|
"read:account": "Afficher les informations du compte"
|
||||||
|
"write:account": "Mettre à jour les informations de votre compte"
|
||||||
|
"read:drive": "Parcourir le Drive"
|
||||||
|
"write:drive": "Écrire sur le Drive"
|
||||||
|
"read:favorites": "Afficher les favoris"
|
||||||
|
"write:notes": "Créer ou supprimer des publications"
|
||||||
|
"read:notifications": "Afficher les notifications"
|
||||||
|
"read:reactions": "Lire les réactions"
|
||||||
|
"write:votes": "Vote"
|
||||||
|
empty-timeline-info:
|
||||||
|
follow-users-to-make-your-timeline: "Les utilisateurs suivants afficheront leurs publications sur votre fil."
|
||||||
|
explore: "Trouver des utilisateurs"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "D"
|
sunday: "D"
|
||||||
monday: "L"
|
monday: "L"
|
||||||
@@ -101,38 +126,125 @@ common:
|
|||||||
d: "Désirez-vous publier quelques mots ?"
|
d: "Désirez-vous publier quelques mots ?"
|
||||||
e: "Écrivez ici"
|
e: "Écrivez ici"
|
||||||
f: "En attente de vos écrits"
|
f: "En attente de vos écrits"
|
||||||
|
settings: "Paramètres"
|
||||||
|
_settings:
|
||||||
|
profile: "Votre profil"
|
||||||
|
notification: "Notifications"
|
||||||
|
apps: "Applications"
|
||||||
|
tags: "Hashtags"
|
||||||
|
mute-and-block: "Silencer / Bloquer"
|
||||||
|
blocking: "En cours blocage"
|
||||||
|
security: "Sécurité"
|
||||||
|
signin: "Historique des connexions"
|
||||||
|
password: "Mot de passe"
|
||||||
|
other: "Avancé"
|
||||||
|
appearance: "Apparence"
|
||||||
|
behavior: "Comportement"
|
||||||
|
fetch-on-scroll: "Chargement automatique lors du défilement"
|
||||||
|
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
|
||||||
|
note-visibility: "Visibilité de la publication"
|
||||||
|
default-note-visibility: "Visibilité par défaut"
|
||||||
|
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
||||||
|
web-search-engine: "Moteur de recherche Web"
|
||||||
|
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
||||||
|
keep-cw: "Maintenir l'avertissement de contenu"
|
||||||
|
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
||||||
|
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||||
|
use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
|
||||||
|
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||||
|
disable-showing-animated-images: "Désactiver l'animation des images"
|
||||||
|
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
|
||||||
|
always-show-nsfw: "Toujours afficher les contenus sensibles"
|
||||||
|
always-mark-nsfw: "Toujours marquer les notes ayant des médias comme sensibles"
|
||||||
|
show-full-acct: "Afficher l’adresse complète de l’utilisateur"
|
||||||
|
show-via: "Afficher via"
|
||||||
|
reduce-motion: "Réduire les animations dans l’interface utilisateur"
|
||||||
|
this-setting-is-this-device-only: "Uniquement sur cet appareil"
|
||||||
|
use-os-default-emojis: "Utiliser les émojis standards du système"
|
||||||
|
line-width: "Epaisseur du trait"
|
||||||
|
line-width-thin: "Fine"
|
||||||
|
line-width-normal: "Normale"
|
||||||
|
line-width-thick: "Épaisse"
|
||||||
|
font-size: "Taille du texte"
|
||||||
|
font-size-x-small: "Très petit"
|
||||||
|
font-size-small: "Petite"
|
||||||
|
font-size-medium: "Normale"
|
||||||
|
font-size-large: "Grande"
|
||||||
|
font-size-x-large: "Large"
|
||||||
|
deck-column-align: "Alignement des colonnes du Deck"
|
||||||
|
deck-column-align-center: "Centrer"
|
||||||
|
deck-column-align-left: "À gauche"
|
||||||
|
deck-column-align-flexible: "Flexible"
|
||||||
|
deck-column-width: "Largeur des colonnes du Deck"
|
||||||
|
deck-column-width-narrow: "Étroite"
|
||||||
|
deck-column-width-narrower: "Légèrement étroite"
|
||||||
|
deck-column-width-normal: "Normale"
|
||||||
|
deck-column-width-wider: "Légèrement large"
|
||||||
|
deck-column-width-wide: "Large"
|
||||||
|
use-shadow: "Utiliser les ombres dans l'interface utilisateur"
|
||||||
|
rounded-corners: "Coins arrondis de l'interface utilisateur"
|
||||||
|
circle-icons: "Utiliser des icônes circulaires"
|
||||||
|
contrasted-acct: "Ajouter du contraste au nom de l’utilisateur"
|
||||||
|
wallpaper: "Image du fond d'écran"
|
||||||
|
choose-wallpaper: "Sélectionner un fond d'écran"
|
||||||
|
delete-wallpaper: "Supprimer le fond d'écran"
|
||||||
|
post-form-on-timeline: "Afficher le champs de saisie en haut du fil"
|
||||||
|
show-clock-on-header: "Afficher l'horloge sur le coté supérieur droit"
|
||||||
|
timeline: "Fil d’actualité"
|
||||||
|
show-my-renotes: "Afficher mes republications dans le fil"
|
||||||
|
remain-deleted-note: "Continuer à afficher les notes supprimées"
|
||||||
|
sound: "Son"
|
||||||
|
enable-sounds: "Activer les sons"
|
||||||
|
enable-sounds-desc: "Jouer un son lorsque vous recevez un message/publication. Ce paramètre est sauvegardé dans le navigateur."
|
||||||
|
volume: "Volume"
|
||||||
|
test: "Test"
|
||||||
|
update: "Mise à jour de Misskey"
|
||||||
|
version: "Version actuelle :"
|
||||||
|
latest-version: "Dernière version :"
|
||||||
|
update-checking: "Recherche de mises à jour"
|
||||||
|
do-update: "Rechercher des mises à jour"
|
||||||
|
update-settings: "Paramètres avancés"
|
||||||
|
no-updates: "Aucune mise à jour disponible"
|
||||||
|
no-updates-desc: "Votre Misskey est à jour."
|
||||||
|
update-available: "Nouvelle version disponible !"
|
||||||
|
update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée."
|
||||||
|
advanced-settings: "Paramètres avancés"
|
||||||
|
debug-mode: "Activer le mode débogage"
|
||||||
|
debug-mode-desc: "Ce paramètre est stocké dans le navigateur."
|
||||||
|
navbar-position: "Position de la barre de navigation"
|
||||||
|
navbar-position-top: "En haut"
|
||||||
|
navbar-position-left: "À gauche"
|
||||||
|
navbar-position-right: "À droite"
|
||||||
|
i-am-under-limited-internet: "J'ai un accès Internet limité"
|
||||||
|
post-style: "Style d'affichage des notes"
|
||||||
|
post-style-standard: "Standard"
|
||||||
|
post-style-smart: "Intelligent"
|
||||||
|
notification-position: "Afficher les notifications"
|
||||||
|
notification-position-bottom: "en bas"
|
||||||
|
notification-position-top: "En haut"
|
||||||
|
disable-via-mobile: "Enlever la mention publié via 'mobile'"
|
||||||
|
load-raw-images: "Afficher les photos jointes dans leur qualité originale"
|
||||||
|
load-remote-media: "Afficher les médias depuis le serveur distant"
|
||||||
search: "Recherche"
|
search: "Recherche"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
loading: "Chargement en cours …"
|
loading: "Chargement en cours …"
|
||||||
ok: "OK"
|
ok: "Confirmer"
|
||||||
|
cancel: "Quitter"
|
||||||
update-available-title: "Mise à jour disponible"
|
update-available-title: "Mise à jour disponible"
|
||||||
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
||||||
my-token-regenerated: "Votre jeton vient d’être généré, vous allez maintenant être déconnecté."
|
my-token-regenerated: "Votre jeton vient d’être généré, vous allez maintenant être déconnecté."
|
||||||
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
|
||||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
|
||||||
use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
|
|
||||||
verified-user: "Compte vérifié"
|
verified-user: "Compte vérifié"
|
||||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
|
||||||
suggest-recent-hashtags: "Suggérer les hashtags récemment utilisés dans le champs de saisie"
|
|
||||||
always-show-nsfw: "Toujours afficher les contenus sensibles"
|
|
||||||
always-mark-nsfw: "Toujours marquer les notes ayant des attachements comme sensibles"
|
|
||||||
show-full-acct: "Afficher l’adresse complète de l’utilisateur"
|
|
||||||
show-via: "Visualiser via"
|
|
||||||
reduce-motion: "Réduire les animations dans l’interface utilisateur"
|
|
||||||
this-setting-is-this-device-only: "Uniquement sur cet appareil"
|
|
||||||
use-os-default-emojis: "Utiliser les émojis standards du système"
|
|
||||||
line-width: "Epaisseur du trait"
|
|
||||||
line-width-thin: "Fine"
|
|
||||||
line-width-normal: "Normale"
|
|
||||||
line-width-thick: "Épaisse"
|
|
||||||
hide-password: "Masquer le mot de passe"
|
hide-password: "Masquer le mot de passe"
|
||||||
show-password: "Afficher le mot de passe"
|
show-password: "Afficher le mot de passe"
|
||||||
do-not-use-in-production: "Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production."
|
do-not-use-in-production: "Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production."
|
||||||
user-suspended: "Cet·te utilisateur·trice a été suspendu·e"
|
user-suspended: "Cet·te utilisateur·trice a été suspendu·e"
|
||||||
is-remote-user: "このユーザー情報は不正確な可能性があります。"
|
is-remote-user: "Les informations à propos de ce compte peuvent être incomplètes."
|
||||||
is-remote-post: "Ceci est une publication distante."
|
is-remote-post: "Ceci est une publication distante."
|
||||||
view-on-remote: " Consulter le profil complet"
|
view-on-remote: " Consulter le profil complet"
|
||||||
renoted-by: "Renoté par {user}"
|
renoted-by: "Renoté par {user}"
|
||||||
|
no-notes: "Sans aucune note"
|
||||||
|
turn-on-darkmode: "Mode nuit"
|
||||||
|
turn-off-darkmode: "Mode jour"
|
||||||
error:
|
error:
|
||||||
title: "Une erreur est survenue"
|
title: "Une erreur est survenue"
|
||||||
retry: "Réessayer"
|
retry: "Réessayer"
|
||||||
@@ -169,21 +281,13 @@ common:
|
|||||||
nav: "Navigation"
|
nav: "Navigation"
|
||||||
tips: "Conseils"
|
tips: "Conseils"
|
||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
|
queue: "File d'attente"
|
||||||
dev: "Échec lors de la création de l’application. Veuillez réessayer."
|
dev: "Échec lors de la création de l’application. Veuillez réessayer."
|
||||||
ai-chan-kawaii: "Ai-Chan est mignonne !"
|
ai-chan-kawaii: "Ai-Chan est mignonne !"
|
||||||
you: "Vous"
|
you: "Vous"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Désirez-vous autoriser <i>{name}</i> à avoir accès à votre compte ?"
|
share-access: "Désirez-vous autoriser <i>{name}</i> à avoir accès à votre compte ?"
|
||||||
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
||||||
account-read: "Afficher les informations du compte."
|
|
||||||
account-write: "Modifications des informations du compte."
|
|
||||||
note-write: "Publier."
|
|
||||||
like-write: "Réagir aux publications."
|
|
||||||
following-write: "Suivre des comptes et se désabonner."
|
|
||||||
drive-read: "Lire votre Drive"
|
|
||||||
drive-write: "Téléverser/supprimer des fichiers dans votre Drive."
|
|
||||||
notification-read: "Lire vos notifications."
|
|
||||||
notification-write: "Gérer vos notifications."
|
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
accept: "Autoriser l’accès"
|
accept: "Autoriser l’accès"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@@ -196,6 +300,20 @@ auth/views/index.vue:
|
|||||||
please-go-back: "Veillez retourner à l'application."
|
please-go-back: "Veillez retourner à l'application."
|
||||||
error: "La session n’existe pas."
|
error: "La session n’existe pas."
|
||||||
sign-in: "Veuillez vous connecter"
|
sign-in: "Veuillez vous connecter"
|
||||||
|
common/views/pages/explore.vue:
|
||||||
|
verified-users: "Comptes vérifiés"
|
||||||
|
popular-users: "Utilisateurs populaires"
|
||||||
|
recently-updated-users: "Utilisateurs actifs récemment"
|
||||||
|
recently-registered-users: "Les nouveaux inscrits"
|
||||||
|
popular-tags: "Mots-clés populaires"
|
||||||
|
federated: "Du Fédiverse"
|
||||||
|
explore: "Explorer {host}"
|
||||||
|
users-info: "Actuellement, {users} utilisateurs se sont inscrit ici"
|
||||||
|
common/views/components/url-preview.vue:
|
||||||
|
enable-player: "Activer la lecture"
|
||||||
|
disable-player: "Fermer le lecteur"
|
||||||
|
common/views/components/user-list.vue:
|
||||||
|
no-users: "Il n'y a aucun utilisateur"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "En attente de {}"
|
waiting-for: "En attente de {}"
|
||||||
@@ -228,7 +346,6 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
black-or-white: "Noirs/Blancs"
|
black-or-white: "Noirs/Blancs"
|
||||||
black-is: "{} Noirs"
|
black-is: "{} Noirs"
|
||||||
rules: "Règles"
|
rules: "Règles"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
|
||||||
looped-map: "Carte en boucle"
|
looped-map: "Carte en boucle"
|
||||||
can-put-everywhere: "Peut poser partout"
|
can-put-everywhere: "Peut poser partout"
|
||||||
settings-of-the-bot: "Configuration du bot"
|
settings-of-the-bot: "Configuration du bot"
|
||||||
@@ -344,6 +461,8 @@ common/views/components/note-menu.vue:
|
|||||||
copy-link: "Copier le lien"
|
copy-link: "Copier le lien"
|
||||||
favorite: "Mettre cette note en favoris"
|
favorite: "Mettre cette note en favoris"
|
||||||
unfavorite: "Retirer des favoris"
|
unfavorite: "Retirer des favoris"
|
||||||
|
watch: "Surveiller"
|
||||||
|
unwatch: "Ne plus surveiller"
|
||||||
pin: "Épingler sur votre profil"
|
pin: "Épingler sur votre profil"
|
||||||
unpin: "Désépingler"
|
unpin: "Désépingler"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
@@ -360,23 +479,40 @@ common/views/components/user-menu.vue:
|
|||||||
report-abuse: "Signaler un abus"
|
report-abuse: "Signaler un abus"
|
||||||
report-abuse-detail: "Détail du signalement"
|
report-abuse-detail: "Détail du signalement"
|
||||||
report-abuse-reported: "Transmit à l’administrateur. Merci de votre collaboration."
|
report-abuse-reported: "Transmit à l’administrateur. Merci de votre collaboration."
|
||||||
silence: "サイレンス"
|
silence: "Mettre en sourdine"
|
||||||
unsilence: "サイレンス解除"
|
unsilence: "Enlever la sourdine"
|
||||||
suspend: "Suspendre"
|
suspend: "Suspendre"
|
||||||
unsuspend: "凍結解除"
|
unsuspend: "Ne plus suspendre"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Voter pour '{}'"
|
vote-to: "Voter pour '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
total-users: "{} utilisateur·rice·s ont voté"
|
total-votes: "{} Total des votes"
|
||||||
vote: "Vote"
|
vote: "Vote"
|
||||||
show-result: "Montrer les résultats"
|
show-result: "Montrer les résultats"
|
||||||
voted: "Voté"
|
voted: "Voté"
|
||||||
|
closed: "Terminé"
|
||||||
|
remaining-days: "{d} jours, {h} heures restantes"
|
||||||
|
remaining-hours: "{h} heures et {m} minutes restantes"
|
||||||
|
remaining-minutes: "{m} minutes et {s} secondes restantes"
|
||||||
|
remaining-seconds: "{s} secondes restantes"
|
||||||
common/views/components/poll-editor.vue:
|
common/views/components/poll-editor.vue:
|
||||||
no-only-one-choice: "Vous devez saisir au moins deux choix."
|
no-only-one-choice: "Vous devez saisir au moins deux choix."
|
||||||
choice-n: "Choix {}"
|
choice-n: "Choix {}"
|
||||||
remove: "Supprimer ce choix"
|
remove: "Supprimer ce choix"
|
||||||
add: "+ Ajouter un choix"
|
add: "+ Ajouter un choix"
|
||||||
destroy: "Annuler ce sondage"
|
destroy: "Annuler ce sondage"
|
||||||
|
expiration: "Valide jusqu'à"
|
||||||
|
infinite: "Illimité"
|
||||||
|
at: "Choisir une date et une durée"
|
||||||
|
no-more: "Vous ne pouvez pas en ajouter davantage"
|
||||||
|
deadline-date: "Date d’échéance"
|
||||||
|
deadline-time: "Durée"
|
||||||
|
interval: "Durée"
|
||||||
|
unit: "Unité"
|
||||||
|
second: "secondes"
|
||||||
|
minute: "Minutes"
|
||||||
|
hour: "Heures"
|
||||||
|
day: "D"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Choisissez votre réaction"
|
choose-reaction: "Choisissez votre réaction"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
@@ -394,7 +530,6 @@ common/views/components/signin.vue:
|
|||||||
password: "Mot de passe"
|
password: "Mot de passe"
|
||||||
token: "Jeton"
|
token: "Jeton"
|
||||||
signing-in: "Connexion…"
|
signing-in: "Connexion…"
|
||||||
signin: "Se connecter"
|
|
||||||
or: "Ou"
|
or: "Ou"
|
||||||
signin-with-twitter: "Se connecter via Twitter"
|
signin-with-twitter: "Se connecter via Twitter"
|
||||||
signin-with-github: "Se connecter avec GitHub"
|
signin-with-github: "Se connecter avec GitHub"
|
||||||
@@ -435,7 +570,7 @@ common/views/components/notification-settings.vue:
|
|||||||
mark-as-read-all-notifications: "Marquer toutes les notifications comme lues"
|
mark-as-read-all-notifications: "Marquer toutes les notifications comme lues"
|
||||||
mark-as-read-all-unread-notes: "Marquer toutes les notes comme lues"
|
mark-as-read-all-unread-notes: "Marquer toutes les notes comme lues"
|
||||||
mark-as-read-all-talk-messages: "Marquer toutes les conversations comme lues"
|
mark-as-read-all-talk-messages: "Marquer toutes les conversations comme lues"
|
||||||
auto-watch: "投稿の自動ウォッチ"
|
auto-watch: "Surveiller automatiquement les publications"
|
||||||
auto-watch-desc: "Recevoir automatiquement des notifications à propos des publications auxquelles vous avez réagi ou répondu"
|
auto-watch-desc: "Recevoir automatiquement des notifications à propos des publications auxquelles vous avez réagi ou répondu"
|
||||||
common/views/components/integration-settings.vue:
|
common/views/components/integration-settings.vue:
|
||||||
title: "Intégrations"
|
title: "Intégrations"
|
||||||
@@ -506,6 +641,21 @@ common/views/components/profile-editor.vue:
|
|||||||
email-address: "Adresse de courrier électronique"
|
email-address: "Adresse de courrier électronique"
|
||||||
email-verified: "L’adresse du courrier électronique a été vérifiée."
|
email-verified: "L’adresse du courrier électronique a été vérifiée."
|
||||||
email-not-verified: "Adresse de courriel n’est pas confirmée. Veuillez vérifier votre boite de réception."
|
email-not-verified: "Adresse de courriel n’est pas confirmée. Veuillez vérifier votre boite de réception."
|
||||||
|
export: "Exporter"
|
||||||
|
import: "Importer"
|
||||||
|
export-and-import: "Exportation et importation"
|
||||||
|
export-targets:
|
||||||
|
all-notes: "Toutes les notes publiées"
|
||||||
|
following-list: "Liste des abonnements"
|
||||||
|
mute-list: "Liste des comptes mis en sourdine"
|
||||||
|
blocking-list: "Liste des comptes bloqués"
|
||||||
|
user-lists: "Listes"
|
||||||
|
export-requested: "Vous avez demandé une exportation. Cela peut prendre un certain temps. Une fois l'exportation terminée, le fichier résultant sera ajouté dans le Drive."
|
||||||
|
import-requested: "Vous avez initié un import. Ceci peut prendre un peu de temps."
|
||||||
|
enter-password: "Veuillez saisir votre mot de passe"
|
||||||
|
danger-zone: "Zone de danger"
|
||||||
|
delete-account: "Supprimer le compte"
|
||||||
|
account-deleted: "Le compte a été supprimé. Cela peut prendre un certain temps avant que toutes les données disparaissent."
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Utilisateur·rice"
|
users: "Utilisateur·rice"
|
||||||
rename: "Renommer la liste"
|
rename: "Renommer la liste"
|
||||||
@@ -513,6 +663,9 @@ common/views/components/user-list-editor.vue:
|
|||||||
remove-user: "Retirer de cette liste"
|
remove-user: "Retirer de cette liste"
|
||||||
delete-are-you-sure: "Voulez-vous vraiment supprimer la liste « $1 » ?"
|
delete-are-you-sure: "Voulez-vous vraiment supprimer la liste « $1 » ?"
|
||||||
deleted: "Supprimé"
|
deleted: "Supprimé"
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
create-list: "Créer une liste"
|
||||||
|
list-name: "Nom de la liste"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Récupération"
|
fetching: "Récupération"
|
||||||
no-broadcasts: "Aucune annonce"
|
no-broadcasts: "Aucune annonce"
|
||||||
@@ -545,7 +698,7 @@ common/views/widgets/slideshow.vue:
|
|||||||
folder: "Veuillez cliquer pour spécifier le dossier"
|
folder: "Veuillez cliquer pour spécifier le dossier"
|
||||||
no-image: "Il n'y a aucune image dans ce dossier"
|
no-image: "Il n'y a aucune image dans ce dossier"
|
||||||
common/views/widgets/tips.vue:
|
common/views/widgets/tips.vue:
|
||||||
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
|
tips-line1: "Vous pouvez vous concentrer sur le fil avec <kbd>t</kbd>"
|
||||||
tips-line2: "Ouvre la fenêtre de publication en appuyant sur <kbd>p</kbd> ou <kbd>n</kbd>."
|
tips-line2: "Ouvre la fenêtre de publication en appuyant sur <kbd>p</kbd> ou <kbd>n</kbd>."
|
||||||
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
||||||
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
||||||
@@ -554,7 +707,7 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line7: "Vous pouvez déplacer des dossiers en les glissant dans le Drive"
|
tips-line7: "Vous pouvez déplacer des dossiers en les glissant dans le Drive"
|
||||||
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
||||||
tips-line9: "Misskey est sous licence AGPLv3"
|
tips-line9: "Misskey est sous licence AGPLv3"
|
||||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
tips-line10: "L'utilisation du widget Time Machine permet de remonter facilement dans le passé du fil."
|
||||||
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
|
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
|
||||||
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
||||||
tips-line14: "Lorsque vous personnalisez la disposition de votre page d’accueil, vous pouvez effectuer un clique droit sur un widget pour changer son apparence."
|
tips-line14: "Lorsque vous personnalisez la disposition de votre page d’accueil, vous pouvez effectuer un clique droit sur un widget pour changer son apparence."
|
||||||
@@ -562,7 +715,6 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
||||||
tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
|
tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
|
||||||
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
|
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
|
||||||
tips-line23: "藍かわいいよ藍"
|
|
||||||
tips-line24: "Misskey est fonctionnel depuis 2014"
|
tips-line24: "Misskey est fonctionnel depuis 2014"
|
||||||
tips-line25: "Vous pouvez recevoir les notifications de Misskey dans un navigateur web compatible"
|
tips-line25: "Vous pouvez recevoir les notifications de Misskey dans un navigateur web compatible"
|
||||||
common/views/pages/not-found.vue:
|
common/views/pages/not-found.vue:
|
||||||
@@ -674,12 +826,6 @@ desktop/views/components/following-window.vue:
|
|||||||
following: "Suit {}"
|
following: "Suit {}"
|
||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "Vous ne suivez aucun compte."
|
empty: "Vous ne suivez aucun compte."
|
||||||
desktop/views/components/friends-maker.vue:
|
|
||||||
title: "Utilisateur·rice·s recommandé·e·s :"
|
|
||||||
empty: "Impossible de trouver des utilisateur·trice·s à recommander."
|
|
||||||
fetching: "Chargement"
|
|
||||||
refresh: "Plus"
|
|
||||||
close: "Fermer"
|
|
||||||
desktop/views/components/game-window.vue:
|
desktop/views/components/game-window.vue:
|
||||||
game: "Reversi"
|
game: "Reversi"
|
||||||
desktop/views/components/home.vue:
|
desktop/views/components/home.vue:
|
||||||
@@ -689,10 +835,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Messages :"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Messagerie"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
@@ -714,11 +856,11 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Aucune de notification !"
|
empty: "Aucune de notification !"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Ajouter un utilisateur"
|
add-visible-user: "+Ajouter un·e utilisateur·rice"
|
||||||
attach-location-information: "Attacher des informations de localisation"
|
attach-location-information: "Attacher des informations de localisation"
|
||||||
hide-contents: "Masquer les contenus"
|
hide-contents: "Masquer les contenus"
|
||||||
reply-placeholder: "Répondre à cette note…"
|
reply-placeholder: "Répondre à cette note …"
|
||||||
quote-placeholder: "Citer cette note…"
|
quote-placeholder: "Citer cette note …"
|
||||||
submit: "Publier"
|
submit: "Publier"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
renote: "Republier"
|
renote: "Republier"
|
||||||
@@ -728,10 +870,9 @@ desktop/views/components/post-form.vue:
|
|||||||
note-failed: "La note à échoué"
|
note-failed: "La note à échoué"
|
||||||
reply-failed: "La réponse a échoué"
|
reply-failed: "La réponse a échoué"
|
||||||
renote-failed: "Échec lors de la republication"
|
renote-failed: "Échec lors de la republication"
|
||||||
posting: "Publication…"
|
posting: "Publication …"
|
||||||
attach-media-from-local: "Joindre un média depuis votre appareil"
|
attach-media-from-local: "Joindre un média depuis votre appareil"
|
||||||
attach-media-from-drive: "Joindre un média depuis votre Drive"
|
attach-media-from-drive: "Joindre un média depuis votre Drive"
|
||||||
attach-cancel: "Annuler le fichier attaché"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "Créer un sondage"
|
create-poll: "Créer un sondage"
|
||||||
text-remain: "{} caractères restants"
|
text-remain: "{} caractères restants"
|
||||||
@@ -741,8 +882,8 @@ desktop/views/components/post-form.vue:
|
|||||||
visibility: "Visibilité"
|
visibility: "Visibilité"
|
||||||
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
||||||
error: "Erreur"
|
error: "Erreur"
|
||||||
enter-username: "Saisir un nom d'utilisateur…"
|
enter-username: "Saisir un nom d'utilisateur …"
|
||||||
annotations: "内容への注釈 (オプション)"
|
annotations: "Commenter le contenu (optionnel)"
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nouvelle note"
|
note: "Nouvelle note"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
@@ -763,101 +904,6 @@ desktop/views/components/renote-form-window.vue:
|
|||||||
desktop/views/pages/user-following-or-followers.vue:
|
desktop/views/pages/user-following-or-followers.vue:
|
||||||
following: "{user} suit"
|
following: "{user} suit"
|
||||||
followers: "Abonné·e·s de {user}"
|
followers: "Abonné·e·s de {user}"
|
||||||
desktop/views/components/settings-window.vue:
|
|
||||||
settings: "Paramètres"
|
|
||||||
desktop/views/components/settings.vue:
|
|
||||||
profile: "Profil"
|
|
||||||
notification: "Notification"
|
|
||||||
apps: "Applications"
|
|
||||||
tags: "Hashtags"
|
|
||||||
mute-and-block: "Silencé·e·s / Bloqué·e·s"
|
|
||||||
blocking: "En cours de blocage"
|
|
||||||
security: "Sécurité"
|
|
||||||
signin: "Historique de connexion"
|
|
||||||
password: "Mot de Passe"
|
|
||||||
other: "Autres"
|
|
||||||
license: "Licence"
|
|
||||||
theme: "Thèmes"
|
|
||||||
behaviour: "Comportement"
|
|
||||||
fetch-on-scroll: "Chargement lors du défilement"
|
|
||||||
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
|
|
||||||
note-visibility: "Visibilité de la publication"
|
|
||||||
default-note-visibility: "Visibilité par défaut"
|
|
||||||
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
|
||||||
web-search-engine: "Moteur de recherche Web"
|
|
||||||
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
|
||||||
auto-popout: "Fenêtre contextuelle automatique"
|
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
|
||||||
deck-nav: "Deck sans tansitions"
|
|
||||||
deck-nav-desc: "Vous obtenez une colonne temporaire sans transitions dans la page pendant la navigation, lors de l’utilisation du Deck."
|
|
||||||
keep-cw: "Maintenir l'avertissement de contenu"
|
|
||||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
|
||||||
deck-default: "Utiliser le Deck comme IU par défaut"
|
|
||||||
display: "Affichage et design"
|
|
||||||
customize: "Personnaliser l'Accueil"
|
|
||||||
wallpaper: "Arrière plan"
|
|
||||||
choose-wallpaper: "Sélectionner un fond d'écran"
|
|
||||||
delete-wallpaper: "Supprimer le fond d'écran"
|
|
||||||
dark-mode: "Mode nuit"
|
|
||||||
use-shadow: "Utiliser les ombres dans l'interface utilisateur"
|
|
||||||
rounded-corners: "Coins arrondis"
|
|
||||||
circle-icons: "Utiliser des icônes circulaires"
|
|
||||||
contrasted-acct: "Nom d’utilisateur contrasté"
|
|
||||||
post-form-on-timeline: "Afficher le formulaire en haut du fil"
|
|
||||||
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
|
|
||||||
show-reply-target: "Afficher les réponses"
|
|
||||||
timeline: "Chronologie"
|
|
||||||
show-my-renotes: "Afficher mes republications dans le fil"
|
|
||||||
show-renoted-my-notes: "Afficher mes republications dans les fils"
|
|
||||||
show-local-renotes: "Afficher les partages locaux sur les fils"
|
|
||||||
show-maps: "Afficher la carte"
|
|
||||||
remain-deleted-note: "Continuer à afficher les messages supprimés"
|
|
||||||
deck-column-align: "Alignement des colonnes du Deck"
|
|
||||||
deck-column-align-center: "Centrer"
|
|
||||||
deck-column-align-left: "À gauche"
|
|
||||||
deck-column-align-flexible: "Flexibles"
|
|
||||||
deck-column-width: "Largeur des colonnes du Deck"
|
|
||||||
deck-column-width-narrow: "Étroite"
|
|
||||||
deck-column-width-narrower: "Légèrement étroite"
|
|
||||||
deck-column-width-normal: "Normale"
|
|
||||||
deck-column-width-wider: "Légèrement large"
|
|
||||||
deck-column-width-wide: "Large"
|
|
||||||
sound: "Son"
|
|
||||||
enable-sounds: "Activer le son"
|
|
||||||
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
|
|
||||||
volume: "Volume"
|
|
||||||
test: "Test"
|
|
||||||
cache: "Cache"
|
|
||||||
clean-cache: "Nettoyage"
|
|
||||||
cache-warn: "Le nettoyage du cache du compte supprime les informations stockées dans le navigateur comme les messages, les réponses ainsi que d’autres données (y compris les paramètres de configuration). Après le nettoyage, vous devez recharger la page."
|
|
||||||
cache-cleared: "Cache nettoyé"
|
|
||||||
cache-cleared-desc: "Veuillez recharger la page."
|
|
||||||
about: "À propose de Misskey"
|
|
||||||
operator: "L'admin de cette instance"
|
|
||||||
update: "Mise à jour de Misskey"
|
|
||||||
version: "Version :"
|
|
||||||
latest-version: "Dernière version :"
|
|
||||||
update-checking: "Vérification des mises à jour en cours…"
|
|
||||||
do-update: "Rechercher des mises à jour"
|
|
||||||
update-settings: "Paramètres avancés"
|
|
||||||
prevent-update: "Reporter les mises à jour (non recommandé)"
|
|
||||||
prevent-update-desc: "Même si ce paramètre est activé, la mise à jour pourrait être appliquée. Ce paramètre n'est valide que sur cet appareil."
|
|
||||||
no-updates: "Aucune mise à jour disponible"
|
|
||||||
no-updates-desc: "Votre client Misskey est à jour."
|
|
||||||
update-available: "Nouvelle version disponible !"
|
|
||||||
update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée."
|
|
||||||
advanced-settings: "Réglages avancés"
|
|
||||||
debug-mode: "Activer le mode débogage"
|
|
||||||
debug-mode-desc: "Ce paramètre est stocké dans le navigateur."
|
|
||||||
experimental: "Activer les fonctionnalités expérimentales"
|
|
||||||
experimental-desc: "L’activation des fonctionnalités expérimentales peuvent rendre le client Misskey instable. Ce paramètre est stocké dans le navigateur."
|
|
||||||
tools: "Outils"
|
|
||||||
task-manager: "Gestionnaire de tâches"
|
|
||||||
third-parties: "Services tiers"
|
|
||||||
navbar-position: "Position de la barre de navigation"
|
|
||||||
navbar-position-top: "En haut"
|
|
||||||
navbar-position-left: "à gauche"
|
|
||||||
navbar-position-right: "à droite"
|
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "Si vous configurez la vérication en deux étapes vous aurez non seulement besoin de votre mot de passe mais aussi un appareil déjà pré-enregistré(tel que votre smartphone) ce qui ameliora grandement la sécurité de votre compte."
|
intro: "Si vous configurez la vérication en deux étapes vous aurez non seulement besoin de votre mot de passe mais aussi un appareil déjà pré-enregistré(tel que votre smartphone) ce qui ameliora grandement la sécurité de votre compte."
|
||||||
detail: "Voir les détails..."
|
detail: "Voir les détails..."
|
||||||
@@ -919,6 +965,10 @@ common/views/components/password-settings.vue:
|
|||||||
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
||||||
changed: "Mot de passe modifié avec succès"
|
changed: "Mot de passe modifié avec succès"
|
||||||
failed: "Échec lors de la modification du mot de passe"
|
failed: "Échec lors de la modification du mot de passe"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
attach-cancel: "Enlever le fichier attaché"
|
||||||
|
mark-as-sensitive: "Marquer comme sensible"
|
||||||
|
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
@@ -929,15 +979,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "Requête (optionnelle)"
|
query: "Requête (optionnelle)"
|
||||||
add: "Ajouter"
|
add: "Ajouter"
|
||||||
save: "Enregistrer"
|
save: "Enregistrer"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Gestionnaire de tâches"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Accueil"
|
home: "Accueil"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Messages directs"
|
||||||
list: "Listes"
|
list: "Listes"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
add-tag-timeline: "Ajouter un fil de hashtags"
|
add-tag-timeline: "Ajouter un fil de hashtags"
|
||||||
@@ -948,17 +996,10 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "M."
|
adjective: "M."
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Votre profil"
|
profile: "Votre profil"
|
||||||
favorites: "Favorites"
|
|
||||||
lists: "Listes"
|
lists: "Listes"
|
||||||
follow-requests: "Demandes de suivi"
|
follow-requests: "Demandes d’abonnement"
|
||||||
customize: "Personnaliser l'Accueil"
|
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
settings: "Réglages"
|
|
||||||
signout: "Déconnexion"
|
|
||||||
dark: "Fall in dark"
|
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
home: "Accueil"
|
|
||||||
deck: "Deck"
|
|
||||||
game: "Jeux"
|
game: "Jeux"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
title: "Notifications"
|
title: "Notifications"
|
||||||
@@ -967,13 +1008,11 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Chercher"
|
placeholder: "Chercher"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
title: "Demandes de suivi"
|
title: "Demandes d’abonnement"
|
||||||
accept: "Accepter"
|
accept: "Accepter"
|
||||||
reject: "Refuser"
|
reject: "Refuser"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
title: "Listes de l'utilisateur"
|
title: "Listes de l'utilisateur"
|
||||||
create-list: "Créer une liste"
|
|
||||||
list-name: "Nom de la liste"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Publications"
|
notes: "Publications"
|
||||||
following: "Abonné à"
|
following: "Abonné à"
|
||||||
@@ -997,6 +1036,8 @@ admin/views/index.vue:
|
|||||||
announcements: "Annonces"
|
announcements: "Annonces"
|
||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
abuse: "Abus"
|
abuse: "Abus"
|
||||||
|
queue: "File d’attente"
|
||||||
|
logs: "Journaux"
|
||||||
back-to-misskey: "Retour vers Misskey"
|
back-to-misskey: "Retour vers Misskey"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
@@ -1006,6 +1047,9 @@ admin/views/dashboard.vue:
|
|||||||
instances: "Instances"
|
instances: "Instances"
|
||||||
this-instance: "Cette instance"
|
this-instance: "Cette instance"
|
||||||
federated: "Fédérées"
|
federated: "Fédérées"
|
||||||
|
admin/views/queue.vue:
|
||||||
|
title: "File d'attente"
|
||||||
|
remove-all-jobs: "Enlever toutes les tâches en attente"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abus"
|
title: "Abus"
|
||||||
target: "Cible"
|
target: "Cible"
|
||||||
@@ -1026,7 +1070,6 @@ admin/views/instance.vue:
|
|||||||
maintainer-email: "Contact administratif"
|
maintainer-email: "Contact administratif"
|
||||||
drive-config: "Paramètres du lecteur"
|
drive-config: "Paramètres du lecteur"
|
||||||
cache-remote-files: "Mettre en cache des fichiers distants"
|
cache-remote-files: "Mettre en cache des fichiers distants"
|
||||||
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
|
|
||||||
local-drive-capacity-mb: "Volume du lecteur par utilisateur"
|
local-drive-capacity-mb: "Volume du lecteur par utilisateur"
|
||||||
remote-drive-capacity-mb: "Volume du lecteur par utilisateur distant"
|
remote-drive-capacity-mb: "Volume du lecteur par utilisateur distant"
|
||||||
mb: "en mégaoctets"
|
mb: "en mégaoctets"
|
||||||
@@ -1051,7 +1094,6 @@ admin/views/instance.vue:
|
|||||||
discord-integration-client-id: "ID client"
|
discord-integration-client-id: "ID client"
|
||||||
discord-integration-client-secret: "Secret client"
|
discord-integration-client-secret: "Secret client"
|
||||||
proxy-account-config: "Compte proxy"
|
proxy-account-config: "Compte proxy"
|
||||||
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
|
||||||
proxy-account-username: "Nom d’utilisateur du compte proxy"
|
proxy-account-username: "Nom d’utilisateur du compte proxy"
|
||||||
proxy-account-username-desc: "Spécifiez le nom d’utilisateur du compte utilisé comme proxy."
|
proxy-account-username-desc: "Spécifiez le nom d’utilisateur du compte utilisé comme proxy."
|
||||||
proxy-account-warn: "Avant d’entamer cette action, vous devez au préalable avoir créé un compte avec ce nom d’utilisateur."
|
proxy-account-warn: "Avant d’entamer cette action, vous devez au préalable avoir créé un compte avec ce nom d’utilisateur."
|
||||||
@@ -1059,16 +1101,11 @@ admin/views/instance.vue:
|
|||||||
disable-registration: "Désactiver les inscriptions"
|
disable-registration: "Désactiver les inscriptions"
|
||||||
disable-local-timeline: "Désactiver le fil local"
|
disable-local-timeline: "Désactiver le fil local"
|
||||||
disable-global-timeline: "Désactiver le fil global"
|
disable-global-timeline: "Désactiver le fil global"
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
disabling-timelines-info: "Même si vous désactivez ces fils, l'administrateur et les modérateurs peuvent continuer à les utiliser."
|
||||||
invite: "Inviter"
|
invite: "Inviter"
|
||||||
save: "Sauvegarder"
|
save: "Sauvegarder"
|
||||||
saved: "Enregistré"
|
saved: "Enregistré"
|
||||||
user-recommendation-config: "Utilisateurs"
|
user-recommendation-config: "Utilisateurs"
|
||||||
enable-external-user-recommendation: "Activer la recommandation des utilisateurs distants"
|
|
||||||
external-user-recommendation-engine: "Moteur"
|
|
||||||
external-user-recommendation-engine-desc: "Exemple : https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "Délai d’expiration"
|
|
||||||
external-user-recommendation-timeout-desc: "En millisecondes (par exemple : 300000)"
|
|
||||||
email-config: "Paramètres du serveur de messagerie"
|
email-config: "Paramètres du serveur de messagerie"
|
||||||
email-config-info: "Utilisé pour confirmer votre adresse de courrier électronique et la réinitialisation de votre mot de passe."
|
email-config-info: "Utilisé pour confirmer votre adresse de courrier électronique et la réinitialisation de votre mot de passe."
|
||||||
enable-email: "Activation de la distribution du courrier"
|
enable-email: "Activation de la distribution du courrier"
|
||||||
@@ -1077,6 +1114,7 @@ admin/views/instance.vue:
|
|||||||
smtp-secure-info: "Désactiver STARTTLS lorsque celui-ci est utilisé."
|
smtp-secure-info: "Désactiver STARTTLS lorsque celui-ci est utilisé."
|
||||||
smtp-host: "Hôte SMTP"
|
smtp-host: "Hôte SMTP"
|
||||||
smtp-port: "Port SMTP"
|
smtp-port: "Port SMTP"
|
||||||
|
smtp-auth: "Effectuer une authentification SMTP"
|
||||||
smtp-user: "Utilisateur SMTP"
|
smtp-user: "Utilisateur SMTP"
|
||||||
smtp-pass: "Mot de passe SMTP"
|
smtp-pass: "Mot de passe SMTP"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
@@ -1147,13 +1185,13 @@ admin/views/users.vue:
|
|||||||
unsuspend: "Suspension levée"
|
unsuspend: "Suspension levée"
|
||||||
unsuspend-confirm: "Souhaiteriez-vous ne plus suspendre ce compte ?"
|
unsuspend-confirm: "Souhaiteriez-vous ne plus suspendre ce compte ?"
|
||||||
unsuspended: "La suspension de l’utilisateur a été levée avec succès"
|
unsuspended: "La suspension de l’utilisateur a été levée avec succès"
|
||||||
make-silence: "サイレンス"
|
make-silence: "Mettre en sourdine"
|
||||||
unmake-silence: "サイレンスの解除"
|
unmake-silence: "Enlever la sourdine"
|
||||||
verify: "Vérification du compte"
|
verify: "Vérification du compte"
|
||||||
verify-confirm: "Souhaiteriez-vous rendre votre compte comme étant un compte vérifié ?"
|
verify-confirm: "Souhaiteriez-vous rendre votre compte comme étant un compte vérifié ?"
|
||||||
verified: "Le compte a été vérifié"
|
verified: "Le compte a été vérifié"
|
||||||
unverify: "Enlever la vérification du compte"
|
unverify: "Enlever la vérification du compte"
|
||||||
unverify-confirm: "公式アカウントを解除しますか?"
|
unverify-confirm: "Désirez-vous considérer ce compte comme étant non-vérifié ?"
|
||||||
unverified: "Ce compte n'est plus vérifié"
|
unverified: "Ce compte n'est plus vérifié"
|
||||||
update-remote-user: "Mettre à jour les informations de l’utilisateur·rice distant·e"
|
update-remote-user: "Mettre à jour les informations de l’utilisateur·rice distant·e"
|
||||||
remote-user-updated: "Les informations de l’utilisateur·rice distant·e ont étés mis à jour"
|
remote-user-updated: "Les informations de l’utilisateur·rice distant·e ont étés mis à jour"
|
||||||
@@ -1172,6 +1210,7 @@ admin/views/users.vue:
|
|||||||
moderator: "Modérateur"
|
moderator: "Modérateur"
|
||||||
adminOrModerator: "Administrateur/Modérateur"
|
adminOrModerator: "Administrateur/Modérateur"
|
||||||
verified: "Compte vérifié"
|
verified: "Compte vérifié"
|
||||||
|
silenced: "Déjà mis en sourdine"
|
||||||
suspended: "Suspendu"
|
suspended: "Suspendu"
|
||||||
origin:
|
origin:
|
||||||
title: "Origine"
|
title: "Origine"
|
||||||
@@ -1219,13 +1258,58 @@ admin/views/announcements.vue:
|
|||||||
removed: "Supprimé"
|
removed: "Supprimé"
|
||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Tags cachés"
|
hided-tags: "Tags cachés"
|
||||||
|
admin/views/federation.vue:
|
||||||
|
instance: "Instance"
|
||||||
|
host: "Hôte"
|
||||||
|
notes: "Notes"
|
||||||
|
users: "Utilisateur·rice·s"
|
||||||
|
following: "Abonnements"
|
||||||
|
followers: "Abonné·e·s"
|
||||||
|
caught-at: "Créé le"
|
||||||
|
status: "Statuts"
|
||||||
|
latest-request-sent-at: "Dernière requête envoyée"
|
||||||
|
latest-request-received-at: "Dernière requête reçue"
|
||||||
|
remove-all-following-info: "Se désabonner de tous les comptes de {host}. Exécutez cette commande si l'instance n'existe plus."
|
||||||
|
block: "Bloquer"
|
||||||
|
marked-as-closed: "Marquées comme fermées"
|
||||||
|
lookup: "Recherche"
|
||||||
|
instances: "Fédérées"
|
||||||
|
instance-not-registered: "L’instance n’a pas encore été découverte"
|
||||||
|
sort: "Trier par"
|
||||||
|
sorts:
|
||||||
|
caughtAtAsc: "Date d’inscription (Ascendant)"
|
||||||
|
caughtAtDesc: "Date d’inscription (Descendant)"
|
||||||
|
lastCommunicatedAtAsc: "La date et l'heure des interactions plus anciennes"
|
||||||
|
lastCommunicatedAtDesc: "La date et l'heure des nouvelles interactions"
|
||||||
|
notesDesc: "Description des notes"
|
||||||
|
usersAsc: "Peu d'abonnés"
|
||||||
|
followingAsc: "Les moins suivies"
|
||||||
|
followingDesc: "Ayant le plus d'abonné·e·s"
|
||||||
|
followersAsc: "Ayant le moins d'abonné·e·s"
|
||||||
|
followersDesc: "Ayant le plus d'abonné·e·s"
|
||||||
|
driveUsageAsc: "Moins d'espace de stockage utilisé"
|
||||||
|
state: "État"
|
||||||
|
states:
|
||||||
|
all: "Tout"
|
||||||
|
blocked: "Bloquées"
|
||||||
|
not-responding: "Sans réponse"
|
||||||
|
marked-as-closed: "Marquée comme fermée"
|
||||||
|
charts: "Graphs"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "Requêtes"
|
||||||
|
users: "Nombre d’utilisateurs·trices : augmentation/diminution"
|
||||||
|
users-total: "Nombre total des utilisateur·rice·s"
|
||||||
|
notes: "Augmentation/diminution du nombre des notes"
|
||||||
|
notes-total: "Nombre total des notes"
|
||||||
|
ff: "Augmentation des abonné·e·s"
|
||||||
|
drive-usage: "Augmentation et diminution de la capacité stockage"
|
||||||
|
drive-usage-total: "Utilisation totale du stockage"
|
||||||
|
drive-files-total: "Nombre total des fichiers sur le Drive"
|
||||||
|
chart-spans:
|
||||||
|
hour: "Par heure"
|
||||||
|
day: "Par jour"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "à propos"
|
about: "à propos"
|
||||||
gotit: "J'ai compris !"
|
|
||||||
signin: "Connexion"
|
|
||||||
signup: "S'enregistrer"
|
|
||||||
signin-button: "Se connecter"
|
|
||||||
signup-button: "S'inscrire"
|
|
||||||
timeline: "Fil d’actualité"
|
timeline: "Fil d’actualité"
|
||||||
announcements: "Notices"
|
announcements: "Notices"
|
||||||
photos: "Images récentes"
|
photos: "Images récentes"
|
||||||
@@ -1233,8 +1317,6 @@ desktop/views/pages/welcome.vue:
|
|||||||
info: "Informations"
|
info: "Informations"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Lecteur de Misskey"
|
title: "Lecteur de Misskey"
|
||||||
desktop/views/pages/home-customize.vue:
|
|
||||||
title: "Personnaliser l'Accueil"
|
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
prev: "Note précédente"
|
prev: "Note précédente"
|
||||||
next: "Note suivante"
|
next: "Note suivante"
|
||||||
@@ -1246,8 +1328,6 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "La fonction de recherche est désactivée dans les paramètres de l’instance."
|
not-available: "La fonction de recherche est désactivée dans les paramètres de l’instance."
|
||||||
not-found: "Aucune publication trouvée pour « {q} »."
|
not-found: "Aucune publication trouvée pour « {q} »."
|
||||||
desktop/views/pages/share.vue:
|
|
||||||
share-with: "Partager avec {name}"
|
|
||||||
desktop/views/pages/tag.vue:
|
desktop/views/pages/tag.vue:
|
||||||
no-posts-found: "Aucune publication contenant « {q} » n’a été trouvée."
|
no-posts-found: "Aucune publication contenant « {q} » n’a été trouvée."
|
||||||
desktop/views/pages/user-list.users.vue:
|
desktop/views/pages/user-list.users.vue:
|
||||||
@@ -1266,29 +1346,24 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
title: "Photos"
|
title: "Photos"
|
||||||
loading: "Chargement en cours"
|
loading: "Chargement en cours"
|
||||||
no-photos: "Pas de photos"
|
no-photos: "Pas de photos"
|
||||||
desktop/views/pages/user/user.profile.vue:
|
|
||||||
follows-you: "Vous suit"
|
|
||||||
menu: "Menu"
|
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "Notes"
|
posts: "Notes"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
is-bot: "Ce compte est un Bot"
|
is-bot: "Ce compte est un Bot"
|
||||||
|
no-description: "L'utilisateur n'a pas renseigné d'introduction sur son profile"
|
||||||
years-old: "{age} ans"
|
years-old: "{age} ans"
|
||||||
year: "/"
|
year: "/"
|
||||||
month: "/"
|
month: "/"
|
||||||
day: "-"
|
day: "-"
|
||||||
|
follows-you: "Vous suit"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "Publications"
|
default: "Publications"
|
||||||
with-replies: "Publications et réponses"
|
with-replies: "Publications et réponses"
|
||||||
with-media: "Média"
|
with-media: "Média"
|
||||||
my-posts: "Mes Messages"
|
my-posts: "Mes Messages"
|
||||||
empty: "Cet utilisateur n'a rien posté encore."
|
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Messagerie"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Notifications"
|
title: "Notifications"
|
||||||
settings: "Réglages"
|
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
title: "Sondages"
|
title: "Sondages"
|
||||||
refresh: "Afficher d'autres"
|
refresh: "Afficher d'autres"
|
||||||
@@ -1314,11 +1389,7 @@ mobile/views/components/drive.vue:
|
|||||||
file-count: "Fichier·s"
|
file-count: "Fichier·s"
|
||||||
nothing-in-drive: "Rien"
|
nothing-in-drive: "Rien"
|
||||||
folder-is-empty: "Ce dossier est vide"
|
folder-is-empty: "Ce dossier est vide"
|
||||||
prompt: "Que veux-tu faire ? (Entrez un nombre): <1 → Télécharger le fichier | 2 → Télécharger le fichier avec l'URL | 3 → Créer le dossier | 4 → Modifier le nom du dossier | 5 → Déplacer ce dossier | 6 → Supprimer ce dossier >"
|
|
||||||
deletion-alert: "Désolé ! La suppression d’un dossier n’est pas encore implémentée."
|
|
||||||
folder-name: "Nom du dossier"
|
folder-name: "Nom du dossier"
|
||||||
root-rename-alert: "L'emplacement actuel est la racine, pas le dossier, vous ne pouvez donc pas le renommer. Veuillez vous déplacer dans le dossier dont vous souhaitez modifier le nom."
|
|
||||||
root-move-alert: "L'emplacement actuel est la racine, ce n'est pas un dossier et il ne peut pas être déplacé. Veuillez vous déplacer dans le dossier que vous souhaitez déplacer."
|
|
||||||
url-prompt: "URL du fichier que vous souhaitez téléverser"
|
url-prompt: "URL du fichier que vous souhaitez téléverser"
|
||||||
uploading: "Envoi demandé. Le téléversement pourrait prendre un certain temps avant de s'achever."
|
uploading: "Envoi demandé. Le téléversement pourrait prendre un certain temps avant de s'achever."
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
@@ -1345,12 +1416,6 @@ common/views/components/follow-button.vue:
|
|||||||
request-pending: "Demande en attente"
|
request-pending: "Demande en attente"
|
||||||
follow-processing: "En cours d’abonnement"
|
follow-processing: "En cours d’abonnement"
|
||||||
follow-request: "Demande d’abonnement"
|
follow-request: "Demande d’abonnement"
|
||||||
mobile/views/components/friends-maker.vue:
|
|
||||||
title: "Abonnez-vous à"
|
|
||||||
empty: "Impossible de trouver des utilisateurs·trices à recommander."
|
|
||||||
fetching: "Chargement"
|
|
||||||
refresh: "Voir plus"
|
|
||||||
close: "Fermer"
|
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
@@ -1372,14 +1437,14 @@ mobile/views/components/note-sub.vue:
|
|||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Aucune de notification !"
|
empty: "Aucune de notification !"
|
||||||
mobile/views/components/post-form.vue:
|
mobile/views/components/post-form.vue:
|
||||||
add-visible-user: "Ajouter un utilisateur"
|
add-visible-user: "Ajouter un·e utilisateur·rice"
|
||||||
submit: "Publier"
|
submit: "Publier"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
renote: "Republier"
|
renote: "Republier"
|
||||||
quote-placeholder: "Citer ce billet... (Facultatif)"
|
quote-placeholder: "Citer ce billet ... (Facultatif)"
|
||||||
reply-placeholder: "Répondre à cette note"
|
reply-placeholder: "Répondre à cette note"
|
||||||
cw-placeholder: "Commenter le contenu (optionnel)"
|
cw-placeholder: "Commenter le contenu (optionnel)"
|
||||||
location-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
||||||
error: "Erreur"
|
error: "Erreur"
|
||||||
username-prompt: "Saisir un nom d'utilisateur"
|
username-prompt: "Saisir un nom d'utilisateur"
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
@@ -1387,8 +1452,6 @@ mobile/views/components/sub-note-content.vue:
|
|||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
media-count: "{} médias attachés"
|
media-count: "{} médias attachés"
|
||||||
poll: "Sondage"
|
poll: "Sondage"
|
||||||
mobile/views/components/timeline.vue:
|
|
||||||
empty: "Pas de notes"
|
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
welcome-back: "Content de vous revoir ! "
|
welcome-back: "Content de vous revoir ! "
|
||||||
adjective: "M."
|
adjective: "M."
|
||||||
@@ -1397,25 +1460,17 @@ mobile/views/components/ui.nav.vue:
|
|||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
follow-requests: "Demandes d’abonnement"
|
follow-requests: "Demandes d’abonnement"
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
favorites: "Favoris"
|
|
||||||
user-lists: "Listes"
|
user-lists: "Listes"
|
||||||
widgets: "Modules"
|
widgets: "Modules"
|
||||||
game: "Jeux"
|
game: "Jeux"
|
||||||
darkmode: "Mode nuit"
|
|
||||||
settings: "Réglages"
|
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
about: "À propos de Misskey"
|
about: "À propos de Misskey"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/pages/drive.vue:
|
||||||
no-notes: "Il semble que cet utilisateur n’a rien publié pour le moment."
|
contextmenu:
|
||||||
no-notes-with-media: "Aucune note comprenant des médias"
|
upload: "Téléverser un fichier"
|
||||||
mobile/views/components/users-list.vue:
|
create-folder: "Créer un dossier"
|
||||||
all: "Tout"
|
|
||||||
known: "Vous connaissez"
|
|
||||||
mobile/views/pages/favorites.vue:
|
|
||||||
title: "Favoris"
|
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/user-lists.vue:
|
||||||
title: "Listes"
|
title: "Listes"
|
||||||
enter-list-name: "Nom de la liste"
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "Votre compte est prêt ! 📦"
|
lets-start: "Votre compte est prêt ! 📦"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1428,14 +1483,11 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Messages directs"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "Aucune publication ayant pour hashtag « {q} » n’a été trouvée."
|
no-posts-found: "Aucune publication ayant pour hashtag « {q} » n’a été trouvée."
|
||||||
mobile/views/pages/welcome.vue:
|
|
||||||
signup: "S'enregistrer"
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
widgets-hints: "Vous pouvez ajouter, supprimer et réarranger les widgets. Faites glisser « 三 » pour déplacer le widget. Appuyez sur « x » pour supprimer le widget. Certains widgets peuvent changer d’apparence en cliquant dessus."
|
|
||||||
add-widget: "Ajouter"
|
add-widget: "Ajouter"
|
||||||
customization-tips: "Conseils de personnalisation"
|
customization-tips: "Conseils de personnalisation"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
@@ -1447,12 +1499,9 @@ mobile/views/pages/received-follow-requests.vue:
|
|||||||
accept: "Accepter"
|
accept: "Accepter"
|
||||||
reject: "Refuser"
|
reject: "Refuser"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "Post"
|
title: "Publication"
|
||||||
prev: "Note précédente"
|
prev: "Note précédente"
|
||||||
next: "Note suivante"
|
next: "Note suivante"
|
||||||
mobile/views/pages/notifications.vue:
|
|
||||||
notifications: "Notifications"
|
|
||||||
read-all: "Êtes-vous sûr de vouloir marquer l’ensemble des notifications comme étant lues ?"
|
|
||||||
mobile/views/pages/games/reversi.vue:
|
mobile/views/pages/games/reversi.vue:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
@@ -1462,47 +1511,6 @@ mobile/views/pages/selectdrive.vue:
|
|||||||
select-file: "Choisissez un fichier"
|
select-file: "Choisissez un fichier"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Connecté·e en tant que {}"
|
signed-in-as: "Connecté·e en tant que {}"
|
||||||
design: "Affichage et design"
|
|
||||||
dark-mode: "Mode nuit"
|
|
||||||
i-am-under-limited-internet: "J'ai un accès Internet limité"
|
|
||||||
circle-icons: "Utiliser des icônes circulaires"
|
|
||||||
contrasted-acct: "Nom d’utilisateur contrasté"
|
|
||||||
timeline: "Fil d’actualité"
|
|
||||||
show-reply-target: "Afficher les réponses"
|
|
||||||
show-my-renotes: "Afficher mes partages"
|
|
||||||
show-renoted-my-notes: "Afficher mes notes partagées"
|
|
||||||
show-local-renotes: "Afficher les notes partagées localement"
|
|
||||||
post-style: "Style de la publication"
|
|
||||||
post-style-standard: "Standard"
|
|
||||||
post-style-smart: "Intelligent"
|
|
||||||
notification-position: "Style de notification"
|
|
||||||
notification-position-bottom: "en bas"
|
|
||||||
notification-position-top: "en haut"
|
|
||||||
behavior: "Comportement"
|
|
||||||
fetch-on-scroll: "Chargement lors du défilement"
|
|
||||||
keep-cw: "Garder l'avertissement de contenu"
|
|
||||||
note-visibility: "Visibilité de la publication"
|
|
||||||
default-note-visibility: "Visibilité par défaut"
|
|
||||||
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
|
||||||
web-search-engine: "Moteur de recherche Web"
|
|
||||||
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
|
||||||
disable-via-mobile: "Ne pas mentionner que ma publication provient d'un « périphérique mobile »"
|
|
||||||
load-raw-images: "Afficher les photos jointes en haute qualité"
|
|
||||||
load-remote-media: "Afficher les médias sur le serveur distant"
|
|
||||||
update: "Mise à jour de Misskey"
|
|
||||||
version: "Version :"
|
|
||||||
latest-version: "Dernière version :"
|
|
||||||
update-checking: "Recherche de mises à jour"
|
|
||||||
check-for-updates: "Fréquence de vérification"
|
|
||||||
no-updates: "Aucune mise à jour disponible"
|
|
||||||
no-updates-desc: "Votre Misskey est à jour."
|
|
||||||
update-available: "Nouvelle version disponible !"
|
|
||||||
update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée."
|
|
||||||
settings: "Réglages"
|
|
||||||
signout: "Déconnexion"
|
|
||||||
sound: "Sons"
|
|
||||||
enable-sounds: "Activer les sons"
|
|
||||||
password: "Mot de Passe"
|
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Vous suit"
|
follows-you: "Vous suit"
|
||||||
following: "Abonnements"
|
following: "Abonnements"
|
||||||
@@ -1518,15 +1526,9 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "Activité"
|
activity: "Activité"
|
||||||
keywords: "Mot clés"
|
keywords: "Mot clés"
|
||||||
domains: "Domaines"
|
domains: "Domaines"
|
||||||
frequently-replied-users: "Utilisateurs mentionnés souvent"
|
frequently-replied-users: "Mentions fréquentes"
|
||||||
followers-you-know: "Abonné·e·s que vous connaissez"
|
followers-you-know: "Abonné·e·s que vous connaissez"
|
||||||
last-used-at: "Dernière connexion il y a"
|
last-used-at: "Dernière connexion il y a"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
|
||||||
no-users: "Aucun utilisateur·rice connu·e"
|
|
||||||
mobile/views/pages/user/home.friends.vue:
|
|
||||||
no-users: "Aucun utilisateur connu"
|
|
||||||
mobile/views/pages/user/home.notes.vue:
|
|
||||||
no-notes: "Pas de notes"
|
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
no-photos: "Pas de photos"
|
no-photos: "Pas de photos"
|
||||||
deck:
|
deck:
|
||||||
@@ -1540,6 +1542,7 @@ deck:
|
|||||||
direct: "Messages directs"
|
direct: "Messages directs"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
list: "Listes"
|
list: "Listes"
|
||||||
|
select-list: "Sélectionnez une liste"
|
||||||
swap-left: "Déplacer à gauche"
|
swap-left: "Déplacer à gauche"
|
||||||
swap-right: "Déplacer à droite"
|
swap-right: "Déplacer à droite"
|
||||||
swap-up: "Déplacer vers le haut"
|
swap-up: "Déplacer vers le haut"
|
||||||
@@ -1549,11 +1552,14 @@ deck:
|
|||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
stack-left: "Vers la gauche"
|
stack-left: "Vers la gauche"
|
||||||
pop-right: "Vers la droite"
|
pop-right: "Vers la droite"
|
||||||
|
disabled-timeline:
|
||||||
|
title: "Le fil été désactivé"
|
||||||
|
description: "Ce fil a été désactivé par l'administrateur du serveur."
|
||||||
deck/deck.tl-column.vue:
|
deck/deck.tl-column.vue:
|
||||||
is-media-only: "Les publications médias uniquement"
|
is-media-only: "Les publications médias uniquement"
|
||||||
is-media-view: "Vue média"
|
|
||||||
edit: "Option"
|
edit: "Option"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "Vous suit"
|
||||||
posts: "Notes"
|
posts: "Notes"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
followers: "Abonnés"
|
followers: "Abonnés"
|
||||||
@@ -1593,21 +1599,9 @@ dev/views/new-app.vue:
|
|||||||
create-app: "Création d’une application"
|
create-app: "Création d’une application"
|
||||||
app-name: "Nom de l’application"
|
app-name: "Nom de l’application"
|
||||||
app-name-desc: "Le nom de votre application"
|
app-name-desc: "Le nom de votre application"
|
||||||
app-name-ex: "p. ex. Misskey pour iOS"
|
|
||||||
app-overview: "Description courte de l’application"
|
app-overview: "Description courte de l’application"
|
||||||
app-desc: "Brève description introductive à votre application."
|
|
||||||
app-desc-ex: "p. ex) Misskey pour iOS"
|
|
||||||
callback-url: "L’Url de callback (facultatif)"
|
callback-url: "L’Url de callback (facultatif)"
|
||||||
callback-url-desc: "Vous pouvez définir l’URL de redirection lorsque l’utilisateur s’est authentifié via formulaire d’authentification."
|
callback-url-desc: "Vous pouvez définir l’URL de redirection lorsque l’utilisateur s’est authentifié via formulaire d’authentification."
|
||||||
authority: "Autorisations "
|
authority: "Autorisations "
|
||||||
authority-desc: "Sont accessibles via l’API, uniquement les fonctionnalités demandées ici."
|
authority-desc: "Sont accessibles via l’API, uniquement les fonctionnalités demandées ici."
|
||||||
authority-warning: "Vous pouvez le changer même après avoir créé l'application, mais si vous attribuez une nouvelle permission, toutes les clés utilisateur associées seront dès lors invalides."
|
authority-warning: "Vous pouvez le changer même après avoir créé l'application, mais si vous attribuez une nouvelle permission, toutes les clés utilisateur associées seront dès lors invalides."
|
||||||
account-read: "Afficher les informations du compte"
|
|
||||||
account-write: "Modifications des informations du compte"
|
|
||||||
note-write: "Publications."
|
|
||||||
reaction-write: "Ajout et suppression de réactions."
|
|
||||||
following-write: "S’abonner et se désabonner."
|
|
||||||
drive-read: "Lecture du Drive."
|
|
||||||
drive-write: "Téléversement/suppression des fichiers de votre Lecteur."
|
|
||||||
notification-read: "Lire vos notifications."
|
|
||||||
notification-write: "Gestion de vos notifications."
|
|
||||||
|
|||||||
3
locales/index.d.ts
vendored
Normal file
3
locales/index.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
declare const locales: { [lang: string]: any };
|
||||||
|
|
||||||
|
export = locales;
|
||||||
@@ -5,9 +5,49 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const yaml = require('js-yaml');
|
const yaml = require('js-yaml');
|
||||||
|
|
||||||
const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL', 'zh-CN', 'ko-KR'];
|
const merge = (...args) => args.reduce((a, c) => ({
|
||||||
|
...a,
|
||||||
|
...c,
|
||||||
|
...Object.entries(a)
|
||||||
|
.filter(([k]) => c && typeof c[k] === 'object')
|
||||||
|
.reduce((a, [k, v]) => (a[k] = merge(v, c[k]), a), {})
|
||||||
|
}), {});
|
||||||
|
|
||||||
const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
|
const languages = [
|
||||||
const locales = langs.map(lang => ({ [lang]: loadLocale(lang) }));
|
'cs-CZ',
|
||||||
|
'de-DE',
|
||||||
|
'en-US',
|
||||||
|
'es-ES',
|
||||||
|
'fr-FR',
|
||||||
|
'ja-JP',
|
||||||
|
'ja-KS',
|
||||||
|
'ko-KR',
|
||||||
|
'nl-NL',
|
||||||
|
'pl-PL',
|
||||||
|
'zh-CN',
|
||||||
|
'zh-TW',
|
||||||
|
];
|
||||||
|
|
||||||
module.exports = locales.reduce((a, b) => ({ ...a, ...b }));
|
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), {});
|
||||||
|
|
||||||
|
module.exports = Object.entries(locales)
|
||||||
|
.reduce((a, [k ,v]) => (a[k] = (() => {
|
||||||
|
const [lang] = k.split('-');
|
||||||
|
switch (k) {
|
||||||
|
case 'ja-JP': return v;
|
||||||
|
case 'ja-KS':
|
||||||
|
case 'en-US': return merge(locales['ja-JP'], v);
|
||||||
|
default: return merge(
|
||||||
|
locales['ja-JP'],
|
||||||
|
locales['en-US'],
|
||||||
|
locales[`${lang}-${primaries[lang]}`] || {},
|
||||||
|
v
|
||||||
|
);
|
||||||
|
}
|
||||||
|
})(), a), {});
|
||||||
|
|||||||
1609
locales/it-IT.yml
1609
locales/it-IT.yml
File diff suppressed because it is too large
Load Diff
@@ -28,6 +28,14 @@ common:
|
|||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
2fa: "二段階認証"
|
2fa: "二段階認証"
|
||||||
|
customize-home: "ホームをカスタマイズ"
|
||||||
|
featured-notes: "ハイライト"
|
||||||
|
dark-mode: "ダークモード"
|
||||||
|
signin: "ログイン"
|
||||||
|
signup: "新規登録"
|
||||||
|
signout: "ログアウト"
|
||||||
|
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
||||||
|
fetching-as-ap-object: "連合に照会中"
|
||||||
|
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
@@ -58,6 +66,39 @@ common:
|
|||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
messaging: "トーク"
|
messaging: "トーク"
|
||||||
|
home: "ホーム"
|
||||||
|
deck: "デッキ"
|
||||||
|
timeline: "タイムライン"
|
||||||
|
explore: "みつける"
|
||||||
|
following: "フォロー中"
|
||||||
|
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: "ユーザーを探索する"
|
||||||
|
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
@@ -109,30 +150,119 @@ common:
|
|||||||
e: "ここに書いてください"
|
e: "ここに書いてください"
|
||||||
f: "あなたが書くのを待っています..."
|
f: "あなたが書くのを待っています..."
|
||||||
|
|
||||||
|
settings: "設定"
|
||||||
|
_settings:
|
||||||
|
profile: "プロフィール"
|
||||||
|
notification: "通知"
|
||||||
|
apps: "アプリ"
|
||||||
|
tags: "ハッシュタグ"
|
||||||
|
mute-and-block: "ミュート/ブロック"
|
||||||
|
blocking: "ブロック"
|
||||||
|
security: "セキュリティ"
|
||||||
|
signin: "ログイン履歴"
|
||||||
|
password: "パスワード"
|
||||||
|
other: "その他"
|
||||||
|
appearance: "デザイン"
|
||||||
|
behavior: "動作"
|
||||||
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||||
|
note-visibility: "投稿の公開範囲"
|
||||||
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
|
keep-cw: "CW保持"
|
||||||
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
|
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
disable-showing-animated-images: "アニメーション画像を再生しない"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
show-via: "viaを表示する"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
|
use-os-default-emojis: "OS標準の絵文字を使用"
|
||||||
|
line-width: "線の太さ"
|
||||||
|
line-width-thin: "細い"
|
||||||
|
line-width-normal: "普通"
|
||||||
|
line-width-thick: "太い"
|
||||||
|
font-size: "文字の大きさ"
|
||||||
|
font-size-x-small: "小さい"
|
||||||
|
font-size-small: "少し小さい"
|
||||||
|
font-size-medium: "普通"
|
||||||
|
font-size-large: "少し大きい"
|
||||||
|
font-size-x-large: "大きい"
|
||||||
|
deck-column-align: "デッキのカラムの配置"
|
||||||
|
deck-column-align-center: "中央"
|
||||||
|
deck-column-align-left: "左"
|
||||||
|
deck-column-align-flexible: "フレキシブル"
|
||||||
|
deck-column-width: "デッキのカラムの幅"
|
||||||
|
deck-column-width-narrow: "狭"
|
||||||
|
deck-column-width-narrower: "やや狭"
|
||||||
|
deck-column-width-normal: "普通"
|
||||||
|
deck-column-width-wider: "やや広"
|
||||||
|
deck-column-width-wide: "広"
|
||||||
|
use-shadow: "UIに影を使用"
|
||||||
|
rounded-corners: "UIの角を丸める"
|
||||||
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
|
wallpaper: "壁紙"
|
||||||
|
choose-wallpaper: "壁紙を選択"
|
||||||
|
delete-wallpaper: "壁紙を削除"
|
||||||
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
show-clock-on-header: "右上に時計を表示する"
|
||||||
|
show-reply-target: "リプライ先を表示する"
|
||||||
|
timeline: "タイムライン"
|
||||||
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
|
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||||
|
sound: "サウンド"
|
||||||
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||||
|
volume: "ボリューム"
|
||||||
|
test: "テスト"
|
||||||
|
update: "Misskey Update"
|
||||||
|
version: "バージョン:"
|
||||||
|
latest-version: "最新のバージョン:"
|
||||||
|
update-checking: "アップデートを確認中"
|
||||||
|
do-update: "アップデートを確認"
|
||||||
|
update-settings: "詳細設定"
|
||||||
|
no-updates: "利用可能な更新はありません"
|
||||||
|
no-updates-desc: "お使いのMisskeyは最新です。"
|
||||||
|
update-available: "新しいバージョンが利用可能です"
|
||||||
|
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
|
||||||
|
advanced-settings: "高度な設定"
|
||||||
|
debug-mode: "デバッグモードを有効にする"
|
||||||
|
debug-mode-desc: "この設定はブラウザに記憶されます。"
|
||||||
|
navbar-position: "ナビゲーションバーの位置"
|
||||||
|
navbar-position-top: "上"
|
||||||
|
navbar-position-left: "左"
|
||||||
|
navbar-position-right: "右"
|
||||||
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
|
post-style: "投稿の表示スタイル"
|
||||||
|
post-style-standard: "標準"
|
||||||
|
post-style-smart: "スマート"
|
||||||
|
notification-position: "通知の表示"
|
||||||
|
notification-position-bottom: "下"
|
||||||
|
notification-position-top: "上"
|
||||||
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
|
||||||
search: "検索"
|
search: "検索"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "おk"
|
||||||
|
cancel: "やめる"
|
||||||
update-available-title: "更新があります"
|
update-available-title: "更新があります"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
|
||||||
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
|
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
|
||||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
|
||||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
|
||||||
show-full-acct: "ユーザー名のホストを省略しない"
|
|
||||||
show-via: "viaを表示する"
|
|
||||||
reduce-motion: "UIの動きを減らす"
|
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
|
||||||
use-os-default-emojis: "OS標準の絵文字を使用"
|
|
||||||
line-width: "線の太さ"
|
|
||||||
line-width-thin: "細い"
|
|
||||||
line-width-normal: "普通"
|
|
||||||
line-width-thick: "太い"
|
|
||||||
hide-password: "パスワードを隠す"
|
hide-password: "パスワードを隠す"
|
||||||
show-password: "パスワードを表示する"
|
show-password: "パスワードを表示する"
|
||||||
|
|
||||||
@@ -142,6 +272,9 @@ common:
|
|||||||
is-remote-post: "この投稿情報はコピーです。"
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
view-on-remote: "正確な情報を見る"
|
view-on-remote: "正確な情報を見る"
|
||||||
renoted-by: "{user}がRenote"
|
renoted-by: "{user}がRenote"
|
||||||
|
no-notes: "投稿がありません"
|
||||||
|
turn-on-darkmode: "闇に飲まれる"
|
||||||
|
turn-off-darkmode: "光あれ"
|
||||||
|
|
||||||
error:
|
error:
|
||||||
title: "問題が発生しました"
|
title: "問題が発生しました"
|
||||||
@@ -181,6 +314,7 @@ common:
|
|||||||
nav: "ナビゲーション"
|
nav: "ナビゲーション"
|
||||||
tips: "ヒント"
|
tips: "ヒント"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
|
queue: "キュー"
|
||||||
|
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
@@ -189,15 +323,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
account-read: "アカウントの情報を見る。"
|
|
||||||
account-write: "アカウントの情報を操作する。"
|
|
||||||
note-write: "投稿する。"
|
|
||||||
like-write: "いいねしたりいいね解除する。"
|
|
||||||
following-write: "フォローしたりフォロー解除する。"
|
|
||||||
drive-read: "ドライブを見る。"
|
|
||||||
drive-write: "ドライブを操作する。"
|
|
||||||
notification-read: "通知を見る。"
|
|
||||||
notification-write: "通知を操作する。"
|
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
accept: "アクセスを許可"
|
accept: "アクセスを許可"
|
||||||
|
|
||||||
@@ -212,6 +337,23 @@ auth/views/index.vue:
|
|||||||
error: "セッションが存在しません。"
|
error: "セッションが存在しません。"
|
||||||
sign-in: "サインインしてください"
|
sign-in: "サインインしてください"
|
||||||
|
|
||||||
|
common/views/pages/explore.vue:
|
||||||
|
verified-users: "公式アカウント"
|
||||||
|
popular-users: "人気のユーザー"
|
||||||
|
recently-updated-users: "最近投稿したユーザー"
|
||||||
|
recently-registered-users: "新規ユーザー"
|
||||||
|
popular-tags: "人気のタグ"
|
||||||
|
federated: "連合"
|
||||||
|
explore: "{host}を探索"
|
||||||
|
users-info: "現在{users}ユーザーが登録されています"
|
||||||
|
|
||||||
|
common/views/components/url-preview.vue:
|
||||||
|
enable-player: "プレイヤーを開く"
|
||||||
|
disable-player: "プレイヤーを閉じる"
|
||||||
|
|
||||||
|
common/views/components/user-list.vue:
|
||||||
|
no-users: "ユーザーがいません"
|
||||||
|
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
@@ -374,6 +516,8 @@ common/views/components/note-menu.vue:
|
|||||||
copy-link: "リンクをコピー"
|
copy-link: "リンクをコピー"
|
||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
unfavorite: "お気に入り解除"
|
unfavorite: "お気に入り解除"
|
||||||
|
watch: "ウォッチ"
|
||||||
|
unwatch: "ウォッチ解除"
|
||||||
pin: "ピン留め"
|
pin: "ピン留め"
|
||||||
unpin: "ピン留め解除"
|
unpin: "ピン留め解除"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
@@ -384,8 +528,12 @@ common/views/components/user-menu.vue:
|
|||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
mute-confirm: "このユーザーをミュートしますか?"
|
||||||
|
unmute-confirm: "このユーザーをミュート解除しますか?"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
|
unblock-confirm: "このユーザーをブロック解除しますか?"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "リストに追加"
|
||||||
select-list: "リストを選択してください"
|
select-list: "リストを選択してください"
|
||||||
report-abuse: "スパムを報告"
|
report-abuse: "スパムを報告"
|
||||||
@@ -393,16 +541,25 @@ common/views/components/user-menu.vue:
|
|||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
||||||
silence: "サイレンス"
|
silence: "サイレンス"
|
||||||
unsilence: "サイレンス解除"
|
unsilence: "サイレンス解除"
|
||||||
|
silence-confirm: "このユーザーをサイレンスしますか?"
|
||||||
|
unsilence-confirm: "このユーザーをサイレンス解除しますか?"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
unsuspend: "凍結解除"
|
unsuspend: "凍結解除"
|
||||||
|
suspend-confirm: "このユーザーを凍結しますか?"
|
||||||
|
unsuspend-confirm: "このユーザーを凍結解除しますか?"
|
||||||
|
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "「{}」に投票する"
|
vote-to: "「{}」に投票する"
|
||||||
vote-count: "{}票"
|
vote-count: "{}票"
|
||||||
total-users: "{}人が投票"
|
total-votes: "計{}票"
|
||||||
vote: "投票する"
|
vote: "投票する"
|
||||||
show-result: "結果を見る"
|
show-result: "結果を見る"
|
||||||
voted: "投票済み"
|
voted: "投票済み"
|
||||||
|
closed: "終了済み"
|
||||||
|
remaining-days: "終了まであと{d}日{h}時間"
|
||||||
|
remaining-hours: "終了まであと{h}時間{m}分"
|
||||||
|
remaining-minutes: "終了まであと{m}分{s}秒"
|
||||||
|
remaining-seconds: "終了まであと{s}秒"
|
||||||
|
|
||||||
common/views/components/poll-editor.vue:
|
common/views/components/poll-editor.vue:
|
||||||
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
|
no-only-one-choice: "アンケートには、選択肢が最低2つ必要です"
|
||||||
@@ -410,6 +567,20 @@ common/views/components/poll-editor.vue:
|
|||||||
remove: "この選択肢を削除"
|
remove: "この選択肢を削除"
|
||||||
add: "+選択肢を追加"
|
add: "+選択肢を追加"
|
||||||
destroy: "アンケートを破棄"
|
destroy: "アンケートを破棄"
|
||||||
|
multiple: "複数回答可"
|
||||||
|
expiration: "期限"
|
||||||
|
infinite: "無期限"
|
||||||
|
at: "日時指定"
|
||||||
|
after: "経過指定"
|
||||||
|
no-more: "これ以上追加できません"
|
||||||
|
deadline-date: "期日"
|
||||||
|
deadline-time: "時間"
|
||||||
|
interval: "期間"
|
||||||
|
unit: "単位"
|
||||||
|
second: "秒"
|
||||||
|
minute: "分"
|
||||||
|
hour: "時間"
|
||||||
|
day: "日"
|
||||||
|
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "リアクションを選択"
|
choose-reaction: "リアクションを選択"
|
||||||
@@ -430,7 +601,6 @@ common/views/components/signin.vue:
|
|||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
token: "トークン"
|
token: "トークン"
|
||||||
signing-in: "やってます..."
|
signing-in: "やってます..."
|
||||||
signin: "サインイン"
|
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
signin-with-github: "GitHubでログイン"
|
signin-with-github: "GitHubでログイン"
|
||||||
@@ -554,6 +724,21 @@ common/views/components/profile-editor.vue:
|
|||||||
email-address: "メールアドレス"
|
email-address: "メールアドレス"
|
||||||
email-verified: "メールアドレスが確認されました"
|
email-verified: "メールアドレスが確認されました"
|
||||||
email-not-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: "アカウントを削除"
|
||||||
|
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||||
|
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
@@ -563,6 +748,10 @@ common/views/components/user-list-editor.vue:
|
|||||||
delete-are-you-sure: "リスト「$1」を削除しますか?"
|
delete-are-you-sure: "リスト「$1」を削除しますか?"
|
||||||
deleted: "削除しました"
|
deleted: "削除しました"
|
||||||
|
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
create-list: "リストを作成"
|
||||||
|
list-name: "リスト名"
|
||||||
|
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "確認中"
|
fetching: "確認中"
|
||||||
no-broadcasts: "お知らせはありません"
|
no-broadcasts: "お知らせはありません"
|
||||||
@@ -751,13 +940,6 @@ desktop/views/components/following-window.vue:
|
|||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "フォロー中のユーザーはいないようです。"
|
empty: "フォロー中のユーザーはいないようです。"
|
||||||
|
|
||||||
desktop/views/components/friends-maker.vue:
|
|
||||||
title: "気になるユーザーをフォロー:"
|
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
|
||||||
fetching: "読み込んでいます"
|
|
||||||
refresh: "もっと見る"
|
|
||||||
close: "閉じる"
|
|
||||||
|
|
||||||
desktop/views/components/game-window.vue:
|
desktop/views/components/game-window.vue:
|
||||||
game: "リバーシ"
|
game: "リバーシ"
|
||||||
|
|
||||||
@@ -770,12 +952,6 @@ desktop/views/input-dialog.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
ok: "決定"
|
ok: "決定"
|
||||||
|
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "メッセージ:"
|
|
||||||
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -818,7 +994,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "投稿中"
|
posting: "投稿中"
|
||||||
attach-media-from-local: "PCからメディアを添付"
|
attach-media-from-local: "PCからメディアを添付"
|
||||||
attach-media-from-drive: "ドライブからメディアを添付"
|
attach-media-from-drive: "ドライブからメディアを添付"
|
||||||
attach-cancel: "添付取り消し"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "アンケートを作成"
|
create-poll: "アンケートを作成"
|
||||||
text-remain: "残り{}文字"
|
text-remain: "残り{}文字"
|
||||||
@@ -856,111 +1031,6 @@ desktop/views/pages/user-following-or-followers.vue:
|
|||||||
following: "{user}のフォロー"
|
following: "{user}のフォロー"
|
||||||
followers: "{user}のフォロワー"
|
followers: "{user}のフォロワー"
|
||||||
|
|
||||||
desktop/views/components/settings-window.vue:
|
|
||||||
settings: "設定"
|
|
||||||
|
|
||||||
desktop/views/components/settings.vue:
|
|
||||||
profile: "プロフィール"
|
|
||||||
notification: "通知"
|
|
||||||
apps: "アプリ"
|
|
||||||
tags: "ハッシュタグ"
|
|
||||||
mute-and-block: "ミュート/ブロック"
|
|
||||||
blocking: "ブロック"
|
|
||||||
security: "セキュリティ"
|
|
||||||
signin: "サインイン履歴"
|
|
||||||
password: "パスワード"
|
|
||||||
other: "その他"
|
|
||||||
license: "ライセンス"
|
|
||||||
theme: "テーマ"
|
|
||||||
|
|
||||||
behaviour: "動作"
|
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
|
||||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
|
||||||
note-visibility: "投稿の公開範囲"
|
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
|
||||||
keep-cw: "CW保持"
|
|
||||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
|
||||||
|
|
||||||
display: "デザインと表示"
|
|
||||||
customize: "ホームをカスタマイズ"
|
|
||||||
wallpaper: "壁紙"
|
|
||||||
choose-wallpaper: "壁紙を選択"
|
|
||||||
delete-wallpaper: "壁紙を削除"
|
|
||||||
dark-mode: "ダークモード"
|
|
||||||
use-shadow: "UIに影を使用"
|
|
||||||
rounded-corners: "UIの角を丸める"
|
|
||||||
circle-icons: "円形のアイコンを使用"
|
|
||||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
|
||||||
show-clock-on-header: "右上に時計を表示する"
|
|
||||||
show-reply-target: "リプライ先を表示する"
|
|
||||||
timeline: "タイムライン"
|
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
|
||||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
|
||||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
|
||||||
show-maps: "マップの自動展開"
|
|
||||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
|
||||||
deck-column-align: "デッキのカラムの配置"
|
|
||||||
deck-column-align-center: "中央"
|
|
||||||
deck-column-align-left: "左"
|
|
||||||
deck-column-align-flexible: "フレキシブル"
|
|
||||||
deck-column-width: "デッキのカラムの幅"
|
|
||||||
deck-column-width-narrow: "狭"
|
|
||||||
deck-column-width-narrower: "やや狭"
|
|
||||||
deck-column-width-normal: "普通"
|
|
||||||
deck-column-width-wider: "やや広"
|
|
||||||
deck-column-width-wide: "広"
|
|
||||||
|
|
||||||
sound: "サウンド"
|
|
||||||
enable-sounds: "サウンドを有効にする"
|
|
||||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
|
||||||
volume: "ボリューム"
|
|
||||||
test: "テスト"
|
|
||||||
|
|
||||||
cache: "キャッシュ"
|
|
||||||
clean-cache: "クリーンアップ"
|
|
||||||
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
|
|
||||||
cache-cleared: "キャッシュを削除しました"
|
|
||||||
cache-cleared-desc: "ページを再度読み込みしてください。"
|
|
||||||
|
|
||||||
about: "Misskeyについて"
|
|
||||||
operator: "このサーバーの運営者"
|
|
||||||
|
|
||||||
update: "Misskey Update"
|
|
||||||
version: "バージョン:"
|
|
||||||
latest-version: "最新のバージョン:"
|
|
||||||
update-checking: "アップデートを確認中"
|
|
||||||
do-update: "アップデートを確認"
|
|
||||||
update-settings: "詳細設定"
|
|
||||||
prevent-update: "アップデートを延期する(非推奨)"
|
|
||||||
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
|
|
||||||
no-updates: "利用可能な更新はありません"
|
|
||||||
no-updates-desc: "お使いのMisskeyは最新です。"
|
|
||||||
update-available: "新しいバージョンが利用可能です"
|
|
||||||
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
|
|
||||||
|
|
||||||
advanced-settings: "高度な設定"
|
|
||||||
debug-mode: "デバッグモードを有効にする"
|
|
||||||
debug-mode-desc: "この設定はブラウザに記憶されます。"
|
|
||||||
experimental: "実験的機能を有効にする"
|
|
||||||
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
|
|
||||||
tools: "ツール"
|
|
||||||
task-manager: "タスクマネージャ"
|
|
||||||
third-parties: "サードパーティ"
|
|
||||||
|
|
||||||
navbar-position: "ナビゲーションバーの位置"
|
|
||||||
navbar-position-top: "上"
|
|
||||||
navbar-position-left: "左"
|
|
||||||
navbar-position-right: "右"
|
|
||||||
|
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
|
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
|
||||||
detail: "詳細..."
|
detail: "詳細..."
|
||||||
@@ -1029,6 +1099,11 @@ common/views/components/password-settings.vue:
|
|||||||
changed: "パスワードを変更しました"
|
changed: "パスワードを変更しました"
|
||||||
failed: "パスワード変更に失敗しました"
|
failed: "パスワード変更に失敗しました"
|
||||||
|
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
attach-cancel: "添付取り消し"
|
||||||
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
|
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -1041,16 +1116,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
add: "追加"
|
add: "追加"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
|
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "タスクマネージャ"
|
|
||||||
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あなた宛て"
|
mentions: "あなた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
add-tag-timeline: "ハッシュタグを追加"
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
@@ -1063,18 +1135,11 @@ desktop/views/components/ui.header.vue:
|
|||||||
|
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
favorites: "お気に入り"
|
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
customize: "ホームのカスタマイズ"
|
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
settings: "設定"
|
|
||||||
signout: "サインアウト"
|
|
||||||
dark: "闇に飲まれる"
|
|
||||||
|
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
home: "ホーム"
|
|
||||||
deck: "デッキ"
|
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
|
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
@@ -1093,8 +1158,6 @@ desktop/views/components/received-follow-requests-window.vue:
|
|||||||
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
title: "リスト"
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
|
||||||
list-name: "リスト名"
|
|
||||||
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -1123,6 +1186,8 @@ admin/views/index.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
abuse: "スパム報告"
|
abuse: "スパム報告"
|
||||||
|
queue: "ジョブキュー"
|
||||||
|
logs: "ログ"
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
@@ -1134,6 +1199,10 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "このインスタンス"
|
this-instance: "このインスタンス"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
|
|
||||||
|
admin/views/queue.vue:
|
||||||
|
title: "キュー"
|
||||||
|
remove-all-jobs: "すべてのジョブをクリア"
|
||||||
|
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
title: "スパム報告"
|
||||||
target: "対象"
|
target: "対象"
|
||||||
@@ -1189,15 +1258,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "ローカルタイムラインを無効にする"
|
disable-local-timeline: "ローカルタイムラインを無効にする"
|
||||||
disable-global-timeline: "グローバルタイムラインを無効にする"
|
disable-global-timeline: "グローバルタイムラインを無効にする"
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
||||||
|
enable-emoji-reaction: "リアクションに絵文字を使えるようにする"
|
||||||
|
use-star-for-reaction-fallback: "不明なリアクションのフォールバックに star を使う"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
user-recommendation-config: "おすすめユーザー"
|
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: "メールサーバーの設定"
|
||||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
enable-email: "メール配信を有効にする"
|
enable-email: "メール配信を有効にする"
|
||||||
@@ -1206,6 +1272,7 @@ admin/views/instance.vue:
|
|||||||
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||||
smtp-host: "SMTPホスト"
|
smtp-host: "SMTPホスト"
|
||||||
smtp-port: "SMTPポート"
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-auth: "SMTP認証を行う"
|
||||||
smtp-user: "SMTPユーザー"
|
smtp-user: "SMTPユーザー"
|
||||||
smtp-pass: "SMTPパスワード"
|
smtp-pass: "SMTPパスワード"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
@@ -1280,7 +1347,9 @@ admin/views/users.vue:
|
|||||||
unsuspend-confirm: "凍結を解除しますか?"
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
make-silence: "サイレンス"
|
make-silence: "サイレンス"
|
||||||
|
silence-confirm: "サイレンスしますか?"
|
||||||
unmake-silence: "サイレンスの解除"
|
unmake-silence: "サイレンスの解除"
|
||||||
|
unsilence-confirm: "サイレンスを解除しますか?"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verify-confirm: "公式アカウントにしますか?"
|
verify-confirm: "公式アカウントにしますか?"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
@@ -1304,6 +1373,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@@ -1356,13 +1426,68 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
|
|
||||||
|
admin/views/federation.vue:
|
||||||
|
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}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
|
lookup: "照会"
|
||||||
|
instances: "連合"
|
||||||
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
|
sort: "ソート"
|
||||||
|
sorts:
|
||||||
|
caughtAtAsc: "登録日時が古い順"
|
||||||
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
|
notesAsc: "投稿が少ない順"
|
||||||
|
notesDesc: "投稿が多い順"
|
||||||
|
usersAsc: "ユーザーが少ない順"
|
||||||
|
usersDesc: "ユーザーが多い順"
|
||||||
|
followingAsc: "フォローが少ない順"
|
||||||
|
followingDesc: "フォローが多い順"
|
||||||
|
followersAsc: "フォロワーが少ない順"
|
||||||
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
|
state: "状態"
|
||||||
|
states:
|
||||||
|
all: "すべて"
|
||||||
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
|
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
|
||||||
signin: "ログイン"
|
|
||||||
signup: "新規登録"
|
|
||||||
signin-button: "やってる"
|
|
||||||
signup-button: "やる"
|
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
@@ -1372,9 +1497,6 @@ desktop/views/pages/welcome.vue:
|
|||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
|
|
||||||
desktop/views/pages/home-customize.vue:
|
|
||||||
title: "ホームのカスタマイズ"
|
|
||||||
|
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
next: "次の投稿"
|
next: "次の投稿"
|
||||||
@@ -1389,9 +1511,6 @@ desktop/views/pages/search.vue:
|
|||||||
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{q}」に関する投稿は見つかりませんでした。"
|
not-found: "「{q}」に関する投稿は見つかりませんでした。"
|
||||||
|
|
||||||
desktop/views/pages/share.vue:
|
|
||||||
share-with: "{name}で共有"
|
|
||||||
|
|
||||||
desktop/views/pages/tag.vue:
|
desktop/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
||||||
|
|
||||||
@@ -1415,33 +1534,26 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
no-photos: "写真はありません"
|
no-photos: "写真はありません"
|
||||||
|
|
||||||
desktop/views/pages/user/user.profile.vue:
|
|
||||||
follows-you: "フォローされています"
|
|
||||||
menu: "メニュー"
|
|
||||||
|
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
no-description: "自己紹介はありません"
|
||||||
years-old: "{age}歳"
|
years-old: "{age}歳"
|
||||||
year: "年"
|
year: "年"
|
||||||
month: "月"
|
month: "月"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
follows-you: "フォローされています"
|
||||||
|
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
with-media: "メディア"
|
with-media: "メディア"
|
||||||
my-posts: "私の投稿"
|
my-posts: "私の投稿"
|
||||||
empty: "このユーザーはまだ何も投稿していないようです。"
|
|
||||||
|
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
settings: "通知の設定"
|
|
||||||
|
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
title: "アンケート"
|
title: "アンケート"
|
||||||
@@ -1451,6 +1563,7 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
|
something-happened: "何らかの事情で投稿できませんでした。"
|
||||||
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
@@ -1473,13 +1586,11 @@ mobile/views/components/drive.vue:
|
|||||||
file-count: "ファイル"
|
file-count: "ファイル"
|
||||||
nothing-in-drive: "ドライブには何もありません"
|
nothing-in-drive: "ドライブには何もありません"
|
||||||
folder-is-empty: "このフォルダは空です"
|
folder-is-empty: "このフォルダは空です"
|
||||||
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
|
|
||||||
deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。"
|
|
||||||
folder-name: "フォルダー名"
|
folder-name: "フォルダー名"
|
||||||
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
|
here-is-root: "現在いる場所はルートで、フォルダではありません。"
|
||||||
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
|
|
||||||
url-prompt: "アップロードしたいファイルのURL"
|
url-prompt: "アップロードしたいファイルのURL"
|
||||||
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
||||||
|
folder-name-cannot-empty: "フォルダ名を空白にすることはできません。"
|
||||||
|
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
@@ -1511,13 +1622,6 @@ common/views/components/follow-button.vue:
|
|||||||
follow-processing: "フォロー処理中"
|
follow-processing: "フォロー処理中"
|
||||||
follow-request: "フォロー申請"
|
follow-request: "フォロー申請"
|
||||||
|
|
||||||
mobile/views/components/friends-maker.vue:
|
|
||||||
title: "気になるユーザーをフォロー"
|
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
|
||||||
fetching: "読み込んでいます"
|
|
||||||
refresh: "もっと見る"
|
|
||||||
close: "閉じる"
|
|
||||||
|
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -1551,7 +1655,7 @@ mobile/views/components/post-form.vue:
|
|||||||
quote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
username-prompt: "ユーザー名を入力してください"
|
username-prompt: "ユーザー名を入力してください"
|
||||||
|
|
||||||
@@ -1561,9 +1665,6 @@ mobile/views/components/sub-note-content.vue:
|
|||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
|
||||||
mobile/views/components/timeline.vue:
|
|
||||||
empty: "投稿がありません"
|
|
||||||
|
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@@ -1573,29 +1674,23 @@ mobile/views/components/ui.nav.vue:
|
|||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
favorites: "お気に入り"
|
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
darkmode: "ダークモード"
|
|
||||||
settings: "設定"
|
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
|
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/pages/drive.vue:
|
||||||
no-notes: "このユーザーは投稿していないようです。"
|
contextmenu:
|
||||||
no-notes-with-media: "メディア付き投稿はありません。"
|
upload: "ファイルをアップロード"
|
||||||
|
url-upload: "ファイルをURLでアップロード"
|
||||||
mobile/views/components/users-list.vue:
|
create-folder: "フォルダーを作成"
|
||||||
all: "すべて"
|
rename-folder: "フォルダー名を変更"
|
||||||
known: "知り合い"
|
move-folder: "このフォルダを移動"
|
||||||
|
delete-folder: "このフォルダを削除"
|
||||||
mobile/views/pages/favorites.vue:
|
|
||||||
title: "お気に入り"
|
|
||||||
|
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/user-lists.vue:
|
||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
|
||||||
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1612,14 +1707,11 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あなた宛て"
|
mentions: "あなた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
|
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
||||||
|
|
||||||
mobile/views/pages/welcome.vue:
|
|
||||||
signup: "新規登録"
|
|
||||||
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
|
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
|
||||||
@@ -1642,10 +1734,6 @@ mobile/views/pages/note.vue:
|
|||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
next: "次の投稿"
|
next: "次の投稿"
|
||||||
|
|
||||||
mobile/views/pages/notifications.vue:
|
|
||||||
notifications: "通知"
|
|
||||||
read-all: "すべての通知を既読にしますか?"
|
|
||||||
|
|
||||||
mobile/views/pages/games/reversi.vue:
|
mobile/views/pages/games/reversi.vue:
|
||||||
reversi: "リバーシ"
|
reversi: "リバーシ"
|
||||||
|
|
||||||
@@ -1658,47 +1746,6 @@ mobile/views/pages/selectdrive.vue:
|
|||||||
|
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
design: "デザインと表示"
|
|
||||||
dark-mode: "ダークモード"
|
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
|
||||||
circle-icons: "円形のアイコンを使用"
|
|
||||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
|
||||||
timeline: "タイムライン"
|
|
||||||
show-reply-target: "リプライ先を表示する"
|
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
|
||||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
|
||||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
|
||||||
post-style: "投稿の表示スタイル"
|
|
||||||
post-style-standard: "標準"
|
|
||||||
post-style-smart: "スマート"
|
|
||||||
notification-position: "通知の表示"
|
|
||||||
notification-position-bottom: "下"
|
|
||||||
notification-position-top: "上"
|
|
||||||
behavior: "動作"
|
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
|
||||||
keep-cw: "CW保持"
|
|
||||||
note-visibility: "投稿の公開範囲"
|
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
|
||||||
update: "Misskey Update"
|
|
||||||
version: "バージョン:"
|
|
||||||
latest-version: "最新のバージョン:"
|
|
||||||
update-checking: "アップデートを確認中"
|
|
||||||
check-for-updates: "アップデートを確認"
|
|
||||||
no-updates: "利用可能な更新はありません"
|
|
||||||
no-updates-desc: "お使いのMisskeyは最新です。"
|
|
||||||
update-available: "新しいバージョンが利用可能です"
|
|
||||||
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
|
|
||||||
settings: "設定"
|
|
||||||
signout: "サインアウト"
|
|
||||||
sound: "サウンド"
|
|
||||||
enable-sounds: "サウンドを有効にする"
|
|
||||||
password: "パスワード"
|
|
||||||
|
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
@@ -1716,19 +1763,10 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "キーワード"
|
keywords: "キーワード"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
|
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
|
||||||
no-users: "知り合いのユーザーはいません"
|
|
||||||
|
|
||||||
mobile/views/pages/user/home.friends.vue:
|
|
||||||
no-users: "よく会話するユーザーはいません"
|
|
||||||
|
|
||||||
mobile/views/pages/user/home.notes.vue:
|
|
||||||
no-notes: "投稿はありません"
|
|
||||||
|
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
no-photos: "写真はありません"
|
no-photos: "写真はありません"
|
||||||
|
|
||||||
@@ -1743,6 +1781,7 @@ deck:
|
|||||||
direct: "ダイレクト投稿"
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
select-list: "リストを選択してください"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
swap-right: "右に移動"
|
swap-right: "右に移動"
|
||||||
swap-up: "上に移動"
|
swap-up: "上に移動"
|
||||||
@@ -1752,13 +1791,16 @@ deck:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
disabled-timeline:
|
||||||
|
title: "無効化されたタイムライン"
|
||||||
|
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||||
|
|
||||||
deck/deck.tl-column.vue:
|
deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
|
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
@@ -1800,24 +1842,18 @@ dev/views/apps.vue:
|
|||||||
app-missing: "アプリなし"
|
app-missing: "アプリなし"
|
||||||
|
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
|
new-app: "新しいアプリケーション"
|
||||||
|
new-app-info: "アプリケーションはAPIからでも作成できます。 (app/create)"
|
||||||
create-app: "アプリケーションの作成"
|
create-app: "アプリケーションの作成"
|
||||||
app-name: "アプリケーション名"
|
app-name: "アプリケーション名"
|
||||||
|
app-name-placeholder: "ex) Misskey for iOS"
|
||||||
app-name-desc: "あなたのアプリの名称。"
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
app-name-ex: "ex) Misskey for iOS"
|
|
||||||
app-overview: "アプリの概要"
|
app-overview: "アプリの概要"
|
||||||
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
app-overview-placeholder: " ex) Misskey iOSクライアント。"
|
||||||
app-desc-ex: "ex) Misskey iOSクライアント。"
|
app-overview-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
callback-url: "コールバックURL (オプション)"
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-placeholder: "ex) https://your.app.example.com/callback.php"
|
||||||
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
authority: "権限"
|
authority: "権限"
|
||||||
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
account-read: "アカウントの情報を見る。"
|
|
||||||
account-write: "アカウントの情報を操作する。"
|
|
||||||
note-write: "投稿する。"
|
|
||||||
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
|
||||||
following-write: "フォローしたりフォロー解除する。"
|
|
||||||
drive-read: "ドライブを見る。"
|
|
||||||
drive-write: "ドライブを操作する。"
|
|
||||||
notification-read: "通知を見る。"
|
|
||||||
notification-write: "通知を操作する。"
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
meta:
|
meta:
|
||||||
lang: "日本語 (関西弁)"
|
lang: "日本語 (関西弁)"
|
||||||
divider: ""
|
|
||||||
common:
|
common:
|
||||||
misskey: "A ⭐ of fediverse"
|
misskey: "A ⭐ of fediverse"
|
||||||
about-title: "A ⭐ of fediverse."
|
about-title: "A ⭐ of fediverse."
|
||||||
@@ -56,6 +55,13 @@ common:
|
|||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
messaging: "トーク"
|
messaging: "トーク"
|
||||||
|
home: "ホーム"
|
||||||
|
timeline: "タイムライン"
|
||||||
|
following: "フォローしとる"
|
||||||
|
followers: "フォロワー"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
permissions:
|
||||||
|
"write:votes": "投票するで"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -101,35 +107,22 @@ common:
|
|||||||
d: "言うときたいことは?"
|
d: "言うときたいことは?"
|
||||||
e: "ここに書いてや"
|
e: "ここに書いてや"
|
||||||
f: "あんさんが書くんを待っちょります..."
|
f: "あんさんが書くんを待っちょります..."
|
||||||
|
_settings:
|
||||||
|
profile: "プロフィール"
|
||||||
|
notification: "通知"
|
||||||
|
tags: "ハッシュタグ"
|
||||||
|
blocking: "ブロック"
|
||||||
|
password: "パスワード"
|
||||||
|
other: "その他"
|
||||||
|
timeline: "タイムライン"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "ほい"
|
|
||||||
update-available-title: "更新があんで"
|
update-available-title: "更新があんで"
|
||||||
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
|
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
|
||||||
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
|
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
|
||||||
i-like-sushi: "寿司(のほうがプリンよりむしろ)ウマい、タコ焼きはあらへんけど。"
|
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示や!"
|
|
||||||
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
|
|
||||||
verified-user: "アメちゃん付きアカウント"
|
verified-user: "アメちゃん付きアカウント"
|
||||||
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
|
||||||
always-show-nsfw: "閲覧注意?見せたらあかん?そんなん知らんわ、見せろや!"
|
|
||||||
always-mark-nsfw: "わからんからとりあえずメディアは見せたらあかん"
|
|
||||||
show-full-acct: "ユーザー名のホストも出したる"
|
|
||||||
show-via: "viaを見せる"
|
|
||||||
reduce-motion: "UI、動き過ぎや、静かにしてや"
|
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
|
||||||
use-os-default-emojis: "OSにもとから入っとる絵文字使う"
|
|
||||||
line-width: "線の太さ"
|
|
||||||
line-width-thin: "細い"
|
|
||||||
line-width-normal: "普通"
|
|
||||||
line-width-thick: "太い"
|
|
||||||
hide-password: "パスワードを隠す"
|
|
||||||
show-password: "パスワードを表示する"
|
|
||||||
do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
|
do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
|
||||||
user-suspended: "このユーザーは凍結されています。"
|
|
||||||
is-remote-user: "このユーザー情報は不正確な可能性があります。"
|
|
||||||
is-remote-post: "この投稿情報はコピーです。"
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
view-on-remote: "ちゃんとした情報見せてや!"
|
view-on-remote: "ちゃんとした情報見せてや!"
|
||||||
renoted-by: "{user}がRenote"
|
renoted-by: "{user}がRenote"
|
||||||
@@ -171,19 +164,10 @@ common:
|
|||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
|
dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
|
||||||
ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
|
ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
|
||||||
you: "あなた"
|
you: "あんさん"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
|
share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
|
||||||
permission-ask: "このアプリは次の権限を要求してんで:"
|
permission-ask: "このアプリは次の権限を要求してんで:"
|
||||||
account-read: "アカウントの情報を見させてもらうで。"
|
|
||||||
account-write: "アカウントの情報を操作させてもらうで。"
|
|
||||||
note-write: "投稿させてもらうで。"
|
|
||||||
like-write: "いいねしたりいいね解除させてもらうで。"
|
|
||||||
following-write: "フォローしたりフォロー解除させてもらうで。"
|
|
||||||
drive-read: "ドライブを見させてもらうで。"
|
|
||||||
drive-write: "ドライブを操作させてもらうで。"
|
|
||||||
notification-read: "通知を見させてもらうで。"
|
|
||||||
notification-write: "通知を操作させてもらうで。"
|
|
||||||
cancel: "やめとくわ"
|
cancel: "やめとくわ"
|
||||||
accept: "アクセスを許可や!"
|
accept: "アクセスを許可や!"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@@ -196,6 +180,9 @@ auth/views/index.vue:
|
|||||||
please-go-back: "アプリケーションに戻って、気張ってってな。"
|
please-go-back: "アプリケーションに戻って、気張ってってな。"
|
||||||
error: "セッションが存在してへん。"
|
error: "セッションが存在してへん。"
|
||||||
sign-in: "サインインしてや"
|
sign-in: "サインインしてや"
|
||||||
|
common/views/pages/explore.vue:
|
||||||
|
verified-users: "アメちゃん付きアカウント"
|
||||||
|
federated: "連合"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っとります"
|
waiting-for: "{}を待っとります"
|
||||||
@@ -267,7 +254,6 @@ common/views/components/media-banner.vue:
|
|||||||
sensitive: "見せたらあかん"
|
sensitive: "見せたらあかん"
|
||||||
click-to-show: "押してみ、見せたるわ"
|
click-to-show: "押してみ、見せたるわ"
|
||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
theme: "テーマ"
|
|
||||||
light-theme: "ナイトゲームちゃう時のテーマどないする?"
|
light-theme: "ナイトゲームちゃう時のテーマどないする?"
|
||||||
dark-theme: "ナイトゲームの時のテーマどないする?"
|
dark-theme: "ナイトゲームの時のテーマどないする?"
|
||||||
light-themes: "デイゲーム"
|
light-themes: "デイゲーム"
|
||||||
@@ -284,7 +270,6 @@ common/views/components/theme.vue:
|
|||||||
base-theme: "この色が背景や!"
|
base-theme: "この色が背景や!"
|
||||||
base-theme-light: "Light"
|
base-theme-light: "Light"
|
||||||
base-theme-dark: "Dark"
|
base-theme-dark: "Dark"
|
||||||
find-more-theme: "その他のテーマを入手"
|
|
||||||
theme-name: "テーマ名"
|
theme-name: "テーマ名"
|
||||||
preview-created-theme: "試してみる"
|
preview-created-theme: "試してみる"
|
||||||
invalid-theme: "このテーマあかんわ、なんか間違うとる"
|
invalid-theme: "このテーマあかんわ、なんか間違うとる"
|
||||||
@@ -306,8 +291,6 @@ common/views/components/theme.vue:
|
|||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "もうええわ"
|
hide: "もうええわ"
|
||||||
show: "見たいやろ?"
|
show: "見たいやろ?"
|
||||||
chars: "{count}文字"
|
|
||||||
files: "{count}ファイル"
|
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "ユーザーを探す"
|
search-user: "ユーザーを探す"
|
||||||
@@ -338,9 +321,7 @@ common/views/components/nav.vue:
|
|||||||
develop: "開発者"
|
develop: "開発者"
|
||||||
feedback: "フィードバック"
|
feedback: "フィードバック"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "メンション"
|
|
||||||
detail: "もっと"
|
detail: "もっと"
|
||||||
copy-content: "内容をコピー"
|
|
||||||
copy-link: "リンクをコピー"
|
copy-link: "リンクをコピー"
|
||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
unfavorite: "お気に入りやめる"
|
unfavorite: "お気に入りやめる"
|
||||||
@@ -350,24 +331,12 @@ common/views/components/note-menu.vue:
|
|||||||
delete-confirm: "この投稿を削除してもええか?"
|
delete-confirm: "この投稿を削除してもええか?"
|
||||||
remote: "投稿元に行ってみよか"
|
remote: "投稿元に行ってみよか"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "メンション"
|
|
||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
unmute: "ミュート解除"
|
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
unblock: "ブロック解除"
|
|
||||||
push-to-list: "リストに追加"
|
|
||||||
select-list: "リストを選択してください"
|
|
||||||
report-abuse: "スパムを報告"
|
|
||||||
report-abuse-detail: "どのような迷惑行為を行っていますか?"
|
|
||||||
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
|
|
||||||
silence: "サイレンス"
|
|
||||||
unsilence: "サイレンス解除"
|
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
unsuspend: "凍結解除"
|
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "「{}」に投票や!"
|
vote-to: "「{}」に投票や!"
|
||||||
vote-count: "{}票"
|
vote-count: "{}票"
|
||||||
total-users: "{}人が投票"
|
|
||||||
vote: "投票するで"
|
vote: "投票するで"
|
||||||
show-result: "結果を見よか"
|
show-result: "結果を見よか"
|
||||||
voted: "投票済みや"
|
voted: "投票済みや"
|
||||||
@@ -377,6 +346,7 @@ common/views/components/poll-editor.vue:
|
|||||||
remove: "この選択肢を消すで"
|
remove: "この選択肢を消すで"
|
||||||
add: "+選択肢を追加"
|
add: "+選択肢を追加"
|
||||||
destroy: "アンケートをほかそ"
|
destroy: "アンケートをほかそ"
|
||||||
|
day: "日"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "リアクション、どれにするんや?"
|
choose-reaction: "リアクション、どれにするんや?"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
@@ -394,7 +364,6 @@ common/views/components/signin.vue:
|
|||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
token: "トークン"
|
token: "トークン"
|
||||||
signing-in: "サインイン中や..."
|
signing-in: "サインイン中や..."
|
||||||
signin: "サインイン"
|
|
||||||
or: "それか"
|
or: "それか"
|
||||||
signin-with-twitter: "Twitterでサインイン"
|
signin-with-twitter: "Twitterでサインイン"
|
||||||
signin-with-github: "GitHubでログイン"
|
signin-with-github: "GitHubでログイン"
|
||||||
@@ -432,11 +401,6 @@ common/views/components/stream-indicator.vue:
|
|||||||
connected: "つないだわ"
|
connected: "つないだわ"
|
||||||
common/views/components/notification-settings.vue:
|
common/views/components/notification-settings.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
mark-as-read-all-notifications: "すべての通知を既読にする"
|
|
||||||
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
|
||||||
mark-as-read-all-talk-messages: "すべてのトークを既読にする"
|
|
||||||
auto-watch: "投稿の自動ウォッチ"
|
|
||||||
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
|
|
||||||
common/views/components/integration-settings.vue:
|
common/views/components/integration-settings.vue:
|
||||||
title: "サービス連携"
|
title: "サービス連携"
|
||||||
connect: "つなげる"
|
connect: "つなげる"
|
||||||
@@ -486,7 +450,6 @@ common/views/components/profile-editor.vue:
|
|||||||
account: "アカウント"
|
account: "アカウント"
|
||||||
location: "場所"
|
location: "場所"
|
||||||
description: "自己紹介"
|
description: "自己紹介"
|
||||||
you-can-include-hashtags: "ハッシュタグを含めることができます。"
|
|
||||||
language: "言語"
|
language: "言語"
|
||||||
birthday: "誕生日"
|
birthday: "誕生日"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
@@ -495,7 +458,6 @@ common/views/components/profile-editor.vue:
|
|||||||
is-bot: "このアカウントはBotやで"
|
is-bot: "このアカウントはBotやで"
|
||||||
is-locked: "他人のフォローは許可してからや!"
|
is-locked: "他人のフォローは許可してからや!"
|
||||||
careful-bot: "Botからのフォローだけは許可制や"
|
careful-bot: "Botからのフォローだけは許可制や"
|
||||||
auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
|
|
||||||
advanced: "その他"
|
advanced: "その他"
|
||||||
privacy: "プライバシーってなんや?オカンの年齢か?"
|
privacy: "プライバシーってなんや?オカンの年齢か?"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
@@ -506,13 +468,18 @@ common/views/components/profile-editor.vue:
|
|||||||
email-address: "メールアドレス"
|
email-address: "メールアドレス"
|
||||||
email-verified: "このメールアドレスOKや!"
|
email-verified: "このメールアドレスOKや!"
|
||||||
email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
|
email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
|
||||||
|
export: "エクスポート"
|
||||||
|
import: "インポート"
|
||||||
|
export-targets:
|
||||||
|
following-list: "フォロー"
|
||||||
|
mute-list: "ミュート"
|
||||||
|
blocking-list: "ブロック"
|
||||||
|
user-lists: "リスト"
|
||||||
|
enter-password: "パスワードを入れてや"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
rename: "リスト名を変更"
|
common/views/components/user-lists.vue:
|
||||||
delete: "リストを削除"
|
list-name: "リスト名"
|
||||||
remove-user: "このリストから削除"
|
|
||||||
delete-are-you-sure: "リスト「$1」を削除しますか?"
|
|
||||||
deleted: "削除しました"
|
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "見てみるわ…"
|
fetching: "見てみるわ…"
|
||||||
no-broadcasts: "お知らせはあらへんで"
|
no-broadcasts: "お知らせはあらへんで"
|
||||||
@@ -562,11 +529,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができんで"
|
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができんで"
|
||||||
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示してんねん"
|
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示してんねん"
|
||||||
tips-line21: "APIをつこてbotの開発なども行えるで"
|
tips-line21: "APIをつこてbotの開発なども行えるで"
|
||||||
tips-line23: "藍かわいいよ藍"
|
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始したんよ"
|
tips-line24: "Misskeyは2014年にサービスを開始したんよ"
|
||||||
tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで"
|
tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで"
|
||||||
common/views/pages/not-found.vue:
|
|
||||||
page-not-found: "ページが見つかりませんでした"
|
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォローしとる"
|
following: "フォローしとる"
|
||||||
@@ -674,12 +638,6 @@ desktop/views/components/following-window.vue:
|
|||||||
following: "{} のフォロー"
|
following: "{} のフォロー"
|
||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "フォロー中のユーザーはおらんっぽいで、知らんけど。"
|
empty: "フォロー中のユーザーはおらんっぽいで、知らんけど。"
|
||||||
desktop/views/components/friends-maker.vue:
|
|
||||||
title: "おもろそうやな:"
|
|
||||||
empty: "おもろいユーザー居らんかったわ"
|
|
||||||
fetching: "読み込んどります"
|
|
||||||
refresh: "もっとあるやろ!"
|
|
||||||
close: "さいなら"
|
|
||||||
desktop/views/components/game-window.vue:
|
desktop/views/components/game-window.vue:
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
desktop/views/components/home.vue:
|
desktop/views/components/home.vue:
|
||||||
@@ -689,22 +647,16 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "やめとくわ"
|
cancel: "やめとくわ"
|
||||||
ok: "これや!"
|
ok: "これや!"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "メッセージ:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
location: "ここおるで:"
|
location: "ここおるで:"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
undo-reaction: "リアクション解除"
|
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "返す"
|
reply: "返す"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
undo-reaction: "リアクション解除"
|
|
||||||
detail: "もっと"
|
detail: "もっと"
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
@@ -731,8 +683,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "投稿中"
|
posting: "投稿中"
|
||||||
attach-media-from-local: "PCからメディア持ってくる"
|
attach-media-from-local: "PCからメディア持ってくる"
|
||||||
attach-media-from-drive: "ドライブからメディア持ってくる"
|
attach-media-from-drive: "ドライブからメディア持ってくる"
|
||||||
attach-cancel: "くっつけるのやめよか"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "アンケートを作成"
|
create-poll: "アンケートを作成"
|
||||||
text-remain: "残り{}文字"
|
text-remain: "残り{}文字"
|
||||||
recent-tags: "最近のタグ"
|
recent-tags: "最近のタグ"
|
||||||
@@ -763,101 +713,6 @@ desktop/views/components/renote-form-window.vue:
|
|||||||
desktop/views/pages/user-following-or-followers.vue:
|
desktop/views/pages/user-following-or-followers.vue:
|
||||||
following: "{user}のフォロー"
|
following: "{user}のフォロー"
|
||||||
followers: "{user}のフォロワー"
|
followers: "{user}のフォロワー"
|
||||||
desktop/views/components/settings-window.vue:
|
|
||||||
settings: "設定"
|
|
||||||
desktop/views/components/settings.vue:
|
|
||||||
profile: "プロフィール"
|
|
||||||
notification: "通知"
|
|
||||||
apps: "アプリ"
|
|
||||||
tags: "ハッシュタグ"
|
|
||||||
mute-and-block: "ミュート/ブロック"
|
|
||||||
blocking: "ブロック"
|
|
||||||
security: "セキュリティ"
|
|
||||||
signin: "こんな感じでサインインしたらしいで"
|
|
||||||
password: "パスワード"
|
|
||||||
other: "その他"
|
|
||||||
license: "ライセンス"
|
|
||||||
theme: "テーマ"
|
|
||||||
behaviour: "動き"
|
|
||||||
fetch-on-scroll: "スクロールしたらもっと見せてや"
|
|
||||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動でもっとコンテンツを読み込むで。"
|
|
||||||
note-visibility: "投稿の公開範囲"
|
|
||||||
default-note-visibility: "もとからの公開範囲"
|
|
||||||
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q?{{query}}"
|
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。"
|
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
|
||||||
deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで"
|
|
||||||
keep-cw: "CW保持"
|
|
||||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
|
||||||
display: "見た感じ"
|
|
||||||
customize: "ホームをカスタマイズ"
|
|
||||||
wallpaper: "壁紙"
|
|
||||||
choose-wallpaper: "壁紙選ぶ"
|
|
||||||
delete-wallpaper: "壁紙ほかす"
|
|
||||||
dark-mode: "夜にすんで"
|
|
||||||
use-shadow: "UIに影付けたる"
|
|
||||||
rounded-corners: "みんなまぁるくUI変更"
|
|
||||||
circle-icons: "アイコンもタコ焼きも丸いやんな?"
|
|
||||||
contrasted-acct: "ユーザー名ようわからんし見やすしといて"
|
|
||||||
post-form-on-timeline: "タイムラインの上の方で投稿できるようにせえへん?"
|
|
||||||
show-clock-on-header: "右上をカリヨン広場にする(時計表示)"
|
|
||||||
show-reply-target: "どこにリプライするんや見せて"
|
|
||||||
timeline: "タイムライン"
|
|
||||||
show-my-renotes: "わしのRenoteもタイムライン載せてくれや"
|
|
||||||
show-renoted-my-notes: "わしのRenoteもタイムライン載せてくれや"
|
|
||||||
show-local-renotes: "ローカル投稿のRenoteも見たいんや"
|
|
||||||
show-maps: "地図勝手にバァーって開いてくれ"
|
|
||||||
remain-deleted-note: "削除された投稿も表示しっぱなしにする"
|
|
||||||
deck-column-align: "デッキのカラムの配置"
|
|
||||||
deck-column-align-center: "真ん中"
|
|
||||||
deck-column-align-left: "左"
|
|
||||||
deck-column-align-flexible: "フレキシブル"
|
|
||||||
deck-column-width: "デッキのカラムの幅"
|
|
||||||
deck-column-width-narrow: "狭"
|
|
||||||
deck-column-width-narrower: "やや狭"
|
|
||||||
deck-column-width-normal: "普通"
|
|
||||||
deck-column-width-wider: "やや広"
|
|
||||||
deck-column-width-wide: "広"
|
|
||||||
sound: "サウンド"
|
|
||||||
enable-sounds: "サウンド鳴らす"
|
|
||||||
enable-sounds-desc: "投稿やメッセージもろたとき、音鳴らしたるわ。大丈夫や、この設定はブラウザが覚えてくれとる。"
|
|
||||||
volume: "ボリューム"
|
|
||||||
test: "テスト"
|
|
||||||
cache: "キャッシュ"
|
|
||||||
clean-cache: "お掃除"
|
|
||||||
cache-warn: "お掃除するとな、ブラウザが覚えてくれとるアカウントのあれこれや書きかけの投稿・返信・メッセージや設定情報なんかのデータが全部飛んでいくんや。これやったらページ再読込しといてな。"
|
|
||||||
cache-cleared: "キャッシュお掃除したで"
|
|
||||||
cache-cleared-desc: "もっぺんページ読みこみ直してくれや"
|
|
||||||
about: "Misskeyってなんや?"
|
|
||||||
operator: "このサーバー誰のや"
|
|
||||||
update: "Misskey Update"
|
|
||||||
version: "バージョン:"
|
|
||||||
latest-version: "最新のバージョン:"
|
|
||||||
update-checking: "アップデートはあらへんか……"
|
|
||||||
do-update: "アップデートあるか見てみる"
|
|
||||||
update-settings: "もっと設定"
|
|
||||||
prevent-update: "アップデートしたないわ、また今度や(やめときや)"
|
|
||||||
prevent-update-desc: "この設定をオンにしとってもアップデートが反映される場合があるかも分からん、知らんけど気ぃつけてや。この設定はこのデバイスのみ有効やで。"
|
|
||||||
no-updates: "使える更新はあらへん"
|
|
||||||
no-updates-desc: "つこてるMisskeyは最新や!"
|
|
||||||
update-available: "新しいバージョンが利用可能や"
|
|
||||||
update-available-desc: "ページを再度読み込みすると更新が適用されるで。"
|
|
||||||
advanced-settings: "ワイにはわからん設定"
|
|
||||||
debug-mode: "デバッグモードにしてみる"
|
|
||||||
debug-mode-desc: "この設定はブラウザに記憶されんで。"
|
|
||||||
experimental: "お試し機能使うてみる"
|
|
||||||
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になるかも分からん、知らんけど気ぃつけてや。この設定はブラウザに記憶されんで。"
|
|
||||||
tools: "ツール"
|
|
||||||
task-manager: "タスクマネージャ"
|
|
||||||
third-parties: "サードパーティ"
|
|
||||||
navbar-position: "ナビゲーションバーの位置"
|
|
||||||
navbar-position-top: "上"
|
|
||||||
navbar-position-left: "左"
|
|
||||||
navbar-position-right: "右"
|
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "二段階認証を設定すると、サインイン時にパスワードだけとちゃうくて、予め登録しておいた物理的なデバイス(例えばあんさんのスマートフォンなど)も必要になり、よりセキュリティが向上すんで。"
|
intro: "二段階認証を設定すると、サインイン時にパスワードだけとちゃうくて、予め登録しておいた物理的なデバイス(例えばあんさんのスマートフォンなど)も必要になり、よりセキュリティが向上すんで。"
|
||||||
detail: "詳細..."
|
detail: "詳細..."
|
||||||
@@ -878,8 +733,8 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
|
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
|
||||||
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
|
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "ちょっと見せられへんわ"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして見せるで"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
|
intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
|
||||||
caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
|
caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
|
||||||
@@ -918,26 +773,23 @@ common/views/components/password-settings.vue:
|
|||||||
enter-new-password-again: "もっぺん入れてや"
|
enter-new-password-again: "もっぺん入れてや"
|
||||||
not-match: "パスワードがおうとらん"
|
not-match: "パスワードがおうとらん"
|
||||||
changed: "パスワード変えたわ"
|
changed: "パスワード変えたわ"
|
||||||
failed: "パスワード変更に失敗しました"
|
common/views/components/post-form-attaches.vue:
|
||||||
|
mark-as-sensitive: "見たらあかん感じにしとく"
|
||||||
|
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
desktop/views/components/settings.tags.vue:
|
desktop/views/components/settings.tags.vue:
|
||||||
title: "タグ"
|
add: "増やす"
|
||||||
query: "クエリ (省略可)"
|
|
||||||
add: "追加"
|
|
||||||
save: "保存"
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "タスクマネージャ"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
add-tag-timeline: "ハッシュタグ増やす"
|
add-tag-timeline: "ハッシュタグ増やす"
|
||||||
@@ -948,17 +800,10 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "はん"
|
adjective: "はん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
favorites: "お気に入り"
|
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー許してくれや!言うてみる"
|
follow-requests: "フォロー許してくれや!言うてみる"
|
||||||
customize: "ホームをカスタマイズ"
|
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
settings: "設定"
|
|
||||||
signout: "さいなら"
|
|
||||||
dark: "ナイトゲームじゃ!"
|
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
home: "ホーム"
|
|
||||||
deck: "デッキ"
|
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
@@ -972,8 +817,6 @@ desktop/views/components/received-follow-requests-window.vue:
|
|||||||
reject: "許さん"
|
reject: "許さん"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
title: "リスト"
|
title: "リスト"
|
||||||
create-list: "新しいリストを作成"
|
|
||||||
list-name: "リスト名"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -996,7 +839,6 @@ admin/views/index.vue:
|
|||||||
federation: "連合"
|
federation: "連合"
|
||||||
announcements: "知っといてや"
|
announcements: "知っといてや"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
abuse: "スパム報告"
|
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Misskeyに戻る"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
@@ -1007,10 +849,7 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "ワイのインスタンス"
|
this-instance: "ワイのインスタンス"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
details: "もっと"
|
||||||
target: "対象"
|
|
||||||
reporter: "報告者"
|
|
||||||
details: "詳細"
|
|
||||||
remove-report: "削除"
|
remove-report: "削除"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
instance: "インスタンス"
|
instance: "インスタンス"
|
||||||
@@ -1018,7 +857,6 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
error-image-url: "エラー画像URL"
|
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できるで。"
|
languages-desc: "スペースで区切って複数設定できるで。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1058,17 +896,10 @@ admin/views/instance.vue:
|
|||||||
max-note-text-length: "投稿の最大文字数"
|
max-note-text-length: "投稿の最大文字数"
|
||||||
disable-registration: "ユーザー登録の受付を止める"
|
disable-registration: "ユーザー登録の受付を止める"
|
||||||
disable-local-timeline: "ローカルタイムラインを使えんようにする"
|
disable-local-timeline: "ローカルタイムラインを使えんようにする"
|
||||||
disable-global-timeline: "グローバルタイムラインを無効にする"
|
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
|
||||||
invite: "来てや"
|
invite: "来てや"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
user-recommendation-config: "このユーザーええで"
|
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: "メールサーバーの設定"
|
||||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
|
||||||
enable-email: "メール配信を有効にする"
|
enable-email: "メール配信を有効にする"
|
||||||
@@ -1079,12 +910,6 @@ admin/views/instance.vue:
|
|||||||
smtp-port: "SMTPポート"
|
smtp-port: "SMTPポート"
|
||||||
smtp-user: "SMTPユーザー"
|
smtp-user: "SMTPユーザー"
|
||||||
smtp-pass: "SMTPパスワード"
|
smtp-pass: "SMTPパスワード"
|
||||||
serviceworker-config: "ServiceWorker"
|
|
||||||
enable-serviceworker: "ServiceWorkerを有効にする"
|
|
||||||
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
|
||||||
vapid-publickey: "VAPID公開鍵"
|
|
||||||
vapid-privatekey: "VAPID秘密鍵"
|
|
||||||
vapid-info: "ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります。シェルで次のようにします:"
|
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1103,7 +928,6 @@ admin/views/charts.vue:
|
|||||||
notes-total: "投稿の積算"
|
notes-total: "投稿の積算"
|
||||||
users: "ユーザーの増減"
|
users: "ユーザーの増減"
|
||||||
users-total: "ユーザーの積算"
|
users-total: "ユーザーの積算"
|
||||||
active-users: "アクティブユーザー数"
|
|
||||||
drive: "ドライブ使用量の増減"
|
drive: "ドライブ使用量の増減"
|
||||||
drive-total: "ドライブ使用量の積算"
|
drive-total: "ドライブ使用量の積算"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
@@ -1113,119 +937,66 @@ admin/views/charts.vue:
|
|||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
fileid-or-url: "ファイルIDまたはファイルURL"
|
|
||||||
file-not-found: "ファイルが見つかりません"
|
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
sort:
|
|
||||||
title: "ソート"
|
|
||||||
createdAtAsc: "アップロード日時が古い順"
|
|
||||||
createdAtDesc: "アップロード日時が新しい順"
|
|
||||||
sizeAsc: "サイズが小さい順"
|
|
||||||
sizeDesc: "サイズが大きい順"
|
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
|
||||||
combined: "ローカル+リモート"
|
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
remote: "リモート"
|
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
deleted: "削除しました"
|
mark-as-sensitive: "見たらあかん感じにしとく"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
|
||||||
marked-as-sensitive: "閲覧注意に設定しました"
|
|
||||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
user-not-found: "ユーザーが見つからへん!"
|
user-not-found: "ユーザーが見つからへん!"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
reset-password-confirm: "パスワードをリセットしますか?"
|
|
||||||
password-updated: "パスワードは現在「{password} 」やで"
|
password-updated: "パスワードは現在「{password} 」やで"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspend-confirm: "凍結しますか?"
|
|
||||||
suspended: "凍結しました"
|
|
||||||
unsuspend: "凍結の解除"
|
|
||||||
unsuspend-confirm: "凍結を解除しますか?"
|
|
||||||
unsuspended: "凍結を解除しました"
|
|
||||||
make-silence: "サイレンス"
|
|
||||||
unmake-silence: "サイレンスの解除"
|
|
||||||
verify: "公式アカウントにする"
|
|
||||||
verify-confirm: "公式アカウントにしますか?"
|
|
||||||
verified: "公式アカウントにしました"
|
|
||||||
unverify: "公式アカウントを解除する"
|
|
||||||
unverify-confirm: "公式アカウントを解除しますか?"
|
|
||||||
unverified: "公式アカウントを解除しました"
|
|
||||||
update-remote-user: "リモートユーザー情報の更新"
|
|
||||||
remote-user-updated: "リモートユーザー情報を更新しました"
|
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
|
||||||
title: "ソート"
|
|
||||||
createdAtAsc: "登録日時が古い順"
|
|
||||||
createdAtDesc: "登録日時が新しい順"
|
|
||||||
updatedAtAsc: "更新日時が古い順"
|
|
||||||
updatedAtDesc: "更新日時が新しい順"
|
|
||||||
state:
|
state:
|
||||||
title: "状態"
|
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
admin: "管理者"
|
|
||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
verified: "アメちゃん付きアカウント"
|
||||||
verified: "公式アカウント"
|
|
||||||
suspended: "凍結済み"
|
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
|
||||||
combined: "ローカル+リモート"
|
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
remote: "リモート"
|
|
||||||
createdAt: "登録日時"
|
|
||||||
updatedAt: "更新日時"
|
|
||||||
admin/views/moderators.vue:
|
|
||||||
add-moderator:
|
|
||||||
title: "モデレーターの登録"
|
|
||||||
add: "登録"
|
|
||||||
added: "モデレーターを登録しました"
|
|
||||||
remove: "解除"
|
|
||||||
removed: "モデレーター登録を解除しました"
|
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "絵文字の登録"
|
add: "増やす"
|
||||||
name: "絵文字名"
|
|
||||||
name-desc: "a~z 0~9 _ の文字が使えます。"
|
|
||||||
aliases: "エイリアス"
|
|
||||||
aliases-desc: "スペースで区切って複数設定できます。"
|
|
||||||
url: "絵文字画像URL"
|
|
||||||
add: "追加"
|
|
||||||
info: "50KB以下のPNG画像をおすすめします。"
|
|
||||||
added: "絵文字を登録しました"
|
|
||||||
emojis:
|
emojis:
|
||||||
title: "絵文字一覧"
|
|
||||||
update: "更新"
|
|
||||||
remove: "削除"
|
remove: "削除"
|
||||||
updated: "更新しました"
|
|
||||||
remove-emoji:
|
|
||||||
are-you-sure: "「$1」を削除しますか?"
|
|
||||||
removed: "削除しました"
|
|
||||||
admin/views/announcements.vue:
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "知っときや"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
remove: "削除"
|
remove: "削除"
|
||||||
add: "追加"
|
add: "増やす"
|
||||||
title: "タイトル"
|
saved: "保存したで!"
|
||||||
text: "内容"
|
admin/views/federation.vue:
|
||||||
saved: "保存しました"
|
instance: "インスタンス"
|
||||||
_remove:
|
host: "ホスト"
|
||||||
are-you-sure: "「$1」を削除しますか?"
|
notes: "投稿"
|
||||||
removed: "削除しました"
|
users: "ユーザー"
|
||||||
admin/views/hashtags.vue:
|
following: "フォローしとる"
|
||||||
hided-tags: "Hidden Tags"
|
followers: "フォロワー"
|
||||||
|
status: "ステータス"
|
||||||
|
block: "ブロック"
|
||||||
|
lookup: "照会"
|
||||||
|
instances: "連合"
|
||||||
|
states:
|
||||||
|
all: "すべて"
|
||||||
|
blocked: "ブロック"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "もうちょい……"
|
about: "もうちょい……"
|
||||||
gotit: "ほい"
|
|
||||||
signin: "サインイン"
|
|
||||||
signup: "サインアップ"
|
|
||||||
signin-button: "やっとる"
|
|
||||||
signup-button: "サインアップ"
|
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
announcements: "知っときや"
|
announcements: "知っときや"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
@@ -1233,8 +1004,6 @@ desktop/views/pages/welcome.vue:
|
|||||||
info: "情報"
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "ドライブ"
|
title: "ドライブ"
|
||||||
desktop/views/pages/home-customize.vue:
|
|
||||||
title: "ホームをカスタマイズ"
|
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
prev: "前のやつ"
|
prev: "前のやつ"
|
||||||
next: "次のやつ"
|
next: "次のやつ"
|
||||||
@@ -1245,11 +1014,6 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
upload: "PCからドライブにファイル上げる"
|
upload: "PCからドライブにファイル上げる"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能は使えへんわ。管理者がそう言うとる。"
|
not-available: "検索機能は使えへんわ。管理者がそう言うとる。"
|
||||||
not-found: "「{q}」に関する投稿は見つかりませんでした。"
|
|
||||||
desktop/views/pages/share.vue:
|
|
||||||
share-with: "{name}で共有"
|
|
||||||
desktop/views/pages/tag.vue:
|
|
||||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
|
||||||
desktop/views/pages/user-list.users.vue:
|
desktop/views/pages/user-list.users.vue:
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
add-user: "ユーザー増やす"
|
add-user: "ユーザー増やす"
|
||||||
@@ -1266,9 +1030,6 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
title: "写真"
|
title: "写真"
|
||||||
loading: "読み込んどります"
|
loading: "読み込んどります"
|
||||||
no-photos: "写真はあらへんで"
|
no-photos: "写真はあらへんで"
|
||||||
desktop/views/pages/user/user.profile.vue:
|
|
||||||
follows-you: "フォローされとるで"
|
|
||||||
menu: "メニュー"
|
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1278,17 +1039,13 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
year: "年"
|
year: "年"
|
||||||
month: "月"
|
month: "月"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
follows-you: "フォローされとるで"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
with-media: "メディア"
|
with-media: "メディア"
|
||||||
my-posts: "私の投稿"
|
|
||||||
empty: "このユーザーはまだ何も投稿しとらんようや。"
|
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
settings: "通知の設定"
|
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
title: "アンケート"
|
title: "アンケート"
|
||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
@@ -1314,11 +1071,7 @@ mobile/views/components/drive.vue:
|
|||||||
file-count: "ファイル"
|
file-count: "ファイル"
|
||||||
nothing-in-drive: "ドライブには何もあらへんで。"
|
nothing-in-drive: "ドライブには何もあらへんで。"
|
||||||
folder-is-empty: "このフォルダ何もないわ"
|
folder-is-empty: "このフォルダ何もないわ"
|
||||||
prompt: "何すんの?(数字を入れてや): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
|
|
||||||
deletion-alert: "フォルダの削除は未実装やねん...。堪忍な!"
|
|
||||||
folder-name: "フォルダー名"
|
folder-name: "フォルダー名"
|
||||||
root-rename-alert: "現在おる場所はルートで、フォルダとちゃうから名前の変更はできへん。名前を変更したいフォルダに移動してからやってな。"
|
|
||||||
root-move-alert: "現在おる場所はルートで、フォルダとちゃうから移動はできへん。移動したいフォルダに移動してからやってな。"
|
|
||||||
url-prompt: "このURLのファイルをアップロードしたいねん"
|
url-prompt: "このURLのファイルをアップロードしたいねん"
|
||||||
uploading: "アップロードをリクエストしたで。アップロードが完了するまで時間がかかるかも分からん、知らんけど。"
|
uploading: "アップロードをリクエストしたで。アップロードが完了するまで時間がかかるかも分からん、知らんけど。"
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
@@ -1345,12 +1098,6 @@ common/views/components/follow-button.vue:
|
|||||||
request-pending: "フォロー許してくれるん待っとる"
|
request-pending: "フォロー許してくれるん待っとる"
|
||||||
follow-processing: "今フォロー処理やっとる‥"
|
follow-processing: "今フォロー処理やっとる‥"
|
||||||
follow-request: "フォローさせてや!言うてみる"
|
follow-request: "フォローさせてや!言うてみる"
|
||||||
mobile/views/components/friends-maker.vue:
|
|
||||||
title: "おもろそうやな"
|
|
||||||
empty: "おすすめのユーザーはおらん。"
|
|
||||||
fetching: "読み込んどります"
|
|
||||||
refresh: "もっとあるやろ!"
|
|
||||||
close: "さいなら"
|
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
@@ -1379,7 +1126,7 @@ mobile/views/components/post-form.vue:
|
|||||||
quote-placeholder: "この投稿を持ってくる(オプション)"
|
quote-placeholder: "この投稿を持ってくる(オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
|
geolocation-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
username-prompt: "ユーザー名を入力してや"
|
username-prompt: "ユーザー名を入力してや"
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
@@ -1387,8 +1134,6 @@ mobile/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
mobile/views/components/timeline.vue:
|
|
||||||
empty: "投稿はあらへん"
|
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえり、"
|
welcome-back: "おかえり、"
|
||||||
adjective: "はん"
|
adjective: "はん"
|
||||||
@@ -1397,25 +1142,17 @@ mobile/views/components/ui.nav.vue:
|
|||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
follow-requests: "フォロー許してくれや!言うてみる"
|
follow-requests: "フォロー許してくれや!言うてみる"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
favorites: "お気に入り"
|
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
darkmode: "ナイトゲームや"
|
|
||||||
settings: "設定"
|
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
about: "Misskeyってなんや?"
|
about: "Misskeyってなんや?"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/pages/drive.vue:
|
||||||
no-notes: "このユーザーは投稿しとらんようや。"
|
contextmenu:
|
||||||
no-notes-with-media: "メディア付き投稿はあらへん。"
|
upload: "ファイル上げる"
|
||||||
mobile/views/components/users-list.vue:
|
create-folder: "フォルダー作る"
|
||||||
all: "すべて"
|
|
||||||
known: "知っとる"
|
|
||||||
mobile/views/pages/favorites.vue:
|
|
||||||
title: "お気に入り"
|
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/user-lists.vue:
|
||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してや"
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めようや"
|
lets-start: "📦 始めようや"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1425,17 +1162,13 @@ mobile/views/pages/following.vue:
|
|||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。"
|
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。"
|
||||||
mobile/views/pages/welcome.vue:
|
|
||||||
signup: "新規登録"
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできんで。ウィジェットを移動するんやったら「三」をドラッグしてや。ウィジェットを削除するんやったら「x」をタップしてや。いくつかのウィジェットはタップしたったら表示を変更できるかも分からん、知らんけど。"
|
|
||||||
add-widget: "増やす"
|
add-widget: "増やす"
|
||||||
customization-tips: "カスタマイズのヒント"
|
customization-tips: "カスタマイズのヒント"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
@@ -1450,9 +1183,6 @@ mobile/views/pages/note.vue:
|
|||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前のやつ"
|
prev: "前のやつ"
|
||||||
next: "次のやつ"
|
next: "次のやつ"
|
||||||
mobile/views/pages/notifications.vue:
|
|
||||||
notifications: "通知"
|
|
||||||
read-all: "通知全部読んだか?"
|
|
||||||
mobile/views/pages/games/reversi.vue:
|
mobile/views/pages/games/reversi.vue:
|
||||||
reversi: "リバーシ"
|
reversi: "リバーシ"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
@@ -1462,47 +1192,6 @@ mobile/views/pages/selectdrive.vue:
|
|||||||
select-file: "ファイル選んでや"
|
select-file: "ファイル選んでや"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "あんたは橋の下で拾った{}や!"
|
signed-in-as: "あんたは橋の下で拾った{}や!"
|
||||||
design: "見た感じ"
|
|
||||||
dark-mode: "ナイトゲームや!"
|
|
||||||
i-am-under-limited-internet: "電波と阪神がザコいんや"
|
|
||||||
circle-icons: "アイコンもタコ焼きも丸いやんな?"
|
|
||||||
contrasted-acct: "ユーザー名ようわからんし見やすしといて"
|
|
||||||
timeline: "タイムライン"
|
|
||||||
show-reply-target: "どこにリプライするんや見せて"
|
|
||||||
show-my-renotes: "あんたのしたRenoteも出すで"
|
|
||||||
show-renoted-my-notes: "あんたの言うたことのRenoteも出すで"
|
|
||||||
show-local-renotes: "ローカル投稿のRenoteも出すで"
|
|
||||||
post-style: "投稿の表示スタイル"
|
|
||||||
post-style-standard: "標準"
|
|
||||||
post-style-smart: "べっぴんさん"
|
|
||||||
notification-position: "通知どこ見せる?"
|
|
||||||
notification-position-bottom: "ミナミの方"
|
|
||||||
notification-position-top: "キタの方"
|
|
||||||
behavior: "動き"
|
|
||||||
fetch-on-scroll: "スクロールしたらもっと見せてや"
|
|
||||||
keep-cw: "CW保持"
|
|
||||||
note-visibility: "投稿の公開範囲"
|
|
||||||
default-note-visibility: "もとからの公開範囲"
|
|
||||||
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q?{{query}}"
|
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグなんて要らんわ"
|
|
||||||
load-raw-images: "添付された画像もべっぴんさんのままにしといてな"
|
|
||||||
load-remote-media: "東京とか、リモートサーバーのメディアも見せてや"
|
|
||||||
update: "あんたのMisskeyいつのや?"
|
|
||||||
version: "バージョン:"
|
|
||||||
latest-version: "いっちゃん新しいやつ:"
|
|
||||||
update-checking: "アップデートあるか見とるで"
|
|
||||||
check-for-updates: "アップデートあるんかな?"
|
|
||||||
no-updates: "アップデートあらへんわ"
|
|
||||||
no-updates-desc: "つこてるMisskeyは最新や!"
|
|
||||||
update-available: "もっとええバージョンがあるで"
|
|
||||||
update-available-desc: "もっぺんページ読み込んだら新しなるで"
|
|
||||||
settings: "設定"
|
|
||||||
signout: "さいなら"
|
|
||||||
sound: "サウンド"
|
|
||||||
enable-sounds: "サウンド鳴らす"
|
|
||||||
password: "パスワード"
|
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされとるで"
|
follows-you: "フォローされとるで"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1518,22 +1207,15 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "やっとること"
|
activity: "やっとること"
|
||||||
keywords: "キーワード"
|
keywords: "キーワード"
|
||||||
domains: "よく出るドメイン"
|
domains: "よく出るドメイン"
|
||||||
frequently-replied-users: "よう話しとるユーザー"
|
frequently-replied-users: "よう話すツレ"
|
||||||
followers-you-know: "知っとるフォロワー"
|
followers-you-know: "知っとるフォロワー"
|
||||||
last-used-at: "最後いつ来た?"
|
last-used-at: "最後いつ来た?"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
|
||||||
no-users: "知っとるユーザーは居らん"
|
|
||||||
mobile/views/pages/user/home.friends.vue:
|
|
||||||
no-users: "よう話すユーザーは居らん"
|
|
||||||
mobile/views/pages/user/home.notes.vue:
|
|
||||||
no-notes: "投稿はあらへん"
|
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
no-photos: "写真はあらへんで"
|
no-photos: "写真はあらへんで"
|
||||||
deck:
|
deck:
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
@@ -1551,9 +1233,9 @@ deck:
|
|||||||
pop-right: "右に出すで!"
|
pop-right: "右に出すで!"
|
||||||
deck/deck.tl-column.vue:
|
deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿だけや"
|
is-media-only: "メディア投稿だけや"
|
||||||
is-media-view: "メディアビュー"
|
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされとるで"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
@@ -1593,21 +1275,9 @@ dev/views/new-app.vue:
|
|||||||
create-app: "アプリケーション作る"
|
create-app: "アプリケーション作る"
|
||||||
app-name: "アプリケーションの名前"
|
app-name: "アプリケーションの名前"
|
||||||
app-name-desc: "あんたのアプリの名前。"
|
app-name-desc: "あんたのアプリの名前。"
|
||||||
app-name-ex: "ex) 関西ミスキー保安協会"
|
|
||||||
app-overview: "このアプリどんなん?"
|
app-overview: "このアプリどんなん?"
|
||||||
app-desc: "あんたのアプリどんなんか教えて"
|
|
||||||
app-desc-ex: "ex) 関西人なら誰でも口ずさめるこのCMがついにMisskeyへ。"
|
|
||||||
callback-url: "コールバックURL (無くてもええで)"
|
callback-url: "コールバックURL (無くてもええで)"
|
||||||
callback-url-desc: "ユーザーが認証フォームで認証した後どこに連れてくかを設定できるで"
|
callback-url-desc: "ユーザーが認証フォームで認証した後どこに連れてくかを設定できるで"
|
||||||
authority: "権限"
|
authority: "権限"
|
||||||
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
||||||
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
||||||
account-read: "アカウントの情報見せて"
|
|
||||||
account-write: "アカウントの情報いじらせて"
|
|
||||||
note-write: "投稿させて"
|
|
||||||
reaction-write: "リアクションしたりそれをキャンセルさせて"
|
|
||||||
following-write: "フォローとかフォロー解除させて"
|
|
||||||
drive-read: "ドライブ見せて"
|
|
||||||
drive-write: "ドライブいじらせて"
|
|
||||||
notification-read: "通知見せて"
|
|
||||||
notification-write: "通知いじらせて"
|
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
---
|
---
|
||||||
meta:
|
meta:
|
||||||
lang: "한국어"
|
lang: "한국어"
|
||||||
divider: ""
|
|
||||||
common:
|
common:
|
||||||
misskey: "연합우주의 ⭐"
|
misskey: "연합우주의 ⭐"
|
||||||
about-title: "연합우주의 ⭐."
|
about-title: "연합우주의 ⭐."
|
||||||
about: "Misskey를 찾아주셔서 감사합니다. Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse(다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
|
about: "Misskey를 찾아주셔서 감사합니다. Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse(다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
|
||||||
intro:
|
intro:
|
||||||
title: "Misskey란?"
|
title: "Misskey란?"
|
||||||
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 반응, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
|
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 리액션, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
|
||||||
features: "특징"
|
features: "특징"
|
||||||
rich-contents: "글"
|
rich-contents: "글"
|
||||||
rich-contents-desc: "자신의 생각, 화제의 사건, 모두와 공유하고 싶은 것을 올려주세요. 필요한 경우 다양한 스타일을 사용하여 글을 장식하거나 마음에 드는 이미지, 영상 등의 파일이나 투표를 올리는 것도 가능합니다."
|
rich-contents-desc: "자신의 생각, 화제의 사건, 모두와 공유하고 싶은 것을 올려주세요. 필요한 경우 다양한 스타일을 사용하여 글을 장식하거나 마음에 드는 이미지, 영상 등의 파일이나 투표를 올리는 것도 가능합니다."
|
||||||
@@ -28,6 +27,13 @@ common:
|
|||||||
load-more: "더보기"
|
load-more: "더보기"
|
||||||
enter-password: "비밀번호를 입력하여 주십시오"
|
enter-password: "비밀번호를 입력하여 주십시오"
|
||||||
2fa: "2단계 인증"
|
2fa: "2단계 인증"
|
||||||
|
customize-home: "홈 커스터마이징"
|
||||||
|
featured-notes: "하이라이트"
|
||||||
|
dark-mode: "다크 모드"
|
||||||
|
signin: "로그인"
|
||||||
|
signup: "신규 등록"
|
||||||
|
signout: "로그아웃"
|
||||||
|
reload-to-apply-the-setting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
||||||
got-it: "알겠습니다"
|
got-it: "알겠습니다"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "커스터마이징 도움말"
|
title: "커스터마이징 도움말"
|
||||||
@@ -56,6 +62,22 @@ common:
|
|||||||
trash: "휴지통"
|
trash: "휴지통"
|
||||||
drive: "드라이브"
|
drive: "드라이브"
|
||||||
messaging: "대화"
|
messaging: "대화"
|
||||||
|
home: "홈"
|
||||||
|
deck: "덱"
|
||||||
|
timeline: "타임라인"
|
||||||
|
explore: "발견"
|
||||||
|
following: "팔로우 중"
|
||||||
|
followers: "팔로워"
|
||||||
|
favorites: "즐겨찾기"
|
||||||
|
permissions:
|
||||||
|
"read:account": "계정 정보 보기"
|
||||||
|
"write:account": "계정 정보 변경"
|
||||||
|
"read:drive": "드라이브 보기"
|
||||||
|
"write:drive": "드라이브 수정"
|
||||||
|
"write:votes": "투표하기"
|
||||||
|
empty-timeline-info:
|
||||||
|
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
||||||
|
explore: "사용자 탐색"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "일"
|
sunday: "일"
|
||||||
monday: "월"
|
monday: "월"
|
||||||
@@ -101,38 +123,129 @@ common:
|
|||||||
d: "말하고 싶은 게 있나요?"
|
d: "말하고 싶은 게 있나요?"
|
||||||
e: "여기에 적어주세요"
|
e: "여기에 적어주세요"
|
||||||
f: "작성해주시길 기다리고 있어요..."
|
f: "작성해주시길 기다리고 있어요..."
|
||||||
|
settings: "설정"
|
||||||
|
_settings:
|
||||||
|
profile: "프로필"
|
||||||
|
notification: "알림"
|
||||||
|
apps: "앱"
|
||||||
|
tags: "해시태그"
|
||||||
|
mute-and-block: "뮤트/차단"
|
||||||
|
blocking: "차단"
|
||||||
|
security: "보안"
|
||||||
|
signin: "로그인 기록"
|
||||||
|
password: "비밀번호"
|
||||||
|
other: "기타"
|
||||||
|
appearance: "디자인"
|
||||||
|
behavior: "동작"
|
||||||
|
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
|
||||||
|
fetch-on-scroll-desc: "페이지를 아래로 스크롤하였을 때 자동으로 추가 콘텐츠를 불러옵니다."
|
||||||
|
note-visibility: "게시물의 공개 범위"
|
||||||
|
default-note-visibility: "기본 공개 범위"
|
||||||
|
remember-note-visibility: "글의 공개 범위를 기억하기"
|
||||||
|
web-search-engine: "웹 검색엔진"
|
||||||
|
web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
|
||||||
|
keep-cw: "CW 유지"
|
||||||
|
keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
|
||||||
|
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
|
||||||
|
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
||||||
|
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
|
||||||
|
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
||||||
|
disable-showing-animated-images: "움직이는 이미지를 자동으로 재생하지 않음"
|
||||||
|
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
||||||
|
always-show-nsfw: "항상 열람주의 미디어를 표시"
|
||||||
|
always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
|
||||||
|
show-full-acct: "사용자명의 호스트를 표시하지 않기"
|
||||||
|
show-via: "via 표시하기"
|
||||||
|
reduce-motion: "UI의 애니메이션 줄이기"
|
||||||
|
this-setting-is-this-device-only: "이 장치만"
|
||||||
|
use-os-default-emojis: "운영체제의 기본 이모지 사용"
|
||||||
|
line-width: "선 두께"
|
||||||
|
line-width-thin: "얇음"
|
||||||
|
line-width-normal: "보통"
|
||||||
|
line-width-thick: "두꺼움"
|
||||||
|
font-size: "글씨 크기"
|
||||||
|
font-size-x-small: "작음"
|
||||||
|
font-size-small: "조금 작음"
|
||||||
|
font-size-medium: "보통"
|
||||||
|
font-size-large: "조금 큼"
|
||||||
|
font-size-x-large: "큼"
|
||||||
|
deck-column-align: "덱의 칼럼 위치"
|
||||||
|
deck-column-align-center: "가운데"
|
||||||
|
deck-column-align-left: "왼쪽"
|
||||||
|
deck-column-align-flexible: "플렉서블"
|
||||||
|
deck-column-width: "덱의 칼럼 폭"
|
||||||
|
deck-column-width-narrow: "좁음"
|
||||||
|
deck-column-width-narrower: "조금 좁음"
|
||||||
|
deck-column-width-normal: "보통"
|
||||||
|
deck-column-width-wider: "조금 넓음"
|
||||||
|
deck-column-width-wide: "넓음"
|
||||||
|
use-shadow: "UI에 그림자 효과 적용"
|
||||||
|
rounded-corners: "UI의 모서리를 둥글게 설정"
|
||||||
|
circle-icons: "원형 아이콘 사용"
|
||||||
|
contrasted-acct: "사용자명에 대비 추가"
|
||||||
|
wallpaper: "배경"
|
||||||
|
choose-wallpaper: "배경 설정"
|
||||||
|
delete-wallpaper: "배경 제거"
|
||||||
|
post-form-on-timeline: "타임라인 상단에 글 작성란을 표시"
|
||||||
|
show-clock-on-header: "오른쪽 상단에 시계 표시"
|
||||||
|
show-reply-target: "답글 대상 표시"
|
||||||
|
timeline: "타임라인"
|
||||||
|
show-my-renotes: "내 리노트를 타임라인에 보이기"
|
||||||
|
show-renoted-my-notes: "내 글이 리노트될 경우 타임라인에 보이기"
|
||||||
|
show-local-renotes: "로컬 글의 리노트를 타임라인에 보이기"
|
||||||
|
remain-deleted-note: "삭제된 글을 계속 표시"
|
||||||
|
sound: "소리"
|
||||||
|
enable-sounds: "소리 사용"
|
||||||
|
enable-sounds-desc: "글이나 메시지를 송수신하였을 때 소리를 재생합니다. 이 설정은 브라우저에 저장됩니다."
|
||||||
|
volume: "음량"
|
||||||
|
test: "테스트"
|
||||||
|
update: "Misskey Update"
|
||||||
|
version: "버전:"
|
||||||
|
latest-version: "최신 버전:"
|
||||||
|
update-checking: "업데이트 확인 중"
|
||||||
|
do-update: "업데이트 확인"
|
||||||
|
update-settings: "고급 설정"
|
||||||
|
no-updates: "사용 가능한 업데이트가 없습니다"
|
||||||
|
no-updates-desc: "사용중인 Misskey는 최신 버전입니다."
|
||||||
|
update-available: "새 버전을 사용할 수 있습니다"
|
||||||
|
update-available-desc: "페이지를 다시 로드하면 업데이트가 적용됩니다."
|
||||||
|
advanced-settings: "고급 설정"
|
||||||
|
debug-mode: "디버그 모드를 사용하도록 설정"
|
||||||
|
debug-mode-desc: "이 설정은 브라우저에 저장됩니다."
|
||||||
|
navbar-position: "내비게이션 막대 위치"
|
||||||
|
navbar-position-top: "위"
|
||||||
|
navbar-position-left: "왼쪽"
|
||||||
|
navbar-position-right: "오른쪽"
|
||||||
|
i-am-under-limited-internet: "저는 통신 대역폭이 제한되어 있습니다"
|
||||||
|
post-style: "글 표시 스타일"
|
||||||
|
post-style-standard: "표준"
|
||||||
|
post-style-smart: "스마트"
|
||||||
|
notification-position: "알림 표시"
|
||||||
|
notification-position-bottom: "아래"
|
||||||
|
notification-position-top: "위"
|
||||||
|
disable-via-mobile: "작성하는 글에 \"모바일에서 작성함\" 을 붙이지 않음"
|
||||||
|
load-raw-images: "첨부 이미지를 고품질로 표시"
|
||||||
|
load-remote-media: "원격 서버의 미디어를 표시"
|
||||||
search: "검색"
|
search: "검색"
|
||||||
delete: "삭제"
|
delete: "삭제"
|
||||||
loading: "로드 중"
|
loading: "로드 중"
|
||||||
ok: "확인"
|
ok: "ㅇㅇ"
|
||||||
|
cancel: "그만두기"
|
||||||
update-available-title: "업데이트가 있습니다"
|
update-available-title: "업데이트가 있습니다"
|
||||||
update-available: "Misskey의 새로운 버전이 있습니다 ({newer}. 현재 {current}을 사용 중). 페이지를 다시 로드하면 업데이트가 적용됩니다."
|
update-available: "Misskey의 새로운 버전이 있습니다 ({newer}. 현재 {current}을 사용 중). 페이지를 다시 로드하면 업데이트가 적용됩니다."
|
||||||
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
|
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
|
||||||
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
|
|
||||||
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
|
||||||
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
|
|
||||||
verified-user: "공식 계정"
|
verified-user: "공식 계정"
|
||||||
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
|
||||||
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
|
||||||
always-show-nsfw: "항상 열람주의 미디어를 표시"
|
|
||||||
always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
|
|
||||||
show-full-acct: "사용자명의 호스트를 표시하지 않기"
|
|
||||||
show-via: "via 표시하기"
|
|
||||||
reduce-motion: "UI의 애니메이션 줄이기"
|
|
||||||
this-setting-is-this-device-only: "이 장치만"
|
|
||||||
use-os-default-emojis: "운영체제의 기본 이모지 사용"
|
|
||||||
line-width: "선 두께"
|
|
||||||
line-width-thin: "얇음"
|
|
||||||
line-width-normal: "보통"
|
|
||||||
line-width-thick: "두꺼움"
|
|
||||||
hide-password: "비밀번호 숨기기"
|
hide-password: "비밀번호 숨기기"
|
||||||
show-password: "비밀번호 표시"
|
show-password: "비밀번호 표시"
|
||||||
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
|
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
|
||||||
user-suspended: "이 사용자는 정지된 상태입니다."
|
user-suspended: "이 사용자는 정지된 상태입니다."
|
||||||
is-remote-user: "このユーザー情報は不正確な可能性があります。"
|
is-remote-user: "이 사용자 정보는 정확하지 않을 수 있습니다."
|
||||||
is-remote-post: "이 글 정보는 복사본입니다."
|
is-remote-post: "이 글 정보는 복사본입니다."
|
||||||
view-on-remote: "정확한 정보 보기"
|
view-on-remote: "정확한 정보 보기"
|
||||||
renoted-by: "{user}이(가) 리노트"
|
renoted-by: "{user}이(가) 리노트"
|
||||||
|
no-notes: "글이 없습니다"
|
||||||
|
turn-on-darkmode: "어둠에 삼켜져라"
|
||||||
|
turn-off-darkmode: "빛이 있으라"
|
||||||
error:
|
error:
|
||||||
title: "오류가 발생했습니다"
|
title: "오류가 발생했습니다"
|
||||||
retry: "다시 시도"
|
retry: "다시 시도"
|
||||||
@@ -169,21 +282,13 @@ common:
|
|||||||
nav: "내비게이션"
|
nav: "내비게이션"
|
||||||
tips: "팁"
|
tips: "팁"
|
||||||
hashtags: "해시태그"
|
hashtags: "해시태그"
|
||||||
|
queue: "큐"
|
||||||
dev: "앱을 만드는 데 실패했습니다. 다시 시도하시기 바랍니다."
|
dev: "앱을 만드는 데 실패했습니다. 다시 시도하시기 바랍니다."
|
||||||
ai-chan-kawaii: "아이쨩 귀여워"
|
ai-chan-kawaii: "아이쨩 귀여워"
|
||||||
you: "당신"
|
you: "당신"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>가 당신의 계정에 엑세스하도록 허용하시겠습니까?"
|
share-access: "<i>{name}</i>가 당신의 계정에 엑세스하도록 허용하시겠습니까?"
|
||||||
permission-ask: "이 앱은 다음의 권한을 요청합니다:"
|
permission-ask: "이 앱은 다음의 권한을 요청합니다:"
|
||||||
account-read: "계정 정보 보기."
|
|
||||||
account-write: "계정 정보의 수정."
|
|
||||||
note-write: "게시하기."
|
|
||||||
like-write: "좋아요 하거나 좋아요 해제하기."
|
|
||||||
following-write: "팔로우하거나 팔로우를 취소하기."
|
|
||||||
drive-read: "드라이브 보기."
|
|
||||||
drive-write: "드라이브의 수정."
|
|
||||||
notification-read: "알림 읽기."
|
|
||||||
notification-write: "알림 수정하기."
|
|
||||||
cancel: "취소"
|
cancel: "취소"
|
||||||
accept: "접근 권한 허용"
|
accept: "접근 권한 허용"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@@ -196,6 +301,20 @@ auth/views/index.vue:
|
|||||||
please-go-back: "어플리케이션으로 돌아가여 시도하여 주십시오."
|
please-go-back: "어플리케이션으로 돌아가여 시도하여 주십시오."
|
||||||
error: "세션이 존재하지 않습니다."
|
error: "세션이 존재하지 않습니다."
|
||||||
sign-in: "로그인 해주시기 바랍니다"
|
sign-in: "로그인 해주시기 바랍니다"
|
||||||
|
common/views/pages/explore.vue:
|
||||||
|
verified-users: "공식 계정"
|
||||||
|
popular-users: "인기 사용자"
|
||||||
|
recently-updated-users: "최근 게시한 사용자"
|
||||||
|
recently-registered-users: "신규 사용자"
|
||||||
|
popular-tags: "인기 태그"
|
||||||
|
federated: "연합"
|
||||||
|
explore: "{host}을(를) 탐색"
|
||||||
|
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
||||||
|
common/views/components/url-preview.vue:
|
||||||
|
enable-player: "플레이어 열기"
|
||||||
|
disable-player: "플레이어 닫기"
|
||||||
|
common/views/components/user-list.vue:
|
||||||
|
no-users: "사용자가 없습니다"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "{}을(를) 기다리고 있습니다"
|
waiting-for: "{}을(를) 기다리고 있습니다"
|
||||||
@@ -208,7 +327,7 @@ common/views/components/games/reversi/reversi.game.vue:
|
|||||||
can-put-everywhere: "어디에도 둘 수 있는 모드"
|
can-put-everywhere: "어디에도 둘 수 있는 모드"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "다른 Misskey 유저와 리버시로 대결하자"
|
sub-title: "다른 Misskey 사용자와 리버시로 대결하자"
|
||||||
invite: "초대"
|
invite: "초대"
|
||||||
rule: "게임 방법"
|
rule: "게임 방법"
|
||||||
rule-desc: "리버시는 상대와 번갈아가며 돌을 판에 두고, 상대의 돌을 자신의 돌 사이에 두어 자신의 색으로 바꿔나가며, 최종적으로 남아있는 돌이 많은 쪽이 승리하는 보드게임입니다."
|
rule-desc: "리버시는 상대와 번갈아가며 돌을 판에 두고, 상대의 돌을 자신의 돌 사이에 두어 자신의 색으로 바꿔나가며, 최종적으로 남아있는 돌이 많은 쪽이 승리하는 보드게임입니다."
|
||||||
@@ -344,6 +463,8 @@ common/views/components/note-menu.vue:
|
|||||||
copy-link: "링크 복사"
|
copy-link: "링크 복사"
|
||||||
favorite: "이 노트 즐겨찾기"
|
favorite: "이 노트 즐겨찾기"
|
||||||
unfavorite: "즐겨찾기에서 제거"
|
unfavorite: "즐겨찾기에서 제거"
|
||||||
|
watch: "지켜보기"
|
||||||
|
unwatch: "지켜보기 해제"
|
||||||
pin: "프로필에 고정"
|
pin: "프로필에 고정"
|
||||||
unpin: "프로필에서 고정 해제"
|
unpin: "프로필에서 고정 해제"
|
||||||
delete: "삭제"
|
delete: "삭제"
|
||||||
@@ -360,25 +481,44 @@ common/views/components/user-menu.vue:
|
|||||||
report-abuse: "스팸 신고"
|
report-abuse: "스팸 신고"
|
||||||
report-abuse-detail: "어떤 스팸 행위를 하고 있습니까?"
|
report-abuse-detail: "어떤 스팸 행위를 하고 있습니까?"
|
||||||
report-abuse-reported: "관리자에게 보고되었습니다. 협조해주셔서 감사합니다."
|
report-abuse-reported: "관리자에게 보고되었습니다. 협조해주셔서 감사합니다."
|
||||||
silence: "サイレンス"
|
silence: "침묵"
|
||||||
unsilence: "サイレンス解除"
|
unsilence: "침묵 해제"
|
||||||
suspend: "凍結"
|
suspend: "정지"
|
||||||
unsuspend: "凍結解除"
|
unsuspend: "정지 해제"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "\"{}\"에 투표하기"
|
vote-to: "\"{}\"에 투표하기"
|
||||||
vote-count: "{}표"
|
vote-count: "{}표"
|
||||||
total-users: "{}명이 투표"
|
total-votes: "총 {}표"
|
||||||
vote: "투표하기"
|
vote: "투표하기"
|
||||||
show-result: "결과 보기"
|
show-result: "결과 보기"
|
||||||
voted: "투표함"
|
voted: "투표함"
|
||||||
|
closed: "종료됨"
|
||||||
|
remaining-days: "종료까지 앞으로 {d}일 {h}시간"
|
||||||
|
remaining-hours: "종료까지 앞으로 {h}시간 {m}분"
|
||||||
|
remaining-minutes: "종료까지 앞으로 {m}분 {s}초"
|
||||||
|
remaining-seconds: "종료까지 앞으로 {s}초"
|
||||||
common/views/components/poll-editor.vue:
|
common/views/components/poll-editor.vue:
|
||||||
no-only-one-choice: "투표에는 선택지가 최소한 두 개 필요합니다"
|
no-only-one-choice: "투표에는 선택지가 최소한 두 개 필요합니다"
|
||||||
choice-n: "선택지 {}"
|
choice-n: "선택지 {}"
|
||||||
remove: "이 선택지를 제거"
|
remove: "이 선택지를 제거"
|
||||||
add: "+선택지 추가"
|
add: "+선택지 추가"
|
||||||
destroy: "투표 제거"
|
destroy: "투표 제거"
|
||||||
|
multiple: "복수 응답 가능"
|
||||||
|
expiration: "기한"
|
||||||
|
infinite: "무기한"
|
||||||
|
at: "일시 지정"
|
||||||
|
after: "기간 지정"
|
||||||
|
no-more: "더 이상 추가할 수 없습니다"
|
||||||
|
deadline-date: "기한"
|
||||||
|
deadline-time: "시간"
|
||||||
|
interval: "기간"
|
||||||
|
unit: "단위"
|
||||||
|
second: "초"
|
||||||
|
minute: "분"
|
||||||
|
hour: "시간"
|
||||||
|
day: "일"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "반응 선택"
|
choose-reaction: "리액션 선택"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "커스텀 이모지"
|
custom-emoji: "커스텀 이모지"
|
||||||
people: "사람들"
|
people: "사람들"
|
||||||
@@ -394,7 +534,6 @@ common/views/components/signin.vue:
|
|||||||
password: "비밀번호"
|
password: "비밀번호"
|
||||||
token: "토큰"
|
token: "토큰"
|
||||||
signing-in: "로그인 중입니다..."
|
signing-in: "로그인 중입니다..."
|
||||||
signin: "로그인"
|
|
||||||
or: "또는"
|
or: "또는"
|
||||||
signin-with-twitter: "Twitter로 로그인"
|
signin-with-twitter: "Twitter로 로그인"
|
||||||
signin-with-github: "GitHub으로 로그인"
|
signin-with-github: "GitHub으로 로그인"
|
||||||
@@ -506,6 +645,21 @@ common/views/components/profile-editor.vue:
|
|||||||
email-address: "메일 주소"
|
email-address: "메일 주소"
|
||||||
email-verified: "매일 주소가 확인되었습니다"
|
email-verified: "매일 주소가 확인되었습니다"
|
||||||
email-not-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: "계정 삭제"
|
||||||
|
account-deleted: "계정이 삭제되었습니다. 데이터가 사라질 때까지 시간이 걸릴 수 있습니다."
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "사용자"
|
users: "사용자"
|
||||||
rename: "리스트 이름 바꾸기"
|
rename: "리스트 이름 바꾸기"
|
||||||
@@ -513,6 +667,8 @@ common/views/components/user-list-editor.vue:
|
|||||||
remove-user: "이 리스트에서 제거"
|
remove-user: "이 리스트에서 제거"
|
||||||
delete-are-you-sure: "리스트 \"$1\"을 삭제하시겠습니까?"
|
delete-are-you-sure: "리스트 \"$1\"을 삭제하시겠습니까?"
|
||||||
deleted: "삭제하였습니다"
|
deleted: "삭제하였습니다"
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
list-name: "리스트 이름"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "확인중"
|
fetching: "확인중"
|
||||||
no-broadcasts: "공지사항이 없습니다"
|
no-broadcasts: "공지사항이 없습니다"
|
||||||
@@ -674,12 +830,6 @@ desktop/views/components/following-window.vue:
|
|||||||
following: "{} 의 팔로우"
|
following: "{} 의 팔로우"
|
||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "팔로우중인 사용자가 없는 것 같습니다."
|
empty: "팔로우중인 사용자가 없는 것 같습니다."
|
||||||
desktop/views/components/friends-maker.vue:
|
|
||||||
title: "마음에 드는 사용자를 팔로우:"
|
|
||||||
empty: "추천 사용자를 찾을 수 없습니다."
|
|
||||||
fetching: "불러오는 중입니다"
|
|
||||||
refresh: "더 보기"
|
|
||||||
close: "닫기"
|
|
||||||
desktop/views/components/game-window.vue:
|
desktop/views/components/game-window.vue:
|
||||||
game: "리버시"
|
game: "리버시"
|
||||||
desktop/views/components/home.vue:
|
desktop/views/components/home.vue:
|
||||||
@@ -689,10 +839,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "취소"
|
cancel: "취소"
|
||||||
ok: "확인"
|
ok: "확인"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "메시지:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "메시지"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "이 글은 비공개입니다"
|
private: "이 글은 비공개입니다"
|
||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
@@ -731,7 +877,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "게시중"
|
posting: "게시중"
|
||||||
attach-media-from-local: "PC에서 미디어 첨부"
|
attach-media-from-local: "PC에서 미디어 첨부"
|
||||||
attach-media-from-drive: "드라이브에서 미디어 첨부"
|
attach-media-from-drive: "드라이브에서 미디어 첨부"
|
||||||
attach-cancel: "첨부 취소"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "투표 만들기"
|
create-poll: "투표 만들기"
|
||||||
text-remain: "{}문자 남음"
|
text-remain: "{}문자 남음"
|
||||||
@@ -763,101 +908,6 @@ desktop/views/components/renote-form-window.vue:
|
|||||||
desktop/views/pages/user-following-or-followers.vue:
|
desktop/views/pages/user-following-or-followers.vue:
|
||||||
following: "{user}의 팔로잉"
|
following: "{user}의 팔로잉"
|
||||||
followers: "{user}의 팔로워"
|
followers: "{user}의 팔로워"
|
||||||
desktop/views/components/settings-window.vue:
|
|
||||||
settings: "설정"
|
|
||||||
desktop/views/components/settings.vue:
|
|
||||||
profile: "프로필"
|
|
||||||
notification: "알림"
|
|
||||||
apps: "앱"
|
|
||||||
tags: "해시태그"
|
|
||||||
mute-and-block: "뮤트/차단"
|
|
||||||
blocking: "차단중"
|
|
||||||
security: "보안"
|
|
||||||
signin: "로그인 기록"
|
|
||||||
password: "비밀번호"
|
|
||||||
other: "기타"
|
|
||||||
license: "라이선스"
|
|
||||||
theme: "테마"
|
|
||||||
behaviour: "동작"
|
|
||||||
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
|
|
||||||
fetch-on-scroll-desc: "페이지를 아래로 스크롤하였을 때 자동으로 추가 콘텐츠를 불러옵니다."
|
|
||||||
note-visibility: "게시물의 공개 범위"
|
|
||||||
default-note-visibility: "기본 공개 범위"
|
|
||||||
remember-note-visibility: "글의 공개 범위를 기억하기"
|
|
||||||
web-search-engine: "웹 검색엔진"
|
|
||||||
web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
|
|
||||||
auto-popout: "창 자동 팝아웃"
|
|
||||||
auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다."
|
|
||||||
deck-nav: "덱 내 탐색"
|
|
||||||
deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다."
|
|
||||||
keep-cw: "CW 유지"
|
|
||||||
keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
|
|
||||||
deck-default: "덱을 기본 UI로 설정"
|
|
||||||
display: "디자인 및 표시"
|
|
||||||
customize: "홈 커스터마이징"
|
|
||||||
wallpaper: "배경"
|
|
||||||
choose-wallpaper: "배경 설정"
|
|
||||||
delete-wallpaper: "배경 제거"
|
|
||||||
dark-mode: "다크 모드"
|
|
||||||
use-shadow: "UI에 그림자 효과 적용"
|
|
||||||
rounded-corners: "UI의 모서리를 둥글게 설정"
|
|
||||||
circle-icons: "원형 아이콘 사용"
|
|
||||||
contrasted-acct: "사용자명에 대비 추가"
|
|
||||||
post-form-on-timeline: "타임라인 상단에 글 작성란을 표시"
|
|
||||||
show-clock-on-header: "오른쪽 상단에 시계 표시"
|
|
||||||
show-reply-target: "답글 대상 표시"
|
|
||||||
timeline: "타임라인"
|
|
||||||
show-my-renotes: "내 리노트를 타임라인에 보이기"
|
|
||||||
show-renoted-my-notes: "내 글이 리노트될 경우 타임라인에 보이기"
|
|
||||||
show-local-renotes: "로컬 글의 리노트를 타임라인에 보이기"
|
|
||||||
show-maps: "지도 자동 표시"
|
|
||||||
remain-deleted-note: "삭제된 글을 계속 표시"
|
|
||||||
deck-column-align: "덱의 칼럼 위치"
|
|
||||||
deck-column-align-center: "가운데"
|
|
||||||
deck-column-align-left: "왼쪽"
|
|
||||||
deck-column-align-flexible: "플렉서블"
|
|
||||||
deck-column-width: "덱의 칼럼 폭"
|
|
||||||
deck-column-width-narrow: "좁음"
|
|
||||||
deck-column-width-narrower: "조금 좁음"
|
|
||||||
deck-column-width-normal: "보통"
|
|
||||||
deck-column-width-wider: "조금 넓음"
|
|
||||||
deck-column-width-wide: "넓음"
|
|
||||||
sound: "소리"
|
|
||||||
enable-sounds: "소리 사용"
|
|
||||||
enable-sounds-desc: "글이나 메시지를 송수신하였을 때 소리를 재생합니다. 이 설정은 브라우저에 저장됩니다."
|
|
||||||
volume: "음량"
|
|
||||||
test: "테스트"
|
|
||||||
cache: "캐시"
|
|
||||||
clean-cache: "지우기"
|
|
||||||
cache-warn: "지우기를 실행하면 브라우저에 저장된 계정 정보 캐시, 글이나 답글 및 메시지의 임시 저장, 그 외 데이터 (설정 정보 포함) 가 삭제 됩니다. 지우기 작업을 수행한 후 페이지를 다시 로드해야 합니다."
|
|
||||||
cache-cleared: "캐시를 삭제하였습니다"
|
|
||||||
cache-cleared-desc: "페이지를 새로고침해 주십시오."
|
|
||||||
about: "Misskey에 대하여"
|
|
||||||
operator: "이 서버의 운영자"
|
|
||||||
update: "Misskey Update"
|
|
||||||
version: "버전:"
|
|
||||||
latest-version: "최신 버전:"
|
|
||||||
update-checking: "업데이트 확인 중"
|
|
||||||
do-update: "업데이트 확인"
|
|
||||||
update-settings: "고급 설정"
|
|
||||||
prevent-update: "업데이트를 미루기 (비권장)"
|
|
||||||
prevent-update-desc: "이 설정을 ON으로 하더라도 업데이트가 반영될 가능성이 있습니다. 이 설정은 이 장치에서만 유효합니다."
|
|
||||||
no-updates: "사용 가능한 업데이트가 없습니다"
|
|
||||||
no-updates-desc: "사용중인 Misskey는 최신 버전입니다."
|
|
||||||
update-available: "새 버전을 사용할 수 있습니다"
|
|
||||||
update-available-desc: "페이지를 다시 로드하면 업데이트가 적용됩니다."
|
|
||||||
advanced-settings: "고급 설정"
|
|
||||||
debug-mode: "디버그 모드를 사용하도록 설정"
|
|
||||||
debug-mode-desc: "이 설정은 브라우저에 저장됩니다."
|
|
||||||
experimental: "실험적 기능 사용"
|
|
||||||
experimental-desc: "실험적 기능을 활성화하면 Misskey 프로그램이 불안정해질 수 있습니다. 이 설정은 브라우저에 저장됩니다."
|
|
||||||
tools: "도구"
|
|
||||||
task-manager: "작업 관리자"
|
|
||||||
third-parties: "서드 파티"
|
|
||||||
navbar-position: "내비게이션 막대 위치"
|
|
||||||
navbar-position-top: "위"
|
|
||||||
navbar-position-left: "왼쪽"
|
|
||||||
navbar-position-right: "오른쪽"
|
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "2단계 인증을 설정하면 로그인 하려면 비밀번호 외에도 미리 등록 해놓은 물리적 장치 (예를 들면 당신의 스마트 폰 등) 도 필요하게 되어 보안 수준을 보다 향상시킵니다."
|
intro: "2단계 인증을 설정하면 로그인 하려면 비밀번호 외에도 미리 등록 해놓은 물리적 장치 (예를 들면 당신의 스마트 폰 등) 도 필요하게 되어 보안 수준을 보다 향상시킵니다."
|
||||||
detail: "자세히..."
|
detail: "자세히..."
|
||||||
@@ -919,6 +969,10 @@ common/views/components/password-settings.vue:
|
|||||||
not-match: "새 비밀번호가 일치하지 않습니다"
|
not-match: "새 비밀번호가 일치하지 않습니다"
|
||||||
changed: "비밀번호를 변경하였습니다"
|
changed: "비밀번호를 변경하였습니다"
|
||||||
failed: "비밀번호 변경을 실패하였습니다."
|
failed: "비밀번호 변경을 실패하였습니다."
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
attach-cancel: "첨부 취소"
|
||||||
|
mark-as-sensitive: "열람주의로 설정"
|
||||||
|
unmark-as-sensitive: "열람주의 해제"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "이 글은 비공개입니다"
|
private: "이 글은 비공개입니다"
|
||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
@@ -929,15 +983,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "쿼리 (생략 가능)"
|
query: "쿼리 (생략 가능)"
|
||||||
add: "추가"
|
add: "추가"
|
||||||
save: "저장"
|
save: "저장"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "작업 관리자"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "홈"
|
home: "홈"
|
||||||
local: "로컬"
|
local: "로컬"
|
||||||
hybrid: "소셜"
|
hybrid: "소셜"
|
||||||
global: "글로벌"
|
global: "글로벌"
|
||||||
mentions: "받은 멘션"
|
mentions: "받은 멘션"
|
||||||
messages: "메시지"
|
messages: "다이렉트 게시글"
|
||||||
list: "리스트"
|
list: "리스트"
|
||||||
hashtag: "해시태그"
|
hashtag: "해시태그"
|
||||||
add-tag-timeline: "해시태그 추가"
|
add-tag-timeline: "해시태그 추가"
|
||||||
@@ -948,17 +1000,10 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "님"
|
adjective: "님"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "프로필"
|
profile: "프로필"
|
||||||
favorites: "즐겨찾기"
|
|
||||||
lists: "리스트"
|
lists: "리스트"
|
||||||
follow-requests: "팔로우 요청"
|
follow-requests: "팔로우 요청"
|
||||||
customize: "홈 커스터마이징"
|
|
||||||
admin: "관리"
|
admin: "관리"
|
||||||
settings: "설정"
|
|
||||||
signout: "로그아웃"
|
|
||||||
dark: "어둠에 삼켜져라"
|
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
home: "홈"
|
|
||||||
deck: "덱"
|
|
||||||
game: "게임"
|
game: "게임"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
title: "알림"
|
title: "알림"
|
||||||
@@ -972,8 +1017,6 @@ desktop/views/components/received-follow-requests-window.vue:
|
|||||||
reject: "거부"
|
reject: "거부"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
title: "리스트"
|
title: "리스트"
|
||||||
create-list: "리스트 만들기"
|
|
||||||
list-name: "리스트 이름"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "글"
|
notes: "글"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
@@ -997,6 +1040,8 @@ admin/views/index.vue:
|
|||||||
announcements: "공지사항"
|
announcements: "공지사항"
|
||||||
hashtags: "해시태그"
|
hashtags: "해시태그"
|
||||||
abuse: "스팸 신고"
|
abuse: "스팸 신고"
|
||||||
|
queue: "작업 대기열"
|
||||||
|
logs: "로그"
|
||||||
back-to-misskey: "Misskey로 돌아가기"
|
back-to-misskey: "Misskey로 돌아가기"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "대시보드"
|
dashboard: "대시보드"
|
||||||
@@ -1006,6 +1051,9 @@ admin/views/dashboard.vue:
|
|||||||
instances: "인스턴스"
|
instances: "인스턴스"
|
||||||
this-instance: "이 인스턴스"
|
this-instance: "이 인스턴스"
|
||||||
federated: "연합"
|
federated: "연합"
|
||||||
|
admin/views/queue.vue:
|
||||||
|
title: "큐"
|
||||||
|
remove-all-jobs: "모든 작업 제거"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "스팸 신고"
|
title: "스팸 신고"
|
||||||
target: "대상"
|
target: "대상"
|
||||||
@@ -1026,7 +1074,7 @@ admin/views/instance.vue:
|
|||||||
maintainer-email: "관리자 연락처"
|
maintainer-email: "관리자 연락처"
|
||||||
drive-config: "드라이브 설정"
|
drive-config: "드라이브 설정"
|
||||||
cache-remote-files: "원격 파일을 캐시"
|
cache-remote-files: "원격 파일을 캐시"
|
||||||
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 유저에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다."
|
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 사용자에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다."
|
||||||
local-drive-capacity-mb: "로컬 사용자 한 명당 드라이브 용량"
|
local-drive-capacity-mb: "로컬 사용자 한 명당 드라이브 용량"
|
||||||
remote-drive-capacity-mb: "원격 사용자 한 명당 드라이브 용량"
|
remote-drive-capacity-mb: "원격 사용자 한 명당 드라이브 용량"
|
||||||
mb: "메가바이트 단위"
|
mb: "메가바이트 단위"
|
||||||
@@ -1060,15 +1108,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "로컬 타임라인 비활성화"
|
disable-local-timeline: "로컬 타임라인 비활성화"
|
||||||
disable-global-timeline: "글로벌 타임라인 비활성화"
|
disable-global-timeline: "글로벌 타임라인 비활성화"
|
||||||
disabling-timelines-info: "이 타임라인들을 비활성화해도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
|
disabling-timelines-info: "이 타임라인들을 비활성화해도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
|
||||||
|
enable-emoji-reaction: "리액션에 이모지를 사용할 수 있게 함"
|
||||||
|
use-star-for-reaction-fallback: "알 수 없는 리액션을 star로 대체하여 사용"
|
||||||
invite: "초대"
|
invite: "초대"
|
||||||
save: "저장"
|
save: "저장"
|
||||||
saved: "저장하였습니다"
|
saved: "저장하였습니다"
|
||||||
user-recommendation-config: "추천 사용자"
|
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: "메일 서버 설정"
|
||||||
email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다."
|
email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다."
|
||||||
enable-email: "메일 발신 활성화"
|
enable-email: "메일 발신 활성화"
|
||||||
@@ -1077,6 +1122,7 @@ admin/views/instance.vue:
|
|||||||
smtp-secure-info: "STARTTLS를 사용 시 ON으로 합니다."
|
smtp-secure-info: "STARTTLS를 사용 시 ON으로 합니다."
|
||||||
smtp-host: "SMTP 호스트"
|
smtp-host: "SMTP 호스트"
|
||||||
smtp-port: "SMTP 포트"
|
smtp-port: "SMTP 포트"
|
||||||
|
smtp-auth: "SMTP 인증 수행"
|
||||||
smtp-user: "SMTP 사용자"
|
smtp-user: "SMTP 사용자"
|
||||||
smtp-pass: "SMTP 비밀번호"
|
smtp-pass: "SMTP 비밀번호"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
@@ -1100,7 +1146,7 @@ admin/views/charts.vue:
|
|||||||
notes: "글 증감 (통합)"
|
notes: "글 증감 (통합)"
|
||||||
local-notes: "글 증감 (로컬)"
|
local-notes: "글 증감 (로컬)"
|
||||||
remote-notes: "글 증감 (원격)"
|
remote-notes: "글 증감 (원격)"
|
||||||
notes-total: "글 누적 수"
|
notes-total: "글 누적"
|
||||||
users: "사용자 증감"
|
users: "사용자 증감"
|
||||||
users-total: "사용자 누적"
|
users-total: "사용자 누적"
|
||||||
active-users: "활성 사용자 수"
|
active-users: "활성 사용자 수"
|
||||||
@@ -1172,6 +1218,7 @@ admin/views/users.vue:
|
|||||||
moderator: "모더레이터"
|
moderator: "모더레이터"
|
||||||
adminOrModerator: "관리자+모더레이터"
|
adminOrModerator: "관리자+모더레이터"
|
||||||
verified: "공식 계정"
|
verified: "공식 계정"
|
||||||
|
silenced: "침묵됨"
|
||||||
suspended: "정지됨"
|
suspended: "정지됨"
|
||||||
origin:
|
origin:
|
||||||
title: "위치 (오리진)"
|
title: "위치 (오리진)"
|
||||||
@@ -1219,13 +1266,67 @@ admin/views/announcements.vue:
|
|||||||
removed: "삭제하였습니다"
|
removed: "삭제하였습니다"
|
||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
|
admin/views/federation.vue:
|
||||||
|
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}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행하십시오."
|
||||||
|
block: "차단"
|
||||||
|
marked-as-closed: "폐쇄된 것으로 표시"
|
||||||
|
lookup: "조회"
|
||||||
|
instances: "연합"
|
||||||
|
instance-not-registered: "해당 인스턴스가 등록되어 있지 않습니다"
|
||||||
|
sort: "정렬"
|
||||||
|
sorts:
|
||||||
|
caughtAtAsc: "등록일이 오래된 순"
|
||||||
|
caughtAtDesc: "등록일이 최신인 순"
|
||||||
|
lastCommunicatedAtAsc: "마지막으로 요청을 주고받은 일시가 오래된 순"
|
||||||
|
lastCommunicatedAtDesc: "마지막으로 요청을 주고받은 일시가 빠른 순"
|
||||||
|
notesAsc: "글이 적은 순"
|
||||||
|
notesDesc: "글이 많은 순"
|
||||||
|
usersAsc: "사용자가 적은 순"
|
||||||
|
usersDesc: "사용자가 많은 순"
|
||||||
|
followingAsc: "팔로잉이 적은 순"
|
||||||
|
followingDesc: "팔로잉이 많은 순"
|
||||||
|
followersAsc: "팔로워가 적은 순"
|
||||||
|
followersDesc: "팔로워가 많은 순"
|
||||||
|
driveUsageAsc: "드라이브 사용량이 적은 순"
|
||||||
|
driveUsageDesc: "드라이브 사용량이 많은 순"
|
||||||
|
driveFilesAsc: "드라이브 파일 수가 적은 순"
|
||||||
|
driveFilesDesc: "드라이브 파일 수가 많은 순"
|
||||||
|
state: "상태"
|
||||||
|
states:
|
||||||
|
all: "모두"
|
||||||
|
blocked: "차단됨"
|
||||||
|
not-responding: "응답 없음"
|
||||||
|
marked-as-closed: "폐쇄된 것으로 표시됨"
|
||||||
|
result-is-truncated: "상위 {n}개를 표시하고 있습니다."
|
||||||
|
charts: "차트"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "요청"
|
||||||
|
users: "사용자 증감"
|
||||||
|
users-total: "사용자 누적"
|
||||||
|
notes: "글 증감"
|
||||||
|
notes-total: "글 누적"
|
||||||
|
ff: "팔로잉/팔로워 증감"
|
||||||
|
ff-total: "팔로잉/팔로워 누적"
|
||||||
|
drive-usage: "드라이브 사용량 증감"
|
||||||
|
drive-usage-total: "드라이브 사용량 누적"
|
||||||
|
drive-files: "드라이브 파일 수 증감"
|
||||||
|
drive-files-total: "드라이브 파일 수 누적"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1시간마다"
|
||||||
|
day: "1일마다"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "자세히..."
|
about: "자세히..."
|
||||||
gotit: "알겠습니다"
|
|
||||||
signin: "로그인"
|
|
||||||
signup: "신규 등록"
|
|
||||||
signin-button: "로그인 중"
|
|
||||||
signup-button: "등록"
|
|
||||||
timeline: "타임라인"
|
timeline: "타임라인"
|
||||||
announcements: "공지사항"
|
announcements: "공지사항"
|
||||||
photos: "최근 이미지"
|
photos: "최근 이미지"
|
||||||
@@ -1233,8 +1334,6 @@ desktop/views/pages/welcome.vue:
|
|||||||
info: "정보"
|
info: "정보"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/home-customize.vue:
|
|
||||||
title: "홈 커스터마이징"
|
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
prev: "이전 글"
|
prev: "이전 글"
|
||||||
next: "다음 글"
|
next: "다음 글"
|
||||||
@@ -1246,8 +1345,6 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "검색 기능은 인스턴스 설정에서 비활성화되어 있습니다."
|
not-available: "검색 기능은 인스턴스 설정에서 비활성화되어 있습니다."
|
||||||
not-found: "\"{q}\" 와 일치하는 글을 찾을 수 없습니다."
|
not-found: "\"{q}\" 와 일치하는 글을 찾을 수 없습니다."
|
||||||
desktop/views/pages/share.vue:
|
|
||||||
share-with: "{name}(으)로 공유"
|
|
||||||
desktop/views/pages/tag.vue:
|
desktop/views/pages/tag.vue:
|
||||||
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
|
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
|
||||||
desktop/views/pages/user-list.users.vue:
|
desktop/views/pages/user-list.users.vue:
|
||||||
@@ -1266,29 +1363,24 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
title: "사진"
|
title: "사진"
|
||||||
loading: "로드 중"
|
loading: "로드 중"
|
||||||
no-photos: "사진이 없습니다"
|
no-photos: "사진이 없습니다"
|
||||||
desktop/views/pages/user/user.profile.vue:
|
|
||||||
follows-you: "당신을 팔로우합니다"
|
|
||||||
menu: "메뉴"
|
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "글"
|
posts: "글"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
is-bot: "이 계정은 Bot입니다"
|
is-bot: "이 계정은 Bot입니다"
|
||||||
|
no-description: "자기소개가 없습니다"
|
||||||
years-old: "{age}세"
|
years-old: "{age}세"
|
||||||
year: "년"
|
year: "년"
|
||||||
month: "월"
|
month: "월"
|
||||||
day: "일"
|
day: "일"
|
||||||
|
follows-you: "당신을 팔로우합니다"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "글"
|
default: "글"
|
||||||
with-replies: "글과 답글"
|
with-replies: "글과 답글"
|
||||||
with-media: "미디어"
|
with-media: "미디어"
|
||||||
my-posts: "내 글"
|
my-posts: "내 글"
|
||||||
empty: "이 사용자는 아직 아무것도 게시하지 않은 것 같습니다."
|
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "메시지"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "알림"
|
title: "알림"
|
||||||
settings: "알림 설정"
|
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
title: "투표"
|
title: "투표"
|
||||||
refresh: "새로고침"
|
refresh: "새로고침"
|
||||||
@@ -1314,11 +1406,8 @@ mobile/views/components/drive.vue:
|
|||||||
file-count: "파일"
|
file-count: "파일"
|
||||||
nothing-in-drive: "드라이브에 아무것도 없습니다"
|
nothing-in-drive: "드라이브에 아무것도 없습니다"
|
||||||
folder-is-empty: "폴더가 비어있습니다"
|
folder-is-empty: "폴더가 비어있습니다"
|
||||||
prompt: "무엇을 하시겠습니까? (숫자를 입력하여 주십시오): <1 → 파일 업로드 | 2 → 파일을 URL에서 업로드 | 3 → 폴더 만들기 | 4 → 이 폴더의 이름을 변경 | 5 → 현재 폴더 이동| 6 → 현재 폴더 삭제>"
|
|
||||||
deletion-alert: "죄송합니다! 폴더 삭제는 아직 구현되지 않았습니다..."
|
|
||||||
folder-name: "폴더 이름"
|
folder-name: "폴더 이름"
|
||||||
root-rename-alert: "현재 위치가 루트이고, 폴더가 아니므로 이름을 변경할 수 없습니다. 이름을 바꾸고 싶은 폴더로 이동하여 주십시오."
|
here-is-root: "현재 경로는 루트 경로로 폴더가 아닙니다."
|
||||||
root-move-alert: "현재 위치가 루트이므로, 폴더가 아니므로 이동할 수 없습니다. 이동하고 싶은 폴더로 이동하여 주십시오."
|
|
||||||
url-prompt: "업로드 하려는 파일의 URL"
|
url-prompt: "업로드 하려는 파일의 URL"
|
||||||
uploading: "업로드를 요청하였습니다. 업로드가 완료될 때까지 시간이 소요될 수 있습니다."
|
uploading: "업로드를 요청하였습니다. 업로드가 완료될 때까지 시간이 소요될 수 있습니다."
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
@@ -1345,12 +1434,6 @@ common/views/components/follow-button.vue:
|
|||||||
request-pending: "팔로우 허가 대기중"
|
request-pending: "팔로우 허가 대기중"
|
||||||
follow-processing: "팔로우 처리중"
|
follow-processing: "팔로우 처리중"
|
||||||
follow-request: "팔로우 요청"
|
follow-request: "팔로우 요청"
|
||||||
mobile/views/components/friends-maker.vue:
|
|
||||||
title: "마음에 드는 사용자를 팔로우"
|
|
||||||
empty: "추천 사용자를 찾을 수 없습니다."
|
|
||||||
fetching: "불러오는 중입니다"
|
|
||||||
refresh: "더 보기"
|
|
||||||
close: "닫기"
|
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
private: "이 글은 비공개입니다"
|
private: "이 글은 비공개입니다"
|
||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
@@ -1379,7 +1462,7 @@ mobile/views/components/post-form.vue:
|
|||||||
quote-placeholder: "이 글을 인용... (선택적)"
|
quote-placeholder: "이 글을 인용... (선택적)"
|
||||||
reply-placeholder: "이 글에 답글..."
|
reply-placeholder: "이 글에 답글..."
|
||||||
cw-placeholder: "내용 주석 (선택적)"
|
cw-placeholder: "내용 주석 (선택적)"
|
||||||
location-alert: "사용하시는 장치가 위치정보 기능에 대응하지 않습니다"
|
geolocation-alert: "사용하시는 장치가 위치정보 기능에 대응하지 않습니다"
|
||||||
error: "오류"
|
error: "오류"
|
||||||
username-prompt: "사용자명을 입력하여 주십시오"
|
username-prompt: "사용자명을 입력하여 주십시오"
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
@@ -1387,8 +1470,6 @@ mobile/views/components/sub-note-content.vue:
|
|||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
media-count: "{}개의 미디어"
|
media-count: "{}개의 미디어"
|
||||||
poll: "투표"
|
poll: "투표"
|
||||||
mobile/views/components/timeline.vue:
|
|
||||||
empty: "글이 없습니다"
|
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
welcome-back: "돌아오신 걸 환영합니다."
|
welcome-back: "돌아오신 걸 환영합니다."
|
||||||
adjective: "님"
|
adjective: "님"
|
||||||
@@ -1397,25 +1478,17 @@ mobile/views/components/ui.nav.vue:
|
|||||||
notifications: "알림"
|
notifications: "알림"
|
||||||
follow-requests: "팔로우 요청"
|
follow-requests: "팔로우 요청"
|
||||||
search: "검색"
|
search: "검색"
|
||||||
favorites: "즐겨찾기"
|
|
||||||
user-lists: "리스트"
|
user-lists: "리스트"
|
||||||
widgets: "위젯"
|
widgets: "위젯"
|
||||||
game: "게임"
|
game: "게임"
|
||||||
darkmode: "다크 모드"
|
|
||||||
settings: "설정"
|
|
||||||
admin: "관리"
|
admin: "관리"
|
||||||
about: "Misskey에 대하여"
|
about: "Misskey에 대하여"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/pages/drive.vue:
|
||||||
no-notes: "이 사용자는 작성한 글이 없는 것 같습니다."
|
contextmenu:
|
||||||
no-notes-with-media: "미디어가 첨부된 글이 없습니다."
|
upload: "파일 업로드"
|
||||||
mobile/views/components/users-list.vue:
|
create-folder: "폴더 만들기"
|
||||||
all: "모두"
|
|
||||||
known: "아는 사람"
|
|
||||||
mobile/views/pages/favorites.vue:
|
|
||||||
title: "즐겨찾기"
|
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/user-lists.vue:
|
||||||
title: "리스트"
|
title: "리스트"
|
||||||
enter-list-name: "리스트명을 입력하십시오"
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 이제 시작해도 됩니다"
|
lets-start: "📦 이제 시작해도 됩니다"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1428,11 +1501,9 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "소셜"
|
hybrid: "소셜"
|
||||||
global: "글로벌"
|
global: "글로벌"
|
||||||
mentions: "받은 멘션"
|
mentions: "받은 멘션"
|
||||||
messages: "메시지"
|
messages: "다이렉트 게시글"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
|
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
|
||||||
mobile/views/pages/welcome.vue:
|
|
||||||
signup: "신규 등록"
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
dashboard: "대시보드"
|
dashboard: "대시보드"
|
||||||
widgets-hints: "위젯을 추가 / 제거하거나 정렬할 수 있습니다. 위젯을 이동하려면 창틀의 \"☰\" 아이콘을 드래그합니다. 위젯을 삭제하려면 \"X\" 아이콘을 탭 합니다. 몇몇 위젯은 탭하면 표시형식을 바꿀 수 있습니다."
|
widgets-hints: "위젯을 추가 / 제거하거나 정렬할 수 있습니다. 위젯을 이동하려면 창틀의 \"☰\" 아이콘을 드래그합니다. 위젯을 삭제하려면 \"X\" 아이콘을 탭 합니다. 몇몇 위젯은 탭하면 표시형식을 바꿀 수 있습니다."
|
||||||
@@ -1450,9 +1521,6 @@ mobile/views/pages/note.vue:
|
|||||||
title: "글"
|
title: "글"
|
||||||
prev: "이전 글"
|
prev: "이전 글"
|
||||||
next: "다음 글"
|
next: "다음 글"
|
||||||
mobile/views/pages/notifications.vue:
|
|
||||||
notifications: "알림"
|
|
||||||
read-all: "모든 알림을 읽은 상태로 표시하시겠습니까?"
|
|
||||||
mobile/views/pages/games/reversi.vue:
|
mobile/views/pages/games/reversi.vue:
|
||||||
reversi: "리버시"
|
reversi: "리버시"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
@@ -1462,47 +1530,6 @@ mobile/views/pages/selectdrive.vue:
|
|||||||
select-file: "파일 선택"
|
select-file: "파일 선택"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "{}(으)로 로그인"
|
signed-in-as: "{}(으)로 로그인"
|
||||||
design: "디자인 및 표시"
|
|
||||||
dark-mode: "다크 모드"
|
|
||||||
i-am-under-limited-internet: "저는 통신 대역폭이 제한되어 있습니다"
|
|
||||||
circle-icons: "원형 아이콘 사용"
|
|
||||||
contrasted-acct: "사용자명에 대비 추가"
|
|
||||||
timeline: "타임라인"
|
|
||||||
show-reply-target: "답글 대상 표시"
|
|
||||||
show-my-renotes: "자신이 한 리노트 표시"
|
|
||||||
show-renoted-my-notes: "자신의 글이 리노트된 것을 표시"
|
|
||||||
show-local-renotes: "로컬 글의 리노트 표시"
|
|
||||||
post-style: "글 표시 스타일"
|
|
||||||
post-style-standard: "표준"
|
|
||||||
post-style-smart: "스마트"
|
|
||||||
notification-position: "알림 표시"
|
|
||||||
notification-position-bottom: "아래"
|
|
||||||
notification-position-top: "위"
|
|
||||||
behavior: "동작"
|
|
||||||
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
|
|
||||||
keep-cw: "CW 유지"
|
|
||||||
note-visibility: "게시물의 공개 범위"
|
|
||||||
default-note-visibility: "기본 공개 범위"
|
|
||||||
remember-note-visibility: "글의 공개 범위를 기억하기"
|
|
||||||
web-search-engine: "웹 검색엔진"
|
|
||||||
web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
|
|
||||||
disable-via-mobile: "작성하는 글에 \"모바일에서 작성함\" 을 붙이지 않음"
|
|
||||||
load-raw-images: "첨부 이미지를 고품질로 표시"
|
|
||||||
load-remote-media: "원격 서버의 미디어를 표시"
|
|
||||||
update: "Misskey Update"
|
|
||||||
version: "버전:"
|
|
||||||
latest-version: "최신 버전:"
|
|
||||||
update-checking: "업데이트 확인 중"
|
|
||||||
check-for-updates: "업데이트 확인"
|
|
||||||
no-updates: "사용 가능한 업데이트가 없습니다"
|
|
||||||
no-updates-desc: "사용중인 Misskey는 최신 버전입니다."
|
|
||||||
update-available: "새 버전을 사용할 수 있습니다"
|
|
||||||
update-available-desc: "페이지를 다시 로드하면 업데이트가 적용됩니다."
|
|
||||||
settings: "설정"
|
|
||||||
signout: "로그아웃"
|
|
||||||
sound: "소리"
|
|
||||||
enable-sounds: "소리 사용"
|
|
||||||
password: "비밀번호"
|
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "당신을 팔로우합니다"
|
follows-you: "당신을 팔로우합니다"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
@@ -1518,15 +1545,9 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "활동"
|
activity: "활동"
|
||||||
keywords: "키워드"
|
keywords: "키워드"
|
||||||
domains: "자주 보이는 도메인"
|
domains: "자주 보이는 도메인"
|
||||||
frequently-replied-users: "자주 대화하는 사용자"
|
frequently-replied-users: "자주 언급되는 사용자"
|
||||||
followers-you-know: "아는 사람의 팔로워"
|
followers-you-know: "아는 사람의 팔로워"
|
||||||
last-used-at: "마지막 로그인"
|
last-used-at: "마지막 로그인"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
|
||||||
no-users: "아는 사용자가 없습니다"
|
|
||||||
mobile/views/pages/user/home.friends.vue:
|
|
||||||
no-users: "자주 대화하는 사용자가 없습니다"
|
|
||||||
mobile/views/pages/user/home.notes.vue:
|
|
||||||
no-notes: "글이 없습니다"
|
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
no-photos: "사진이 없습니다"
|
no-photos: "사진이 없습니다"
|
||||||
deck:
|
deck:
|
||||||
@@ -1540,6 +1561,7 @@ deck:
|
|||||||
direct: "다이렉트 게시글"
|
direct: "다이렉트 게시글"
|
||||||
notifications: "알림"
|
notifications: "알림"
|
||||||
list: "리스트"
|
list: "리스트"
|
||||||
|
select-list: "리스트를 선택하여 주십시오"
|
||||||
swap-left: "왼쪽으로 이동"
|
swap-left: "왼쪽으로 이동"
|
||||||
swap-right: "오른쪽으로 이동"
|
swap-right: "오른쪽으로 이동"
|
||||||
swap-up: "위로 이동"
|
swap-up: "위로 이동"
|
||||||
@@ -1549,11 +1571,14 @@ deck:
|
|||||||
rename: "이름 변경"
|
rename: "이름 변경"
|
||||||
stack-left: "왼쪽에 쌓기"
|
stack-left: "왼쪽에 쌓기"
|
||||||
pop-right: "오른쪽으로 빼기"
|
pop-right: "오른쪽으로 빼기"
|
||||||
|
disabled-timeline:
|
||||||
|
title: "비활성화된 타임라인"
|
||||||
|
description: "서버 운영자에 의해 이 타임라인이 사용할 수 없도록 설정되어 있습니다."
|
||||||
deck/deck.tl-column.vue:
|
deck/deck.tl-column.vue:
|
||||||
is-media-only: "미디어가 달린 글만"
|
is-media-only: "미디어가 달린 글만"
|
||||||
is-media-view: "미디어 보기"
|
|
||||||
edit: "옵션"
|
edit: "옵션"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "당신을 팔로우합니다"
|
||||||
posts: "글"
|
posts: "글"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
@@ -1593,21 +1618,9 @@ dev/views/new-app.vue:
|
|||||||
create-app: "어플리케이션 생성"
|
create-app: "어플리케이션 생성"
|
||||||
app-name: "어플리케이션 이름"
|
app-name: "어플리케이션 이름"
|
||||||
app-name-desc: "앱의 이름."
|
app-name-desc: "앱의 이름."
|
||||||
app-name-ex: "ex) Misskey for iOS"
|
|
||||||
app-overview: "앱 개요"
|
app-overview: "앱 개요"
|
||||||
app-desc: "어플리케이션에 대한 간단한 설명."
|
|
||||||
app-desc-ex: "ex) Misskey iOS 클라이언트."
|
|
||||||
callback-url: "콜백 URL (옵션)"
|
callback-url: "콜백 URL (옵션)"
|
||||||
callback-url-desc: "사용자가 인증 폼에서 인증한 뒤 리다이렉트할 URL을 설정합니다."
|
callback-url-desc: "사용자가 인증 폼에서 인증한 뒤 리다이렉트할 URL을 설정합니다."
|
||||||
authority: "권한"
|
authority: "권한"
|
||||||
authority-desc: "이곳에서 요청한 권한에 한정하여 API로 액세스할 수 있습니다."
|
authority-desc: "이곳에서 요청한 권한에 한정하여 API로 액세스할 수 있습니다."
|
||||||
authority-warning: "앱을 생성한 뒤에도 변경할 수 있지만, 새로운 권한을 설정하는 경우 그 시점부터 예전에 발급받았던 유저 키는 모두 무효화됩니다."
|
authority-warning: "앱을 생성한 뒤에도 변경할 수 있지만, 새로운 권한을 설정하는 경우 그 시점부터 예전에 발급받았던 유저 키는 모두 무효화됩니다."
|
||||||
account-read: "계정 정보 보기."
|
|
||||||
account-write: "계정 정보 편집."
|
|
||||||
note-write: "글 쓰기."
|
|
||||||
reaction-write: "리액션을 하거나 리액션을 취소할 수 있음."
|
|
||||||
following-write: "팔로우하거나 팔로우 해제하기."
|
|
||||||
drive-read: "드라이브 보기."
|
|
||||||
drive-write: "드라이브를 조작."
|
|
||||||
notification-read: "알림 보기."
|
|
||||||
notification-write: "알림 조작."
|
|
||||||
|
|||||||
1244
locales/nl-NL.yml
1244
locales/nl-NL.yml
File diff suppressed because it is too large
Load Diff
1283
locales/no-NO.yml
1283
locales/no-NO.yml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1460
locales/pt-PT.yml
1460
locales/pt-PT.yml
File diff suppressed because it is too large
Load Diff
1489
locales/ru-RU.yml
1489
locales/ru-RU.yml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
88
locales/zh-TW.yml
Normal file
88
locales/zh-TW.yml
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
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: "雲端硬碟"
|
||||||
209
package.json
209
package.json
@@ -1,14 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.81.0",
|
"version": "11.3.1",
|
||||||
"clientVersion": "2.0.14026",
|
"codename": "daybreak",
|
||||||
"codename": "nighthike",
|
"repository": {
|
||||||
"main": "./built/index.js",
|
"type": "git",
|
||||||
|
"url": "https://github.com/syuilo/misskey.git"
|
||||||
|
},
|
||||||
|
"main": "./index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./built",
|
"start": "node ./index.js",
|
||||||
"debug": "DEBUG=misskey:* node ./built",
|
"init": "node ./built/init.js",
|
||||||
"build": "webpack && gulp build",
|
"build": "webpack && gulp build",
|
||||||
"webpack": "webpack",
|
"webpack": "webpack",
|
||||||
"watch": "webpack --watch",
|
"watch": "webpack --watch",
|
||||||
@@ -19,109 +22,104 @@
|
|||||||
"test": "gulp test",
|
"test": "gulp test",
|
||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
|
||||||
"terser": "3.14.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.14",
|
"@fortawesome/fontawesome-svg-core": "1.2.15",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.6.3",
|
"@fortawesome/free-brands-svg-icons": "5.7.2",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.7.0",
|
"@fortawesome/free-regular-svg-icons": "5.7.2",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.6.3",
|
"@fortawesome/free-solid-svg-icons": "5.7.2",
|
||||||
"@fortawesome/vue-fontawesome": "0.1.5",
|
"@fortawesome/vue-fontawesome": "0.1.5",
|
||||||
"@koa/cors": "2.2.3",
|
"@koa/cors": "2.2.3",
|
||||||
"@prezzemolo/rap": "0.1.2",
|
|
||||||
"@prezzemolo/zip": "0.0.3",
|
"@prezzemolo/zip": "0.0.3",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/chai-http": "3.0.5",
|
"@types/bull": "3.5.11",
|
||||||
"@types/dateformat": "3.0.0",
|
"@types/dateformat": "3.0.0",
|
||||||
"@types/deep-equal": "1.0.1",
|
"@types/deep-equal": "1.0.1",
|
||||||
"@types/double-ended-queue": "2.1.0",
|
"@types/double-ended-queue": "2.1.0",
|
||||||
"@types/elasticsearch": "5.0.30",
|
"@types/elasticsearch": "5.0.32",
|
||||||
"@types/file-type": "10.6.0",
|
"@types/file-type": "10.9.1",
|
||||||
"@types/gulp": "4.0.5",
|
"@types/gulp": "4.0.6",
|
||||||
"@types/gulp-mocha": "0.0.32",
|
"@types/gulp-mocha": "0.0.32",
|
||||||
"@types/gulp-rename": "0.0.33",
|
"@types/gulp-rename": "0.0.33",
|
||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
"@types/gulp-uglify": "3.0.6",
|
"@types/gulp-uglify": "3.0.6",
|
||||||
"@types/gulp-util": "3.0.34",
|
"@types/gulp-util": "3.0.34",
|
||||||
"@types/is-root": "1.0.0",
|
"@types/is-root": "1.0.0",
|
||||||
"@types/is-svg": "3.0.0",
|
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.12.0",
|
"@types/js-yaml": "3.12.1",
|
||||||
"@types/katex": "0.5.0",
|
"@types/jsdom": "12.2.3",
|
||||||
|
"@types/katex": "0.10.1",
|
||||||
"@types/koa": "2.0.48",
|
"@types/koa": "2.0.48",
|
||||||
"@types/koa-bodyparser": "5.0.2",
|
"@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-cors": "0.0.0",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.19",
|
||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "3.0.1",
|
"@types/koa-mount": "3.0.1",
|
||||||
"@types/koa-multer": "1.0.0",
|
"@types/koa-multer": "1.0.0",
|
||||||
"@types/koa-router": "7.0.39",
|
"@types/koa-router": "7.0.40",
|
||||||
"@types/koa-send": "4.1.1",
|
"@types/koa-send": "4.1.2",
|
||||||
"@types/koa-views": "2.0.3",
|
"@types/koa-views": "2.0.3",
|
||||||
"@types/koa__cors": "2.2.3",
|
"@types/koa__cors": "2.2.3",
|
||||||
|
"@types/lolex": "3.1.1",
|
||||||
"@types/minio": "7.0.1",
|
"@types/minio": "7.0.1",
|
||||||
"@types/mkdirp": "0.5.2",
|
"@types/mocha": "5.2.6",
|
||||||
"@types/mocha": "5.2.5",
|
"@types/node": "11.13.4",
|
||||||
"@types/mongodb": "3.1.19",
|
"@types/nodemailer": "4.6.7",
|
||||||
"@types/node": "10.12.18",
|
|
||||||
"@types/nodemailer": "4.6.5",
|
|
||||||
"@types/nprogress": "0.0.29",
|
"@types/nprogress": "0.0.29",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parse5": "5.0.0",
|
"@types/parse5": "5.0.0",
|
||||||
"@types/parsimmon": "1.10.0",
|
"@types/parsimmon": "1.10.0",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@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/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": "2.48.1",
|
||||||
"@types/request-promise-native": "1.0.15",
|
"@types/request-promise-native": "1.0.15",
|
||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "2.0.2",
|
"@types/rimraf": "2.0.2",
|
||||||
"@types/seedrandom": "2.4.27",
|
"@types/sharp": "0.22.1",
|
||||||
"@types/sharp": "0.21.1",
|
|
||||||
"@types/showdown": "1.9.2",
|
"@types/showdown": "1.9.2",
|
||||||
"@types/speakeasy": "2.0.3",
|
"@types/speakeasy": "2.0.4",
|
||||||
"@types/systeminformation": "3.23.1",
|
"@types/systeminformation": "3.23.1",
|
||||||
"@types/tinycolor2": "1.4.1",
|
"@types/tinycolor2": "1.4.1",
|
||||||
"@types/tmp": "0.0.33",
|
"@types/tmp": "0.1.0",
|
||||||
"@types/uuid": "3.4.4",
|
"@types/uuid": "3.4.4",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.0",
|
||||||
"@types/webpack": "4.4.24",
|
"@types/webpack": "4.4.27",
|
||||||
"@types/webpack-stream": "3.2.10",
|
"@types/webpack-stream": "3.2.10",
|
||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.1",
|
||||||
"animejs": "3.0.1",
|
"animejs": "3.0.1",
|
||||||
"apexcharts": "2.5.1",
|
"apexcharts": "3.6.8",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bee-queue": "1.2.2",
|
"bootstrap-vue": "2.0.0-rc.13",
|
||||||
"bootstrap-vue": "2.0.0-rc.11",
|
"bull": "3.7.0",
|
||||||
"cafy": "12.1.0",
|
"cafy": "15.1.1",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chai-http": "4.2.1",
|
|
||||||
"chalk": "2.4.2",
|
"chalk": "2.4.2",
|
||||||
"commander": "2.19.0",
|
"cli-highlight": "2.1.0",
|
||||||
|
"commander": "2.20.0",
|
||||||
|
"content-disposition": "0.5.3",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "1.0.1",
|
"css-loader": "2.1.1",
|
||||||
"cssnano": "4.1.8",
|
"cssnano": "4.1.10",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "3.0.3",
|
||||||
"deep-equal": "1.0.1",
|
"deep-equal": "1.0.1",
|
||||||
"deepcopy": "0.6.3",
|
"diskusage": "1.1.0",
|
||||||
"diskusage": "1.0.0",
|
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"elasticsearch": "15.3.1",
|
"elasticsearch": "15.4.1",
|
||||||
"emojilib": "2.4.0",
|
"emojilib": "2.4.0",
|
||||||
"escape-regexp": "0.0.1",
|
"eslint": "5.16.0",
|
||||||
"eslint": "5.12.0",
|
"eslint-plugin-vue": "5.2.2",
|
||||||
"eslint-plugin-vue": "5.1.0",
|
|
||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "3.1.0",
|
||||||
"feed": "2.0.2",
|
"feed": "2.0.4",
|
||||||
"file-type": "10.7.0",
|
"file-type": "10.11.0",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "4.0.0",
|
"gulp": "4.0.0",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
@@ -129,26 +127,24 @@
|
|||||||
"gulp-mocha": "6.0.0",
|
"gulp-mocha": "6.0.0",
|
||||||
"gulp-rename": "1.4.0",
|
"gulp-rename": "1.4.0",
|
||||||
"gulp-replace": "1.0.0",
|
"gulp-replace": "1.0.0",
|
||||||
"gulp-sourcemaps": "2.6.4",
|
"gulp-sourcemaps": "2.6.5",
|
||||||
"gulp-stylus": "2.7.0",
|
"gulp-stylus": "2.7.0",
|
||||||
"gulp-tslint": "8.1.3",
|
"gulp-tslint": "8.1.4",
|
||||||
"gulp-typescript": "5.0.0",
|
"gulp-typescript": "5.0.1",
|
||||||
"gulp-uglify": "3.0.1",
|
"gulp-uglify": "3.0.2",
|
||||||
"gulp-util": "3.0.8",
|
"gulp-util": "3.0.8",
|
||||||
"gulp-yaml": "2.0.3",
|
|
||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
"html-minifier": "3.5.21",
|
"html-minifier": "4.0.0",
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.1.1",
|
"insert-text-at-cursor": "0.2.0",
|
||||||
"is-root": "2.0.0",
|
"is-root": "2.1.0",
|
||||||
"is-svg": "3.0.0",
|
"is-svg": "4.1.0",
|
||||||
"is-url": "1.2.4",
|
"js-yaml": "3.13.1",
|
||||||
"js-yaml": "3.12.1",
|
"jsdom": "14.1.0",
|
||||||
"jsdom": "13.1.0",
|
|
||||||
"json5": "2.1.0",
|
"json5": "2.1.0",
|
||||||
"json5-loader": "1.0.1",
|
"json5-loader": "2.0.0",
|
||||||
"katex": "0.10.0",
|
"katex": "0.10.1",
|
||||||
"koa": "2.6.2",
|
"koa": "2.7.0",
|
||||||
"koa-bodyparser": "4.2.1",
|
"koa-bodyparser": "4.2.1",
|
||||||
"koa-compress": "3.0.0",
|
"koa-compress": "3.0.0",
|
||||||
"koa-favicon": "2.0.1",
|
"koa-favicon": "2.0.1",
|
||||||
@@ -159,50 +155,52 @@
|
|||||||
"koa-router": "7.4.0",
|
"koa-router": "7.4.0",
|
||||||
"koa-send": "5.0.0",
|
"koa-send": "5.0.0",
|
||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "6.1.5",
|
"koa-views": "6.2.0",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"loader-utils": "1.2.3",
|
"loader-utils": "1.2.3",
|
||||||
|
"lolex": "3.1.0",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"minio": "7.0.3",
|
"minio": "7.0.6",
|
||||||
"mkdirp": "0.5.1",
|
"mocha": "6.1.3",
|
||||||
"mocha": "5.2.0",
|
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"moment": "2.23.0",
|
"moment": "2.24.0",
|
||||||
"mongodb": "3.1.10",
|
|
||||||
"monk": "6.0.6",
|
|
||||||
"ms": "2.1.1",
|
"ms": "2.1.1",
|
||||||
"nan": "2.12.1",
|
|
||||||
"nested-property": "0.0.7",
|
"nested-property": "0.0.7",
|
||||||
"nodemailer": "5.1.1",
|
"node-fetch": "2.3.0",
|
||||||
|
"nodemailer": "6.1.1",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"on-build-webpack": "0.1.0",
|
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"parse5": "5.1.0",
|
"parse5": "5.1.0",
|
||||||
"parsimmon": "1.12.0",
|
"parsimmon": "1.12.0",
|
||||||
|
"pg": "7.10.0",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "3.0.0",
|
||||||
"prismjs": "1.15.0",
|
"prismjs": "1.16.0",
|
||||||
"progress-bar-webpack-plugin": "1.12.0",
|
"progress-bar-webpack-plugin": "1.12.1",
|
||||||
"promise-any": "0.2.0",
|
"promise-any": "0.2.0",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
"pug": "2.0.3",
|
"pug": "2.0.3",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
|
"pureimage": "0.1.6",
|
||||||
"qrcode": "1.3.3",
|
"qrcode": "1.3.3",
|
||||||
"randomcolor": "0.5.3",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.2.0",
|
"randomcolor": "0.5.4",
|
||||||
|
"ratelimiter": "3.3.0",
|
||||||
"recaptcha-promise": "0.1.3",
|
"recaptcha-promise": "0.1.3",
|
||||||
"reconnecting-websocket": "4.1.10",
|
"reconnecting-websocket": "4.1.10",
|
||||||
"redis": "2.8.0",
|
"redis": "2.8.0",
|
||||||
|
"reflect-metadata": "0.1.13",
|
||||||
|
"rename": "1.0.4",
|
||||||
"request": "2.88.0",
|
"request": "2.88.0",
|
||||||
"request-promise-native": "1.0.5",
|
"request-promise-native": "1.0.7",
|
||||||
"request-stats": "3.0.0",
|
"request-stats": "3.0.0",
|
||||||
|
"require-all": "3.0.0",
|
||||||
"rimraf": "2.6.3",
|
"rimraf": "2.6.3",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"seedrandom": "2.4.4",
|
"sharp": "0.22.0",
|
||||||
"sharp": "0.21.3",
|
|
||||||
"showdown": "1.9.0",
|
"showdown": "1.9.0",
|
||||||
"showdown-highlightjs-extension": "0.1.2",
|
"showdown-highlightjs-extension": "0.1.2",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
@@ -211,47 +209,50 @@
|
|||||||
"stylus": "0.54.5",
|
"stylus": "0.54.5",
|
||||||
"stylus-loader": "3.0.2",
|
"stylus-loader": "3.0.2",
|
||||||
"summaly": "2.2.0",
|
"summaly": "2.2.0",
|
||||||
"systeminformation": "3.54.0",
|
"systeminformation": "4.1.5",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"terser-webpack-plugin": "1.2.1",
|
"terser-webpack-plugin": "1.2.3",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"tinycolor2": "1.4.1",
|
"tinycolor2": "1.4.1",
|
||||||
"tmp": "0.0.33",
|
"tmp": "0.1.0",
|
||||||
"ts-loader": "5.3.3",
|
"ts-loader": "5.3.3",
|
||||||
"ts-node": "7.0.1",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.12.0",
|
"tslint": "5.15.0",
|
||||||
"tslint-sonarts": "1.8.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"typescript": "3.2.4",
|
"typeorm": "0.2.16-rc.1",
|
||||||
"typescript-eslint-parser": "21.0.2",
|
"typescript": "3.3.3333",
|
||||||
|
"typescript-eslint-parser": "22.0.0",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
|
"ulid": "2.3.0",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "1.1.2",
|
||||||
"uuid": "3.3.2",
|
"uuid": "3.3.2",
|
||||||
"v-animate-css": "0.0.3",
|
"v-animate-css": "0.0.3",
|
||||||
|
"v-debounce": "0.1.2",
|
||||||
"video-thumbnail-generator": "1.1.3",
|
"video-thumbnail-generator": "1.1.3",
|
||||||
"vue": "2.5.17",
|
"vue": "2.6.10",
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.0",
|
||||||
"vue-content-loading": "1.5.3",
|
"vue-content-loading": "1.6.0",
|
||||||
"vue-cropperjs": "3.0.0",
|
"vue-cropperjs": "3.0.0",
|
||||||
"vue-i18n": "8.8.0",
|
"vue-i18n": "8.10.0",
|
||||||
"vue-js-modal": "1.3.28",
|
"vue-js-modal": "1.3.28",
|
||||||
"vue-loader": "15.5.1",
|
"vue-json-pretty": "1.6.0",
|
||||||
|
"vue-loader": "15.7.0",
|
||||||
"vue-marquee-text-component": "1.1.1",
|
"vue-marquee-text-component": "1.1.1",
|
||||||
"vue-prism-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-sequential-entrance": "1.1.3",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-svg-inline-loader": "1.2.10",
|
"vue-svg-inline-loader": "1.2.15",
|
||||||
"vue-template-compiler": "2.5.17",
|
"vue-template-compiler": "2.6.10",
|
||||||
"vuedraggable": "2.17.0",
|
"vuedraggable": "2.20.0",
|
||||||
"vuewordcloud": "18.7.11",
|
"vuewordcloud": "18.7.11",
|
||||||
"vuex": "3.0.1",
|
"vuex": "3.1.0",
|
||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.3",
|
"web-push": "3.3.3",
|
||||||
"webfinger.js": "2.7.0",
|
"webpack": "4.30.0",
|
||||||
"webpack": "4.28.4",
|
"webpack-cli": "3.3.0",
|
||||||
"webpack-cli": "3.2.1",
|
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.28",
|
||||||
"ws": "6.1.3",
|
"ws": "6.2.1",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
src/@types/const.json.d.ts
vendored
Normal file
3
src/@types/const.json.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
declare module '*/const.json' {
|
||||||
|
const copyright: string;
|
||||||
|
}
|
||||||
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;
|
|
||||||
}
|
|
||||||
14
src/@types/koa-slow.d.ts
vendored
Normal file
14
src/@types/koa-slow.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
declare module 'koa-slow' {
|
||||||
|
import { Middleware } from 'koa';
|
||||||
|
|
||||||
|
interface ISlowOptions {
|
||||||
|
url?: RegExp;
|
||||||
|
delay?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
function slow(options?: ISlowOptions): Middleware;
|
||||||
|
|
||||||
|
namespace slow {} // Hack
|
||||||
|
|
||||||
|
export = slow;
|
||||||
|
}
|
||||||
10
src/@types/langmap.d.ts
vendored
Normal file
10
src/@types/langmap.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
declare module 'langmap' {
|
||||||
|
type Lang = {
|
||||||
|
nativeName: string;
|
||||||
|
englishName: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const langmap: { [lang: string]: Lang };
|
||||||
|
|
||||||
|
export = langmap;
|
||||||
|
}
|
||||||
10
src/@types/nested-property.d.ts
vendored
10
src/@types/nested-property.d.ts
vendored
@@ -1,3 +1,5 @@
|
|||||||
|
type Obj = { [key: string]: any };
|
||||||
|
|
||||||
declare module 'nested-property' {
|
declare module 'nested-property' {
|
||||||
interface IHasNestedPropertyOptions {
|
interface IHasNestedPropertyOptions {
|
||||||
own?: boolean;
|
own?: boolean;
|
||||||
@@ -9,11 +11,11 @@ declare module 'nested-property' {
|
|||||||
|
|
||||||
export function set<T>(object: T, property: string, value: any): T;
|
export function set<T>(object: T, property: string, value: any): T;
|
||||||
|
|
||||||
export function get(object: object, property: string): any;
|
export function get(object: Obj, property: string): any;
|
||||||
|
|
||||||
export function has(object: object, property: string, options?: IHasNestedPropertyOptions): boolean;
|
export function has(object: Obj, property: string, options?: IHasNestedPropertyOptions): boolean;
|
||||||
|
|
||||||
export function hasOwn(object: object, property: string, options?: IHasNestedPropertyOptions): boolean;
|
export function hasOwn(object: Obj, property: string, options?: IHasNestedPropertyOptions): boolean;
|
||||||
|
|
||||||
export function isIn(object: object, property: string, objectInPath: object, options?: IIsInNestedPropertyOptions): boolean;
|
export function isIn(object: Obj, property: string, objectInPath: Obj, options?: IIsInNestedPropertyOptions): boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
30
src/@types/os-utils.d.ts
vendored
Normal file
30
src/@types/os-utils.d.ts
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
declare module 'os-utils' {
|
||||||
|
type FreeCommandCallback = (usedmem: number) => void;
|
||||||
|
|
||||||
|
type HarddriveCallback = (total: number, free: number, used: number) => void;
|
||||||
|
|
||||||
|
type GetProcessesCallback = (result: string) => void;
|
||||||
|
|
||||||
|
type CPUCallback = (perc: number) => void;
|
||||||
|
|
||||||
|
export function platform(): NodeJS.Platform;
|
||||||
|
export function cpuCount(): number;
|
||||||
|
export function sysUptime(): number;
|
||||||
|
export function processUptime(): number;
|
||||||
|
|
||||||
|
export function freemem(): number;
|
||||||
|
export function totalmem(): number;
|
||||||
|
export function freememPercentage(): number;
|
||||||
|
export function freeCommand(callback: FreeCommandCallback): void;
|
||||||
|
|
||||||
|
export function harddrive(callback: HarddriveCallback): void;
|
||||||
|
|
||||||
|
export function getProcesses(callback: GetProcessesCallback): void;
|
||||||
|
export function getProcesses(nProcess: number, callback: GetProcessesCallback): void;
|
||||||
|
|
||||||
|
export function allLoadavg(): string;
|
||||||
|
export function loadavg(_time?: number): number;
|
||||||
|
|
||||||
|
export function cpuFree(callback: CPUCallback): void;
|
||||||
|
export function cpuUsage(callback: CPUCallback): void;
|
||||||
|
}
|
||||||
9
src/@types/package.json.d.ts
vendored
9
src/@types/package.json.d.ts
vendored
@@ -1,3 +1,10 @@
|
|||||||
declare module '*/package.json' {
|
declare module '*/package.json' {
|
||||||
const version: string;
|
interface IRepository {
|
||||||
|
type: string;
|
||||||
|
url: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const name: string;
|
||||||
|
export const version: string;
|
||||||
|
export const repository: IRepository;
|
||||||
}
|
}
|
||||||
|
|||||||
16
src/@types/recaptcha-promise.d.ts
vendored
Normal file
16
src/@types/recaptcha-promise.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
declare module 'recaptcha-promise' {
|
||||||
|
interface IVerifyOptions {
|
||||||
|
secret_key?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IVerify {
|
||||||
|
(response: string, remoteAddress?: string): Promise<boolean>;
|
||||||
|
init(options: IVerifyOptions): IVerify;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace recaptchaPromise {} // Hack
|
||||||
|
|
||||||
|
const verify: IVerify;
|
||||||
|
|
||||||
|
export = verify;
|
||||||
|
}
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
22
src/argv.ts
Normal file
22
src/argv.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import * as program from 'commander';
|
||||||
|
import * as pkg from '../package.json';
|
||||||
|
|
||||||
|
program
|
||||||
|
.version(pkg.version)
|
||||||
|
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
|
||||||
|
.option('--disable-clustering', 'Disable clustering')
|
||||||
|
.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')
|
||||||
|
.option('--with-log-time', 'Include timestamp for each logs')
|
||||||
|
.option('--slow', 'Delay all requests (for debbuging)')
|
||||||
|
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
|
||||||
|
.parse(process.argv);
|
||||||
|
|
||||||
|
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) {
|
||||||
|
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,48 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from '.';
|
|
||||||
import { IUser, isLocalUser } from '../models/user';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* アクティブユーザーに関するチャート
|
|
||||||
*/
|
|
||||||
type ActiveUsersLog = {
|
|
||||||
local: {
|
|
||||||
/**
|
|
||||||
* アクティブユーザー数
|
|
||||||
*/
|
|
||||||
count: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
remote: ActiveUsersLog['local'];
|
|
||||||
};
|
|
||||||
|
|
||||||
class ActiveUsersChart extends Chart<ActiveUsersLog> {
|
|
||||||
constructor() {
|
|
||||||
super('activeUsers');
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: ActiveUsersLog): Promise<ActiveUsersLog> {
|
|
||||||
return {
|
|
||||||
local: {
|
|
||||||
count: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
count: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(user: IUser) {
|
|
||||||
const update: Obj = {
|
|
||||||
count: 1
|
|
||||||
};
|
|
||||||
|
|
||||||
await this.incIfUnique({
|
|
||||||
[isLocalUser(user) ? 'local' : 'remote']: update
|
|
||||||
}, 'users', user._id.toHexString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new ActiveUsersChart();
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from './';
|
|
||||||
import DriveFile, { IDriveFile } from '../models/drive-file';
|
|
||||||
import { isLocalUser } from '../models/user';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ドライブに関するチャート
|
|
||||||
*/
|
|
||||||
type DriveLog = {
|
|
||||||
local: {
|
|
||||||
/**
|
|
||||||
* 集計期間時点での、全ドライブファイル数
|
|
||||||
*/
|
|
||||||
totalCount: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 集計期間時点での、全ドライブファイルの合計サイズ
|
|
||||||
*/
|
|
||||||
totalSize: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加したドライブファイル数
|
|
||||||
*/
|
|
||||||
incCount: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加したドライブ使用量
|
|
||||||
*/
|
|
||||||
incSize: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少したドライブファイル数
|
|
||||||
*/
|
|
||||||
decCount: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少したドライブ使用量
|
|
||||||
*/
|
|
||||||
decSize: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
remote: DriveLog['local'];
|
|
||||||
};
|
|
||||||
|
|
||||||
class DriveChart extends Chart<DriveLog> {
|
|
||||||
constructor() {
|
|
||||||
super('drive');
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: DriveLog): Promise<DriveLog> {
|
|
||||||
const calcSize = (local: boolean) => DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': local ? null : { $ne: null },
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(res => res.length > 0 ? res[0].usage : 0);
|
|
||||||
|
|
||||||
const [localCount, remoteCount, localSize, remoteSize] = init ? await Promise.all([
|
|
||||||
DriveFile.count({ 'metadata._user.host': null }),
|
|
||||||
DriveFile.count({ 'metadata._user.host': { $ne: null } }),
|
|
||||||
calcSize(true),
|
|
||||||
calcSize(false)
|
|
||||||
]) : [
|
|
||||||
latest ? latest.local.totalCount : 0,
|
|
||||||
latest ? latest.remote.totalCount : 0,
|
|
||||||
latest ? latest.local.totalSize : 0,
|
|
||||||
latest ? latest.remote.totalSize : 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
|
||||||
local: {
|
|
||||||
totalCount: localCount,
|
|
||||||
totalSize: localSize,
|
|
||||||
incCount: 0,
|
|
||||||
incSize: 0,
|
|
||||||
decCount: 0,
|
|
||||||
decSize: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
totalCount: remoteCount,
|
|
||||||
totalSize: remoteSize,
|
|
||||||
incCount: 0,
|
|
||||||
incSize: 0,
|
|
||||||
decCount: 0,
|
|
||||||
decSize: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(file: IDriveFile, isAdditional: boolean) {
|
|
||||||
const update: Obj = {};
|
|
||||||
|
|
||||||
update.totalCount = isAdditional ? 1 : -1;
|
|
||||||
update.totalSize = isAdditional ? file.length : -file.length;
|
|
||||||
if (isAdditional) {
|
|
||||||
update.incCount = 1;
|
|
||||||
update.incSize = file.length;
|
|
||||||
} else {
|
|
||||||
update.decCount = 1;
|
|
||||||
update.decSize = file.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.inc({
|
|
||||||
[isLocalUser(file.metadata._user) ? 'local' : 'remote']: update
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new DriveChart();
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from '.';
|
|
||||||
import Instance from '../models/instance';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* フェデレーションに関するチャート
|
|
||||||
*/
|
|
||||||
type FederationLog = {
|
|
||||||
instance: {
|
|
||||||
/**
|
|
||||||
* インスタンス数の合計
|
|
||||||
*/
|
|
||||||
total: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加インスタンス数
|
|
||||||
*/
|
|
||||||
inc: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少インスタンス数
|
|
||||||
*/
|
|
||||||
dec: number;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
class FederationChart extends Chart<FederationLog> {
|
|
||||||
constructor() {
|
|
||||||
super('federation');
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: FederationLog): Promise<FederationLog> {
|
|
||||||
const [total] = init ? await Promise.all([
|
|
||||||
Instance.count({})
|
|
||||||
]) : [
|
|
||||||
latest ? latest.instance.total : 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
|
||||||
instance: {
|
|
||||||
total: total,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(isAdditional: boolean) {
|
|
||||||
const update: Obj = {};
|
|
||||||
|
|
||||||
update.total = isAdditional ? 1 : -1;
|
|
||||||
if (isAdditional) {
|
|
||||||
update.inc = 1;
|
|
||||||
} else {
|
|
||||||
update.dec = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.inc({
|
|
||||||
instance: update
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new FederationChart();
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from './';
|
|
||||||
import { IUser, isLocalUser } from '../models/user';
|
|
||||||
import db from '../db/mongodb';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ハッシュタグに関するチャート
|
|
||||||
*/
|
|
||||||
type HashtagLog = {
|
|
||||||
local: {
|
|
||||||
/**
|
|
||||||
* 投稿された数
|
|
||||||
*/
|
|
||||||
count: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
remote: HashtagLog['local'];
|
|
||||||
};
|
|
||||||
|
|
||||||
class HashtagChart extends Chart<HashtagLog> {
|
|
||||||
constructor() {
|
|
||||||
super('hashtag', true);
|
|
||||||
|
|
||||||
// 後方互換性のため
|
|
||||||
db.get('chart.hashtag').findOne().then(doc => {
|
|
||||||
if (doc != null && doc.data.local == null) {
|
|
||||||
db.get('chart.hashtag').drop();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: HashtagLog): Promise<HashtagLog> {
|
|
||||||
return {
|
|
||||||
local: {
|
|
||||||
count: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
count: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(hashtag: string, user: IUser) {
|
|
||||||
const update: Obj = {
|
|
||||||
count: 1
|
|
||||||
};
|
|
||||||
|
|
||||||
await this.incIfUnique({
|
|
||||||
[isLocalUser(user) ? 'local' : 'remote']: update
|
|
||||||
}, 'users', user._id.toHexString(), hashtag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new HashtagChart();
|
|
||||||
@@ -1,348 +0,0 @@
|
|||||||
/**
|
|
||||||
* チャートエンジン
|
|
||||||
*/
|
|
||||||
|
|
||||||
import * as moment from 'moment';
|
|
||||||
import * as nestedProperty from 'nested-property';
|
|
||||||
import autobind from 'autobind-decorator';
|
|
||||||
import * as mongo from 'mongodb';
|
|
||||||
import db from '../db/mongodb';
|
|
||||||
import { ICollection } from 'monk';
|
|
||||||
import Logger from '../misc/logger';
|
|
||||||
|
|
||||||
const logger = new Logger('chart');
|
|
||||||
|
|
||||||
const utc = moment.utc;
|
|
||||||
|
|
||||||
export type Obj = { [key: string]: any };
|
|
||||||
|
|
||||||
export type Partial<T> = {
|
|
||||||
[P in keyof T]?: Partial<T[P]>;
|
|
||||||
};
|
|
||||||
|
|
||||||
type ArrayValue<T> = {
|
|
||||||
[P in keyof T]: T[P] extends number ? Array<T[P]> : ArrayValue<T[P]>;
|
|
||||||
};
|
|
||||||
|
|
||||||
type Span = 'day' | 'hour';
|
|
||||||
|
|
||||||
type Log<T extends Obj> = {
|
|
||||||
_id: mongo.ObjectID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 集計のグループ
|
|
||||||
*/
|
|
||||||
group?: any;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 集計日時
|
|
||||||
*/
|
|
||||||
date: Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 集計期間
|
|
||||||
*/
|
|
||||||
span: Span;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* データ
|
|
||||||
*/
|
|
||||||
data: T;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ユニークインクリメント用
|
|
||||||
*/
|
|
||||||
unique?: Obj;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 様々なチャートの管理を司るクラス
|
|
||||||
*/
|
|
||||||
export default abstract class Chart<T> {
|
|
||||||
protected collection: ICollection<Log<T>>;
|
|
||||||
protected abstract async getTemplate(init: boolean, latest?: T, group?: any): Promise<T>;
|
|
||||||
private name: string;
|
|
||||||
|
|
||||||
constructor(name: string, grouped = false) {
|
|
||||||
this.name = name;
|
|
||||||
this.collection = db.get<Log<T>>(`chart.${name}`);
|
|
||||||
|
|
||||||
const keys = {
|
|
||||||
span: -1,
|
|
||||||
date: -1
|
|
||||||
} as { [key: string]: 1 | -1; };
|
|
||||||
if (grouped) keys.group = -1;
|
|
||||||
|
|
||||||
this.collection.createIndex(keys, { unique: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
private convertQuery(x: Obj, path: string): Obj {
|
|
||||||
const query: Obj = {};
|
|
||||||
|
|
||||||
const dive = (x: Obj, path: string) => {
|
|
||||||
for (const [k, v] of Object.entries(x)) {
|
|
||||||
const p = path ? `${path}.${k}` : k;
|
|
||||||
if (typeof v === 'number') {
|
|
||||||
query[p] = v;
|
|
||||||
} else {
|
|
||||||
dive(v, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
dive(x, path);
|
|
||||||
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
private getCurrentDate(): [number, number, number, number] {
|
|
||||||
const now = moment().utc();
|
|
||||||
|
|
||||||
const y = now.year();
|
|
||||||
const m = now.month();
|
|
||||||
const d = now.date();
|
|
||||||
const h = now.hour();
|
|
||||||
|
|
||||||
return [y, m, d, h];
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
private getLatestLog(span: Span, group?: any): Promise<Log<T>> {
|
|
||||||
return this.collection.findOne({
|
|
||||||
group: group,
|
|
||||||
span: span
|
|
||||||
}, {
|
|
||||||
sort: {
|
|
||||||
date: -1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
private async getCurrentLog(span: Span, group?: any): Promise<Log<T>> {
|
|
||||||
const [y, m, d, h] = this.getCurrentDate();
|
|
||||||
|
|
||||||
const current =
|
|
||||||
span == 'day' ? utc([y, m, d]) :
|
|
||||||
span == 'hour' ? utc([y, m, d, h]) :
|
|
||||||
null;
|
|
||||||
|
|
||||||
// 現在(今日または今のHour)のログ
|
|
||||||
const currentLog = await this.collection.findOne({
|
|
||||||
group: group,
|
|
||||||
span: span,
|
|
||||||
date: current.toDate()
|
|
||||||
});
|
|
||||||
|
|
||||||
// ログがあればそれを返して終了
|
|
||||||
if (currentLog != null) {
|
|
||||||
return currentLog;
|
|
||||||
}
|
|
||||||
|
|
||||||
let log: Log<T>;
|
|
||||||
let data: T;
|
|
||||||
|
|
||||||
// 集計期間が変わってから、初めてのチャート更新なら
|
|
||||||
// 最も最近のログを持ってくる
|
|
||||||
// * 例えば集計期間が「日」である場合で考えると、
|
|
||||||
// * 昨日何もチャートを更新するような出来事がなかった場合は、
|
|
||||||
// * ログがそもそも作られずドキュメントが存在しないということがあり得るため、
|
|
||||||
// * 「昨日の」と決め打ちせずに「もっとも最近の」とします
|
|
||||||
const latest = await this.getLatestLog(span, group);
|
|
||||||
|
|
||||||
if (latest != null) {
|
|
||||||
// 空ログデータを作成
|
|
||||||
data = await this.getTemplate(false, latest.data);
|
|
||||||
} else {
|
|
||||||
// ログが存在しなかったら
|
|
||||||
// (Misskeyインスタンスを建てて初めてのチャート更新時など
|
|
||||||
// または何らかの理由でチャートコレクションを抹消した場合)
|
|
||||||
|
|
||||||
// 初期ログデータを作成
|
|
||||||
data = await this.getTemplate(true, null, group);
|
|
||||||
|
|
||||||
logger.info(`${this.name}: Initial commit created`);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 新規ログ挿入
|
|
||||||
log = await this.collection.insert({
|
|
||||||
group: group,
|
|
||||||
span: span,
|
|
||||||
date: current.toDate(),
|
|
||||||
data: data
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
// 11000 is duplicate key error
|
|
||||||
// 並列動作している他のチャートエンジンプロセスと処理が重なる場合がある
|
|
||||||
// その場合は再度最も新しいログを持ってくる
|
|
||||||
if (e.code === 11000) {
|
|
||||||
log = await this.getLatestLog(span, group);
|
|
||||||
} else {
|
|
||||||
logger.error(e);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return log;
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected commit(query: Obj, group?: any, uniqueKey?: string, uniqueValue?: string): void {
|
|
||||||
const update = (log: Log<T>) => {
|
|
||||||
// ユニークインクリメントの場合、指定のキーに指定の値が既に存在していたら弾く
|
|
||||||
if (
|
|
||||||
uniqueKey &&
|
|
||||||
log.unique &&
|
|
||||||
log.unique[uniqueKey] &&
|
|
||||||
log.unique[uniqueKey].includes(uniqueValue)
|
|
||||||
) return;
|
|
||||||
|
|
||||||
// ユニークインクリメントの指定のキーに値を追加
|
|
||||||
if (uniqueKey) {
|
|
||||||
query['$push'] = {
|
|
||||||
[`unique.${uniqueKey}`]: uniqueValue
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// ログ更新
|
|
||||||
this.collection.update({
|
|
||||||
_id: log._id
|
|
||||||
}, query);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.getCurrentLog('day', group).then(log => update(log));
|
|
||||||
this.getCurrentLog('hour', group).then(log => update(log));
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected inc(inc: Partial<T>, group?: any): void {
|
|
||||||
this.commit({
|
|
||||||
$inc: this.convertQuery(inc, 'data')
|
|
||||||
}, group);
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected incIfUnique(inc: Partial<T>, key: string, value: string, group?: any): void {
|
|
||||||
this.commit({
|
|
||||||
$inc: this.convertQuery(inc, 'data')
|
|
||||||
}, group, key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async getChart(span: Span, range: number, group?: any): Promise<ArrayValue<T>> {
|
|
||||||
const promisedChart: Promise<T>[] = [];
|
|
||||||
|
|
||||||
const [y, m, d, h] = this.getCurrentDate();
|
|
||||||
|
|
||||||
const gt =
|
|
||||||
span == 'day' ? utc([y, m, d]).subtract(range, 'days') :
|
|
||||||
span == 'hour' ? utc([y, m, d, h]).subtract(range, 'hours') :
|
|
||||||
null;
|
|
||||||
|
|
||||||
// ログ取得
|
|
||||||
let logs = await this.collection.find({
|
|
||||||
group: group,
|
|
||||||
span: span,
|
|
||||||
date: {
|
|
||||||
$gte: gt.toDate()
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
sort: {
|
|
||||||
date: -1
|
|
||||||
},
|
|
||||||
fields: {
|
|
||||||
_id: 0
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 要求された範囲にログがひとつもなかったら
|
|
||||||
if (logs.length == 0) {
|
|
||||||
// もっとも新しいログを持ってくる
|
|
||||||
// (すくなくともひとつログが無いと隙間埋めできないため)
|
|
||||||
const recentLog = await this.collection.findOne({
|
|
||||||
group: group,
|
|
||||||
span: span
|
|
||||||
}, {
|
|
||||||
sort: {
|
|
||||||
date: -1
|
|
||||||
},
|
|
||||||
fields: {
|
|
||||||
_id: 0
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (recentLog) {
|
|
||||||
logs = [recentLog];
|
|
||||||
}
|
|
||||||
|
|
||||||
// 要求された範囲の最も古い箇所に位置するログが存在しなかったら
|
|
||||||
} else if (!utc(logs[logs.length - 1].date).isSame(gt)) {
|
|
||||||
// 要求された範囲の最も古い箇所時点での最も新しいログを持ってきて末尾に追加する
|
|
||||||
// (隙間埋めできないため)
|
|
||||||
const outdatedLog = await this.collection.findOne({
|
|
||||||
group: group,
|
|
||||||
span: span,
|
|
||||||
date: {
|
|
||||||
$lt: gt.toDate()
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
sort: {
|
|
||||||
date: -1
|
|
||||||
},
|
|
||||||
fields: {
|
|
||||||
_id: 0
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (outdatedLog) {
|
|
||||||
logs.push(outdatedLog);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 整形
|
|
||||||
for (let i = (range - 1); i >= 0; i--) {
|
|
||||||
const current =
|
|
||||||
span == 'day' ? utc([y, m, d]).subtract(i, 'days') :
|
|
||||||
span == 'hour' ? utc([y, m, d, h]).subtract(i, 'hours') :
|
|
||||||
null;
|
|
||||||
|
|
||||||
const log = logs.find(l => utc(l.date).isSame(current));
|
|
||||||
|
|
||||||
if (log) {
|
|
||||||
promisedChart.unshift(Promise.resolve(log.data));
|
|
||||||
} else {
|
|
||||||
// 隙間埋め
|
|
||||||
const latest = logs.find(l => utc(l.date).isBefore(current));
|
|
||||||
promisedChart.unshift(this.getTemplate(false, latest ? latest.data : null));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const chart = await Promise.all(promisedChart);
|
|
||||||
|
|
||||||
const res: ArrayValue<T> = {} as any;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* [{ foo: 1, bar: 5 }, { foo: 2, bar: 6 }, { foo: 3, bar: 7 }]
|
|
||||||
* を
|
|
||||||
* { foo: [1, 2, 3], bar: [5, 6, 7] }
|
|
||||||
* にする
|
|
||||||
*/
|
|
||||||
const dive = (x: Obj, path?: string) => {
|
|
||||||
for (const [k, v] of Object.entries(x)) {
|
|
||||||
const p = path ? `${path}.${k}` : k;
|
|
||||||
if (typeof v == 'object') {
|
|
||||||
dive(v, p);
|
|
||||||
} else {
|
|
||||||
nestedProperty.set(res, p, chart.map(s => nestedProperty.get(s, p)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
dive(chart[0]);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Partial } from './';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ネットワークに関するチャート
|
|
||||||
*/
|
|
||||||
type NetworkLog = {
|
|
||||||
/**
|
|
||||||
* 受信したリクエスト数
|
|
||||||
*/
|
|
||||||
incomingRequests: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 送信したリクエスト数
|
|
||||||
*/
|
|
||||||
outgoingRequests: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 応答時間の合計
|
|
||||||
* TIP: (totalTime / incomingRequests) でひとつのリクエストに平均でどれくらいの時間がかかったか知れる
|
|
||||||
*/
|
|
||||||
totalTime: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 合計受信データ量
|
|
||||||
*/
|
|
||||||
incomingBytes: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 合計送信データ量
|
|
||||||
*/
|
|
||||||
outgoingBytes: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
class NetworkChart extends Chart<NetworkLog> {
|
|
||||||
constructor() {
|
|
||||||
super('network');
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: NetworkLog): Promise<NetworkLog> {
|
|
||||||
return {
|
|
||||||
incomingRequests: 0,
|
|
||||||
outgoingRequests: 0,
|
|
||||||
totalTime: 0,
|
|
||||||
incomingBytes: 0,
|
|
||||||
outgoingBytes: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(incomingRequests: number, time: number, incomingBytes: number, outgoingBytes: number) {
|
|
||||||
const inc: Partial<NetworkLog> = {
|
|
||||||
incomingRequests: incomingRequests,
|
|
||||||
totalTime: time,
|
|
||||||
incomingBytes: incomingBytes,
|
|
||||||
outgoingBytes: outgoingBytes
|
|
||||||
};
|
|
||||||
|
|
||||||
await this.inc(inc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new NetworkChart();
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from '.';
|
|
||||||
import Note, { INote } from '../models/note';
|
|
||||||
import { isLocalUser } from '../models/user';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 投稿に関するチャート
|
|
||||||
*/
|
|
||||||
type NotesLog = {
|
|
||||||
local: {
|
|
||||||
/**
|
|
||||||
* 集計期間時点での、全投稿数
|
|
||||||
*/
|
|
||||||
total: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加した投稿数
|
|
||||||
*/
|
|
||||||
inc: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少した投稿数
|
|
||||||
*/
|
|
||||||
dec: number;
|
|
||||||
|
|
||||||
diffs: {
|
|
||||||
/**
|
|
||||||
* 通常の投稿数の差分
|
|
||||||
*/
|
|
||||||
normal: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* リプライの投稿数の差分
|
|
||||||
*/
|
|
||||||
reply: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renoteの投稿数の差分
|
|
||||||
*/
|
|
||||||
renote: number;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
remote: NotesLog['local'];
|
|
||||||
};
|
|
||||||
|
|
||||||
class NotesChart extends Chart<NotesLog> {
|
|
||||||
constructor() {
|
|
||||||
super('notes');
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: NotesLog): Promise<NotesLog> {
|
|
||||||
const [localCount, remoteCount] = init ? await Promise.all([
|
|
||||||
Note.count({ '_user.host': null }),
|
|
||||||
Note.count({ '_user.host': { $ne: null } })
|
|
||||||
]) : [
|
|
||||||
latest ? latest.local.total : 0,
|
|
||||||
latest ? latest.remote.total : 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
|
||||||
local: {
|
|
||||||
total: localCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(note: INote, isAdditional: boolean) {
|
|
||||||
const update: Obj = {
|
|
||||||
diffs: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
update.total = isAdditional ? 1 : -1;
|
|
||||||
|
|
||||||
if (isAdditional) {
|
|
||||||
update.inc = 1;
|
|
||||||
} else {
|
|
||||||
update.dec = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (note.replyId != null) {
|
|
||||||
update.diffs.reply = isAdditional ? 1 : -1;
|
|
||||||
} else if (note.renoteId != null) {
|
|
||||||
update.diffs.renote = isAdditional ? 1 : -1;
|
|
||||||
} else {
|
|
||||||
update.diffs.normal = isAdditional ? 1 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.inc({
|
|
||||||
[isLocalUser(note._user) ? 'local' : 'remote']: update
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new NotesChart();
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from './';
|
|
||||||
import DriveFile, { IDriveFile } from '../models/drive-file';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ユーザーごとのドライブに関するチャート
|
|
||||||
*/
|
|
||||||
type PerUserDriveLog = {
|
|
||||||
/**
|
|
||||||
* 集計期間時点での、全ドライブファイル数
|
|
||||||
*/
|
|
||||||
totalCount: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 集計期間時点での、全ドライブファイルの合計サイズ
|
|
||||||
*/
|
|
||||||
totalSize: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加したドライブファイル数
|
|
||||||
*/
|
|
||||||
incCount: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加したドライブ使用量
|
|
||||||
*/
|
|
||||||
incSize: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少したドライブファイル数
|
|
||||||
*/
|
|
||||||
decCount: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少したドライブ使用量
|
|
||||||
*/
|
|
||||||
decSize: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PerUserDriveChart extends Chart<PerUserDriveLog> {
|
|
||||||
constructor() {
|
|
||||||
super('perUserDrive', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: PerUserDriveLog, group?: any): Promise<PerUserDriveLog> {
|
|
||||||
const calcSize = () => DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata.userId': group,
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(res => res.length > 0 ? res[0].usage : 0);
|
|
||||||
|
|
||||||
const [count, size] = init ? await Promise.all([
|
|
||||||
DriveFile.count({ 'metadata.userId': group }),
|
|
||||||
calcSize()
|
|
||||||
]) : [
|
|
||||||
latest ? latest.totalCount : 0,
|
|
||||||
latest ? latest.totalSize : 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
|
||||||
totalCount: count,
|
|
||||||
totalSize: size,
|
|
||||||
incCount: 0,
|
|
||||||
incSize: 0,
|
|
||||||
decCount: 0,
|
|
||||||
decSize: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(file: IDriveFile, isAdditional: boolean) {
|
|
||||||
const update: Obj = {};
|
|
||||||
|
|
||||||
update.totalCount = isAdditional ? 1 : -1;
|
|
||||||
update.totalSize = isAdditional ? file.length : -file.length;
|
|
||||||
if (isAdditional) {
|
|
||||||
update.incCount = 1;
|
|
||||||
update.incSize = file.length;
|
|
||||||
} else {
|
|
||||||
update.decCount = 1;
|
|
||||||
update.decSize = file.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.inc(update, file.metadata.userId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new PerUserDriveChart();
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from './';
|
|
||||||
import Following from '../models/following';
|
|
||||||
import { IUser, isLocalUser } from '../models/user';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ユーザーごとのフォローに関するチャート
|
|
||||||
*/
|
|
||||||
type PerUserFollowingLog = {
|
|
||||||
local: {
|
|
||||||
/**
|
|
||||||
* フォローしている
|
|
||||||
*/
|
|
||||||
followings: {
|
|
||||||
/**
|
|
||||||
* 合計
|
|
||||||
*/
|
|
||||||
total: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* フォローした数
|
|
||||||
*/
|
|
||||||
inc: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* フォロー解除した数
|
|
||||||
*/
|
|
||||||
dec: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* フォローされている
|
|
||||||
*/
|
|
||||||
followers: {
|
|
||||||
/**
|
|
||||||
* 合計
|
|
||||||
*/
|
|
||||||
total: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* フォローされた数
|
|
||||||
*/
|
|
||||||
inc: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* フォロー解除された数
|
|
||||||
*/
|
|
||||||
dec: number;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
remote: PerUserFollowingLog['local'];
|
|
||||||
};
|
|
||||||
|
|
||||||
class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
|
|
||||||
constructor() {
|
|
||||||
super('perUserFollowing', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: PerUserFollowingLog, group?: any): Promise<PerUserFollowingLog> {
|
|
||||||
const [
|
|
||||||
localFollowingsCount,
|
|
||||||
localFollowersCount,
|
|
||||||
remoteFollowingsCount,
|
|
||||||
remoteFollowersCount
|
|
||||||
] = init ? await Promise.all([
|
|
||||||
Following.count({ followerId: group, '_followee.host': null }),
|
|
||||||
Following.count({ followeeId: group, '_follower.host': null }),
|
|
||||||
Following.count({ followerId: group, '_followee.host': { $ne: null } }),
|
|
||||||
Following.count({ followeeId: group, '_follower.host': { $ne: null } })
|
|
||||||
]) : [
|
|
||||||
latest ? latest.local.followings.total : 0,
|
|
||||||
latest ? latest.local.followers.total : 0,
|
|
||||||
latest ? latest.remote.followings.total : 0,
|
|
||||||
latest ? latest.remote.followers.total : 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
|
||||||
local: {
|
|
||||||
followings: {
|
|
||||||
total: localFollowingsCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0
|
|
||||||
},
|
|
||||||
followers: {
|
|
||||||
total: localFollowersCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
followings: {
|
|
||||||
total: remoteFollowingsCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0
|
|
||||||
},
|
|
||||||
followers: {
|
|
||||||
total: remoteFollowersCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(follower: IUser, followee: IUser, isFollow: boolean) {
|
|
||||||
const update: Obj = {};
|
|
||||||
|
|
||||||
update.total = isFollow ? 1 : -1;
|
|
||||||
|
|
||||||
if (isFollow) {
|
|
||||||
update.inc = 1;
|
|
||||||
} else {
|
|
||||||
update.dec = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.inc({
|
|
||||||
[isLocalUser(follower) ? 'local' : 'remote']: { followings: update }
|
|
||||||
}, follower._id);
|
|
||||||
this.inc({
|
|
||||||
[isLocalUser(followee) ? 'local' : 'remote']: { followers: update }
|
|
||||||
}, followee._id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new PerUserFollowingChart();
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from './';
|
|
||||||
import Note, { INote } from '../models/note';
|
|
||||||
import { IUser } from '../models/user';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ユーザーごとの投稿に関するチャート
|
|
||||||
*/
|
|
||||||
type PerUserNotesLog = {
|
|
||||||
/**
|
|
||||||
* 集計期間時点での、全投稿数
|
|
||||||
*/
|
|
||||||
total: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加した投稿数
|
|
||||||
*/
|
|
||||||
inc: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少した投稿数
|
|
||||||
*/
|
|
||||||
dec: number;
|
|
||||||
|
|
||||||
diffs: {
|
|
||||||
/**
|
|
||||||
* 通常の投稿数の差分
|
|
||||||
*/
|
|
||||||
normal: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* リプライの投稿数の差分
|
|
||||||
*/
|
|
||||||
reply: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renoteの投稿数の差分
|
|
||||||
*/
|
|
||||||
renote: number;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
class PerUserNotesChart extends Chart<PerUserNotesLog> {
|
|
||||||
constructor() {
|
|
||||||
super('perUserNotes', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: PerUserNotesLog, group?: any): Promise<PerUserNotesLog> {
|
|
||||||
const [count] = init ? await Promise.all([
|
|
||||||
Note.count({ userId: group, deletedAt: null }),
|
|
||||||
]) : [
|
|
||||||
latest ? latest.total : 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
|
||||||
total: count,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(user: IUser, note: INote, isAdditional: boolean) {
|
|
||||||
const update: Obj = {
|
|
||||||
diffs: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
update.total = isAdditional ? 1 : -1;
|
|
||||||
|
|
||||||
if (isAdditional) {
|
|
||||||
update.inc = 1;
|
|
||||||
} else {
|
|
||||||
update.dec = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (note.replyId != null) {
|
|
||||||
update.diffs.reply = isAdditional ? 1 : -1;
|
|
||||||
} else if (note.renoteId != null) {
|
|
||||||
update.diffs.renote = isAdditional ? 1 : -1;
|
|
||||||
} else {
|
|
||||||
update.diffs.normal = isAdditional ? 1 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.inc(update, user._id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new PerUserNotesChart();
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart from './';
|
|
||||||
import { IUser, isLocalUser } from '../models/user';
|
|
||||||
import { INote } from '../models/note';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ユーザーごとのリアクションに関するチャート
|
|
||||||
*/
|
|
||||||
type PerUserReactionsLog = {
|
|
||||||
local: {
|
|
||||||
/**
|
|
||||||
* リアクションされた数
|
|
||||||
*/
|
|
||||||
count: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
remote: PerUserReactionsLog['local'];
|
|
||||||
};
|
|
||||||
|
|
||||||
class PerUserReactionsChart extends Chart<PerUserReactionsLog> {
|
|
||||||
constructor() {
|
|
||||||
super('perUserReaction', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: PerUserReactionsLog, group?: any): Promise<PerUserReactionsLog> {
|
|
||||||
return {
|
|
||||||
local: {
|
|
||||||
count: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
count: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(user: IUser, note: INote) {
|
|
||||||
this.inc({
|
|
||||||
[isLocalUser(user) ? 'local' : 'remote']: { count: 1 }
|
|
||||||
}, note.userId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new PerUserReactionsChart();
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
import autobind from 'autobind-decorator';
|
|
||||||
import Chart, { Obj } from './';
|
|
||||||
import User, { IUser, isLocalUser } from '../models/user';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ユーザーに関するチャート
|
|
||||||
*/
|
|
||||||
type UsersLog = {
|
|
||||||
local: {
|
|
||||||
/**
|
|
||||||
* 集計期間時点での、全ユーザー数
|
|
||||||
*/
|
|
||||||
total: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 増加したユーザー数
|
|
||||||
*/
|
|
||||||
inc: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 減少したユーザー数
|
|
||||||
*/
|
|
||||||
dec: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
remote: UsersLog['local'];
|
|
||||||
};
|
|
||||||
|
|
||||||
class UsersChart extends Chart<UsersLog> {
|
|
||||||
constructor() {
|
|
||||||
super('users');
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
protected async getTemplate(init: boolean, latest?: UsersLog): Promise<UsersLog> {
|
|
||||||
const [localCount, remoteCount] = init ? await Promise.all([
|
|
||||||
User.count({ host: null }),
|
|
||||||
User.count({ host: { $ne: null } })
|
|
||||||
]) : [
|
|
||||||
latest ? latest.local.total : 0,
|
|
||||||
latest ? latest.remote.total : 0
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
|
||||||
local: {
|
|
||||||
total: localCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteCount,
|
|
||||||
inc: 0,
|
|
||||||
dec: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@autobind
|
|
||||||
public async update(user: IUser, isAdditional: boolean) {
|
|
||||||
const update: Obj = {};
|
|
||||||
|
|
||||||
update.total = isAdditional ? 1 : -1;
|
|
||||||
if (isAdditional) {
|
|
||||||
update.inc = 1;
|
|
||||||
} else {
|
|
||||||
update.dec = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.inc({
|
|
||||||
[isLocalUser(user) ? 'local' : 'remote']: update
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default new UsersChart();
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="faExclamationCircle"/> {{ $t('title') }}</div>
|
<template #title><fa :icon="faExclamationCircle"/> {{ $t('title') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<div v-for="report in userReports" :key="report.id" class="haexwsjc">
|
<div v-for="report in userReports" :key="report.id" class="haexwsjc">
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa icon="broadcast-tower"/> {{ $t('announcements') }}</div>
|
<template #title><fa icon="broadcast-tower"/> {{ $t('announcements') }}</template>
|
||||||
<section v-for="(announcement, i) in announcements" class="fit-top">
|
<section v-for="(announcement, i) in announcements" class="fit-top">
|
||||||
<ui-input v-model="announcement.title" @change="save">
|
<ui-input v-model="announcement.title" @change="save">
|
||||||
<span>{{ $t('title') }}</span>
|
<span>{{ $t('title') }}</span>
|
||||||
@@ -9,6 +9,9 @@
|
|||||||
<ui-textarea v-model="announcement.text">
|
<ui-textarea v-model="announcement.text">
|
||||||
<span>{{ $t('text') }}</span>
|
<span>{{ $t('text') }}</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
|
<ui-input v-model="announcement.image">
|
||||||
|
<span>{{ $t('image-url') }}</span>
|
||||||
|
</ui-input>
|
||||||
<ui-horizon-group class="fit-bottom">
|
<ui-horizon-group class="fit-bottom">
|
||||||
<ui-button @click="save()"><fa :icon="['far', 'save']"/> {{ $t('save') }}</ui-button>
|
<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-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> {{ $t('remove') }}</ui-button>
|
||||||
@@ -35,7 +38,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta().then(meta => {
|
||||||
this.announcements = meta.broadcasts;
|
this.announcements = meta.announcements;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -43,7 +46,8 @@ export default Vue.extend({
|
|||||||
add() {
|
add() {
|
||||||
this.announcements.unshift({
|
this.announcements.unshift({
|
||||||
title: '',
|
title: '',
|
||||||
text: ''
|
text: '',
|
||||||
|
image: null
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -65,7 +69,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
save(silent) {
|
save(silent) {
|
||||||
this.$root.api('admin/update-meta', {
|
this.$root.api('admin/update-meta', {
|
||||||
broadcasts: this.announcements
|
announcements: this.announcements
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import * as tinycolor from 'tinycolor2';
|
import * as tinycolor from 'tinycolor2';
|
||||||
import * as ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
const limit = 90;
|
const limit = 90;
|
||||||
|
|
||||||
@@ -181,7 +181,12 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
grid: {
|
grid: {
|
||||||
clipMarkers: false,
|
clipMarkers: false,
|
||||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||||
|
xaxis: {
|
||||||
|
lines: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
stroke: {
|
stroke: {
|
||||||
curve: 'straight',
|
curve: 'straight',
|
||||||
@@ -240,6 +245,7 @@ export default Vue.extend({
|
|||||||
federationInstancesChart(total: boolean): any {
|
federationInstancesChart(total: boolean): any {
|
||||||
return {
|
return {
|
||||||
series: [{
|
series: [{
|
||||||
|
name: 'Instances',
|
||||||
data: this.format(total
|
data: this.format(total
|
||||||
? this.stats.federation.instance.total
|
? this.stats.federation.instance.total
|
||||||
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['connection'],
|
props: ['connection'],
|
||||||
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"/>
|
<x-charts ref="charts"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="queue">
|
||||||
|
<x-queue/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="cpu-memory">
|
<div class="cpu-memory">
|
||||||
<x-cpu-memory :connection="connection"/>
|
<x-cpu-memory :connection="connection"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -86,9 +90,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import XCpuMemory from "./cpu-memory.vue";
|
import XCpuMemory from "./dashboard.cpu-memory.vue";
|
||||||
import XCharts from "./charts.vue";
|
import XQueue from "./dashboard.queue-charts.vue";
|
||||||
import XApLog from "./ap-log.vue";
|
import XCharts from "./dashboard.charts.vue";
|
||||||
|
import XApLog from "./dashboard.ap-log.vue";
|
||||||
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||||
import MarqueeText from 'vue-marquee-text-component';
|
import MarqueeText from 'vue-marquee-text-component';
|
||||||
import randomColor from 'randomcolor';
|
import randomColor from 'randomcolor';
|
||||||
@@ -98,6 +103,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
components: {
|
components: {
|
||||||
XCpuMemory,
|
XCpuMemory,
|
||||||
|
XQueue,
|
||||||
XCharts,
|
XCharts,
|
||||||
XApLog,
|
XApLog,
|
||||||
MarqueeText
|
MarqueeText
|
||||||
@@ -124,7 +130,7 @@ export default Vue.extend({
|
|||||||
this.meta = meta;
|
this.meta = meta;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$root.api('instances', {
|
this.$root.api('federation/instances', {
|
||||||
sort: '+notes'
|
sort: '+notes'
|
||||||
}).then(instances => {
|
}).then(instances => {
|
||||||
for (const i of instances) {
|
for (const i of instances) {
|
||||||
@@ -274,6 +280,9 @@ export default Vue.extend({
|
|||||||
> .charts
|
> .charts
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .queue
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
> .cpu-memory
|
> .cpu-memory
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
|
<template #title><fa :icon="faTerminal"/> {{ $t('operation') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input v-model="target" type="text">
|
<ui-input v-model="target" type="text">
|
||||||
<span>{{ $t('fileid-or-url') }}</span>
|
<span>{{ $t('fileid-or-url') }}</span>
|
||||||
@@ -17,18 +17,18 @@
|
|||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="faCloud"/> {{ $t('@.drive') }}</div>
|
<template #title><fa :icon="faCloud"/> {{ $t('@.drive') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-select v-model="sort">
|
<ui-select v-model="sort">
|
||||||
<span slot="label">{{ $t('sort.title') }}</span>
|
<template #label>{{ $t('sort.title') }}</template>
|
||||||
<option value="-createdAt">{{ $t('sort.createdAtAsc') }}</option>
|
<option value="-createdAt">{{ $t('sort.createdAtAsc') }}</option>
|
||||||
<option value="+createdAt">{{ $t('sort.createdAtDesc') }}</option>
|
<option value="+createdAt">{{ $t('sort.createdAtDesc') }}</option>
|
||||||
<option value="-size">{{ $t('sort.sizeAsc') }}</option>
|
<option value="-size">{{ $t('sort.sizeAsc') }}</option>
|
||||||
<option value="+size">{{ $t('sort.sizeDesc') }}</option>
|
<option value="+size">{{ $t('sort.sizeDesc') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
<ui-select v-model="origin">
|
<ui-select v-model="origin">
|
||||||
<span slot="label">{{ $t('origin.title') }}</span>
|
<template #label>{{ $t('origin.title') }}</template>
|
||||||
<option value="combined">{{ $t('origin.combined') }}</option>
|
<option value="combined">{{ $t('origin.combined') }}</option>
|
||||||
<option value="local">{{ $t('origin.local') }}</option>
|
<option value="local">{{ $t('origin.local') }}</option>
|
||||||
<option value="remote">{{ $t('origin.remote') }}</option>
|
<option value="remote">{{ $t('origin.remote') }}</option>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
<div class="kidvdlkg" v-for="file in files">
|
<div class="kidvdlkg" v-for="file in files">
|
||||||
<div @click="file._open = !file._open">
|
<div @click="file._open = !file._open">
|
||||||
<div>
|
<div>
|
||||||
<div class="thumbnail" :style="thumbnail(file)"></div>
|
<x-file-thumbnail class="thumbnail" :file="file" fit="contain" @click="showFileMenu(file)"/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<header>
|
<header>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<span style="margin-right:16px;">{{ file.type }}</span>
|
<span style="margin-right:16px;">{{ file.type }}</span>
|
||||||
<span>{{ file.datasize | bytes }}</span>
|
<span>{{ file.size | bytes }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div><mk-time :time="file.createdAt" mode="detail"/></div>
|
<div><mk-time :time="file.createdAt" mode="detail"/></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -75,10 +75,15 @@ import Vue from 'vue';
|
|||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { faCloud, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
|
import { faCloud, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faTrashAlt, faEye, faEyeSlash } from '@fortawesome/free-regular-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({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/drive.vue'),
|
i18n: i18n('admin/views/drive.vue'),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XFileThumbnail
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
file: null,
|
file: null,
|
||||||
@@ -151,13 +156,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) {
|
async del(file: any) {
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('drive/files/delete', { fileId: file.id });
|
await this.$root.api('drive/files/delete', { fileId: file.id });
|
||||||
@@ -179,9 +177,9 @@ export default Vue.extend({
|
|||||||
this.$root.api('drive/files/update', {
|
this.$root.api('drive/files/update', {
|
||||||
fileId: file.id,
|
fileId: file.id,
|
||||||
isSensitive: !file.isSensitive
|
isSensitive: !file.isSensitive
|
||||||
|
}).then(() => {
|
||||||
|
file.isSensitive = !file.isSensitive;
|
||||||
});
|
});
|
||||||
|
|
||||||
file.isSensitive = !file.isSensitive;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
async show() {
|
async show() {
|
||||||
@@ -244,7 +242,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> div:nth-child(1)
|
> div:nth-child(1)
|
||||||
> .thumbnail
|
> .thumbnail
|
||||||
display block
|
display flex
|
||||||
width 64px
|
width 64px
|
||||||
height 64px
|
height 64px
|
||||||
background-size cover
|
background-size cover
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa icon="plus"/> {{ $t('add-emoji.title') }}</div>
|
<template #title><fa icon="plus"/> {{ $t('add-emoji.title') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="name">
|
<ui-input v-model="name">
|
||||||
<span>{{ $t('add-emoji.name') }}</span>
|
<span>{{ $t('add-emoji.name') }}</span>
|
||||||
<span slot="desc">{{ $t('add-emoji.name-desc') }}</span>
|
<template #desc>{{ $t('add-emoji.name-desc') }}</template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="aliases">
|
<ui-input v-model="aliases">
|
||||||
<span>{{ $t('add-emoji.aliases') }}</span>
|
<span>{{ $t('add-emoji.aliases') }}</span>
|
||||||
<span slot="desc">{{ $t('add-emoji.aliases-desc') }}</span>
|
<template #desc>{{ $t('add-emoji.aliases-desc') }}</template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-input v-model="url">
|
<ui-input v-model="url">
|
||||||
<i slot="icon"><fa icon="link"/></i>
|
<template #icon><fa icon="link"/></template>
|
||||||
<span>{{ $t('add-emoji.url') }}</span>
|
<span>{{ $t('add-emoji.url') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-info>{{ $t('add-emoji.info') }}</ui-info>
|
<ui-info>{{ $t('add-emoji.info') }}</ui-info>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="faGrin"/> {{ $t('emojis.title') }}</div>
|
<template #title><fa :icon="faGrin"/> {{ $t('emojis.title') }}</template>
|
||||||
<section v-for="emoji in emojis" class="oryfrbft">
|
<section v-for="emoji in emojis" class="oryfrbft">
|
||||||
<div>
|
<div>
|
||||||
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-input v-model="emoji.url">
|
<ui-input v-model="emoji.url">
|
||||||
<i slot="icon"><fa icon="link"/></i>
|
<template #icon><fa icon="link"/></template>
|
||||||
<span>{{ $t('add-emoji.url') }}</span>
|
<span>{{ $t('add-emoji.url') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-horizon-group class="fit-bottom">
|
<ui-horizon-group class="fit-bottom">
|
||||||
|
|||||||
508
src/client/app/admin/views/federation.vue
Normal file
508
src/client/app/admin/views/federation.vue
Normal file
@@ -0,0 +1,508 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<ui-card>
|
||||||
|
<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-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 | 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 | 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>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-select v-model="chartSrc">
|
||||||
|
<option value="requests">{{ $t('chart-srcs.requests') }}</option>
|
||||||
|
<option value="users">{{ $t('chart-srcs.users') }}</option>
|
||||||
|
<option value="users-total">{{ $t('chart-srcs.users-total') }}</option>
|
||||||
|
<option value="notes">{{ $t('chart-srcs.notes') }}</option>
|
||||||
|
<option value="notes-total">{{ $t('chart-srcs.notes-total') }}</option>
|
||||||
|
<option value="ff">{{ $t('chart-srcs.ff') }}</option>
|
||||||
|
<option value="ff-total">{{ $t('chart-srcs.ff-total') }}</option>
|
||||||
|
<option value="drive-usage">{{ $t('chart-srcs.drive-usage') }}</option>
|
||||||
|
<option value="drive-usage-total">{{ $t('chart-srcs.drive-usage-total') }}</option>
|
||||||
|
<option value="drive-files">{{ $t('chart-srcs.drive-files') }}</option>
|
||||||
|
<option value="drive-files-total">{{ $t('chart-srcs.drive-files-total') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
<ui-select v-model="chartSpan">
|
||||||
|
<option value="hour">{{ $t('chart-spans.hour') }}</option>
|
||||||
|
<option value="day">{{ $t('chart-spans.day') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<div ref="chart"></div>
|
||||||
|
</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>
|
||||||
|
<ui-info warn>{{ $t('remove-all-following-info', { host: instance.host }) }}</ui-info>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faServer"/> {{ $t('instances') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-select v-model="sort">
|
||||||
|
<template #label>{{ $t('sort') }}</template>
|
||||||
|
<option value="-caughtAt">{{ $t('sorts.caughtAtAsc') }}</option>
|
||||||
|
<option value="+caughtAt">{{ $t('sorts.caughtAtDesc') }}</option>
|
||||||
|
<option value="-lastCommunicatedAt">{{ $t('sorts.lastCommunicatedAtAsc') }}</option>
|
||||||
|
<option value="+lastCommunicatedAt">{{ $t('sorts.lastCommunicatedAtDesc') }}</option>
|
||||||
|
<option value="-notes">{{ $t('sorts.notesAsc') }}</option>
|
||||||
|
<option value="+notes">{{ $t('sorts.notesDesc') }}</option>
|
||||||
|
<option value="-users">{{ $t('sorts.usersAsc') }}</option>
|
||||||
|
<option value="+users">{{ $t('sorts.usersDesc') }}</option>
|
||||||
|
<option value="-following">{{ $t('sorts.followingAsc') }}</option>
|
||||||
|
<option value="+following">{{ $t('sorts.followingDesc') }}</option>
|
||||||
|
<option value="-followers">{{ $t('sorts.followersAsc') }}</option>
|
||||||
|
<option value="+followers">{{ $t('sorts.followersDesc') }}</option>
|
||||||
|
<option value="-driveUsage">{{ $t('sorts.driveUsageAsc') }}</option>
|
||||||
|
<option value="+driveUsage">{{ $t('sorts.driveUsageDesc') }}</option>
|
||||||
|
<option value="-driveFiles">{{ $t('sorts.driveFilesAsc') }}</option>
|
||||||
|
<option value="+driveFiles">{{ $t('sorts.driveFilesDesc') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
<ui-select v-model="state">
|
||||||
|
<template #label>{{ $t('state') }}</template>
|
||||||
|
<option value="all">{{ $t('states.all') }}</option>
|
||||||
|
<option value="blocked">{{ $t('states.blocked') }}</option>
|
||||||
|
<option value="notResponding">{{ $t('states.not-responding') }}</option>
|
||||||
|
<option value="markedAsClosed">{{ $t('states.marked-as-closed') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
</ui-horizon-group>
|
||||||
|
|
||||||
|
<div class="instances">
|
||||||
|
<header>
|
||||||
|
<span>{{ $t('host') }}</span>
|
||||||
|
<span>{{ $t('notes') }}</span>
|
||||||
|
<span>{{ $t('users') }}</span>
|
||||||
|
<span>{{ $t('following') }}</span>
|
||||||
|
<span>{{ $t('followers') }}</span>
|
||||||
|
<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>
|
||||||
|
<span>{{ instance.notesCount | number }}</span>
|
||||||
|
<span>{{ instance.usersCount | number }}</span>
|
||||||
|
<span>{{ instance.followingCount | number }}</span>
|
||||||
|
<span>{{ instance.followersCount | number }}</span>
|
||||||
|
<span>{{ instance.latestStatus }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ui-info v-if="instances.length == limit">{{ $t('result-is-truncated', { n: limit }) }}</ui-info>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
import { 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';
|
||||||
|
|
||||||
|
const chartLimit = 90;
|
||||||
|
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
|
||||||
|
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: 100,
|
||||||
|
instances: [],
|
||||||
|
chart: null,
|
||||||
|
chartSrc: 'requests',
|
||||||
|
chartSpan: 'hour',
|
||||||
|
chartInstance: null,
|
||||||
|
faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
data(): any {
|
||||||
|
if (this.chart == null) return null;
|
||||||
|
switch (this.chartSrc) {
|
||||||
|
case 'requests': return this.requestsChart();
|
||||||
|
case 'users': return this.usersChart(false);
|
||||||
|
case 'users-total': return this.usersChart(true);
|
||||||
|
case 'notes': return this.notesChart(false);
|
||||||
|
case 'notes-total': return this.notesChart(true);
|
||||||
|
case 'ff': return this.ffChart(false);
|
||||||
|
case 'ff-total': return this.ffChart(true);
|
||||||
|
case 'drive-usage': return this.driveUsageChart(false);
|
||||||
|
case 'drive-usage-total': return this.driveUsageChart(true);
|
||||||
|
case 'drive-files': return this.driveFilesChart(false);
|
||||||
|
case 'drive-files-total': return this.driveFilesChart(true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
stats(): any[] {
|
||||||
|
const stats =
|
||||||
|
this.chartSpan == 'day' ? this.chart.perDay :
|
||||||
|
this.chartSpan == 'hour' ? this.chart.perHour :
|
||||||
|
null;
|
||||||
|
|
||||||
|
return stats;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
sort() {
|
||||||
|
this.fetchInstances();
|
||||||
|
},
|
||||||
|
|
||||||
|
state() {
|
||||||
|
this.fetchInstances();
|
||||||
|
},
|
||||||
|
|
||||||
|
async instance() {
|
||||||
|
this.now = new Date();
|
||||||
|
|
||||||
|
const [perHour, perDay] = await Promise.all([
|
||||||
|
this.$root.api('charts/instance', { host: this.instance.host, limit: chartLimit, span: 'hour' }),
|
||||||
|
this.$root.api('charts/instance', { host: this.instance.host, limit: chartLimit, span: 'day' }),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const chart = {
|
||||||
|
perHour: perHour,
|
||||||
|
perDay: perDay
|
||||||
|
};
|
||||||
|
|
||||||
|
this.chart = chart;
|
||||||
|
|
||||||
|
this.renderChart();
|
||||||
|
},
|
||||||
|
|
||||||
|
chartSrc() {
|
||||||
|
this.renderChart();
|
||||||
|
},
|
||||||
|
|
||||||
|
chartSpan() {
|
||||||
|
this.renderChart();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetchInstances();
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.chartInstance.destroy();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
showInstance(target?: string) {
|
||||||
|
this.$root.api('federation/show-instance', {
|
||||||
|
host: target || this.target
|
||||||
|
}).then(instance => {
|
||||||
|
if (instance == null) {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('instance-not-registered')
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.instance = instance;
|
||||||
|
this.target = '';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchInstances() {
|
||||||
|
this.instances = [];
|
||||||
|
this.$root.api('federation/instances', {
|
||||||
|
blocked: this.state === 'blocked' ? true : null,
|
||||||
|
notResponding: this.state === 'notResponding' ? true : null,
|
||||||
|
markedAsClosed: this.state === 'markedAsClosed' ? true : null,
|
||||||
|
sort: this.sort,
|
||||||
|
limit: this.limit
|
||||||
|
}).then(instances => {
|
||||||
|
this.instances = instances;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeAllFollowing() {
|
||||||
|
this.$root.api('admin/federation/remove-all-following', {
|
||||||
|
host: this.instance.host
|
||||||
|
}).then(() => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateInstance() {
|
||||||
|
this.$root.api('admin/federation/update-instance', {
|
||||||
|
host: this.instance.host,
|
||||||
|
isBlocked: this.instance.isBlocked || false,
|
||||||
|
isClosed: this.instance.isMarkedAsClosed || false
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
setSrc(src) {
|
||||||
|
this.chartSrc = src;
|
||||||
|
},
|
||||||
|
|
||||||
|
renderChart() {
|
||||||
|
if (this.chartInstance) {
|
||||||
|
this.chartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.chartInstance = new ApexCharts(this.$refs.chart, {
|
||||||
|
chart: {
|
||||||
|
type: 'area',
|
||||||
|
height: 300,
|
||||||
|
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: {
|
||||||
|
theme: this.$store.state.device.darkmode ? 'dark' : 'light'
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
labels: {
|
||||||
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
type: 'datetime',
|
||||||
|
labels: {
|
||||||
|
style: {
|
||||||
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisBorder: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
axisTicks: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
labels: {
|
||||||
|
formatter: this.data.bytes ? v => Vue.filter('bytes')(v, 0) : v => Vue.filter('number')(v),
|
||||||
|
style: {
|
||||||
|
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: this.data.series
|
||||||
|
});
|
||||||
|
|
||||||
|
this.chartInstance.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
getDate(i: number) {
|
||||||
|
const y = this.now.getFullYear();
|
||||||
|
const m = this.now.getMonth();
|
||||||
|
const d = this.now.getDate();
|
||||||
|
const h = this.now.getHours();
|
||||||
|
|
||||||
|
return (
|
||||||
|
this.chartSpan == 'day' ? new Date(y, m, d - i) :
|
||||||
|
this.chartSpan == 'hour' ? new Date(y, m, d, h - i) :
|
||||||
|
null
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
format(arr) {
|
||||||
|
return arr.map((v, i) => ({ x: this.getDate(i).getTime(), y: v }));
|
||||||
|
},
|
||||||
|
|
||||||
|
requestsChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Incoming',
|
||||||
|
data: this.format(this.stats.requests.received)
|
||||||
|
}, {
|
||||||
|
name: 'Outgoing (succeeded)',
|
||||||
|
data: this.format(this.stats.requests.succeeded)
|
||||||
|
}, {
|
||||||
|
name: 'Outgoing (failed)',
|
||||||
|
data: this.format(this.stats.requests.failed)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
usersChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Users',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.users.total
|
||||||
|
: sum(this.stats.users.inc, negate(this.stats.users.dec))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
notesChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Notes',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.notes.total
|
||||||
|
: sum(this.stats.notes.inc, negate(this.stats.notes.dec))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
ffChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Following',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.following.total
|
||||||
|
: sum(this.stats.following.inc, negate(this.stats.following.dec))
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Followers',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.followers.total
|
||||||
|
: sum(this.stats.followers.inc, negate(this.stats.followers.dec))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveUsageChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
bytes: true,
|
||||||
|
series: [{
|
||||||
|
name: 'Drive usage',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.drive.totalUsage
|
||||||
|
: sum(this.stats.drive.incUsage, negate(this.stats.drive.decUsage))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveFilesChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Drive files',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.drive.totalFiles
|
||||||
|
: sum(this.stats.drive.incFiles, negate(this.stats.drive.decFiles))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.target
|
||||||
|
margin-bottom 16px !important
|
||||||
|
|
||||||
|
.instances
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
|
||||||
|
> *
|
||||||
|
color var(--text)
|
||||||
|
font-weight bold
|
||||||
|
|
||||||
|
> div
|
||||||
|
display flex
|
||||||
|
|
||||||
|
> * > *
|
||||||
|
flex 1
|
||||||
|
overflow auto
|
||||||
|
|
||||||
|
&:first-child
|
||||||
|
min-width 200px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">{{ $t('hided-tags') }}</div>
|
<template #title>{{ $t('hided-tags') }}</template>
|
||||||
<section>
|
<section>
|
||||||
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
|
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hiddenTags"></textarea>
|
||||||
<ui-button @click="save">{{ $t('save') }}</ui-button>
|
<ui-button @click="save">{{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@@ -18,18 +18,18 @@ export default Vue.extend({
|
|||||||
i18n: i18n('admin/views/hashtags.vue'),
|
i18n: i18n('admin/views/hashtags.vue'),
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hidedTags: '',
|
hiddenTags: '',
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta().then(meta => {
|
||||||
this.hidedTags = meta.hidedTags.join('\n');
|
this.hiddenTags = meta.hiddenTags.join('\n');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
save() {
|
save() {
|
||||||
this.$root.api('admin/update-meta', {
|
this.$root.api('admin/update-meta', {
|
||||||
hidedTags: this.hidedTags.split('\n')
|
hiddenTags: this.hiddenTags.split('\n')
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
//this.$root.os.apis.dialog({ text: `Saved` });
|
//this.$root.os.apis.dialog({ text: `Saved` });
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
|
|||||||
@@ -20,10 +20,12 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
|
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
|
||||||
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
<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('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</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('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('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
|
||||||
<!-- <li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faShareAlt" fixed-width/>{{ $t('federation') }}</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('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('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('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
|
||||||
@@ -40,12 +42,15 @@
|
|||||||
<div class="page">
|
<div class="page">
|
||||||
<div v-if="page == 'dashboard'"><x-dashboard/></div>
|
<div v-if="page == 'dashboard'"><x-dashboard/></div>
|
||||||
<div v-if="page == 'instance'"><x-instance/></div>
|
<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 == 'moderators'"><x-moderators/></div>
|
<div v-if="page == 'moderators'"><x-moderators/></div>
|
||||||
<div v-if="page == 'users'"><x-users/></div>
|
<div v-if="page == 'users'"><x-users/></div>
|
||||||
<div v-if="page == 'emoji'"><x-emoji/></div>
|
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||||
<div v-if="page == 'announcements'"><x-announcements/></div>
|
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||||
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
||||||
<div v-if="page == 'drive'"><x-drive/></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>
|
<div v-if="page == 'abuse'"><x-abuse/></div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@@ -58,6 +63,8 @@ import i18n from '../../i18n';
|
|||||||
import { version } from '../../config';
|
import { version } from '../../config';
|
||||||
import XDashboard from "./dashboard.vue";
|
import XDashboard from "./dashboard.vue";
|
||||||
import XInstance from "./instance.vue";
|
import XInstance from "./instance.vue";
|
||||||
|
import XQueue from "./queue.vue";
|
||||||
|
import XLogs from "./logs.vue";
|
||||||
import XModerators from "./moderators.vue";
|
import XModerators from "./moderators.vue";
|
||||||
import XEmoji from "./emoji.vue";
|
import XEmoji from "./emoji.vue";
|
||||||
import XAnnouncements from "./announcements.vue";
|
import XAnnouncements from "./announcements.vue";
|
||||||
@@ -65,7 +72,9 @@ import XHashtags from "./hashtags.vue";
|
|||||||
import XUsers from "./users.vue";
|
import XUsers from "./users.vue";
|
||||||
import XDrive from "./drive.vue";
|
import XDrive from "./drive.vue";
|
||||||
import XAbuse from "./abuse.vue";
|
import XAbuse from "./abuse.vue";
|
||||||
import { faHeadset, faArrowLeft, faShareAlt, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
|
import XFederation from "./federation.vue";
|
||||||
|
|
||||||
|
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
// Detect the user agent
|
// Detect the user agent
|
||||||
@@ -77,6 +86,8 @@ export default Vue.extend({
|
|||||||
components: {
|
components: {
|
||||||
XDashboard,
|
XDashboard,
|
||||||
XInstance,
|
XInstance,
|
||||||
|
XQueue,
|
||||||
|
XLogs,
|
||||||
XModerators,
|
XModerators,
|
||||||
XEmoji,
|
XEmoji,
|
||||||
XAnnouncements,
|
XAnnouncements,
|
||||||
@@ -84,6 +95,7 @@ export default Vue.extend({
|
|||||||
XUsers,
|
XUsers,
|
||||||
XDrive,
|
XDrive,
|
||||||
XAbuse,
|
XAbuse,
|
||||||
|
XFederation,
|
||||||
},
|
},
|
||||||
provide: {
|
provide: {
|
||||||
isMobile
|
isMobile
|
||||||
@@ -97,8 +109,10 @@ export default Vue.extend({
|
|||||||
faGrin,
|
faGrin,
|
||||||
faArrowLeft,
|
faArrowLeft,
|
||||||
faHeadset,
|
faHeadset,
|
||||||
faShareAlt,
|
faGlobe,
|
||||||
faExclamationCircle
|
faExclamationCircle,
|
||||||
|
faTasks,
|
||||||
|
faStream
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@@ -1,20 +1,21 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa icon="cog"/> {{ $t('instance') }}</div>
|
<template #title><fa icon="cog"/> {{ $t('instance') }}</template>
|
||||||
<section class="fit-top fit-bottom">
|
<section class="fit-top fit-bottom">
|
||||||
<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
|
<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
|
||||||
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
||||||
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
||||||
<ui-input v-model="mascotImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('logo-url') }}</ui-input>
|
<ui-input v-model="iconUrl"><template #icon><fa icon="link"/></template>{{ $t('icon-url') }}</ui-input>
|
||||||
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('banner-url') }}</ui-input>
|
<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
|
||||||
<ui-input v-model="errorImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('error-image-url') }}</ui-input>
|
<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
|
||||||
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></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>
|
||||||
</section>
|
</section>
|
||||||
<section class="fit-bottom">
|
<section class="fit-bottom">
|
||||||
<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
|
<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
|
||||||
<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
|
<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
|
||||||
<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="farEnvelope"/></i>{{ $t('maintainer-email') }}</ui-input>
|
<ui-input v-model="maintainerEmail" type="email"><template #icon><fa :icon="farEnvelope"/></template>{{ $t('maintainer-email') }}</ui-input>
|
||||||
</section>
|
</section>
|
||||||
<section class="fit-top fit-bottom">
|
<section class="fit-top fit-bottom">
|
||||||
<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input>
|
<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input>
|
||||||
@@ -24,68 +25,65 @@
|
|||||||
<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</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-switch v-model="disableGlobalTimeline">{{ $t('disable-global-timeline') }}</ui-switch>
|
||||||
<ui-info>{{ $t('disabling-timelines-info') }}</ui-info>
|
<ui-info>{{ $t('disabling-timelines-info') }}</ui-info>
|
||||||
|
<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>
|
||||||
<section class="fit-bottom">
|
<section class="fit-bottom">
|
||||||
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
||||||
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<span slot="desc">{{ $t('cache-remote-files-desc') }}</span></ui-switch>
|
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
|
||||||
<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<span slot="suffix">MB</span><span slot="desc">{{ $t('mb') }}</span></ui-input>
|
<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') }}<span slot="suffix">MB</span><span slot="desc">{{ $t('mb') }}</span></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>
|
||||||
<section class="fit-bottom">
|
<section class="fit-bottom">
|
||||||
<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
|
<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
|
||||||
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
||||||
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input>
|
<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"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-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>
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
|
<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
|
||||||
<ui-info>{{ $t('proxy-account-info') }}</ui-info>
|
<ui-info>{{ $t('proxy-account-info') }}</ui-info>
|
||||||
<ui-input v-model="proxyAccount"><span slot="prefix">@</span>{{ $t('proxy-account-username') }}<span slot="desc">{{ $t('proxy-account-username-desc') }}</span></ui-input>
|
<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>
|
<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<header><fa :icon="farEnvelope"/> {{ $t('email-config') }}</header>
|
<header><fa :icon="farEnvelope"/> {{ $t('email-config') }}</header>
|
||||||
<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<span slot="desc">{{ $t('email-config-info') }}</span></ui-switch>
|
<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-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
<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-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="smtpUser" :disabled="!enableEmail">{{ $t('smtp-user') }}</ui-input>
|
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
||||||
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
|
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<span slot="desc">{{ $t('smtp-secure-info') }}</span></ui-switch>
|
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header>
|
<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header>
|
||||||
<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<span slot="desc">{{ $t('serviceworker-info') }}</span></ui-switch>
|
<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-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-horizon-group inputs class="fit-bottom">
|
||||||
<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><i slot="icon"><fa icon="key"/></i>{{ $t('vapid-publickey') }}</ui-input>
|
<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"><i slot="icon"><fa icon="key"/></i>{{ $t('vapid-privatekey') }}</ui-input>
|
<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<header>summaly Proxy</header>
|
<header>summaly Proxy</header>
|
||||||
<ui-input v-model="summalyProxy">URL</ui-input>
|
<ui-input v-model="summalyProxy">URL</ui-input>
|
||||||
</section>
|
</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') }}<span slot="desc">{{ $t('external-user-recommendation-engine-desc') }}</span></ui-input>
|
|
||||||
<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<span slot="suffix">ms</span><span slot="desc">{{ $t('external-user-recommendation-timeout-desc') }}</span></ui-input>
|
|
||||||
</section>
|
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">{{ $t('invite') }}</div>
|
<template #title>{{ $t('invite') }}</template>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="invite">{{ $t('invite') }}</ui-button>
|
<ui-button @click="invite">{{ $t('invite') }}</ui-button>
|
||||||
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
||||||
@@ -93,12 +91,12 @@
|
|||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</div>
|
<template #title><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</template>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
|
<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
<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"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</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-horizon-group>
|
||||||
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
@@ -106,12 +104,12 @@
|
|||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</div>
|
<template #title><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</template>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
|
<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input>
|
<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"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</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-horizon-group>
|
||||||
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
@@ -119,12 +117,12 @@
|
|||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
|
<template #title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
|
<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"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</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-horizon-group>
|
||||||
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
@@ -153,9 +151,12 @@ export default Vue.extend({
|
|||||||
disableRegistration: false,
|
disableRegistration: false,
|
||||||
disableLocalTimeline: false,
|
disableLocalTimeline: false,
|
||||||
disableGlobalTimeline: false,
|
disableGlobalTimeline: false,
|
||||||
|
enableEmojiReaction: true,
|
||||||
|
useStarForReactionFallback: false,
|
||||||
mascotImageUrl: null,
|
mascotImageUrl: null,
|
||||||
bannerUrl: null,
|
bannerUrl: null,
|
||||||
errorImageUrl: null,
|
errorImageUrl: null,
|
||||||
|
iconUrl: null,
|
||||||
name: null,
|
name: null,
|
||||||
description: null,
|
description: null,
|
||||||
languages: null,
|
languages: null,
|
||||||
@@ -177,9 +178,6 @@ export default Vue.extend({
|
|||||||
discordClientSecret: null,
|
discordClientSecret: null,
|
||||||
proxyAccount: null,
|
proxyAccount: null,
|
||||||
inviteCode: null,
|
inviteCode: null,
|
||||||
enableExternalUserRecommendation: false,
|
|
||||||
externalUserRecommendationEngine: null,
|
|
||||||
externalUserRecommendationTimeout: null,
|
|
||||||
summalyProxy: null,
|
summalyProxy: null,
|
||||||
enableEmail: false,
|
enableEmail: false,
|
||||||
email: null,
|
email: null,
|
||||||
@@ -188,6 +186,7 @@ export default Vue.extend({
|
|||||||
smtpPort: null,
|
smtpPort: null,
|
||||||
smtpUser: null,
|
smtpUser: null,
|
||||||
smtpPass: null,
|
smtpPass: null,
|
||||||
|
smtpAuth: false,
|
||||||
enableServiceWorker: false,
|
enableServiceWorker: false,
|
||||||
swPublicKey: null,
|
swPublicKey: null,
|
||||||
swPrivateKey: null,
|
swPrivateKey: null,
|
||||||
@@ -196,15 +195,18 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta(true).then(meta => {
|
||||||
this.maintainerName = meta.maintainer.name;
|
this.maintainerName = meta.maintainerName;
|
||||||
this.maintainerEmail = meta.maintainer.email;
|
this.maintainerEmail = meta.maintainerEmail;
|
||||||
this.disableRegistration = meta.disableRegistration;
|
this.disableRegistration = meta.disableRegistration;
|
||||||
this.disableLocalTimeline = meta.disableLocalTimeline;
|
this.disableLocalTimeline = meta.disableLocalTimeline;
|
||||||
this.disableGlobalTimeline = meta.disableGlobalTimeline;
|
this.disableGlobalTimeline = meta.disableGlobalTimeline;
|
||||||
|
this.enableEmojiReaction = meta.enableEmojiReaction;
|
||||||
|
this.useStarForReactionFallback = meta.useStarForReactionFallback;
|
||||||
this.mascotImageUrl = meta.mascotImageUrl;
|
this.mascotImageUrl = meta.mascotImageUrl;
|
||||||
this.bannerUrl = meta.bannerUrl;
|
this.bannerUrl = meta.bannerUrl;
|
||||||
this.errorImageUrl = meta.errorImageUrl;
|
this.errorImageUrl = meta.errorImageUrl;
|
||||||
|
this.iconUrl = meta.iconUrl;
|
||||||
this.name = meta.name;
|
this.name = meta.name;
|
||||||
this.description = meta.description;
|
this.description = meta.description;
|
||||||
this.languages = meta.langs.join(' ');
|
this.languages = meta.langs.join(' ');
|
||||||
@@ -225,9 +227,6 @@ export default Vue.extend({
|
|||||||
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
||||||
this.discordClientId = meta.discordClientId;
|
this.discordClientId = meta.discordClientId;
|
||||||
this.discordClientSecret = meta.discordClientSecret;
|
this.discordClientSecret = meta.discordClientSecret;
|
||||||
this.enableExternalUserRecommendation = meta.enableExternalUserRecommendation;
|
|
||||||
this.externalUserRecommendationEngine = meta.externalUserRecommendationEngine;
|
|
||||||
this.externalUserRecommendationTimeout = meta.externalUserRecommendationTimeout;
|
|
||||||
this.summalyProxy = meta.summalyProxy;
|
this.summalyProxy = meta.summalyProxy;
|
||||||
this.enableEmail = meta.enableEmail;
|
this.enableEmail = meta.enableEmail;
|
||||||
this.email = meta.email;
|
this.email = meta.email;
|
||||||
@@ -236,6 +235,7 @@ export default Vue.extend({
|
|||||||
this.smtpPort = meta.smtpPort;
|
this.smtpPort = meta.smtpPort;
|
||||||
this.smtpUser = meta.smtpUser;
|
this.smtpUser = meta.smtpUser;
|
||||||
this.smtpPass = meta.smtpPass;
|
this.smtpPass = meta.smtpPass;
|
||||||
|
this.smtpAuth = meta.smtpUser != null && meta.smtpUser !== '';
|
||||||
this.enableServiceWorker = meta.enableServiceWorker;
|
this.enableServiceWorker = meta.enableServiceWorker;
|
||||||
this.swPublicKey = meta.swPublickey;
|
this.swPublicKey = meta.swPublickey;
|
||||||
this.swPrivateKey = meta.swPrivateKey;
|
this.swPrivateKey = meta.swPrivateKey;
|
||||||
@@ -261,9 +261,12 @@ export default Vue.extend({
|
|||||||
disableRegistration: this.disableRegistration,
|
disableRegistration: this.disableRegistration,
|
||||||
disableLocalTimeline: this.disableLocalTimeline,
|
disableLocalTimeline: this.disableLocalTimeline,
|
||||||
disableGlobalTimeline: this.disableGlobalTimeline,
|
disableGlobalTimeline: this.disableGlobalTimeline,
|
||||||
|
enableEmojiReaction: this.enableEmojiReaction,
|
||||||
|
useStarForReactionFallback: this.useStarForReactionFallback,
|
||||||
mascotImageUrl: this.mascotImageUrl,
|
mascotImageUrl: this.mascotImageUrl,
|
||||||
bannerUrl: this.bannerUrl,
|
bannerUrl: this.bannerUrl,
|
||||||
errorImageUrl: this.errorImageUrl,
|
errorImageUrl: this.errorImageUrl,
|
||||||
|
iconUrl: this.iconUrl,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
description: this.description,
|
description: this.description,
|
||||||
langs: this.languages.split(' '),
|
langs: this.languages.split(' '),
|
||||||
@@ -284,17 +287,14 @@ export default Vue.extend({
|
|||||||
enableDiscordIntegration: this.enableDiscordIntegration,
|
enableDiscordIntegration: this.enableDiscordIntegration,
|
||||||
discordClientId: this.discordClientId,
|
discordClientId: this.discordClientId,
|
||||||
discordClientSecret: this.discordClientSecret,
|
discordClientSecret: this.discordClientSecret,
|
||||||
enableExternalUserRecommendation: this.enableExternalUserRecommendation,
|
|
||||||
externalUserRecommendationEngine: this.externalUserRecommendationEngine,
|
|
||||||
externalUserRecommendationTimeout: parseInt(this.externalUserRecommendationTimeout, 10),
|
|
||||||
summalyProxy: this.summalyProxy,
|
summalyProxy: this.summalyProxy,
|
||||||
enableEmail: this.enableEmail,
|
enableEmail: this.enableEmail,
|
||||||
email: this.email,
|
email: this.email,
|
||||||
smtpSecure: this.smtpSecure,
|
smtpSecure: this.smtpSecure,
|
||||||
smtpHost: this.smtpHost,
|
smtpHost: this.smtpHost,
|
||||||
smtpPort: parseInt(this.smtpPort, 10),
|
smtpPort: parseInt(this.smtpPort, 10),
|
||||||
smtpUser: this.smtpUser,
|
smtpUser: this.smtpAuth ? this.smtpUser : '',
|
||||||
smtpPass: this.smtpPass,
|
smtpPass: this.smtpAuth ? this.smtpPass : '',
|
||||||
enableServiceWorker: this.enableServiceWorker,
|
enableServiceWorker: this.enableServiceWorker,
|
||||||
swPublicKey: this.swPublicKey,
|
swPublicKey: this.swPublicKey,
|
||||||
swPrivateKey: this.swPrivateKey
|
swPrivateKey: this.swPrivateKey
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user