Compare commits
934 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4670a3d886 | ||
|
|
78952df364 | ||
|
|
d69df60da4 | ||
|
|
6ca69f6f2e | ||
|
|
8e8428b667 | ||
|
|
5dbe1d448b | ||
|
|
85d8e6f220 | ||
|
|
72fb23f4d5 | ||
|
|
9403ee6495 | ||
|
|
94ce4fa780 | ||
|
|
911f5c1455 | ||
|
|
a6a88af513 | ||
|
|
fad1352d51 | ||
|
|
41cdae07c3 | ||
|
|
3b0daeac3c | ||
|
|
99e4b06468 | ||
|
|
c88576e3e6 | ||
|
|
4de709fe51 | ||
|
|
37e4226c70 | ||
|
|
1a6ed61b91 | ||
|
|
ac641da49c | ||
|
|
933a79af93 | ||
|
|
f36e3c69b4 | ||
|
|
c46bfcc768 | ||
|
|
c65ccd5eb0 | ||
|
|
162a740295 | ||
|
|
9192e98e3f | ||
|
|
fad84203c0 | ||
|
|
622266d200 | ||
|
|
0f6cd3c125 | ||
|
|
0dfc1fcf13 | ||
|
|
efeebd2165 | ||
|
|
69a916d506 | ||
|
|
114803a86a | ||
|
|
7f54c8fa2a | ||
|
|
0af3e15e82 | ||
|
|
f9afebc12e | ||
|
|
fc7268fd12 | ||
|
|
7e7f94d685 | ||
|
|
3ea7a49c1c | ||
|
|
f596a847c2 | ||
|
|
312ba501a3 | ||
|
|
c6531e8609 | ||
|
|
36c2d0082f | ||
|
|
358bb0fc06 | ||
|
|
5a4f6b4ada | ||
|
|
03136caac4 | ||
|
|
e6f78a73ab | ||
|
|
bcdab799d0 | ||
|
|
50251955cd | ||
|
|
2270fbf3ee | ||
|
|
deb6485cc2 | ||
|
|
6de08d07a3 | ||
|
|
f54cd10a04 | ||
|
|
dda7b0c80e | ||
|
|
3ed9e1ff3f | ||
|
|
9c8d26affa | ||
|
|
1e1a7ee858 | ||
|
|
9cfb72810c | ||
|
|
14a774c723 | ||
|
|
8509adf961 | ||
|
|
9d75ec799b | ||
|
|
eed9266ecb | ||
|
|
4a88cb5968 | ||
|
|
50d4de19f0 | ||
|
|
c7456224af | ||
|
|
c1524d9bef | ||
|
|
aa1d2545b3 | ||
|
|
1092818203 | ||
|
|
d67d163c78 | ||
|
|
a973bd56fe | ||
|
|
08b6fda065 | ||
|
|
d0cc145cb3 | ||
|
|
19588647d6 | ||
|
|
09da292f1a | ||
|
|
c8107ff936 | ||
|
|
b44afc1876 | ||
|
|
c26168f22e | ||
|
|
391be342ac | ||
|
|
16549f8f84 | ||
|
|
2d2b65d9fa | ||
|
|
a12ad37522 | ||
|
|
84541faf92 | ||
|
|
c7daaba370 | ||
|
|
f128813a5e | ||
|
|
699a55ea08 | ||
|
|
90a674f99b | ||
|
|
f236d36ed3 | ||
|
|
1b2200ccf4 | ||
|
|
c6353f3502 | ||
|
|
f09b8a78a0 | ||
|
|
5f741ac46e | ||
|
|
a434cfbe0d | ||
|
|
cd4c7689b7 | ||
|
|
3cc2049fb3 | ||
|
|
0d3117e472 | ||
|
|
b335975c97 | ||
|
|
5511b6e013 | ||
|
|
262d5ead51 | ||
|
|
a78b048720 | ||
|
|
e7dd5e155d | ||
|
|
5a3ea38bbf | ||
|
|
786521eba7 | ||
|
|
202cb3048a | ||
|
|
7e642cf700 | ||
|
|
7732aabc1e | ||
|
|
1cf9f52eca | ||
|
|
d1d5e10b72 | ||
|
|
c3fada264f | ||
|
|
45eeb74b83 | ||
|
|
b9a6e551cd | ||
|
|
c610e5ed9b | ||
|
|
c2c2824e50 | ||
|
|
01fab09683 | ||
|
|
e103904a04 | ||
|
|
56678cbac0 | ||
|
|
7fade8939d | ||
|
|
daa557f6a3 | ||
|
|
23a257ed86 | ||
|
|
05d0620491 | ||
|
|
5225139284 | ||
|
|
9b2e996cae | ||
|
|
6a561342a4 | ||
|
|
429bed2f91 | ||
|
|
200d593414 | ||
|
|
9dbe12135d | ||
|
|
318d7f2652 | ||
|
|
5a653531e2 | ||
|
|
c7cc3dcdfd | ||
|
|
61f54f8f74 | ||
|
|
a3b27fe3a1 | ||
|
|
380749051d | ||
|
|
81625f9fc5 | ||
|
|
d6ccb1725b | ||
|
|
5ce412aeda | ||
|
|
fe6d88e410 | ||
|
|
a21357248f | ||
|
|
70d710c9a9 | ||
|
|
183c82fb8d | ||
|
|
62cbb92154 | ||
|
|
7d70126072 | ||
|
|
54bfffa7b9 | ||
|
|
3f5b96bf62 | ||
|
|
3d8bbedf1b | ||
|
|
23c9f6a6ca | ||
|
|
5ba8d4949d | ||
|
|
a6befdd541 | ||
|
|
e5409db0e8 | ||
|
|
678d610cd6 | ||
|
|
466fe9c368 | ||
|
|
13feaea7b7 | ||
|
|
e52f9301fa | ||
|
|
1b58e18a6d | ||
|
|
b779ff08e0 | ||
|
|
811f9c22d7 | ||
|
|
c3529f0691 | ||
|
|
f9f574532e | ||
|
|
92dee53dd6 | ||
|
|
5d42ee2359 | ||
|
|
7c03d37caa | ||
|
|
b128b593c2 | ||
|
|
342e48ed77 | ||
|
|
052f8b265d | ||
|
|
2eedc91d74 | ||
|
|
410b9ad6bc | ||
|
|
24c6dff3e4 | ||
|
|
161db7636a | ||
|
|
796252357e | ||
|
|
b0344d52e9 | ||
|
|
8e6da3a0d9 | ||
|
|
756e4eaeec | ||
|
|
3126d0730a | ||
|
|
748e9f15df | ||
|
|
7c714f5788 | ||
|
|
d3c3ad839b | ||
|
|
168de3c316 | ||
|
|
9e20fc5c88 | ||
|
|
1ff5151786 | ||
|
|
a56738a331 | ||
|
|
2d04a3d6d2 | ||
|
|
e0a55b9100 | ||
|
|
0a57eecb3a | ||
|
|
51f98020f6 | ||
|
|
70123805e1 | ||
|
|
1448b11d00 | ||
|
|
490b81ed05 | ||
|
|
96f675abed | ||
|
|
4cd451c613 | ||
|
|
187792dfc4 | ||
|
|
3dde561fe5 | ||
|
|
a75ec45172 | ||
|
|
3732ddf75f | ||
|
|
b8d8097734 | ||
|
|
1092532292 | ||
|
|
8a79ba0e2b | ||
|
|
ca2949fbb4 | ||
|
|
17b373ac07 | ||
|
|
7aa66f438f | ||
|
|
73641fd78d | ||
|
|
64aac9d6ad | ||
|
|
2be13736c8 | ||
|
|
ff4f5fec1d | ||
|
|
7d64f8abe4 | ||
|
|
88e6929e9f | ||
|
|
5fb0a995dd | ||
|
|
58a04ce1a5 | ||
|
|
f74e0d9123 | ||
|
|
c6249b82d4 | ||
|
|
d6131c0b09 | ||
|
|
e62c810b7c | ||
|
|
2851a1a7ef | ||
|
|
12cd2709d6 | ||
|
|
bf54e58873 | ||
|
|
6b473e3a5c | ||
|
|
4b68abd963 | ||
|
|
0e764a2b3e | ||
|
|
9d1ed1eb0d | ||
|
|
a09a3465a2 | ||
|
|
001969efaf | ||
|
|
e7c515da9a | ||
|
|
8367c7dd49 | ||
|
|
55e6cae240 | ||
|
|
5553c3fb17 | ||
|
|
026265cb1e | ||
|
|
289c76a802 | ||
|
|
7c1bc1d6bc | ||
|
|
90cf0d32b5 | ||
|
|
88d934f922 | ||
|
|
abf11bb03c | ||
|
|
2d1f50303d | ||
|
|
9fb7c4091f | ||
|
|
2fdec27ab0 | ||
|
|
aff56469ed | ||
|
|
419cb7fbad | ||
|
|
7882851539 | ||
|
|
358299cf0e | ||
|
|
5a2af24869 | ||
|
|
6d35872af5 | ||
|
|
559dfdaa80 | ||
|
|
79c49bc926 | ||
|
|
76c538ad25 | ||
|
|
e76e358d98 | ||
|
|
76f37671b4 | ||
|
|
a9fc176c3c | ||
|
|
8b13e3c327 | ||
|
|
c3cd6ad2d2 | ||
|
|
3444b9c9c8 | ||
|
|
ca6fc9cd79 | ||
|
|
4747ae8b61 | ||
|
|
b6c50d63a0 | ||
|
|
52ebf2055e | ||
|
|
d0af2c2a98 | ||
|
|
10216af48a | ||
|
|
d0c8d537f5 | ||
|
|
1903aaf351 | ||
|
|
e6cdf1b995 | ||
|
|
2900d22cdc | ||
|
|
dc072d4706 | ||
|
|
8ae14f146b | ||
|
|
57444c6c3f | ||
|
|
759719d124 | ||
|
|
59782973be | ||
|
|
6c647ea91c | ||
|
|
c9763dabe1 | ||
|
|
da82754659 | ||
|
|
a3cc0ad18b | ||
|
|
2e8e5c2751 | ||
|
|
a60d83b101 | ||
|
|
6d45265763 | ||
|
|
42e84b77e1 | ||
|
|
24121cfadb | ||
|
|
93093dd288 | ||
|
|
53381c04e6 | ||
|
|
c6b64e57f1 | ||
|
|
9158426d0a | ||
|
|
cef26853df | ||
|
|
c0673884c5 | ||
|
|
c98eb64598 | ||
|
|
8836bd4f3b | ||
|
|
a58df29208 | ||
|
|
0d64a17d86 | ||
|
|
c886c09cdb | ||
|
|
e86d0007c6 | ||
|
|
624ee76e71 | ||
|
|
9406079cb7 | ||
|
|
cd2de7f893 | ||
|
|
342061803e | ||
|
|
05b8111c19 | ||
|
|
747a0b1791 | ||
|
|
c05586b53a | ||
|
|
0cfca4a618 | ||
|
|
2b8187f7ab | ||
|
|
291e7e7943 | ||
|
|
535d10f469 | ||
|
|
4cb58c0892 | ||
|
|
6721d27e3f | ||
|
|
da9dd7c423 | ||
|
|
867eb41618 | ||
|
|
6fdff13480 | ||
|
|
e581ead1ed | ||
|
|
7495206db2 | ||
|
|
fe87d16d46 | ||
|
|
0db54386cd | ||
|
|
772258b0b8 | ||
|
|
3ef002e14d | ||
|
|
b90d473ae5 | ||
|
|
f5091d524b | ||
|
|
ee5720df2c | ||
|
|
afe2037985 | ||
|
|
878cd18144 | ||
|
|
e8c8f67a09 | ||
|
|
7b29e7cf7e | ||
|
|
723d3e6871 | ||
|
|
f063dee12a | ||
|
|
db4b315d3d | ||
|
|
64d00b08a3 | ||
|
|
74736a941e | ||
|
|
c40366f20a | ||
|
|
d73e52ac2a | ||
|
|
9fac8a611f | ||
|
|
9c774a50f8 | ||
|
|
4f20ee1909 | ||
|
|
1440c5bc65 | ||
|
|
5829b2a7c1 | ||
|
|
e3c4bc18d0 | ||
|
|
8555ec2f72 | ||
|
|
8d7cefbbbe | ||
|
|
5aa5896b22 | ||
|
|
8a55bdd89d | ||
|
|
6444ef6444 | ||
|
|
701ab6cc68 | ||
|
|
3c6ce7a943 | ||
|
|
1e54afd217 | ||
|
|
4e90fd3a06 | ||
|
|
0463c6bb0f | ||
|
|
f31f986d66 | ||
|
|
c203c8302b | ||
|
|
dea4a7b389 | ||
|
|
0caf9b0706 | ||
|
|
5f655c9fd7 | ||
|
|
44aed53998 | ||
|
|
f9ff621d4a | ||
|
|
23a5a75778 | ||
|
|
a78475844a | ||
|
|
575cf2935e | ||
|
|
ae43aa1bc0 | ||
|
|
0ba71c6a47 | ||
|
|
643f7d1803 | ||
|
|
5d06da4db2 | ||
|
|
2934b09361 | ||
|
|
97341d3fa0 | ||
|
|
a95546ede0 | ||
|
|
7b44727b23 | ||
|
|
debe648a98 | ||
|
|
fda8cf77ed | ||
|
|
8aaab195c6 | ||
|
|
4096ddcbd0 | ||
|
|
ae6cc11ad2 | ||
|
|
dab7e527de | ||
|
|
8b92feac71 | ||
|
|
4beb3e5755 | ||
|
|
55f63229cd | ||
|
|
7827aeb695 | ||
|
|
cce768aaac | ||
|
|
80b83c0624 | ||
|
|
73b683bb4d | ||
|
|
d78a5c0863 | ||
|
|
683e5b6abe | ||
|
|
653b8f6352 | ||
|
|
9ec6afa375 | ||
|
|
adff5382ca | ||
|
|
704aabd703 | ||
|
|
f7b1ef0690 | ||
|
|
929982117f | ||
|
|
56a530d769 | ||
|
|
7ef75fb06b | ||
|
|
112a72abdf | ||
|
|
71813e03ee | ||
|
|
9b05b6ef28 | ||
|
|
54a87b25b3 | ||
|
|
55e97864bd | ||
|
|
95733c9490 | ||
|
|
e19ae644f1 | ||
|
|
ac4ea25267 | ||
|
|
611e4f34dc | ||
|
|
faf017f333 | ||
|
|
5eec896615 | ||
|
|
17f35174ea | ||
|
|
bf71b31123 | ||
|
|
9399a44c82 | ||
|
|
c96418806f | ||
|
|
7945eddef6 | ||
|
|
0ede390fef | ||
|
|
85959a3b9b | ||
|
|
946c3a25b9 | ||
|
|
f9d697128a | ||
|
|
532ef744f4 | ||
|
|
27a961814b | ||
|
|
5a5b65e9bf | ||
|
|
96673ad610 | ||
|
|
a9025aea0d | ||
|
|
f38ab0b973 | ||
|
|
150dac00cf | ||
|
|
bcb1a9c5d3 | ||
|
|
2e55aea584 | ||
|
|
4f5a3f0df5 | ||
|
|
e265b538cc | ||
|
|
b186504718 | ||
|
|
fc27890f13 | ||
|
|
a583939767 | ||
|
|
52e3bcfd29 | ||
|
|
85d29a3f9d | ||
|
|
18944d389d | ||
|
|
e90ac5d6a4 | ||
|
|
cb9a6ae774 | ||
|
|
3ef09aa6b2 | ||
|
|
4db22e45a2 | ||
|
|
f966d0b32c | ||
|
|
ba3879a95a | ||
|
|
c6cef0162d | ||
|
|
6d09aa86e9 | ||
|
|
b711f0f9c6 | ||
|
|
8fefb3a4c9 | ||
|
|
400cdf0f26 | ||
|
|
bce8c5a315 | ||
|
|
f44dc2dd05 | ||
|
|
df950d2fc5 | ||
|
|
5e1f804dd1 | ||
|
|
15de89f2f9 | ||
|
|
df647a415c | ||
|
|
fc66231f8e | ||
|
|
71df3e1566 | ||
|
|
168c22fc98 | ||
|
|
792ec23d7a | ||
|
|
ff625253ce | ||
|
|
8c872c6b22 | ||
|
|
541f5bc0a6 | ||
|
|
77ff7b9df0 | ||
|
|
203cc5075e | ||
|
|
7abfcd06da | ||
|
|
724f81c7f3 | ||
|
|
4d2e98af7b | ||
|
|
08221fdda7 | ||
|
|
c0f72970b9 | ||
|
|
18bc4a49e8 | ||
|
|
f90b6dbed4 | ||
|
|
d2d991ff34 | ||
|
|
190a5e175b | ||
|
|
a05f5a91b8 | ||
|
|
4d02ff27be | ||
|
|
df92b41d25 | ||
|
|
075af96338 | ||
|
|
64bbc55336 | ||
|
|
06c621acc1 | ||
|
|
d040dc19bc | ||
|
|
a38ae4a402 | ||
|
|
772063aade | ||
|
|
31c26354c5 | ||
|
|
64b331c5b2 | ||
|
|
94f8a145ec | ||
|
|
b357afa30a | ||
|
|
fee0437493 | ||
|
|
663b8864c1 | ||
|
|
c6eafdde30 | ||
|
|
f32ff95256 | ||
|
|
0452b75c3e | ||
|
|
97efd23ec8 | ||
|
|
ea3e311528 | ||
|
|
0565454419 | ||
|
|
35c79c2f29 | ||
|
|
e6089aec48 | ||
|
|
dd3f7834c3 | ||
|
|
f8cf18d880 | ||
|
|
2ac7e242b6 | ||
|
|
d8b604a94f | ||
|
|
a1f7b00981 | ||
|
|
b7ee42198c | ||
|
|
d66e4b7ff9 | ||
|
|
7f9789cf65 | ||
|
|
b41c18e033 | ||
|
|
3c73a7ec6d | ||
|
|
182c09d952 | ||
|
|
9fb86aed04 | ||
|
|
b8f7b13b05 | ||
|
|
1ee1d5b6d1 | ||
|
|
154c38c314 | ||
|
|
3c0626752a | ||
|
|
511ef77fb7 | ||
|
|
4df3ede500 | ||
|
|
e83c080af8 | ||
|
|
054220db70 | ||
|
|
97bff010a8 | ||
|
|
487a3079cd | ||
|
|
2d5158c680 | ||
|
|
837be06b72 | ||
|
|
7e0d8dd4d7 | ||
|
|
146fb23d7d | ||
|
|
61455ffe29 | ||
|
|
c267baafdc | ||
|
|
42248a306a | ||
|
|
694ec7ebe1 | ||
|
|
e3b3f8fac1 | ||
|
|
b390363b25 | ||
|
|
f6f8cdbcf2 | ||
|
|
f46f53b8a3 | ||
|
|
a2fcae4383 | ||
|
|
483f043768 | ||
|
|
f8e0f4f21f | ||
|
|
9c3613e96d | ||
|
|
d9cacdc86d | ||
|
|
aa3d2deeaa | ||
|
|
e64912545a | ||
|
|
b247be80cc | ||
|
|
343f2f1f33 | ||
|
|
2d590df900 | ||
|
|
ba56b2b9fd | ||
|
|
bf472b0c5e | ||
|
|
f7961f34c5 | ||
|
|
e369031a28 | ||
|
|
186d7bbfd9 | ||
|
|
60a11f8da5 | ||
|
|
1181fcdceb | ||
|
|
8cb9852058 | ||
|
|
53d46d1cbe | ||
|
|
275e1c8de9 | ||
|
|
d46eca4c87 | ||
|
|
2927fb1597 | ||
|
|
8c72e011d2 | ||
|
|
69662e24c3 | ||
|
|
96099ffe98 | ||
|
|
ae16b45c11 | ||
|
|
cfee87d3ef | ||
|
|
5fcf5bc635 | ||
|
|
14bcb813cc | ||
|
|
6af19794b6 | ||
|
|
8316186695 | ||
|
|
85d3023cd5 | ||
|
|
78414dee29 | ||
|
|
084135141f | ||
|
|
467a21f028 | ||
|
|
6e284c44d6 | ||
|
|
daf9a449e8 | ||
|
|
960268fd33 | ||
|
|
8c331da315 | ||
|
|
b0d626d862 | ||
|
|
a51fbd7316 | ||
|
|
063f372f3c | ||
|
|
987168b863 | ||
|
|
4ee40c3345 | ||
|
|
654daff7ce | ||
|
|
64e10e9619 | ||
|
|
b89cffe98d | ||
|
|
bd76ba702f | ||
|
|
5d52e9ce6b | ||
|
|
3c29027ca3 | ||
|
|
2ff3069d23 | ||
|
|
4198246351 | ||
|
|
2b6389b4dc | ||
|
|
d7df75ae6c | ||
|
|
11c30eccb3 | ||
|
|
ab8c6515b8 | ||
|
|
d4ad36fa41 | ||
|
|
4d688be3df | ||
|
|
d2b75f3501 | ||
|
|
46b78cb4ff | ||
|
|
5d6e0d0f37 | ||
|
|
e19d0a37bb | ||
|
|
dea3e2132e | ||
|
|
91c1ceefbd | ||
|
|
5c50989970 | ||
|
|
2a7e3b9c51 | ||
|
|
ab302df0ae | ||
|
|
21e5809993 | ||
|
|
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 |
@@ -4,14 +4,9 @@ executors:
|
|||||||
default:
|
default:
|
||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
docker:
|
docker:
|
||||||
- image: misskey/ci:latest
|
- image: misskey/ci:v11-node11
|
||||||
- image: circleci/mongo:latest
|
|
||||||
with-redis:
|
|
||||||
working_directory: /tmp/workspace
|
|
||||||
docker:
|
|
||||||
- image: misskey/ci:latest
|
|
||||||
- image: circleci/mongo:latest
|
|
||||||
- image: circleci/redis:latest
|
- image: circleci/redis:latest
|
||||||
|
- image: circleci/postgres:latest
|
||||||
docker:
|
docker:
|
||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
docker:
|
docker:
|
||||||
@@ -62,22 +57,10 @@ jobs:
|
|||||||
executor:
|
executor:
|
||||||
type: string
|
type: string
|
||||||
default: "default"
|
default: "default"
|
||||||
without_redis:
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
executor: <<parameters.executor>>
|
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: |
|
||||||
@@ -140,32 +123,14 @@ workflows:
|
|||||||
branches:
|
branches:
|
||||||
only: master
|
only: master
|
||||||
- test:
|
- test:
|
||||||
name: manual-test-with-redis
|
name: manual-test
|
||||||
executor: with-redis
|
|
||||||
requires:
|
requires:
|
||||||
- manual-build
|
- manual-build
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
ignore: master
|
ignore: master
|
||||||
- test:
|
- test:
|
||||||
name: auto-test-without-redis
|
name: auto-test
|
||||||
executor: with-redis
|
|
||||||
requires:
|
|
||||||
- auto-build
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
only: master
|
|
||||||
- test:
|
|
||||||
name: manual-test-with-redis
|
|
||||||
without_redis: true
|
|
||||||
requires:
|
|
||||||
- manual-build
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
ignore: master
|
|
||||||
- test:
|
|
||||||
name: auto-test-without-redis
|
|
||||||
without_redis: true
|
|
||||||
requires:
|
requires:
|
||||||
- auto-build
|
- auto-build
|
||||||
filters:
|
filters:
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ 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,8 +6,6 @@ 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,86 +38,80 @@ 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
|
||||||
|
|
||||||
drive:
|
# Extra Connection options
|
||||||
storage: 'db'
|
#extra:
|
||||||
|
# ssl: true
|
||||||
|
|
||||||
# OR
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
# storage: 'minio'
|
redis:
|
||||||
# bucket:
|
host: localhost
|
||||||
# prefix:
|
port: 6379
|
||||||
# config:
|
#pass: example-pass
|
||||||
# endPoint:
|
|
||||||
# port:
|
|
||||||
# useSSL:
|
|
||||||
# accessKey:
|
|
||||||
# secretKey:
|
|
||||||
|
|
||||||
# S3 example
|
# ┌─────────────────────────────┐
|
||||||
# storage: 'minio'
|
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||||
# bucket: bucket-name
|
|
||||||
# prefix: files
|
|
||||||
# config:
|
|
||||||
# endPoint: s3-us-west-2.amazonaws.com
|
|
||||||
# region: us-west-2
|
|
||||||
# useSSL: true
|
|
||||||
# accessKey: XXX
|
|
||||||
# secretKey: YYY
|
|
||||||
|
|
||||||
# S3 example (with CDN, custom domain)
|
|
||||||
# storage: 'minio'
|
|
||||||
# bucket: drive.example.com
|
|
||||||
# prefix: files
|
|
||||||
# baseUrl: https://drive.example.com
|
|
||||||
# config:
|
|
||||||
# endPoint: s3-us-west-2.amazonaws.com
|
|
||||||
# region: us-west-2
|
|
||||||
# useSSL: true
|
|
||||||
# accessKey: XXX
|
|
||||||
# secretKey: YYY
|
|
||||||
|
|
||||||
# If enabled:
|
|
||||||
# The first account created is automatically marked as Admin.
|
|
||||||
autoAdmin: true
|
|
||||||
|
|
||||||
#
|
|
||||||
# Below settings are optional
|
|
||||||
#
|
|
||||||
|
|
||||||
# Redis
|
|
||||||
#redis:
|
|
||||||
# host: localhost
|
|
||||||
# port: 6379
|
|
||||||
# pass: example-pass
|
|
||||||
|
|
||||||
# Elasticsearch
|
|
||||||
#elasticsearch:
|
#elasticsearch:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
# port: 9200
|
# port: 9200
|
||||||
# pass: null
|
# pass: null
|
||||||
|
|
||||||
|
# ┌───────────────┐
|
||||||
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|
||||||
|
# You can select the ID generation method.
|
||||||
|
# You don't usually need to change this setting, but you can
|
||||||
|
# change it according to your preferences.
|
||||||
|
|
||||||
|
# Available methods:
|
||||||
|
# aid ... Short, Millisecond accuracy
|
||||||
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
|
# ulid ... Millisecond accuracy
|
||||||
|
# objectid ... This is left for backward compatibility
|
||||||
|
|
||||||
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
|
id: 'aid'
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
# If enabled:
|
||||||
|
# The first account created is automatically marked as Admin.
|
||||||
|
autoAdmin: true
|
||||||
|
|
||||||
# Whether disable HSTS
|
# Whether disable HSTS
|
||||||
#disableHsts: true
|
#disableHsts: true
|
||||||
|
|
||||||
# Clustering
|
# Clustering
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
|
#outgoingAddressFamily: ipv4
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
var user = {
|
|
||||||
user: 'example-misskey-user',
|
|
||||||
pwd: 'example-misskey-pass',
|
|
||||||
roles: [
|
|
||||||
{
|
|
||||||
role: 'readWrite',
|
|
||||||
db: 'misskey'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
db.createUser(user);
|
|
||||||
|
|
||||||
6
.dockerignore
Executable file → Normal file
6
.dockerignore
Executable file → Normal file
@@ -5,8 +5,8 @@
|
|||||||
.vscode
|
.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
|
||||||
|
|||||||
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
patreon: syuilo
|
||||||
14
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
14
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
@@ -1,30 +1,30 @@
|
|||||||
---
|
---
|
||||||
name: Bug Report
|
name: 🐛 Bug Report
|
||||||
about: Create a report to help us improve
|
about: Create a report to help us improve
|
||||||
title: ''
|
title: ''
|
||||||
labels: bug
|
labels: ⚠️bug?
|
||||||
assignees: ''
|
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 -->
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
---
|
|
||||||
name: Client-side Bug Report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: bug, client-side
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Summary
|
|
||||||
|
|
||||||
<!-- Tell us what the bug is -->
|
|
||||||
|
|
||||||
# Expected Behavior
|
|
||||||
|
|
||||||
<!--- Tell us what should happen -->
|
|
||||||
|
|
||||||
# Actual Behavior
|
|
||||||
|
|
||||||
<!--- Tell us what happens instead of the expected behavior -->
|
|
||||||
|
|
||||||
# Steps to Reproduce
|
|
||||||
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
# Environment
|
|
||||||
|
|
||||||
<!-- Tell us where on the platform it happens -->
|
|
||||||
<!-- e.g. desktop or mobile version, your browser, your OS -->
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
name: Feature Request
|
name: ✨ Feature Request
|
||||||
about: Suggest an idea for this project
|
about: Suggest an idea for this project
|
||||||
title: ''
|
title: ''
|
||||||
labels: feature
|
labels: ✨Feature
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Summary
|
## Summary
|
||||||
|
|
||||||
<!-- Tell us what the suggestion is -->
|
<!-- Tell us what the suggestion is -->
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
---
|
|
||||||
name: Server-side Bug Report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: bug, server-side
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Summary
|
|
||||||
|
|
||||||
<!-- Tell us what the bug is -->
|
|
||||||
|
|
||||||
# Expected Behavior
|
|
||||||
|
|
||||||
<!--- Tell us what should happen -->
|
|
||||||
|
|
||||||
# Actual Behavior
|
|
||||||
|
|
||||||
<!--- Tell us what happens instead of the expected behavior -->
|
|
||||||
|
|
||||||
# Steps to Reproduce
|
|
||||||
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
# Environment
|
|
||||||
|
|
||||||
<!-- Tell us where on the platform it happens -->
|
|
||||||
<!-- e.g. your Node.js version, your OS -->
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
name: Client-side Feature Request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
title: ''
|
|
||||||
labels: client-side, feature
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Summary
|
|
||||||
|
|
||||||
<!-- Tell us what the suggestion is -->
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
name: Server-side Feature Request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
title: ''
|
|
||||||
labels: feature, server-side
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Summary
|
|
||||||
|
|
||||||
<!-- Tell us what the suggestion is -->
|
|
||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,4 +1,4 @@
|
|||||||
# Summary
|
## Summary
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
-
|
-
|
||||||
|
|||||||
25
.gitignore
vendored
25
.gitignore
vendored
@@ -1,21 +1,34 @@
|
|||||||
|
# Visual Studio Code
|
||||||
|
/.vscode
|
||||||
|
|
||||||
|
# Intelij-IDEA
|
||||||
|
/.idea
|
||||||
|
|
||||||
|
# Node.js
|
||||||
|
/node_modules
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn.lock
|
||||||
|
|
||||||
|
# config
|
||||||
/.config/*
|
/.config/*
|
||||||
!/.config/example.yml
|
!/.config/example.yml
|
||||||
!/.config/mongo_initdb_example.js
|
!/.config/mongo_initdb_example.js
|
||||||
/.vscode
|
|
||||||
/node_modules
|
# misskey
|
||||||
/build
|
/build
|
||||||
/built
|
/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
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
/files
|
||||||
|
ormconfig.json
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v11.7.0
|
v12.1.0
|
||||||
|
|||||||
673
CHANGELOG.md
673
CHANGELOG.md
@@ -1,6 +1,679 @@
|
|||||||
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`)
|
||||||
|
|
||||||
|
Migration
|
||||||
|
------------------------------
|
||||||
|
#### 1
|
||||||
|
```
|
||||||
|
npm i -g ts-node
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2
|
||||||
|
```
|
||||||
|
npm run migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
11.20.0 (2019/05/27)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 管理画面からリモートファイルのキャッシュをすべて削除できるように
|
||||||
|
* 投稿フォームに投稿のURLをペーストしようとすると引用RNにできるように
|
||||||
|
* モバイル版の投稿フォームにファイルをドロップできるように
|
||||||
|
* モバイル版でも投稿の下書き自動保存ができるように
|
||||||
|
* リモートファイルのキャッシュが期限切れになったときにサムネイルが無くならないように
|
||||||
|
* ジョブキュー管理画面を強化
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 投稿内のローカルなURLプレビューをクリックしたとき not found になることがある問題を修正
|
||||||
|
* デスクトップでユーザーページに遷移するときページが再度読み込みされることがある問題を修正
|
||||||
|
* フォロー申請自動承認オプションが常にオフで表示される問題を修正
|
||||||
|
* ポートを設定せずに起動したときに適切なエラーメッセージが表示されない問題を修正
|
||||||
|
* i18n
|
||||||
|
|
||||||
|
11.19.1 (2019/05/26)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* タグページを遷移してもタイムラインが変わらない問題を修正
|
||||||
|
* インスタンス名を空にしてもMisskeyロゴが表示されない問題を修正
|
||||||
|
* 投稿内のローカルなURLをクリックしたとき not found になることがある問題を修正
|
||||||
|
* npm run init がプロセス終了しない問題を修正
|
||||||
|
|
||||||
|
11.19.0 (2019/05/25)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* グループのオーナーを変えられるように
|
||||||
|
* PagesでURLプレビューを表示するように
|
||||||
|
* サーバーログを削除できるように
|
||||||
|
* リンク先が同じインスタンスの投稿内のURLをクリックしたときは新しいタブで開かないように
|
||||||
|
* PostgreSQLの接続オプションを設定ファイルで設定できるように
|
||||||
|
* いくつかのAPIでのパフォーマンスを向上
|
||||||
|
* ユーザビリティの向上
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* デッキでユーザーページを遷移したときに前のユーザーのタイムラインが残り続ける問題を修正
|
||||||
|
* デッキでフォロー申請が見れない問題を修正
|
||||||
|
* グループ情報が更新できない問題を修正
|
||||||
|
* Firefoxでトークの下が隠れてしまう問題を修正
|
||||||
|
* トーク履歴がないと履歴が読み込み中のままになる問題を修正
|
||||||
|
* 通知で長い名前のユーザーがいると横スクロールが発生する問題を修正
|
||||||
|
* iOSでの選択ダイアログの動作を修正
|
||||||
|
|
||||||
|
11.18.1 (2019/05/21)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 11.18.0からフォロー/フォロワーのもっと読み込む機能が作動していない問題を修正
|
||||||
|
* iOSで投稿フォームに自動フォーカスしない問題を修正
|
||||||
|
* ダークモードでグループ名がみにくい問題を修正
|
||||||
|
* ハッシュタグタイムラインを読み込んだ時にプログレスバーが残り続ける問題を修正
|
||||||
|
* ユーザビリティの修正
|
||||||
|
|
||||||
|
11.18.0 (2019/05/21)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 投稿の削除が連合しない問題を修正
|
||||||
|
|
||||||
|
11.17.1 (2019/05/20)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* トークの通知インジケーターが点灯し続ける問題を修正
|
||||||
|
* ユーザーグループの読み込みでエラーになることがある問題を修正
|
||||||
|
|
||||||
|
11.17.0 (2019/05/19)
|
||||||
|
--------------------
|
||||||
|
### 注意
|
||||||
|
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* ユーザーグループを招待制に
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* フォロー申請が表示されない問題を修正
|
||||||
|
* トークの通知インジケーターが点灯し続ける問題を修正
|
||||||
|
* 自分を自分のグループから削除できる問題を修正
|
||||||
|
* 新しいタブでグループトークを開くことができない問題を修正
|
||||||
|
|
||||||
|
11.16.1 (2019/05/19)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* Dockerで起動できない問題を修正
|
||||||
|
|
||||||
|
11.16.0 (2019/05/19)
|
||||||
|
--------------------
|
||||||
|
### 注意
|
||||||
|
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* ユーザーグループ機能を追加
|
||||||
|
* ページに「いいね」できるように
|
||||||
|
* UIの改善
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* トークを読み込むときに最大数指定できなかった問題を修正
|
||||||
|
|
||||||
|
11.15.0 (2019/05/16)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 管理画面でreCAPTCHAのプレビューを表示するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* オブジェクトストレージのリージョンの設定が反映されない問題を修正
|
||||||
|
|
||||||
|
11.14.0 (2019/05/16)
|
||||||
|
--------------------
|
||||||
|
### 注意
|
||||||
|
このバージョンからオブジェクトストレージの設定は設定ファイルではなく管理画面から行うようになりました。
|
||||||
|
オブジェクトストレージを使用している場合、アップデートした後管理画面にアクセスしオブジェクトストレージの設定を再度行ってください。
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* 特定のユーザーのファイルをすべて削除できるように
|
||||||
|
* インスタンスの設定画面を整理
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* GIF画像のサムネイルが生成されないのを修正
|
||||||
|
* 管理画面の「ログ」で複数の除外条件を設定できない問題を修正
|
||||||
|
|
||||||
|
11.13.0 (2019/05/14)
|
||||||
|
--------------------
|
||||||
|
### 注意
|
||||||
|
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* 利用規約URL、リポジトリURL、フィードバックURLを設定できるように
|
||||||
|
* 特定のインスタンスのファイルをすべて削除できるように
|
||||||
|
* _blankで外部リンクされる可能性がある箇所にnoopenerを追加
|
||||||
|
* ユーザーや外部インスタンスが生成するリンクにnofollowを追加
|
||||||
|
* リモートのユーザーページやノートページにnoindexを追加
|
||||||
|
* 自分のユーザーメニューにはミュートなどを表示しないように
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* インスタンスブロックを設定できない問題を修正
|
||||||
|
* ピン留め投稿の表示順がおかしい問題を修正
|
||||||
|
* 設定の「アップデートを確認」でメッセージが正しく表示されない問題を修正
|
||||||
|
* Firefoxで自分のメニューが開けない問題を修正
|
||||||
|
* Welcomeページのタグクラウドが動かない問題を修正
|
||||||
|
|
||||||
|
11.12.0 (2019/05/10)
|
||||||
|
--------------------
|
||||||
|
### 注意
|
||||||
|
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||||
|
|
||||||
|
### ✨ Improvements
|
||||||
|
* インスタンス運営者がおすすめアカウントを設定できるように
|
||||||
|
* MisskeyPagesでNAME環境変数がNULLにならないように
|
||||||
|
* MisskeyPagesにNULL環境変数を追加
|
||||||
|
* MisskeyPagesで変数を並べ替えられるように
|
||||||
|
* MisskeyPagesのテキストのリスト内で変数埋め込みできるように
|
||||||
|
* 自分の指定した投稿のRenoteを全て解除するAPIを追加
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* Noteをpull取得した時にhost名がvalidateされていない問題を修正
|
||||||
|
* みつけるで人気のタグが表示されない問題を修正
|
||||||
|
|
||||||
|
### その他
|
||||||
|
* アカウントのisVerifiedフラグを廃止
|
||||||
|
|
||||||
|
11.11.2 (2019/05/07)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* IPv4 onlyホストからDualstackホストにAP deliverできない問題を修正
|
||||||
|
* ストリーミングに接続するまでラグがある問題を修正
|
||||||
|
* 2段階認証のコードが0から始まる時正しく入力できない問題を修正
|
||||||
|
* ユーザーの更新日時が新しい順で更新日時がnullのユーザーが先頭に来る問題を修正
|
||||||
|
* 値選択時の問題を修正
|
||||||
|
* リバーシでマップの変更が反映されない問題を修正
|
||||||
|
* リバーシで対局終了直後に盤面を巻き戻してもすぐ最終ターンまでリセットされる問題を修正
|
||||||
|
|
||||||
|
11.11.1 (2019/05/05)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* MisskeyPagesのリストから選択関数が使えない問題を修正
|
||||||
|
|
||||||
|
11.11.0 (2019/05/05)
|
||||||
|
--------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* MisskeyPagesにリストから選択関数を追加
|
||||||
|
* MisskeyPagesに確率を指定できるテキストランダム選択関数を追加
|
||||||
|
* 外部サービス連携ログインリンクにアイコン追加
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* MisskeyPagesでifを入れ子にできなくなっていた問題を修正
|
||||||
|
* MisskeyPagesで数値入力を作成するとテキスト入力になる問題を修正
|
||||||
|
* 外部サービス連携に関する問題を修正
|
||||||
|
|
||||||
|
11.10.1 (2019/05/04)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* MisskeyPagesでページブロックを削除できなくなっていた問題を修正
|
||||||
|
|
||||||
|
### その他
|
||||||
|
* Node.js v12対応
|
||||||
|
|
||||||
|
11.10.0 (2019/05/03)
|
||||||
|
--------------------
|
||||||
|
### 注意
|
||||||
|
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||||
|
|
||||||
|
### ✨ Improvements
|
||||||
|
* MisskeyPagesに割った余りを求める関数を追加
|
||||||
|
* Mastodon v2.8.0 のフォローリストをインポートできるように
|
||||||
|
* エクスポートリクエストに失敗したらエラーを表示するように
|
||||||
|
* エクスポートファイルでは同一ハッシュチェックをしないように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 2段階認証を設定するとログインできなくなる問題を修正
|
||||||
|
* ファイルをアップロードできないことがある問題を修正
|
||||||
|
* リモートファイルをキャッシュしない設定だとサムネイル時にオリジナル画像が表示されない問題を修正
|
||||||
|
* 外部サービス連携の不具合を修正
|
||||||
|
|
||||||
|
11.9.0 (2019/05/02)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* MisskeyPagesで編集時にページブロックをドラッグで並べ替えられるように
|
||||||
|
* MisskeyPagesにカウンターボタンブロックを追加
|
||||||
|
|
||||||
|
11.8.1 (2019/05/02)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* リモートファイルをキャッシュしないオプション有効時にファイルが作成できない問題を修正
|
||||||
|
|
||||||
|
11.8.0-2 (2019/05/01)
|
||||||
|
-------------------
|
||||||
|
* 11.8.0 のリリース内容が 11.7.0 と同一だったのを修正
|
||||||
|
|
||||||
|
11.8.0 (2019/05/01)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* MisskeyPagesで関数を作成できるように
|
||||||
|
* MisskeyPagesでソースを表示できるように
|
||||||
|
* MisskeyPagesにシードを与えるランダム関数を追加
|
||||||
|
* MisskeyPagesに複数行テキストをテキストのリストに変換する関数を追加
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* APIドキュメントが見れなくなっていたのを修正
|
||||||
|
* mention (あなた宛て) streaming にミュートが効かない問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
11.7.0 (2019/04/30)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* MisskeyPagesに ifブロック を追加
|
||||||
|
* MisskeyPagesに テキストエリア を追加
|
||||||
|
* MisskeyPagesに 複数行テキスト入力 を追加
|
||||||
|
* MisskeyPagesに 投稿フォーム を追加
|
||||||
|
* MisskeyPagesに 変換系関数 を追加
|
||||||
|
* MisskeyPagesに 環境変数 URL を追加
|
||||||
|
* MisskeyPagesでボタンやスイッチなどのテキストに変数使えるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* OGPのサイト名を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
11.6.0 (2019/04/29)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* AiScriptにいくつかの文字列操作関数を追加
|
||||||
|
* ページ編集画面にページへのリンクを表示するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* MisskeyPagesで数値入力が文字列として扱われる問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
11.5.1 (2019/04/29)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* MisskeyPagesで環境変数を別の変数内で使えない問題を修正
|
||||||
|
* MisskeyPagesで値が0の変数が表示されない問題を修正
|
||||||
|
|
||||||
|
11.5.0 (2019/04/29)
|
||||||
|
-------------------
|
||||||
|
### 注意
|
||||||
|
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](migration)の手順を実行してください
|
||||||
|
|
||||||
|
### New features
|
||||||
|
#### MisskeyPages
|
||||||
|
ページ(記事)を作成できるように。
|
||||||
|
|
||||||
|
* 後から何度でも編集できる
|
||||||
|
* アイキャッチを設定できる
|
||||||
|
* フォントを設定できる
|
||||||
|
* 画像を好きな位置に挿入できる
|
||||||
|
* URLを決められる
|
||||||
|
* タイトルを設定できる
|
||||||
|
* 見出しを設定できる
|
||||||
|
* ページの要約を設定できる(URLプレビュー時などに便利)
|
||||||
|
* 変数や式(aka AiScript)を使用して動的なページも作れる
|
||||||
|
* 目次自動生成(coming soon)
|
||||||
|
|
||||||
|
ページを気に入ったら「いいね」しよう (coming soon)
|
||||||
|
|
||||||
|
### ✨ Improvements
|
||||||
|
* APIコンソールでパラメータテンプレートを表示するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* おすすめユーザーに自分自身が含まれる問題を修正
|
||||||
|
* ユーザーサジェストで表示名が変わらない問題を修正
|
||||||
|
|
||||||
|
11.4.0 (2019/04/25)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* 検索でローカルの投稿のみに絞れるように
|
||||||
|
* 検索で特定のインスタンスの投稿のみに絞れるように
|
||||||
|
* 検索で特定のユーザーの投稿のみに絞れるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 投稿が増殖する問題を修正
|
||||||
|
* ストリームで過去の投稿が流れてくる問題を修正
|
||||||
|
* モバイル版のユーザーページで遷移してもユーザー名が変わらない問題を修正
|
||||||
|
* お知らせを切り替えても内容が変わらない問題を修正
|
||||||
|
|
||||||
|
11.3.1 (2019/04/24)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* Webからファイルがアップロードできない問題を修正
|
||||||
|
|
||||||
|
11.3.0 (2019/04/24)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* お知らせにMFMを使えるように
|
||||||
|
* お知らせに画像を添付できるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 投稿のタグ検索APIで大文字小文字が区別されていたのを修正
|
||||||
|
* 公開範囲がホームの投稿がグローバルTLに流れる問題を修正
|
||||||
|
* モバイルビューの投稿詳細にて acct が長いとアイコンが圧迫面接される問題を修正
|
||||||
|
|
||||||
|
11.2.2 (2019/04/22)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 2段階認証を有効にするとログインできない問題を修正
|
||||||
|
* リモートユーザーの修復処理が自動的に実行されない問題を修正
|
||||||
|
* リモートユーザー情報が更新されない問題を修正
|
||||||
|
|
||||||
|
11.2.1 (2019/04/21)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* MEIDが25桁になっているのを修正
|
||||||
|
* リモートユーザー情報が更新されない問題を修正
|
||||||
|
|
||||||
|
11.2.0 (2019/04/18)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* 検索で日付(日時)を入力するとタイムラインをその時点まで遡るように
|
||||||
|
* APIコンソールでエンドポイントをサジェストするように
|
||||||
|
* モバイル版でドライブのメニューを使いやすく
|
||||||
|
* サイレンス時に確認を表示するように
|
||||||
|
* ユーザーメニューでブロックなどの操作を行う時に確認するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* アプリケーション連携画面でパーミッションが表示されない問題を修正
|
||||||
|
* アンケートウィジットでもMFMを使用するように
|
||||||
|
* フォローしてないユーザーのホーム投稿がSTLに流れてくる問題を修正
|
||||||
|
* モバイル版でウィジェットを設定できない問題を修正
|
||||||
|
* スプラッシュがクリックに反応するように
|
||||||
|
|
||||||
|
11.1.6 (2019/04/18)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 未認知ユーザーからActivityが飛んできた場合に処理できない問題を修正
|
||||||
|
* その投稿を見たのにも関わらずメンションインジケーターが点灯し続ける問題を修正
|
||||||
|
* ハッシュタグの判定を改善
|
||||||
|
* サーバーのエラーハンドリングを改善
|
||||||
|
|
||||||
|
11.1.5 (2019/04/17)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* ユーザー名に含まれているカスタム絵文字が表示されないことがある問題を修正
|
||||||
|
* 壁紙の設定ができない問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
11.1.4 (2019/04/17)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* タイムライン取得時に削除されたファイルを添付している投稿が含まれているとサーバーでエラーになる問題を修正
|
||||||
|
* 管理画面のインスタンスメニューで変更前の設定が読み込まれないことがある問題を修正
|
||||||
|
* 猫ではないのに猫のままで表示される問題を修正
|
||||||
|
* admin/driveのアイコンがずれてる問題を修正
|
||||||
|
* チャートで大きな数値を扱えない問題を修正
|
||||||
|
* UIの修正
|
||||||
|
|
||||||
|
11.1.3 (2019/04/16)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* アプリからAPIにリクエストするときにランダムなユーザーがリクエストしたことになる問題を修正
|
||||||
|
|
||||||
|
11.1.2 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 画像描画の依存関係を変更
|
||||||
|
* リモートユーザーのファイルを削除するときに古い方からではなく新しい方から削除されるのを修正
|
||||||
|
* リアクションしてないのにリアクションしたことになる問題を修正
|
||||||
|
* APIドキュメントの修正
|
||||||
|
|
||||||
|
11.1.1 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* Metaタグの application-name を Misskey で固定するように修正
|
||||||
|
* トークメッセージが既読にならない問題を修正
|
||||||
|
* デフォルトでHTLを表示するように
|
||||||
|
|
||||||
|
11.1.0 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* アイコン未設定時にランダムな画像を表示するように
|
||||||
|
* 管理者やモデレーターはレートリミット無効に
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* メンションの「あなた」インジケーターが表示されない問題を修正
|
||||||
|
* ブロックAPIでエラーが発生する問題を修正
|
||||||
|
* プッシュ通知の購読に失敗する問題を修正
|
||||||
|
|
||||||
|
11.0.3 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* ハッシュタグ検索APIが動作しない問題を修正
|
||||||
|
* モデレーターなのにアカウントメニューに「管理」が表示されない問題を修正
|
||||||
|
* プッシュ通知の購読に失敗する問題を修正
|
||||||
|
* ユーザー取得APIでユーザーを指定しない場合エラーになる問題を修正
|
||||||
|
|
||||||
|
11.0.2 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* アプリが作成できない問題を修正
|
||||||
|
* 「ハイライト」が表示されない問題を修正
|
||||||
|
* リモートの投稿に添付されている画像が小さい問題を修正
|
||||||
|
* モバイル版でリストの名前が表示されない問題を修正
|
||||||
|
* APIドキュメントにパーミッション一覧を追加
|
||||||
|
|
||||||
|
11.0.1 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* 不要な依存関係を削除
|
||||||
|
|
||||||
|
11.0.0 daybreak (2019/04/14)
|
||||||
|
----------------------------
|
||||||
|
### ✨ Improvements
|
||||||
|
* **データベースがMongoDBからPostgreSQLに変更されました**
|
||||||
|
* **Redisが必須に**
|
||||||
|
* アカウントを完全に削除できるように
|
||||||
|
* 投稿フォームで添付ファイルの閲覧注意を確認/設定できるように
|
||||||
|
* ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* フォロー申請数が実際より1すくなくなる問題を修正
|
||||||
|
* リストからアカウント削除したユーザーを削除できない問題を修正
|
||||||
|
* リストTLでフォローしていないユーザーの非公開投稿が流れる問題を修正
|
||||||
|
* リストTLでダイレクト投稿が流れない問題を修正
|
||||||
|
* ミュートしているユーザーの投稿がタイムラインに流れてくることがある問題を修正
|
||||||
|
|
||||||
|
### APIの破壊的変更
|
||||||
|
* v10時点で deprecated だったパラメータなどを削除
|
||||||
|
* ユーザーリストの title が name に
|
||||||
|
* リバーシの対局の`settings`プロパティがなくなり、その中にあったプロパティがすべて上の階層に
|
||||||
|
* 例えば`game.settings.map`は`game.map`になる
|
||||||
|
|
||||||
|
### 既知の問題
|
||||||
|
* ユーザー認証無しでのアプリが作成できない
|
||||||
|
* 依存ライブラリの問題と思わるため、対応が難しい
|
||||||
|
|
||||||
|
### Migration
|
||||||
|
#### 移行の注意点
|
||||||
|
**以下のデータは引き継がれません**
|
||||||
|
* 通知
|
||||||
|
* リモートの投稿
|
||||||
|
* リバーシの対局
|
||||||
|
|
||||||
|
#### 手順
|
||||||
|
1. v11をインストールしたい場所に syuilo/misskey をクローン
|
||||||
|
2. config を設定する
|
||||||
|
* PostgreSQL(`db`)の設定とは別に、v10からMongoDBの設定をコピペしてくる(例は下にあります)
|
||||||
|
* `id`の設定を`meid`または`objectid`にする
|
||||||
|
|
||||||
|
``` yml
|
||||||
|
db:
|
||||||
|
host: localhost
|
||||||
|
port: 5432
|
||||||
|
db: misskey
|
||||||
|
user: x
|
||||||
|
pass: x
|
||||||
|
|
||||||
|
mongodb:
|
||||||
|
user: x
|
||||||
|
pass: x
|
||||||
|
host: localhost
|
||||||
|
port: 27017
|
||||||
|
db: misskey
|
||||||
|
```
|
||||||
|
3. migration ブランチに切り替え
|
||||||
|
4. `npm i`
|
||||||
|
5. `npm run build`
|
||||||
|
6. `npm run init`
|
||||||
|
7. `npm run migrate`
|
||||||
|
8. master ブランチに戻す
|
||||||
|
9. enjoy
|
||||||
|
|
||||||
|
10.100.0
|
||||||
|
----------
|
||||||
|
* ユーザーリストでフォローボタンを表示するように
|
||||||
|
* ドライブのファイルのサムネイルを修正
|
||||||
|
* 投稿ウィジットでローカルのみの公開範囲で投稿できない問題を修正
|
||||||
|
* TLを遡った時に抜けがある時がある問題を修正
|
||||||
|
* ユーザータイムラインが投稿日時順ではなくなっているのを修正
|
||||||
|
* 10.99.0 でチャートのレンダリングがおかしい問題を修正
|
||||||
|
|
||||||
|
10.99.0
|
||||||
|
----------
|
||||||
|
* manifest.json にインスタンス名を反映させるように
|
||||||
|
* Metaに投稿やユーザーのIDを設定するように
|
||||||
|
* 設定でポートが指定されていない場合、環境変数を参照するように
|
||||||
|
* フォローインポートで途中にエラーになるユーザーがいると途中で終了してしまう問題を修正
|
||||||
|
* フォローインポートで自分が含まれていた場合自分をフォローしてしまう問題を修正
|
||||||
|
* ServiceWorkerの設定がUIで有効にならない問題を修正
|
||||||
|
* ユーザー一覧でのユーザーの自己紹介が複数行になることがある問題を修正
|
||||||
|
* フォローインポートでAPI limitに達していても正常にリクエストされたように表示されてしまう問題を修正
|
||||||
|
* DBに保存されたrepository urlを変更する方法がない問題を修正
|
||||||
|
* デスクトップDeckだとviaが投稿内に2箇所表示される問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
* 依存関係の更新
|
||||||
|
* ローカリゼーション
|
||||||
|
|
||||||
|
10.98.3
|
||||||
|
----------
|
||||||
|
* リアクションのカスタム絵文字の情報がNoteに添付されない問題を修正
|
||||||
|
* フォルダーの移動をするとき親フォルダーに自分自身を指定できてしまう問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.98.2
|
||||||
|
----------
|
||||||
|
* 他のインスタンスから添付画像が見れない問題を修正
|
||||||
|
|
||||||
|
10.98.1
|
||||||
|
----------
|
||||||
|
* ドライブのファイルのサムネイルが表示されない問題を修正
|
||||||
|
* APでカスタム絵文字を送る時に常にimage/pngで送っている問題を修正
|
||||||
|
* いくらいじってもページリロードするとmisskeyのテーマがdark(future)になっちゃう問題を修正
|
||||||
|
|
||||||
|
10.98.0
|
||||||
|
----------
|
||||||
|
* ドライブのファイルダウンロード時に元のファイル名を尊重するように
|
||||||
|
* ドライブで画像以外のファイルを分かりやすく表示するように
|
||||||
|
* TwemojiのCDNを変更
|
||||||
|
* モバイルで通知の設定がない問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.97.2
|
||||||
|
----------
|
||||||
|
* ビルド時に警告が出ないように修正
|
||||||
|
|
||||||
|
10.97.1
|
||||||
|
----------
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.97.0
|
||||||
|
----------
|
||||||
|
* リアクションに絵文字やカスタム絵文字を使えるように
|
||||||
|
* 不明なリアクションのフォールバックに star を使えるように
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.96.0
|
||||||
|
----------
|
||||||
|
* 連合ユーザーの投稿に対してActivityPubオブジェクトを要求されたら元のインスタンスにリダイレクトするように
|
||||||
|
* updatePersonを試行した時点でもlastFetchedAtを更新するように
|
||||||
|
* 管理画面でリモートインスタンスの登録日時を表示
|
||||||
|
* ユーザーサジェストが機能しなくなっていた問題を修正
|
||||||
|
* 最近使ったハッシュタグ表示が機能していない問題を修正
|
||||||
|
* バグ修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.95.0
|
||||||
|
----------
|
||||||
|
* ジョブを一覧できるように
|
||||||
|
* MFMでURLを明示する構文の追加
|
||||||
|
* Articleタイプのアクティビティを受け入れるように
|
||||||
|
* 凍結されたユーザーをサジェストしないように
|
||||||
|
* ファビコンが保存されないのを修正
|
||||||
|
* キューのジョブクリアの動作を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.94.0
|
||||||
|
----------
|
||||||
|
* Faviconを設定できるように
|
||||||
|
* アカウントを凍結したときすべてのフォローを解除するように
|
||||||
|
* シェアページが機能していない問題を修正
|
||||||
|
* インスタンスブロックをしていてもRenote等すると取得されてしまう問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.93.1
|
||||||
|
----------
|
||||||
|
* データのエクスポートとインポートの動作を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.93.0
|
||||||
|
----------
|
||||||
|
* フォローリストをインポートできるように
|
||||||
|
* embedプレイヤーを閉じれるように
|
||||||
|
* リストをインポートしたときにプロキシアカウントがフォローするように修正
|
||||||
|
* Web Share Targetの動作を修正
|
||||||
|
* おすすめアンケートのチョイスを修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.92.4
|
||||||
|
----------
|
||||||
|
* リストのエクスポートをできるように
|
||||||
|
* ジョブキューウィジェットを追加
|
||||||
|
* URLプレビューのサムネイルが表示されないことがある問題を修正
|
||||||
|
|
||||||
|
10.92.3
|
||||||
|
----------
|
||||||
|
* 管理画面の各種ジョブ数がおかしい問題を修正
|
||||||
|
* ジョブキューの動作を調整
|
||||||
|
|
||||||
|
10.92.2
|
||||||
|
----------
|
||||||
|
* 管理画面で各種ジョブ数を一覧できるように
|
||||||
|
* ジョブキューの動作を修正
|
||||||
|
* notes/children が遅い問題を修正
|
||||||
|
|
||||||
|
10.92.1
|
||||||
|
----------
|
||||||
|
* アンケートの結果をリモートと同期するように
|
||||||
|
* ジョブキューを有効に
|
||||||
|
* 投稿の返信一覧に引用Renoteも含めるように
|
||||||
|
* robots.txt追加
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.92.0
|
||||||
|
----------
|
||||||
|
* Mastodonのアンケートに対応
|
||||||
|
* 複数回答できるアンケートを作成できるように
|
||||||
|
* アンケートに期限を設定できるように
|
||||||
|
* 絵文字ピッカーを改良
|
||||||
|
* ハッシュタグの判定を改善
|
||||||
|
* デッキのタグTLで別のタグをクリックしてもTLが変わらない問題を修正
|
||||||
|
* ユーザーサジェストで表示名が変わらない問題を修正
|
||||||
|
* UIのバグ修正
|
||||||
|
* デザインの調整
|
||||||
|
* など
|
||||||
|
|
||||||
|
10.91.2
|
||||||
|
----------
|
||||||
|
* 10.91.1 で追加した依存関係にXSS脆弱性があったので他のパッケージに差し替え
|
||||||
|
* 初期アクセスでテーマが正しく設定されない問題を修正
|
||||||
|
|
||||||
|
10.91.1
|
||||||
|
----------
|
||||||
|
* ログビューを強化
|
||||||
|
* テーマの切り替えをなめらかに
|
||||||
|
* SVGの判定を修正
|
||||||
|
|
||||||
10.91.0
|
10.91.0
|
||||||
----------
|
----------
|
||||||
* ログを管理画面で見れるように
|
* ログを管理画面で見れるように
|
||||||
|
|||||||
173
CONTRIBUTING.md
173
CONTRIBUTING.md
@@ -3,11 +3,17 @@
|
|||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues .
|
Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues .
|
||||||
Before creating a new issue, please search existing issues to avoid duplication.
|
|
||||||
If you find the existing issue, please add your reaction or comment to the issue.
|
* Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one.
|
||||||
|
* If you have multiple independent issues, please submit them separately.
|
||||||
|
|
||||||
|
|
||||||
## Localization (l10n)
|
## Localization (l10n)
|
||||||
Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
||||||
|
You can improve our translations with your Crowdin account.
|
||||||
|
Changes you make in Crowdin will be merged into develop branch.
|
||||||
|
|
||||||
|
If you can't find the language you want to contribute with, please open an issue.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -15,16 +21,16 @@ Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
|||||||
Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
|
Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
* Documents for contributors are located in `/docs`.
|
* Documents for contributors are located in [`/docs`](/docs).
|
||||||
* Documents for instance admins are located in `/docs`.
|
* Documents for instance admins are located in [`/docs`](/docs).
|
||||||
* Documents for end users are located in `src/docs`.
|
* Documents for end users are located in [`/src/docs`](/src/docs).
|
||||||
|
|
||||||
## Test
|
## Test
|
||||||
* Test codes are located in `/test`.
|
* Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses CircleCI for automated test.
|
Misskey uses CircleCI for automated test.
|
||||||
Configuration files are located in `/.circleci`.
|
Configuration files are located in [`/.circleci`](/.circleci).
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
### AP
|
### AP
|
||||||
@@ -46,7 +52,40 @@ Convert な(na) to にゃ(nya)
|
|||||||
Revert Nyaize
|
Revert Nyaize
|
||||||
|
|
||||||
## Code style
|
## Code style
|
||||||
### Don't use `export default`
|
### セミコロンを省略しない
|
||||||
|
ASI Hazardを避けるためでもある
|
||||||
|
|
||||||
|
### 中括弧を省略しない
|
||||||
|
Bad:
|
||||||
|
``` ts
|
||||||
|
if (foo)
|
||||||
|
bar;
|
||||||
|
else
|
||||||
|
baz;
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
``` ts
|
||||||
|
if (foo) {
|
||||||
|
bar;
|
||||||
|
} else {
|
||||||
|
baz;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
ただし**`if`が一行**の時だけは省略しても良い
|
||||||
|
Good:
|
||||||
|
``` ts
|
||||||
|
if (foo) bar;
|
||||||
|
```
|
||||||
|
|
||||||
|
### `export default`を使わない
|
||||||
|
インテリセンスと相性が悪かったりするため
|
||||||
|
|
||||||
|
参考:
|
||||||
|
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
||||||
|
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
||||||
|
|
||||||
Bad:
|
Bad:
|
||||||
``` ts
|
``` ts
|
||||||
export default function(foo: string): string {
|
export default function(foo: string): string {
|
||||||
@@ -72,3 +111,119 @@ src ... Source code
|
|||||||
test ... Test code
|
test ... Test code
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
### placeholder
|
||||||
|
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
query.andWhere(new Brackets(qb => {
|
||||||
|
for (const type of ps.fileType) {
|
||||||
|
qb.orWhere(`:type = ANY(note.attachedFileTypes)`, { type: type });
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
と書くと、ループ中で`type`というプレースホルダが複数回使われてしまいおかしくなる
|
||||||
|
だから次のようにする必要がある
|
||||||
|
```ts
|
||||||
|
query.andWhere(new Brackets(qb => {
|
||||||
|
for (const type of ps.fileType) {
|
||||||
|
const i = ps.fileType.indexOf(type);
|
||||||
|
qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
|
||||||
|
### Not `null` in TypeORM
|
||||||
|
```ts
|
||||||
|
const foo = await Foos.findOne({
|
||||||
|
bar: Not(null)
|
||||||
|
});
|
||||||
|
```
|
||||||
|
のようなクエリ(`bar`が`null`ではない)は期待通りに動作しない。
|
||||||
|
次のようにします:
|
||||||
|
```ts
|
||||||
|
const foo = await Foos.findOne({
|
||||||
|
bar: Not(IsNull())
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### `null` in SQL
|
||||||
|
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||||
|
```
|
||||||
|
という処理で、`ps.folderId`が`null`だと結果的に`file.folderId = null`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||||
|
だから次のようにする必要がある
|
||||||
|
``` ts
|
||||||
|
if (ps.folderId) {
|
||||||
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||||
|
} else {
|
||||||
|
query.where('file.folderId IS NULL');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `[]` in SQL
|
||||||
|
SQLを発行する際、`IN`のパラメータが`[]`(空の配列)になる可能性のある場合はSQL文を出し分けなければならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
const users = await Users.find({
|
||||||
|
id: In(userIds)
|
||||||
|
});
|
||||||
|
```
|
||||||
|
という処理で、`userIds`が`[]`だと結果的に`user.id IN ()`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||||
|
だから次のようにする必要がある
|
||||||
|
``` ts
|
||||||
|
const users = userIds.length > 0 ? await Users.find({
|
||||||
|
id: In(userIds)
|
||||||
|
}) : [];
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配列のインデックス in SQL
|
||||||
|
SQLでは配列のインデックスは**1始まり**。
|
||||||
|
`[a, b, c]`の `a`にアクセスしたいなら`[0]`ではなく`[1]`と書く
|
||||||
|
|
||||||
|
### `undefined`にご用心
|
||||||
|
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||||
|
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
||||||
|
|
||||||
|
### 簡素な`undefined`チェック
|
||||||
|
データベースからレコードを取得するときに、プログラムの流れ的に(ほぼ)絶対`undefined`にはならない場合でも、`undefined`チェックしないとTypeScriptに怒られます。
|
||||||
|
でもいちいち複数行を費やして、発生するはずのない`undefined`をチェックするのも面倒なので、`ensure`というユーティリティ関数を用意しています。
|
||||||
|
例えば、
|
||||||
|
``` ts
|
||||||
|
const user = await Users.findOne(userId);
|
||||||
|
// この時点で user の型は User | undefined
|
||||||
|
if (user == null) {
|
||||||
|
throw 'missing user';
|
||||||
|
}
|
||||||
|
// この時点で user の型は User
|
||||||
|
```
|
||||||
|
という処理を`ensure`を使うと
|
||||||
|
``` ts
|
||||||
|
const user = await Users.findOne(userId).then(ensure);
|
||||||
|
// この時点で user の型は User
|
||||||
|
```
|
||||||
|
という風に書けます。
|
||||||
|
もちろん`ensure`内部でエラーを握りつぶすようなことはしておらず、万が一`undefined`だった場合はPromiseがRejectされ後続の処理は実行されません。
|
||||||
|
``` ts
|
||||||
|
const user = await Users.findOne(userId).then(ensure);
|
||||||
|
// 万が一 Users.findOne の結果が undefined だったら、ensure でエラーが発生するので
|
||||||
|
// この行に到達することは無い
|
||||||
|
// なので、.then(ensure) は
|
||||||
|
// if (user == null) {
|
||||||
|
// throw 'missing user';
|
||||||
|
// }
|
||||||
|
// の糖衣構文のような扱いです
|
||||||
|
```
|
||||||
|
|
||||||
|
### Migration作成方法
|
||||||
|
コードの変更をした後、`ormconfig.json`(`npm run ormconfig`で生成)を用意し、
|
||||||
|
|
||||||
|
```
|
||||||
|
npm i -g ts-node
|
||||||
|
ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
||||||
|
```
|
||||||
|
|
||||||
|
作成されたスクリプトは不必要な変更を含むため除去してください。
|
||||||
|
|||||||
10
Dockerfile
10
Dockerfile
@@ -1,4 +1,4 @@
|
|||||||
FROM node:11-alpine AS base
|
FROM node:12.1-alpine AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
@@ -21,11 +21,11 @@ RUN apk add --no-cache \
|
|||||||
pkgconfig \
|
pkgconfig \
|
||||||
python \
|
python \
|
||||||
zlib-dev
|
zlib-dev
|
||||||
RUN npm i -g yarn
|
|
||||||
|
|
||||||
|
COPY package.json ./
|
||||||
|
RUN npm i
|
||||||
COPY . ./
|
COPY . ./
|
||||||
RUN yarn install
|
RUN npm run build
|
||||||
RUN yarn build
|
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
|
|
||||||
@@ -39,4 +39,4 @@ COPY --from=builder /misskey/node_modules ./node_modules
|
|||||||
COPY --from=builder /misskey/built ./built
|
COPY --from=builder /misskey/built ./built
|
||||||
COPY . ./
|
COPY . ./
|
||||||
|
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "run", "migrateandstart"]
|
||||||
|
|||||||
79
README.md
79
README.md
@@ -1,6 +1,6 @@
|
|||||||
<img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/>
|
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
|
||||||
|
|
||||||
[](https://misskey.xyz/)
|
[](https://misskey.io/)
|
||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
[](https://circleci.com/gh/syuilo/misskey)
|
[](https://circleci.com/gh/syuilo/misskey)
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
**A forever evolving, sophisticated microblogging platform.**
|
**A forever evolving, sophisticated microblogging platform.**
|
||||||
|
|
||||||
<p align="justify">
|
<p align="justify">
|
||||||
<a href="https://misskey.xyz">Misskey</a> is a decentralized microblogging platform born on Earth.
|
<a href="https://misskey.io">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||||
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||||
it is mutually linked with other social media platforms.
|
it is mutually linked with other social media platforms.
|
||||||
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://joinmisskey.github.io/">Find an instance!</a>
|
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://joinmisskey.github.io/">Find an instance!</a>
|
||||||
@@ -59,7 +59,7 @@ Organize and store your files! Want to post a picture you have already uploaded?
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
...and more! Experience Misskey with your own eyes at [misskey.io](https://misskey.io/) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
||||||
|
|
||||||
Screen shots
|
Screen shots
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -88,12 +88,14 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><img src="https://avatars0.githubusercontent.com/u/10798641?s=460&v=4" alt="AyaMorisawa" width="100"></td>
|
<td><img src="https://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>
|
||||||
|
|
||||||
@@ -101,56 +103,79 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- 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/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/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1.jpe?token-time=2145916800&token-hash=bqwLTk0Wo0hUJJ8J5y7ii05bLzz-_CDA7Bo0Mp4RFU0%3D" alt="ne_moni" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4.jpe?token-time=2145916800&token-hash=zEyJqVM7u9d8Ri-65fJYSJcWF1jBH1nJ5a3taRzrTmw%3D" alt="Melilot" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
|
||||||
<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/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/user?u=19045173">kiritan</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/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/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1?token-time=2145916800&token-hash=95p8VdGX45E8BitZR_eOcDlqCjumjzNLBPQJrJdeCpI%3D" alt="takimura" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/17195955/be45e5e14c3e48b2bee0456c84e19df4/4?token-time=2145916800&token-hash=SbdZeN5SmsuT9stD6v0jN1z0hftg0FmRiCTxysU0Ihw%3D" alt="Damillora" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
|
||||||
|
<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=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/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/user?u=17463605">Sampot</a></td>
|
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
|
||||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
||||||
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/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/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/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/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/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/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/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/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/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1.jpeg?token-time=2145916800&token-hash=l4AoMR7Nj7K4yAHrkrk2hAoggPkbSPm12m1nmbe9Pb8%3D" alt="Naoki Hirayama" width="100"></td>
|
||||||
|
<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>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</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/hiratake">Hiratake</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/Corset">CG</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||||
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/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>
|
||||||
<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:** Fri, 01 Mar 2019 23:59:07 UTC
|
**Last updated:** Sun, 19 May 2019 02:37:06 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
|||||||
4
assets/robots.txt
Normal file
4
assets/robots.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
user-agent: *
|
||||||
|
allow: /
|
||||||
|
|
||||||
|
# todo: sitemap
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
'targets': [
|
|
||||||
{
|
|
||||||
'target_name': 'crypto_key',
|
|
||||||
'sources': ['src/crypto_key.cc'],
|
|
||||||
'include_dirs': ['<!(node -e "require(\'nan\')")']
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
const mongo = require('mongodb');
|
|
||||||
const User = require('../built/models/user').default;
|
|
||||||
|
|
||||||
const args = process.argv.slice(2);
|
|
||||||
|
|
||||||
const user = args[0];
|
|
||||||
|
|
||||||
const q = user.startsWith('@') ? {
|
|
||||||
username: user.split('@')[1],
|
|
||||||
host: user.split('@')[2] || null
|
|
||||||
} : { _id: new mongo.ObjectID(user) };
|
|
||||||
|
|
||||||
console.log(`Mark as admin ${user}...`);
|
|
||||||
|
|
||||||
User.update(q, {
|
|
||||||
$set: {
|
|
||||||
isAdmin: true
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
console.log(`Done ${user}`);
|
|
||||||
}, e => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
// for Node.js interpret
|
|
||||||
|
|
||||||
const chalk = require('chalk');
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await DriveFile.count({});
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const file = await DriveFile.findOne(prev ? {
|
|
||||||
_id: { $gt: prev._id }
|
|
||||||
} : {}, {
|
|
||||||
sort: {
|
|
||||||
_id: 1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = file;
|
|
||||||
|
|
||||||
const user = await User.findOne({ _id: file.metadata.userId });
|
|
||||||
|
|
||||||
DriveFile.update({
|
|
||||||
_id: file._id
|
|
||||||
}, {
|
|
||||||
$set: {
|
|
||||||
'metadata._user': {
|
|
||||||
host: user.host
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
res([i, file]);
|
|
||||||
}).catch(rej);
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, file]) => {
|
|
||||||
console.log(chalk`{gray ${i}} {green done: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('ALL DONE');
|
|
||||||
}).catch(console.error);
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
// for Node.js interpret
|
|
||||||
|
|
||||||
const chalk = require('chalk');
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await User.count({});
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const user = await User.findOne(prev ? {
|
|
||||||
_id: { $gt: prev._id }
|
|
||||||
} : {}, {
|
|
||||||
sort: {
|
|
||||||
_id: 1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = user;
|
|
||||||
|
|
||||||
const set = {};
|
|
||||||
|
|
||||||
if (user.avatarId != null) {
|
|
||||||
const file = await DriveFile.findOne({ _id: user.avatarId });
|
|
||||||
|
|
||||||
if (file && file.metadata.properties.avgColor) {
|
|
||||||
set.avatarColor = file.metadata.properties.avgColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user.bannerId != null) {
|
|
||||||
const file = await DriveFile.findOne({ _id: user.bannerId });
|
|
||||||
|
|
||||||
if (file && file.metadata.properties.avgColor) {
|
|
||||||
set.bannerColor = file.metadata.properties.avgColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Object.keys(set).length === 0) return res([i, user]);
|
|
||||||
|
|
||||||
User.update({
|
|
||||||
_id: user._id
|
|
||||||
}, {
|
|
||||||
$set: set
|
|
||||||
}).then(() => {
|
|
||||||
res([i, user]);
|
|
||||||
}).catch(rej);
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, user]) => {
|
|
||||||
console.log(chalk`{gray ${i}} {green done: {bold ${user._id}} @${user.username}}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('ALL DONE');
|
|
||||||
}).catch(console.error);
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
DriveFile.update({}, {
|
|
||||||
$rename: {
|
|
||||||
'metadata.isMetaOnly': 'metadata.withoutChunks'
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
multi: true
|
|
||||||
});
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
const { default: Stats } = require('../../built/models/stats');
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: Note } = require('../../built/models/note');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
const now = new Date();
|
|
||||||
const y = now.getFullYear();
|
|
||||||
const m = now.getMonth();
|
|
||||||
const d = now.getDate();
|
|
||||||
const today = new Date(y, m, d);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const localUsersCount = await User.count({
|
|
||||||
host: null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteUsersCount = await User.count({
|
|
||||||
host: { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localNotesCount = await Note.count({
|
|
||||||
'_user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteNotesCount = await Note.count({
|
|
||||||
'_user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': null,
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': { $ne: null },
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
await Stats.insert({
|
|
||||||
date: today,
|
|
||||||
users: {
|
|
||||||
local: {
|
|
||||||
total: localUsersCount,
|
|
||||||
diff: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteUsersCount,
|
|
||||||
diff: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
notes: {
|
|
||||||
local: {
|
|
||||||
total: localNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
drive: {
|
|
||||||
local: {
|
|
||||||
totalCount: localDriveFilesCount,
|
|
||||||
totalSize: localDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
totalCount: remoteDriveFilesCount,
|
|
||||||
totalSize: remoteDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('done');
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
const { default: Stats } = require('../../built/models/stats');
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: Note } = require('../../built/models/note');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
const now = new Date();
|
|
||||||
const y = now.getFullYear();
|
|
||||||
const m = now.getMonth();
|
|
||||||
const d = now.getDate();
|
|
||||||
const h = now.getHours();
|
|
||||||
const date = new Date(y, m, d, h);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
await Stats.update({}, {
|
|
||||||
$set: {
|
|
||||||
span: 'day'
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
multi: true
|
|
||||||
});
|
|
||||||
|
|
||||||
const localUsersCount = await User.count({
|
|
||||||
host: null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteUsersCount = await User.count({
|
|
||||||
host: { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localNotesCount = await Note.count({
|
|
||||||
'_user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteNotesCount = await Note.count({
|
|
||||||
'_user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': null,
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': { $ne: null },
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
await Stats.insert({
|
|
||||||
date: date,
|
|
||||||
span: 'hour',
|
|
||||||
users: {
|
|
||||||
local: {
|
|
||||||
total: localUsersCount,
|
|
||||||
diff: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteUsersCount,
|
|
||||||
diff: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
notes: {
|
|
||||||
local: {
|
|
||||||
total: localNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
drive: {
|
|
||||||
local: {
|
|
||||||
totalCount: localDriveFilesCount,
|
|
||||||
totalSize: localDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
totalCount: remoteDriveFilesCount,
|
|
||||||
totalSize: remoteDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('done');
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
@@ -5,8 +5,8 @@ services:
|
|||||||
build: .
|
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;
|
||||||
|
|||||||
106
docs/setup.en.md
106
docs/setup.en.md
@@ -22,37 +22,45 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Please install and setup these softwares:
|
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/)
|
* [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:
|
||||||
@@ -68,6 +76,12 @@ If you're still encountering errors about some modules, use node-gyp:
|
|||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `NODE_ENV=production 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.
|
||||||
@@ -77,37 +91,45 @@ 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
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
TimeoutSec=60
|
TimeoutSec=60
|
||||||
StandardOutput=syslog
|
StandardOutput=syslog
|
||||||
StandardError=syslog
|
StandardError=syslog
|
||||||
SyslogIdentifier=misskey
|
SyslogIdentifier=misskey
|
||||||
Restart=always
|
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. `NODE_ENV=production 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
|
||||||
|
|||||||
102
docs/setup.fr.md
102
docs/setup.fr.md
@@ -22,37 +22,45 @@ 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/)
|
* [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 :
|
||||||
@@ -68,7 +76,7 @@ Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
|||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `NODE_ENV=production 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
|
||||||
|
|
||||||
@@ -77,37 +85,45 @@ Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-v
|
|||||||
|
|
||||||
### 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
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
TimeoutSec=60
|
TimeoutSec=60
|
||||||
StandardOutput=syslog
|
StandardOutput=syslog
|
||||||
StandardError=syslog
|
StandardError=syslog
|
||||||
SyslogIdentifier=misskey
|
SyslogIdentifier=misskey
|
||||||
Restart=always
|
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. `NODE_ENV=production 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.
|
||||||
|
|||||||
117
docs/setup.ja.md
117
docs/setup.ja.md
@@ -22,44 +22,46 @@ 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/)
|
* [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をビルドしてください:
|
||||||
@@ -74,6 +76,12 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
|||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
|
|
||||||
|
*6.* データベースを初期化
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
npm run init
|
||||||
|
```
|
||||||
|
|
||||||
*7.* 以上です!
|
*7.* 以上です!
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
@@ -82,43 +90,52 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
|||||||
`NODE_ENV=production 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
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
TimeoutSec=60
|
TimeoutSec=60
|
||||||
StandardOutput=syslog
|
StandardOutput=syslog
|
||||||
StandardError=syslog
|
StandardError=syslog
|
||||||
SyslogIdentifier=misskey
|
SyslogIdentifier=misskey
|
||||||
Restart=always
|
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. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||||
|
|
||||||
なにか問題が発生した場合は、`npm run clean`すると直る場合があります。
|
なにか問題が発生した場合は、`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'
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|||||||
1623
locales/ca-ES.yml
1623
locales/ca-ES.yml
File diff suppressed because it is too large
Load Diff
1248
locales/cs-CZ.yml
Normal file
1248
locales/cs-CZ.yml
Normal file
File diff suppressed because it is too large
Load Diff
1896
locales/da-DK.yml
Normal file
1896
locales/da-DK.yml
Normal file
File diff suppressed because it is too large
Load Diff
1520
locales/de-DE.yml
1520
locales/de-DE.yml
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
meta:
|
meta:
|
||||||
lang: "English"
|
lang: "English"
|
||||||
divider: ""
|
|
||||||
common:
|
common:
|
||||||
misskey: "A ⭐ of the fediverse"
|
misskey: "A ⭐ of the fediverse"
|
||||||
about-title: "A ⭐ of the fediverse."
|
about-title: "A ⭐ of the fediverse."
|
||||||
@@ -25,8 +24,8 @@ common:
|
|||||||
application-authorization: "Application authorizations"
|
application-authorization: "Application authorizations"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
||||||
load-more: "Load more"
|
load-more: "Read more"
|
||||||
enter-password: "Please enter the Password"
|
enter-password: "Enter your password"
|
||||||
2fa: "Two-factor authentication"
|
2fa: "Two-factor authentication"
|
||||||
customize-home: "Customize home layout"
|
customize-home: "Customize home layout"
|
||||||
featured-notes: "Featured notes"
|
featured-notes: "Featured notes"
|
||||||
@@ -35,6 +34,7 @@ common:
|
|||||||
signup: "Sign up"
|
signup: "Sign up"
|
||||||
signout: "Logout"
|
signout: "Logout"
|
||||||
reload-to-apply-the-setting: "You'll need to reload the page to reflect this setting. Do you want to reload it now?"
|
reload-to-apply-the-setting: "You'll need to reload the page to reflect this setting. Do you want to reload it now?"
|
||||||
|
fetching-as-ap-object: "Inquiring to union"
|
||||||
got-it: "Got it!"
|
got-it: "Got it!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
@@ -62,6 +62,7 @@ common:
|
|||||||
month-and-day: "{month}/{day}"
|
month-and-day: "{month}/{day}"
|
||||||
trash: "Trash"
|
trash: "Trash"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
pages: "Pages"
|
||||||
messaging: "Talk"
|
messaging: "Talk"
|
||||||
home: "Home"
|
home: "Home"
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
@@ -70,6 +71,27 @@ common:
|
|||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
|
permissions:
|
||||||
|
"read:account": "View account information"
|
||||||
|
"write:account": "Update your account information"
|
||||||
|
"read:blocks": "View Blocks"
|
||||||
|
"write:blocks": "Work with Blocks"
|
||||||
|
"read:drive": "Browse the Drive"
|
||||||
|
"write:drive": "Work with the Drive"
|
||||||
|
"read:favorites": "View Favorites"
|
||||||
|
"write:favorites": "Work with Favorites"
|
||||||
|
"read:following": "View Follower info"
|
||||||
|
"write:following": "Work with Follow info"
|
||||||
|
"read:messaging": "View Messaging"
|
||||||
|
"write:messaging": "Work with Messaging"
|
||||||
|
"read:mutes": "View Muted"
|
||||||
|
"write:mutes": "Work with Muted"
|
||||||
|
"write:notes": "Create and delete posts"
|
||||||
|
"read:notifications": "View notifications"
|
||||||
|
"write:notifications": "Work with notifications"
|
||||||
|
"read:reactions": "View reactions"
|
||||||
|
"write:reactions": "Work with reactions"
|
||||||
|
"write:votes": "Vote"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Following users will show their posts in your timeline."
|
follow-users-to-make-your-timeline: "Following users will show their posts in your timeline."
|
||||||
explore: "Find users"
|
explore: "Find users"
|
||||||
@@ -115,7 +137,7 @@ common:
|
|||||||
a: "What are you doing?"
|
a: "What are you doing?"
|
||||||
b: "What's happening?"
|
b: "What's happening?"
|
||||||
c: "What’s on your mind?"
|
c: "What’s on your mind?"
|
||||||
d: "Would you post any words?"
|
d: "What do you want to say?"
|
||||||
e: "Write here"
|
e: "Write here"
|
||||||
f: "Waiting for your writing."
|
f: "Waiting for your writing."
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
@@ -170,9 +192,9 @@ common:
|
|||||||
deck-column-align-flexible: "Flexible"
|
deck-column-align-flexible: "Flexible"
|
||||||
deck-column-width: "Deck column width"
|
deck-column-width: "Deck column width"
|
||||||
deck-column-width-narrow: "Narrow"
|
deck-column-width-narrow: "Narrow"
|
||||||
deck-column-width-narrower: "Somewhat narrow"
|
deck-column-width-narrower: "Narrower"
|
||||||
deck-column-width-normal: "Regular"
|
deck-column-width-normal: "Regular"
|
||||||
deck-column-width-wider: "Somewhat wide"
|
deck-column-width-wider: "Slightly wide"
|
||||||
deck-column-width-wide: "Wide"
|
deck-column-width-wide: "Wide"
|
||||||
use-shadow: "Use shadows in the UI"
|
use-shadow: "Use shadows in the UI"
|
||||||
rounded-corners: "Round the corners of the UI"
|
rounded-corners: "Round the corners of the UI"
|
||||||
@@ -224,14 +246,14 @@ common:
|
|||||||
search: "Search"
|
search: "Search"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
ok: "It's OK"
|
ok: "Confirm"
|
||||||
cancel: "Quit"
|
cancel: "Cancel"
|
||||||
update-available-title: "Update available"
|
update-available-title: "Update available"
|
||||||
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
|
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
|
||||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||||
verified-user: "Verified account"
|
|
||||||
hide-password: "Hide Password"
|
hide-password: "Hide Password"
|
||||||
show-password: "Show Password"
|
show-password: "Show Password"
|
||||||
|
enter-username: "Enter user name"
|
||||||
do-not-use-in-production: "This is a development build. Do not use in production."
|
do-not-use-in-production: "This is a development build. Do not use in production."
|
||||||
user-suspended: "This user has been suspended."
|
user-suspended: "This user has been suspended."
|
||||||
is-remote-user: "The information about this user may not be entirely complete."
|
is-remote-user: "The information about this user may not be entirely complete."
|
||||||
@@ -277,21 +299,13 @@ common:
|
|||||||
nav: "Navigation"
|
nav: "Navigation"
|
||||||
tips: "Tips"
|
tips: "Tips"
|
||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
|
queue: "Queue"
|
||||||
dev: "Failed to create the application. Please try again."
|
dev: "Failed to create the application. Please try again."
|
||||||
ai-chan-kawaii: "Ai-chan kawaii!"
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
you: "You"
|
you: "You"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Would you allow <i>{name}</i> to access your account?"
|
share-access: "Would you allow <i>{name}</i> to access your account?"
|
||||||
permission-ask: "This application requires the following permissions:"
|
permission-ask: "This application requires the following permissions:"
|
||||||
account-read: "View account information."
|
|
||||||
account-write: "Modify account information."
|
|
||||||
note-write: "Post."
|
|
||||||
like-write: "React to posts."
|
|
||||||
following-write: "Follow and unfollow."
|
|
||||||
drive-read: "Read your drive."
|
|
||||||
drive-write: "Upload/delete files in your drive."
|
|
||||||
notification-read: "Read your notifications."
|
|
||||||
notification-write: "Manage your notifications."
|
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
accept: "Allow access."
|
accept: "Allow access."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@@ -305,7 +319,7 @@ auth/views/index.vue:
|
|||||||
error: "Session does not exist."
|
error: "Session does not exist."
|
||||||
sign-in: "Please sign in."
|
sign-in: "Please sign in."
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "Verified accounts"
|
pinned-users: "Higlighted users"
|
||||||
popular-users: "Popular users"
|
popular-users: "Popular users"
|
||||||
recently-updated-users: "Recently active users"
|
recently-updated-users: "Recently active users"
|
||||||
recently-registered-users: "Users who joined recently"
|
recently-registered-users: "Users who joined recently"
|
||||||
@@ -315,6 +329,7 @@ common/views/pages/explore.vue:
|
|||||||
users-info: "Currently, {users} users are registered here"
|
users-info: "Currently, {users} users are registered here"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "Enable playback"
|
enable-player: "Enable playback"
|
||||||
|
disable-player: "Close the player"
|
||||||
common/views/components/user-list.vue:
|
common/views/components/user-list.vue:
|
||||||
no-users: "There are no users."
|
no-users: "There are no users."
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
@@ -434,18 +449,23 @@ common/views/components/messaging.vue:
|
|||||||
search-user: "Find a user"
|
search-user: "Find a user"
|
||||||
you: "You"
|
you: "You"
|
||||||
no-history: "Without history"
|
no-history: "Without history"
|
||||||
|
user: "User"
|
||||||
|
group: "Group"
|
||||||
|
start-with-user: "Start chatting with a user"
|
||||||
|
start-with-group: "Start a group and chat"
|
||||||
|
select-group: "Select a group"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "No conversations"
|
not-talked-user: "You have not talked to this user yet"
|
||||||
|
not-talked-group: "There is no conversation in this group"
|
||||||
no-history: "There is no further history"
|
no-history: "There is no further history"
|
||||||
resize-form: "Drag to resize"
|
|
||||||
new-message: "New message"
|
new-message: "New message"
|
||||||
only-one-file-attached: "Only ONE file can be attached to a message."
|
only-one-file-attached: "You can only attach one file to a message"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Enter message here"
|
input-message-here: "Enter message here"
|
||||||
send: "Send"
|
send: "Send"
|
||||||
attach-from-local: "Attach files from your device"
|
attach-from-local: "Attach files from your device"
|
||||||
attach-from-drive: "Attach files from your Drive"
|
attach-from-drive: "Attach files from your Drive"
|
||||||
only-one-file-attached: "Only one file can be attached to the message."
|
only-one-file-attached: "You can only attach one file to a message"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "Read"
|
is-read: "Read"
|
||||||
deleted: "This message has been deleted"
|
deleted: "This message has been deleted"
|
||||||
@@ -458,6 +478,7 @@ common/views/components/nav.vue:
|
|||||||
repository: "Repository"
|
repository: "Repository"
|
||||||
develop: "Developers"
|
develop: "Developers"
|
||||||
feedback: "Feedback"
|
feedback: "Feedback"
|
||||||
|
tos: "Terms Of Service"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "Mention"
|
mention: "Mention"
|
||||||
detail: "Details"
|
detail: "Details"
|
||||||
@@ -476,32 +497,60 @@ common/views/components/user-menu.vue:
|
|||||||
mention: "Mention"
|
mention: "Mention"
|
||||||
mute: "Mute"
|
mute: "Mute"
|
||||||
unmute: "Unmute"
|
unmute: "Unmute"
|
||||||
|
mute-confirm: "Are you sure you want to mute this user?"
|
||||||
|
unmute-confirm: "Are you certain that you want to unmute this user?"
|
||||||
block: "Block"
|
block: "Block"
|
||||||
unblock: "Unblock"
|
unblock: "Unblock"
|
||||||
|
block-confirm: "Are you sure you want to block this user?"
|
||||||
|
unblock-confirm: "Are you certain that you want to unblock this user?"
|
||||||
push-to-list: "Add to list"
|
push-to-list: "Add to list"
|
||||||
select-list: "Select a list"
|
select-list: "Select a list"
|
||||||
report-abuse: "Report abuse"
|
report-abuse: "Report abuse"
|
||||||
report-abuse-detail: "What kind of nuisance did you encounter?"
|
report-abuse-detail: "What kind of nuisance did you encounter?"
|
||||||
report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
|
report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
|
||||||
silence: "Mute"
|
silence: "Silence"
|
||||||
unsilence: "Unmute"
|
unsilence: "Unsilence"
|
||||||
|
silence-confirm: "Are you sure that you want to silence this user?"
|
||||||
|
unsilence-confirm: "Are you sure that you want to stop silencing this user?"
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
|
suspend-confirm: "Are you sure that you want to suspend this user?"
|
||||||
|
unsuspend-confirm: "Are you sure that you want to unsuspend this user?"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Vote for '{}'"
|
vote-to: "Vote for '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
total-users: "{} users voted"
|
total-votes: "{} votes in total"
|
||||||
vote: "Vote"
|
vote: "Vote"
|
||||||
show-result: "Show results"
|
show-result: "Show results"
|
||||||
voted: "Voted"
|
voted: "Voted"
|
||||||
|
closed: "Ended"
|
||||||
|
remaining-days: "{d} days, {h} hours remain"
|
||||||
|
remaining-hours: "{h} hours, and {m} minutes remain"
|
||||||
|
remaining-minutes: "{m} minutes, and {s} seconds remaining"
|
||||||
|
remaining-seconds: "{s} seconds remaining"
|
||||||
common/views/components/poll-editor.vue:
|
common/views/components/poll-editor.vue:
|
||||||
no-only-one-choice: "At least two choices are required"
|
no-only-one-choice: "At least two choices are required"
|
||||||
choice-n: "Choice {}"
|
choice-n: "Choice {}"
|
||||||
remove: "Delete the choice"
|
remove: "Delete the choice"
|
||||||
add: "+ Add a choice"
|
add: "+ Add a choice"
|
||||||
destroy: "Discard the poll"
|
destroy: "Discard the poll"
|
||||||
|
multiple: "More than one answer is allowed"
|
||||||
|
expiration: "Valid until"
|
||||||
|
infinite: "Indefinitely"
|
||||||
|
at: "Date and time pick"
|
||||||
|
after: "Progression specifics"
|
||||||
|
no-more: "You cannot add any more"
|
||||||
|
deadline-date: "Finish date"
|
||||||
|
deadline-time: "Time duration"
|
||||||
|
interval: "Duration"
|
||||||
|
unit: "Unit"
|
||||||
|
second: "Seconds"
|
||||||
|
minute: "Minutes"
|
||||||
|
hour: "Hours"
|
||||||
|
day: "S"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Send a reaction"
|
choose-reaction: "Send a reaction"
|
||||||
|
input-reaction-placeholder: "or input Emoji"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "Custom Emoji"
|
custom-emoji: "Custom Emoji"
|
||||||
people: "People"
|
people: "People"
|
||||||
@@ -521,7 +570,7 @@ common/views/components/signin.vue:
|
|||||||
signin-with-twitter: "Log in with Twitter"
|
signin-with-twitter: "Log in with Twitter"
|
||||||
signin-with-github: "Sign in with GitHub"
|
signin-with-github: "Sign in with GitHub"
|
||||||
signin-with-discord: "Sign in with Discord"
|
signin-with-discord: "Sign in with Discord"
|
||||||
login-failed: "Log in failed. Make sure you have entered your correct username and password."
|
login-failed: "Logging in has failed. Make sure you have entered the correct username and password."
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "Invitation code"
|
invitation-code: "Invitation code"
|
||||||
invitation-info: "If you do not have an invitation code, please contact an <a href=\"{}\">administrator</a>."
|
invitation-info: "If you do not have an invitation code, please contact an <a href=\"{}\">administrator</a>."
|
||||||
@@ -543,6 +592,8 @@ common/views/components/signup.vue:
|
|||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
password-not-matched: "Doesn't match"
|
password-not-matched: "Doesn't match"
|
||||||
recaptcha: "Verification"
|
recaptcha: "Verification"
|
||||||
|
agree-to: "Accept {0}."
|
||||||
|
tos: "Terms Of Service"
|
||||||
create: "Create an Account"
|
create: "Create an Account"
|
||||||
some-error: "An attempt at account creation has failed for some reason. Please try again."
|
some-error: "An attempt at account creation has failed for some reason. Please try again."
|
||||||
common/views/components/special-message.vue:
|
common/views/components/special-message.vue:
|
||||||
@@ -629,12 +680,16 @@ common/views/components/profile-editor.vue:
|
|||||||
email-verified: "Your email has been verified."
|
email-verified: "Your email has been verified."
|
||||||
email-not-verified: "Email address is not confirmed. Please check your inbox."
|
email-not-verified: "Email address is not confirmed. Please check your inbox."
|
||||||
export: "Export"
|
export: "Export"
|
||||||
|
import: "Import"
|
||||||
|
export-and-import: "Export and Import"
|
||||||
export-targets:
|
export-targets:
|
||||||
all-notes: "All posted Notes"
|
all-notes: "All posted Notes"
|
||||||
following-list: "List of followers"
|
following-list: "List of followers"
|
||||||
mute-list: "List of muted accounts"
|
mute-list: "List of muted accounts"
|
||||||
blocking-list: "List of blocked accounts"
|
blocking-list: "List of blocked accounts"
|
||||||
|
user-lists: "Lists"
|
||||||
export-requested: "You have requested an export. This may take a while. After the export is complete, the resulting file will be added to the drive."
|
export-requested: "You have requested an export. This may take a while. After the export is complete, the resulting file will be added to the drive."
|
||||||
|
import-requested: "You have initiated an import. This may take quite some time."
|
||||||
enter-password: "Please enter your password"
|
enter-password: "Please enter your password"
|
||||||
danger-zone: "Cautious options"
|
danger-zone: "Cautious options"
|
||||||
delete-account: "Remove the account"
|
delete-account: "Remove the account"
|
||||||
@@ -646,6 +701,30 @@ common/views/components/user-list-editor.vue:
|
|||||||
remove-user: "Remove from this list"
|
remove-user: "Remove from this list"
|
||||||
delete-are-you-sure: "Delete list \"$1\"?"
|
delete-are-you-sure: "Delete list \"$1\"?"
|
||||||
deleted: "Deleted successfully"
|
deleted: "Deleted successfully"
|
||||||
|
add-user: "Add a user"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
users: "Members"
|
||||||
|
rename: "Rename group"
|
||||||
|
delete: "Delete group"
|
||||||
|
transfer: "transfer group"
|
||||||
|
transfer-are-you-sure: "Are you sure you want to add @$2 to the group $1?"
|
||||||
|
remove-user: "Remove a user from this group"
|
||||||
|
deleted: "Deleted"
|
||||||
|
invite: "Invite"
|
||||||
|
invited: "The invitation was successfully sent"
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Lists"
|
||||||
|
create-list: "Create a list"
|
||||||
|
list-name: "List name"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
user-groups: "Group"
|
||||||
|
create-group: "Create a group"
|
||||||
|
group-name: "Group name"
|
||||||
|
owned-groups: "My groups"
|
||||||
|
joined-groups: "Membership in groups"
|
||||||
|
invites: "Invite"
|
||||||
|
accept-invite: "Join"
|
||||||
|
reject-invite: "Decline"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Checking"
|
fetching: "Checking"
|
||||||
no-broadcasts: "No announcements"
|
no-broadcasts: "No announcements"
|
||||||
@@ -707,6 +786,10 @@ common/views/pages/follow.vue:
|
|||||||
request-pending: "Pending follow request"
|
request-pending: "Pending follow request"
|
||||||
follow-processing: "Processing follow"
|
follow-processing: "Processing follow"
|
||||||
follow-request: "Follow request"
|
follow-request: "Follow request"
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
received-follow-requests: "Follow requests"
|
||||||
|
accept: "Accept"
|
||||||
|
reject: "Reject"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "Crop the part that appears as a banner"
|
banner-crop-title: "Crop the part that appears as a banner"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
@@ -723,7 +806,7 @@ desktop/views/components/activity.chart.vue:
|
|||||||
total: "Black ... Total"
|
total: "Black ... Total"
|
||||||
notes: "Blue ... Notes"
|
notes: "Blue ... Notes"
|
||||||
replies: "Red ... Replies"
|
replies: "Red ... Replies"
|
||||||
renotes: "Green ... Repost"
|
renotes: "Green ... Renotes"
|
||||||
desktop/views/components/activity.vue:
|
desktop/views/components/activity.vue:
|
||||||
title: "Activity"
|
title: "Activity"
|
||||||
toggle: "Toggle views"
|
toggle: "Toggle views"
|
||||||
@@ -816,15 +899,11 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Messages:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Messaging"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "Post is private"
|
private: "Post is private"
|
||||||
deleted: "Post has been removed"
|
deleted: "Post has been removed"
|
||||||
location: "Location"
|
location: "Location"
|
||||||
renote: "Repost"
|
renote: "Renote"
|
||||||
add-reaction: "Add a reaction"
|
add-reaction: "Add a reaction"
|
||||||
undo-reaction: "Reverse reaction"
|
undo-reaction: "Reverse reaction"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
@@ -848,17 +927,16 @@ desktop/views/components/post-form.vue:
|
|||||||
quote-placeholder: "Quote this Post..."
|
quote-placeholder: "Quote this Post..."
|
||||||
submit: "Post"
|
submit: "Post"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
renote: "Repost"
|
renote: "Renote"
|
||||||
posted: "Posted!"
|
posted: "Posted!"
|
||||||
replied: "Replied!"
|
replied: "Replied!"
|
||||||
reposted: "Reposted!"
|
reposted: "Renoted!"
|
||||||
note-failed: "Failed to post"
|
note-failed: "Failed to post"
|
||||||
reply-failed: "Failed to reply"
|
reply-failed: "Failed to reply"
|
||||||
renote-failed: "Failed to Renote"
|
renote-failed: "Failed to Renote"
|
||||||
posting: "Posting"
|
posting: "Posting"
|
||||||
attach-media-from-local: "Attach media from your device"
|
attach-media-from-local: "Attach media from your device"
|
||||||
attach-media-from-drive: "Attach media from your Drive"
|
attach-media-from-drive: "Attach media from your Drive"
|
||||||
attach-cancel: "Cancel attachment"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "Create a poll"
|
create-poll: "Create a poll"
|
||||||
text-remain: "{} characters remaining"
|
text-remain: "{} characters remaining"
|
||||||
@@ -880,13 +958,13 @@ desktop/views/components/progress-dialog.vue:
|
|||||||
desktop/views/components/renote-form.vue:
|
desktop/views/components/renote-form.vue:
|
||||||
quote: "Quote..."
|
quote: "Quote..."
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
renote: "Repost"
|
renote: "Renote"
|
||||||
renote-home: "Renote (Home)"
|
renote-home: "Renote (Home)"
|
||||||
reposting: "Renoting..."
|
reposting: "Renoting..."
|
||||||
success: "Reposted!"
|
success: "Renoted!"
|
||||||
failure: "Failed to Repost"
|
failure: "Failed to Renote"
|
||||||
desktop/views/components/renote-form-window.vue:
|
desktop/views/components/renote-form-window.vue:
|
||||||
title: "Do you want to Renote it?"
|
title: "Do you want to renote it?"
|
||||||
desktop/views/pages/user-following-or-followers.vue:
|
desktop/views/pages/user-following-or-followers.vue:
|
||||||
following: "{user}'s following"
|
following: "{user}'s following"
|
||||||
followers: "{user}'s follower"
|
followers: "{user}'s follower"
|
||||||
@@ -951,6 +1029,10 @@ common/views/components/password-settings.vue:
|
|||||||
not-match: "The new passwords do not match"
|
not-match: "The new passwords do not match"
|
||||||
changed: "Password changed"
|
changed: "Password changed"
|
||||||
failed: "Failed to change password"
|
failed: "Failed to change password"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
attach-cancel: "Remove Attachment"
|
||||||
|
mark-as-sensitive: "Mark as 'sensitive'"
|
||||||
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "This post is private"
|
private: "This post is private"
|
||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
@@ -961,18 +1043,16 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "Query (optional)"
|
query: "Query (optional)"
|
||||||
add: "Add"
|
add: "Add"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Task Manager"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Home"
|
home: "Home"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Direct posts"
|
||||||
list: "Lists"
|
list: "Lists"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
add-tag-timeline: "Add hashtag tl"
|
add-tag-timeline: "Add hashtag cloud"
|
||||||
add-list: "Add list"
|
add-list: "Add list"
|
||||||
list-name: "List name"
|
list-name: "List name"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
@@ -981,6 +1061,7 @@ desktop/views/components/ui.header.vue:
|
|||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Your profile"
|
profile: "Your profile"
|
||||||
lists: "Lists"
|
lists: "Lists"
|
||||||
|
groups: "Group"
|
||||||
follow-requests: "Follow requests"
|
follow-requests: "Follow requests"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
@@ -991,14 +1072,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Compose new Post"
|
post: "Compose new Post"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Search"
|
placeholder: "Search"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
title: "Follow requests"
|
|
||||||
accept: "Accept"
|
|
||||||
reject: "Reject"
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "User lists"
|
|
||||||
create-list: "Create a list"
|
|
||||||
list-name: "List name"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Posts"
|
notes: "Posts"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
@@ -1020,9 +1093,9 @@ admin/views/index.vue:
|
|||||||
users: "Users"
|
users: "Users"
|
||||||
federation: "Federation"
|
federation: "Federation"
|
||||||
announcements: "Announcements"
|
announcements: "Announcements"
|
||||||
hashtags: "Hashtags"
|
|
||||||
abuse: "Abuse"
|
abuse: "Abuse"
|
||||||
queue: "Job Queue"
|
queue: "Job Queue"
|
||||||
|
logs: "Logs"
|
||||||
back-to-misskey: "Back to Misskey"
|
back-to-misskey: "Back to Misskey"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
@@ -1033,7 +1106,7 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "This instance"
|
this-instance: "This instance"
|
||||||
federated: "Federated"
|
federated: "Federated"
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "Action(s)"
|
title: "Queue"
|
||||||
remove-all-jobs: "Clear all queued jobs"
|
remove-all-jobs: "Clear all queued jobs"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abuse"
|
title: "Abuse"
|
||||||
@@ -1046,14 +1119,26 @@ admin/views/instance.vue:
|
|||||||
instance-name: "Instance name"
|
instance-name: "Instance name"
|
||||||
instance-description: "Instance description"
|
instance-description: "Instance description"
|
||||||
host: "Host"
|
host: "Host"
|
||||||
|
icon-url: "URL of the icon"
|
||||||
|
logo-url: "URL of the logo"
|
||||||
banner-url: "Banner image URL"
|
banner-url: "Banner image URL"
|
||||||
error-image-url: "Error image URL"
|
error-image-url: "Error image URL"
|
||||||
languages: "Language of this instance"
|
languages: "Language of this instance"
|
||||||
languages-desc: "You can add more than one, separated by spaces."
|
languages-desc: "You can add more than one, separated by spaces."
|
||||||
|
tos-url: "Terms of Service URL"
|
||||||
|
repository-url: "Repository URL"
|
||||||
|
feedback-url: "URL for feedback"
|
||||||
maintainer-config: "Administrator information"
|
maintainer-config: "Administrator information"
|
||||||
maintainer-name: "Administrator name"
|
maintainer-name: "Administrator name"
|
||||||
maintainer-email: "Contact Administrator"
|
maintainer-email: "Contact Administrator"
|
||||||
|
advanced-config: "Other settings"
|
||||||
drive-config: "Drive settings"
|
drive-config: "Drive settings"
|
||||||
|
object-storage-base-url: "URL"
|
||||||
|
object-storage-endpoint: "Endpoint"
|
||||||
|
object-storage-port: "Port"
|
||||||
|
object-storage-access-key: "Access Key"
|
||||||
|
object-storage-secret-key: "Secret Key"
|
||||||
|
object-storage-use-ssl: "Use SSL"
|
||||||
cache-remote-files: "Cache remote files"
|
cache-remote-files: "Cache remote files"
|
||||||
cache-remote-files-desc: "Without this parameter, all remote files are linked to their host server directly. This will be an effective solution to save your server storage, however make remote files invisible to users who set direct-link disabled, since no thumbnail will be generated, increase traffic. It is recommended that this parameter set enabled."
|
cache-remote-files-desc: "Without this parameter, all remote files are linked to their host server directly. This will be an effective solution to save your server storage, however make remote files invisible to users who set direct-link disabled, since no thumbnail will be generated, increase traffic. It is recommended that this parameter set enabled."
|
||||||
local-drive-capacity-mb: "Volume of Drive per user"
|
local-drive-capacity-mb: "Volume of Drive per user"
|
||||||
@@ -1062,8 +1147,8 @@ admin/views/instance.vue:
|
|||||||
recaptcha-config: "the reCAPTCHA settings"
|
recaptcha-config: "the reCAPTCHA settings"
|
||||||
recaptcha-info: "reCAPTCHA token is required. Please get it on https://www.google.com/recaptcha/intro/"
|
recaptcha-info: "reCAPTCHA token is required. Please get it on https://www.google.com/recaptcha/intro/"
|
||||||
enable-recaptcha: "enable reCAPTCHA"
|
enable-recaptcha: "enable reCAPTCHA"
|
||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-secret-key: "Secret Key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-preview: "Preview"
|
||||||
twitter-integration-config: "Settings of connecting to Twitter"
|
twitter-integration-config: "Settings of connecting to Twitter"
|
||||||
twitter-integration-info: "The callback URL is set on {url}."
|
twitter-integration-info: "The callback URL is set on {url}."
|
||||||
enable-twitter-integration: "Enable connection to Twitter"
|
enable-twitter-integration: "Enable connection to Twitter"
|
||||||
@@ -1089,15 +1174,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "Disable the Local Timeline"
|
disable-local-timeline: "Disable the Local Timeline"
|
||||||
disable-global-timeline: "Disable global timeline"
|
disable-global-timeline: "Disable global timeline"
|
||||||
disabling-timelines-info: "Even if you disable these timelines, the administrator as well as moderators can use them continually."
|
disabling-timelines-info: "Even if you disable these timelines, the administrator as well as moderators can use them continually."
|
||||||
|
enable-emoji-reaction: "Enable pictograms for reactions"
|
||||||
|
use-star-for-reaction-fallback: "Use the star as fallback for unknown reaction"
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
user-recommendation-config: "Recommended users"
|
pinned-users: "Higlighted user"
|
||||||
enable-external-user-recommendation: "Enable external user recommendations"
|
|
||||||
external-user-recommendation-engine: "Engine"
|
|
||||||
external-user-recommendation-engine-desc: "Example : https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "Timeout"
|
|
||||||
external-user-recommendation-timeout-desc: "Number of milliseconds (ex. 300,000)"
|
|
||||||
email-config: "Email server settings"
|
email-config: "Email server settings"
|
||||||
email-config-info: "Used to confirm email and password reset etc."
|
email-config-info: "Used to confirm email and password reset etc."
|
||||||
enable-email: "Enable email delivery"
|
enable-email: "Enable email delivery"
|
||||||
@@ -1177,16 +1259,14 @@ admin/views/users.vue:
|
|||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
unsuspend-confirm: "Are you sure you want to unsuspend this account?"
|
unsuspend-confirm: "Are you sure you want to unsuspend this account?"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
make-silence: "Mute"
|
make-silence: "Silence"
|
||||||
unmake-silence: "Unmute"
|
silence-confirm: "Silence user?"
|
||||||
verify: "Verify account"
|
unmake-silence: "Unsilence"
|
||||||
verify-confirm: "Do you want this to be a verified account?"
|
unsilence-confirm: "Are you certain that you want to stop silencing this user?"
|
||||||
verified: "The account is now being verified"
|
|
||||||
unverify: "Unverify account"
|
|
||||||
unverify-confirm: "Do you want to remove the 'verified account' designation?"
|
|
||||||
unverified: "The account is now being unverified"
|
|
||||||
update-remote-user: "Update information about remote user"
|
update-remote-user: "Update information about remote user"
|
||||||
remote-user-updated: "The information regarding the remote user has been updated."
|
remote-user-updated: "The information regarding the remote user has been updated."
|
||||||
|
delete-all-files: "Delete all files"
|
||||||
|
delete-all-files-confirm: "Are you sure that you want to delete all files?"
|
||||||
users:
|
users:
|
||||||
title: "Users"
|
title: "Users"
|
||||||
sort:
|
sort:
|
||||||
@@ -1196,12 +1276,11 @@ admin/views/users.vue:
|
|||||||
updatedAtAsc: "Last Updated (Ascending)"
|
updatedAtAsc: "Last Updated (Ascending)"
|
||||||
updatedAtDesc: "Last Updated (Descending)"
|
updatedAtDesc: "Last Updated (Descending)"
|
||||||
state:
|
state:
|
||||||
title: "Status"
|
title: "Sort"
|
||||||
all: "All"
|
all: "All"
|
||||||
admin: "Administrator"
|
admin: "Administrator"
|
||||||
moderator: "Moderator"
|
moderator: "Moderator"
|
||||||
adminOrModerator: "Admin/Moderator"
|
adminOrModerator: "Admin/Moderator"
|
||||||
verified: "Verified account"
|
|
||||||
silenced: "Already silenced"
|
silenced: "Already silenced"
|
||||||
suspended: "Suspended"
|
suspended: "Suspended"
|
||||||
origin:
|
origin:
|
||||||
@@ -1251,21 +1330,23 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "Federation"
|
instance: "Instance"
|
||||||
host: "Host"
|
host: "Host"
|
||||||
notes: "Notes"
|
notes: "Notes"
|
||||||
users: "Users"
|
users: "Users"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
status: "Status"
|
caught-at: "Created at"
|
||||||
|
status: "Statuses"
|
||||||
latest-request-sent-at: "Time of last request sent"
|
latest-request-sent-at: "Time of last request sent"
|
||||||
latest-request-received-at: "Last request received at"
|
latest-request-received-at: "Last request received at"
|
||||||
remove-all-following: "Withold all followers"
|
remove-all-following: "Withold all followers"
|
||||||
remove-all-following-info: "Unfollow all accounts from {host}. Please run this if the instance no longer exists."
|
remove-all-following-info: "Unfollow all accounts from {host}. Please run this if the instance no longer exists."
|
||||||
|
delete-all-files: "Remove all files"
|
||||||
block: "Block"
|
block: "Block"
|
||||||
marked-as-closed: "Marked as closed"
|
marked-as-closed: "Marked as closed"
|
||||||
lookup: "Look up"
|
lookup: "Look up"
|
||||||
instances: "Instances"
|
instances: "Federated"
|
||||||
instance-not-registered: "The instance has not been discovered"
|
instance-not-registered: "The instance has not been discovered"
|
||||||
sort: "Sort by"
|
sort: "Sort by"
|
||||||
sorts:
|
sorts:
|
||||||
@@ -1273,19 +1354,19 @@ admin/views/federation.vue:
|
|||||||
caughtAtDesc: "Date of discovery (Descending)"
|
caughtAtDesc: "Date of discovery (Descending)"
|
||||||
lastCommunicatedAtAsc: "The date and time of the older interactions"
|
lastCommunicatedAtAsc: "The date and time of the older interactions"
|
||||||
lastCommunicatedAtDesc: "The date and time of the newer interactions"
|
lastCommunicatedAtDesc: "The date and time of the newer interactions"
|
||||||
notesAsc: "Order by least Notes posted"
|
notesAsc: "Least Notes posted"
|
||||||
notesDesc: "Order by most Notes posted"
|
notesDesc: "Most Notes posted"
|
||||||
usersAsc: "Less followers"
|
usersAsc: "Less followers"
|
||||||
usersDesc: "More followers"
|
usersDesc: "More followers"
|
||||||
followingAsc: "Least followed"
|
followingAsc: "Least followed"
|
||||||
followingDesc: "Has more followers"
|
followingDesc: "Most followed"
|
||||||
followersAsc: "Sort by having less followers"
|
followersAsc: "Having less followers"
|
||||||
followersDesc: "Sort by the larger number of followers"
|
followersDesc: "The largest number of followers"
|
||||||
driveUsageAsc: "Least storage used"
|
driveUsageAsc: "Least storage used"
|
||||||
driveUsageDesc: "Most storage used"
|
driveUsageDesc: "Most storage used"
|
||||||
driveFilesAsc: "By the smallest number of files stored on Drive"
|
driveFilesAsc: "Least files stored on Drive"
|
||||||
driveFilesDesc: "By the largest number of files stored on Drive"
|
driveFilesDesc: "The largest number of files stored on Drive"
|
||||||
state: "Status"
|
state: "Sort"
|
||||||
states:
|
states:
|
||||||
all: "All"
|
all: "All"
|
||||||
blocked: "Blocked"
|
blocked: "Blocked"
|
||||||
@@ -1308,6 +1389,7 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "Hourly"
|
hour: "Hourly"
|
||||||
day: "Daily"
|
day: "Daily"
|
||||||
|
blocked-hosts: "Blocking"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "More details..."
|
about: "More details..."
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
@@ -1328,8 +1410,6 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "Search feature is turned off in the settings for this instance."
|
not-available: "Search feature is turned off in the settings for this instance."
|
||||||
not-found: "No posts were found for '{q}'"
|
not-found: "No posts were found for '{q}'"
|
||||||
desktop/views/pages/share.vue:
|
|
||||||
share-with: "Share on {name}"
|
|
||||||
desktop/views/pages/tag.vue:
|
desktop/views/pages/tag.vue:
|
||||||
no-posts-found: "No posts contains \"{q}\" found."
|
no-posts-found: "No posts contains \"{q}\" found."
|
||||||
desktop/views/pages/user-list.users.vue:
|
desktop/views/pages/user-list.users.vue:
|
||||||
@@ -1353,7 +1433,7 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
no-description: "The user has not written their profile introduction"
|
no-description: "This user has not written their profile introduction"
|
||||||
years-old: "{age} years old"
|
years-old: "{age} years old"
|
||||||
year: "/"
|
year: "/"
|
||||||
month: "/"
|
month: "/"
|
||||||
@@ -1364,8 +1444,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-replies: "Posts and replies"
|
with-replies: "Posts and replies"
|
||||||
with-media: "Media"
|
with-media: "Media"
|
||||||
my-posts: "My posts"
|
my-posts: "My posts"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Message"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Notifications"
|
title: "Notifications"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@@ -1375,6 +1453,7 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "Post"
|
title: "Post"
|
||||||
note: "Post"
|
note: "Post"
|
||||||
|
something-happened: "Could not be posted in this circumstance."
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "Click to edit your banner"
|
update-banner: "Click to edit your banner"
|
||||||
update-avatar: "Click to edit your avatar"
|
update-avatar: "Click to edit your avatar"
|
||||||
@@ -1393,12 +1472,11 @@ mobile/views/components/drive.vue:
|
|||||||
file-count: "File(s)"
|
file-count: "File(s)"
|
||||||
nothing-in-drive: "There's nothing stored."
|
nothing-in-drive: "There's nothing stored."
|
||||||
folder-is-empty: "This folder is empty"
|
folder-is-empty: "This folder is empty"
|
||||||
prompt: "What do you want to do? (Please enter a number): <1 → Upload a file | 2 → Upload a file from a URL | 3 → Create a folder | 4 → Change this folder's name | 5 → Move this folder | 6 → Delete this folder>"
|
|
||||||
deletion-alert: "Sorry! Deleting a folder is not yet implemented."
|
|
||||||
folder-name: "Folder name"
|
folder-name: "Folder name"
|
||||||
here-is-root: "Currently, you are on the root, not inside of any folder."
|
here-is-root: "Currently, you are on the root, not inside of any folder."
|
||||||
url-prompt: "URL of the file you want to upload"
|
url-prompt: "URL of the file you want to upload"
|
||||||
uploading: "Upload requested. It may take a while for the upload to finish."
|
uploading: "Upload requested. It may take a while for the upload to finish."
|
||||||
|
folder-name-cannot-empty: "Folder name cannot be blank."
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
select-file: "Choose files"
|
select-file: "Choose files"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
@@ -1451,7 +1529,7 @@ mobile/views/components/post-form.vue:
|
|||||||
quote-placeholder: "Quote this post... (optional)"
|
quote-placeholder: "Quote this post... (optional)"
|
||||||
reply-placeholder: "Reply to this note..."
|
reply-placeholder: "Reply to this note..."
|
||||||
cw-placeholder: "Comments for the post (optional)"
|
cw-placeholder: "Comments for the post (optional)"
|
||||||
location-alert: "Your device does not provide location services"
|
geolocation-alert: "Your device does not provide location services."
|
||||||
error: "Error"
|
error: "Error"
|
||||||
username-prompt: "Enter user name"
|
username-prompt: "Enter user name"
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
@@ -1468,13 +1546,19 @@ mobile/views/components/ui.nav.vue:
|
|||||||
follow-requests: "Follow requests"
|
follow-requests: "Follow requests"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
user-lists: "Lists"
|
user-lists: "Lists"
|
||||||
|
user-groups: "Group"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
game: "Games"
|
game: "Games"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
about: "About Misskey"
|
about: "About Misskey"
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/drive.vue:
|
||||||
title: "Lists"
|
contextmenu:
|
||||||
enter-list-name: "Enter a name of the list to make"
|
upload: "Upload a file"
|
||||||
|
url-upload: "Upload file from a URL"
|
||||||
|
create-folder: "Create a folder"
|
||||||
|
rename-folder: "Rename folder"
|
||||||
|
move-folder: "Move this folder"
|
||||||
|
delete-folder: "Delete this folder"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "Your account is now ready! 📦"
|
lets-start: "Your account is now ready! 📦"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1487,7 +1571,7 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Direct posts"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "No posts contains \"{q}\" found."
|
no-posts-found: "No posts contains \"{q}\" found."
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@@ -1499,10 +1583,6 @@ mobile/views/pages/widgets/activity.vue:
|
|||||||
activity: "Activity"
|
activity: "Activity"
|
||||||
mobile/views/pages/share.vue:
|
mobile/views/pages/share.vue:
|
||||||
share-with: "Share on {name}"
|
share-with: "Share on {name}"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
title: "Follow requests"
|
|
||||||
accept: "Accept"
|
|
||||||
reject: "Reject"
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "Post"
|
title: "Post"
|
||||||
prev: "Previous note"
|
prev: "Previous note"
|
||||||
@@ -1558,8 +1638,8 @@ deck:
|
|||||||
stack-left: "Stack to the left"
|
stack-left: "Stack to the left"
|
||||||
pop-right: "Dock on the right"
|
pop-right: "Dock on the right"
|
||||||
disabled-timeline:
|
disabled-timeline:
|
||||||
title: "Timeline has been disabled"
|
title: "The timeline has been disabled"
|
||||||
description: "Timeline has been disabled by the administrator."
|
description: "This timeline has been disabled by the server's administrator."
|
||||||
deck/deck.tl-column.vue:
|
deck/deck.tl-column.vue:
|
||||||
is-media-only: "Only media posts"
|
is-media-only: "Only media posts"
|
||||||
edit: "Options"
|
edit: "Options"
|
||||||
@@ -1575,25 +1655,6 @@ deck/deck.user-column.vue:
|
|||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Found an error, or do you want to contribute to the documentation?"
|
edit-this-page-on-github: "Found an error, or do you want to contribute to the documentation?"
|
||||||
edit-this-page-on-github-link: "Edit this page at GitHub!"
|
edit-this-page-on-github-link: "Edit this page at GitHub!"
|
||||||
api:
|
|
||||||
entities:
|
|
||||||
properties: "Properties"
|
|
||||||
endpoints:
|
|
||||||
params: "Parameters"
|
|
||||||
no-params: "No parameter."
|
|
||||||
res: "Response"
|
|
||||||
require-credential: "This endpoint requires the authentication information."
|
|
||||||
require-permission: "This endpoint requires {permission} permission."
|
|
||||||
has-limit: "There is a rate limit."
|
|
||||||
duration-limit: "If you have sent your requests more than {max} times in {duration} milliseconds, you will be unable to send more requests."
|
|
||||||
min-interval-limit: "If {interval} milliseconds haven't passed since the last request, you can't send a request."
|
|
||||||
show-src: "You can view the source code for this endpoint."
|
|
||||||
show-src-link: "See the code on GitHub"
|
|
||||||
generated: "This document is generated by the API definition."
|
|
||||||
props:
|
|
||||||
name: "Name"
|
|
||||||
type: "Type"
|
|
||||||
description: "Description"
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Manage apps"
|
manage-apps: "Manage apps"
|
||||||
dev/views/apps.vue:
|
dev/views/apps.vue:
|
||||||
@@ -1601,24 +1662,257 @@ dev/views/apps.vue:
|
|||||||
create-app: "Create app"
|
create-app: "Create app"
|
||||||
app-missing: "No apps"
|
app-missing: "No apps"
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
|
new-app: "New Application"
|
||||||
|
new-app-info: "You can also create an application with the API. (app/create)"
|
||||||
create-app: "Creating application"
|
create-app: "Creating application"
|
||||||
app-name: "Application name"
|
app-name: "Application name"
|
||||||
|
app-name-placeholder: "ex) Misskey for iOS"
|
||||||
app-name-desc: "The name of your app"
|
app-name-desc: "The name of your app"
|
||||||
app-name-ex: "ex) Misskey for iOS"
|
|
||||||
app-overview: "Application summary"
|
app-overview: "Application summary"
|
||||||
app-desc: "A brief description or introduction of your app."
|
app-overview-placeholder: " ex) Misskey iOS Client."
|
||||||
app-desc-ex: "ex) Misskey iOS client."
|
app-overview-desc: "A brief description, or an introduction of your app."
|
||||||
callback-url: "The callback URL (optional)"
|
callback-url: "The callback URL (optional)"
|
||||||
|
callback-url-placeholder: "ex) https://your.app.example.com/callback.php"
|
||||||
callback-url-desc: "The URL to redirect to after the user is authenticated via the authentication form."
|
callback-url-desc: "The URL to redirect to after the user is authenticated via the authentication form."
|
||||||
authority: "Permissions"
|
authority: "Permissions"
|
||||||
authority-desc: "Only the functions requested here can be accessed via the API."
|
authority-desc: "Only the functions requested here can be accessed via the API."
|
||||||
authority-warning: "You can change it even after creating the application, but if you give different permissions, all user keys associated at that time will be invalidated."
|
authority-warning: "You can change it even after creating the application, but if you give different permissions, all user keys associated at that time will be invalidated."
|
||||||
account-read: "View account information."
|
pages:
|
||||||
account-write: "Modify account information."
|
new-page: "Create a page"
|
||||||
note-write: "Post."
|
edit-page: "Edit a page"
|
||||||
reaction-write: "Add or remove reactions."
|
read-page: "Viewing the source"
|
||||||
following-write: "Follow and unfollow."
|
page-created: "Created the page!"
|
||||||
drive-read: "Read the drive."
|
page-updated: "Updated the page"
|
||||||
drive-write: "Upload/delete files in the drive."
|
are-you-sure-delete: "Do you want to delete this page?"
|
||||||
notification-read: "Read your notifications."
|
page-deleted: "The page has been deleted"
|
||||||
notification-write: "Manage your notifications."
|
edit-this-page: "Edit this page"
|
||||||
|
view-source: "View Source"
|
||||||
|
view-page: "View page"
|
||||||
|
like: "Like"
|
||||||
|
unlike: "Unlike"
|
||||||
|
liked-pages: "Favorite pages"
|
||||||
|
my-pages: "My pages"
|
||||||
|
inspector: "Inspector"
|
||||||
|
content: "Page block"
|
||||||
|
variables: "Variables"
|
||||||
|
more-details: "Description"
|
||||||
|
title: "Title"
|
||||||
|
url: "Page URL"
|
||||||
|
summary: "Summary of page"
|
||||||
|
align-center: "Center align"
|
||||||
|
font: "Font"
|
||||||
|
fontSerif: "Serif"
|
||||||
|
fontSansSerif: "Sans Serif"
|
||||||
|
set-eye-catching-image: "Set an eye-catching image"
|
||||||
|
remove-eye-catching-image: "Delete an eye-catching image"
|
||||||
|
choose-block: "Add a block"
|
||||||
|
select-type: "Select a type"
|
||||||
|
enter-variable-name: "Please choose a variable name"
|
||||||
|
the-variable-name-is-already-used: "This variable name is already used"
|
||||||
|
content-blocks: "Content"
|
||||||
|
input-blocks: "Input"
|
||||||
|
special-blocks: "Special"
|
||||||
|
post-from-post-form: "Post this content"
|
||||||
|
posted-from-post-form: "Posted!"
|
||||||
|
blocks:
|
||||||
|
text: "Text"
|
||||||
|
textarea: "Text area"
|
||||||
|
section: "Section"
|
||||||
|
image: "Images"
|
||||||
|
button: "Button"
|
||||||
|
if: "If"
|
||||||
|
_if:
|
||||||
|
variable: "Variables"
|
||||||
|
post: "Post form"
|
||||||
|
_post:
|
||||||
|
text: "Content"
|
||||||
|
textInput: "Text input"
|
||||||
|
_textInput:
|
||||||
|
name: "Variable name"
|
||||||
|
text: "Title"
|
||||||
|
default: "Default value"
|
||||||
|
textareaInput: "Multiple type text input"
|
||||||
|
_textareaInput:
|
||||||
|
name: "Variable name"
|
||||||
|
text: "Title"
|
||||||
|
default: "Default value"
|
||||||
|
numberInput: "Numeric input"
|
||||||
|
_numberInput:
|
||||||
|
name: "Variable name"
|
||||||
|
text: "Title"
|
||||||
|
default: "Default value"
|
||||||
|
switch: "Switch"
|
||||||
|
_switch:
|
||||||
|
name: "Variable name"
|
||||||
|
text: "Title"
|
||||||
|
default: "Default value"
|
||||||
|
counter: "Counter"
|
||||||
|
_counter:
|
||||||
|
name: "Variable name"
|
||||||
|
text: "Title"
|
||||||
|
inc: "Increase number"
|
||||||
|
_button:
|
||||||
|
text: "Title"
|
||||||
|
action: "Operation when the button pressed"
|
||||||
|
_action:
|
||||||
|
dialog: "Show a dialog"
|
||||||
|
_dialog:
|
||||||
|
content: "Content"
|
||||||
|
resetRandom: "Reset a random number"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
flow: "Control"
|
||||||
|
logical: "Logical operation"
|
||||||
|
operation: "Compute"
|
||||||
|
comparison: "Compare"
|
||||||
|
random: "Random"
|
||||||
|
value: "Value"
|
||||||
|
fn: "Function"
|
||||||
|
text: "Text operation"
|
||||||
|
convert: "Variable"
|
||||||
|
list: "Lists"
|
||||||
|
blocks:
|
||||||
|
text: "Text"
|
||||||
|
multiLineText: "Text (Multiple lines)"
|
||||||
|
textList: "List of text"
|
||||||
|
_textList:
|
||||||
|
info: "Separate each one with a newline"
|
||||||
|
strLen: "Length of text"
|
||||||
|
_strLen:
|
||||||
|
arg1: "Text"
|
||||||
|
strPick: "Extract character"
|
||||||
|
_strPick:
|
||||||
|
arg1: "Text"
|
||||||
|
arg2: "Position of character"
|
||||||
|
strReplace: "Replace string(s)"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "Text"
|
||||||
|
arg2: "Before replacement"
|
||||||
|
arg3: "After replacement"
|
||||||
|
strReverse: "Flip text"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "Text"
|
||||||
|
_join:
|
||||||
|
arg1: "Lists"
|
||||||
|
arg2: "Separator"
|
||||||
|
add: "+ Plus"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "- Minus"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "× Multiply"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "÷ Divide"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
_remind:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
eq: "A and B are equal"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "A and B are different"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "A and B"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "A or B"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "A is smaller than B"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "A is bigger than B"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "A is smaller or same than B"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: "A is bigger or same than B"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "Branch"
|
||||||
|
_if:
|
||||||
|
arg1: "If"
|
||||||
|
arg2: "then"
|
||||||
|
arg3: "else"
|
||||||
|
not: "denial"
|
||||||
|
_not:
|
||||||
|
arg1: "denial"
|
||||||
|
random: "Random"
|
||||||
|
_random:
|
||||||
|
arg1: "Probability"
|
||||||
|
rannum: "Random number"
|
||||||
|
_rannum:
|
||||||
|
arg1: "Minimum"
|
||||||
|
arg2: "Maximum"
|
||||||
|
randomPick: "Choose at random from the list"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Lists"
|
||||||
|
dailyRandom: "Random (Daily for each user)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "Probability"
|
||||||
|
dailyRannum: "Random number (Daily for each user)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "Minimum"
|
||||||
|
arg2: "Maximum"
|
||||||
|
dailyRandomPick: "Choose at random from the list (Daily for each user)"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Lists"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "Seed"
|
||||||
|
arg2: "Probability"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "Seed"
|
||||||
|
arg2: "Minimum"
|
||||||
|
arg3: "Maximum"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "Seed"
|
||||||
|
arg2: "Lists"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "List of text"
|
||||||
|
_pick:
|
||||||
|
arg1: "Lists"
|
||||||
|
arg2: "Position"
|
||||||
|
number: "Number"
|
||||||
|
stringToNumber: "Text to number"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "Text"
|
||||||
|
numberToString: "Number to text"
|
||||||
|
_numberToString:
|
||||||
|
arg1: "Number"
|
||||||
|
splitStrByLine: "Split the text by lines"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "Text"
|
||||||
|
ref: "Variables"
|
||||||
|
fn: "Function"
|
||||||
|
_fn:
|
||||||
|
slots: "Slots"
|
||||||
|
arg1: "Output"
|
||||||
|
for: "Repeat"
|
||||||
|
thereIsEmptySlot: "Slot {slot} is empty!"
|
||||||
|
types:
|
||||||
|
string: "Text"
|
||||||
|
number: "Number"
|
||||||
|
boolean: "Flag"
|
||||||
|
array: "Lists"
|
||||||
|
stringArray: "List of text"
|
||||||
|
emptySlot: "Empty slot"
|
||||||
|
enviromentVariables: "Environment variable"
|
||||||
|
pageVariables: "Page element"
|
||||||
|
argVariables: "Input slot"
|
||||||
|
|||||||
1274
locales/es-ES.yml
1274
locales/es-ES.yml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -5,22 +5,50 @@
|
|||||||
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
|
'cs-CZ',
|
||||||
.map(lang => [lang, loadLocale(lang)])
|
'da-DK',
|
||||||
.map(([lang, locale], _, locales) => {
|
'de-DE',
|
||||||
switch (lang) {
|
'en-US',
|
||||||
case 'ja-JP': return [lang, locale];
|
'es-ES',
|
||||||
case 'en-US': return [lang, { ...locales['ja-JP'], ...locale }];
|
'fr-FR',
|
||||||
default: return [lang, {
|
'ja-JP',
|
||||||
...(lang.startsWith('ja-') ? {} : locales['en-US']),
|
'ja-KS',
|
||||||
...locales['ja-JP'],
|
'ko-KR',
|
||||||
...locale
|
'nl-NL',
|
||||||
}];
|
'pl-PL',
|
||||||
|
'zh-CN',
|
||||||
|
'zh-TW',
|
||||||
|
];
|
||||||
|
|
||||||
|
const primaries = {
|
||||||
|
'en': 'US',
|
||||||
|
'ja': 'JP',
|
||||||
|
'zh': 'CN',
|
||||||
|
};
|
||||||
|
|
||||||
|
const locales = languages.reduce((a, c) => (a[c] = yaml.safeLoad(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8')) || {}, a), {});
|
||||||
|
|
||||||
|
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), {});
|
||||||
.map(([lang, locale]) => ({ [lang]: loadLocale(lang) }));
|
|
||||||
|
|
||||||
module.exports = locales.reduce((a, b) => ({ ...a, ...b }));
|
|
||||||
|
|||||||
1620
locales/it-IT.yml
1620
locales/it-IT.yml
File diff suppressed because it is too large
Load Diff
@@ -35,6 +35,7 @@ common:
|
|||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signout: "ログアウト"
|
signout: "ログアウト"
|
||||||
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
||||||
|
fetching-as-ap-object: "連合に照会中"
|
||||||
|
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
@@ -64,6 +65,7 @@ common:
|
|||||||
|
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
pages: "ページ"
|
||||||
messaging: "トーク"
|
messaging: "トーク"
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
deck: "デッキ"
|
deck: "デッキ"
|
||||||
@@ -73,10 +75,60 @@ common:
|
|||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
favorites: "お気に入り"
|
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:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||||
explore: "ユーザーを探索する"
|
explore: "ユーザーを探索する"
|
||||||
|
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "位置情報を添付する"
|
||||||
|
hide-contents: "内容を隠す"
|
||||||
|
reply-placeholder: "この投稿への返信..."
|
||||||
|
quote-placeholder: "この投稿を引用..."
|
||||||
|
option-quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
|
quote-attached: "引用付き"
|
||||||
|
quote-question: "引用として添付しますか?"
|
||||||
|
submit: "投稿"
|
||||||
|
reply: "返信"
|
||||||
|
renote: "Renote"
|
||||||
|
posting: "投稿中"
|
||||||
|
attach-media-from-local: "PCからメディアを添付"
|
||||||
|
attach-media-from-drive: "ドライブからメディアを添付"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "アンケートを作成"
|
||||||
|
text-remain: "残り{}文字"
|
||||||
|
recent-tags: "最近"
|
||||||
|
local-only-message: "この投稿はローカルにのみ公開されます"
|
||||||
|
click-to-tagging: "クリックでタグ付け"
|
||||||
|
visibility: "公開範囲"
|
||||||
|
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||||
|
error: "エラー"
|
||||||
|
enter-username: "ユーザー名を入力してください"
|
||||||
|
add-visible-user: "ユーザーを追加"
|
||||||
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
|
username-prompt: "ユーザー名を入力してください"
|
||||||
|
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -239,9 +291,9 @@ common:
|
|||||||
update-available-title: "更新があります"
|
update-available-title: "更新があります"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
verified-user: "公式アカウント"
|
|
||||||
hide-password: "パスワードを隠す"
|
hide-password: "パスワードを隠す"
|
||||||
show-password: "パスワードを表示する"
|
show-password: "パスワードを表示する"
|
||||||
|
enter-username: "ユーザー名を入力してください"
|
||||||
|
|
||||||
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
|
do-not-use-in-production: "これは開発ビルドです。本番環境で使用しないでください。"
|
||||||
user-suspended: "このユーザーは凍結されています。"
|
user-suspended: "このユーザーは凍結されています。"
|
||||||
@@ -291,6 +343,7 @@ common:
|
|||||||
nav: "ナビゲーション"
|
nav: "ナビゲーション"
|
||||||
tips: "ヒント"
|
tips: "ヒント"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
|
queue: "キュー"
|
||||||
|
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
@@ -299,15 +352,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: "アクセスを許可"
|
||||||
|
|
||||||
@@ -323,7 +367,7 @@ auth/views/index.vue:
|
|||||||
sign-in: "サインインしてください"
|
sign-in: "サインインしてください"
|
||||||
|
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "公式アカウント"
|
pinned-users: "ピン留めされたユーザー"
|
||||||
popular-users: "人気のユーザー"
|
popular-users: "人気のユーザー"
|
||||||
recently-updated-users: "最近投稿したユーザー"
|
recently-updated-users: "最近投稿したユーザー"
|
||||||
recently-registered-users: "新規ユーザー"
|
recently-registered-users: "新規ユーザー"
|
||||||
@@ -334,6 +378,7 @@ common/views/pages/explore.vue:
|
|||||||
|
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "プレイヤーを開く"
|
enable-player: "プレイヤーを開く"
|
||||||
|
disable-player: "プレイヤーを閉じる"
|
||||||
|
|
||||||
common/views/components/user-list.vue:
|
common/views/components/user-list.vue:
|
||||||
no-users: "ユーザーがいません"
|
no-users: "ユーザーがいません"
|
||||||
@@ -464,20 +509,25 @@ common/views/components/messaging.vue:
|
|||||||
search-user: "ユーザーを探す"
|
search-user: "ユーザーを探す"
|
||||||
you: "あなた"
|
you: "あなた"
|
||||||
no-history: "履歴はありません"
|
no-history: "履歴はありません"
|
||||||
|
user: "ユーザー"
|
||||||
|
group: "グループ"
|
||||||
|
start-with-user: "ユーザーとトークを開始"
|
||||||
|
start-with-group: "グループとトークを開始"
|
||||||
|
select-group: "グループを選択してください"
|
||||||
|
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "このユーザーと話したことはありません"
|
not-talked-user: "このユーザーとの会話はありません"
|
||||||
|
not-talked-group: "このグループでの会話はありません"
|
||||||
no-history: "これより過去の履歴はありません"
|
no-history: "これより過去の履歴はありません"
|
||||||
resize-form: "ドラッグしてフォームの広さを調整"
|
|
||||||
new-message: "新しいメッセージがあります"
|
new-message: "新しいメッセージがあります"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "メッセージに添付できるファイルはひとつです"
|
||||||
|
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "ここにメッセージを入力"
|
input-message-here: "ここにメッセージを入力"
|
||||||
send: "送信"
|
send: "送信"
|
||||||
attach-from-local: "PCからファイルを添付する"
|
attach-from-local: "PCからファイルを添付する"
|
||||||
attach-from-drive: "ドライブからファイルを添付する"
|
attach-from-drive: "ドライブからファイルを添付する"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "メッセージに添付できるファイルはひとつです"
|
||||||
|
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "既読"
|
is-read: "既読"
|
||||||
@@ -492,6 +542,7 @@ common/views/components/nav.vue:
|
|||||||
repository: "リポジトリ"
|
repository: "リポジトリ"
|
||||||
develop: "開発者"
|
develop: "開発者"
|
||||||
feedback: "フィードバック"
|
feedback: "フィードバック"
|
||||||
|
tos: "利用規約"
|
||||||
|
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
@@ -512,8 +563,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: "スパムを報告"
|
||||||
@@ -521,16 +576,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つ必要です"
|
||||||
@@ -538,9 +602,24 @@ 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: "リアクションを選択"
|
||||||
|
input-reaction-placeholder: "または絵文字を入力"
|
||||||
|
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "カスタム絵文字"
|
custom-emoji: "カスタム絵文字"
|
||||||
@@ -585,6 +664,8 @@ common/views/components/signup.vue:
|
|||||||
password-matched: "確認されました"
|
password-matched: "確認されました"
|
||||||
password-not-matched: "一致していません"
|
password-not-matched: "一致していません"
|
||||||
recaptcha: "認証"
|
recaptcha: "認証"
|
||||||
|
agree-to: "{0}に同意します。"
|
||||||
|
tos: "利用規約"
|
||||||
create: "アカウント作成"
|
create: "アカウント作成"
|
||||||
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
|
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
|
||||||
|
|
||||||
@@ -682,12 +763,16 @@ common/views/components/profile-editor.vue:
|
|||||||
email-verified: "メールアドレスが確認されました"
|
email-verified: "メールアドレスが確認されました"
|
||||||
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
export: "エクスポート"
|
export: "エクスポート"
|
||||||
|
import: "インポート"
|
||||||
|
export-and-import: "エクスポートとインポート"
|
||||||
export-targets:
|
export-targets:
|
||||||
all-notes: "すべての投稿データ"
|
all-notes: "すべての投稿データ"
|
||||||
following-list: "フォロー"
|
following-list: "フォロー"
|
||||||
mute-list: "ミュート"
|
mute-list: "ミュート"
|
||||||
blocking-list: "ブロック"
|
blocking-list: "ブロック"
|
||||||
|
user-lists: "リスト"
|
||||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||||
|
import-requested: "インポートをリクエストしました。これには時間がかかる場合があります。"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
danger-zone: "危険な設定"
|
danger-zone: "危険な設定"
|
||||||
delete-account: "アカウントを削除"
|
delete-account: "アカウントを削除"
|
||||||
@@ -700,6 +785,35 @@ common/views/components/user-list-editor.vue:
|
|||||||
remove-user: "このリストから削除"
|
remove-user: "このリストから削除"
|
||||||
delete-are-you-sure: "リスト「$1」を削除しますか?"
|
delete-are-you-sure: "リスト「$1」を削除しますか?"
|
||||||
deleted: "削除しました"
|
deleted: "削除しました"
|
||||||
|
add-user: "ユーザーを追加"
|
||||||
|
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
users: "メンバー"
|
||||||
|
rename: "グループ名を変更"
|
||||||
|
delete: "グループを削除"
|
||||||
|
transfer: "グループを譲渡"
|
||||||
|
transfer-are-you-sure: "グループ「$1」を「@$2」さんに譲渡しますか?"
|
||||||
|
transferred: "グループを譲渡しました"
|
||||||
|
remove-user: "このグループから削除"
|
||||||
|
delete-are-you-sure: "グループ「$1」を削除しますか?"
|
||||||
|
deleted: "削除しました"
|
||||||
|
invite: "招待"
|
||||||
|
invited: "招待を送信しました"
|
||||||
|
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "リスト"
|
||||||
|
create-list: "リストを作成"
|
||||||
|
list-name: "リスト名"
|
||||||
|
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
user-groups: "グループ"
|
||||||
|
create-group: "グループを作成"
|
||||||
|
group-name: "グループ名"
|
||||||
|
owned-groups: "自分のグループ"
|
||||||
|
joined-groups: "参加しているグループ"
|
||||||
|
invites: "招待"
|
||||||
|
accept-invite: "参加"
|
||||||
|
reject-invite: "拒否"
|
||||||
|
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "確認中"
|
fetching: "確認中"
|
||||||
@@ -773,6 +887,11 @@ common/views/pages/follow.vue:
|
|||||||
follow-processing: "フォロー処理中"
|
follow-processing: "フォロー処理中"
|
||||||
follow-request: "フォロー申請"
|
follow-request: "フォロー申請"
|
||||||
|
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
received-follow-requests: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
|
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "バナーとして表示する部分を選択"
|
banner-crop-title: "バナーとして表示する部分を選択"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -901,12 +1020,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: "この投稿は削除されました"
|
||||||
@@ -932,35 +1045,12 @@ desktop/views/components/notifications.vue:
|
|||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
|
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+ユーザーを追加"
|
|
||||||
attach-location-information: "位置情報を添付する"
|
|
||||||
hide-contents: "内容を隠す"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
|
||||||
quote-placeholder: "この投稿を引用..."
|
|
||||||
submit: "投稿"
|
|
||||||
reply: "返信"
|
|
||||||
renote: "Renote"
|
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
replied: "返信しました!"
|
replied: "返信しました!"
|
||||||
reposted: "Renoteしました!"
|
reposted: "Renoteしました!"
|
||||||
note-failed: "投稿に失敗しました"
|
note-failed: "投稿に失敗しました"
|
||||||
reply-failed: "返信に失敗しました"
|
reply-failed: "返信に失敗しました"
|
||||||
renote-failed: "Renoteに失敗しました"
|
renote-failed: "Renoteに失敗しました"
|
||||||
posting: "投稿中"
|
|
||||||
attach-media-from-local: "PCからメディアを添付"
|
|
||||||
attach-media-from-drive: "ドライブからメディアを添付"
|
|
||||||
attach-cancel: "添付取り消し"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "アンケートを作成"
|
|
||||||
text-remain: "残り{}文字"
|
|
||||||
recent-tags: "最近"
|
|
||||||
local-only-message: "この投稿はローカルにのみ公開されます"
|
|
||||||
click-to-tagging: "クリックでタグ付け"
|
|
||||||
visibility: "公開範囲"
|
|
||||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
|
||||||
error: "エラー"
|
|
||||||
enter-username: "ユーザー名を入力してください"
|
|
||||||
annotations: "内容への注釈 (オプション)"
|
|
||||||
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "新規投稿"
|
note: "新規投稿"
|
||||||
@@ -1055,6 +1145,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: "この投稿は削除されました"
|
||||||
@@ -1067,16 +1162,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: "ハッシュタグを追加"
|
||||||
@@ -1090,6 +1182,7 @@ desktop/views/components/ui.header.vue:
|
|||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
groups: "グループ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
|
|
||||||
@@ -1105,16 +1198,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
title: "フォロー申請"
|
|
||||||
accept: "承認"
|
|
||||||
reject: "拒否"
|
|
||||||
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "リスト"
|
|
||||||
create-list: "リストを作成"
|
|
||||||
list-name: "リスト名"
|
|
||||||
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1140,7 +1223,6 @@ admin/views/index.vue:
|
|||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
|
||||||
abuse: "スパム報告"
|
abuse: "スパム報告"
|
||||||
queue: "ジョブキュー"
|
queue: "ジョブキュー"
|
||||||
logs: "ログ"
|
logs: "ログ"
|
||||||
@@ -1156,8 +1238,35 @@ admin/views/dashboard.vue:
|
|||||||
federated: "連合"
|
federated: "連合"
|
||||||
|
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "操作"
|
title: "キュー"
|
||||||
remove-all-jobs: "すべてのジョブをクリア"
|
remove-all-jobs: "すべてのジョブをクリア"
|
||||||
|
jobs: "ジョブ"
|
||||||
|
queue: "キュー"
|
||||||
|
domains:
|
||||||
|
deliver: "配送"
|
||||||
|
inbox: "受信"
|
||||||
|
db: "データベース"
|
||||||
|
objectStorage: "オブジェクトストレージ"
|
||||||
|
state: "状態"
|
||||||
|
states:
|
||||||
|
active: "処理中"
|
||||||
|
delayed: "予約済み"
|
||||||
|
waiting: "順番待ち"
|
||||||
|
result-is-truncated: "結果は省略されています"
|
||||||
|
other-queues: "その他のキュー"
|
||||||
|
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "ログ"
|
||||||
|
domain: "ドメイン"
|
||||||
|
level: "レベル"
|
||||||
|
levels:
|
||||||
|
all: "全て"
|
||||||
|
info: "情報"
|
||||||
|
success: "成功"
|
||||||
|
warning: "警告"
|
||||||
|
error: "エラー"
|
||||||
|
debug: "デバッグ"
|
||||||
|
delete-all: "全て削除"
|
||||||
|
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
title: "スパム報告"
|
||||||
@@ -1171,14 +1280,34 @@ admin/views/instance.vue:
|
|||||||
instance-name: "インスタンス名"
|
instance-name: "インスタンス名"
|
||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
|
icon-url: "アイコンURL"
|
||||||
|
logo-url: "ロゴURL"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
error-image-url: "エラー画像URL"
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
|
tos-url: "利用規約URL"
|
||||||
|
repository-url: "リポジトリURL"
|
||||||
|
feedback-url: "フィードバックURL"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
maintainer-name: "管理者名"
|
maintainer-name: "管理者名"
|
||||||
maintainer-email: "管理者の連絡先"
|
maintainer-email: "管理者の連絡先"
|
||||||
|
advanced-config: "その他の設定"
|
||||||
|
note-and-tl: "投稿とタイムライン"
|
||||||
drive-config: "ドライブの設定"
|
drive-config: "ドライブの設定"
|
||||||
|
use-object-storage: "オブジェクトストレージを使用する"
|
||||||
|
object-storage-base-url: "URL"
|
||||||
|
object-storage-bucket: "バケット名"
|
||||||
|
object-storage-prefix: "プレフィックス"
|
||||||
|
object-storage-endpoint: "エンドポイント"
|
||||||
|
object-storage-region: "リージョン"
|
||||||
|
object-storage-port: "ポート"
|
||||||
|
object-storage-access-key: "アクセスキー"
|
||||||
|
object-storage-secret-key: "シークレットキー"
|
||||||
|
object-storage-use-ssl: "SSLを使用"
|
||||||
|
object-storage-s3-info: "Amazon S3をオブジェクトストレージとして使用する場合の「エンドポイント」と「リージョン」の設定については{0}をご確認ください。"
|
||||||
|
object-storage-s3-info-here: "こちら"
|
||||||
|
object-storage-gcs-info: "Google Cloud Storageをオブジェクトストレージとして使用する場合、「エンドポイント」は storage.googleapis.com に設定し、「リージョン」は空欄にします。"
|
||||||
cache-remote-files: "リモートのファイルをキャッシュする"
|
cache-remote-files: "リモートのファイルをキャッシュする"
|
||||||
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
|
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
|
||||||
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
@@ -1186,9 +1315,14 @@ admin/views/instance.vue:
|
|||||||
mb: "メガバイト単位"
|
mb: "メガバイト単位"
|
||||||
recaptcha-config: "reCAPTCHAの設定"
|
recaptcha-config: "reCAPTCHAの設定"
|
||||||
recaptcha-info: "reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。"
|
recaptcha-info: "reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。"
|
||||||
|
recaptcha-info2: "v3は非対応です。v2を使用してください。"
|
||||||
enable-recaptcha: "reCAPTCHAを有効にする"
|
enable-recaptcha: "reCAPTCHAを有効にする"
|
||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "サイトキー"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "シークレットキー"
|
||||||
|
recaptcha-preview: "プレビュー"
|
||||||
|
hidden-tags: "非表示ハッシュタグ"
|
||||||
|
hidden-tags-info: "集計から除外するハッシュタグを改行で区切って記述します。"
|
||||||
|
external-service-integration-config: "外部サービス連携"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
@@ -1214,15 +1348,13 @@ 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: "おすすめユーザー"
|
pinned-users: "ピン留めユーザー"
|
||||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
pinned-users-info: "ピン留めしたいユーザーを改行で区切って記述します。"
|
||||||
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: "メール配信を有効にする"
|
||||||
@@ -1290,6 +1422,9 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
marked-as-sensitive: "閲覧注意に設定しました"
|
marked-as-sensitive: "閲覧注意に設定しました"
|
||||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
unmarked-as-sensitive: "閲覧注意を解除しました"
|
||||||
|
clean-remote-files: "リモートファイルのキャッシュを削除"
|
||||||
|
clean-remote-files-are-you-sure: "すべてのリモートファイルのキャッシュを削除してもよろしいですか?"
|
||||||
|
clean-up: "クリーンアップ"
|
||||||
|
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
@@ -1306,15 +1441,13 @@ admin/views/users.vue:
|
|||||||
unsuspend-confirm: "凍結を解除しますか?"
|
unsuspend-confirm: "凍結を解除しますか?"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
make-silence: "サイレンス"
|
make-silence: "サイレンス"
|
||||||
|
silence-confirm: "サイレンスしますか?"
|
||||||
unmake-silence: "サイレンスの解除"
|
unmake-silence: "サイレンスの解除"
|
||||||
verify: "公式アカウントにする"
|
unsilence-confirm: "サイレンスを解除しますか?"
|
||||||
verify-confirm: "公式アカウントにしますか?"
|
|
||||||
verified: "公式アカウントにしました"
|
|
||||||
unverify: "公式アカウントを解除する"
|
|
||||||
unverify-confirm: "公式アカウントを解除しますか?"
|
|
||||||
unverified: "公式アカウントを解除しました"
|
|
||||||
update-remote-user: "リモートユーザー情報の更新"
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
remote-user-updated: "リモートユーザー情報を更新しました"
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
|
delete-all-files: "すべてのファイルを削除"
|
||||||
|
delete-all-files-confirm: "すべてのファイルを削除しますか?"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@@ -1329,7 +1462,6 @@ admin/views/users.vue:
|
|||||||
admin: "管理者"
|
admin: "管理者"
|
||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
|
||||||
silenced: "サイレンス済み"
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
@@ -1384,21 +1516,23 @@ admin/views/hashtags.vue:
|
|||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
|
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "連合"
|
instance: "インスタンス"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
caught-at: "登録日時"
|
||||||
status: "ステータス"
|
status: "ステータス"
|
||||||
latest-request-sent-at: "直近のリクエスト送信"
|
latest-request-sent-at: "直近のリクエスト送信"
|
||||||
latest-request-received-at: "直近のリクエスト受信"
|
latest-request-received-at: "直近のリクエスト受信"
|
||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
|
delete-all-files: "ファイルをすべて削除"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
marked-as-closed: "閉鎖されているとマーク"
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "連合"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
sort: "ソート"
|
sort: "ソート"
|
||||||
sorts:
|
sorts:
|
||||||
@@ -1441,6 +1575,9 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "1時間ごと"
|
hour: "1時間ごと"
|
||||||
day: "1日ごと"
|
day: "1日ごと"
|
||||||
|
blocked-hosts: "ブロック"
|
||||||
|
blocked-hosts-info: "ブロックしたいホストを改行で区切って記述します。"
|
||||||
|
save: "保存"
|
||||||
|
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
@@ -1467,9 +1604,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}」が付けられた投稿は見つかりませんでした。"
|
||||||
|
|
||||||
@@ -1511,9 +1645,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-media: "メディア"
|
with-media: "メディア"
|
||||||
my-posts: "私の投稿"
|
my-posts: "私の投稿"
|
||||||
|
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
|
|
||||||
@@ -1525,6 +1656,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: "クリックでバナー編集"
|
||||||
@@ -1547,12 +1679,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: "フォルダー名"
|
||||||
here-is-root: "現在いる場所はルートで、フォルダではありません。"
|
here-is-root: "現在いる場所はルートで、フォルダではありません。"
|
||||||
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: "ファイルを選択"
|
||||||
@@ -1609,18 +1740,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
|
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "ユーザーを追加"
|
|
||||||
submit: "投稿"
|
|
||||||
reply: "返信"
|
|
||||||
renote: "Renote"
|
|
||||||
quote-placeholder: "この投稿を引用... (オプション)"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
|
||||||
error: "エラー"
|
|
||||||
username-prompt: "ユーザー名を入力してください"
|
|
||||||
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -1637,14 +1756,20 @@ mobile/views/components/ui.nav.vue:
|
|||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
|
user-groups: "グループ"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
|
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/drive.vue:
|
||||||
title: "リスト"
|
contextmenu:
|
||||||
enter-list-name: "リスト名を入力してください"
|
upload: "ファイルをアップロード"
|
||||||
|
url-upload: "ファイルをURLでアップロード"
|
||||||
|
create-folder: "フォルダーを作成"
|
||||||
|
rename-folder: "フォルダー名を変更"
|
||||||
|
move-folder: "このフォルダを移動"
|
||||||
|
delete-folder: "このフォルダを削除"
|
||||||
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1661,7 +1786,7 @@ 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}」が付けられた投稿は見つかりませんでした。"
|
||||||
@@ -1678,11 +1803,6 @@ mobile/views/pages/widgets/activity.vue:
|
|||||||
mobile/views/pages/share.vue:
|
mobile/views/pages/share.vue:
|
||||||
share-with: "{name}で共有"
|
share-with: "{name}で共有"
|
||||||
|
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
title: "フォロー申請"
|
|
||||||
accept: "承認"
|
|
||||||
reject: "拒否"
|
|
||||||
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
@@ -1767,26 +1887,6 @@ docs:
|
|||||||
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
||||||
edit-this-page-on-github-link: "このページをGitHubで編集"
|
edit-this-page-on-github-link: "このページをGitHubで編集"
|
||||||
|
|
||||||
api:
|
|
||||||
entities:
|
|
||||||
properties: "プロパティ"
|
|
||||||
endpoints:
|
|
||||||
params: "パラメータ"
|
|
||||||
no-params: "パラメータはありません"
|
|
||||||
res: "レスポンス"
|
|
||||||
require-credential: "このエンドポイントは認証情報が必須です。"
|
|
||||||
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
|
||||||
has-limit: "レートリミットがあります。"
|
|
||||||
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
|
||||||
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
|
||||||
show-src: "このエンドポイントのソースコードも閲覧できます。"
|
|
||||||
show-src-link: "コードをGitHubで見る"
|
|
||||||
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
|
|
||||||
props:
|
|
||||||
name: "名前"
|
|
||||||
type: "型"
|
|
||||||
description: "説明"
|
|
||||||
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
|
||||||
@@ -1796,24 +1896,283 @@ 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: "アカウントの情報を操作する。"
|
pages:
|
||||||
note-write: "投稿する。"
|
new-page: "ページの作成"
|
||||||
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
edit-page: "ページの編集"
|
||||||
following-write: "フォローしたりフォロー解除する。"
|
read-page: "ソースを表示中"
|
||||||
drive-read: "ドライブを見る。"
|
page-created: "ページを作成しました"
|
||||||
drive-write: "ドライブを操作する。"
|
page-updated: "ページを更新しました"
|
||||||
notification-read: "通知を見る。"
|
are-you-sure-delete: "このページを削除しますか?"
|
||||||
notification-write: "通知を操作する。"
|
page-deleted: "ページを削除しました"
|
||||||
|
edit-this-page: "このページを編集"
|
||||||
|
view-source: "ソースを表示"
|
||||||
|
view-page: "ページを見る"
|
||||||
|
like: "いいね"
|
||||||
|
unlike: "いいね解除"
|
||||||
|
liked-pages: "いいねしたページ"
|
||||||
|
my-pages: "自分のページ"
|
||||||
|
inspector: "インスペクター"
|
||||||
|
content: "ページブロック"
|
||||||
|
variables: "変数"
|
||||||
|
variables-info: "変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。"
|
||||||
|
variables-info2: "変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。"
|
||||||
|
variables-info3: "ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。"
|
||||||
|
variables-info4: "関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、AiScript標準で関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。"
|
||||||
|
more-details: "詳しい説明"
|
||||||
|
title: "タイトル"
|
||||||
|
url: "ページURL"
|
||||||
|
summary: "ページの要約"
|
||||||
|
align-center: "中央寄せ"
|
||||||
|
font: "フォント"
|
||||||
|
fontSerif: "セリフ"
|
||||||
|
fontSansSerif: "サンセリフ"
|
||||||
|
set-eye-catching-image: "アイキャッチ画像を設定"
|
||||||
|
remove-eye-catching-image: "アイキャッチ画像を削除"
|
||||||
|
choose-block: "ブロックを追加"
|
||||||
|
select-type: "種類を選択"
|
||||||
|
enter-variable-name: "変数名を決めてください"
|
||||||
|
the-variable-name-is-already-used: "その変数名は既に使われています"
|
||||||
|
content-blocks: "コンテンツ"
|
||||||
|
input-blocks: "入力"
|
||||||
|
special-blocks: "特殊"
|
||||||
|
post-from-post-form: "この内容を投稿"
|
||||||
|
posted-from-post-form: "投稿しました"
|
||||||
|
blocks:
|
||||||
|
text: "テキスト"
|
||||||
|
textarea: "テキストエリア"
|
||||||
|
section: "セクション"
|
||||||
|
image: "画像"
|
||||||
|
button: "ボタン"
|
||||||
|
|
||||||
|
if: "もし"
|
||||||
|
_if:
|
||||||
|
variable: "変数"
|
||||||
|
|
||||||
|
post: "投稿フォーム"
|
||||||
|
_post:
|
||||||
|
text: "内容"
|
||||||
|
|
||||||
|
textInput: "テキスト入力"
|
||||||
|
_textInput:
|
||||||
|
name: "変数名"
|
||||||
|
text: "タイトル"
|
||||||
|
default: "デフォルト値"
|
||||||
|
|
||||||
|
textareaInput: "複数行テキスト入力"
|
||||||
|
_textareaInput:
|
||||||
|
name: "変数名"
|
||||||
|
text: "タイトル"
|
||||||
|
default: "デフォルト値"
|
||||||
|
|
||||||
|
numberInput: "数値入力"
|
||||||
|
_numberInput:
|
||||||
|
name: "変数名"
|
||||||
|
text: "タイトル"
|
||||||
|
default: "デフォルト値"
|
||||||
|
|
||||||
|
switch: "スイッチ"
|
||||||
|
_switch:
|
||||||
|
name: "変数名"
|
||||||
|
text: "タイトル"
|
||||||
|
default: "デフォルト値"
|
||||||
|
|
||||||
|
counter: "カウンター"
|
||||||
|
_counter:
|
||||||
|
name: "変数名"
|
||||||
|
text: "タイトル"
|
||||||
|
inc: "増加値"
|
||||||
|
|
||||||
|
_button:
|
||||||
|
text: "タイトル"
|
||||||
|
action: "ボタンを押したときの動作"
|
||||||
|
_action:
|
||||||
|
dialog: "ダイアログを表示する"
|
||||||
|
_dialog:
|
||||||
|
content: "内容"
|
||||||
|
resetRandom: "乱数をリセット"
|
||||||
|
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
flow: "制御"
|
||||||
|
logical: "論理演算"
|
||||||
|
operation: "計算"
|
||||||
|
comparison: "比較"
|
||||||
|
random: "ランダム"
|
||||||
|
value: "値"
|
||||||
|
fn: "関数"
|
||||||
|
text: "テキスト操作"
|
||||||
|
convert: "変換"
|
||||||
|
list: "リスト"
|
||||||
|
blocks:
|
||||||
|
text: "テキスト"
|
||||||
|
multiLineText: "テキスト(複数行)"
|
||||||
|
textList: "テキストのリスト"
|
||||||
|
_textList:
|
||||||
|
info: "ひとつひとつを改行で区切ってください"
|
||||||
|
strLen: "テキストの長さ"
|
||||||
|
_strLen:
|
||||||
|
arg1: "テキスト"
|
||||||
|
strPick: "文字取り出し"
|
||||||
|
_strPick:
|
||||||
|
arg1: "テキスト"
|
||||||
|
arg2: "文字の位置"
|
||||||
|
strReplace: "テキスト置き換え"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "テキスト"
|
||||||
|
arg2: "置き換え前"
|
||||||
|
arg3: "置き換え後"
|
||||||
|
strReverse: "テキストを反転"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "テキスト"
|
||||||
|
join: "テキストを連結"
|
||||||
|
_join:
|
||||||
|
arg1: "リスト"
|
||||||
|
arg2: "区切り"
|
||||||
|
add: "+ 足す"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "- 引く"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "× 掛ける"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "÷ 割る"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
remind: "÷ 割った余り"
|
||||||
|
_remind:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
eq: "AとBが同じ"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "AとBが異なる"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "AかつB"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "AまたはB"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "< AがBより小さい"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "> AがBより大きい"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "<= AがBと同じか小さい"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: ">= AがBと同じか大きい"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "分岐"
|
||||||
|
_if:
|
||||||
|
arg1: "もし"
|
||||||
|
arg2: "なら"
|
||||||
|
arg3: "そうでなければ"
|
||||||
|
not: "否定"
|
||||||
|
_not:
|
||||||
|
arg1: "否定"
|
||||||
|
random: "ランダム"
|
||||||
|
_random:
|
||||||
|
arg1: "確率"
|
||||||
|
rannum: "乱数"
|
||||||
|
_rannum:
|
||||||
|
arg1: "最小"
|
||||||
|
arg2: "最大"
|
||||||
|
randomPick: "リストからランダムに選択"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "リスト"
|
||||||
|
dailyRandom: "ランダム (ユーザーごとに日替わり)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "確率"
|
||||||
|
dailyRannum: "乱数 (ユーザーごとに日替わり)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "最小"
|
||||||
|
arg2: "最大"
|
||||||
|
dailyRandomPick: "リストからランダムに選択 (ユーザーごとに日替わり)"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "リスト"
|
||||||
|
seedRandom: "ランダム (シード)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "シード"
|
||||||
|
arg2: "確率"
|
||||||
|
seedRannum: "乱数 (シード)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "シード"
|
||||||
|
arg2: "最小"
|
||||||
|
arg3: "最大"
|
||||||
|
seedRandomPick: "リストからランダムに選択 (シード)"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "シード"
|
||||||
|
arg2: "リスト"
|
||||||
|
DRPWPM: "確率付きリストからランダムに選択 (ユーザーごとに日替わり)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "テキストのリスト"
|
||||||
|
pick: "リストから選択"
|
||||||
|
_pick:
|
||||||
|
arg1: "リスト"
|
||||||
|
arg2: "位置"
|
||||||
|
number: "数値"
|
||||||
|
stringToNumber: "テキストを数値に"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "テキスト"
|
||||||
|
numberToString: "数値をテキストに"
|
||||||
|
_numberToString:
|
||||||
|
arg1: "数値"
|
||||||
|
splitStrByLine: "テキストを行で分割"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "テキスト"
|
||||||
|
ref: "変数"
|
||||||
|
fn: "関数"
|
||||||
|
_fn:
|
||||||
|
slots: "スロット"
|
||||||
|
slots-info: "スロットひとつひとつを改行で区切ってください"
|
||||||
|
arg1: "出力"
|
||||||
|
for: "繰り返し"
|
||||||
|
_for:
|
||||||
|
arg1: "回数"
|
||||||
|
arg2: "処理"
|
||||||
|
typeError: "スロット{slot}は\"{expect}\"を受け付けますが、\"{actual}\"が入れられています!"
|
||||||
|
thereIsEmptySlot: "スロット{slot}が空です!"
|
||||||
|
types:
|
||||||
|
string: "テキスト"
|
||||||
|
number: "数値"
|
||||||
|
boolean: "フラグ"
|
||||||
|
array: "リスト"
|
||||||
|
stringArray: "テキストのリスト"
|
||||||
|
emptySlot: "空のスロット"
|
||||||
|
enviromentVariables: "環境変数"
|
||||||
|
pageVariables: "ページ要素"
|
||||||
|
argVariables: "入力スロット"
|
||||||
|
|||||||
@@ -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."
|
||||||
@@ -28,13 +27,6 @@ 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: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
|
||||||
got-it: "ほい"
|
got-it: "ほい"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -64,15 +56,12 @@ common:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
messaging: "トーク"
|
messaging: "トーク"
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
deck: "デッキ"
|
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
explore: "みつける"
|
following: "フォローしとる"
|
||||||
following: "フォロー中"
|
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
empty-timeline-info:
|
permissions:
|
||||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
"write:votes": "投票するで"
|
||||||
explore: "ユーザーを探索する"
|
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -118,129 +107,25 @@ common:
|
|||||||
d: "言うときたいことは?"
|
d: "言うときたいことは?"
|
||||||
e: "ここに書いてや"
|
e: "ここに書いてや"
|
||||||
f: "あんさんが書くんを待っちょります..."
|
f: "あんさんが書くんを待っちょります..."
|
||||||
settings: "設定"
|
|
||||||
_settings:
|
_settings:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
|
||||||
tags: "ハッシュタグ"
|
tags: "ハッシュタグ"
|
||||||
mute-and-block: "ミュート/ブロック"
|
|
||||||
blocking: "ブロック"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
|
||||||
signin: "ログイン履歴"
|
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
other: "その他"
|
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: "タイムライン"
|
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: "おk"
|
|
||||||
cancel: "やめる"
|
|
||||||
update-available-title: "更新があんで"
|
update-available-title: "更新があんで"
|
||||||
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
|
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
|
||||||
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
|
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
|
||||||
verified-user: "アメちゃん付きアカウント"
|
enter-username: "ユーザー名を入力してや"
|
||||||
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"
|
||||||
no-notes: "投稿がありません"
|
|
||||||
turn-on-darkmode: "闇に飲まれる"
|
|
||||||
turn-off-darkmode: "光あれ"
|
|
||||||
error:
|
error:
|
||||||
title: "問題が起こったわ"
|
title: "問題が起こったわ"
|
||||||
retry: "もっぺん"
|
retry: "もっぺん"
|
||||||
@@ -279,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:
|
||||||
@@ -305,18 +181,7 @@ auth/views/index.vue:
|
|||||||
error: "セッションが存在してへん。"
|
error: "セッションが存在してへん。"
|
||||||
sign-in: "サインインしてや"
|
sign-in: "サインインしてや"
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "公式アカウント"
|
|
||||||
popular-users: "人気のユーザー"
|
|
||||||
recently-updated-users: "最近投稿したユーザー"
|
|
||||||
recently-registered-users: "新規ユーザー"
|
|
||||||
popular-tags: "人気のタグ"
|
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
explore: "{host}を探索"
|
|
||||||
users-info: "現在{users}ユーザーが登録されています"
|
|
||||||
common/views/components/url-preview.vue:
|
|
||||||
enable-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: "{}を待っとります"
|
||||||
@@ -388,7 +253,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: "デイゲーム"
|
||||||
@@ -405,7 +269,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: "このテーマあかんわ、なんか間違うとる"
|
||||||
@@ -427,25 +290,20 @@ 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: "ユーザーを探す"
|
||||||
you: "あんさん"
|
you: "あんさん"
|
||||||
no-history: "履歴はあらへんで"
|
no-history: "履歴はあらへんで"
|
||||||
|
user: "ユーザー"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "このユーザーと話したことはあらへんで"
|
|
||||||
no-history: "これより過去の履歴はあらへんで"
|
no-history: "これより過去の履歴はあらへんで"
|
||||||
resize-form: "ドラッグしてフォームの広さを調整"
|
|
||||||
new-message: "新しいメッセージがあるで"
|
new-message: "新しいメッセージがあるで"
|
||||||
only-one-file-attached: "メッセージに添付できんのはひとつのファイルのみやで"
|
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "ここにメッセージ書いてや"
|
input-message-here: "ここにメッセージ書いてや"
|
||||||
send: "送信"
|
send: "送信"
|
||||||
attach-from-local: "PCからファイルを添付する"
|
attach-from-local: "PCからファイルを添付する"
|
||||||
attach-from-drive: "ドライブからファイルを添付する"
|
attach-from-drive: "ドライブからファイルを添付する"
|
||||||
only-one-file-attached: "メッセージに添付できんのはひとつのファイルのみやで"
|
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "既読"
|
is-read: "既読"
|
||||||
deleted: "このメッセージは削除されたわ"
|
deleted: "このメッセージは削除されたわ"
|
||||||
@@ -459,38 +317,22 @@ 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: "お気に入りやめる"
|
||||||
watch: "ウォッチ"
|
|
||||||
unwatch: "ウォッチ解除"
|
|
||||||
pin: "ピン留め"
|
pin: "ピン留め"
|
||||||
unpin: "ピン留めやめる"
|
unpin: "ピン留めやめる"
|
||||||
delete: "ほかす"
|
delete: "ほかす"
|
||||||
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: "投票済みや"
|
||||||
@@ -500,6 +342,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:
|
||||||
@@ -554,11 +397,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: "つなげる"
|
||||||
@@ -608,7 +446,6 @@ common/views/components/profile-editor.vue:
|
|||||||
account: "アカウント"
|
account: "アカウント"
|
||||||
location: "場所"
|
location: "場所"
|
||||||
description: "自己紹介"
|
description: "自己紹介"
|
||||||
you-can-include-hashtags: "ハッシュタグを含めることができます。"
|
|
||||||
language: "言語"
|
language: "言語"
|
||||||
birthday: "誕生日"
|
birthday: "誕生日"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
@@ -617,7 +454,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: "保存"
|
||||||
@@ -629,23 +465,23 @@ common/views/components/profile-editor.vue:
|
|||||||
email-verified: "このメールアドレスOKや!"
|
email-verified: "このメールアドレスOKや!"
|
||||||
email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
|
email-not-verified: "メールアドレスが確認されとらん。メールボックスもっぺん見てくれへん?"
|
||||||
export: "エクスポート"
|
export: "エクスポート"
|
||||||
|
import: "インポート"
|
||||||
export-targets:
|
export-targets:
|
||||||
all-notes: "すべての投稿データ"
|
|
||||||
following-list: "フォロー"
|
following-list: "フォロー"
|
||||||
mute-list: "ミュート"
|
mute-list: "ミュート"
|
||||||
blocking-list: "ブロック"
|
blocking-list: "ブロック"
|
||||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
user-lists: "リスト"
|
||||||
enter-password: "パスワードを入力してください"
|
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: "リスト名を変更"
|
add-user: "ユーザー増やす"
|
||||||
delete: "リストを削除"
|
common/views/components/user-group-editor.vue:
|
||||||
remove-user: "このリストから削除"
|
invite: "招待"
|
||||||
delete-are-you-sure: "リスト「$1」を削除しますか?"
|
common/views/components/user-lists.vue:
|
||||||
deleted: "削除しました"
|
user-lists: "リスト"
|
||||||
|
list-name: "リスト名"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
invites: "招待"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "見てみるわ…"
|
fetching: "見てみるわ…"
|
||||||
no-broadcasts: "お知らせはあらへんで"
|
no-broadcasts: "お知らせはあらへんで"
|
||||||
@@ -695,11 +531,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: "フォローしとる"
|
||||||
@@ -707,6 +540,8 @@ common/views/pages/follow.vue:
|
|||||||
request-pending: "フォローの許し待っとる"
|
request-pending: "フォローの許し待っとる"
|
||||||
follow-processing: "今フォロー処理やっとる‥"
|
follow-processing: "今フォロー処理やっとる‥"
|
||||||
follow-request: "フォロー許してくれや!言うてみる"
|
follow-request: "フォロー許してくれや!言うてみる"
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
received-follow-requests: "フォロー許してくれや!言うてみる"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "どこバナーとして出す?"
|
banner-crop-title: "どこバナーとして出す?"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -816,22 +651,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: "この投稿なんか無くなってもうたわ"
|
||||||
@@ -858,8 +687,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: "最近のタグ"
|
||||||
@@ -910,8 +737,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: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
|
||||||
@@ -950,26 +777,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: "ハッシュタグ増やす"
|
||||||
@@ -991,14 +815,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "新規投稿"
|
post: "新規投稿"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
title: "フォロー許してくれや!言うてみる"
|
|
||||||
accept: "許す"
|
|
||||||
reject: "許さん"
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "リスト"
|
|
||||||
create-list: "新しいリストを作成"
|
|
||||||
list-name: "リスト名"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1020,9 +836,6 @@ admin/views/index.vue:
|
|||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
announcements: "知っといてや"
|
announcements: "知っといてや"
|
||||||
hashtags: "ハッシュタグ"
|
|
||||||
abuse: "スパム報告"
|
|
||||||
queue: "ジョブキュー"
|
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Misskeyに戻る"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
@@ -1032,14 +845,8 @@ admin/views/dashboard.vue:
|
|||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
this-instance: "ワイのインスタンス"
|
this-instance: "ワイのインスタンス"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
admin/views/queue.vue:
|
|
||||||
operation: "操作"
|
|
||||||
remove-all-jobs: "すべてのジョブをクリア"
|
|
||||||
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: "インスタンス"
|
||||||
@@ -1047,13 +854,13 @@ 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: "管理者情報"
|
||||||
maintainer-name: "管理者名"
|
maintainer-name: "管理者名"
|
||||||
maintainer-email: "管理者の連絡先"
|
maintainer-email: "管理者の連絡先"
|
||||||
drive-config: "ドライブの設定"
|
drive-config: "ドライブの設定"
|
||||||
|
object-storage-endpoint: "エンドポイント"
|
||||||
cache-remote-files: "リモートのファイルをキャッシュする"
|
cache-remote-files: "リモートのファイルをキャッシュする"
|
||||||
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをこっちで保管せずに直接リンク張るようになるで。サーバーのストレージは軽くやろうけど、プライバシー設定で直リンクを向こうにしとるユーザーはファイルが見れへんし、サムネイルが無いから通信量が増えたりするから、普通はオンにしといてな。"
|
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをこっちで保管せずに直接リンク張るようになるで。サーバーのストレージは軽くやろうけど、プライバシー設定で直リンクを向こうにしとるユーザーはファイルが見れへんし、サムネイルが無いから通信量が増えたりするから、普通はオンにしといてな。"
|
||||||
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
@@ -1062,8 +869,7 @@ admin/views/instance.vue:
|
|||||||
recaptcha-config: "reCAPTCHAの設定"
|
recaptcha-config: "reCAPTCHAの設定"
|
||||||
recaptcha-info: "reCAPTCHAを有効にするにはreCAPTCHAトークンが要るで。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してな。"
|
recaptcha-info: "reCAPTCHAを有効にするにはreCAPTCHAトークンが要るで。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してな。"
|
||||||
enable-recaptcha: "reCAPTCHAを有効にする"
|
enable-recaptcha: "reCAPTCHAを有効にする"
|
||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-preview: "試してみる"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは {url} に設定してや。"
|
twitter-integration-info: "コールバックURLは {url} に設定してや。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
@@ -1087,17 +893,9 @@ 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: "このユーザーええで"
|
|
||||||
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: "メール配信を有効にする"
|
||||||
@@ -1106,15 +904,8 @@ 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"
|
|
||||||
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日ごと"
|
||||||
@@ -1133,7 +924,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: "ドライブのファイル数の増減"
|
||||||
@@ -1143,171 +933,64 @@ 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: "公式アカウント"
|
|
||||||
silenced: "サイレンス済み"
|
|
||||||
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: "内容"
|
|
||||||
saved: "保存しました"
|
|
||||||
_remove:
|
|
||||||
are-you-sure: "「$1」を削除しますか?"
|
|
||||||
removed: "削除しました"
|
|
||||||
admin/views/hashtags.vue:
|
|
||||||
hided-tags: "Hidden Tags"
|
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "連合"
|
instance: "インスタンス"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
following: "フォロー中"
|
following: "フォローしとる"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
status: "ステータス"
|
status: "ステータス"
|
||||||
latest-request-sent-at: "直近のリクエスト送信"
|
|
||||||
latest-request-received-at: "直近のリクエスト受信"
|
|
||||||
remove-all-following: "フォローを全解除"
|
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
marked-as-closed: "閉鎖されているとマーク"
|
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "連合"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
|
||||||
sort: "ソート"
|
|
||||||
sorts:
|
|
||||||
caughtAtAsc: "登録日時が古い順"
|
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
|
||||||
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
|
||||||
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
|
||||||
notesAsc: "投稿が少ない順"
|
|
||||||
notesDesc: "投稿が多い順"
|
|
||||||
usersAsc: "ユーザーが少ない順"
|
|
||||||
usersDesc: "ユーザーが多い順"
|
|
||||||
followingAsc: "フォローが少ない順"
|
|
||||||
followingDesc: "フォローが多い順"
|
|
||||||
followersAsc: "フォロワーが少ない順"
|
|
||||||
followersDesc: "フォロワーが多い順"
|
|
||||||
driveUsageAsc: "ドライブ使用量が少ない順"
|
|
||||||
driveUsageDesc: "ドライブ使用量が多い順"
|
|
||||||
driveFilesAsc: "ドライブのファイル数が少ない順"
|
|
||||||
driveFilesDesc: "ドライブのファイル数が多い順"
|
|
||||||
state: "状態"
|
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
not-responding: "応答なし"
|
|
||||||
marked-as-closed: "閉鎖とマーク済み"
|
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
|
||||||
charts: "チャート"
|
charts: "チャート"
|
||||||
chart-srcs:
|
chart-srcs:
|
||||||
requests: "リクエスト"
|
requests: "リクエスト"
|
||||||
users: "ユーザーの増減"
|
users: "ユーザーの増減"
|
||||||
users-total: "ユーザーの積算"
|
users-total: "ユーザーの積算"
|
||||||
notes: "投稿の増減"
|
|
||||||
notes-total: "投稿の積算"
|
notes-total: "投稿の積算"
|
||||||
ff: "フォロー/フォロワーの増減"
|
|
||||||
ff-total: "フォロー/フォロワーの積算"
|
|
||||||
drive-usage: "ドライブ使用量の増減"
|
drive-usage: "ドライブ使用量の増減"
|
||||||
drive-usage-total: "ドライブ使用量の積算"
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
drive-files: "ドライブファイル数の増減"
|
|
||||||
drive-files-total: "ドライブファイル数の積算"
|
|
||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "1時間ごと"
|
hour: "1時間ごと"
|
||||||
day: "1日ごと"
|
day: "1日ごと"
|
||||||
|
blocked-hosts: "ブロック"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "もうちょい……"
|
about: "もうちょい……"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
@@ -1327,11 +1010,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: "ユーザー増やす"
|
||||||
@@ -1353,19 +1031,15 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
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: "フォローされています"
|
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: "私の投稿"
|
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@@ -1393,10 +1067,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: "フォルダー名"
|
||||||
here-is-root: "現在いる場所はルートで、フォルダではありません。"
|
|
||||||
url-prompt: "このURLのファイルをアップロードしたいねん"
|
url-prompt: "このURLのファイルをアップロードしたいねん"
|
||||||
uploading: "アップロードをリクエストしたで。アップロードが完了するまで時間がかかるかも分からん、知らんけど。"
|
uploading: "アップロードをリクエストしたで。アップロードが完了するまで時間がかかるかも分からん、知らんけど。"
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
@@ -1451,7 +1122,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:
|
||||||
@@ -1472,9 +1143,10 @@ mobile/views/components/ui.nav.vue:
|
|||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
about: "Misskeyってなんや?"
|
about: "Misskeyってなんや?"
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/drive.vue:
|
||||||
title: "リスト"
|
contextmenu:
|
||||||
enter-list-name: "リスト名を入力してや"
|
upload: "ファイル上げる"
|
||||||
|
create-folder: "フォルダー作る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めようや"
|
lets-start: "📦 始めようや"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1484,25 +1156,19 @@ 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/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:
|
||||||
activity: "やっとること"
|
activity: "やっとること"
|
||||||
mobile/views/pages/share.vue:
|
mobile/views/pages/share.vue:
|
||||||
share-with: "{name}で共有"
|
share-with: "{name}で共有"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
title: "フォロー許してくれや!"
|
|
||||||
accept: "許す"
|
|
||||||
reject: "許さん"
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前のやつ"
|
prev: "前のやつ"
|
||||||
@@ -1531,7 +1197,7 @@ 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.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@@ -1540,14 +1206,12 @@ deck:
|
|||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
direct: "ダイレクト投稿"
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
select-list: "リストを選択してください"
|
|
||||||
swap-left: "左に移動や!"
|
swap-left: "左に移動や!"
|
||||||
swap-right: "右に移動や!"
|
swap-right: "右に移動や!"
|
||||||
swap-up: "上に移動や!"
|
swap-up: "上に移動や!"
|
||||||
@@ -1557,14 +1221,11 @@ 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: "メディア投稿だけや"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされとるで"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
@@ -1575,25 +1236,6 @@ deck/deck.user-column.vue:
|
|||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
||||||
edit-this-page-on-github-link: "このページをGitHubで編集"
|
edit-this-page-on-github-link: "このページをGitHubで編集"
|
||||||
api:
|
|
||||||
entities:
|
|
||||||
properties: "プロパティ"
|
|
||||||
endpoints:
|
|
||||||
params: "パラメータ"
|
|
||||||
no-params: "パラメータはありません"
|
|
||||||
res: "レスポンス"
|
|
||||||
require-credential: "このエンドポイントは認証情報が必須です。"
|
|
||||||
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
|
||||||
has-limit: "レートリミットがあります。"
|
|
||||||
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
|
||||||
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
|
||||||
show-src: "このエンドポイントのソースコードも閲覧できます。"
|
|
||||||
show-src-link: "コードをGitHubで見る"
|
|
||||||
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
|
|
||||||
props:
|
|
||||||
name: "名前"
|
|
||||||
type: "型"
|
|
||||||
description: "説明"
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
dev/views/apps.vue:
|
dev/views/apps.vue:
|
||||||
@@ -1604,21 +1246,32 @@ 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: "アカウントの情報見せて"
|
pages:
|
||||||
account-write: "アカウントの情報いじらせて"
|
like: "ええやん"
|
||||||
note-write: "投稿させて"
|
blocks:
|
||||||
reaction-write: "リアクションしたりそれをキャンセルさせて"
|
image: "画像"
|
||||||
following-write: "フォローとかフォロー解除させて"
|
post: "投稿フォーム"
|
||||||
drive-read: "ドライブ見せて"
|
script:
|
||||||
drive-write: "ドライブいじらせて"
|
categories:
|
||||||
notification-read: "通知見せて"
|
random: "いんじゃんほい"
|
||||||
notification-write: "通知いじらせて"
|
list: "リスト"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "リスト"
|
||||||
|
random: "いんじゃんほい"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "リスト"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "リスト"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "リスト"
|
||||||
|
_pick:
|
||||||
|
arg1: "リスト"
|
||||||
|
types:
|
||||||
|
array: "リスト"
|
||||||
|
|||||||
@@ -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: "자신의 생각, 화제의 사건, 모두와 공유하고 싶은 것을 올려주세요. 필요한 경우 다양한 스타일을 사용하여 글을 장식하거나 마음에 드는 이미지, 영상 등의 파일이나 투표를 올리는 것도 가능합니다."
|
||||||
@@ -21,7 +20,7 @@ common:
|
|||||||
outro: "이외에도 Misskey에만 있는 기능이 아직도 더 있으니 부디 여러분 자신의 눈으로 확인해보시기 바랍니다. Misskey는 분산형 SNS라서 이 인스턴스가 마음에 들지 않으신다면 다른 인스턴스를 시도해보실 수도 있습니다. 그럼, GLHF!"
|
outro: "이외에도 Misskey에만 있는 기능이 아직도 더 있으니 부디 여러분 자신의 눈으로 확인해보시기 바랍니다. Misskey는 분산형 SNS라서 이 인스턴스가 마음에 들지 않으신다면 다른 인스턴스를 시도해보실 수도 있습니다. 그럼, GLHF!"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "광고 차단기를 해제하십시오"
|
detected: "광고 차단기를 해제하십시오"
|
||||||
warning: "<strong>Misskey는 광고를 게재하지 않습니다</strong>. 그러나 광고 차단 기능을 사용할 경우 일부 기능을 사용할 수 없게 될 가능성이나 결함이 발생하는 경우가 있습니다."
|
warning: "<strong>Misskey는 광고를 게재하지 않습니다</strong>. 하지만 광고 차단 기능을 사용할 경우 일부 기능을 사용할 수 없거나 문제가 발생할 수 있습니다."
|
||||||
application-authorization: "앱 연계"
|
application-authorization: "앱 연계"
|
||||||
close: "닫기"
|
close: "닫기"
|
||||||
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
|
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
|
||||||
@@ -35,6 +34,7 @@ common:
|
|||||||
signup: "신규 등록"
|
signup: "신규 등록"
|
||||||
signout: "로그아웃"
|
signout: "로그아웃"
|
||||||
reload-to-apply-the-setting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
reload-to-apply-the-setting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
||||||
|
fetching-as-ap-object: "연합에서 조회 중"
|
||||||
got-it: "알겠습니다"
|
got-it: "알겠습니다"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "커스터마이징 도움말"
|
title: "커스터마이징 도움말"
|
||||||
@@ -42,7 +42,7 @@ common:
|
|||||||
gotit: "Got it!"
|
gotit: "Got it!"
|
||||||
notification:
|
notification:
|
||||||
file-uploaded: "파일이 업로드되었습니다"
|
file-uploaded: "파일이 업로드되었습니다"
|
||||||
message-from: "{}님으로부터 메시지:"
|
message-from: "{}님의 메시지:"
|
||||||
reversi-invited: "게임 초대가 있습니다"
|
reversi-invited: "게임 초대가 있습니다"
|
||||||
reversi-invited-by: "{}님으로부터"
|
reversi-invited-by: "{}님으로부터"
|
||||||
notified-by: "{}님으로부터"
|
notified-by: "{}님으로부터"
|
||||||
@@ -51,7 +51,7 @@ common:
|
|||||||
time:
|
time:
|
||||||
unknown: "알 수 없는 시간"
|
unknown: "알 수 없는 시간"
|
||||||
future: "미래"
|
future: "미래"
|
||||||
just_now: "방금"
|
just_now: "방금 전"
|
||||||
seconds_ago: "{}초 전"
|
seconds_ago: "{}초 전"
|
||||||
minutes_ago: "{}분 전"
|
minutes_ago: "{}분 전"
|
||||||
hours_ago: "{}시간 전"
|
hours_ago: "{}시간 전"
|
||||||
@@ -62,14 +62,36 @@ common:
|
|||||||
month-and-day: "{month}월 {day}일"
|
month-and-day: "{month}월 {day}일"
|
||||||
trash: "휴지통"
|
trash: "휴지통"
|
||||||
drive: "드라이브"
|
drive: "드라이브"
|
||||||
|
pages: "페이지"
|
||||||
messaging: "대화"
|
messaging: "대화"
|
||||||
home: "홈"
|
home: "홈"
|
||||||
deck: "덱"
|
deck: "덱"
|
||||||
timeline: "타임라인"
|
timeline: "타임라인"
|
||||||
explore: "발견"
|
explore: "발견하기"
|
||||||
following: "팔로우 중"
|
following: "팔로우 중"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
favorites: "즐겨찾기"
|
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:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
||||||
explore: "사용자 탐색"
|
explore: "사용자 탐색"
|
||||||
@@ -229,9 +251,9 @@ common:
|
|||||||
update-available-title: "업데이트가 있습니다"
|
update-available-title: "업데이트가 있습니다"
|
||||||
update-available: "Misskey의 새로운 버전이 있습니다 ({newer}. 현재 {current}을 사용 중). 페이지를 다시 로드하면 업데이트가 적용됩니다."
|
update-available: "Misskey의 새로운 버전이 있습니다 ({newer}. 현재 {current}을 사용 중). 페이지를 다시 로드하면 업데이트가 적용됩니다."
|
||||||
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
|
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
|
||||||
verified-user: "공식 계정"
|
|
||||||
hide-password: "비밀번호 숨기기"
|
hide-password: "비밀번호 숨기기"
|
||||||
show-password: "비밀번호 표시"
|
show-password: "비밀번호 표시"
|
||||||
|
enter-username: "사용자명을 입력하여 주십시오"
|
||||||
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
|
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
|
||||||
user-suspended: "이 사용자는 정지된 상태입니다."
|
user-suspended: "이 사용자는 정지된 상태입니다."
|
||||||
is-remote-user: "이 사용자 정보는 정확하지 않을 수 있습니다."
|
is-remote-user: "이 사용자 정보는 정확하지 않을 수 있습니다."
|
||||||
@@ -272,40 +294,32 @@ common:
|
|||||||
notifications: "알림"
|
notifications: "알림"
|
||||||
users: "추천 사용자"
|
users: "추천 사용자"
|
||||||
polls: "투표"
|
polls: "투표"
|
||||||
post-form: "게시 양식"
|
post-form: "글 입력란"
|
||||||
server: "서버 정보"
|
server: "서버 정보"
|
||||||
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:
|
||||||
loading: "로드 중"
|
loading: "로드 중"
|
||||||
denied: "어플리케이션의 연계를 취소하였습니다."
|
denied: "애플리케이션의 연계를 취소하였습니다."
|
||||||
denied-paragraph: "이 앱이 당신의 계정에 액세스할 수 없습니다."
|
denied-paragraph: "이 앱이 당신의 계정에 액세스할 수 없습니다."
|
||||||
already-authorized: "이 앱은 이미 연결되어 있습니다."
|
already-authorized: "이 앱은 이미 연결되어 있습니다."
|
||||||
allowed: "어플리케이션의 연동을 허용하였습니다."
|
allowed: "애플리케이션의 연동을 허용하였습니다."
|
||||||
callback-url: "어플리케이션으로 돌아갑니다."
|
callback-url: "애플리케이션으로 돌아갑니다."
|
||||||
please-go-back: "어플리케이션으로 돌아가여 시도하여 주십시오."
|
please-go-back: "애플리케이션으로 돌아가여 시도하여 주십시오."
|
||||||
error: "세션이 존재하지 않습니다."
|
error: "세션이 존재하지 않습니다."
|
||||||
sign-in: "로그인 해주시기 바랍니다"
|
sign-in: "로그인 해주시기 바랍니다"
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "공식 계정"
|
pinned-users: "고정된 사용자"
|
||||||
popular-users: "인기 사용자"
|
popular-users: "인기 사용자"
|
||||||
recently-updated-users: "최근 게시한 사용자"
|
recently-updated-users: "최근 게시한 사용자"
|
||||||
recently-registered-users: "신규 사용자"
|
recently-registered-users: "신규 사용자"
|
||||||
@@ -315,6 +329,7 @@ common/views/pages/explore.vue:
|
|||||||
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "플레이어 열기"
|
enable-player: "플레이어 열기"
|
||||||
|
disable-player: "플레이어 닫기"
|
||||||
common/views/components/user-list.vue:
|
common/views/components/user-list.vue:
|
||||||
no-users: "사용자가 없습니다"
|
no-users: "사용자가 없습니다"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
@@ -434,18 +449,23 @@ common/views/components/messaging.vue:
|
|||||||
search-user: "사용자 찾기"
|
search-user: "사용자 찾기"
|
||||||
you: "당신"
|
you: "당신"
|
||||||
no-history: "기록이 없습니다"
|
no-history: "기록이 없습니다"
|
||||||
|
user: "사용자"
|
||||||
|
group: "그룹"
|
||||||
|
start-with-user: "사용자와 대화 시작"
|
||||||
|
start-with-group: "그룹과 대화 시작"
|
||||||
|
select-group: "그룹을 선택하여 주십시오"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "이 사용자와 대화한 적이 없습니다"
|
not-talked-user: "이 사용자와의 대화가 없습니다"
|
||||||
|
not-talked-group: "이 그룹과의 대화가 없습니다"
|
||||||
no-history: "이것보다 과거의 기록이 없습니다"
|
no-history: "이것보다 과거의 기록이 없습니다"
|
||||||
resize-form: "드래그하여 폼의 크기 조절"
|
|
||||||
new-message: "새 메시지가 있습니다"
|
new-message: "새 메시지가 있습니다"
|
||||||
only-one-file-attached: "메시지에는 하나의 파일만 첨부할 수 있습니다"
|
only-one-file-attached: "메시지에 첨부할 수 있는 파일은 하나까지입니다"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "여기에 메시지를 입력하세요"
|
input-message-here: "여기에 메시지를 입력하세요"
|
||||||
send: "전송"
|
send: "전송"
|
||||||
attach-from-local: "PC에서 파일 첨부"
|
attach-from-local: "PC에서 파일 첨부"
|
||||||
attach-from-drive: "드라이브에서 파일 첨부"
|
attach-from-drive: "드라이브에서 파일 첨부"
|
||||||
only-one-file-attached: "메시지에는 하나의 파일만 첨부할 수 있습니다"
|
only-one-file-attached: "메시지에 첨부할 수 있는 파일은 하나까지입니다"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "읽음"
|
is-read: "읽음"
|
||||||
deleted: "이 메시지는 삭제되었습니다"
|
deleted: "이 메시지는 삭제되었습니다"
|
||||||
@@ -458,6 +478,7 @@ common/views/components/nav.vue:
|
|||||||
repository: "저장소"
|
repository: "저장소"
|
||||||
develop: "개발자"
|
develop: "개발자"
|
||||||
feedback: "피드백"
|
feedback: "피드백"
|
||||||
|
tos: "이용 약관"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
detail: "상세"
|
detail: "상세"
|
||||||
@@ -476,8 +497,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: "스팸 신고"
|
||||||
@@ -485,23 +510,47 @@ 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: "투표에는 선택지가 최소한 두 개 필요합니다"
|
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: "리액션 선택"
|
||||||
|
input-reaction-placeholder: "또는 이모지 입력"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "커스텀 이모지"
|
custom-emoji: "커스텀 이모지"
|
||||||
people: "사람들"
|
people: "사람들"
|
||||||
@@ -543,6 +592,8 @@ common/views/components/signup.vue:
|
|||||||
password-matched: "확인되었습니다"
|
password-matched: "확인되었습니다"
|
||||||
password-not-matched: "일치하지 않습니다"
|
password-not-matched: "일치하지 않습니다"
|
||||||
recaptcha: "자동 가입 방지"
|
recaptcha: "자동 가입 방지"
|
||||||
|
agree-to: "{0}에 동의합니다."
|
||||||
|
tos: "이용 약관"
|
||||||
create: "계정 만들기"
|
create: "계정 만들기"
|
||||||
some-error: "알 수 없는 이유로 계정 만들기에 실패했습니다. 다시 한번 시도해 주세요."
|
some-error: "알 수 없는 이유로 계정 만들기에 실패했습니다. 다시 한번 시도해 주세요."
|
||||||
common/views/components/special-message.vue:
|
common/views/components/special-message.vue:
|
||||||
@@ -629,12 +680,16 @@ common/views/components/profile-editor.vue:
|
|||||||
email-verified: "매일 주소가 확인되었습니다"
|
email-verified: "매일 주소가 확인되었습니다"
|
||||||
email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
|
email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
|
||||||
export: "내보내기"
|
export: "내보내기"
|
||||||
|
import: "가져오기"
|
||||||
|
export-and-import: "내보내기와 가져오기"
|
||||||
export-targets:
|
export-targets:
|
||||||
all-notes: "모든 글 데이터"
|
all-notes: "모든 글 데이터"
|
||||||
following-list: "팔로잉"
|
following-list: "팔로잉"
|
||||||
mute-list: "뮤트"
|
mute-list: "뮤트"
|
||||||
blocking-list: "차단"
|
blocking-list: "차단"
|
||||||
|
user-lists: "리스트"
|
||||||
export-requested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 드라이브에 파일이 추가됩니다."
|
export-requested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 드라이브에 파일이 추가됩니다."
|
||||||
|
import-requested: "가져오기를 요청하였습니다. 이 작업에는 시간이 걸릴 수 있습니다."
|
||||||
enter-password: "비밀번호를 입력하여 주십시오"
|
enter-password: "비밀번호를 입력하여 주십시오"
|
||||||
danger-zone: "위험한 설정"
|
danger-zone: "위험한 설정"
|
||||||
delete-account: "계정 삭제"
|
delete-account: "계정 삭제"
|
||||||
@@ -646,6 +701,32 @@ common/views/components/user-list-editor.vue:
|
|||||||
remove-user: "이 리스트에서 제거"
|
remove-user: "이 리스트에서 제거"
|
||||||
delete-are-you-sure: "리스트 \"$1\"을 삭제하시겠습니까?"
|
delete-are-you-sure: "리스트 \"$1\"을 삭제하시겠습니까?"
|
||||||
deleted: "삭제하였습니다"
|
deleted: "삭제하였습니다"
|
||||||
|
add-user: "사용자 추가"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
users: "멤버"
|
||||||
|
rename: "그룹명을 변경"
|
||||||
|
delete: "그룹을 삭제"
|
||||||
|
transfer: "그룹을 양도"
|
||||||
|
transfer-are-you-sure: "그룹 「$1」을 「@$2」 님에게 양도하시겠습니까?"
|
||||||
|
transferred: "그룹을 양도하였습니다"
|
||||||
|
remove-user: "이 그룹에서 삭제"
|
||||||
|
delete-are-you-sure: "그룹 「$1」을 삭제하시겠습니까?"
|
||||||
|
deleted: "삭제하였습니다"
|
||||||
|
invite: "초대"
|
||||||
|
invited: "초대를 보냈습니다"
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "리스트"
|
||||||
|
create-list: "리스트 만들기"
|
||||||
|
list-name: "리스트 이름"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
user-groups: "그룹"
|
||||||
|
create-group: "그룹 만들기"
|
||||||
|
group-name: "그룹명"
|
||||||
|
owned-groups: "자신의 그룹"
|
||||||
|
joined-groups: "참여중인 그룹"
|
||||||
|
invites: "초대"
|
||||||
|
accept-invite: "참여"
|
||||||
|
reject-invite: "거부"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "확인중"
|
fetching: "확인중"
|
||||||
no-broadcasts: "공지사항이 없습니다"
|
no-broadcasts: "공지사항이 없습니다"
|
||||||
@@ -707,6 +788,10 @@ common/views/pages/follow.vue:
|
|||||||
request-pending: "팔로우 허가 대기중"
|
request-pending: "팔로우 허가 대기중"
|
||||||
follow-processing: "팔로우 처리중"
|
follow-processing: "팔로우 처리중"
|
||||||
follow-request: "팔로우 요청"
|
follow-request: "팔로우 요청"
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
received-follow-requests: "팔로우 요청"
|
||||||
|
accept: "승인"
|
||||||
|
reject: "거부"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "배너로 표시할 부분을 선택"
|
banner-crop-title: "배너로 표시할 부분을 선택"
|
||||||
banner: "배너"
|
banner: "배너"
|
||||||
@@ -816,10 +901,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: "이 글은 삭제되었습니다"
|
||||||
@@ -858,7 +939,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: "{}문자 남음"
|
||||||
@@ -928,7 +1008,7 @@ common/views/components/api-settings.vue:
|
|||||||
sending: "응답을 기다리는 중"
|
sending: "응답을 기다리는 중"
|
||||||
response: "결과"
|
response: "결과"
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "연결된 어플리케이션이 없습니다"
|
no-apps: "연결된 애플리케이션이 없습니다"
|
||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "최대 용량"
|
max: "최대 용량"
|
||||||
in-use: "사용중"
|
in-use: "사용중"
|
||||||
@@ -951,6 +1031,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: "이 글은 삭제되었습니다"
|
||||||
@@ -961,15 +1045,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: "해시태그 추가"
|
||||||
@@ -981,6 +1063,7 @@ desktop/views/components/ui.header.vue:
|
|||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "프로필"
|
profile: "프로필"
|
||||||
lists: "리스트"
|
lists: "리스트"
|
||||||
|
groups: "그룹"
|
||||||
follow-requests: "팔로우 요청"
|
follow-requests: "팔로우 요청"
|
||||||
admin: "관리"
|
admin: "관리"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
@@ -991,14 +1074,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "새 글"
|
post: "새 글"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "검색"
|
placeholder: "검색"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
title: "팔로우 요청"
|
|
||||||
accept: "승인"
|
|
||||||
reject: "거부"
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "리스트"
|
|
||||||
create-list: "리스트 만들기"
|
|
||||||
list-name: "리스트 이름"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "글"
|
notes: "글"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
@@ -1020,9 +1095,9 @@ admin/views/index.vue:
|
|||||||
users: "사용자"
|
users: "사용자"
|
||||||
federation: "연합"
|
federation: "연합"
|
||||||
announcements: "공지사항"
|
announcements: "공지사항"
|
||||||
hashtags: "해시태그"
|
|
||||||
abuse: "스팸 신고"
|
abuse: "스팸 신고"
|
||||||
queue: "작업 대기열"
|
queue: "작업 대기열"
|
||||||
|
logs: "로그"
|
||||||
back-to-misskey: "Misskey로 돌아가기"
|
back-to-misskey: "Misskey로 돌아가기"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "대시보드"
|
dashboard: "대시보드"
|
||||||
@@ -1033,7 +1108,7 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "이 인스턴스"
|
this-instance: "이 인스턴스"
|
||||||
federated: "연합"
|
federated: "연합"
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "동작"
|
title: "큐"
|
||||||
remove-all-jobs: "모든 작업 제거"
|
remove-all-jobs: "모든 작업 제거"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "스팸 신고"
|
title: "스팸 신고"
|
||||||
@@ -1046,14 +1121,34 @@ admin/views/instance.vue:
|
|||||||
instance-name: "인스턴스 이름"
|
instance-name: "인스턴스 이름"
|
||||||
instance-description: "인스턴스의 소개"
|
instance-description: "인스턴스의 소개"
|
||||||
host: "관리자"
|
host: "관리자"
|
||||||
|
icon-url: "아이콘 URL"
|
||||||
|
logo-url: "로고 URL"
|
||||||
banner-url: "배너 이미지 URL"
|
banner-url: "배너 이미지 URL"
|
||||||
error-image-url: "오류 이미지 URL"
|
error-image-url: "오류 이미지 URL"
|
||||||
languages: "인스턴스의 대상 언어"
|
languages: "인스턴스의 대상 언어"
|
||||||
languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
|
languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
|
||||||
|
tos-url: "이용약관 URL"
|
||||||
|
repository-url: "저장소 URL"
|
||||||
|
feedback-url: "피드백 URL"
|
||||||
maintainer-config: "관리자 정보"
|
maintainer-config: "관리자 정보"
|
||||||
maintainer-name: "관리자 이름"
|
maintainer-name: "관리자 이름"
|
||||||
maintainer-email: "관리자 연락처"
|
maintainer-email: "관리자 연락처"
|
||||||
|
advanced-config: "그 외 설정"
|
||||||
|
note-and-tl: "글과 타임라인"
|
||||||
drive-config: "드라이브 설정"
|
drive-config: "드라이브 설정"
|
||||||
|
use-object-storage: "오브젝트 스토리지를 사용"
|
||||||
|
object-storage-base-url: "URL"
|
||||||
|
object-storage-bucket: "버킷 이름"
|
||||||
|
object-storage-prefix: "프리픽스"
|
||||||
|
object-storage-endpoint: "엔드포인트"
|
||||||
|
object-storage-region: "리전"
|
||||||
|
object-storage-port: "포트"
|
||||||
|
object-storage-access-key: "액세스 키"
|
||||||
|
object-storage-secret-key: "시크릿 키"
|
||||||
|
object-storage-use-ssl: "SSL 사용"
|
||||||
|
object-storage-s3-info: "Amazon S3를 오브젝트 스토리지로 사용하는 경우의 「엔드포인트」와 「리전」의 설정값에 대해서는 {0}을 확인하여 주십시오."
|
||||||
|
object-storage-s3-info-here: "이곳"
|
||||||
|
object-storage-gcs-info: "Google Cloud Storage를 오브젝트 스토리지로 사용하는 경우, 「엔드포인트」는 storage.googleapis.com 으로 설정하고, 「리전」 란은 비웁니다."
|
||||||
cache-remote-files: "원격 파일을 캐시"
|
cache-remote-files: "원격 파일을 캐시"
|
||||||
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 사용자에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다."
|
cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 사용자에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다."
|
||||||
local-drive-capacity-mb: "로컬 사용자 한 명당 드라이브 용량"
|
local-drive-capacity-mb: "로컬 사용자 한 명당 드라이브 용량"
|
||||||
@@ -1061,9 +1156,14 @@ admin/views/instance.vue:
|
|||||||
mb: "메가바이트 단위"
|
mb: "메가바이트 단위"
|
||||||
recaptcha-config: "reCAPCHA 설정"
|
recaptcha-config: "reCAPCHA 설정"
|
||||||
recaptcha-info: "reCAPCHA를 사용하도록 설정하는 경우 reCAPCHA 토큰을 확보해야 합니다. https://www.google.com/recaptcha/intro/ 에 접속하여 토큰을 가져와주십시오."
|
recaptcha-info: "reCAPCHA를 사용하도록 설정하는 경우 reCAPCHA 토큰을 확보해야 합니다. https://www.google.com/recaptcha/intro/ 에 접속하여 토큰을 가져와주십시오."
|
||||||
|
recaptcha-info2: "v3는지원하지 않습니다. v2를 사용하여 주십시오."
|
||||||
enable-recaptcha: "reCAPCHA 활성화"
|
enable-recaptcha: "reCAPCHA 활성화"
|
||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "사이트 키"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "시크릿 키"
|
||||||
|
recaptcha-preview: "미리보기"
|
||||||
|
hidden-tags: "숨긴 해시태그"
|
||||||
|
hidden-tags-info: "집계에서 제외할 해시태그를 줄 바꿈으로 구분하여 기술합니다."
|
||||||
|
external-service-integration-config: "외부 서비스 연계"
|
||||||
twitter-integration-config: "Twitter 연동 설정"
|
twitter-integration-config: "Twitter 연동 설정"
|
||||||
twitter-integration-info: "콜백 URL은 {url} 로 설정됩니다."
|
twitter-integration-info: "콜백 URL은 {url} 로 설정됩니다."
|
||||||
enable-twitter-integration: "트위터 연동 활성화"
|
enable-twitter-integration: "트위터 연동 활성화"
|
||||||
@@ -1089,15 +1189,13 @@ 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: "추천 사용자"
|
pinned-users: "고정된 사용자"
|
||||||
enable-external-user-recommendation: "외부 사용자 추천 활성화"
|
pinned-users-info: "고정해두고 싶은 사용자를 줄바꿈으로 구분하여 기술합니다."
|
||||||
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: "메일 발신 활성화"
|
||||||
@@ -1178,15 +1276,13 @@ admin/views/users.vue:
|
|||||||
unsuspend-confirm: "정지를 해제하시겠습니까?"
|
unsuspend-confirm: "정지를 해제하시겠습니까?"
|
||||||
unsuspended: "정지를 해제하였습니다"
|
unsuspended: "정지를 해제하였습니다"
|
||||||
make-silence: "침묵"
|
make-silence: "침묵"
|
||||||
|
silence-confirm: "침묵으로 설정합니까?"
|
||||||
unmake-silence: "침묵 해제"
|
unmake-silence: "침묵 해제"
|
||||||
verify: "공식 계정으로 설정"
|
unsilence-confirm: "침묵 해제하시겠습니까?"
|
||||||
verify-confirm: "공식 계정으로 설정하시겠습니까?"
|
|
||||||
verified: "공식 계정으로 설정하였습니다"
|
|
||||||
unverify: "공식 계정 해제"
|
|
||||||
unverify-confirm: "공식 계정을 해제하시겠습니까?"
|
|
||||||
unverified: "공식 계정을 해제하였습니다"
|
|
||||||
update-remote-user: "원격 사용자 정보 갱신"
|
update-remote-user: "원격 사용자 정보 갱신"
|
||||||
remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
|
remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
|
||||||
|
delete-all-files: "모든 파일 삭제"
|
||||||
|
delete-all-files-confirm: "모든 파일을 삭제하시겠습니까?"
|
||||||
users:
|
users:
|
||||||
title: "사용자"
|
title: "사용자"
|
||||||
sort:
|
sort:
|
||||||
@@ -1201,7 +1297,6 @@ admin/views/users.vue:
|
|||||||
admin: "관리자"
|
admin: "관리자"
|
||||||
moderator: "모더레이터"
|
moderator: "모더레이터"
|
||||||
adminOrModerator: "관리자+모더레이터"
|
adminOrModerator: "관리자+모더레이터"
|
||||||
verified: "공식 계정"
|
|
||||||
silenced: "침묵됨"
|
silenced: "침묵됨"
|
||||||
suspended: "정지됨"
|
suspended: "정지됨"
|
||||||
origin:
|
origin:
|
||||||
@@ -1251,21 +1346,23 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "연합"
|
instance: "인스턴스"
|
||||||
host: "호스트"
|
host: "호스트"
|
||||||
notes: "글"
|
notes: "글"
|
||||||
users: "사용자"
|
users: "사용자"
|
||||||
following: "팔로우 중"
|
following: "팔로우 중"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
|
caught-at: "등록 날짜"
|
||||||
status: "상태"
|
status: "상태"
|
||||||
latest-request-sent-at: "마지막으로 요청을 전송한 시간"
|
latest-request-sent-at: "마지막으로 요청을 전송한 시간"
|
||||||
latest-request-received-at: "마지막으로 요청을 받은 시간"
|
latest-request-received-at: "마지막으로 요청을 받은 시간"
|
||||||
remove-all-following: "모든 팔로잉 해제"
|
remove-all-following: "모든 팔로잉 해제"
|
||||||
remove-all-following-info: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행하십시오."
|
remove-all-following-info: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행하십시오."
|
||||||
|
delete-all-files: "파일을 모두 삭제"
|
||||||
block: "차단"
|
block: "차단"
|
||||||
marked-as-closed: "폐쇄된 것으로 표시"
|
marked-as-closed: "폐쇄된 것으로 표시"
|
||||||
lookup: "조회"
|
lookup: "조회"
|
||||||
instances: "인스턴스"
|
instances: "연합"
|
||||||
instance-not-registered: "해당 인스턴스가 등록되어 있지 않습니다"
|
instance-not-registered: "해당 인스턴스가 등록되어 있지 않습니다"
|
||||||
sort: "정렬"
|
sort: "정렬"
|
||||||
sorts:
|
sorts:
|
||||||
@@ -1308,6 +1405,8 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "1시간마다"
|
hour: "1시간마다"
|
||||||
day: "1일마다"
|
day: "1일마다"
|
||||||
|
blocked-hosts: "차단"
|
||||||
|
blocked-hosts-info: "차단할 호스트를 줄바꿈으로 구분하여 기술합니다."
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "자세히..."
|
about: "자세히..."
|
||||||
timeline: "타임라인"
|
timeline: "타임라인"
|
||||||
@@ -1328,8 +1427,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:
|
||||||
@@ -1364,8 +1461,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-replies: "글과 답글"
|
with-replies: "글과 답글"
|
||||||
with-media: "미디어"
|
with-media: "미디어"
|
||||||
my-posts: "내 글"
|
my-posts: "내 글"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "메시지"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "알림"
|
title: "알림"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@@ -1375,6 +1470,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: "클릭하여 배너 변경"
|
||||||
update-avatar: "클릭하여 아바타 변경"
|
update-avatar: "클릭하여 아바타 변경"
|
||||||
@@ -1393,12 +1489,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: "폴더 이름"
|
||||||
here-is-root: "현재 경로는 루트 경로로 폴더가 아닙니다."
|
here-is-root: "현재 경로는 루트 경로로 폴더가 아닙니다."
|
||||||
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: "파일 선택"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
@@ -1451,7 +1546,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:
|
||||||
@@ -1468,13 +1563,19 @@ mobile/views/components/ui.nav.vue:
|
|||||||
follow-requests: "팔로우 요청"
|
follow-requests: "팔로우 요청"
|
||||||
search: "검색"
|
search: "검색"
|
||||||
user-lists: "리스트"
|
user-lists: "리스트"
|
||||||
|
user-groups: "그룹"
|
||||||
widgets: "위젯"
|
widgets: "위젯"
|
||||||
game: "게임"
|
game: "게임"
|
||||||
admin: "관리"
|
admin: "관리"
|
||||||
about: "Misskey에 대하여"
|
about: "Misskey에 대하여"
|
||||||
mobile/views/pages/user-lists.vue:
|
mobile/views/pages/drive.vue:
|
||||||
title: "리스트"
|
contextmenu:
|
||||||
enter-list-name: "리스트명을 입력하십시오"
|
upload: "파일 업로드"
|
||||||
|
url-upload: "파일을 URL로부터 업로드"
|
||||||
|
create-folder: "폴더 만들기"
|
||||||
|
rename-folder: "폴더 이름 바꾸기"
|
||||||
|
move-folder: "이 폴더를 이동"
|
||||||
|
delete-folder: "이 폴더를 삭제"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 이제 시작해도 됩니다"
|
lets-start: "📦 이제 시작해도 됩니다"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1487,7 +1588,7 @@ 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/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@@ -1499,10 +1600,6 @@ mobile/views/pages/widgets/activity.vue:
|
|||||||
activity: "활동"
|
activity: "활동"
|
||||||
mobile/views/pages/share.vue:
|
mobile/views/pages/share.vue:
|
||||||
share-with: "{name}(으)로 공유"
|
share-with: "{name}(으)로 공유"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
title: "팔로우 요청"
|
|
||||||
accept: "승인"
|
|
||||||
reject: "거부"
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "글"
|
title: "글"
|
||||||
prev: "이전 글"
|
prev: "이전 글"
|
||||||
@@ -1575,25 +1672,6 @@ deck/deck.user-column.vue:
|
|||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "틀린 점이나 개선할 점을 찾으셨나요?"
|
edit-this-page-on-github: "틀린 점이나 개선할 점을 찾으셨나요?"
|
||||||
edit-this-page-on-github-link: "이 페이지를 GitHub에서 편집"
|
edit-this-page-on-github-link: "이 페이지를 GitHub에서 편집"
|
||||||
api:
|
|
||||||
entities:
|
|
||||||
properties: "프로퍼티"
|
|
||||||
endpoints:
|
|
||||||
params: "매개변수"
|
|
||||||
no-params: "매개변수가 없습니다"
|
|
||||||
res: "응답"
|
|
||||||
require-credential: "이 엔드포인트는 인증 정보가 필수적입니다."
|
|
||||||
require-permission: "이 엔드포인트는 {permission} 권한을 필요로 합니다."
|
|
||||||
has-limit: "Rate limit(요청 비율 제한)이 있습니다."
|
|
||||||
duration-limit: "최근 {duration} 밀리초 사이에 엔드포인트로의 요청 수의 합계가 {max}를 넘는 경우 요청이 불가능합니다."
|
|
||||||
min-interval-limit: "이전 요청으로부터 {interval} 밀리초가 지나지 않은 경우 요청할 수 없습니다."
|
|
||||||
show-src: "이 엔드포인트에 대한 소스코드를 확인할 수 있습니다."
|
|
||||||
show-src-link: "코드를 Github에서 보기"
|
|
||||||
generated: "이 문서는 API 정의를 기반으로 자동으로 생성됩니다."
|
|
||||||
props:
|
|
||||||
name: "이름"
|
|
||||||
type: "자료형"
|
|
||||||
description: "설명"
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "앱 관리"
|
manage-apps: "앱 관리"
|
||||||
dev/views/apps.vue:
|
dev/views/apps.vue:
|
||||||
@@ -1601,24 +1679,273 @@ dev/views/apps.vue:
|
|||||||
create-app: "앱 생성"
|
create-app: "앱 생성"
|
||||||
app-missing: "앱 없음"
|
app-missing: "앱 없음"
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
create-app: "어플리케이션 생성"
|
new-app: "새 애플리케이션"
|
||||||
app-name: "어플리케이션 이름"
|
new-app-info: "애플리케이션은 API에서도 생성할 수 있습니다. (app/create)"
|
||||||
|
create-app: "애플리케이션 생성"
|
||||||
|
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: "계정 정보 보기."
|
pages:
|
||||||
account-write: "계정 정보 편집."
|
new-page: "페이지 만들기"
|
||||||
note-write: "글 쓰기."
|
edit-page: "페이지 수정"
|
||||||
reaction-write: "리액션을 하거나 리액션을 취소할 수 있음."
|
read-page: "소스 표시중"
|
||||||
following-write: "팔로우하거나 팔로우 해제하기."
|
page-created: "페이지를 만들었습니다"
|
||||||
drive-read: "드라이브 보기."
|
page-updated: "페이지를 수정했습니다"
|
||||||
drive-write: "드라이브를 조작."
|
are-you-sure-delete: "이 페이지를 삭제하시겠습니까?"
|
||||||
notification-read: "알림 보기."
|
page-deleted: "페이지가 삭제되었습니다"
|
||||||
notification-write: "알림 조작."
|
edit-this-page: "이 페이지를 편집"
|
||||||
|
view-source: "소스 보기"
|
||||||
|
view-page: "페이지 보기"
|
||||||
|
like: "좋아요"
|
||||||
|
unlike: "좋아요 해제"
|
||||||
|
liked-pages: "좋아요한 페이지"
|
||||||
|
my-pages: "내 페이지"
|
||||||
|
inspector: "인스펙터"
|
||||||
|
content: "페이지 블록"
|
||||||
|
variables: "변수"
|
||||||
|
variables-info: "변수를 사용하면 동적인 페이지를 만들 수 있습니다. 텍스트에 <b>{ 변수명 }</b>을 적으면 그 위치에 변수의 값을 집어넣습니다. 예를 들자면 <b>Hello { thing } world!</b> 라는 텍스트가 있을 때, 변수(thing)의 값이 <b>ai</b>인 경우 텍스트는 <b>Hello ai world!</b>가 됩니다."
|
||||||
|
variables-info2: "변수의 평가(값을 산출해내는 것)는 위에서부터 아래로 진행되므로 어떤 변수의 내부에서 자신보다 아래에 있는 변수를 참조할 수는 없습니다. 예를 들자면 위에서부터 <b>A, B, C</b>의 3개의 변수가 정의되어 있을 때, <b>C</b>의 내부에 <b>A</b>나 <b>B</b>를 참조할 수는 있지만, <b>A</b>의 내부에서 <b>B</b>나 <b>C</b>를 참조할 수는 없습니다."
|
||||||
|
variables-info3: "사용자로부터 입력을 받으려면, 페이지에 「사용자 입력」 블록을 삽입하고 「변수명」에 입력받은 값을 저장하고 싶은 변수명을 설정합니다 (변수는 자동으로 생성됩니다). 그 변수를 사용하여 사용자 입력에 따라 동작할 수 있습니다."
|
||||||
|
variables-info4: "함수를 사용하면 반복되는 작업을 손쉽게 처리할 수 있습니다. 함수를 만드시려면 「함수」 타입의 변수를 만듭니다. 함수에서 슬롯(인수)를 받도록 설정하면, 함수를 사용할 때 슬롯에 입력된 값을 함수 안에서 변수로써 이용할 수 있게 됩니다. 또한, AiScript 표준에는 함수를 인수로 받는 함수(고차함수)도 존재합니다. 함수를 미리 정의하는 것 외에, 이와 같은 고차함수를 즉석으로 설정할 수 있습니다."
|
||||||
|
more-details: "자세한 설명"
|
||||||
|
title: "제목"
|
||||||
|
url: "페이지 URL"
|
||||||
|
summary: "페이지 요약"
|
||||||
|
align-center: "가운데 정렬"
|
||||||
|
font: "글꼴"
|
||||||
|
fontSerif: "세리프"
|
||||||
|
fontSansSerif: "산 세리프"
|
||||||
|
set-eye-catching-image: "아이캐치 이미지를 설정"
|
||||||
|
remove-eye-catching-image: "아이캐치 이미지를 삭제"
|
||||||
|
choose-block: "블록 추가"
|
||||||
|
select-type: "종류 선택"
|
||||||
|
enter-variable-name: "변수명을 설정해주십시오"
|
||||||
|
the-variable-name-is-already-used: "그 변수명은 이미 사용중입니다"
|
||||||
|
content-blocks: "콘텐츠"
|
||||||
|
input-blocks: "입력"
|
||||||
|
special-blocks: "특수"
|
||||||
|
post-from-post-form: "이 내용을 올리기"
|
||||||
|
posted-from-post-form: "게시하였습니다"
|
||||||
|
blocks:
|
||||||
|
text: "텍스트"
|
||||||
|
textarea: "텍스트 영역"
|
||||||
|
section: "섹션"
|
||||||
|
image: "이미지"
|
||||||
|
button: "버튼"
|
||||||
|
if: "만약"
|
||||||
|
_if:
|
||||||
|
variable: "변수"
|
||||||
|
post: "글 입력란"
|
||||||
|
_post:
|
||||||
|
text: "내용"
|
||||||
|
textInput: "텍스트 입력"
|
||||||
|
_textInput:
|
||||||
|
name: "변수명"
|
||||||
|
text: "제목"
|
||||||
|
default: "기본값"
|
||||||
|
textareaInput: "여러 줄 텍스트 입력"
|
||||||
|
_textareaInput:
|
||||||
|
name: "변수명"
|
||||||
|
text: "제목"
|
||||||
|
default: "기본값"
|
||||||
|
numberInput: "수치 입력"
|
||||||
|
_numberInput:
|
||||||
|
name: "변수명"
|
||||||
|
text: "제목"
|
||||||
|
default: "기본값"
|
||||||
|
switch: "스위치"
|
||||||
|
_switch:
|
||||||
|
name: "변수명"
|
||||||
|
text: "제목"
|
||||||
|
default: "기본값"
|
||||||
|
counter: "카운터"
|
||||||
|
_counter:
|
||||||
|
name: "변수명"
|
||||||
|
text: "제목"
|
||||||
|
inc: "증가치"
|
||||||
|
_button:
|
||||||
|
text: "제목"
|
||||||
|
action: "버튼을 눌렀을 때의 동작"
|
||||||
|
_action:
|
||||||
|
dialog: "대화상자를 표시"
|
||||||
|
_dialog:
|
||||||
|
content: "내용"
|
||||||
|
resetRandom: "난수를 초기화"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
flow: "흐름 제어"
|
||||||
|
logical: "논리 연산"
|
||||||
|
operation: "계산"
|
||||||
|
comparison: "비교"
|
||||||
|
random: "랜덤"
|
||||||
|
value: "값"
|
||||||
|
fn: "함수"
|
||||||
|
text: "텍스트 조작"
|
||||||
|
convert: "변환"
|
||||||
|
list: "리스트"
|
||||||
|
blocks:
|
||||||
|
text: "텍스트"
|
||||||
|
multiLineText: "텍스트 (여러줄)"
|
||||||
|
textList: "텍스트 목록"
|
||||||
|
_textList:
|
||||||
|
info: "각각을 줄 바꿈으로 구분해주십시오"
|
||||||
|
strLen: "텍스트의 길이"
|
||||||
|
_strLen:
|
||||||
|
arg1: "텍스트"
|
||||||
|
strPick: "문자 추출"
|
||||||
|
_strPick:
|
||||||
|
arg1: "텍스트"
|
||||||
|
arg2: "문자 위치"
|
||||||
|
strReplace: "텍스트 치환"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "텍스트"
|
||||||
|
arg2: "치환 전"
|
||||||
|
arg3: "치환 후"
|
||||||
|
strReverse: "텍스트 뒤집기"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "텍스트"
|
||||||
|
join: "텍스트 접합"
|
||||||
|
_join:
|
||||||
|
arg1: "리스트"
|
||||||
|
arg2: "구분자"
|
||||||
|
add: "+ 더하기"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "- 빼기"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "× 곱하기"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "÷ 나누기"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
remind: "÷ 나눈 나머지"
|
||||||
|
_remind:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
eq: "A와 B가 동일"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "A와 B가 다름"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "A 그리고 B"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "A 혹은 B"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "< A가 B보다 작음"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "> A가 B보다 큼"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "<= A가 B보다 작거나 같음"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: ">= A가 B보다 크거나 같음"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "분기"
|
||||||
|
_if:
|
||||||
|
arg1: "만약"
|
||||||
|
arg2: "그러면"
|
||||||
|
arg3: "그렇지 않으면"
|
||||||
|
not: "부정"
|
||||||
|
_not:
|
||||||
|
arg1: "부정"
|
||||||
|
random: "랜덤"
|
||||||
|
_random:
|
||||||
|
arg1: "확률"
|
||||||
|
rannum: "난수"
|
||||||
|
_rannum:
|
||||||
|
arg1: "최소"
|
||||||
|
arg2: "최대"
|
||||||
|
randomPick: "목록에서 임의로 선택"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "리스트"
|
||||||
|
dailyRandom: "랜덤 (하루동안 결과 유지)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "확률"
|
||||||
|
dailyRannum: "난수 (하루동안 결과 유지)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "최소"
|
||||||
|
arg2: "최대"
|
||||||
|
dailyRandomPick: "목록에서 임의로 선택 (하루동안 결과 유지)"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "리스트"
|
||||||
|
seedRandom: "무작위 (시드)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "시드"
|
||||||
|
arg2: "확률"
|
||||||
|
seedRannum: "난수 (시드)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "시드"
|
||||||
|
arg2: "최소"
|
||||||
|
arg3: "최대"
|
||||||
|
seedRandomPick: "목록에서 무작위로 선택 (시드)"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "시드"
|
||||||
|
arg2: "리스트"
|
||||||
|
DRPWPM: "확률형 목록에서 임의로 선택 (하루동안 결과 유지)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "텍스트 목록"
|
||||||
|
pick: "목록에서 선택"
|
||||||
|
_pick:
|
||||||
|
arg1: "리스트"
|
||||||
|
arg2: "위치"
|
||||||
|
number: "수치"
|
||||||
|
stringToNumber: "텍스트를 수치로"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "텍스트"
|
||||||
|
numberToString: "수치를 텍스트로"
|
||||||
|
_numberToString:
|
||||||
|
arg1: "수치"
|
||||||
|
splitStrByLine: "텍스트를 행 단위로 분할"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "텍스트"
|
||||||
|
ref: "변수"
|
||||||
|
fn: "함수"
|
||||||
|
_fn:
|
||||||
|
slots: "슬롯"
|
||||||
|
slots-info: "각 슬롯을 줄 바꿈으로 구분하여 주십시오"
|
||||||
|
arg1: "출력"
|
||||||
|
for: "반복"
|
||||||
|
_for:
|
||||||
|
arg1: "횟수"
|
||||||
|
arg2: "처리"
|
||||||
|
typeError: "슬롯 {slot}은 \"{expect}\"를 사용할 수 있지만 \"{actual}이 들어있습니다!"
|
||||||
|
thereIsEmptySlot: "슬롯 {slot}이(가) 비었습니다!"
|
||||||
|
types:
|
||||||
|
string: "텍스트"
|
||||||
|
number: "수치"
|
||||||
|
boolean: "플래그"
|
||||||
|
array: "리스트"
|
||||||
|
stringArray: "텍스트 목록"
|
||||||
|
emptySlot: "빈 슬롯"
|
||||||
|
enviromentVariables: "환경 변수"
|
||||||
|
pageVariables: "페이지 요소"
|
||||||
|
argVariables: "입력 슬롯"
|
||||||
|
|||||||
1283
locales/nl-NL.yml
1283
locales/nl-NL.yml
File diff suppressed because it is too large
Load Diff
1341
locales/no-NO.yml
1341
locales/no-NO.yml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1490
locales/pt-PT.yml
1490
locales/pt-PT.yml
File diff suppressed because it is too large
Load Diff
1507
locales/ru-RU.yml
1507
locales/ru-RU.yml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
90
locales/zh-TW.yml
Normal file
90
locales/zh-TW.yml
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
meta:
|
||||||
|
lang: "中文(繁体)"
|
||||||
|
common:
|
||||||
|
intro:
|
||||||
|
title: "什麽是 Misskey 呢?"
|
||||||
|
rich-contents: "發佈"
|
||||||
|
reaction: "回應"
|
||||||
|
drive: "雲端硬碟"
|
||||||
|
adblock:
|
||||||
|
detected: "請禁用廣告封鎖器"
|
||||||
|
close: "關閉"
|
||||||
|
enter-password: "請輸入密碼"
|
||||||
|
2fa: "雙重身份驗證"
|
||||||
|
dark-mode: "夜間模式"
|
||||||
|
signup: "註冊"
|
||||||
|
signout: "登出"
|
||||||
|
notification:
|
||||||
|
reversi-invited: "您已被邀請加入壹場遊戲"
|
||||||
|
reversi-invited-by: "來自{}的邀請"
|
||||||
|
notified-by: "來自{}的邀請"
|
||||||
|
time:
|
||||||
|
future: "未來"
|
||||||
|
just_now: "剛剛"
|
||||||
|
drive: "雲端硬碟"
|
||||||
|
weekday:
|
||||||
|
sunday: "週日"
|
||||||
|
monday: "週一"
|
||||||
|
tuesday: "週二"
|
||||||
|
wednesday: "週三"
|
||||||
|
thursday: "週四"
|
||||||
|
friday: "週五"
|
||||||
|
saturday: "週六"
|
||||||
|
reactions:
|
||||||
|
like: "贊"
|
||||||
|
love: "喜歡"
|
||||||
|
congrats: "恭喜"
|
||||||
|
_settings:
|
||||||
|
password: "密碼"
|
||||||
|
font-size: "字體大小"
|
||||||
|
font-size-x-small: "小"
|
||||||
|
font-size-small: "較小"
|
||||||
|
deck-column-width-wide: "寬"
|
||||||
|
timeline: "時間軸"
|
||||||
|
common/views/components/connect-failed.troubleshooter.vue:
|
||||||
|
flush: "清除快取"
|
||||||
|
common/views/components/theme.vue:
|
||||||
|
light-themes: "淺色主題"
|
||||||
|
dark-themes: "深色主題"
|
||||||
|
install-a-theme: "安裝主題"
|
||||||
|
save-created-theme: "保存主題"
|
||||||
|
common/views/components/signin.vue:
|
||||||
|
signin-with-twitter: "用 Twitter 帳號登入"
|
||||||
|
signin-with-github: "用 GitHub 帳號登入"
|
||||||
|
signin-with-discord: "用 Discord 帳號登入"
|
||||||
|
login-failed: "登錄失敗。 請檢查用戶名和密碼。"
|
||||||
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "邀請碼"
|
||||||
|
username: "用戶名"
|
||||||
|
available: "可用"
|
||||||
|
too-long: "請不要超過20個字元"
|
||||||
|
password: "密碼"
|
||||||
|
password-placeholder: "建議至少8個字元"
|
||||||
|
common/views/components/stream-indicator.vue:
|
||||||
|
connecting: "正在連線"
|
||||||
|
reconnecting: "正在重新連線"
|
||||||
|
connected: "已建立連線"
|
||||||
|
common/views/components/integration-settings.vue:
|
||||||
|
disconnect: "中斷連線"
|
||||||
|
common/views/components/github-setting.vue:
|
||||||
|
reconnect: "重新連線"
|
||||||
|
disconnect: "中斷連線"
|
||||||
|
common/views/components/discord-setting.vue:
|
||||||
|
reconnect: "重新連線"
|
||||||
|
disconnect: "中斷連線"
|
||||||
|
common/views/components/language-settings.vue:
|
||||||
|
recommended: "推薦"
|
||||||
|
auto: "自動"
|
||||||
|
specify-language: "指定語言"
|
||||||
|
common/views/components/profile-editor.vue:
|
||||||
|
title: "個人資料"
|
||||||
|
name: "名稱"
|
||||||
|
birthday: "生日:"
|
||||||
|
privacy: "隱私"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
|
drive: "雲端硬碟"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
drive: "雲端硬碟"
|
||||||
|
pages:
|
||||||
|
like: "贊"
|
||||||
31
migration/1556348509290-Pages.ts
Normal file
31
migration/1556348509290-Pages.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class Pages1556348509290 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TYPE "page_visibility_enum" AS ENUM('public', 'followers', 'specified')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "page" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "title" character varying(256) NOT NULL, "name" character varying(256) NOT NULL, "summary" character varying(256), "alignCenter" boolean NOT NULL, "font" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "eyeCatchingImageId" character varying(32), "content" jsonb NOT NULL DEFAULT '[]', "variables" jsonb NOT NULL DEFAULT '[]', "visibility" "page_visibility_enum" NOT NULL, "visibleUserIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_742f4117e065c5b6ad21b37ba1f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_fbb4297c927a9b85e9cefa2eb1" ON "page" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_af639b066dfbca78b01a920f8a" ON "page" ("updatedAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b82c19c08afb292de4600d99e4" ON "page" ("name") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ae1d917992dd0c9d9bbdad06c4" ON "page" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_90148bbc2bf0854428786bfc15" ON "page" ("visibleUserIds") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_2133ef8317e4bdb839c0dcbf13" ON "page" ("userId", "name") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_ae1d917992dd0c9d9bbdad06c4a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_3126dd7c502c9e4d7597ef7ef10" FOREIGN KEY ("eyeCatchingImageId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_3126dd7c502c9e4d7597ef7ef10"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_ae1d917992dd0c9d9bbdad06c4a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2133ef8317e4bdb839c0dcbf13"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_90148bbc2bf0854428786bfc15"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ae1d917992dd0c9d9bbdad06c4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b82c19c08afb292de4600d99e4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_af639b066dfbca78b01a920f8a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fbb4297c927a9b85e9cefa2eb1"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "page"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "page_visibility_enum"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
16
migration/1556746559567-UserProfile.ts
Normal file
16
migration/1556746559567-UserProfile.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class UserProfile1556746559567 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "githubId" TYPE VARCHAR(64) USING "githubId"::VARCHAR(64)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "discordExpiresDate" TYPE VARCHAR(64) USING "discordExpiresDate"::VARCHAR(64)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`UPDATE "user_profile" SET github = FALSE, discord = FALSE`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "githubId" TYPE INTEGER USING NULL`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "discordExpiresDate" TYPE INTEGER USING NULL`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1557476068003-PinnedUsers.ts
Normal file
13
migration/1557476068003-PinnedUsers.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PinnedUsers1557476068003 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedUsers" character varying(256) array NOT NULL DEFAULT '{}'::varchar[]`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedUsers"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
16
migration/1557761316509-AddSomeUrls.ts
Normal file
16
migration/1557761316509-AddSomeUrls.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class AddSomeUrls1557761316509 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "ToSUrl" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://github.com/syuilo/misskey'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "feedbackUrl" character varying(512) DEFAULT 'https://github.com/syuilo/misskey/issues/new'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "feedbackUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "repositoryUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "ToSUrl"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
31
migration/1557932705754-ObjectStorageSetting.ts
Normal file
31
migration/1557932705754-ObjectStorageSetting.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class ObjectStorageSetting1557932705754 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "useObjectStorage" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageBucket" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStoragePrefix" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageBaseUrl" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageEndpoint" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageRegion" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageAccessKey" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageSecretKey" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStoragePort" integer`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageUseSSL" boolean NOT NULL DEFAULT true`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageUseSSL"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStoragePort"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageSecretKey"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageAccessKey"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageRegion"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageEndpoint"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageBaseUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStoragePrefix"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageBucket"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "useObjectStorage"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
23
migration/1558072954435-PageLike.ts
Normal file
23
migration/1558072954435-PageLike.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PageLike1558072954435 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "page_like" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "pageId" character varying(32) NOT NULL, CONSTRAINT "PK_813f034843af992d3ae0f43c64c" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0e61efab7f88dbb79c9166dbb4" ON "page_like" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_4ce6fb9c70529b4c8ac46c9bfa" ON "page_like" ("userId", "pageId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" ADD "likedCount" integer NOT NULL DEFAULT 0`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page_like" ADD CONSTRAINT "FK_0e61efab7f88dbb79c9166dbb48" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page_like" ADD CONSTRAINT "FK_cf8782626dced3176038176a847" FOREIGN KEY ("pageId") REFERENCES "page"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page_like" DROP CONSTRAINT "FK_cf8782626dced3176038176a847"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page_like" DROP CONSTRAINT "FK_0e61efab7f88dbb79c9166dbb48"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "likedCount"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4ce6fb9c70529b4c8ac46c9bfa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0e61efab7f88dbb79c9166dbb4"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "page_like"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
41
migration/1558103093633-UserGroup.ts
Normal file
41
migration/1558103093633-UserGroup.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class UserGroup1558103093633 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_group" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(256) NOT NULL, "userId" character varying(32) NOT NULL, "isPrivate" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_3c29fba6fe013ec8724378ce7c9" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_20e30aa35180e317e133d75316" ON "user_group" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3d6b372788ab01be58853003c9" ON "user_group" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_group_joining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userGroupId" character varying(32) NOT NULL, CONSTRAINT "PK_15f2425885253c5507e1599cfe7" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f3a1b4bd0c7cabba958a0c0b23" ON "user_group_joining" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_67dc758bc0566985d1b3d39986" ON "user_group_joining" ("userGroupId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD "groupId" character varying(32)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD "reads" character varying(32) array NOT NULL DEFAULT '{}'::varchar[]`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ALTER COLUMN "recipientId" DROP NOT NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."recipientId" IS 'The recipient user ID.'`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2c4be03b446884f9e9c502135b" ON "messaging_message" ("groupId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_2c4be03b446884f9e9c502135be" FOREIGN KEY ("groupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group" ADD CONSTRAINT "FK_3d6b372788ab01be58853003c93" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_joining" ADD CONSTRAINT "FK_f3a1b4bd0c7cabba958a0c0b231" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_joining" ADD CONSTRAINT "FK_67dc758bc0566985d1b3d399865" FOREIGN KEY ("userGroupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_joining" DROP CONSTRAINT "FK_67dc758bc0566985d1b3d399865"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_joining" DROP CONSTRAINT "FK_f3a1b4bd0c7cabba958a0c0b231"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group" DROP CONSTRAINT "FK_3d6b372788ab01be58853003c93"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_2c4be03b446884f9e9c502135be"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2c4be03b446884f9e9c502135b"`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "messaging_message"."recipientId" IS ''`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ALTER COLUMN "recipientId" SET NOT NULL`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP COLUMN "reads"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP COLUMN "groupId"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_67dc758bc0566985d1b3d39986"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f3a1b4bd0c7cabba958a0c0b23"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_group_joining"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3d6b372788ab01be58853003c9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_20e30aa35180e317e133d75316"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_group"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
25
migration/1558257926829-UserGroupInvite.ts
Normal file
25
migration/1558257926829-UserGroupInvite.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class UserGroupInvite1558257926829 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_group_invite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userGroupId" character varying(32) NOT NULL, CONSTRAINT "PK_3893884af0d3a5f4d01e7921a97" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_1039988afa3bf991185b277fe0" ON "user_group_invite" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e10924607d058004304611a436" ON "user_group_invite" ("userGroupId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_78787741f9010886796f2320a4" ON "user_group_invite" ("userId", "userGroupId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d9ecaed8c6dc43f3592c229282" ON "user_group_joining" ("userId", "userGroupId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_invite" ADD CONSTRAINT "FK_1039988afa3bf991185b277fe03" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_invite" ADD CONSTRAINT "FK_e10924607d058004304611a436a" FOREIGN KEY ("userGroupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_invite" DROP CONSTRAINT "FK_e10924607d058004304611a436a"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_group_invite" DROP CONSTRAINT "FK_1039988afa3bf991185b277fe03"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d9ecaed8c6dc43f3592c229282"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_78787741f9010886796f2320a4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e10924607d058004304611a436"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_1039988afa3bf991185b277fe0"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_group_invite"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1558266512381-UserListJoining.ts
Normal file
13
migration/1558266512381-UserListJoining.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class UserListJoining1558266512381 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_90f7da835e4c10aca6853621e1" ON "user_list_joining" ("userId", "userListId") `);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_90f7da835e4c10aca6853621e1"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
181
package.json
181
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.91.0",
|
"version": "11.20.0",
|
||||||
"codename": "nighthike",
|
"codename": "daybreak",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/syuilo/misskey.git"
|
"url": "https://github.com/syuilo/misskey.git"
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./index.js",
|
"start": "node ./index.js",
|
||||||
"debug": "DEBUG=misskey:* node ./index.js",
|
"init": "node ./built/init.js",
|
||||||
|
"ormconfig": "node ./built/ormconfig.js",
|
||||||
|
"migrate": "npm run ormconfig && ts-node ./node_modules/typeorm/cli.js migration:run",
|
||||||
|
"migrateandstart": "npm run migrate && npm run start",
|
||||||
"build": "webpack && gulp build",
|
"build": "webpack && gulp build",
|
||||||
"webpack": "webpack",
|
"webpack": "webpack",
|
||||||
"watch": "webpack --watch",
|
"watch": "webpack --watch",
|
||||||
@@ -23,130 +26,124 @@
|
|||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@elastic/elasticsearch": "7.0.0-rc.2",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.15",
|
"@fortawesome/fontawesome-svg-core": "1.2.15",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.7.2",
|
"@fortawesome/free-brands-svg-icons": "5.7.2",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.7.2",
|
"@fortawesome/free-regular-svg-icons": "5.7.2",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.7.2",
|
"@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",
|
|
||||||
"@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/gulp": "4.0.6",
|
||||||
"@types/file-type": "10.6.0",
|
|
||||||
"@types/gulp": "4.0.5",
|
|
||||||
"@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/jsdom": "12.2.3",
|
"@types/jsdom": "12.2.3",
|
||||||
"@types/katex": "0.10.1",
|
"@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.8",
|
||||||
"@types/mongodb": "3.1.20",
|
"@types/nodemailer": "4.6.8",
|
||||||
"@types/node": "10.12.24",
|
|
||||||
"@types/nodemailer": "4.6.6",
|
|
||||||
"@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.16",
|
||||||
"@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/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.21.2",
|
"@types/sharp": "0.22.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.29",
|
||||||
"@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": "3.5.0",
|
"apexcharts": "3.6.12",
|
||||||
"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.9.1",
|
||||||
"cafy": "15.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.1",
|
||||||
|
"commander": "2.20.0",
|
||||||
|
"content-disposition": "0.5.3",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "2.1.0",
|
"css-loader": "2.1.1",
|
||||||
"cssnano": "4.1.10",
|
"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.1",
|
||||||
"diskusage": "1.0.0",
|
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"elasticsearch": "15.3.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.2.2",
|
||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "3.1.2",
|
||||||
"feed": "2.0.2",
|
"feed": "2.0.4",
|
||||||
"file-type": "10.7.1",
|
"file-type": "10.11.0",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "4.0.0",
|
"gulp": "4.0.2",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-imagemin": "5.0.3",
|
"gulp-imagemin": "5.0.3",
|
||||||
"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.2",
|
"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",
|
||||||
"js-yaml": "3.12.1",
|
"js-yaml": "3.13.1",
|
||||||
"jsdom": "13.2.0",
|
"jsdom": "15.1.0",
|
||||||
"json5": "2.1.0",
|
"json5": "2.1.0",
|
||||||
"json5-loader": "1.0.1",
|
"json5-loader": "2.0.0",
|
||||||
"katex": "0.10.1",
|
"katex": "0.10.1",
|
||||||
"koa": "2.7.0",
|
"koa": "2.7.0",
|
||||||
"koa-bodyparser": "4.2.1",
|
"koa-bodyparser": "4.2.1",
|
||||||
@@ -159,50 +156,53 @@
|
|||||||
"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.5",
|
"minio": "7.0.8",
|
||||||
"mkdirp": "0.5.1",
|
"mocha": "6.1.4",
|
||||||
"mocha": "5.2.0",
|
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"moment": "2.24.0",
|
"moment": "2.24.0",
|
||||||
"mongodb": "3.1.13",
|
|
||||||
"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.5.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.11.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.1",
|
"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",
|
"seedrandom": "3.0.1",
|
||||||
"sharp": "0.21.3",
|
"sharp": "0.22.1",
|
||||||
"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 +211,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": "4.0.14",
|
"systeminformation": "4.1.6",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"terser-webpack-plugin": "1.2.3",
|
"terser-webpack-plugin": "1.2.4",
|
||||||
"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": "8.0.2",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.13.1",
|
"tslint": "5.15.0",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
|
"typeorm": "0.2.16-rc.1",
|
||||||
"typescript": "3.3.3333",
|
"typescript": "3.3.3333",
|
||||||
"typescript-eslint-parser": "22.0.0",
|
"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.6.8",
|
"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.2",
|
"vue-i18n": "8.11.2",
|
||||||
"vue-js-modal": "1.3.28",
|
"vue-js-modal": "1.3.31",
|
||||||
|
"vue-json-pretty": "1.6.0",
|
||||||
"vue-loader": "15.7.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.12",
|
"vue-svg-inline-loader": "1.2.15",
|
||||||
"vue-template-compiler": "2.6.8",
|
"vue-template-compiler": "2.6.10",
|
||||||
"vuedraggable": "2.18.1",
|
"vuedraggable": "2.21.0",
|
||||||
"vuewordcloud": "18.7.11",
|
"vuewordcloud": "18.7.11",
|
||||||
"vuex": "3.1.0",
|
"vuex": "3.1.1",
|
||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.3",
|
"web-push": "3.3.5",
|
||||||
"webfinger.js": "2.7.0",
|
"webpack": "4.32.2",
|
||||||
"webpack": "4.28.4",
|
"webpack-cli": "3.3.2",
|
||||||
"webpack-cli": "3.2.1",
|
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.28",
|
||||||
"ws": "6.1.4",
|
"ws": "7.0.0",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
src/@types/deepcopy.d.ts
vendored
17
src/@types/deepcopy.d.ts
vendored
@@ -1,17 +0,0 @@
|
|||||||
declare module 'deepcopy';
|
|
||||||
|
|
||||||
declare namespace deepcopy {
|
|
||||||
type DeepcopyCustomizerValueType = 'Object';
|
|
||||||
|
|
||||||
type DeepcopyCustomizer<T> = (
|
|
||||||
value: T,
|
|
||||||
valueType: DeepcopyCustomizerValueType) => T;
|
|
||||||
|
|
||||||
interface DeepcopyOptions<T> {
|
|
||||||
customizer: DeepcopyCustomizer<T>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function deepcopy<T>(
|
|
||||||
value: T,
|
|
||||||
options?: DeepcopyOptions<T> | DeepcopyCustomizer<T>): T;
|
|
||||||
}
|
|
||||||
7
src/@types/escape-regexp.d.ts
vendored
7
src/@types/escape-regexp.d.ts
vendored
@@ -1,7 +0,0 @@
|
|||||||
declare module 'escape-regexp' {
|
|
||||||
function escapeRegExp(str: string): string;
|
|
||||||
|
|
||||||
namespace escapeRegExp {} // Hack
|
|
||||||
|
|
||||||
export = escapeRegExp;
|
|
||||||
}
|
|
||||||
2
src/@types/koa-slow.d.ts
vendored
2
src/@types/koa-slow.d.ts
vendored
@@ -8,7 +8,7 @@ declare module 'koa-slow' {
|
|||||||
|
|
||||||
function slow(options?: ISlowOptions): Middleware;
|
function slow(options?: ISlowOptions): Middleware;
|
||||||
|
|
||||||
namespace slow { } // Hack
|
namespace slow {} // Hack
|
||||||
|
|
||||||
export = slow;
|
export = slow;
|
||||||
}
|
}
|
||||||
|
|||||||
65
src/@types/webfinger.js.d.ts
vendored
65
src/@types/webfinger.js.d.ts
vendored
@@ -1,65 +0,0 @@
|
|||||||
declare module 'webfinger.js' {
|
|
||||||
interface IWebFingerConstructorConfig {
|
|
||||||
tls_only?: boolean;
|
|
||||||
webfist_fallback?: boolean;
|
|
||||||
uri_fallback?: boolean;
|
|
||||||
request_timeout?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
type JRDProperties = { [type: string]: string };
|
|
||||||
|
|
||||||
interface IJRDLink {
|
|
||||||
rel: string;
|
|
||||||
type?: string;
|
|
||||||
href?: string;
|
|
||||||
template?: string;
|
|
||||||
titles?: { [lang: string]: string };
|
|
||||||
properties?: JRDProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IJRD {
|
|
||||||
subject?: string;
|
|
||||||
expires?: Date;
|
|
||||||
aliases?: string[];
|
|
||||||
properties?: JRDProperties;
|
|
||||||
links?: IJRDLink[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IIDXLinks {
|
|
||||||
'avatar': IJRDLink[];
|
|
||||||
'remotestorage': IJRDLink[];
|
|
||||||
'blog': IJRDLink[];
|
|
||||||
'vcard': IJRDLink[];
|
|
||||||
'updates': IJRDLink[];
|
|
||||||
'share': IJRDLink[];
|
|
||||||
'profile': IJRDLink[];
|
|
||||||
'webfist': IJRDLink[];
|
|
||||||
'camlistore': IJRDLink[];
|
|
||||||
[type: string]: IJRDLink[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IIDXProperties {
|
|
||||||
'name': string;
|
|
||||||
[type: string]: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IIDX {
|
|
||||||
links: IIDXLinks;
|
|
||||||
properties: IIDXProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ILookupCallbackResult {
|
|
||||||
object: IJRD;
|
|
||||||
json: string;
|
|
||||||
idx: IIDX;
|
|
||||||
}
|
|
||||||
|
|
||||||
type LookupCallback = (err: Error | string, result?: ILookupCallbackResult) => void;
|
|
||||||
|
|
||||||
export class WebFinger {
|
|
||||||
constructor(config?: IWebFingerConstructorConfig);
|
|
||||||
|
|
||||||
public lookup(address: string, cb: LookupCallback): NodeJS.Timeout;
|
|
||||||
public lookupLink(address: string, rel: string, cb: IJRDLink): void;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,8 +5,7 @@ program
|
|||||||
.version(pkg.version)
|
.version(pkg.version)
|
||||||
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
|
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
|
||||||
.option('--disable-clustering', 'Disable clustering')
|
.option('--disable-clustering', 'Disable clustering')
|
||||||
.option('--disable-queue', 'Disable job queue processing')
|
.option('--only-server', 'Run server only (without job queue processing)')
|
||||||
.option('--only-server', 'Run server only (without job queue)')
|
|
||||||
.option('--only-queue', 'Pocessing job queue only (without server)')
|
.option('--only-queue', 'Pocessing job queue only (without server)')
|
||||||
.option('--quiet', 'Suppress all logs')
|
.option('--quiet', 'Suppress all logs')
|
||||||
.option('--verbose', 'Enable all logs')
|
.option('--verbose', 'Enable all logs')
|
||||||
@@ -15,7 +14,9 @@ program
|
|||||||
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
|
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
|
||||||
.parse(process.argv);
|
.parse(process.argv);
|
||||||
|
|
||||||
/*if (process.env.MK_DISABLE_QUEUE)*/ program.disableQueue = true;
|
|
||||||
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
||||||
|
if (process.env.NODE_ENV === 'test') program.disableClustering = true;
|
||||||
|
if (process.env.NODE_ENV === 'test') program.quiet = true;
|
||||||
|
if (process.env.NODE_ENV === 'test') program.noDaemons = true;
|
||||||
|
|
||||||
export { program };
|
export { program };
|
||||||
|
|||||||
77
src/boot/index.ts
Normal file
77
src/boot/index.ts
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
import * as cluster from 'cluster';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
import Xev from 'xev';
|
||||||
|
|
||||||
|
import Logger from '../services/logger';
|
||||||
|
import { program } from '../argv';
|
||||||
|
|
||||||
|
// for typeorm
|
||||||
|
import 'reflect-metadata';
|
||||||
|
import { masterMain } from './master';
|
||||||
|
import { workerMain } from './worker';
|
||||||
|
|
||||||
|
const logger = new Logger('core', 'cyan');
|
||||||
|
const clusterLogger = logger.createSubLogger('cluster', 'orange', false);
|
||||||
|
const ev = new Xev();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init process
|
||||||
|
*/
|
||||||
|
export default async function() {
|
||||||
|
process.title = `Misskey (${cluster.isMaster ? 'master' : 'worker'})`;
|
||||||
|
|
||||||
|
if (cluster.isMaster || program.disableClustering) {
|
||||||
|
await masterMain();
|
||||||
|
|
||||||
|
if (cluster.isMaster) {
|
||||||
|
ev.mount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cluster.isWorker || program.disableClustering) {
|
||||||
|
await workerMain();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ユニットテスト時にMisskeyが子プロセスで起動された時のため
|
||||||
|
// それ以外のときは process.send は使えないので弾く
|
||||||
|
if (process.send) {
|
||||||
|
process.send('ok');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region Events
|
||||||
|
|
||||||
|
// Listen new workers
|
||||||
|
cluster.on('fork', worker => {
|
||||||
|
clusterLogger.debug(`Process forked: [${worker.id}]`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Listen online workers
|
||||||
|
cluster.on('online', worker => {
|
||||||
|
clusterLogger.debug(`Process is now online: [${worker.id}]`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Listen for dying workers
|
||||||
|
cluster.on('exit', worker => {
|
||||||
|
// Replace the dead worker,
|
||||||
|
// we're not sentimental
|
||||||
|
clusterLogger.error(chalk.red(`[${worker.id}] died :(`));
|
||||||
|
cluster.fork();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Display detail of unhandled promise rejection
|
||||||
|
if (!program.quiet) {
|
||||||
|
process.on('unhandledRejection', console.dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display detail of uncaught exception
|
||||||
|
process.on('uncaughtException', err => {
|
||||||
|
logger.error(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Dying away...
|
||||||
|
process.on('exit', code => {
|
||||||
|
logger.info(`The process is going to exit with code ${code}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
//#endregion
|
||||||
176
src/boot/master.ts
Normal file
176
src/boot/master.ts
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
import * as os from 'os';
|
||||||
|
import * as cluster from 'cluster';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
import * as portscanner from 'portscanner';
|
||||||
|
import * as isRoot from 'is-root';
|
||||||
|
|
||||||
|
import Logger from '../services/logger';
|
||||||
|
import loadConfig from '../config/load';
|
||||||
|
import { Config } from '../config/types';
|
||||||
|
import { lessThan } from '../prelude/array';
|
||||||
|
import * as pkg from '../../package.json';
|
||||||
|
import { program } from '../argv';
|
||||||
|
import { showMachineInfo } from '../misc/show-machine-info';
|
||||||
|
import { initDb } from '../db/postgre';
|
||||||
|
|
||||||
|
const logger = new Logger('core', 'cyan');
|
||||||
|
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
|
||||||
|
|
||||||
|
function greet() {
|
||||||
|
if (!program.quiet) {
|
||||||
|
//#region Misskey logo
|
||||||
|
const v = `v${pkg.version}`;
|
||||||
|
console.log(' _____ _ _ ');
|
||||||
|
console.log(' | |_|___ ___| |_ ___ _ _ ');
|
||||||
|
console.log(' | | | | |_ -|_ -| \'_| -_| | |');
|
||||||
|
console.log(' |_|_|_|_|___|___|_,_|___|_ |');
|
||||||
|
console.log(' ' + chalk.gray(v) + (' |___|\n'.substr(v.length)));
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
console.log(' Misskey is maintained by @syuilo, @AyaMorisawa, @mei23, @acid-chicken, and @rinsuki.');
|
||||||
|
console.log(chalk.keyword('orange')(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
|
||||||
|
|
||||||
|
console.log('');
|
||||||
|
console.log(chalk`< ${os.hostname()} {gray (PID: ${process.pid.toString()})} >`);
|
||||||
|
}
|
||||||
|
|
||||||
|
bootLogger.info('Welcome to Misskey!');
|
||||||
|
bootLogger.info(`Misskey v${pkg.version}`, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init master process
|
||||||
|
*/
|
||||||
|
export async function masterMain() {
|
||||||
|
greet();
|
||||||
|
|
||||||
|
let config!: Config;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// initialize app
|
||||||
|
config = await init();
|
||||||
|
|
||||||
|
if (config.port == null || Number.isNaN(config.port)) {
|
||||||
|
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === 'linux' && isWellKnownPort(config.port) && !isRoot()) {
|
||||||
|
bootLogger.error('You need root privileges to listen on well-known port on Linux', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!await isPortAvailable(config.port)) {
|
||||||
|
bootLogger.error(`Port ${config.port} is already in use`, null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
bootLogger.error('Fatal error occurred during initialization', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bootLogger.succ('Misskey initialized');
|
||||||
|
|
||||||
|
if (!program.disableClustering) {
|
||||||
|
await spawnWorkers(config.clusterLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!program.noDaemons) {
|
||||||
|
require('../daemons/server-stats').default();
|
||||||
|
require('../daemons/notes-stats').default();
|
||||||
|
require('../daemons/queue-stats').default();
|
||||||
|
}
|
||||||
|
|
||||||
|
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
const runningNodejsVersion = process.version.slice(1).split('.').map(x => parseInt(x, 10));
|
||||||
|
const requiredNodejsVersion = [11, 7, 0];
|
||||||
|
const satisfyNodejsVersion = !lessThan(runningNodejsVersion, requiredNodejsVersion);
|
||||||
|
|
||||||
|
function isWellKnownPort(port: number): boolean {
|
||||||
|
return port < 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function isPortAvailable(port: number): Promise<boolean> {
|
||||||
|
return await portscanner.checkPortStatus(port, '127.0.0.1') === 'closed';
|
||||||
|
}
|
||||||
|
|
||||||
|
function showEnvironment(): void {
|
||||||
|
const env = process.env.NODE_ENV;
|
||||||
|
const logger = bootLogger.createSubLogger('env');
|
||||||
|
logger.info(typeof env == 'undefined' ? 'NODE_ENV is not set' : `NODE_ENV: ${env}`);
|
||||||
|
|
||||||
|
if (env !== 'production') {
|
||||||
|
logger.warn('The environment is not in production mode.');
|
||||||
|
logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!', null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(`You ${isRoot() ? '' : 'do not '}have root privileges`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init app
|
||||||
|
*/
|
||||||
|
async function init(): Promise<Config> {
|
||||||
|
showEnvironment();
|
||||||
|
|
||||||
|
const nodejsLogger = bootLogger.createSubLogger('nodejs');
|
||||||
|
|
||||||
|
nodejsLogger.info(`Version ${runningNodejsVersion.join('.')}`);
|
||||||
|
|
||||||
|
if (!satisfyNodejsVersion) {
|
||||||
|
nodejsLogger.error(`Node.js version is less than ${requiredNodejsVersion.join('.')}. Please upgrade it.`, null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
await showMachineInfo(bootLogger);
|
||||||
|
|
||||||
|
const configLogger = bootLogger.createSubLogger('config');
|
||||||
|
let config;
|
||||||
|
|
||||||
|
try {
|
||||||
|
config = loadConfig();
|
||||||
|
} catch (exception) {
|
||||||
|
if (typeof exception === 'string') {
|
||||||
|
configLogger.error(exception);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
if (exception.code === 'ENOENT') {
|
||||||
|
configLogger.error('Configuration file not found', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
configLogger.succ('Loaded');
|
||||||
|
|
||||||
|
// Try to connect to DB
|
||||||
|
try {
|
||||||
|
bootLogger.info('Connecting database...');
|
||||||
|
await initDb();
|
||||||
|
} catch (e) {
|
||||||
|
bootLogger.error('Cannot connect to database', null, true);
|
||||||
|
bootLogger.error(e);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function spawnWorkers(limit: number = Infinity) {
|
||||||
|
const workers = Math.min(limit, os.cpus().length);
|
||||||
|
bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
|
||||||
|
await Promise.all([...Array(workers)].map(spawnWorker));
|
||||||
|
bootLogger.succ('All workers started');
|
||||||
|
}
|
||||||
|
|
||||||
|
function spawnWorker(): Promise<void> {
|
||||||
|
return new Promise(res => {
|
||||||
|
const worker = cluster.fork();
|
||||||
|
worker.on('message', message => {
|
||||||
|
if (message !== 'ready') return;
|
||||||
|
res();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
20
src/boot/worker.ts
Normal file
20
src/boot/worker.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import * as cluster from 'cluster';
|
||||||
|
import { initDb } from '../db/postgre';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init worker process
|
||||||
|
*/
|
||||||
|
export async function workerMain() {
|
||||||
|
await initDb();
|
||||||
|
|
||||||
|
// start server
|
||||||
|
await require('../server').default();
|
||||||
|
|
||||||
|
// start job queue
|
||||||
|
require('../queue').default();
|
||||||
|
|
||||||
|
if (cluster.isWorker) {
|
||||||
|
// Send a 'ready' message to parent process
|
||||||
|
process.send!('ready');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa icon="broadcast-tower"/> {{ $t('announcements') }}</template>
|
<template #title><fa :icon="faBroadcastTower"/> {{ $t('announcements') }}</template>
|
||||||
<section v-for="(announcement, i) in announcements" class="fit-top">
|
<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,13 +9,16 @@
|
|||||||
<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>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="add"><fa icon="plus"/> {{ $t('add') }}</ui-button>
|
<ui-button @click="add"><fa :icon="faPlus"/> {{ $t('add') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -24,12 +27,14 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
|
import { faBroadcastTower, faPlus } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/announcements.vue'),
|
i18n: i18n('admin/views/announcements.vue'),
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
announcements: [],
|
announcements: [],
|
||||||
|
faBroadcastTower, faPlus
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -43,7 +48,8 @@ export default Vue.extend({
|
|||||||
add() {
|
add() {
|
||||||
this.announcements.unshift({
|
this.announcements.unshift({
|
||||||
title: '',
|
title: '',
|
||||||
text: ''
|
text: '',
|
||||||
|
image: null
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
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
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
<ui-button @click="show()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button @click="show()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
<ui-textarea v-if="file" :value="file | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
<ui-textarea v-if="file" :value="file | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="cleanUp()"><fa :icon="faTrashAlt"/> {{ $t('clean-up') }}</ui-button>
|
||||||
|
<ui-button @click="cleanRemoteFiles()"><fa :icon="faTrashAlt"/> {{ $t('clean-remote-files') }}</ui-button>
|
||||||
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
@@ -38,7 +42,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 +52,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 +79,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 +160,6 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
thumbnail(file: any): any {
|
|
||||||
return {
|
|
||||||
'background-color': file.properties.avgColor && file.properties.avgColor.length == 3 ? `rgb(${file.properties.avgColor.join(',')})` : 'transparent',
|
|
||||||
'background-image': `url(${file.thumbnailUrl})`
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async del(file: any) {
|
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 +181,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() {
|
||||||
@@ -229,6 +231,29 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
cleanRemoteFiles() {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('clean-remote-files-are-you-sure'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
this.$root.api('admin/drive/clean-remote-files');
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
cleanUp() {
|
||||||
|
this.$root.api('admin/drive/cleanup');
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -244,7 +269,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,45 +1,59 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="faTerminal"/> {{ $t('federation') }}</template>
|
<template #title><fa :icon="faTerminal"/> {{ $t('instance') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input class="target" v-model="target" type="text" @enter="showInstance()">
|
<ui-input class="target" v-model="target" type="text" @enter="showInstance()">
|
||||||
<span>{{ $t('host') }}</span>
|
<span>{{ $t('host') }}</span>
|
||||||
|
<template #prefix><fa :icon="faServer"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-button @click="showInstance()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button @click="showInstance()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
|
|
||||||
<div class="instance" v-if="instance">
|
<div class="instance" v-if="instance">
|
||||||
<ui-input :value="instance.host" type="text" readonly>
|
<ui-horizon-group inputs>
|
||||||
<span>{{ $t('host') }}</span>
|
<ui-input :value="instance.host" type="text" readonly>
|
||||||
</ui-input>
|
<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-horizon-group inputs>
|
||||||
<ui-input :value="instance.notesCount | number" type="text" readonly>
|
<ui-input :value="instance.notesCount | number" type="text" readonly>
|
||||||
<span>{{ $t('notes') }}</span>
|
<span>{{ $t('notes') }}</span>
|
||||||
|
<template #prefix><fa :icon="faEnvelopeOpenText"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="instance.usersCount | number" type="text" readonly>
|
<ui-input :value="instance.usersCount | number" type="text" readonly>
|
||||||
<span>{{ $t('users') }}</span>
|
<span>{{ $t('users') }}</span>
|
||||||
|
<template #prefix><fa :icon="faUsers"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input :value="instance.followingCount | number" type="text" readonly>
|
<ui-input :value="instance.followingCount | number" type="text" readonly>
|
||||||
<span>{{ $t('following') }}</span>
|
<span>{{ $t('following') }}</span>
|
||||||
|
<template #prefix><fa :icon="faCaretDown"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="instance.followersCount | number" type="text" readonly>
|
<ui-input :value="instance.followersCount | number" type="text" readonly>
|
||||||
<span>{{ $t('followers') }}</span>
|
<span>{{ $t('followers') }}</span>
|
||||||
|
<template #prefix><fa :icon="faCaretUp"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input :value="instance.latestRequestSentAt" type="text" readonly>
|
<ui-input :value="instance.latestRequestSentAt | date" type="text" readonly>
|
||||||
<span>{{ $t('latest-request-sent-at') }}</span>
|
<span>{{ $t('latest-request-sent-at') }}</span>
|
||||||
|
<template #prefix><fa :icon="faPaperPlane"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="instance.latestStatus" type="text" readonly>
|
<ui-input :value="instance.latestStatus" type="text" readonly>
|
||||||
<span>{{ $t('status') }}</span>
|
<span>{{ $t('status') }}</span>
|
||||||
|
<template #prefix><fa :icon="faTrafficLight"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-input :value="instance.latestRequestReceivedAt" type="text" readonly>
|
<ui-input :value="instance.latestRequestReceivedAt | date" type="text" readonly>
|
||||||
<span>{{ $t('latest-request-received-at') }}</span>
|
<span>{{ $t('latest-request-received-at') }}</span>
|
||||||
|
<template #prefix><fa :icon="faInbox"/></template>
|
||||||
</ui-input>
|
</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>
|
<ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()">{{ $t('marked-as-closed') }}</ui-switch>
|
||||||
<details>
|
<details>
|
||||||
<summary>{{ $t('charts') }}</summary>
|
<summary>{{ $t('charts') }}</summary>
|
||||||
@@ -64,6 +78,10 @@
|
|||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<div ref="chart"></div>
|
<div ref="chart"></div>
|
||||||
</details>
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>{{ $t('delete-all-files') }}</summary>
|
||||||
|
<ui-button @click="deleteAllFiles()" style="margin-top: 16px;"><fa :icon="faTrashAlt"/> {{ $t('delete-all-files') }}</ui-button>
|
||||||
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>{{ $t('remove-all-following') }}</summary>
|
<summary>{{ $t('remove-all-following') }}</summary>
|
||||||
<ui-button @click="removeAllFollowing()" style="margin-top: 16px;"><fa :icon="faMinusCircle"/> {{ $t('remove-all-following') }}</ui-button>
|
<ui-button @click="removeAllFollowing()" style="margin-top: 16px;"><fa :icon="faMinusCircle"/> {{ $t('remove-all-following') }}</ui-button>
|
||||||
@@ -115,7 +133,7 @@
|
|||||||
<span>{{ $t('status') }}</span>
|
<span>{{ $t('status') }}</span>
|
||||||
</header>
|
</header>
|
||||||
<div v-for="instance in instances" :style="{ opacity: instance.isNotResponding ? 0.5 : 1 }">
|
<div v-for="instance in instances" :style="{ opacity: instance.isNotResponding ? 0.5 : 1 }">
|
||||||
<a @click.prevent="showInstance(instance.host)" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
|
<a @click.prevent="showInstance(instance.host)" rel="nofollow noopener" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
|
||||||
<span>{{ instance.notesCount | number }}</span>
|
<span>{{ instance.notesCount | number }}</span>
|
||||||
<span>{{ instance.usersCount | number }}</span>
|
<span>{{ instance.usersCount | number }}</span>
|
||||||
<span>{{ instance.followingCount | number }}</span>
|
<span>{{ instance.followingCount | number }}</span>
|
||||||
@@ -127,13 +145,24 @@
|
|||||||
<ui-info v-if="instances.length == limit">{{ $t('result-is-truncated', { n: limit }) }}</ui-info>
|
<ui-info v-if="instances.length == limit">{{ $t('result-is-truncated', { n: limit }) }}</ui-info>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faBan"/> {{ $t('blocked-hosts') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-textarea v-model="blockedHosts">
|
||||||
|
<template #desc>{{ $t('blocked-hosts-info') }}</template>
|
||||||
|
</ui-textarea>
|
||||||
|
<ui-button @click="saveBlockedHosts">{{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { faGlobe, faTerminal, faSearch, faMinusCircle, faServer } from '@fortawesome/free-solid-svg-icons';
|
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
import { faTrashAlt, faBan, faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faTrafficLight, faInbox } from '@fortawesome/free-solid-svg-icons';
|
||||||
import ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
import * as tinycolor from 'tinycolor2';
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
|
||||||
@@ -144,19 +173,24 @@ const negate = arr => arr.map(x => -x);
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/federation.vue'),
|
i18n: i18n('admin/views/federation.vue'),
|
||||||
|
|
||||||
|
filters: {
|
||||||
|
date: v => v ? new Date(v).toLocaleString() : 'N/A'
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
instance: null,
|
instance: null,
|
||||||
target: null,
|
target: null,
|
||||||
sort: '+lastCommunicatedAt',
|
sort: '+lastCommunicatedAt',
|
||||||
state: 'all',
|
state: 'all',
|
||||||
limit: 50,
|
limit: 100,
|
||||||
instances: [],
|
instances: [],
|
||||||
chart: null,
|
chart: null,
|
||||||
chartSrc: 'requests',
|
chartSrc: 'requests',
|
||||||
chartSpan: 'hour',
|
chartSpan: 'hour',
|
||||||
chartInstance: null,
|
chartInstance: null,
|
||||||
faGlobe, faTerminal, faSearch, faMinusCircle, faServer
|
blockedHosts: '',
|
||||||
|
faTrashAlt, faBan, faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -226,6 +260,10 @@ export default Vue.extend({
|
|||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetchInstances();
|
this.fetchInstances();
|
||||||
|
|
||||||
|
this.$root.getMeta().then(meta => {
|
||||||
|
this.blockedHosts = meta.blockedHosts.join('\n');
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
@@ -273,6 +311,17 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
deleteAllFiles() {
|
||||||
|
this.$root.api('admin/federation/delete-all-files', {
|
||||||
|
host: this.instance.host
|
||||||
|
}).then(() => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
updateInstance() {
|
updateInstance() {
|
||||||
this.$root.api('admin/federation/update-instance', {
|
this.$root.api('admin/federation/update-instance', {
|
||||||
host: this.instance.host,
|
host: this.instance.host,
|
||||||
@@ -457,6 +506,22 @@ export default Vue.extend({
|
|||||||
}]
|
}]
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
saveBlockedHosts() {
|
||||||
|
this.$root.api('admin/update-meta', {
|
||||||
|
blockedHosts: this.blockedHosts.split('\n')
|
||||||
|
}).then(() => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
text: this.$t('saved')
|
||||||
|
});
|
||||||
|
}).catch(e => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
<ui-card>
|
|
||||||
<template #title>{{ $t('hided-tags') }}</template>
|
|
||||||
<section>
|
|
||||||
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
|
|
||||||
<ui-button @click="save">{{ $t('save') }}</ui-button>
|
|
||||||
</section>
|
|
||||||
</ui-card>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import i18n from '../../i18n';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
i18n: i18n('admin/views/hashtags.vue'),
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
hidedTags: '',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
this.hidedTags = meta.hidedTags.join('\n');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
save() {
|
|
||||||
this.$root.api('admin/update-meta', {
|
|
||||||
hidedTags: this.hidedTags.split('\n')
|
|
||||||
}).then(() => {
|
|
||||||
//this.$root.os.apis.dialog({ text: `Saved` });
|
|
||||||
}).catch(e => {
|
|
||||||
//this.$root.os.apis.dialog({ text: `Failed ${e}` });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@@ -28,7 +28,6 @@
|
|||||||
<li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faGlobe" 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('abuse')" :class="{ active: page == 'abuse' }"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</li>
|
<li @click="nav('abuse')" :class="{ active: page == 'abuse' }"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="back-to-misskey">
|
<div class="back-to-misskey">
|
||||||
@@ -48,7 +47,6 @@
|
|||||||
<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 == 'drive'"><x-drive/></div>
|
<div v-if="page == 'drive'"><x-drive/></div>
|
||||||
<div v-if="page == 'federation'"><x-federation/></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>
|
||||||
@@ -68,7 +66,6 @@ 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";
|
||||||
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";
|
||||||
@@ -91,7 +88,6 @@ export default Vue.extend({
|
|||||||
XModerators,
|
XModerators,
|
||||||
XEmoji,
|
XEmoji,
|
||||||
XAnnouncements,
|
XAnnouncements,
|
||||||
XHashtags,
|
|
||||||
XUsers,
|
XUsers,
|
||||||
XDrive,
|
XDrive,
|
||||||
XAbuse,
|
XAbuse,
|
||||||
|
|||||||
@@ -2,135 +2,242 @@
|
|||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa icon="cog"/> {{ $t('instance') }}</template>
|
<template #title><fa icon="cog"/> {{ $t('instance') }}</template>
|
||||||
<section class="fit-top fit-bottom">
|
<section class="fit-top">
|
||||||
<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
|
<ui-input :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="iconUrl"><template #icon><fa icon="link"/></template>{{ $t('icon-url') }}</ui-input>
|
||||||
<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
|
<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
|
||||||
<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
|
<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
|
||||||
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
|
<ui-input v-model="ToSUrl"><template #icon><fa icon="link"/></template>{{ $t('tos-url') }}</ui-input>
|
||||||
<ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input>
|
<details>
|
||||||
|
<summary>{{ $t('advanced-config') }}</summary>
|
||||||
|
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
|
||||||
|
<ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input>
|
||||||
|
<ui-input v-model="repositoryUrl"><template #icon><fa icon="link"/></template>{{ $t('repository-url') }}</ui-input>
|
||||||
|
<ui-input v-model="feedbackUrl"><template #icon><fa icon="link"/></template>{{ $t('feedback-url') }}</ui-input>
|
||||||
|
</details>
|
||||||
</section>
|
</section>
|
||||||
<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"><template #icon><fa :icon="farEnvelope"/></template>{{ $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>
|
||||||
|
<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
|
||||||
|
<ui-button v-if="disableRegistration" @click="invite">{{ $t('invite') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faPencilAlt"/> {{ $t('note-and-tl') }}</template>
|
||||||
<section class="fit-top fit-bottom">
|
<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>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
|
|
||||||
<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
|
<ui-switch v-model="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>
|
||||||
</section>
|
</section>
|
||||||
<section class="fit-bottom">
|
<section>
|
||||||
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
<ui-switch v-model="enableEmojiReaction">{{ $t('enable-emoji-reaction') }}</ui-switch>
|
||||||
|
<ui-switch v-model="useStarForReactionFallback">{{ $t('use-star-for-reaction-fallback') }}</ui-switch>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa icon="cloud"/> {{ $t('drive-config') }}</template>
|
||||||
|
<section>
|
||||||
|
<ui-switch v-model="useObjectStorage">{{ $t('use-object-storage') }}</ui-switch>
|
||||||
|
<template v-if="useObjectStorage">
|
||||||
|
<ui-info>
|
||||||
|
<i18n path="object-storage-s3-info">
|
||||||
|
<a href="https://docs.aws.amazon.com/general/latest/gr/rande.html" target="_blank">{{ $t('object-storage-s3-info-here') }}</a>
|
||||||
|
</i18n>
|
||||||
|
</ui-info>
|
||||||
|
<ui-info>{{ $t('object-storage-gcs-info') }}</ui-info>
|
||||||
|
<ui-input v-model="objectStorageBaseUrl" :disabled="!useObjectStorage">{{ $t('object-storage-base-url') }}</ui-input>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="objectStorageBucket" :disabled="!useObjectStorage">{{ $t('object-storage-bucket') }}</ui-input>
|
||||||
|
<ui-input v-model="objectStoragePrefix" :disabled="!useObjectStorage">{{ $t('object-storage-prefix') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-input v-model="objectStorageEndpoint" :disabled="!useObjectStorage">{{ $t('object-storage-endpoint') }}</ui-input>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="objectStorageRegion" :disabled="!useObjectStorage">{{ $t('object-storage-region') }}</ui-input>
|
||||||
|
<ui-input v-model="objectStoragePort" type="number" :disabled="!useObjectStorage">{{ $t('object-storage-port') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="objectStorageAccessKey" :disabled="!useObjectStorage"><template #icon><fa icon="key"/></template>{{ $t('object-storage-access-key') }}</ui-input>
|
||||||
|
<ui-input v-model="objectStorageSecretKey" :disabled="!useObjectStorage"><template #icon><fa icon="key"/></template>{{ $t('object-storage-secret-key') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-switch v-model="objectStorageUseSSL" :disabled="!useObjectStorage">{{ $t('object-storage-use-ssl') }}</ui-switch>
|
||||||
|
</template>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
|
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
|
||||||
|
</section>
|
||||||
|
<section class="fit-top fit-bottom">
|
||||||
<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
|
<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
|
||||||
<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
|
<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">
|
|
||||||
<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
|
|
||||||
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
|
||||||
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
|
||||||
<ui-horizon-group inputs>
|
|
||||||
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
|
|
||||||
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
|
|
||||||
</ui-horizon-group>
|
|
||||||
</section>
|
|
||||||
<section>
|
<section>
|
||||||
<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faThumbtack"/> {{ $t('pinned-users') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-textarea v-model="pinnedUsers">
|
||||||
|
<template #desc>{{ $t('pinned-users-info') }}</template>
|
||||||
|
</ui-textarea>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</template>
|
||||||
|
<section>
|
||||||
<ui-info>{{ $t('proxy-account-info') }}</ui-info>
|
<ui-info>{{ $t('proxy-account-info') }}</ui-info>
|
||||||
<ui-input v-model="proxyAccount"><template #prefix>@</template>{{ $t('proxy-account-username') }}<template #desc>{{ $t('proxy-account-username-desc') }}</template></ui-input>
|
<ui-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>
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="farEnvelope"/> {{ $t('email-config') }}</template>
|
||||||
|
<section>
|
||||||
<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<template #desc>{{ $t('email-config-info') }}</template></ui-switch>
|
<ui-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>
|
<template v-if="enableEmail">
|
||||||
<ui-horizon-group inputs>
|
<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
|
||||||
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input>
|
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
||||||
</ui-horizon-group>
|
<ui-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input>
|
||||||
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
</ui-horizon-group>
|
||||||
<ui-horizon-group inputs>
|
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
||||||
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
||||||
</ui-horizon-group>
|
<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
||||||
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
</ui-horizon-group>
|
||||||
|
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
||||||
|
</template>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header>
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</template>
|
||||||
|
<section>
|
||||||
<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<template #desc>{{ $t('serviceworker-info') }}</template></ui-switch>
|
<ui-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>
|
<template v-if="enableServiceWorker">
|
||||||
<ui-horizon-group inputs class="fit-bottom">
|
<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
|
||||||
<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
|
<ui-horizon-group inputs class="fit-bottom">
|
||||||
<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
|
<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
|
||||||
</ui-horizon-group>
|
<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
</template>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<header>summaly Proxy</header>
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
<ui-input v-model="summalyProxy">URL</ui-input>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<header><fa :icon="faUserPlus"/> {{ $t('user-recommendation-config') }}</header>
|
|
||||||
<ui-switch v-model="enableExternalUserRecommendation">{{ $t('enable-external-user-recommendation') }}</ui-switch>
|
|
||||||
<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<template #desc>{{ $t('external-user-recommendation-engine-desc') }}</template></ui-input>
|
|
||||||
<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<template #suffix>ms</template><template #desc>{{ $t('external-user-recommendation-timeout-desc') }}</template></ui-input>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title>{{ $t('invite') }}</template>
|
<template #title><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</template>
|
||||||
|
<section :class="enableRecaptcha ? 'fit-bottom' : ''">
|
||||||
|
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
||||||
|
<template v-if="enableRecaptcha">
|
||||||
|
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
||||||
|
<ui-info warn>{{ $t('recaptcha-info2') }}</ui-info>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
|
||||||
|
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
</template>
|
||||||
|
</section>
|
||||||
|
<section v-if="enableRecaptcha && recaptchaSiteKey">
|
||||||
|
<header>{{ $t('recaptcha-preview') }}</header>
|
||||||
|
<div ref="recaptcha" style="margin: 16px 0 0 0;" :key="recaptchaSiteKey"></div>
|
||||||
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="invite">{{ $t('invite') }}</ui-button>
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</template>
|
<template #title><fa :icon="faShieldAlt"/> {{ $t('external-service-integration-config') }}</template>
|
||||||
<section>
|
<section>
|
||||||
|
<header><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</header>
|
||||||
<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>
|
<template v-if="enableTwitterIntegration">
|
||||||
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
<ui-horizon-group>
|
||||||
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
||||||
</ui-horizon-group>
|
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
||||||
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
</ui-horizon-group>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
||||||
|
</template>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
|
||||||
|
|
||||||
<ui-card>
|
|
||||||
<template #title><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</template>
|
|
||||||
<section>
|
<section>
|
||||||
|
<header><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</header>
|
||||||
<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>
|
<template v-if="enableGithubIntegration">
|
||||||
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
|
<ui-horizon-group>
|
||||||
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
|
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
|
||||||
</ui-horizon-group>
|
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
|
||||||
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
</ui-horizon-group>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
||||||
|
</template>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</header>
|
||||||
|
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||||
|
<template v-if="enableDiscordIntegration">
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input>
|
||||||
|
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
||||||
|
</template>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<details>
|
||||||
<template #title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template>
|
<summary style="color:var(--text);">{{ $t('advanced-config') }}</summary>
|
||||||
<section>
|
|
||||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
<ui-card>
|
||||||
<ui-horizon-group>
|
<template #title><fa :icon="faHashtag"/> {{ $t('hidden-tags') }}</template>
|
||||||
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input>
|
<section class="fit-top">
|
||||||
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
|
<ui-textarea v-model="hiddenTags">
|
||||||
</ui-horizon-group>
|
<template #desc>{{ $t('hidden-tags-info') }}</template>
|
||||||
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
</ui-textarea>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title>summaly Proxy</template>
|
||||||
|
<section class="fit-top fit-bottom">
|
||||||
|
<ui-input v-model="summalyProxy">URL</ui-input>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</details>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -139,8 +246,8 @@ import Vue from 'vue';
|
|||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { url, host } from '../../config';
|
import { url, host } from '../../config';
|
||||||
import { toUnicode } from 'punycode';
|
import { toUnicode } from 'punycode';
|
||||||
import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt } from '@fortawesome/free-solid-svg-icons';
|
import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt, faThumbtack, faPencilAlt, faHashtag } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons';
|
import { faEnvelope as farEnvelope, faSave } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/instance.vue'),
|
i18n: i18n('admin/views/instance.vue'),
|
||||||
@@ -151,12 +258,18 @@ export default Vue.extend({
|
|||||||
host: toUnicode(host),
|
host: toUnicode(host),
|
||||||
maintainerName: null,
|
maintainerName: null,
|
||||||
maintainerEmail: null,
|
maintainerEmail: null,
|
||||||
|
ToSUrl: null,
|
||||||
|
repositoryUrl: "https://github.com/syuilo/misskey",
|
||||||
|
feedbackUrl: null,
|
||||||
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,10 +290,6 @@ export default Vue.extend({
|
|||||||
discordClientId: null,
|
discordClientId: null,
|
||||||
discordClientSecret: null,
|
discordClientSecret: null,
|
||||||
proxyAccount: null,
|
proxyAccount: null,
|
||||||
inviteCode: null,
|
|
||||||
enableExternalUserRecommendation: false,
|
|
||||||
externalUserRecommendationEngine: null,
|
|
||||||
externalUserRecommendationTimeout: null,
|
|
||||||
summalyProxy: null,
|
summalyProxy: null,
|
||||||
enableEmail: false,
|
enableEmail: false,
|
||||||
email: null,
|
email: null,
|
||||||
@@ -193,20 +302,38 @@ export default Vue.extend({
|
|||||||
enableServiceWorker: false,
|
enableServiceWorker: false,
|
||||||
swPublicKey: null,
|
swPublicKey: null,
|
||||||
swPrivateKey: null,
|
swPrivateKey: null,
|
||||||
faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt
|
pinnedUsers: '',
|
||||||
|
hiddenTags: '',
|
||||||
|
useObjectStorage: false,
|
||||||
|
objectStorageBaseUrl: null,
|
||||||
|
objectStorageBucket: null,
|
||||||
|
objectStoragePrefix: null,
|
||||||
|
objectStorageEndpoint: null,
|
||||||
|
objectStorageRegion: null,
|
||||||
|
objectStoragePort: null,
|
||||||
|
objectStorageAccessKey: null,
|
||||||
|
objectStorageSecretKey: null,
|
||||||
|
objectStorageUseSSL: false,
|
||||||
|
faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt, faThumbtack, faPencilAlt, faSave, faHashtag
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
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.ToSUrl = meta.ToSUrl;
|
||||||
|
this.repositoryUrl = meta.repositoryUrl;
|
||||||
|
this.feedbackUrl = meta.feedbackUrl;
|
||||||
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(' ');
|
||||||
@@ -227,9 +354,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;
|
||||||
@@ -242,13 +366,56 @@ export default Vue.extend({
|
|||||||
this.enableServiceWorker = meta.enableServiceWorker;
|
this.enableServiceWorker = meta.enableServiceWorker;
|
||||||
this.swPublicKey = meta.swPublickey;
|
this.swPublicKey = meta.swPublickey;
|
||||||
this.swPrivateKey = meta.swPrivateKey;
|
this.swPrivateKey = meta.swPrivateKey;
|
||||||
|
this.pinnedUsers = meta.pinnedUsers.join('\n');
|
||||||
|
this.hiddenTags = meta.hiddenTags.join('\n');
|
||||||
|
this.useObjectStorage = meta.useObjectStorage;
|
||||||
|
this.objectStorageBaseUrl = meta.objectStorageBaseUrl;
|
||||||
|
this.objectStorageBucket = meta.objectStorageBucket;
|
||||||
|
this.objectStoragePrefix = meta.objectStoragePrefix;
|
||||||
|
this.objectStorageEndpoint = meta.objectStorageEndpoint;
|
||||||
|
this.objectStorageRegion = meta.objectStorageRegion;
|
||||||
|
this.objectStoragePort = meta.objectStoragePort;
|
||||||
|
this.objectStorageAccessKey = meta.objectStorageAccessKey;
|
||||||
|
this.objectStorageSecretKey = meta.objectStorageSecretKey;
|
||||||
|
this.objectStorageUseSSL = meta.objectStorageUseSSL;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
const renderRecaptchaPreview = () => {
|
||||||
|
if (!(window as any).grecaptcha) return;
|
||||||
|
if (!this.$refs.recaptcha) return;
|
||||||
|
if (!this.recaptchaSiteKey) return;
|
||||||
|
(window as any).grecaptcha.render(this.$refs.recaptcha, {
|
||||||
|
sitekey: this.recaptchaSiteKey
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onRecaotchaLoad = () => {
|
||||||
|
renderRecaptchaPreview();
|
||||||
|
};
|
||||||
|
|
||||||
|
const head = document.getElementsByTagName('head')[0];
|
||||||
|
const script = document.createElement('script');
|
||||||
|
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js?onload=onRecaotchaLoad');
|
||||||
|
head.appendChild(script);
|
||||||
|
|
||||||
|
this.$watch('enableRecaptcha', () => {
|
||||||
|
renderRecaptchaPreview();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$watch('recaptchaSiteKey', () => {
|
||||||
|
renderRecaptchaPreview();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
invite() {
|
invite() {
|
||||||
this.$root.api('admin/invite').then(x => {
|
this.$root.api('admin/invite').then(x => {
|
||||||
this.inviteCode = x.code;
|
this.$root.dialog({
|
||||||
|
type: 'info',
|
||||||
|
text: x.code
|
||||||
|
});
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
@@ -261,12 +428,18 @@ export default Vue.extend({
|
|||||||
this.$root.api('admin/update-meta', {
|
this.$root.api('admin/update-meta', {
|
||||||
maintainerName: this.maintainerName,
|
maintainerName: this.maintainerName,
|
||||||
maintainerEmail: this.maintainerEmail,
|
maintainerEmail: this.maintainerEmail,
|
||||||
|
ToSUrl: this.ToSUrl,
|
||||||
|
repositoryUrl: this.repositoryUrl,
|
||||||
|
feedbackUrl: this.feedbackUrl,
|
||||||
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(' '),
|
||||||
@@ -287,9 +460,6 @@ 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,
|
||||||
@@ -300,7 +470,19 @@ export default Vue.extend({
|
|||||||
smtpPass: this.smtpAuth ? 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,
|
||||||
|
pinnedUsers: this.pinnedUsers.split('\n'),
|
||||||
|
hiddenTags: this.hiddenTags.split('\n'),
|
||||||
|
useObjectStorage: this.useObjectStorage,
|
||||||
|
objectStorageBaseUrl: this.objectStorageBaseUrl ? this.objectStorageBaseUrl : null,
|
||||||
|
objectStorageBucket: this.objectStorageBucket ? this.objectStorageBucket : null,
|
||||||
|
objectStoragePrefix: this.objectStoragePrefix ? this.objectStoragePrefix : null,
|
||||||
|
objectStorageEndpoint: this.objectStorageEndpoint ? this.objectStorageEndpoint : null,
|
||||||
|
objectStorageRegion: this.objectStorageRegion ? this.objectStorageRegion : null,
|
||||||
|
objectStoragePort: this.objectStoragePort ? this.objectStoragePort : null,
|
||||||
|
objectStorageAccessKey: this.objectStorageAccessKey ? this.objectStorageAccessKey : null,
|
||||||
|
objectStorageSecretKey: this.objectStorageSecretKey ? this.objectStorageSecretKey : null,
|
||||||
|
objectStorageUseSSL: this.objectStorageUseSSL,
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<template #title><fa :icon="faStream"/> {{ $t('logs') }}</template>
|
<template #title><fa :icon="faStream"/> {{ $t('logs') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="domain">
|
<ui-input v-model="domain" :debounce="true">
|
||||||
<span>{{ $t('domain') }}</span>
|
<span>{{ $t('domain') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-select v-model="level">
|
<ui-select v-model="level">
|
||||||
@@ -19,10 +19,15 @@
|
|||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
|
||||||
<div class="nqjzuvev">
|
<div class="nqjzuvev">
|
||||||
<code v-for="log in logs" :key="log._id" :class="log.level">
|
<code v-for="log in logs" :key="log.id" :class="log.level">
|
||||||
<mk-time :time="log.createdAt"/> [{{ log.domain.join(' ') }}] {{ log.message }}
|
<details>
|
||||||
|
<summary><mk-time :time="log.createdAt"/> [{{ log.domain.join('.') }}] {{ log.message }}</summary>
|
||||||
|
<vue-json-pretty v-if="log.data" :data="log.data"></vue-json-pretty>
|
||||||
|
</details>
|
||||||
</code>
|
</code>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ui-button @click="deleteAll()">{{ $t('delete-all') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -32,10 +37,15 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { faStream } from '@fortawesome/free-solid-svg-icons';
|
import { faStream } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import VueJsonPretty from 'vue-json-pretty';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/logs.vue'),
|
i18n: i18n('admin/views/logs.vue'),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
VueJsonPretty
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
logs: [],
|
logs: [],
|
||||||
@@ -66,9 +76,18 @@ export default Vue.extend({
|
|||||||
this.$root.api('admin/logs', {
|
this.$root.api('admin/logs', {
|
||||||
level: this.level === 'all' ? null : this.level,
|
level: this.level === 'all' ? null : this.level,
|
||||||
domain: this.domain === '' ? null : this.domain,
|
domain: this.domain === '' ? null : this.domain,
|
||||||
limit: 50
|
limit: 100
|
||||||
}).then(logs => {
|
}).then(logs => {
|
||||||
this.logs = logs;
|
this.logs = logs.reverse();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteAll() {
|
||||||
|
this.$root.api('admin/delete-logs').then(() => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,11 +96,10 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.nqjzuvev
|
.nqjzuvev
|
||||||
white-space nowrap
|
|
||||||
overflow auto
|
|
||||||
padding 8px
|
padding 8px
|
||||||
background #000
|
background #000
|
||||||
color #fff
|
color #fff
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
> code
|
> code
|
||||||
display block
|
display block
|
||||||
|
|||||||
181
src/client/app/admin/views/queue.chart.vue
Normal file
181
src/client/app/admin/views/queue.chart.vue
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<ui-info warn v-if="latestStats && latestStats.waiting > 0">The queue is jammed.</ui-info>
|
||||||
|
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
||||||
|
<ui-input :value="latestStats.activeSincePrevTick | number" type="text" readonly>
|
||||||
|
<span>Process</span>
|
||||||
|
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
||||||
|
<template #suffix>jobs/tick</template>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="latestStats.active | number" type="text" readonly>
|
||||||
|
<span>Active</span>
|
||||||
|
<template #prefix><fa :icon="farPlayCircle"/></template>
|
||||||
|
<template #suffix>jobs</template>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="latestStats.waiting | number" type="text" readonly>
|
||||||
|
<span>Waiting</span>
|
||||||
|
<template #prefix><fa :icon="faStopCircle"/></template>
|
||||||
|
<template #suffix>jobs</template>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="latestStats.delayed | number" type="text" readonly>
|
||||||
|
<span>Delayed</span>
|
||||||
|
<template #prefix><fa :icon="faStopwatch"/></template>
|
||||||
|
<template #suffix>jobs</template>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<div ref="chart" class="wptihjuy"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import ApexCharts from 'apexcharts';
|
||||||
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
import { faStopwatch, faPlayCircle as fasPlayCircle } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faStopCircle, faPlayCircle as farPlayCircle } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('admin/views/queue.vue'),
|
||||||
|
|
||||||
|
props: {
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
connection: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
limit: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
stats: [],
|
||||||
|
chart: null,
|
||||||
|
faStopwatch, faStopCircle, farPlayCircle, fasPlayCircle
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
latestStats(): any {
|
||||||
|
return this.stats.length > 0 ? this.stats[this.stats.length - 1][this.type] : null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
stats(stats) {
|
||||||
|
this.chart.updateSeries([{
|
||||||
|
name: 'Process',
|
||||||
|
type: 'area',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].activeSincePrevTick }))
|
||||||
|
}, {
|
||||||
|
name: 'Active',
|
||||||
|
type: 'area',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].active }))
|
||||||
|
}, {
|
||||||
|
name: 'Waiting',
|
||||||
|
type: 'line',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].waiting }))
|
||||||
|
}, {
|
||||||
|
name: 'Delayed',
|
||||||
|
type: 'line',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].delayed }))
|
||||||
|
}]);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.chart = new ApexCharts(this.$refs.chart, {
|
||||||
|
chart: {
|
||||||
|
id: this.type,
|
||||||
|
group: 'queue',
|
||||||
|
type: 'area',
|
||||||
|
height: 200,
|
||||||
|
animations: {
|
||||||
|
dynamicAnimation: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
zoom: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||||
|
xaxis: {
|
||||||
|
lines: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
curve: 'straight',
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
labels: {
|
||||||
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
series: [] as any,
|
||||||
|
colors: ['#00E396', '#00BCD4', '#FFB300', '#e53935'],
|
||||||
|
xaxis: {
|
||||||
|
type: 'numeric',
|
||||||
|
labels: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: false,
|
||||||
|
min: 0,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.chart.render();
|
||||||
|
|
||||||
|
this.connection.on('stats', this.onStats);
|
||||||
|
this.connection.on('statsLog', this.onStatsLog);
|
||||||
|
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
if (this.chart) this.chart.destroy();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onStats(stats) {
|
||||||
|
this.stats.push(stats);
|
||||||
|
if (this.stats.length > this.limit) this.stats.shift();
|
||||||
|
},
|
||||||
|
|
||||||
|
onStatsLog(statsLog) {
|
||||||
|
for (const stats of statsLog.reverse()) {
|
||||||
|
this.onStats(stats);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.wptihjuy
|
||||||
|
min-height 200px !important
|
||||||
|
margin -8px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -1,26 +1,121 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title>{{ $t('operation') }}</template>
|
<template #title><fa :icon="faChartBar"/> {{ $t('title') }}</template>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="faPaperPlane"/> {{ $t('domains.deliver') }}</header>
|
||||||
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="deliver"/>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="faInbox"/> {{ $t('domains.inbox') }}</header>
|
||||||
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="inbox"/>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<details>
|
||||||
|
<summary>{{ $t('other-queues') }}</summary>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="faDatabase"/> {{ $t('domains.db') }}</header>
|
||||||
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="db"/>
|
||||||
|
</section>
|
||||||
|
<ui-hr/>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="faCloud"/> {{ $t('domains.objectStorage') }}</header>
|
||||||
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="objectStorage"/>
|
||||||
|
</section>
|
||||||
|
</details>
|
||||||
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faTasks"/> {{ $t('jobs') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-select v-model="domain">
|
||||||
|
<template #label>{{ $t('queue') }}</template>
|
||||||
|
<option value="deliver">{{ $t('domains.deliver') }}</option>
|
||||||
|
<option value="inbox">{{ $t('domains.inbox') }}</option>
|
||||||
|
<option value="db">{{ $t('domains.db') }}</option>
|
||||||
|
<option value="objectStorage">{{ $t('domains.objectStorage') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
<ui-select v-model="state">
|
||||||
|
<template #label>{{ $t('state') }}</template>
|
||||||
|
<option value="active">{{ $t('states.active') }}</option>
|
||||||
|
<option value="waiting">{{ $t('states.waiting') }}</option>
|
||||||
|
<option value="delayed">{{ $t('states.delayed') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
|
<div class="xvvuvgsv" v-for="job in jobs">
|
||||||
|
<b>{{ job.id }}</b>
|
||||||
|
<template v-if="domain === 'deliver'">
|
||||||
|
<span>{{ job.data.to }}</span>
|
||||||
|
</template>
|
||||||
|
<template v-if="domain === 'inbox'">
|
||||||
|
<span>{{ job.activity.id }}</span>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</sequential-entrance>
|
||||||
|
<ui-info v-if="jobs.length == jobsLimit">{{ $t('result-is-truncated', { n: jobsLimit }) }}</ui-info>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
import { faTasks, faInbox, faDatabase, faCloud } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faPaperPlane, faChartBar } from '@fortawesome/free-regular-svg-icons';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
|
import XChart from './queue.chart.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/queue.vue'),
|
i18n: i18n('admin/views/queue.vue'),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XChart
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
connection: null,
|
||||||
|
chartLimit: 200,
|
||||||
|
jobs: [],
|
||||||
|
jobsLimit: 50,
|
||||||
|
domain: 'deliver',
|
||||||
|
state: 'delayed',
|
||||||
|
faTasks, faPaperPlane, faInbox, faChartBar, faDatabase, faCloud
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
domain() {
|
||||||
|
this.jobs = [];
|
||||||
|
this.fetchJobs();
|
||||||
|
},
|
||||||
|
|
||||||
|
state() {
|
||||||
|
this.jobs = [];
|
||||||
|
this.fetchJobs();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetchJobs();
|
||||||
|
|
||||||
|
this.connection = this.$root.stream.useSharedConnection('queueStats');
|
||||||
|
this.connection.send('requestLog', {
|
||||||
|
id: Math.random().toString().substr(2, 8),
|
||||||
|
length: this.chartLimit
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
this.connection.dispose();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
async removeAllJobs() {
|
async removeAllJobs() {
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
@@ -38,6 +133,23 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
fetchJobs() {
|
||||||
|
this.$root.api('admin/queue/jobs', {
|
||||||
|
domain: this.domain,
|
||||||
|
state: this.state,
|
||||||
|
limit: this.jobsLimit
|
||||||
|
}).then(jobs => {
|
||||||
|
this.jobs = jobs;
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.xvvuvgsv
|
||||||
|
> b
|
||||||
|
margin-right 16px
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
<span class="username">@{{ user | acct }}</span>
|
<span class="username">@{{ user | acct }}</span>
|
||||||
<span class="is-admin" v-if="user.isAdmin">admin</span>
|
<span class="is-admin" v-if="user.isAdmin">admin</span>
|
||||||
<span class="is-moderator" v-if="user.isModerator">moderator</span>
|
<span class="is-moderator" v-if="user.isModerator">moderator</span>
|
||||||
<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
|
|
||||||
<span class="is-silenced" v-if="user.isSilenced" :title="$t('@.silenced-user')"><fa :icon="faMicrophoneSlash"/></span>
|
<span class="is-silenced" v-if="user.isSilenced" :title="$t('@.silenced-user')"><fa :icon="faMicrophoneSlash"/></span>
|
||||||
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
|
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
|
||||||
</header>
|
</header>
|
||||||
@@ -77,7 +76,6 @@ export default Vue.extend({
|
|||||||
background var(--noteHeaderAdminBg)
|
background var(--noteHeaderAdminBg)
|
||||||
color var(--noteHeaderAdminFg)
|
color var(--noteHeaderAdminFg)
|
||||||
|
|
||||||
> .is-verified
|
|
||||||
> .is-silenced
|
> .is-silenced
|
||||||
> .is-suspended
|
> .is-suspended
|
||||||
margin 0 0 0 .5em
|
margin 0 0 0 .5em
|
||||||
|
|||||||
@@ -9,13 +9,10 @@
|
|||||||
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
|
|
||||||
<div class="user" v-if="user">
|
<div class="user" v-if="user">
|
||||||
<x-user :user='user'/>
|
<x-user :user="user"/>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
|
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
|
||||||
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
||||||
<ui-horizon-group>
|
|
||||||
<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
|
|
||||||
<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
|
|
||||||
</ui-horizon-group>
|
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-button @click="silenceUser"><fa :icon="faMicrophoneSlash"/> {{ $t('make-silence') }}</ui-button>
|
<ui-button @click="silenceUser"><fa :icon="faMicrophoneSlash"/> {{ $t('make-silence') }}</ui-button>
|
||||||
<ui-button @click="unsilenceUser">{{ $t('unmake-silence') }}</ui-button>
|
<ui-button @click="unsilenceUser">{{ $t('unmake-silence') }}</ui-button>
|
||||||
@@ -24,7 +21,7 @@
|
|||||||
<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
|
<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
|
||||||
<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
|
<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
|
<ui-button @click="deleteAllFiles"><fa :icon="faTrashAlt"/> {{ $t('delete-all-files') }}</ui-button>
|
||||||
<ui-textarea v-if="user" :value="user | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
<ui-textarea v-if="user" :value="user | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -47,7 +44,6 @@
|
|||||||
<option value="all">{{ $t('users.state.all') }}</option>
|
<option value="all">{{ $t('users.state.all') }}</option>
|
||||||
<option value="admin">{{ $t('users.state.admin') }}</option>
|
<option value="admin">{{ $t('users.state.admin') }}</option>
|
||||||
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
||||||
<option value="verified">{{ $t('users.state.verified') }}</option>
|
|
||||||
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
||||||
<option value="suspended">{{ $t('users.state.suspended') }}</option>
|
<option value="suspended">{{ $t('users.state.suspended') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
@@ -71,8 +67,8 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import parseAcct from "../../../../misc/acct/parse";
|
import parseAcct from "../../../../misc/acct/parse";
|
||||||
import { faCertificate, faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
import { faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
import { faSnowflake, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
|
||||||
import XUser from './users.user.vue';
|
import XUser from './users.user.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
@@ -84,8 +80,6 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
user: null,
|
user: null,
|
||||||
target: null,
|
target: null,
|
||||||
verifying: false,
|
|
||||||
unverifying: false,
|
|
||||||
suspending: false,
|
suspending: false,
|
||||||
unsuspending: false,
|
unsuspending: false,
|
||||||
sort: '+createdAt',
|
sort: '+createdAt',
|
||||||
@@ -95,7 +89,7 @@ export default Vue.extend({
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
users: [],
|
users: [],
|
||||||
existMore: false,
|
existMore: false,
|
||||||
faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash
|
faTerminal, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash, faTrashAlt
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -165,7 +159,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
/** 処理対象ユーザーの情報を更新する */
|
/** 処理対象ユーザーの情報を更新する */
|
||||||
async refreshUser() {
|
async refreshUser() {
|
||||||
this.$root.api('admin/show-user', { userId: this.user._id }).then(info => {
|
this.$root.api('admin/show-user', { userId: this.user.id }).then(info => {
|
||||||
this.user = info;
|
this.user = info;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -173,7 +167,7 @@ export default Vue.extend({
|
|||||||
async resetPassword() {
|
async resetPassword() {
|
||||||
if (!await this.getConfirmed(this.$t('reset-password-confirm'))) return;
|
if (!await this.getConfirmed(this.$t('reset-password-confirm'))) return;
|
||||||
|
|
||||||
this.$root.api('admin/reset-password', { userId: this.user._id }).then(res => {
|
this.$root.api('admin/reset-password', { userId: this.user.id }).then(res => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('password-updated', { password: res.password })
|
text: this.$t('password-updated', { password: res.password })
|
||||||
@@ -181,59 +175,11 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
async verifyUser() {
|
|
||||||
if (!await this.getConfirmed(this.$t('verify-confirm'))) return;
|
|
||||||
|
|
||||||
this.verifying = true;
|
|
||||||
|
|
||||||
const process = async () => {
|
|
||||||
await this.$root.api('admin/verify-user', { userId: this.user._id });
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'success',
|
|
||||||
text: this.$t('verified')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
await process().catch(e => {
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'error',
|
|
||||||
text: e.toString()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.verifying = false;
|
|
||||||
|
|
||||||
this.refreshUser();
|
|
||||||
},
|
|
||||||
|
|
||||||
async unverifyUser() {
|
|
||||||
if (!await this.getConfirmed(this.$t('unverify-confirm'))) return;
|
|
||||||
|
|
||||||
this.unverifying = true;
|
|
||||||
|
|
||||||
const process = async () => {
|
|
||||||
await this.$root.api('admin/unverify-user', { userId: this.user._id });
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'success',
|
|
||||||
text: this.$t('unverified')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
await process().catch(e => {
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'error',
|
|
||||||
text: e.toString()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.unverifying = false;
|
|
||||||
|
|
||||||
this.refreshUser();
|
|
||||||
},
|
|
||||||
|
|
||||||
async silenceUser() {
|
async silenceUser() {
|
||||||
|
if (!await this.getConfirmed(this.$t('silence-confirm'))) return;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/silence-user', { userId: this.user._id });
|
await this.$root.api('admin/silence-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
splash: true
|
splash: true
|
||||||
@@ -251,8 +197,10 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async unsilenceUser() {
|
async unsilenceUser() {
|
||||||
|
if (!await this.getConfirmed(this.$t('unsilence-confirm'))) return;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/unsilence-user', { userId: this.user._id });
|
await this.$root.api('admin/unsilence-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
splash: true
|
splash: true
|
||||||
@@ -275,7 +223,7 @@ export default Vue.extend({
|
|||||||
this.suspending = true;
|
this.suspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/suspend-user', { userId: this.user._id });
|
await this.$root.api('admin/suspend-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('suspended')
|
text: this.$t('suspended')
|
||||||
@@ -300,7 +248,7 @@ export default Vue.extend({
|
|||||||
this.unsuspending = true;
|
this.unsuspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/unsuspend-user', { userId: this.user._id });
|
await this.$root.api('admin/unsuspend-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('unsuspended')
|
text: this.$t('unsuspended')
|
||||||
@@ -320,7 +268,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async updateRemoteUser() {
|
async updateRemoteUser() {
|
||||||
this.$root.api('admin/update-remote-user', { userId: this.user._id }).then(res => {
|
this.$root.api('admin/update-remote-user', { userId: this.user.id }).then(res => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('remote-user-updated')
|
text: this.$t('remote-user-updated')
|
||||||
@@ -330,6 +278,25 @@ export default Vue.extend({
|
|||||||
this.refreshUser();
|
this.refreshUser();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async deleteAllFiles() {
|
||||||
|
if (!await this.getConfirmed(this.$t('delete-all-files-confirm'))) return;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
await this.$root.api('admin/delete-all-files-of-a-user', { userId: this.user.id });
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e.toString()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
async getConfirmed(text: string): Promise<Boolean> {
|
async getConfirmed(text: string): Promise<Boolean> {
|
||||||
const confirm = await this.$root.dialog({
|
const confirm = await this.$root.dialog({
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ body
|
|||||||
.peg
|
.peg
|
||||||
display block
|
display block
|
||||||
position absolute
|
position absolute
|
||||||
right 0px
|
right 0
|
||||||
width 100px
|
width 100px
|
||||||
height 100%
|
height 100%
|
||||||
box-shadow 0 0 10px var(--primary), 0 0 5px var(--primary)
|
box-shadow 0 0 10px var(--primary), 0 0 5px var(--primary)
|
||||||
|
|||||||
@@ -14,15 +14,7 @@
|
|||||||
<h2>{{ $t('permission-ask') }}</h2>
|
<h2>{{ $t('permission-ask') }}</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<template v-for="p in app.permission">
|
<template v-for="p in app.permission">
|
||||||
<li v-if="p == 'account-read'">{{ $t('account-read') }}</li>
|
<li :key="p">{{ $t(`@.permissions.${p}`) }}</li>
|
||||||
<li v-if="p == 'account-write'">{{ $t('account-write') }}</li>
|
|
||||||
<li v-if="p == 'note-write'">{{ $t('note-write') }}</li>
|
|
||||||
<li v-if="p == 'like-write'">{{ $t('like-write') }}</li>
|
|
||||||
<li v-if="p == 'following-write'">{{ $t('following-write') }}</li>
|
|
||||||
<li v-if="p == 'drive-read'">{{ $t('drive-read') }}</li>
|
|
||||||
<li v-if="p == 'drive-write'">{{ $t('drive-write') }}</li>
|
|
||||||
<li v-if="p == 'notification-read'">{{ $t('notification-read') }}</li>
|
|
||||||
<li v-if="p == 'notification-write'">{{ $t('notification-write') }}</li>
|
|
||||||
</template>
|
</template>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ export default Vue.extend({
|
|||||||
margin 0 auto
|
margin 0 auto
|
||||||
text-align center
|
text-align center
|
||||||
background #fff
|
background #fff
|
||||||
box-shadow 0px 4px 16px rgba(#000, 0.2)
|
box-shadow 0 4px 16px rgba(#000, 0.2)
|
||||||
|
|
||||||
> .fetching
|
> .fetching
|
||||||
margin 0
|
margin 0
|
||||||
|
|||||||
@@ -45,15 +45,9 @@ export default function <T extends object>(data: {
|
|||||||
this.$watch('props', () => {
|
this.$watch('props', () => {
|
||||||
this.mergeProps();
|
this.mergeProps();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.bakeProps();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
bakeProps() {
|
|
||||||
this.bakedOldProps = JSON.stringify(this.props);
|
|
||||||
},
|
|
||||||
|
|
||||||
mergeProps() {
|
mergeProps() {
|
||||||
if (data.props) {
|
if (data.props) {
|
||||||
const defaultProps = data.props();
|
const defaultProps = data.props();
|
||||||
@@ -65,17 +59,10 @@ export default function <T extends object>(data: {
|
|||||||
},
|
},
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
if (this.bakedOldProps == JSON.stringify(this.props)) return;
|
|
||||||
|
|
||||||
this.bakeProps();
|
|
||||||
|
|
||||||
if (this.platform == 'deck') {
|
if (this.platform == 'deck') {
|
||||||
this.$store.commit('device/updateDeckColumn', this.column);
|
this.$store.commit('device/updateDeckColumn', this.column);
|
||||||
} else {
|
} else {
|
||||||
this.$root.api('i/update_widget', {
|
this.$store.commit('device/updateWidget', this.widget);
|
||||||
id: this.id,
|
|
||||||
data: this.props
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user