Compare commits
574 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58d0dc1795 | ||
|
|
bc11702f7d | ||
|
|
6288de5813 | ||
|
|
bbf59c7d9f | ||
|
|
d7787bacf7 | ||
|
|
23ae0515c4 | ||
|
|
fe88b34b8a | ||
|
|
74aa031a22 | ||
|
|
6aeed212d9 | ||
|
|
45b972c059 | ||
|
|
7ecfc007a9 | ||
|
|
fc78c75bab | ||
|
|
59493a0cd9 | ||
|
|
6060c6d56e | ||
|
|
6cdbb27169 | ||
|
|
ed8b073e54 | ||
|
|
7dd193636c | ||
|
|
01d018510c | ||
|
|
1c273a0a75 | ||
|
|
fa2c7658a0 | ||
|
|
84ca3a7d45 | ||
|
|
902c73e6ac | ||
|
|
3b626f72e4 | ||
|
|
f5ce137a6b | ||
|
|
3ce9d12361 | ||
|
|
2fe2f3b1eb | ||
|
|
17b3ee41db | ||
|
|
56d2a5d5d3 | ||
|
|
3a17ff0983 | ||
|
|
9a9270bbe9 | ||
|
|
512eee4f51 | ||
|
|
db01fa0eef | ||
|
|
0c49a1ebd5 | ||
|
|
636d6394e3 | ||
|
|
c67c091b3a | ||
|
|
333604898c | ||
|
|
076ac3b614 | ||
|
|
0e1468b159 | ||
|
|
66409029e7 | ||
|
|
8ec6b2ec11 | ||
|
|
14736620ec | ||
|
|
831ca53b63 | ||
|
|
6138d46509 | ||
|
|
c3003cb363 | ||
|
|
4277e53433 | ||
|
|
6516bd2ade | ||
|
|
27d22f954a | ||
|
|
88f5e8e8e2 | ||
|
|
fd2ae6d3cf | ||
|
|
238edd36f7 | ||
|
|
5d847f9808 | ||
|
|
ac914af9c3 | ||
|
|
636f90ca0c | ||
|
|
29469bb7c6 | ||
|
|
4f043b1841 | ||
|
|
85008303f5 | ||
|
|
3432d6e615 | ||
|
|
855c990a17 | ||
|
|
eef2dc2f62 | ||
|
|
fa54140973 | ||
|
|
e770d32916 | ||
|
|
8aeabf530c | ||
|
|
6fbf1cfc28 | ||
|
|
5480df35bc | ||
|
|
8b5104d564 | ||
|
|
3c1192d6bf | ||
|
|
eb8ef35122 | ||
|
|
8a31e5fd0f | ||
|
|
751728db84 | ||
|
|
e695f54ef0 | ||
|
|
b2ed45ae38 | ||
|
|
5e36f75f8a | ||
|
|
7ac13a386c | ||
|
|
56c8ad9df3 | ||
|
|
f1ab918ecd | ||
|
|
42af8c7695 | ||
|
|
0de2e150cb | ||
|
|
1ac498c8fe | ||
|
|
545d29a40a | ||
|
|
73bbef2922 | ||
|
|
26567cdeb2 | ||
|
|
84941cbb97 | ||
|
|
cd5b24d4eb | ||
|
|
c8abd512e1 | ||
|
|
de9bd2651b | ||
|
|
c432310cae | ||
|
|
1c95cdffdc | ||
|
|
c3ec668e16 | ||
|
|
2af79e9855 | ||
|
|
f6ac6f9c6f | ||
|
|
d8c835fa51 | ||
|
|
a97c14a7b7 | ||
|
|
54ecf97c22 | ||
|
|
9c4e64b7b5 | ||
|
|
ef44eda69e | ||
|
|
f1a7ab639b | ||
|
|
0d8286cb2a | ||
|
|
8e4ad4b919 | ||
|
|
9a09ed6290 | ||
|
|
9ca36021b0 | ||
|
|
eaebb95827 | ||
|
|
b8cce2067c | ||
|
|
07a0631964 | ||
|
|
ebc2b05231 | ||
|
|
4c79dd4e96 | ||
|
|
abc57519a7 | ||
|
|
a23a10d375 | ||
|
|
01e7716170 | ||
|
|
0a29ce13b6 | ||
|
|
6d0ee61661 | ||
|
|
9c684fd6c4 | ||
|
|
cbb8edd5ed | ||
|
|
f933fa0e78 | ||
|
|
b3e5198f23 | ||
|
|
6e042ca344 | ||
|
|
9381842af2 | ||
|
|
a6644c540a | ||
|
|
063427a660 | ||
|
|
6846067a5d | ||
|
|
b7273c90ae | ||
|
|
a6f5e23069 | ||
|
|
f37f22b163 | ||
|
|
9440fdb2d0 | ||
|
|
96c19b2607 | ||
|
|
b34c1379e9 | ||
|
|
0fc965f342 | ||
|
|
617db05808 | ||
|
|
6a20ab687c | ||
|
|
6c3bcdad54 | ||
|
|
aeea275ec2 | ||
|
|
b3c6e28717 | ||
|
|
70691e1523 | ||
|
|
2cb032b0e0 | ||
|
|
ebbf5268ac | ||
|
|
b2030e8403 | ||
|
|
82493bb741 | ||
|
|
aa15901c23 | ||
|
|
0bd4d069a2 | ||
|
|
ab871c6991 | ||
|
|
feec5e88fc | ||
|
|
a091cbb93a | ||
|
|
a59ab79da0 | ||
|
|
8ca4d39440 | ||
|
|
41d041f701 | ||
|
|
3e516474c2 | ||
|
|
405c9c258b | ||
|
|
24e389bcf3 | ||
|
|
933c83679e | ||
|
|
a7aa924949 | ||
|
|
0eb84fe874 | ||
|
|
2f451fa058 | ||
|
|
2465a377a1 | ||
|
|
697219e946 | ||
|
|
4478298a0a | ||
|
|
925f89720a | ||
|
|
0f71d9f47a | ||
|
|
a7ec54ea97 | ||
|
|
1d43d18b19 | ||
|
|
0bcb25a983 | ||
|
|
ec1f2a285b | ||
|
|
c2c06694da | ||
|
|
5343b005df | ||
|
|
eb783f827c | ||
|
|
6064c3ae47 | ||
|
|
05862a420f | ||
|
|
393ad283e1 | ||
|
|
841c8d619f | ||
|
|
5c2ed9e5d3 | ||
|
|
d39aabc143 | ||
|
|
4628f507e5 | ||
|
|
8b05816860 | ||
|
|
3b8ea90fdc | ||
|
|
638458e2c1 | ||
|
|
bd8d7c3d0f | ||
|
|
4b747d20b7 | ||
|
|
351b236014 | ||
|
|
e9251debe0 | ||
|
|
22c4842154 | ||
|
|
788edd3622 | ||
|
|
5afe96e15a | ||
|
|
899fc8a7bd | ||
|
|
2afcdda058 | ||
|
|
c2fc637575 | ||
|
|
82d2b0608f | ||
|
|
047a46d966 | ||
|
|
e97dd13e81 | ||
|
|
067e9ec6f4 | ||
|
|
64397708fd | ||
|
|
5ae6b0058f | ||
|
|
c201326906 | ||
|
|
3bc2fe8527 | ||
|
|
c76c1fc4ef | ||
|
|
fb3fa06ae7 | ||
|
|
48353cccae | ||
|
|
65bf863093 | ||
|
|
87a6ef0581 | ||
|
|
af583d2ef6 | ||
|
|
68d49bc770 | ||
|
|
d848195a6e | ||
|
|
3c5324bbbb | ||
|
|
e2d59293fb | ||
|
|
411f038f34 | ||
|
|
26f2ae093b | ||
|
|
6a53ccf814 | ||
|
|
114523e69e | ||
|
|
d5caf22d8c | ||
|
|
a8f945ae8e | ||
|
|
d078f78602 | ||
|
|
a5c6145237 | ||
|
|
50df9f7dff | ||
|
|
7b33522d97 | ||
|
|
d3edf03125 | ||
|
|
d5cd38b459 | ||
|
|
2c76d410ab | ||
|
|
dfd991a6c6 | ||
|
|
16b81fff38 | ||
|
|
f379a721f1 | ||
|
|
194a958d40 | ||
|
|
327ffd3498 | ||
|
|
40276d7f1a | ||
|
|
9254f95679 | ||
|
|
2e1a9dffbe | ||
|
|
ead5a6a258 | ||
|
|
97002400a8 | ||
|
|
5e7a4e4752 | ||
|
|
2c955858a0 | ||
|
|
a0e56504de | ||
|
|
d46e9f5abe | ||
|
|
fd94b817ab | ||
|
|
f17e229c1e | ||
|
|
96e23b0e5b | ||
|
|
014b945ea6 | ||
|
|
76693138d3 | ||
|
|
10677b57d4 | ||
|
|
5f0ac0f46a | ||
|
|
7ffe559525 | ||
|
|
919e3e2fed | ||
|
|
03e999875a | ||
|
|
ed0070c470 | ||
|
|
d764316708 | ||
|
|
06b1203ef9 | ||
|
|
b2cf74e878 | ||
|
|
21064f7859 | ||
|
|
bb2d76ffa3 | ||
|
|
763b70e01b | ||
|
|
5a349eb376 | ||
|
|
0141affe05 | ||
|
|
a8379e3bc9 | ||
|
|
952789cc1e | ||
|
|
0500600cdd | ||
|
|
6b897e562a | ||
|
|
f74bc309b1 | ||
|
|
bc83963ac7 | ||
|
|
94715e6153 | ||
|
|
31a5247b9c | ||
|
|
ac9f77752d | ||
|
|
73ac2632c2 | ||
|
|
20f11a6701 | ||
|
|
9bdc67c1f6 | ||
|
|
bb4ca7b31a | ||
|
|
89f16668e6 | ||
|
|
8409b59dea | ||
|
|
1707002d43 | ||
|
|
16b03fc157 | ||
|
|
fa0023e541 | ||
|
|
aec5911821 | ||
|
|
26f4c038f3 | ||
|
|
6136f6f33a | ||
|
|
2b8d0225cc | ||
|
|
18184441f1 | ||
|
|
bd83939993 | ||
|
|
2c1932faa7 | ||
|
|
33d79420eb | ||
|
|
80d8af84dd | ||
|
|
aac519bf80 | ||
|
|
d64dffbdda | ||
|
|
4015ccef2f | ||
|
|
b6f985abaf | ||
|
|
2dac8d3d1f | ||
|
|
4f284e1bc0 | ||
|
|
b0280355e8 | ||
|
|
048d88b784 | ||
|
|
bb52ebdc3e | ||
|
|
5f2fda85ba | ||
|
|
1331f0b953 | ||
|
|
736fdabc1d | ||
|
|
7096c0ca49 | ||
|
|
1a984de8e8 | ||
|
|
285d0d13f9 | ||
|
|
63c659bc8f | ||
|
|
af60b45ee7 | ||
|
|
e7effd606d | ||
|
|
5042d23bc4 | ||
|
|
b134467bd3 | ||
|
|
5cc1aab530 | ||
|
|
49d57ce049 | ||
|
|
f1feceaf1a | ||
|
|
1204e1c5e4 | ||
|
|
96cf4c30cf | ||
|
|
a3853611ad | ||
|
|
ef7eaaabfa | ||
|
|
a4a96710b0 | ||
|
|
6d08909b2f | ||
|
|
2615368b1e | ||
|
|
2bd03ca725 | ||
|
|
67dda01fcb | ||
|
|
e9dc54c4d9 | ||
|
|
fde9fc2891 | ||
|
|
6e59798e82 | ||
|
|
5e3cc0a3c6 | ||
|
|
cfb35324d0 | ||
|
|
9bfbc12afa | ||
|
|
b41cddaf5a | ||
|
|
1432a7193d | ||
|
|
20630cb3a0 | ||
|
|
2eb02ae581 | ||
|
|
801f9027aa | ||
|
|
802739a2df | ||
|
|
95b1e1a21d | ||
|
|
b8060a522a | ||
|
|
fe2191a491 | ||
|
|
2891f52817 | ||
|
|
5bdc44c672 | ||
|
|
65d359b57a | ||
|
|
7b6e717e23 | ||
|
|
2820f6a621 | ||
|
|
6f96e05fec | ||
|
|
4c2c762b87 | ||
|
|
81fadfa4ff | ||
|
|
c227641d50 | ||
|
|
dacc713f99 | ||
|
|
a1f794ee05 | ||
|
|
8b2098fc89 | ||
|
|
4436852de0 | ||
|
|
a8ff1e19dc | ||
|
|
d559aa8e6d | ||
|
|
83fedcff3b | ||
|
|
9969cf8816 | ||
|
|
dee48fff12 | ||
|
|
aff80199e5 | ||
|
|
b9f1a55190 | ||
|
|
07d5bce61a | ||
|
|
834edd216c | ||
|
|
4670a3d886 | ||
|
|
78952df364 | ||
|
|
d69df60da4 | ||
|
|
6ca69f6f2e | ||
|
|
8e8428b667 | ||
|
|
5dbe1d448b | ||
|
|
85d8e6f220 | ||
|
|
72fb23f4d5 | ||
|
|
9403ee6495 | ||
|
|
94ce4fa780 | ||
|
|
911f5c1455 | ||
|
|
a6a88af513 | ||
|
|
fad1352d51 | ||
|
|
41cdae07c3 | ||
|
|
3b0daeac3c | ||
|
|
99e4b06468 | ||
|
|
c88576e3e6 | ||
|
|
4de709fe51 | ||
|
|
37e4226c70 | ||
|
|
1a6ed61b91 | ||
|
|
ac641da49c | ||
|
|
933a79af93 | ||
|
|
f36e3c69b4 | ||
|
|
c46bfcc768 | ||
|
|
c65ccd5eb0 | ||
|
|
162a740295 | ||
|
|
9192e98e3f | ||
|
|
fad84203c0 | ||
|
|
622266d200 | ||
|
|
0f6cd3c125 | ||
|
|
0dfc1fcf13 | ||
|
|
efeebd2165 | ||
|
|
69a916d506 | ||
|
|
114803a86a | ||
|
|
7f54c8fa2a | ||
|
|
0af3e15e82 | ||
|
|
f9afebc12e | ||
|
|
fc7268fd12 | ||
|
|
7e7f94d685 | ||
|
|
3ea7a49c1c | ||
|
|
f596a847c2 | ||
|
|
312ba501a3 | ||
|
|
c6531e8609 | ||
|
|
36c2d0082f | ||
|
|
358bb0fc06 | ||
|
|
5a4f6b4ada | ||
|
|
03136caac4 | ||
|
|
e6f78a73ab | ||
|
|
bcdab799d0 | ||
|
|
50251955cd | ||
|
|
2270fbf3ee | ||
|
|
deb6485cc2 | ||
|
|
6de08d07a3 | ||
|
|
f54cd10a04 | ||
|
|
dda7b0c80e | ||
|
|
3ed9e1ff3f | ||
|
|
9c8d26affa | ||
|
|
1e1a7ee858 | ||
|
|
9cfb72810c | ||
|
|
14a774c723 | ||
|
|
8509adf961 | ||
|
|
9d75ec799b | ||
|
|
eed9266ecb | ||
|
|
4a88cb5968 | ||
|
|
50d4de19f0 | ||
|
|
c7456224af | ||
|
|
c1524d9bef | ||
|
|
aa1d2545b3 | ||
|
|
1092818203 | ||
|
|
d67d163c78 | ||
|
|
a973bd56fe | ||
|
|
08b6fda065 | ||
|
|
d0cc145cb3 | ||
|
|
19588647d6 | ||
|
|
09da292f1a | ||
|
|
c8107ff936 | ||
|
|
b44afc1876 | ||
|
|
c26168f22e | ||
|
|
391be342ac | ||
|
|
16549f8f84 | ||
|
|
2d2b65d9fa | ||
|
|
a12ad37522 | ||
|
|
84541faf92 | ||
|
|
c7daaba370 | ||
|
|
f128813a5e | ||
|
|
699a55ea08 | ||
|
|
90a674f99b | ||
|
|
f236d36ed3 | ||
|
|
1b2200ccf4 | ||
|
|
c6353f3502 | ||
|
|
f09b8a78a0 | ||
|
|
5f741ac46e | ||
|
|
a434cfbe0d | ||
|
|
cd4c7689b7 | ||
|
|
3cc2049fb3 | ||
|
|
0d3117e472 | ||
|
|
b335975c97 | ||
|
|
5511b6e013 | ||
|
|
262d5ead51 | ||
|
|
a78b048720 | ||
|
|
e7dd5e155d | ||
|
|
5a3ea38bbf | ||
|
|
786521eba7 | ||
|
|
202cb3048a | ||
|
|
7e642cf700 | ||
|
|
7732aabc1e | ||
|
|
1cf9f52eca | ||
|
|
d1d5e10b72 | ||
|
|
c3fada264f | ||
|
|
45eeb74b83 | ||
|
|
b9a6e551cd | ||
|
|
c610e5ed9b | ||
|
|
c2c2824e50 | ||
|
|
01fab09683 | ||
|
|
e103904a04 | ||
|
|
56678cbac0 | ||
|
|
7fade8939d | ||
|
|
daa557f6a3 | ||
|
|
23a257ed86 | ||
|
|
05d0620491 | ||
|
|
5225139284 | ||
|
|
9b2e996cae | ||
|
|
6a561342a4 | ||
|
|
429bed2f91 | ||
|
|
200d593414 | ||
|
|
9dbe12135d | ||
|
|
318d7f2652 | ||
|
|
5a653531e2 | ||
|
|
c7cc3dcdfd | ||
|
|
61f54f8f74 | ||
|
|
a3b27fe3a1 | ||
|
|
380749051d | ||
|
|
81625f9fc5 | ||
|
|
d6ccb1725b | ||
|
|
5ce412aeda | ||
|
|
fe6d88e410 | ||
|
|
a21357248f | ||
|
|
70d710c9a9 | ||
|
|
183c82fb8d | ||
|
|
62cbb92154 | ||
|
|
7d70126072 | ||
|
|
54bfffa7b9 | ||
|
|
3f5b96bf62 | ||
|
|
3d8bbedf1b | ||
|
|
23c9f6a6ca | ||
|
|
5ba8d4949d | ||
|
|
a6befdd541 | ||
|
|
e5409db0e8 | ||
|
|
678d610cd6 | ||
|
|
466fe9c368 | ||
|
|
13feaea7b7 | ||
|
|
e52f9301fa | ||
|
|
1b58e18a6d | ||
|
|
b779ff08e0 | ||
|
|
811f9c22d7 | ||
|
|
c3529f0691 | ||
|
|
f9f574532e | ||
|
|
92dee53dd6 | ||
|
|
5d42ee2359 | ||
|
|
7c03d37caa | ||
|
|
b128b593c2 | ||
|
|
342e48ed77 | ||
|
|
052f8b265d | ||
|
|
2eedc91d74 | ||
|
|
410b9ad6bc | ||
|
|
24c6dff3e4 | ||
|
|
161db7636a | ||
|
|
796252357e | ||
|
|
b0344d52e9 | ||
|
|
8e6da3a0d9 | ||
|
|
756e4eaeec | ||
|
|
3126d0730a | ||
|
|
748e9f15df | ||
|
|
7c714f5788 | ||
|
|
d3c3ad839b | ||
|
|
168de3c316 | ||
|
|
9e20fc5c88 | ||
|
|
1ff5151786 | ||
|
|
a56738a331 | ||
|
|
2d04a3d6d2 | ||
|
|
e0a55b9100 | ||
|
|
0a57eecb3a | ||
|
|
51f98020f6 | ||
|
|
70123805e1 | ||
|
|
1448b11d00 | ||
|
|
490b81ed05 | ||
|
|
96f675abed | ||
|
|
4cd451c613 | ||
|
|
187792dfc4 | ||
|
|
3dde561fe5 | ||
|
|
a75ec45172 | ||
|
|
3732ddf75f | ||
|
|
b8d8097734 | ||
|
|
1092532292 | ||
|
|
8a79ba0e2b | ||
|
|
ca2949fbb4 | ||
|
|
17b373ac07 | ||
|
|
7aa66f438f | ||
|
|
73641fd78d | ||
|
|
64aac9d6ad | ||
|
|
2be13736c8 | ||
|
|
ff4f5fec1d | ||
|
|
7d64f8abe4 | ||
|
|
88e6929e9f | ||
|
|
5fb0a995dd | ||
|
|
58a04ce1a5 | ||
|
|
f74e0d9123 | ||
|
|
c6249b82d4 | ||
|
|
d6131c0b09 | ||
|
|
e62c810b7c | ||
|
|
2851a1a7ef | ||
|
|
12cd2709d6 | ||
|
|
bf54e58873 | ||
|
|
6b473e3a5c | ||
|
|
4b68abd963 | ||
|
|
0e764a2b3e | ||
|
|
9d1ed1eb0d | ||
|
|
a09a3465a2 | ||
|
|
001969efaf | ||
|
|
e7c515da9a | ||
|
|
8367c7dd49 | ||
|
|
55e6cae240 | ||
|
|
5553c3fb17 | ||
|
|
026265cb1e | ||
|
|
289c76a802 | ||
|
|
7c1bc1d6bc | ||
|
|
90cf0d32b5 | ||
|
|
88d934f922 | ||
|
|
abf11bb03c | ||
|
|
2d1f50303d | ||
|
|
155da0c6a3 |
@@ -4,8 +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/redis:latest
|
- image: circleci/redis:latest
|
||||||
|
- image: circleci/postgres:latest
|
||||||
docker:
|
docker:
|
||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
docker:
|
docker:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
# Final accessible URL seen by a user.
|
# Final accessible URL seen by a user.
|
||||||
url: https://example.tld/
|
url: https://example.tld/
|
||||||
|
|
||||||
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
|
# URL SETTINGS AFTER THAT!
|
||||||
|
|
||||||
# ┌───────────────────────┐
|
# ┌───────────────────────┐
|
||||||
#───┘ Port and TLS settings └───────────────────────────────────
|
#───┘ Port and TLS settings └───────────────────────────────────
|
||||||
|
|
||||||
@@ -62,6 +65,13 @@ db:
|
|||||||
user: example-misskey-user
|
user: example-misskey-user
|
||||||
pass: example-misskey-pass
|
pass: example-misskey-pass
|
||||||
|
|
||||||
|
# Whether disable Caching queries
|
||||||
|
#disableCache: true
|
||||||
|
|
||||||
|
# Extra Connection options
|
||||||
|
#extra:
|
||||||
|
# ssl: true
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
@@ -78,47 +88,6 @@ redis:
|
|||||||
# port: 9200
|
# port: 9200
|
||||||
# pass: null
|
# pass: null
|
||||||
|
|
||||||
# ┌────────────────────────────────────┐
|
|
||||||
#───┘ File storage (Drive) configuration └──────────────────────
|
|
||||||
|
|
||||||
drive:
|
|
||||||
storage: 'fs'
|
|
||||||
|
|
||||||
# OR
|
|
||||||
|
|
||||||
# storage: 'minio'
|
|
||||||
# bucket:
|
|
||||||
# prefix:
|
|
||||||
# config:
|
|
||||||
# endPoint:
|
|
||||||
# port:
|
|
||||||
# useSSL:
|
|
||||||
# accessKey:
|
|
||||||
# secretKey:
|
|
||||||
|
|
||||||
# S3 example
|
|
||||||
# storage: 'minio'
|
|
||||||
# bucket: bucket-name
|
|
||||||
# prefix: files
|
|
||||||
# config:
|
|
||||||
# endPoint: s3-us-west-2.amazonaws.com
|
|
||||||
# region: us-west-2
|
|
||||||
# useSSL: true
|
|
||||||
# accessKey: XXX
|
|
||||||
# secretKey: YYY
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|
||||||
@@ -149,3 +118,6 @@ autoAdmin: true
|
|||||||
|
|
||||||
# Clustering
|
# Clustering
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
|
#outgoingAddressFamily: ipv4
|
||||||
|
|||||||
24
.eslintrc
24
.eslintrc
@@ -1,23 +1,23 @@
|
|||||||
{
|
{
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
"parser": "typescript-eslint-parser"
|
"parser": "@typescript-eslint/parser"
|
||||||
},
|
},
|
||||||
"extends": [
|
"extends": [
|
||||||
"eslint:recommended",
|
"eslint:recommended",
|
||||||
"plugin:vue/recommended"
|
"plugin:vue/recommended"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
"vue/require-v-for-key": false,
|
"vue/require-v-for-key": 0,
|
||||||
"vue/max-attributes-per-line": false,
|
"vue/max-attributes-per-line": 0,
|
||||||
"vue/html-indent": false,
|
"vue/html-indent": 0,
|
||||||
"vue/html-self-closing": false,
|
"vue/html-self-closing": 0,
|
||||||
"vue/no-unused-vars": false,
|
"vue/no-unused-vars": 0,
|
||||||
"vue/attributes-order": false,
|
"vue/attributes-order": 0,
|
||||||
"vue/require-prop-types": false,
|
"vue/require-prop-types": 0,
|
||||||
"vue/require-default-prop": false,
|
"vue/require-default-prop": 0,
|
||||||
"vue/html-closing-bracket-spacing": false,
|
"vue/html-closing-bracket-spacing": 0,
|
||||||
"vue/singleline-html-element-content-newline": false,
|
"vue/singleline-html-element-content-newline": 0,
|
||||||
"vue/no-v-html": false,
|
"vue/no-v-html": 0,
|
||||||
"no-console": 0,
|
"no-console": 0,
|
||||||
"no-unused-vars": 0,
|
"no-unused-vars": 0,
|
||||||
"no-empty": 0
|
"no-empty": 0
|
||||||
|
|||||||
6
.gitattributes
vendored
6
.gitattributes
vendored
@@ -1,5 +1,7 @@
|
|||||||
*.svg -diff -text
|
*.svg -diff -text
|
||||||
*.psd -diff -text
|
*.psd -diff -text
|
||||||
*.ai -diff -text
|
*.ai -diff -text
|
||||||
yarn.lock -diff -text
|
*.mqo -diff -text
|
||||||
package-lock.json -diff -text
|
*.glb -diff -text
|
||||||
|
*.blend -diff -text
|
||||||
|
*.afdesign -diff -text
|
||||||
|
|||||||
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
|
||||||
24
.gitignore
vendored
24
.gitignore
vendored
@@ -1,11 +1,21 @@
|
|||||||
|
# Visual Studio Code
|
||||||
|
/.vscode
|
||||||
|
!/.vscode/extensions.json
|
||||||
|
|
||||||
|
# Intelij-IDEA
|
||||||
|
/.idea
|
||||||
|
|
||||||
|
# Node.js
|
||||||
|
/node_modules
|
||||||
|
|
||||||
|
# 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
|
/db
|
||||||
@@ -17,7 +27,13 @@ api-docs.json
|
|||||||
*.log
|
*.log
|
||||||
/redis
|
/redis
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
yarn.lock
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/files
|
/files
|
||||||
ormconfig.json
|
ormconfig.json
|
||||||
|
|
||||||
|
# blender backups
|
||||||
|
*.blend1
|
||||||
|
*.blend2
|
||||||
|
*.blend3
|
||||||
|
*.blend4
|
||||||
|
*.blend5
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v11.7.0
|
v12.8.1
|
||||||
|
|||||||
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@@ -2,10 +2,10 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"ducksoupdev.vue2",
|
"ducksoupdev.vue2",
|
||||||
"editorconfig.editorconfig",
|
"editorconfig.editorconfig",
|
||||||
"eg2.tslint",
|
|
||||||
"eg2.vscode-npm-script",
|
"eg2.vscode-npm-script",
|
||||||
"hollowtree.vue-snippets",
|
"hollowtree.vue-snippets",
|
||||||
"ms-vscode.typescript-javascript-grammar",
|
"ms-vscode.typescript-javascript-grammar",
|
||||||
|
"ms-vscode.vscode-typescript-tslint-plugin",
|
||||||
"octref.vetur",
|
"octref.vetur",
|
||||||
"sysoev.language-stylus"
|
"sysoev.language-stylus"
|
||||||
]
|
]
|
||||||
|
|||||||
996
CHANGELOG.md
996
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
110
CONTRIBUTING.md
110
CONTRIBUTING.md
@@ -3,28 +3,55 @@
|
|||||||
|
|
||||||
## 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.
|
||||||
|
|
||||||
|
## Branches
|
||||||
|
* **master** branch is tracking the latest release and used for production purposes.
|
||||||
|
* **develop** branch is where we work for the next release.
|
||||||
|
* **l10n_develop** branch is reserved for localization management.
|
||||||
|
|
||||||
## 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.
|
||||||
|
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
|
||||||
|
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
|
||||||
|
|
||||||
|
If your language is not listed in Crowdin, please open an issue.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Internationalization (i18n)
|
## Internationalization (i18n)
|
||||||
Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
|
Misskey uses the Vue.js plugin [Vue I18n](https://github.com/kazupon/vue-i18n).
|
||||||
|
Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/introduction.html .
|
||||||
|
|
||||||
## 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 executing automated tests.
|
||||||
Configuration files are located in `/.circleci`.
|
Configuration files are located in [`/.circleci`](/.circleci).
|
||||||
|
|
||||||
|
## Adding MisskeyRoom items
|
||||||
|
Currently, we accept only 3D models created with [Blender](https://www.blender.org/).
|
||||||
|
|
||||||
|
* Use English for material, object and texture names
|
||||||
|
* Use meter for unit of length
|
||||||
|
* Your PR must include all source files of your models (for later editing)
|
||||||
|
* Your PR must include the glTF binary files (.glb) of your models
|
||||||
|
|
||||||
|
You can find information on glTF 2.0 at [glTF 2.0 — Blender Manual]( https://docs.blender.org/manual/en/dev/addons/io_scene_gltf2.html).
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
### How to resolve conflictions occurred at yarn.lock?
|
||||||
|
|
||||||
|
Just execute `yarn` to fix it.
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
### AP
|
### AP
|
||||||
@@ -45,11 +72,15 @@ Convert な(na) to にゃ(nya)
|
|||||||
#### Denyaize
|
#### Denyaize
|
||||||
Revert Nyaize
|
Revert Nyaize
|
||||||
|
|
||||||
## Code style
|
## TypeScript Coding Style
|
||||||
### セミコロンを省略しない
|
### Do not omit semicolons
|
||||||
ASI Hazardを避けるためでもある
|
This is to avoid Automatic Semicolon Insertion (ASI) hazard.
|
||||||
|
|
||||||
### 中括弧を省略しない
|
Ref:
|
||||||
|
* https://www.ecma-international.org/ecma-262/#sec-automatic-semicolon-insertion
|
||||||
|
* https://github.com/tc39/ecma262/pull/1062
|
||||||
|
|
||||||
|
### Do not omit curly brackets
|
||||||
Bad:
|
Bad:
|
||||||
``` ts
|
``` ts
|
||||||
if (foo)
|
if (foo)
|
||||||
@@ -67,18 +98,38 @@ if (foo) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
ただし**`if`が一行**の時だけは省略しても良い
|
As a special case, you can omit the curly brackets if
|
||||||
|
|
||||||
|
* the body of the `if`-statement have only one statement and,
|
||||||
|
* the `if`-statement does not have `else`-clause.
|
||||||
|
|
||||||
Good:
|
Good:
|
||||||
``` ts
|
``` ts
|
||||||
if (foo) bar;
|
if (foo) bar;
|
||||||
```
|
```
|
||||||
|
|
||||||
### `export default`を使わない
|
Make sure that the condition and the body statement are on the same line.
|
||||||
インテリセンスと相性が悪かったりするため
|
|
||||||
|
|
||||||
参考:
|
### Do not use `==` when it can simply be replaced with `===`.
|
||||||
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
🥰
|
||||||
|
|
||||||
|
### Use only boolean (or null related) values in the condition of an `if`-statement.
|
||||||
|
Bad:
|
||||||
|
``` ts
|
||||||
|
if (foo.length)
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
``` ts
|
||||||
|
if (foo.length > 0)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Do not use `export default`
|
||||||
|
This is because the current language support does not work well with `export default`.
|
||||||
|
|
||||||
|
Ref:
|
||||||
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
||||||
|
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
||||||
|
|
||||||
Bad:
|
Bad:
|
||||||
``` ts
|
``` ts
|
||||||
@@ -128,6 +179,20 @@ query.andWhere(new Brackets(qb => {
|
|||||||
}));
|
}));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 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
|
### `null` in SQL
|
||||||
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
||||||
例えば
|
例えば
|
||||||
@@ -197,3 +262,10 @@ const user = await Users.findOne(userId).then(ensure);
|
|||||||
// }
|
// }
|
||||||
// の糖衣構文のような扱いです
|
// の糖衣構文のような扱いです
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Migration作成方法
|
||||||
|
```
|
||||||
|
npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
||||||
|
```
|
||||||
|
|
||||||
|
作成されたスクリプトは不必要な変更を含むため除去してください。
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM node:11-alpine AS base
|
FROM node:12.8-alpine AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
@@ -23,9 +23,9 @@ RUN apk add --no-cache \
|
|||||||
zlib-dev
|
zlib-dev
|
||||||
|
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN npm i
|
RUN yarn install
|
||||||
COPY . ./
|
COPY . ./
|
||||||
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"]
|
||||||
|
|||||||
56
README.md
56
README.md
@@ -105,69 +105,67 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/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/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/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>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
|
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
|
||||||
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
|
<td><a href="https://www.patreon.com/weepjp">weepjp</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=19045173">kiritan</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=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>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<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/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://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
|
<td><img src="https://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/18833336" alt="itiradi" 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.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
|
||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
<td><a href="https://www.patreon.com/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=18833336">itiradi</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=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=19356899">sheeta.s</a></td>
|
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4.jpe?token-time=2145916800&token-hash=UslrPVM-8TXOe8AapuNiaFYjcIJgPNcU-fKpGbfGJNI%3D" alt="Damillora" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/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/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=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/hekovic">Hekovic</a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||||
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
||||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
</tr></table>
|
|
||||||
<table><tr>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
|
||||||
</tr><tr>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Wed, 24 Apr 2019 05:56:07 UTC
|
**Last updated:** Mon, 05 Aug 2019 20:46:06 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
@@ -68,7 +68,7 @@ Build misskey with the following:
|
|||||||
*5.* Init DB
|
*5.* Init DB
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
docker-compose run --rm web npm run init
|
docker-compose run --rm web yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*6.* That is it.
|
*6.* That is it.
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ cp docker_example.env docker.env
|
|||||||
*5.* データベースを初期化
|
*5.* データベースを初期化
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
docker-compose run --rm web npm run init
|
docker-compose run --rm web yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*6.* 以上です!
|
*6.* 以上です!
|
||||||
|
|||||||
@@ -25,10 +25,9 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 http2;
|
listen 443 ssl http2;
|
||||||
listen [::]:443 http2;
|
listen [::]:443 ssl http2;
|
||||||
server_name example.tld;
|
server_name example.tld;
|
||||||
ssl on;
|
|
||||||
ssl_session_cache shared:ssl_session_cache:10m;
|
ssl_session_cache shared:ssl_session_cache:10m;
|
||||||
|
|
||||||
# To use Let's Encrypt certificate
|
# To use Let's Encrypt certificate
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ Please install and setup these softwares:
|
|||||||
* **[Redis](https://redis.io/)**
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optional
|
##### Optional
|
||||||
|
* [Yarn](https://yarnpkg.com/) *Optional but recommended for security reason. If you won't install it, use `npx yarn` instead of `yarn`.*
|
||||||
* [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/)
|
||||||
|
|
||||||
@@ -50,7 +51,7 @@ Please install and setup these softwares:
|
|||||||
|
|
||||||
5. Install misskey dependencies.
|
5. Install misskey dependencies.
|
||||||
|
|
||||||
`npm install`
|
`yarn`
|
||||||
|
|
||||||
*4.* Configure Misskey
|
*4.* Configure Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -65,21 +66,20 @@ Please install and setup these softwares:
|
|||||||
|
|
||||||
Build misskey with the following:
|
Build misskey with the following:
|
||||||
|
|
||||||
`NODE_ENV=production npm run build`
|
`NODE_ENV=production yarn build`
|
||||||
|
|
||||||
If you're on Debian, you will need to install the `build-essential`, `python` package.
|
If you're on Debian, you will need to install the `build-essential`, `python` package.
|
||||||
|
|
||||||
If you're still encountering errors about some modules, use node-gyp:
|
If you're still encountering errors about some modules, use node-gyp:
|
||||||
|
|
||||||
1. `npm install -g node-gyp`
|
1. `npx node-gyp configure`
|
||||||
2. `node-gyp configure`
|
2. `npx node-gyp build`
|
||||||
3. `node-gyp build`
|
3. `NODE_ENV=production yarn build`
|
||||||
4. `NODE_ENV=production npm run build`
|
|
||||||
|
|
||||||
*6.* Init DB
|
*6.* Init DB
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
npm run init
|
yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*7.* That is it.
|
*7.* That is it.
|
||||||
@@ -130,12 +130,16 @@ 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 checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `yarn install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production yarn build`
|
||||||
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
5. `yarn migrate`
|
||||||
6. Restart your Misskey process to apply changes
|
6. Restart your Misskey process to apply changes
|
||||||
7. Enjoy
|
7. Enjoy
|
||||||
|
|
||||||
|
If you encounter any problems with updating, please try the following:
|
||||||
|
1. `yarn clean` or `yarn cleanall`
|
||||||
|
2. Retry update (Don't forget `yarn install`
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
If you have any questions or troubles, feel free to contact us!
|
If you have any questions or troubles, feel free to contact us!
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ Installez les paquets suivants :
|
|||||||
* **[Redis](https://redis.io/)**
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optionnels
|
##### Optionnels
|
||||||
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
|
* [Yarn](https://yarnpkg.com/) - *recommander pour des raisons de sécurité. Si vous ne l'installez pas, utilisez `npx yarn` au lieu de` yarn`.*
|
||||||
|
* [Elasticsearch](https://www.elastic.co/) - *requis pour pouvoir activer la fonctionnalité de recherche.*
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
|
|
||||||
*3.* Installation de Misskey
|
*3.* Installation de Misskey
|
||||||
@@ -50,7 +51,7 @@ Installez les paquets suivants :
|
|||||||
|
|
||||||
5. Installez les dépendances de misskey.
|
5. Installez les dépendances de misskey.
|
||||||
|
|
||||||
`npm install`
|
`yarn install`
|
||||||
|
|
||||||
*4.* Création du fichier de configuration
|
*4.* Création du fichier de configuration
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -65,23 +66,22 @@ Installez les paquets suivants :
|
|||||||
|
|
||||||
Construisez Misskey comme ceci :
|
Construisez Misskey comme ceci :
|
||||||
|
|
||||||
`NODE_ENV=production npm run build`
|
`NODE_ENV=production yarn build`
|
||||||
|
|
||||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
|
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
|
||||||
|
|
||||||
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
||||||
|
|
||||||
1. `npm install -g node-gyp`
|
1. `npx node-gyp configure`
|
||||||
2. `node-gyp configure`
|
2. `npx node-gyp build`
|
||||||
3. `node-gyp build`
|
3. `NODE_ENV=production yarn build`
|
||||||
4. `NODE_ENV=production npm run build`
|
|
||||||
|
|
||||||
*6.* C'est tout.
|
*6.* C'est tout.
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
||||||
|
|
||||||
### Lancement conventionnel
|
### Lancement conventionnel
|
||||||
Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-vous bien !
|
Lancez tout simplement `NODE_ENV=production yarn start`. Bonne chance et amusez-vous bien !
|
||||||
|
|
||||||
### Démarrage avec systemd
|
### Démarrage avec systemd
|
||||||
|
|
||||||
@@ -124,9 +124,9 @@ Vous pouvez vérifier si le service a démarré en utilisant la commande `system
|
|||||||
### 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 checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `yarn install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production yarn build`
|
||||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
5. `yarn migrate`
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
* **[Redis](https://redis.io/)**
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### オプション
|
##### オプション
|
||||||
|
* [Yarn](https://yarnpkg.com/)
|
||||||
|
* セキュリティの観点から推奨されます。 yarn をインストールしない方針の場合は、文章中の `yarn` を適宜 `npx yarn` と読み替えてください。
|
||||||
* [Elasticsearch](https://www.elastic.co/)
|
* [Elasticsearch](https://www.elastic.co/)
|
||||||
* 検索機能を有効にするためにはインストールが必要です。
|
* 検索機能を有効にするためにはインストールが必要です。
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
@@ -51,7 +53,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
|
|
||||||
5. Misskeyの依存パッケージをインストール
|
5. Misskeyの依存パッケージをインストール
|
||||||
|
|
||||||
`npm install`
|
`yarn install`
|
||||||
|
|
||||||
*4.* 設定ファイルを作成する
|
*4.* 設定ファイルを作成する
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -66,20 +68,19 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
|
|
||||||
次のコマンドでMisskeyをビルドしてください:
|
次のコマンドでMisskeyをビルドしてください:
|
||||||
|
|
||||||
`NODE_ENV=production npm run build`
|
`NODE_ENV=production yarn build`
|
||||||
|
|
||||||
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
|
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
|
||||||
|
|
||||||
何らかのモジュールでエラーが発生する場合はnode-gypを使ってください:
|
何らかのモジュールでエラーが発生する場合はnode-gypを使ってください:
|
||||||
1. `npm install -g node-gyp`
|
1. `npx node-gyp configure`
|
||||||
2. `node-gyp configure`
|
2. `npx node-gyp build`
|
||||||
3. `node-gyp build`
|
3. `NODE_ENV=production yarn build`
|
||||||
4. `NODE_ENV=production npm run build`
|
|
||||||
|
|
||||||
*6.* データベースを初期化
|
*6.* データベースを初期化
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
npm run init
|
yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*7.* 以上です!
|
*7.* 以上です!
|
||||||
@@ -87,7 +88,7 @@ npm run init
|
|||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
|
|
||||||
### 通常起動
|
### 通常起動
|
||||||
`NODE_ENV=production npm start`するだけです。GLHF!
|
`NODE_ENV=production yarn start`するだけです。GLHF!
|
||||||
|
|
||||||
### systemdを用いた起動
|
### systemdを用いた起動
|
||||||
1. systemdサービスのファイルを作成
|
1. systemdサービスのファイルを作成
|
||||||
@@ -120,7 +121,7 @@ npm run init
|
|||||||
|
|
||||||
3. systemdを再読み込みしmisskeyサービスを有効化
|
3. systemdを再読み込みしmisskeyサービスを有効化
|
||||||
|
|
||||||
`systemctl daemon-reload ; systemctl enable misskey`
|
`systemctl daemon-reload; systemctl enable misskey`
|
||||||
|
|
||||||
4. misskeyサービスの起動
|
4. misskeyサービスの起動
|
||||||
|
|
||||||
@@ -131,11 +132,11 @@ npm run init
|
|||||||
### Misskeyを最新バージョンにアップデートする方法:
|
### Misskeyを最新バージョンにアップデートする方法:
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `yarn install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production yarn build`
|
||||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
5. `yarn migrate`
|
||||||
|
|
||||||
なにか問題が発生した場合は、`npm run clean`または`npm run cleanall`すると直る場合があります。
|
なにか問題が発生した場合は、`yarn clean`または`yarn cleanall`すると直る場合があります。
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,11 @@ gulp.task('build:copy:views', () =>
|
|||||||
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
gulp.task('build:copy:fonts', () =>
|
||||||
|
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:fonts', () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./src/const.json',
|
'./src/const.json',
|
||||||
'./src/server/web/views/**/*',
|
'./src/server/web/views/**/*',
|
||||||
|
|||||||
@@ -34,6 +34,19 @@ common:
|
|||||||
signup: "Registrovat"
|
signup: "Registrovat"
|
||||||
signout: "Odhlásit"
|
signout: "Odhlásit"
|
||||||
reload-to-apply-the-setting: "Pro uplatnění tohoto nastavení musíte znovu načíst tuto stránku. Chcete ji načíst teď?"
|
reload-to-apply-the-setting: "Pro uplatnění tohoto nastavení musíte znovu načíst tuto stránku. Chcete ji načíst teď?"
|
||||||
|
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
|
||||||
|
signin-required: "Přihlašte se, prosím"
|
||||||
|
notification-type: "Typy oznámení"
|
||||||
|
notification-types:
|
||||||
|
all: "Všechny"
|
||||||
|
pollVote: "Hlasy"
|
||||||
|
follow: "Sledovaní"
|
||||||
|
receiveFollowRequest: "Žádost o sledování"
|
||||||
|
reply: "Odpovědi"
|
||||||
|
quote: "Citace"
|
||||||
|
renote: "Renotovat"
|
||||||
|
mention: "Zmínky"
|
||||||
|
reaction: "Reakce"
|
||||||
got-it: "Rozumím!"
|
got-it: "Rozumím!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Tipy pro přizpůsobení"
|
title: "Tipy pro přizpůsobení"
|
||||||
@@ -61,6 +74,7 @@ common:
|
|||||||
month-and-day: "{day}. {month}."
|
month-and-day: "{day}. {month}."
|
||||||
trash: "Koš"
|
trash: "Koš"
|
||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
|
pages: "Stránky"
|
||||||
messaging: "Konverzace"
|
messaging: "Konverzace"
|
||||||
home: "Domů"
|
home: "Domů"
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
@@ -71,19 +85,49 @@ common:
|
|||||||
favorites: "Oblíbené"
|
favorites: "Oblíbené"
|
||||||
permissions:
|
permissions:
|
||||||
"read:account": "Zobrazit informace o účtu"
|
"read:account": "Zobrazit informace o účtu"
|
||||||
|
"write:account": "Narábět s účtem"
|
||||||
|
"read:blocks": "Prohlížet blokování"
|
||||||
|
"write:blocks": "Narábět s blokováním"
|
||||||
"read:drive": "Prohlížet Disk"
|
"read:drive": "Prohlížet Disk"
|
||||||
"write:drive": "Pracovat s Diskem"
|
"write:drive": "Pracovat s Diskem"
|
||||||
"read:favorites": "Prohlížet oblíbené"
|
"read:favorites": "Prohlížet oblíbené"
|
||||||
|
"write:favorites": "Narábět s oblíbeními"
|
||||||
|
"read:following": "Prohlížet následování"
|
||||||
|
"write:following": "Pracovat s následováním"
|
||||||
"read:messaging": "Prohlížet konverzaci"
|
"read:messaging": "Prohlížet konverzaci"
|
||||||
"write:messaging": "Pracovat s konverzaci"
|
"write:messaging": "Pracovat s konverzaci"
|
||||||
"read:mutes": "Prohlížet ztlumené"
|
"read:mutes": "Prohlížet ztlumené"
|
||||||
|
"write:mutes": "Narábět s utíšeními"
|
||||||
|
"write:notes": "Narábět s poznámkami"
|
||||||
"read:notifications": "Prohlížet oznámení"
|
"read:notifications": "Prohlížet oznámení"
|
||||||
"write:notifications": "Pracovat s oznámeními"
|
"write:notifications": "Pracovat s oznámeními"
|
||||||
"read:reactions": "Prohlížet reakce"
|
"read:reactions": "Prohlížet reakce"
|
||||||
|
"write:reactions": "Narabět s reakcemi"
|
||||||
"write:votes": "Hlasovat"
|
"write:votes": "Hlasovat"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Poznámky sledujících se zobrazí ve vaší časové ose"
|
follow-users-to-make-your-timeline: "Poznámky sledujících se zobrazí ve vaší časové ose"
|
||||||
explore: "Najít uživatele"
|
explore: "Najít uživatele"
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "Přidat informace o lokaci"
|
||||||
|
hide-contents: "Schovat obsah"
|
||||||
|
reply-placeholder: "Odpovědět na tento příspěvek"
|
||||||
|
quote-placeholder: "Citovat tento příspěvek"
|
||||||
|
quote-attached: "Přiložit citaci"
|
||||||
|
submit: "Odeslat"
|
||||||
|
reply: "Odpovědět"
|
||||||
|
renote: "Renotovat"
|
||||||
|
posting: "Posílání"
|
||||||
|
attach-media-from-local: "Nahrát soubor z vašeho zařízení"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "Vytvořit anketu"
|
||||||
|
text-remain: "zbývá ještě {} znaků"
|
||||||
|
recent-tags: "Nejnovější"
|
||||||
|
visibility: "Viditelnost"
|
||||||
|
geolocation-alert: "Vaše zařízení nedalo k dispozici lokaci"
|
||||||
|
error: "Chyba"
|
||||||
|
enter-username: "Zadejte své uživatelské jméno"
|
||||||
|
add-visible-user: "Přidat uživatele"
|
||||||
|
username-prompt: "Zadejte své uživatelské jméno"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Ne"
|
sunday: "Ne"
|
||||||
monday: "Po"
|
monday: "Po"
|
||||||
@@ -150,6 +194,7 @@ common:
|
|||||||
remember-note-visibility: "Zapamatovat viditelnost příspěvků"
|
remember-note-visibility: "Zapamatovat viditelnost příspěvků"
|
||||||
web-search-engine: "Webové vyhledávače"
|
web-search-engine: "Webové vyhledávače"
|
||||||
web-search-engine-desc: "Například: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Například: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "Vložit"
|
||||||
keep-cw: "Zachovat varování o obsahu"
|
keep-cw: "Zachovat varování o obsahu"
|
||||||
keep-cw-desc: "Při odpovědi na příspěvek bude varování o obsahu nastaveno stejně jako původní příspěvek."
|
keep-cw-desc: "Při odpovědi na příspěvek bude varování o obsahu nastaveno stejně jako původní příspěvek."
|
||||||
i-like-sushi: "Mam radši sushi (než puding)"
|
i-like-sushi: "Mam radši sushi (než puding)"
|
||||||
@@ -232,6 +277,9 @@ common:
|
|||||||
disable-via-mobile: "Neoznačovat příspěvky jako „z mobilu“"
|
disable-via-mobile: "Neoznačovat příspěvky jako „z mobilu“"
|
||||||
load-raw-images: "Zobrazovat obrázky v původní kvalitě"
|
load-raw-images: "Zobrazovat obrázky v původní kvalitě"
|
||||||
load-remote-media: "Zobrazovat média ze vzdáleného serveru"
|
load-remote-media: "Zobrazovat média ze vzdáleného serveru"
|
||||||
|
sync: "Synchronizace"
|
||||||
|
save: "Uložit"
|
||||||
|
saved: "Uloženo"
|
||||||
search: "Hledání"
|
search: "Hledání"
|
||||||
delete: "Odstranit"
|
delete: "Odstranit"
|
||||||
loading: "Načítám..."
|
loading: "Načítám..."
|
||||||
@@ -240,9 +288,9 @@ common:
|
|||||||
update-available-title: "Aktualizace k dispozici"
|
update-available-title: "Aktualizace k dispozici"
|
||||||
update-available: "Je k dispozici nová verze Misskey ({newer},vaše verze je {current}). Pro aplikování nové verze znovunačtěte stránku."
|
update-available: "Je k dispozici nová verze Misskey ({newer},vaše verze je {current}). Pro aplikování nové verze znovunačtěte stránku."
|
||||||
my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a."
|
my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a."
|
||||||
verified-user: "Ověřené účty"
|
|
||||||
hide-password: "Skrýt heslo"
|
hide-password: "Skrýt heslo"
|
||||||
show-password: "Zobrazit heslo"
|
show-password: "Zobrazit heslo"
|
||||||
|
enter-username: "Zadejte své uživatelské jméno"
|
||||||
do-not-use-in-production: "Tohle je vývojářský build. Nepoužívejte v produkci."
|
do-not-use-in-production: "Tohle je vývojářský build. Nepoužívejte v produkci."
|
||||||
user-suspended: "Tomuto uživateli byl pozastaven účet."
|
user-suspended: "Tomuto uživateli byl pozastaven účet."
|
||||||
is-remote-user: "Informace o tomto uživateli nemusí být kompletní."
|
is-remote-user: "Informace o tomto uživateli nemusí být kompletní."
|
||||||
@@ -299,11 +347,13 @@ auth/views/form.vue:
|
|||||||
accept: "Povolit přístup"
|
accept: "Povolit přístup"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "Načítám..."
|
loading: "Načítám..."
|
||||||
|
denied-paragraph: "Tato aplikace nebude mít přístup k Vašemu účtu."
|
||||||
already-authorized: "Tato aplikace byla již autorizována."
|
already-authorized: "Tato aplikace byla již autorizována."
|
||||||
|
callback-url: "Zpátky do aplikace."
|
||||||
|
please-go-back: "Prosím vraťte se zpátky do aplikace."
|
||||||
error: "Taková relace neexistuje."
|
error: "Taková relace neexistuje."
|
||||||
sign-in: "Prosím přihlaste se."
|
sign-in: "Prosím přihlaste se."
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "Ověřené účty"
|
|
||||||
popular-users: "Populární uživatelé"
|
popular-users: "Populární uživatelé"
|
||||||
recently-updated-users: "Nedávno aktívni uživatelé"
|
recently-updated-users: "Nedávno aktívni uživatelé"
|
||||||
recently-registered-users: "Nedávno registrovaní uživatelé"
|
recently-registered-users: "Nedávno registrovaní uživatelé"
|
||||||
@@ -350,23 +400,30 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
waiting-for-both: "Připravuji"
|
waiting-for-both: "Připravuji"
|
||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
ready: "Připraveno"
|
ready: "Připraveno"
|
||||||
|
cancel-ready: "Pokračovat v přípravě"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "Nelze se připojit k serveru"
|
title: "Nelze se připojit k serveru"
|
||||||
description: "Nastal problém s Vaším připojením k internetu, nebo server není dostupný nebo zrovna probíhá údržba. Prosím {zkuste to znova} za pár minut."
|
description: "Nastal problém s Vaším připojením k internetu, nebo server není dostupný nebo zrovna probíhá údržba. Prosím {zkuste to znova} za pár minut."
|
||||||
thanks: "Děkujeme že jste použili Misskey."
|
thanks: "Děkujeme že jste použili Misskey."
|
||||||
common/views/components/connect-failed.troubleshooter.vue:
|
common/views/components/connect-failed.troubleshooter.vue:
|
||||||
|
title: "Poradce při potížích"
|
||||||
network: "Síťové připojení"
|
network: "Síťové připojení"
|
||||||
checking-network: "Prověřit síťové připojení"
|
checking-network: "Prověřit síťové připojení"
|
||||||
internet: "Připojení k internetu"
|
internet: "Připojení k internetu"
|
||||||
checking-internet: "Ověřuji připojení k internetu."
|
checking-internet: "Ověřuji připojení k internetu."
|
||||||
server: "Připojení k serveru"
|
server: "Připojení k serveru"
|
||||||
|
checking-server: "Spojuji se se serverem"
|
||||||
no-network-desc: "Ujistěte se že jste připojeni k Internetu."
|
no-network-desc: "Ujistěte se že jste připojeni k Internetu."
|
||||||
no-internet: "Nejste připojeni k internetu"
|
no-internet: "Nejste připojeni k internetu"
|
||||||
no-internet-desc: "Jste připojen k síti, ale zdá se že stále chybí připojení k Internetu. Prosím zkontrolujte Vaše připojení k Internetu."
|
no-internet-desc: "Jste připojen k síti, ale zdá se že stále chybí připojení k Internetu. Prosím zkontrolujte Vaše připojení k Internetu."
|
||||||
no-server: "Nelze se připojit k serveru Misskey"
|
no-server: "Nelze se připojit k serveru Misskey"
|
||||||
|
success: "Úspěšně se podařilo spojit s Misskey serverem"
|
||||||
|
flush: "Vyčistit mezipaměť"
|
||||||
common/views/components/media-banner.vue:
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "Choulostivý obsah"
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
|
theme: "Vzhled"
|
||||||
light-theme: "Motiv pro použití ve světlém vzhledu"
|
light-theme: "Motiv pro použití ve světlém vzhledu"
|
||||||
dark-theme: "Motiv pro použití v tmavém vzhledu"
|
dark-theme: "Motiv pro použití v tmavém vzhledu"
|
||||||
light-themes: "Světlý vzhled"
|
light-themes: "Světlý vzhled"
|
||||||
@@ -377,14 +434,18 @@ common/views/components/theme.vue:
|
|||||||
installed: "\"{}\" byl nainstalován"
|
installed: "\"{}\" byl nainstalován"
|
||||||
create-a-theme: "Vytvořit motiv"
|
create-a-theme: "Vytvořit motiv"
|
||||||
save-created-theme: "Uložit motiv"
|
save-created-theme: "Uložit motiv"
|
||||||
|
primary-color: "Základní barva"
|
||||||
|
text-color: "Barva textu"
|
||||||
base-theme: "Základní vzhled"
|
base-theme: "Základní vzhled"
|
||||||
base-theme-light: "Světlý"
|
base-theme-light: "Světlý"
|
||||||
base-theme-dark: "Tmavý"
|
base-theme-dark: "Tmavý"
|
||||||
find-more-theme: "Najít další vzhledy"
|
find-more-theme: "Najít další vzhledy"
|
||||||
theme-name: "Jméno vzhledu"
|
theme-name: "Jméno vzhledu"
|
||||||
preview-created-theme: "Náhled"
|
preview-created-theme: "Náhled"
|
||||||
|
invalid-theme: "Vzhled není validní"
|
||||||
already-installed: "Tento vzhled je již nainstalován."
|
already-installed: "Tento vzhled je již nainstalován."
|
||||||
saved: "Uloženo"
|
saved: "Uloženo"
|
||||||
|
manage-themes: "Správa vzhledů"
|
||||||
builtin-themes: "Standardní vzhledy"
|
builtin-themes: "Standardní vzhledy"
|
||||||
my-themes: "Moje vzhledy"
|
my-themes: "Moje vzhledy"
|
||||||
installed-themes: "Nainstalované vzhledy"
|
installed-themes: "Nainstalované vzhledy"
|
||||||
@@ -395,6 +456,7 @@ common/views/components/theme.vue:
|
|||||||
desc: "Popis"
|
desc: "Popis"
|
||||||
export: "Exportovat"
|
export: "Exportovat"
|
||||||
import: "Importovat"
|
import: "Importovat"
|
||||||
|
import-by-code: "nebo zkopírujte kód"
|
||||||
theme-name-required: "Jméno vzhledu je povinné"
|
theme-name-required: "Jméno vzhledu je povinné"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "Skrýt"
|
hide: "Skrýt"
|
||||||
@@ -406,14 +468,16 @@ common/views/components/messaging.vue:
|
|||||||
search-user: "Najít uživatele"
|
search-user: "Najít uživatele"
|
||||||
you: "Vy"
|
you: "Vy"
|
||||||
no-history: "Žádná historie"
|
no-history: "Žádná historie"
|
||||||
|
user: "Uživatel"
|
||||||
|
group: "Skupina"
|
||||||
|
start-with-user: "Zahájit konverzaci s uživatelem"
|
||||||
|
start-with-group: "Zahájit skupinovou konverzaci"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "Žádné zprávy"
|
|
||||||
new-message: "Máte novou zprávu"
|
new-message: "Máte novou zprávu"
|
||||||
only-one-file-attached: "Jenom JEDEN soubor může být přiložen ke zprávě."
|
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
|
input-message-here: "Sem zadejte zprávu"
|
||||||
send: "Odeslat"
|
send: "Odeslat"
|
||||||
attach-from-local: "Přiložit soubory z Vašeho zařízení"
|
attach-from-local: "Přiložit soubory z Vašeho zařízení"
|
||||||
only-one-file-attached: "Jenom JEDEN soubor může být přiložen ke zprávě."
|
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "Přečtené"
|
is-read: "Přečtené"
|
||||||
deleted: "Tato zpráva byla odstraněna"
|
deleted: "Tato zpráva byla odstraněna"
|
||||||
@@ -426,6 +490,7 @@ common/views/components/nav.vue:
|
|||||||
repository: "Úložiště"
|
repository: "Úložiště"
|
||||||
develop: "Vývojáři"
|
develop: "Vývojáři"
|
||||||
feedback: "Zpětná vazba"
|
feedback: "Zpětná vazba"
|
||||||
|
tos: "Podmínky užívání"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "Zmínění"
|
mention: "Zmínění"
|
||||||
detail: "Více"
|
detail: "Více"
|
||||||
@@ -439,6 +504,7 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "Odepnout"
|
unpin: "Odepnout"
|
||||||
delete: "Odstranit"
|
delete: "Odstranit"
|
||||||
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
|
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
|
||||||
|
delete-and-edit: "Smazat a upravit"
|
||||||
remote: "Ukázat originální poznámku"
|
remote: "Ukázat originální poznámku"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "Zmínění"
|
mention: "Zmínění"
|
||||||
@@ -454,6 +520,7 @@ common/views/components/user-menu.vue:
|
|||||||
suspend: "Zmrazit"
|
suspend: "Zmrazit"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-count: "{} hlasů"
|
vote-count: "{} hlasů"
|
||||||
|
total-votes: "{} hlasů celkem"
|
||||||
vote: "Hlasovat"
|
vote: "Hlasovat"
|
||||||
show-result: "Podívat se na výsledky"
|
show-result: "Podívat se na výsledky"
|
||||||
voted: "Už jste hlasovaly"
|
voted: "Už jste hlasovaly"
|
||||||
@@ -464,10 +531,25 @@ common/views/components/poll.vue:
|
|||||||
remaining-seconds: "zbývá {s} sekund"
|
remaining-seconds: "zbývá {s} sekund"
|
||||||
common/views/components/poll-editor.vue:
|
common/views/components/poll-editor.vue:
|
||||||
no-only-one-choice: "Musíte vybrat alespoň dvě možnosti"
|
no-only-one-choice: "Musíte vybrat alespoň dvě možnosti"
|
||||||
|
choice-n: "Volba {}"
|
||||||
|
remove: "Odstranit tuto možnost"
|
||||||
|
add: "+ Přidat možnost"
|
||||||
destroy: "Zahodit dotazník"
|
destroy: "Zahodit dotazník"
|
||||||
|
multiple: "Více odpovědí je povoleno"
|
||||||
|
expiration: "Termín"
|
||||||
infinite: "Nekonečne"
|
infinite: "Nekonečne"
|
||||||
at: "Výběr data a času"
|
at: "Výběr data a času"
|
||||||
|
no-more: "Více už přidat nemůžete"
|
||||||
|
deadline-date: "Termín ukončení"
|
||||||
|
deadline-time: "Doba trvání"
|
||||||
|
interval: "Trvání"
|
||||||
|
second: "Sekunda"
|
||||||
|
minute: "Minuta"
|
||||||
|
hour: "Hodina"
|
||||||
day: "Ne"
|
day: "Ne"
|
||||||
|
common/views/components/reaction-picker.vue:
|
||||||
|
choose-reaction: "Vyberte svoji reakci"
|
||||||
|
input-reaction-placeholder: "nebo vložte Emoji"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "Emoji"
|
custom-emoji: "Emoji"
|
||||||
people: "Lidé"
|
people: "Lidé"
|
||||||
@@ -478,9 +560,12 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objekty"
|
objects: "Objekty"
|
||||||
symbols: "Symboly"
|
symbols: "Symboly"
|
||||||
flags: "Vlajky"
|
flags: "Vlajky"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "Pro aktivování změn musíte znovu načíst stránky."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Přezdívka"
|
username: "Přezdívka"
|
||||||
password: "Heslo"
|
password: "Heslo"
|
||||||
|
token: "Token"
|
||||||
signing-in: "Přihlašování..."
|
signing-in: "Přihlašování..."
|
||||||
or: "Nebo"
|
or: "Nebo"
|
||||||
signin-with-twitter: "Přihlásit se pomocí účtu Twitter"
|
signin-with-twitter: "Přihlásit se pomocí účtu Twitter"
|
||||||
@@ -508,6 +593,7 @@ common/views/components/signup.vue:
|
|||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
password-not-matched: "Neshodují se"
|
password-not-matched: "Neshodují se"
|
||||||
recaptcha: "Potvrzení"
|
recaptcha: "Potvrzení"
|
||||||
|
tos: "Podmínky užívání"
|
||||||
create: "Vytvořit účet"
|
create: "Vytvořit účet"
|
||||||
some-error: "Pokus o vytvoření účtu selhal. Prosím zkuste to znovu."
|
some-error: "Pokus o vytvoření účtu selhal. Prosím zkuste to znovu."
|
||||||
common/views/components/special-message.vue:
|
common/views/components/special-message.vue:
|
||||||
@@ -546,6 +632,7 @@ common/views/components/visibility-chooser.vue:
|
|||||||
home: "Domů"
|
home: "Domů"
|
||||||
specified-desc: "Poslat pouze zmíněným uživatelům"
|
specified-desc: "Poslat pouze zmíněným uživatelům"
|
||||||
local-public: "Veřejná (pouze místní)"
|
local-public: "Veřejná (pouze místní)"
|
||||||
|
local-public-desc: "Nepublikovat na vzdálených serverech"
|
||||||
local-home: "Domovská (pouze místní)"
|
local-home: "Domovská (pouze místní)"
|
||||||
local-followers: "Pro sledující (pouze místní)"
|
local-followers: "Pro sledující (pouze místní)"
|
||||||
common/views/components/trends.vue:
|
common/views/components/trends.vue:
|
||||||
@@ -555,6 +642,8 @@ common/views/components/language-settings.vue:
|
|||||||
title: "Zobrazit jazyky"
|
title: "Zobrazit jazyky"
|
||||||
pick-language: "Zvolte jazyk"
|
pick-language: "Zvolte jazyk"
|
||||||
recommended: "Doporučené"
|
recommended: "Doporučené"
|
||||||
|
auto: "Automaticky"
|
||||||
|
specify-language: "Vyberte jazyk"
|
||||||
info: "Pro aktivování změn musíte znovu načíst stránky."
|
info: "Pro aktivování změn musíte znovu načíst stránky."
|
||||||
common/views/components/profile-editor.vue:
|
common/views/components/profile-editor.vue:
|
||||||
title: "Profil"
|
title: "Profil"
|
||||||
@@ -575,12 +664,14 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Profil byl úspěšně aktualizován"
|
saved: "Profil byl úspěšně aktualizován"
|
||||||
uploading: "Nahrávám"
|
uploading: "Nahrávám"
|
||||||
upload-failed: "Nahrávání selhalo"
|
upload-failed: "Nahrávání selhalo"
|
||||||
|
unable-to-process: "Operace nemohla být dokončena."
|
||||||
email: "Nastavení e-mailů"
|
email: "Nastavení e-mailů"
|
||||||
email-address: "Emailová adresa"
|
email-address: "Emailová adresa"
|
||||||
email-verified: "Váš e-mail byl ověřen"
|
email-verified: "Váš e-mail byl ověřen"
|
||||||
email-not-verified: "Váš email není potvrzen. Prosím zkontrolujte si svou schránku."
|
email-not-verified: "Váš email není potvrzen. Prosím zkontrolujte si svou schránku."
|
||||||
export: "Exportovat"
|
export: "Exportovat"
|
||||||
import: "Importovat"
|
import: "Importovat"
|
||||||
|
export-and-import: "Import / Export"
|
||||||
export-targets:
|
export-targets:
|
||||||
following-list: "Seznam sledujících"
|
following-list: "Seznam sledujících"
|
||||||
mute-list: "Seznam ztlumených uživatelů"
|
mute-list: "Seznam ztlumených uživatelů"
|
||||||
@@ -590,6 +681,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "Nebezpečná zóna"
|
danger-zone: "Nebezpečná zóna"
|
||||||
delete-account: "Smazat účet"
|
delete-account: "Smazat účet"
|
||||||
account-deleted: "Váš účet byl smazán. Může chvilku trvat než zmizí všechna data."
|
account-deleted: "Váš účet byl smazán. Může chvilku trvat než zmizí všechna data."
|
||||||
|
profile-metadata: "Metadata profilu"
|
||||||
|
metadata-label: "Popis"
|
||||||
|
metadata-content: "Obsah"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Uživatel"
|
users: "Uživatel"
|
||||||
rename: "Přejmenovat seznam"
|
rename: "Přejmenovat seznam"
|
||||||
@@ -597,10 +691,34 @@ common/views/components/user-list-editor.vue:
|
|||||||
remove-user: "Odebrat z tohoto seznamu"
|
remove-user: "Odebrat z tohoto seznamu"
|
||||||
delete-are-you-sure: "Smazat seznam \"$1\"?"
|
delete-are-you-sure: "Smazat seznam \"$1\"?"
|
||||||
deleted: "Smazáno"
|
deleted: "Smazáno"
|
||||||
|
add-user: "Přidat uživatele"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
users: "Členové"
|
||||||
|
rename: "Přejmenovat skupinu"
|
||||||
|
delete: "Odstranit skupinu"
|
||||||
|
transfer: "Přesunout skupinu"
|
||||||
|
transfer-are-you-sure: "Jste si jistí že chcete přidat @$2 do skupiny: $1?"
|
||||||
|
transferred: "Skupina přesunuta"
|
||||||
|
remove-user: "Odebrat uživatele z této skupiny"
|
||||||
|
delete-are-you-sure: "Jste si jistí že chcete smazat skupinu \"$1\"?"
|
||||||
|
deleted: "Smazáno"
|
||||||
|
invite: "Pozvat"
|
||||||
|
invited: "Pozvánka byla úspěšně odeslána"
|
||||||
common/views/components/user-lists.vue:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Seznamy"
|
||||||
|
create-list: "Vytvořit seznam"
|
||||||
list-name: "Název seznamu"
|
list-name: "Název seznamu"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
user-groups: "Skupiny"
|
||||||
|
create-group: "Vytvořit skupinu"
|
||||||
|
group-name: "Název skupiny"
|
||||||
|
owned-groups: "Moje skupiny"
|
||||||
|
invites: "Pozvat"
|
||||||
|
reject-invite: "Odmítnout"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Načítám"
|
fetching: "Načítám"
|
||||||
|
no-broadcasts: "Žádná nová oznámení"
|
||||||
|
have-a-nice-day: "Přejeme Vám příjemný den!"
|
||||||
next: "Další"
|
next: "Další"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "Rok {}"
|
year: "Rok {}"
|
||||||
@@ -627,12 +745,19 @@ common/views/widgets/slideshow.vue:
|
|||||||
no-image: "V této složce nebyly nalezeny žádné fotky."
|
no-image: "V této složce nebyly nalezeny žádné fotky."
|
||||||
common/views/pages/not-found.vue:
|
common/views/pages/not-found.vue:
|
||||||
page-not-found: "Stránka nenalezena"
|
page-not-found: "Stránka nenalezena"
|
||||||
|
common/views/pages/follow.vue:
|
||||||
|
following: "Sledování"
|
||||||
|
follow: "Sledovat"
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
accept: "Přijmout"
|
||||||
|
reject: "Odmítnout"
|
||||||
desktop:
|
desktop:
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
avatar-crop-title: "Vyberte část, která se zobrazí jako avatar"
|
avatar-crop-title: "Vyberte část, která se zobrazí jako avatar"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
uploading-avatar: "Nahrál nový avatar"
|
uploading-avatar: "Nahrál nový avatar"
|
||||||
avatar-updated: "Vaše avatar byl aktualizován"
|
avatar-updated: "Vaše avatar byl aktualizován"
|
||||||
|
unable-to-process: "Operace nemohla být dokončena."
|
||||||
invalid-filetype: "Tento formát souboru není podporován"
|
invalid-filetype: "Tento formát souboru není podporován"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Černá ... Celkem"
|
total: "Černá ... Celkem"
|
||||||
@@ -669,7 +794,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
rename: "Přejmenovat"
|
rename: "Přejmenovat"
|
||||||
copy-url: "Kopírovat URL"
|
copy-url: "Kopírovat URL"
|
||||||
download: "Stáhnout"
|
download: "Stáhnout"
|
||||||
else-files: "Více..."
|
else-files: "Ostatní"
|
||||||
set-as-avatar: "Nastavit jako avatar"
|
set-as-avatar: "Nastavit jako avatar"
|
||||||
set-as-banner: "Nastavit jako baner"
|
set-as-banner: "Nastavit jako baner"
|
||||||
open-in-app: "Otevřít v aplikaci"
|
open-in-app: "Otevřít v aplikaci"
|
||||||
@@ -687,6 +812,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Přejmenovat"
|
rename: "Přejmenovat"
|
||||||
rename-folder: "Přejmenovat složku"
|
rename-folder: "Přejmenovat složku"
|
||||||
input-new-folder-name: "Zadejte nové jméno"
|
input-new-folder-name: "Zadejte nové jméno"
|
||||||
|
else-folders: "Ostatní"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
empty-drive-description: "Klikněte pravým tlačítkem myši pro otevření menu, nebo sem přetáhněte soubor pro nahrání."
|
empty-drive-description: "Klikněte pravým tlačítkem myši pro otevření menu, nebo sem přetáhněte soubor pro nahrání."
|
||||||
empty-folder: "Tato složka je prázdná"
|
empty-folder: "Tato složka je prázdná"
|
||||||
@@ -729,27 +855,11 @@ desktop/views/components/notes.vue:
|
|||||||
error: "Načítání selhalo."
|
error: "Načítání selhalo."
|
||||||
retry: "Opakovat"
|
retry: "Opakovat"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Přidat uživatele"
|
|
||||||
attach-location-information: "Přidat informace o lokaci"
|
|
||||||
hide-contents: "Schovat obsah"
|
|
||||||
reply-placeholder: "Odpovědět na tento příspěvěk"
|
|
||||||
quote-placeholder: "Citovat tento příspěvek"
|
|
||||||
submit: "Příspěvek"
|
|
||||||
reply: "Odpovědět"
|
|
||||||
renote: "Renotovat"
|
|
||||||
posted: "Odesláno!"
|
posted: "Odesláno!"
|
||||||
replied: "Odpověděno!"
|
replied: "Odpověděno!"
|
||||||
reposted: "Renotováno!"
|
reposted: "Renotováno!"
|
||||||
note-failed: "Nepodařilo se přidat příspěvek"
|
note-failed: "Nepodařilo se přidat příspěvek"
|
||||||
renote-failed: "Renotování neuspělo"
|
renote-failed: "Renotování neuspělo"
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Vytvořit anketu"
|
|
||||||
text-remain: "{0} znaků zbývá"
|
|
||||||
recent-tags: "Nejnovější"
|
|
||||||
visibility: "Viditelnost"
|
|
||||||
geolocation-alert: "Vaše zařízení nepodporuje lokační službu"
|
|
||||||
error: "Chyba"
|
|
||||||
enter-username: "Zadejte své uživatelské jméno..."
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nový příspěvek"
|
note: "Nový příspěvek"
|
||||||
reply: "Odpovědět"
|
reply: "Odpovědět"
|
||||||
@@ -768,6 +878,7 @@ desktop/views/components/renote-form-window.vue:
|
|||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
detail: "Více…"
|
detail: "Více…"
|
||||||
url: "https://www.google.cz/landing/2step/"
|
url: "https://www.google.cz/landing/2step/"
|
||||||
|
token: "Token"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
@@ -824,6 +935,7 @@ desktop/views/components/ui.header.vue:
|
|||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Váš profil"
|
profile: "Váš profil"
|
||||||
lists: "Seznamy"
|
lists: "Seznamy"
|
||||||
|
groups: "Skupiny"
|
||||||
admin: "Administrace"
|
admin: "Administrace"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "Hry"
|
game: "Hry"
|
||||||
@@ -833,11 +945,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Nový příspěvek"
|
post: "Nový příspěvek"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Vyhledávání"
|
placeholder: "Vyhledávání"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
accept: "Přijmout"
|
|
||||||
reject: "Odmítnout"
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "Seznamy uživatelů"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Příspěvky"
|
notes: "Příspěvky"
|
||||||
desktop/views/components/users-list.vue:
|
desktop/views/components/users-list.vue:
|
||||||
@@ -853,7 +960,6 @@ admin/views/index.vue:
|
|||||||
users: "Uživatelé"
|
users: "Uživatelé"
|
||||||
federation: "Z fedivesmíru"
|
federation: "Z fedivesmíru"
|
||||||
announcements: "Oznámení"
|
announcements: "Oznámení"
|
||||||
hashtags: "Hashtagy"
|
|
||||||
queue: "Fronta úloh"
|
queue: "Fronta úloh"
|
||||||
logs: "Logy"
|
logs: "Logy"
|
||||||
back-to-misskey: "Zpět na Misskey"
|
back-to-misskey: "Zpět na Misskey"
|
||||||
@@ -864,6 +970,11 @@ admin/views/dashboard.vue:
|
|||||||
instances: "Instance"
|
instances: "Instance"
|
||||||
this-instance: "Tato instance"
|
this-instance: "Tato instance"
|
||||||
federated: "Z fedivesmíru"
|
federated: "Z fedivesmíru"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Logy"
|
||||||
|
levels:
|
||||||
|
info: "Informace"
|
||||||
|
error: "Chyba"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "Popis"
|
details: "Popis"
|
||||||
remove-report: "Odstranit"
|
remove-report: "Odstranit"
|
||||||
@@ -878,12 +989,12 @@ admin/views/instance.vue:
|
|||||||
maintainer-config: "Informace o administrátorovi"
|
maintainer-config: "Informace o administrátorovi"
|
||||||
maintainer-name: "Jméno administrátora"
|
maintainer-name: "Jméno administrátora"
|
||||||
maintainer-email: "Kontakt na administrátora"
|
maintainer-email: "Kontakt na administrátora"
|
||||||
|
object-storage-endpoint: "Endpoint"
|
||||||
mb: "V megabajtech"
|
mb: "V megabajtech"
|
||||||
recaptcha-config: "nastavení služby reCAPTCHA"
|
recaptcha-config: "nastavení služby reCAPTCHA"
|
||||||
recaptcha-info: "reCAPTCHA token je povinný. Můžete jej získat na https://www.google.com/recaptcha/intro/"
|
recaptcha-info: "reCAPTCHA token je povinný. Můžete jej získat na https://www.google.com/recaptcha/intro/"
|
||||||
enable-recaptcha: "povolit reCAPTCHA"
|
enable-recaptcha: "povolit reCAPTCHA"
|
||||||
recaptcha-site-key: "reCAPTCHA klíč stránky (site key)"
|
recaptcha-preview: "Náhled"
|
||||||
recaptcha-secret-key: "reCAPTCHA tajný klíč"
|
|
||||||
twitter-integration-config: "Nastavení spojení s Twitterem"
|
twitter-integration-config: "Nastavení spojení s Twitterem"
|
||||||
twitter-integration-info: "The callback URL is set on {url}."
|
twitter-integration-info: "The callback URL is set on {url}."
|
||||||
enable-twitter-integration: "Povolit připojení k Twitteru"
|
enable-twitter-integration: "Povolit připojení k Twitteru"
|
||||||
@@ -902,12 +1013,12 @@ admin/views/instance.vue:
|
|||||||
invite: "Pozvat"
|
invite: "Pozvat"
|
||||||
save: "Uložit"
|
save: "Uložit"
|
||||||
saved: "Uloženo"
|
saved: "Uloženo"
|
||||||
user-recommendation-config: "Doporučení uživatelé"
|
|
||||||
email: "Emailová adresa"
|
email: "Emailová adresa"
|
||||||
smtp-port: "SMTP Port"
|
smtp-port: "SMTP Port"
|
||||||
smtp-auth: "Provést SMTP autentikaci"
|
smtp-auth: "Provést SMTP autentikaci"
|
||||||
smtp-user: "SMTP uživatel"
|
smtp-user: "SMTP uživatel"
|
||||||
smtp-pass: "SMTP heslo"
|
smtp-pass: "SMTP heslo"
|
||||||
|
test-email: "Test"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "Povolit ServiceWorker"
|
enable-serviceworker: "Povolit ServiceWorker"
|
||||||
vapid-publickey: "VAPID veřejný klíč"
|
vapid-publickey: "VAPID veřejný klíč"
|
||||||
@@ -954,20 +1065,15 @@ admin/views/users.vue:
|
|||||||
reset-password: "Resetovat heslo"
|
reset-password: "Resetovat heslo"
|
||||||
reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?"
|
reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?"
|
||||||
password-updated: "Heslo je nyní \"{password}\""
|
password-updated: "Heslo je nyní \"{password}\""
|
||||||
verify: "Ověřit účet"
|
|
||||||
verify-confirm: "Chcete aby toto byl ověřený účet?"
|
|
||||||
verified: "Účet se nyní ověřuje"
|
|
||||||
unverify: "Zrušit ověření účtu"
|
|
||||||
unverify-confirm: "Opravdu chcete zrušit designaci \"ověřený účet\"?"
|
|
||||||
unverified: "Ruší se potvrzení účtu"
|
|
||||||
update-remote-user: "Aktualizovat informace o vzdáleném účtu"
|
update-remote-user: "Aktualizovat informace o vzdáleném účtu"
|
||||||
|
username: "Přezdívka"
|
||||||
|
host: "Hostitel"
|
||||||
users:
|
users:
|
||||||
title: "Uživatel"
|
title: "Uživatel"
|
||||||
state:
|
state:
|
||||||
all: "Všechny"
|
all: "Všechny"
|
||||||
moderator: "Moderátor"
|
moderator: "Moderátor"
|
||||||
adminOrModerator: "Admin/Moderátor"
|
adminOrModerator: "Admin/Moderátor"
|
||||||
verified: "Ověřený účet"
|
|
||||||
origin:
|
origin:
|
||||||
title: "Původ"
|
title: "Původ"
|
||||||
combined: "Lokální + Vzdálené"
|
combined: "Lokální + Vzdálené"
|
||||||
@@ -978,6 +1084,11 @@ admin/views/users.vue:
|
|||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "Vytvořit moderátora"
|
title: "Vytvořit moderátora"
|
||||||
|
logs:
|
||||||
|
title: "Logy"
|
||||||
|
moderator: "Moderátoři"
|
||||||
|
type: "Operace"
|
||||||
|
info: "Informace"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "Přidat emoji"
|
title: "Přidat emoji"
|
||||||
@@ -1014,6 +1125,7 @@ admin/views/federation.vue:
|
|||||||
host: "Hostitel"
|
host: "Hostitel"
|
||||||
notes: "Poznámky"
|
notes: "Poznámky"
|
||||||
users: "Uživatelé"
|
users: "Uživatelé"
|
||||||
|
following: "Sledování"
|
||||||
caught-at: "Vytvořeno"
|
caught-at: "Vytvořeno"
|
||||||
status: "Status"
|
status: "Status"
|
||||||
latest-request-received-at: "Poslední požadavek přijat"
|
latest-request-received-at: "Poslední požadavek přijat"
|
||||||
@@ -1032,6 +1144,8 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "za hodinu"
|
hour: "za hodinu"
|
||||||
day: "za den"
|
day: "za den"
|
||||||
|
blocked-hosts: "Blokován"
|
||||||
|
save: "Uložit"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "O Misskey"
|
about: "O Misskey"
|
||||||
timeline: "Časová osa"
|
timeline: "Časová osa"
|
||||||
@@ -1070,6 +1184,8 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
no-photos: "Žádné obrázky"
|
no-photos: "Žádné obrázky"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "Poznámky"
|
posts: "Poznámky"
|
||||||
|
following: "Sledovaní"
|
||||||
|
followers: "Sledující"
|
||||||
month: "Po"
|
month: "Po"
|
||||||
day: "Ne"
|
day: "Ne"
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
@@ -1098,6 +1214,7 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
common/views/components/follow-button.vue:
|
common/views/components/follow-button.vue:
|
||||||
|
following: "Sledování"
|
||||||
follow-processing: "Zpracovávám"
|
follow-processing: "Zpracovávám"
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
private: "Tento příspěvek je soukromý"
|
private: "Tento příspěvek je soukromý"
|
||||||
@@ -1117,15 +1234,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
admin: "admin"
|
admin: "admin"
|
||||||
bot: "bot"
|
bot: "bot"
|
||||||
cat: "kočka"
|
cat: "kočka"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Přidat uživatele"
|
|
||||||
submit: "Příspěvek"
|
|
||||||
reply: "Odpovědět"
|
|
||||||
renote: "Renotovat"
|
|
||||||
reply-placeholder: "Odpovědět na tento příspěvěk"
|
|
||||||
geolocation-alert: "Vaše zařízení nepodporuje lokační službu"
|
|
||||||
error: "Chyba"
|
|
||||||
username-prompt: "Zadejte uživatelské jméno"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Tento příspěvek je soukromý"
|
private: "Tento příspěvek je soukromý"
|
||||||
deleted: "Tento příspěvek byl odstraněn"
|
deleted: "Tento příspěvek byl odstraněn"
|
||||||
@@ -1138,6 +1246,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
notifications: "Oznámení"
|
notifications: "Oznámení"
|
||||||
search: "Vyhledávání"
|
search: "Vyhledávání"
|
||||||
user-lists: "Seznamy"
|
user-lists: "Seznamy"
|
||||||
|
user-groups: "Skupiny"
|
||||||
widgets: "Widgety"
|
widgets: "Widgety"
|
||||||
game: "Hry"
|
game: "Hry"
|
||||||
admin: "Administrace"
|
admin: "Administrace"
|
||||||
@@ -1146,8 +1255,6 @@ mobile/views/pages/drive.vue:
|
|||||||
contextmenu:
|
contextmenu:
|
||||||
upload: "Nahrát soubor"
|
upload: "Nahrát soubor"
|
||||||
create-folder: "Vytvořit složku"
|
create-folder: "Vytvořit složku"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "Seznamy"
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "Váš účet je připraven! 📦"
|
lets-start: "Váš účet je připraven! 📦"
|
||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
@@ -1164,9 +1271,6 @@ mobile/views/pages/widgets/activity.vue:
|
|||||||
activity: "Aktivita"
|
activity: "Aktivita"
|
||||||
mobile/views/pages/share.vue:
|
mobile/views/pages/share.vue:
|
||||||
share-with: "Sdílet na {name}"
|
share-with: "Sdílet na {name}"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
accept: "Přijmout"
|
|
||||||
reject: "Odmítnout"
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
prev: "Předchozí příspěvěk"
|
prev: "Předchozí příspěvěk"
|
||||||
next: "Následující příspěvek"
|
next: "Následující příspěvek"
|
||||||
@@ -1176,6 +1280,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "Pro '{q}' nebyly nalezeny žádné příspěvky."
|
not-found: "Pro '{q}' nebyly nalezeny žádné příspěvky."
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Vybrat soubory"
|
select-file: "Vybrat soubory"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Oznámení"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
activity: "Aktivita"
|
activity: "Aktivita"
|
||||||
frequently-replied-users: "Častá zmínění"
|
frequently-replied-users: "Častá zmínění"
|
||||||
@@ -1198,3 +1304,54 @@ deck/deck.user-column.vue:
|
|||||||
activity: "Aktivita"
|
activity: "Aktivita"
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
app-name-desc: "Jméno vaší aplikace"
|
app-name-desc: "Jméno vaší aplikace"
|
||||||
|
pages:
|
||||||
|
pin-this-page: "Připnout"
|
||||||
|
unpin-this-page: "Odepnout"
|
||||||
|
like: "Lajk"
|
||||||
|
title: "Titulek"
|
||||||
|
blocks:
|
||||||
|
post: "Formulář pro psaní"
|
||||||
|
_post:
|
||||||
|
text: "Obsah"
|
||||||
|
_textInput:
|
||||||
|
text: "Titulek"
|
||||||
|
_textareaInput:
|
||||||
|
text: "Titulek"
|
||||||
|
_numberInput:
|
||||||
|
text: "Titulek"
|
||||||
|
_switch:
|
||||||
|
text: "Titulek"
|
||||||
|
_counter:
|
||||||
|
text: "Titulek"
|
||||||
|
_button:
|
||||||
|
text: "Titulek"
|
||||||
|
_action:
|
||||||
|
_dialog:
|
||||||
|
content: "Obsah"
|
||||||
|
_radioButton:
|
||||||
|
title: "Titulek"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
random: "Náhodně"
|
||||||
|
list: "Seznamy"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "Seznamy"
|
||||||
|
random: "Náhodně"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Seznamy"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Seznamy"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Seznamy"
|
||||||
|
_pick:
|
||||||
|
arg1: "Seznamy"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Seznamy"
|
||||||
|
types:
|
||||||
|
array: "Seznamy"
|
||||||
|
room:
|
||||||
|
translate: "Přesunout"
|
||||||
|
save: "Uložit"
|
||||||
|
furnitures:
|
||||||
|
moon: "Po"
|
||||||
|
|||||||
1917
locales/da-DK.yml
Normal file
1917
locales/da-DK.yml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,26 +10,39 @@ common:
|
|||||||
about: "Misskey ist eine Quelloffene, <b>dezentralisierte microblogging Software</b>. Es bietet eine erweiterbare Benutzeroberfläche, verschiedenste Möglichkeiten auf Beiträge zu reagieren, kostenlosen Datenspeicher, und andere fortschrittliche Funktionen. Zusätzlich ist Misskey dazu in der Lage, sich mittels des Fediverse mit beliebig vielen anderen ActivityPub-kompatiblen Diensten zu verbinden. Wenn du zum Beispiel einen Betrag mit Misskey abschickst, wird dieser auch für Nutzer von Mastodon oder Pleroma sichtbar sein. So ähnlich wie eine Radioübertragung zwischen Planeten."
|
about: "Misskey ist eine Quelloffene, <b>dezentralisierte microblogging Software</b>. Es bietet eine erweiterbare Benutzeroberfläche, verschiedenste Möglichkeiten auf Beiträge zu reagieren, kostenlosen Datenspeicher, und andere fortschrittliche Funktionen. Zusätzlich ist Misskey dazu in der Lage, sich mittels des Fediverse mit beliebig vielen anderen ActivityPub-kompatiblen Diensten zu verbinden. Wenn du zum Beispiel einen Betrag mit Misskey abschickst, wird dieser auch für Nutzer von Mastodon oder Pleroma sichtbar sein. So ähnlich wie eine Radioübertragung zwischen Planeten."
|
||||||
features: "Funktionen"
|
features: "Funktionen"
|
||||||
rich-contents: "Notizen"
|
rich-contents: "Notizen"
|
||||||
|
rich-contents-desc: "Poste einfach deine Ideen, Interessen und alles, was du teilen möchtest. Gestalte deine Nachrichten, teile deine Lieblingsbilder, sende Dateien und Videos und erstelle Umfragen – das und mehr kann Misskey!"
|
||||||
reaction: "Reaktionen"
|
reaction: "Reaktionen"
|
||||||
|
reaction-desc: "Der einfachste Weg, deine Gefühle mit anderen zu teilen. Mit Misskey kannst du auf verschiedenste Arten auf Beiträge reagieren, statt nur zu „liken“."
|
||||||
ui: "Benutzeroberfläche"
|
ui: "Benutzeroberfläche"
|
||||||
|
ui-desc: "Geschmäcker sind verschieden. Deswegen ist Misskeys Oberfläche hochanpassbar und modular. Mache die Startseite zu deiner Startseite, indem du das Layout deiner Timeline änderst und mit Widgets staffierst."
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
drive-desc: "Du willst ein hochgeladenes Foto nochmal posten? Deine Dateien benennen und in Ordnern sortieren? Misskeys Drive ist der beste Ort dafür. Damit wird das Teilen zum Kinderspiel!"
|
||||||
|
outro: "Probiere Misskey aus und entdecke Misskeys einzigartige Funktionen. Wenn dir diese Instanz nicht zusagt, nimm einfach eine andere. Dank Misskeys dezentralem System kannst du dich überall mit deinen Freunden verbinden. Also dann, GLHF!"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Bitte deaktiviere den Werbeblocker."
|
detected: "Bitte deaktiviere den Werbeblocker."
|
||||||
|
warning: "<strong>Misskey hat keine Werbung.</strong> Allerdings können Werbeblocker für unerwartete Probleme und fehlende Funktionen sorgen."
|
||||||
application-authorization: "Autorisierte Anwendungen"
|
application-authorization: "Autorisierte Anwendungen"
|
||||||
close: "Schließen"
|
close: "Schließen"
|
||||||
|
do-not-copy-paste: "Bitte keinen Code einfügen. Ihr Account könnte gefährdet werden."
|
||||||
load-more: "Mehr laden"
|
load-more: "Mehr laden"
|
||||||
enter-password: "Bitte Passwort eingeben"
|
enter-password: "Bitte Passwort eingeben"
|
||||||
2fa: "Zwei-Faktor-Authentifizierung"
|
2fa: "Zwei-Faktor-Authentifizierung"
|
||||||
customize-home: "Layout Anpassen"
|
customize-home: "Layout Anpassen"
|
||||||
featured-notes: "Hervorgehobene Beiträge"
|
featured-notes: "Beliebt"
|
||||||
dark-mode: "Dunkler Modus"
|
dark-mode: "Dunkler Modus"
|
||||||
signin: "Einloggen"
|
signin: "Einloggen"
|
||||||
signup: "Registrieren"
|
signup: "Registrieren"
|
||||||
signout: "Ausloggen"
|
signout: "Ausloggen"
|
||||||
reload-to-apply-the-setting: "Die Seite muss zum Übernehmen dieser Einstellung aktualisiert werden. Soll die Seite jetzt neu geladen werden?"
|
reload-to-apply-the-setting: "Die Seite muss zum Übernehmen dieser Einstellung aktualisiert werden. Soll die Seite jetzt neu geladen werden?"
|
||||||
|
fetching-as-ap-object: "Hole Daten…"
|
||||||
|
delete-confirm: "Diesen Beitrag löschen?"
|
||||||
|
notification-types:
|
||||||
|
reply: "Antworten"
|
||||||
|
renote: "Anmerkung"
|
||||||
got-it: "Verstanden!"
|
got-it: "Verstanden!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Anpassung-Tipps"
|
title: "Anpassung-Tipps"
|
||||||
|
paragraph: "<p>Du kannst deine Startseite anpassen, indem du Widgets hinzufügst und verschiebst.</p><p><strong>Klicke <strong>rechts</strong></strong> auf ein Widget, um dessen Aussehen zu verändern.</p><p>Um ein Widget zu löschen, klicke und ziehe es auf den <strong>Papierkorb</strong> am Kopfende der Seite.</p><p>Wenn du fertig bist, drücke auf den Beenden-Knopf oben rechts.</p>"
|
||||||
gotit: "Verstanden!"
|
gotit: "Verstanden!"
|
||||||
notification:
|
notification:
|
||||||
file-uploaded: "Datei hochgeladen!"
|
file-uploaded: "Datei hochgeladen!"
|
||||||
@@ -53,26 +66,44 @@ common:
|
|||||||
month-and-day: "{day}/{month}"
|
month-and-day: "{day}/{month}"
|
||||||
trash: "Papierkorb"
|
trash: "Papierkorb"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
pages: "Seite"
|
||||||
messaging: "Unterhaltungen"
|
messaging: "Unterhaltungen"
|
||||||
home: "Home"
|
home: "Home"
|
||||||
deck: "Stapel"
|
deck: "Deck"
|
||||||
timeline: "Zeitleiste"
|
timeline: "Zeitleiste"
|
||||||
explore: "Entdecken"
|
explore: "Entdecken"
|
||||||
following: "Folgt"
|
following: "Folgt"
|
||||||
followers: "Folgende"
|
followers: "Folgende"
|
||||||
favorites: "Diesen Beitrag favorisieren"
|
favorites: "Favoriten"
|
||||||
permissions:
|
permissions:
|
||||||
"read:account": "Accountinformationen anzeigen."
|
"read:account": "Accountinformationen anzeigen."
|
||||||
"write:account": "Accountinformationen bearbeiten."
|
"write:account": "Accountinformationen bearbeiten."
|
||||||
|
"read:blocks": "Blöcke anzeigen"
|
||||||
|
"write:blocks": "Auf Sperrungen zugreifen"
|
||||||
"read:drive": "Dateien anzeigen"
|
"read:drive": "Dateien anzeigen"
|
||||||
"write:drive": "Dateien bearbeiten"
|
"write:drive": "Dateien bearbeiten"
|
||||||
"read:favorites": "Favoriten anzeigen"
|
"read:favorites": "Favoriten anzeigen"
|
||||||
|
"write:favorites": "Auf Favoriten zugreifen"
|
||||||
|
"read:following": "Follower-Daten lesen"
|
||||||
|
"write:following": "Folgestatus bearbeiten"
|
||||||
"read:messaging": "Unterhaltung anzeigen"
|
"read:messaging": "Unterhaltung anzeigen"
|
||||||
"write:messaging": "Unterhaltung bearbeiten"
|
"write:messaging": "Unterhaltung bearbeiten"
|
||||||
|
"read:mutes": "Stummschaltungen lesen"
|
||||||
|
"write:mutes": "Stummschaltungen bearbeiten"
|
||||||
|
"write:notes": "Beiträge löschen und verfassen"
|
||||||
|
"read:notifications": "Benachrichtigungen lesen"
|
||||||
|
"write:notifications": "Benachrichtigungen bearbeiten"
|
||||||
|
"read:reactions": "Reaktionen sehen"
|
||||||
|
"write:reactions": "Reaktionen hinzufügen und bearbeiten"
|
||||||
"write:votes": "Abstimmen"
|
"write:votes": "Abstimmen"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Beiträge von Benutzern, denen du folgst, werden in der Zeitleiste angezeigt."
|
follow-users-to-make-your-timeline: "Beiträge von Benutzern, denen du folgst, werden in der Zeitleiste angezeigt."
|
||||||
explore: "Benutzer finden"
|
explore: "Benutzer finden"
|
||||||
|
post-form:
|
||||||
|
reply: "Antworten"
|
||||||
|
renote: "Anmerkung"
|
||||||
|
enter-username: "Bitte gib einen Benutzernamen ein"
|
||||||
|
username-prompt: "Bitte gib einen Benutzernamen ein"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "So"
|
sunday: "So"
|
||||||
monday: "Mo"
|
monday: "Mo"
|
||||||
@@ -145,23 +176,118 @@ common:
|
|||||||
show-reversi-board-labels: "Zeige Reihen- und Spaltenbeschreibungen in Reversi an"
|
show-reversi-board-labels: "Zeige Reihen- und Spaltenbeschreibungen in Reversi an"
|
||||||
use-avatar-reversi-stones: "Avatar als Stein in Reversi anzeigen"
|
use-avatar-reversi-stones: "Avatar als Stein in Reversi anzeigen"
|
||||||
disable-animated-mfm: "Animierten Text in Beiträgen deaktivieren"
|
disable-animated-mfm: "Animierten Text in Beiträgen deaktivieren"
|
||||||
|
disable-showing-animated-images: "Animierte Grafiken deaktivieren"
|
||||||
|
suggest-recent-hashtags: "Beim Verfassen von Beiträgen letzte Hashtags anzeigen"
|
||||||
|
always-show-nsfw: "Sensible Inhalte (NSFW) immer anzeigen"
|
||||||
|
always-mark-nsfw: "Meine Anhänge immer als NSFW markieren"
|
||||||
|
show-full-acct: "Servername bei Benutzernamen immer anzeigen"
|
||||||
|
show-via: "„via“ anzeigen"
|
||||||
|
reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
|
||||||
|
this-setting-is-this-device-only: "Nur auf diesem Gerät"
|
||||||
|
use-os-default-emojis: "Betriebssystem-Emojis nutzen"
|
||||||
|
line-width: "Linienstärke"
|
||||||
|
line-width-thin: "Dünn"
|
||||||
|
line-width-normal: "Normal"
|
||||||
|
line-width-thick: "Dick"
|
||||||
|
font-size: "Schriftgröße"
|
||||||
|
font-size-x-small: "Sehr klein"
|
||||||
|
font-size-small: "Klein"
|
||||||
|
font-size-medium: "Normal"
|
||||||
|
font-size-large: "Groß"
|
||||||
|
font-size-x-large: "Sehr groß"
|
||||||
|
deck-column-align: "Spaltenaufteilung der Deck-Ansicht"
|
||||||
|
deck-column-align-center: "Mitte"
|
||||||
|
deck-column-align-left: "Links"
|
||||||
|
deck-column-align-flexible: "Flexibel"
|
||||||
|
deck-column-width: "Spaltenbreite des Decks"
|
||||||
|
deck-column-width-narrow: "Sehr eng"
|
||||||
|
deck-column-width-narrower: "Eng"
|
||||||
|
deck-column-width-normal: "Normal"
|
||||||
|
deck-column-width-wider: "Breit"
|
||||||
|
deck-column-width-wide: "Sehr breit"
|
||||||
|
use-shadow: "Nutze Schatten"
|
||||||
|
rounded-corners: "Abgerundete Ecken"
|
||||||
|
circle-icons: "Kreisförmige Icons"
|
||||||
|
contrasted-acct: "Nutzernamen kontrastreicher darstellen"
|
||||||
|
wallpaper: "Hintergrund"
|
||||||
|
choose-wallpaper: "Hintergrund auswählen"
|
||||||
|
delete-wallpaper: "Hintergrund entfernen"
|
||||||
|
post-form-on-timeline: "Beitragsformular über Timeline anzeigen"
|
||||||
|
show-clock-on-header: "Uhr am oberen rechten Rand anzeigen"
|
||||||
|
show-reply-target: "Zeige bei einer Antwort die ursprüngliche Nachricht"
|
||||||
|
timeline: "Timeline"
|
||||||
|
show-my-renotes: "Zeige eigene Renotes in der Timeline"
|
||||||
|
show-renoted-my-notes: "Zeige Renotes deiner Posts in der Timeline"
|
||||||
|
show-local-renotes: "Zeige Renotes lokaler Posts in der Timeline"
|
||||||
|
remain-deleted-note: "Gelöschte Beiträge weiterhin anzeigen"
|
||||||
|
sound: "Töne"
|
||||||
|
enable-sounds: "Töne aktivieren"
|
||||||
|
enable-sounds-desc: "Spiel einen Ton ab beim Erhalten eines Beitrags bzw. einer Nachricht. Diese Einstellung wird im Browser gespeichert."
|
||||||
|
volume: "Lautstärke"
|
||||||
|
test: "Test"
|
||||||
|
update: "Misskey-Update"
|
||||||
|
version: "Version:"
|
||||||
|
latest-version: "Neuste Version:"
|
||||||
|
update-checking: "Suche nach Updates"
|
||||||
|
do-update: "Nach Updates suchen"
|
||||||
|
update-settings: "Erweiterte Einstellungen"
|
||||||
|
no-updates: "Kein Update verfügbar"
|
||||||
|
no-updates-desc: "Misskey ist aktuell."
|
||||||
|
update-available: "Eine neue Version ist verfügbar!"
|
||||||
|
update-available-desc: "Änderungen werden beim Neuladen der Seite angewendet."
|
||||||
|
advanced-settings: "Erweiterte Einstellungen"
|
||||||
|
debug-mode: "Debug-Modus einschalten"
|
||||||
|
debug-mode-desc: "Diese Einstellung wird im Browser gespeichert."
|
||||||
|
navbar-position: "Postion der Navigationsleiste"
|
||||||
|
navbar-position-top: "Oben"
|
||||||
|
navbar-position-left: "Links"
|
||||||
|
navbar-position-right: "Rechts"
|
||||||
|
i-am-under-limited-internet: "Ich möchte Datenvolumen sparen"
|
||||||
|
post-style: "Beitrags-Anzeigestil"
|
||||||
|
post-style-standard: "Standard"
|
||||||
|
post-style-smart: "Smart"
|
||||||
|
notification-position: "Benachrichtigungen anzeigen"
|
||||||
|
notification-position-bottom: "Unten"
|
||||||
|
notification-position-top: "Oben"
|
||||||
|
disable-via-mobile: "Beitrag nicht als „vom Handy“ markieren"
|
||||||
|
load-raw-images: "Anhänge in voller Größe laden"
|
||||||
|
load-remote-media: "Zeige Inhalte von fremden Servern"
|
||||||
|
save: "Speichern"
|
||||||
|
saved: "Gespeichert"
|
||||||
search: "Suche"
|
search: "Suche"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
loading: "Laden"
|
loading: "Laden"
|
||||||
|
ok: "Okay"
|
||||||
|
cancel: "Abbrechen"
|
||||||
update-available-title: "Aktualisierung verfügbar"
|
update-available-title: "Aktualisierung verfügbar"
|
||||||
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
||||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||||
verified-user: "Verifizierter Benutzer"
|
hide-password: "Passwort verbergen"
|
||||||
|
show-password: "Passwort zeigen"
|
||||||
|
enter-username: "Kontonamen eingeben"
|
||||||
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktivumgebung verwenden."
|
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktivumgebung verwenden."
|
||||||
|
user-suspended: "Dieser Nutzer wurde gesperrt."
|
||||||
|
is-remote-user: "Diese Nutzerinformationen können unvollständig sein."
|
||||||
|
is-remote-post: "Dies ist ein entfernter Post."
|
||||||
|
view-on-remote: "Vollständige Infos auf Ursprungsserver anzeigen"
|
||||||
|
renoted-by: "Renote von {user}"
|
||||||
|
no-notes: "Keine Beiträge"
|
||||||
|
turn-on-darkmode: "Dunkles Design"
|
||||||
|
turn-off-darkmode: "Helles Design"
|
||||||
error:
|
error:
|
||||||
|
title: "Allgemeiner Fehler"
|
||||||
retry: "Erneut versuchen"
|
retry: "Erneut versuchen"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Unentschieden"
|
drawn: "Unentschieden"
|
||||||
my-turn: "Du bist am Zug"
|
my-turn: "Du bist am Zug"
|
||||||
opponent-turn: "Dein Gegner ist an der Reihe"
|
opponent-turn: "Dein Gegner ist an der Reihe"
|
||||||
|
turn-of: "{name}s Zug"
|
||||||
|
past-turn-of: "Zug von {name}"
|
||||||
|
won: "{name} hat gewonnen"
|
||||||
black: "Schwarz"
|
black: "Schwarz"
|
||||||
white: "Weiß"
|
white: "Weiß"
|
||||||
total: "Gesamt"
|
total: "Gesamt"
|
||||||
|
this-turn: "{count}. Zug"
|
||||||
widgets:
|
widgets:
|
||||||
analog-clock: "Analoge Uhr"
|
analog-clock: "Analoge Uhr"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
@@ -172,8 +298,10 @@ common:
|
|||||||
memo: "Notizen"
|
memo: "Notizen"
|
||||||
trends: "Trends"
|
trends: "Trends"
|
||||||
photo-stream: "Bilder"
|
photo-stream: "Bilder"
|
||||||
|
posts-monitor: "Beitrags-Aktivität"
|
||||||
slideshow: "Diashow"
|
slideshow: "Diashow"
|
||||||
version: "Version"
|
version: "Version"
|
||||||
|
broadcast: "Ankündigungen"
|
||||||
notifications: "Benachrichtigungen"
|
notifications: "Benachrichtigungen"
|
||||||
users: "Empfohlene Benutzer"
|
users: "Empfohlene Benutzer"
|
||||||
polls: "Umfrage"
|
polls: "Umfrage"
|
||||||
@@ -182,7 +310,9 @@ common:
|
|||||||
nav: "Navigation"
|
nav: "Navigation"
|
||||||
tips: "Tipps"
|
tips: "Tipps"
|
||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
|
queue: "Warteschlange"
|
||||||
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
||||||
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Erlaubst Du <i>{name}</i> auf deinen Account zuzugreifen?"
|
share-access: "Erlaubst Du <i>{name}</i> auf deinen Account zuzugreifen?"
|
||||||
@@ -192,19 +322,37 @@ auth/views/form.vue:
|
|||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "Lädt"
|
loading: "Lädt"
|
||||||
denied: "Autorisierung der Anwendung wurde verweigert."
|
denied: "Autorisierung der Anwendung wurde verweigert."
|
||||||
|
denied-paragraph: "Diese App kann nicht auf deinen Account zugreifen."
|
||||||
already-authorized: "Diese Anwendung ist bereits autorisiert."
|
already-authorized: "Diese Anwendung ist bereits autorisiert."
|
||||||
allowed: "Autorisierung der Anwendung wurde erlaubt."
|
allowed: "Autorisierung der Anwendung wurde erlaubt."
|
||||||
|
callback-url: "Zur App zurückkehren"
|
||||||
please-go-back: "Bitte gehe zurück zur Anwendung."
|
please-go-back: "Bitte gehe zurück zur Anwendung."
|
||||||
error: "Sitzung ist nicht vorhanden."
|
error: "Sitzung ist nicht vorhanden."
|
||||||
sign-in: "Bitte melde dich an."
|
sign-in: "Bitte melde dich an."
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "Verifizierter Benutzer"
|
pinned-users: "Vorgeschlagen"
|
||||||
|
popular-users: "Beliebt"
|
||||||
|
recently-updated-users: "Kürzlich aktiv"
|
||||||
|
recently-registered-users: "Neue Benutzer"
|
||||||
|
popular-tags: "Beliebte Tags"
|
||||||
|
federated: "Aus dem Fediverse"
|
||||||
|
explore: "{host} erkunden"
|
||||||
|
users-info: "Momentan sind {users} Nutzer hier registriert"
|
||||||
|
common/views/components/url-preview.vue:
|
||||||
|
enable-player: "Player öffnen"
|
||||||
|
disable-player: "Player schließen"
|
||||||
|
common/views/components/user-list.vue:
|
||||||
|
no-users: "Keine Benutzer"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "Warten auf {}"
|
waiting-for: "Warten auf {}"
|
||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "Aufgeben"
|
surrender: "Aufgeben"
|
||||||
|
surrendered: "durch Aufgabe"
|
||||||
|
is-llotheo: "Der niedrigere gewinnt (Llotheo)"
|
||||||
|
looped-map: "Spielbrettenden verbinden"
|
||||||
|
can-put-everywhere: "Setzen ist überall erlaubt"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Spiele Reversi mit deinen Freunden!"
|
sub-title: "Spiele Reversi mit deinen Freunden!"
|
||||||
@@ -222,7 +370,14 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
black-or-white: "Schwarz/Weiß"
|
black-or-white: "Schwarz/Weiß"
|
||||||
black-is: "Schwarz ist {}"
|
black-is: "Schwarz ist {}"
|
||||||
rules: "Regeln"
|
rules: "Regeln"
|
||||||
|
is-llotheo: "Der niedrigere gewinnt (Llotheo)"
|
||||||
|
looped-map: "Spielbrettenden verbinden"
|
||||||
|
can-put-everywhere: "Setzen ist überall erlaubt"
|
||||||
|
settings-of-the-bot: "Bot-Einstellungen"
|
||||||
|
this-game-is-started-soon: "Spiel beginnt gleich"
|
||||||
waiting-for-other: "Warte auf den Gegner"
|
waiting-for-other: "Warte auf den Gegner"
|
||||||
|
waiting-for-me: "Warten, bis du bereit bist"
|
||||||
|
waiting-for-both: "Vorbereiten…"
|
||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
ready: "Bereit"
|
ready: "Bereit"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
@@ -253,10 +408,13 @@ common/views/components/media-banner.vue:
|
|||||||
sensitive: "Dieser Inhalt ist NSFW"
|
sensitive: "Dieser Inhalt ist NSFW"
|
||||||
click-to-show: "Klicke zum den Inhalt anzusehen"
|
click-to-show: "Klicke zum den Inhalt anzusehen"
|
||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
|
theme: "Design"
|
||||||
light-theme: "Thema"
|
light-theme: "Thema"
|
||||||
dark-theme: "Thema während des Nachtmodus"
|
dark-theme: "Thema während des Nachtmodus"
|
||||||
light-themes: "Helles Thema"
|
light-themes: "Helles Thema"
|
||||||
dark-themes: "Dunkles Thema"
|
dark-themes: "Dunkles Thema"
|
||||||
|
install-a-theme: "Design wird installiert"
|
||||||
|
theme-code: "Design-Quelltext"
|
||||||
install: "Anwenden"
|
install: "Anwenden"
|
||||||
installed: "\"{}\" wurde installiert"
|
installed: "\"{}\" wurde installiert"
|
||||||
create-a-theme: "Thema erstellen"
|
create-a-theme: "Thema erstellen"
|
||||||
@@ -267,24 +425,39 @@ common/views/components/theme.vue:
|
|||||||
base-theme: "Basisthema"
|
base-theme: "Basisthema"
|
||||||
base-theme-light: "Hell"
|
base-theme-light: "Hell"
|
||||||
base-theme-dark: "Dunkel"
|
base-theme-dark: "Dunkel"
|
||||||
|
find-more-theme: "Mehr Designs finden"
|
||||||
theme-name: "Name des Themas"
|
theme-name: "Name des Themas"
|
||||||
preview-created-theme: "Vorschau"
|
preview-created-theme: "Vorschau"
|
||||||
invalid-theme: "Thema ist ungültig"
|
invalid-theme: "Thema ist ungültig"
|
||||||
already-installed: "Thema ist bereits installiert"
|
already-installed: "Thema ist bereits installiert"
|
||||||
|
saved: "Gespeichert"
|
||||||
|
manage-themes: "Designs verwalten"
|
||||||
|
builtin-themes: "Standard-Designs"
|
||||||
|
my-themes: "Meine Designs"
|
||||||
|
installed-themes: "Installierte Designs"
|
||||||
|
select-theme: "Design wählen"
|
||||||
|
uninstall: "Deinstallieren"
|
||||||
|
uninstalled: "„{}“ wurde deinstalliert"
|
||||||
author: "Autor"
|
author: "Autor"
|
||||||
desc: "Beschreibung"
|
desc: "Beschreibung"
|
||||||
export: "Exportieren"
|
export: "Exportieren"
|
||||||
import: "Importieren"
|
import: "Importieren"
|
||||||
|
import-by-code: "oder Quelltext einfügen"
|
||||||
|
theme-name-required: "Design-Name ist erforderlich"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
|
hide: "Ausblenden"
|
||||||
|
show: "Mehr"
|
||||||
|
chars: "{count} Zeichen"
|
||||||
|
files: "{count} Dateien"
|
||||||
poll: "Umfrage"
|
poll: "Umfrage"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Einen Nutzer suchen"
|
search-user: "Einen Nutzer suchen"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
no-history: "Keine Chronik"
|
no-history: "Keine Chronik"
|
||||||
|
user: "Benutzer"
|
||||||
|
group: "Gruppen"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "Keine Unterhaltungen"
|
|
||||||
no-history: "Keine weitere Chronik vorhanden"
|
no-history: "Keine weitere Chronik vorhanden"
|
||||||
resize-form: "Ziehen um die Größe zu verändern"
|
|
||||||
new-message: "Neue Nachricht"
|
new-message: "Neue Nachricht"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Nachricht hier eingeben"
|
input-message-here: "Nachricht hier eingeben"
|
||||||
@@ -304,12 +477,28 @@ common/views/components/nav.vue:
|
|||||||
develop: "Entwickler"
|
develop: "Entwickler"
|
||||||
feedback: "Feedback"
|
feedback: "Feedback"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
|
mention: "Erwähnungen"
|
||||||
|
detail: "Details"
|
||||||
|
copy-content: "Inhalt kopieren"
|
||||||
|
copy-link: "Link kopieren"
|
||||||
favorite: "Diesen Beitrag favorisieren"
|
favorite: "Diesen Beitrag favorisieren"
|
||||||
unfavorite: "Aus Favoriten entfernen"
|
unfavorite: "Aus Favoriten entfernen"
|
||||||
|
watch: "Beobachten"
|
||||||
|
unwatch: "Nicht mehr beobachten"
|
||||||
pin: "An die Profilseite pinnen"
|
pin: "An die Profilseite pinnen"
|
||||||
|
unpin: "Lösen"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
delete-confirm: "Diesen Beitrag löschen?"
|
delete-confirm: "Diesen Beitrag löschen?"
|
||||||
remote: "Auf Quelle anzeigen"
|
remote: "Auf Quelle anzeigen"
|
||||||
|
common/views/components/user-menu.vue:
|
||||||
|
mention: "Erwähnungen"
|
||||||
|
mute: "Stummschalten"
|
||||||
|
unmute: "Stummschaltung aufheben"
|
||||||
|
mute-confirm: "Bist du sicher, dass du diesen Nutzer stummschalten möchtest?"
|
||||||
|
unmute-confirm: "Stummschaltung für diesen Nutzer aufheben?"
|
||||||
|
block: "Sperren"
|
||||||
|
unblock: "Sperrung aufheben"
|
||||||
|
block-confirm: "Diesen Nutzer wirklich sperren?"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Stimme für '{}'"
|
vote-to: "Stimme für '{}'"
|
||||||
vote-count: "{} Stimmen"
|
vote-count: "{} Stimmen"
|
||||||
@@ -382,11 +571,20 @@ common/views/components/profile-editor.vue:
|
|||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
|
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
|
||||||
export: "Exportieren"
|
export: "Exportieren"
|
||||||
import: "Importieren"
|
import: "Importieren"
|
||||||
export-targets:
|
export-targets:
|
||||||
user-lists: "Listen"
|
user-lists: "Listen"
|
||||||
enter-password: "Bitte Passwort eingeben"
|
enter-password: "Bitte Passwort eingeben"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
invite: "Einladen"
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Listen"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
user-groups: "Gruppen"
|
||||||
|
owned-groups: "Meine Gruppen"
|
||||||
|
invites: "Einladen"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Laden"
|
fetching: "Laden"
|
||||||
no-broadcasts: "Keine Broadcasts"
|
no-broadcasts: "Keine Broadcasts"
|
||||||
@@ -396,6 +594,7 @@ common/views/widgets/photo-stream.vue:
|
|||||||
title: "Fotostream"
|
title: "Fotostream"
|
||||||
no-photos: "Keine Fotos"
|
no-photos: "Keine Fotos"
|
||||||
common/views/widgets/posts-monitor.vue:
|
common/views/widgets/posts-monitor.vue:
|
||||||
|
title: "Beitrags-Aktivität"
|
||||||
toggle: "Sicht umschalten"
|
toggle: "Sicht umschalten"
|
||||||
common/views/widgets/server.vue:
|
common/views/widgets/server.vue:
|
||||||
title: "Serverinformationen"
|
title: "Serverinformationen"
|
||||||
@@ -406,6 +605,7 @@ common/views/widgets/memo.vue:
|
|||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
desktop:
|
desktop:
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Schwarz ... komplett"
|
total: "Schwarz ... komplett"
|
||||||
notes: "Blau ... Hinweise"
|
notes: "Blau ... Hinweise"
|
||||||
@@ -440,7 +640,6 @@ desktop/views/components/drive.file.vue:
|
|||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
copy-url: "URL kopieren"
|
copy-url: "URL kopieren"
|
||||||
download: "Download"
|
download: "Download"
|
||||||
else-files: "Anderes…"
|
|
||||||
set-as-avatar: "Als Avatar festlegen"
|
set-as-avatar: "Als Avatar festlegen"
|
||||||
set-as-banner: "Setze als Banner"
|
set-as-banner: "Setze als Banner"
|
||||||
open-in-app: "In der App öffnen"
|
open-in-app: "In der App öffnen"
|
||||||
@@ -483,7 +682,7 @@ desktop/views/components/followers.vue:
|
|||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "Du folgst niemanden"
|
empty: "Du folgst niemanden"
|
||||||
desktop/views/components/home.vue:
|
desktop/views/components/home.vue:
|
||||||
done: "Verbunden"
|
done: "Beenden"
|
||||||
add-widget: "Widget hinzufügen:"
|
add-widget: "Widget hinzufügen:"
|
||||||
add: "Hinzufügen"
|
add: "Hinzufügen"
|
||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
@@ -497,7 +696,8 @@ desktop/views/components/note-detail.vue:
|
|||||||
add-reaction: "Reaktion hinzufügen"
|
add-reaction: "Reaktion hinzufügen"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
renote: "Anmerken"
|
renote: "Anmerkung"
|
||||||
|
detail: "Details"
|
||||||
private: "Dieser Beitrag ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
@@ -506,27 +706,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Keine Benachrichtigungen"
|
empty: "Keine Benachrichtigungen"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Nutzer hinzufügen"
|
|
||||||
hide-contents: "Inhalt verstecken"
|
|
||||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
|
||||||
quote-placeholder: "Zitiere diese Anmerkung..."
|
|
||||||
submit: "Abschicken"
|
|
||||||
reply: "Antworten"
|
|
||||||
renote: "Anmerken"
|
|
||||||
posted: "Gepostet!"
|
posted: "Gepostet!"
|
||||||
replied: "Geantwortet!"
|
replied: "Geantwortet!"
|
||||||
reposted: "Weitergesagt!"
|
reposted: "Weitergesagt!"
|
||||||
note-failed: "Anmerkung fehlgeschlagen"
|
note-failed: "Anmerkung fehlgeschlagen"
|
||||||
reply-failed: "Antwort fehlgeschlagen"
|
reply-failed: "Antwort fehlgeschlagen"
|
||||||
renote-failed: "Anmerkung fehlgeschlagen"
|
renote-failed: "Anmerkung fehlgeschlagen"
|
||||||
posting: "Posting"
|
|
||||||
attach-media-from-local: "Medien von deinem PC hinzufügen"
|
|
||||||
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
|
|
||||||
create-poll: "Eine Abstimmung erstellen"
|
|
||||||
text-remain: "{} Zeichen verbleibend"
|
|
||||||
visibility: "Sichtbarkeit"
|
|
||||||
error: "Fehler"
|
|
||||||
enter-username: "Bitte gib einen Benutzernamen ein..."
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Neuer Beitrag"
|
note: "Neuer Beitrag"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
@@ -576,6 +761,7 @@ desktop/views/components/timeline.vue:
|
|||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Dein Profil"
|
profile: "Dein Profil"
|
||||||
lists: "Listen"
|
lists: "Listen"
|
||||||
|
groups: "Gruppen"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "Spielen"
|
game: "Spielen"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
@@ -584,17 +770,19 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Einen neuen Post erstellen"
|
post: "Einen neuen Post erstellen"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Suchen"
|
placeholder: "Suchen"
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "Listen"
|
|
||||||
desktop/views/components/users-list.vue:
|
desktop/views/components/users-list.vue:
|
||||||
fetching: "Lade…"
|
fetching: "Lade…"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
|
details: "Details"
|
||||||
remove-report: "Löschen"
|
remove-report: "Löschen"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
|
recaptcha-preview: "Vorschau"
|
||||||
invite: "Einladen"
|
invite: "Einladen"
|
||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
|
saved: "Gespeichert"
|
||||||
|
test-email: "Test"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
@@ -602,9 +790,8 @@ admin/views/drive.vue:
|
|||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Benutzername"
|
||||||
users:
|
users:
|
||||||
state:
|
|
||||||
verified: "Verifizierter Benutzer"
|
|
||||||
origin:
|
origin:
|
||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
@@ -616,8 +803,10 @@ admin/views/announcements.vue:
|
|||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
remove: "Löschen"
|
remove: "Löschen"
|
||||||
add: "Hinzufügen"
|
add: "Hinzufügen"
|
||||||
|
saved: "Gespeichert"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
status: "Status"
|
status: "Status"
|
||||||
|
save: "Speichern"
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
prev: "Vorheriger Kommentar"
|
prev: "Vorheriger Kommentar"
|
||||||
next: "Nächster Kommentar"
|
next: "Nächster Kommentar"
|
||||||
@@ -662,10 +851,6 @@ mobile/views/components/note-detail.vue:
|
|||||||
location: "Ort"
|
location: "Ort"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Keine Benachrichtigungen"
|
empty: "Keine Benachrichtigungen"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
reply: "Antworten"
|
|
||||||
renote: "Anmerken"
|
|
||||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Dieser Beitrag ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
@@ -674,14 +859,13 @@ mobile/views/components/ui.nav.vue:
|
|||||||
notifications: "Benachrichtigungen"
|
notifications: "Benachrichtigungen"
|
||||||
search: "Suchen"
|
search: "Suchen"
|
||||||
user-lists: "Listen"
|
user-lists: "Listen"
|
||||||
|
user-groups: "Gruppen"
|
||||||
game: "Spielen"
|
game: "Spielen"
|
||||||
about: "Über"
|
about: "Über"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
contextmenu:
|
contextmenu:
|
||||||
upload: "Eine Datei hochladen"
|
upload: "Eine Datei hochladen"
|
||||||
create-folder: "Ein Verzeichnis erstellen"
|
create-folder: "Ein Verzeichnis erstellen"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "Listen"
|
|
||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "Home"
|
home: "Home"
|
||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
@@ -696,6 +880,8 @@ mobile/views/pages/note.vue:
|
|||||||
next: "Nächster Kommentar"
|
next: "Nächster Kommentar"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Suchen"
|
search: "Suchen"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Benachrichtigungen"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
activity: "Aktivität"
|
activity: "Aktivität"
|
||||||
keywords: "Schlagwörter"
|
keywords: "Schlagwörter"
|
||||||
@@ -718,25 +904,6 @@ deck/deck.user-column.vue:
|
|||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Hast Du einen Fehler gefunden oder Lust, diese Dokumentation zu verbessern?"
|
edit-this-page-on-github: "Hast Du einen Fehler gefunden oder Lust, diese Dokumentation zu verbessern?"
|
||||||
edit-this-page-on-github-link: "Seite auf GitHub bearbeiten!"
|
edit-this-page-on-github-link: "Seite auf GitHub bearbeiten!"
|
||||||
api:
|
|
||||||
entities:
|
|
||||||
properties: "Eigenschaften"
|
|
||||||
endpoints:
|
|
||||||
params: "Parameter"
|
|
||||||
no-params: "Keine Parameter."
|
|
||||||
res: "Antwort"
|
|
||||||
require-credential: "Dieser Endpunkt erfordert eine Authentifizierung."
|
|
||||||
require-permission: "Dieser Endpunkt erfordert die {permission} Berechtigung."
|
|
||||||
has-limit: "Es gibt eine Ratenbegrenzung."
|
|
||||||
duration-limit: "Es sind maximal {max} Anfragen pro {duration} Millisekunden möglich."
|
|
||||||
min-interval-limit: "Es ist nur eine Anfrage alle {interval} Millisekunden möglich."
|
|
||||||
show-src: "Quellcode anzeigen."
|
|
||||||
show-src-link: "Quellcode auf GitHub anzeigen"
|
|
||||||
generated: "Dieses Dokument wird automatisch anhand der API-Definition generiert."
|
|
||||||
props:
|
|
||||||
name: "Name"
|
|
||||||
type: "Typ"
|
|
||||||
description: "Beschreibung"
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Anwendungen verwalten"
|
manage-apps: "Anwendungen verwalten"
|
||||||
dev/views/apps.vue:
|
dev/views/apps.vue:
|
||||||
@@ -753,3 +920,33 @@ dev/views/new-app.vue:
|
|||||||
authority: "Berechtigungen"
|
authority: "Berechtigungen"
|
||||||
authority-desc: "Nur die hier eingetragenen Berechtigungen, werden per API zur Verfügung stehen."
|
authority-desc: "Nur die hier eingetragenen Berechtigungen, werden per API zur Verfügung stehen."
|
||||||
authority-warning: "Dies kann auch nach dem erstellen der Anwendung geändert werden, allerdings werden dann alle bisher generierten Token ungültig."
|
authority-warning: "Dies kann auch nach dem erstellen der Anwendung geändert werden, allerdings werden dann alle bisher generierten Token ungültig."
|
||||||
|
pages:
|
||||||
|
pin-this-page: "An die Profilseite pinnen"
|
||||||
|
unpin-this-page: "Lösen"
|
||||||
|
like: "Gefällt mir"
|
||||||
|
blocks:
|
||||||
|
post: "\"Neuer Beitrag\"-Formular"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
random: "Zufällige Auswahl"
|
||||||
|
list: "Listen"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "Listen"
|
||||||
|
random: "Zufällige Auswahl"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Listen"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Listen"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Listen"
|
||||||
|
_pick:
|
||||||
|
arg1: "Listen"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listen"
|
||||||
|
types:
|
||||||
|
array: "Listen"
|
||||||
|
room:
|
||||||
|
save: "Speichern"
|
||||||
|
furnitures:
|
||||||
|
moon: "Mo"
|
||||||
|
|||||||
@@ -30,10 +30,25 @@ common:
|
|||||||
customize-home: "Customize home layout"
|
customize-home: "Customize home layout"
|
||||||
featured-notes: "Featured notes"
|
featured-notes: "Featured notes"
|
||||||
dark-mode: "Dark Mode"
|
dark-mode: "Dark Mode"
|
||||||
signin: "Log In"
|
signin: "Login"
|
||||||
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 fediverse"
|
||||||
|
unfollow-confirm: "Do you want to unfollow {name}?"
|
||||||
|
delete-confirm: "Are you sure you want to delete this post?"
|
||||||
|
signin-required: "Please login"
|
||||||
|
notification-type: "Notification Type"
|
||||||
|
notification-types:
|
||||||
|
all: "All"
|
||||||
|
pollVote: "Votes"
|
||||||
|
follow: "Following"
|
||||||
|
receiveFollowRequest: "Follow requests"
|
||||||
|
reply: "Reply"
|
||||||
|
quote: "Quote"
|
||||||
|
renote: "Renote"
|
||||||
|
mention: "Mentions"
|
||||||
|
reaction: "Reaction"
|
||||||
got-it: "Got it!"
|
got-it: "Got it!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
@@ -61,6 +76,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"
|
||||||
@@ -93,6 +109,34 @@ common:
|
|||||||
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"
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "Attach location information"
|
||||||
|
hide-contents: "Hide contents"
|
||||||
|
reply-placeholder: "Reply to this post..."
|
||||||
|
quote-placeholder: "Quote this Post..."
|
||||||
|
option-quote-placeholder: "Quote this post... (optional)"
|
||||||
|
quote-attached: "Quoted"
|
||||||
|
quote-question: "Do you want to append a quote?"
|
||||||
|
submit: "Post"
|
||||||
|
reply: "Reply"
|
||||||
|
renote: "Renote"
|
||||||
|
posting: "Posting"
|
||||||
|
attach-media-from-local: "Attach media from your device"
|
||||||
|
attach-media-from-drive: "Attach media from your Drive"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "Create a poll"
|
||||||
|
text-remain: "{} characters remaining"
|
||||||
|
recent-tags: "Recent"
|
||||||
|
local-only-message: "This post will only be published locally"
|
||||||
|
click-to-tagging: "Click to tagging"
|
||||||
|
visibility: "Visibility"
|
||||||
|
geolocation-alert: "Your device does not provide location services"
|
||||||
|
error: "Error"
|
||||||
|
enter-username: "Please enter username"
|
||||||
|
add-visible-user: "Add a user"
|
||||||
|
cw-placeholder: "Comments for the post (optional)"
|
||||||
|
username-prompt: "Please enter username"
|
||||||
|
enter-file-name: "Edit file name"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "S"
|
sunday: "S"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -159,6 +203,11 @@ common:
|
|||||||
remember-note-visibility: "Remember post visibility"
|
remember-note-visibility: "Remember post visibility"
|
||||||
web-search-engine: "Web search engine"
|
web-search-engine: "Web search engine"
|
||||||
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "Paste"
|
||||||
|
pasted-file-name: "Template for pasted file name"
|
||||||
|
pasted-file-name-desc: "Example: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "Edit the pasted file name"
|
||||||
|
paste-dialog-desc: "Display a dialog to edit the file name when you paste a file."
|
||||||
keep-cw: "Preserve content warning"
|
keep-cw: "Preserve content warning"
|
||||||
keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post."
|
keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post."
|
||||||
i-like-sushi: "I prefer sushi rather than pudding"
|
i-like-sushi: "I prefer sushi rather than pudding"
|
||||||
@@ -166,6 +215,7 @@ common:
|
|||||||
use-avatar-reversi-stones: "Use avatar as a stone in reversi"
|
use-avatar-reversi-stones: "Use avatar as a stone in reversi"
|
||||||
disable-animated-mfm: "Disable animated texts in a post"
|
disable-animated-mfm: "Disable animated texts in a post"
|
||||||
disable-showing-animated-images: "Do not play animated images"
|
disable-showing-animated-images: "Do not play animated images"
|
||||||
|
enable-quick-notification-view: "Enable Quick Notification View"
|
||||||
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
||||||
always-show-nsfw: "Always show NSFW contents"
|
always-show-nsfw: "Always show NSFW contents"
|
||||||
always-mark-nsfw: "Always mark posts with media attachments as NSFW"
|
always-mark-nsfw: "Always mark posts with media attachments as NSFW"
|
||||||
@@ -241,6 +291,11 @@ common:
|
|||||||
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
||||||
load-raw-images: "Show attached images in original quality"
|
load-raw-images: "Show attached images in original quality"
|
||||||
load-remote-media: "Show media from a remote server"
|
load-remote-media: "Show media from a remote server"
|
||||||
|
sync: "Sync"
|
||||||
|
save: "Save"
|
||||||
|
saved: "Saved"
|
||||||
|
home-profile: "Home profile"
|
||||||
|
deck-profile: "Deck profile"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
@@ -249,9 +304,9 @@ common:
|
|||||||
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: "Please enter username"
|
||||||
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."
|
||||||
@@ -317,7 +372,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: "Official accounts"
|
pinned-users: "Pinned 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"
|
||||||
@@ -447,18 +502,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"
|
||||||
@@ -471,6 +531,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"
|
||||||
@@ -484,7 +545,10 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "Unpin"
|
unpin: "Unpin"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
delete-confirm: "Are you sure you want to delete this post?"
|
delete-confirm: "Are you sure you want to delete this post?"
|
||||||
|
delete-and-edit: "Delete and Edit"
|
||||||
|
delete-and-edit-confirm: "Are you sure you want to delete this note and edit it? You will lose all reactions, renotes and replies to it."
|
||||||
remote: "Show original note"
|
remote: "Show original note"
|
||||||
|
pin-limit-exceeded: "You can't pin any more posts."
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "Mention"
|
mention: "Mention"
|
||||||
mute: "Mute"
|
mute: "Mute"
|
||||||
@@ -542,6 +606,7 @@ common/views/components/poll-editor.vue:
|
|||||||
day: "S"
|
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"
|
||||||
@@ -552,6 +617,14 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objects"
|
objects: "Objects"
|
||||||
symbols: "Symbols"
|
symbols: "Symbols"
|
||||||
flags: "Flags"
|
flags: "Flags"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "Mode"
|
||||||
|
intro: "You can specify whether you want to use the desktop, or the mobile layout."
|
||||||
|
choices:
|
||||||
|
auto: "Choose layout automatically"
|
||||||
|
desktop: "Always use the desktop layout"
|
||||||
|
mobile: "Always use the mobile layout"
|
||||||
|
info: "You need to reload the page for the changes to take effect."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Username"
|
username: "Username"
|
||||||
password: "Password"
|
password: "Password"
|
||||||
@@ -561,7 +634,9 @@ 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: "Logging in has failed. Make sure you have entered the correct username and password."
|
login-failed: "Unable to log in. The username or password you entered is incorrect."
|
||||||
|
tap-key: "Click on the Security Key to log in"
|
||||||
|
enter-2fa-code: "Enter your verification code"
|
||||||
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>."
|
||||||
@@ -583,6 +658,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:
|
||||||
@@ -651,7 +728,7 @@ common/views/components/profile-editor.vue:
|
|||||||
you-can-include-hashtags: "You can also include hashtags in your profile description."
|
you-can-include-hashtags: "You can also include hashtags in your profile description."
|
||||||
language: "Language"
|
language: "Language"
|
||||||
birthday: "Birthday"
|
birthday: "Birthday"
|
||||||
avatar: "Icon"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
is-cat: "This account is a Cat"
|
is-cat: "This account is a Cat"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
@@ -664,6 +741,9 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Profile updated successfully"
|
saved: "Profile updated successfully"
|
||||||
uploading: "Uploading"
|
uploading: "Uploading"
|
||||||
upload-failed: "Failed to upload"
|
upload-failed: "Failed to upload"
|
||||||
|
unable-to-process: "The operation could not be completed."
|
||||||
|
avatar-not-an-image: "The file specified as an avatar is not an image"
|
||||||
|
banner-not-an-image: "The file specified as a banner is not an image"
|
||||||
email: "Email settings"
|
email: "Email settings"
|
||||||
email-address: "Email Address"
|
email-address: "Email Address"
|
||||||
email-verified: "Your email has been verified."
|
email-verified: "Your email has been verified."
|
||||||
@@ -683,6 +763,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "Cautious options"
|
danger-zone: "Cautious options"
|
||||||
delete-account: "Remove the account"
|
delete-account: "Remove the account"
|
||||||
account-deleted: "The account has been deleted. It may take some time until all of the data disappears."
|
account-deleted: "The account has been deleted. It may take some time until all of the data disappears."
|
||||||
|
profile-metadata: "Profile metadata"
|
||||||
|
metadata-label: "Label"
|
||||||
|
metadata-content: "Content"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "User"
|
users: "User"
|
||||||
rename: "Rename list"
|
rename: "Rename list"
|
||||||
@@ -690,9 +773,32 @@ 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?"
|
||||||
|
transferred: "Group transferred"
|
||||||
|
remove-user: "Remove a user from this group"
|
||||||
|
delete-are-you-sure: "Are you sure to delete group \"$1\"?"
|
||||||
|
deleted: "Deleted"
|
||||||
|
invite: "Invite"
|
||||||
|
invited: "The invitation was successfully sent"
|
||||||
common/views/components/user-lists.vue:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Lists"
|
||||||
create-list: "Create a list"
|
create-list: "Create a list"
|
||||||
list-name: "List name"
|
list-name: "List name"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
user-groups: "Groups"
|
||||||
|
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"
|
||||||
@@ -754,6 +860,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"
|
||||||
@@ -765,12 +875,13 @@ desktop:
|
|||||||
uploading-avatar: "Uploading a new avatar"
|
uploading-avatar: "Uploading a new avatar"
|
||||||
avatar-updated: "Successfully updated the avatar"
|
avatar-updated: "Successfully updated the avatar"
|
||||||
choose-avatar: "Select an image for the avatar"
|
choose-avatar: "Select an image for the avatar"
|
||||||
|
unable-to-process: "The operation could not be completed."
|
||||||
invalid-filetype: "This filetype is not acceptable here"
|
invalid-filetype: "This filetype is not acceptable here"
|
||||||
desktop/views/components/activity.chart.vue:
|
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"
|
||||||
@@ -805,7 +916,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "Unmark as 'sensitive'"
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
copy-url: "Copy URL"
|
copy-url: "Copy URL"
|
||||||
download: "Download"
|
download: "Download"
|
||||||
else-files: "Others"
|
else-files: "Other"
|
||||||
set-as-avatar: "Set as an avatar"
|
set-as-avatar: "Set as an avatar"
|
||||||
set-as-banner: "Set as a banner"
|
set-as-banner: "Set as a banner"
|
||||||
open-in-app: "Open in app"
|
open-in-app: "Open in app"
|
||||||
@@ -815,15 +926,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied: "Copied"
|
copied: "Copied"
|
||||||
copied-url-to-clipboard: "URL has been copied to clipboard"
|
copied-url-to-clipboard: "URL has been copied to clipboard"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "Default Upload location"
|
||||||
unable-to-process: "The operation could not be completed."
|
unable-to-process: "The operation could not be completed."
|
||||||
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
|
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
|
||||||
unhandled-error: "Unknown error"
|
unhandled-error: "Unknown error"
|
||||||
|
unable-to-delete: "Unable to delete"
|
||||||
|
has-child-files-or-folders: "Since this folder is not empty, it can not be deleted."
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "Move to this folder"
|
move-to-this-folder: "Move to this folder"
|
||||||
show-in-new-window: "Open in new window"
|
show-in-new-window: "Open in new window"
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
rename-folder: "Rename folder"
|
rename-folder: "Rename folder"
|
||||||
input-new-folder-name: "Enter new name"
|
input-new-folder-name: "Enter new name"
|
||||||
|
else-folders: "Other"
|
||||||
|
set-as-upload-folder: "Set as default upload folder"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Search"
|
search: "Search"
|
||||||
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
|
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
|
||||||
@@ -867,7 +983,7 @@ 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:
|
||||||
@@ -884,34 +1000,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "No notifications!"
|
empty: "No notifications!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Add a user"
|
|
||||||
attach-location-information: "Attach location information"
|
|
||||||
hide-contents: "Hide contents"
|
|
||||||
reply-placeholder: "Reply to this post..."
|
|
||||||
quote-placeholder: "Quote this Post..."
|
|
||||||
submit: "Post"
|
|
||||||
reply: "Reply"
|
|
||||||
renote: "Repost"
|
|
||||||
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"
|
|
||||||
attach-media-from-local: "Attach media from your device"
|
|
||||||
attach-media-from-drive: "Attach media from your Drive"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Create a poll"
|
|
||||||
text-remain: "{} characters remaining"
|
|
||||||
recent-tags: "Recent"
|
|
||||||
local-only-message: "This post will only be published locally"
|
|
||||||
click-to-tagging: "Click to tagging"
|
|
||||||
visibility: "Visibility"
|
|
||||||
geolocation-alert: "Your device does not provide location services."
|
|
||||||
error: "Error"
|
|
||||||
enter-username: "Please enter a username..."
|
|
||||||
annotations: "Annotations for the post (optional)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "New Post"
|
note: "New Post"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
@@ -922,13 +1016,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 +1045,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Settings saved!"
|
success: "Settings saved!"
|
||||||
failed: "Failed to setup. Please ensure that the token is correct."
|
failed: "Failed to setup. Please ensure that the token is correct."
|
||||||
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
|
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
|
||||||
|
totp-header: "Authenticator App"
|
||||||
|
security-key-header: "Security Key"
|
||||||
|
security-key: "For additional security, you can log in to your account using a hardware Security Key that supports FIDO2. When you then sign in, you'll need the registered Security Key, or an authenticator app with you."
|
||||||
|
last-used: "Last used:"
|
||||||
|
activate-key: "Click to activate the Security Key"
|
||||||
|
security-key-name: "Name the Key"
|
||||||
|
register-security-key: "Complete Key registration"
|
||||||
|
something-went-wrong: "Wow! There was a problem registering the Key:"
|
||||||
|
key-unregistered: "The Key has been deleted"
|
||||||
|
use-password-less-login: "Use Password-less login"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
click-to-show: "Click to show"
|
click-to-show: "Click to show"
|
||||||
@@ -975,6 +1079,9 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "Max"
|
max: "Max"
|
||||||
in-use: "In use"
|
in-use: "In use"
|
||||||
stats: "Statistics"
|
stats: "Statistics"
|
||||||
|
default-upload-folder: "Default upload folder location"
|
||||||
|
default-upload-folder-name: "Folder(s)"
|
||||||
|
change-default-upload-folder: "Change folder"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "Mute / Block"
|
mute-and-block: "Mute / Block"
|
||||||
mute: "Mute"
|
mute: "Mute"
|
||||||
@@ -1025,6 +1132,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: "Groups"
|
||||||
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:
|
||||||
@@ -1035,12 +1143,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"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Posts"
|
notes: "Posts"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
@@ -1062,11 +1164,16 @@ 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"
|
logs: "Logs"
|
||||||
|
db: "Database"
|
||||||
back-to-misskey: "Back to Misskey"
|
back-to-misskey: "Back to Misskey"
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "Tables"
|
||||||
|
vacuum: "Vacuum"
|
||||||
|
vacuum-info: "Tidies up the database. Keeps the data intact and reduces disk usage. This is usually done automatically and periodically."
|
||||||
|
vacuum-exclamation: "Vacuuming can overload the database for a while, and cause users not to be able to participate in interactions."
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
accounts: "Accounts"
|
accounts: "Accounts"
|
||||||
@@ -1078,6 +1185,32 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "Queue"
|
title: "Queue"
|
||||||
remove-all-jobs: "Clear all queued jobs"
|
remove-all-jobs: "Clear all queued jobs"
|
||||||
|
jobs: "Jobs"
|
||||||
|
queue: "Queue"
|
||||||
|
domains:
|
||||||
|
deliver: "Delivers"
|
||||||
|
inbox: "Received"
|
||||||
|
db: "Database"
|
||||||
|
objectStorage: "Object Storage"
|
||||||
|
state: "Sort"
|
||||||
|
states:
|
||||||
|
active: "Running"
|
||||||
|
delayed: "Scheduled"
|
||||||
|
waiting: "Queued"
|
||||||
|
result-is-truncated: "Result is truncated"
|
||||||
|
other-queues: "Other queues"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Logs"
|
||||||
|
domain: "Domain"
|
||||||
|
level: "Level"
|
||||||
|
levels:
|
||||||
|
all: "All"
|
||||||
|
info: "Information"
|
||||||
|
success: "Success"
|
||||||
|
warning: "Warning"
|
||||||
|
error: "Error"
|
||||||
|
debug: "Debug"
|
||||||
|
delete-all: "Remove All"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abuse"
|
title: "Abuse"
|
||||||
target: "Target"
|
target: "Target"
|
||||||
@@ -1089,14 +1222,34 @@ 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"
|
||||||
|
note-and-tl: "Notes and timelines"
|
||||||
drive-config: "Drive settings"
|
drive-config: "Drive settings"
|
||||||
|
use-object-storage: "Use Object Storage"
|
||||||
|
object-storage-base-url: "URL"
|
||||||
|
object-storage-bucket: "Bucket Name"
|
||||||
|
object-storage-prefix: "Prefix"
|
||||||
|
object-storage-endpoint: "Endpoint"
|
||||||
|
object-storage-region: "Region"
|
||||||
|
object-storage-port: "Port"
|
||||||
|
object-storage-access-key: "Access Key"
|
||||||
|
object-storage-secret-key: "Secret Key"
|
||||||
|
object-storage-use-ssl: "Use SSL"
|
||||||
|
object-storage-s3-info: "If you are going to use Amazon S3 as Object Storage, Please refer {0} to configure 'Endpoint' and 'Region'."
|
||||||
|
object-storage-s3-info-here: "here"
|
||||||
|
object-storage-gcs-info: "If you are going to use Google Cloud Storage as Object Storage, Set the 'Endpoint' as storage.googleapis.com, and keep the 'Region' is blank."
|
||||||
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"
|
||||||
@@ -1104,9 +1257,14 @@ admin/views/instance.vue:
|
|||||||
mb: "In megabytes"
|
mb: "In megabytes"
|
||||||
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/"
|
||||||
|
recaptcha-info2: "v3 is not supported. Please use v2."
|
||||||
enable-recaptcha: "enable reCAPTCHA"
|
enable-recaptcha: "enable reCAPTCHA"
|
||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "Site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "Secret Key"
|
||||||
|
recaptcha-preview: "Preview"
|
||||||
|
hidden-tags: "Hidden hashtags"
|
||||||
|
hidden-tags-info: "List up the hashtags delimited by line breaks that you want exclude from statistics."
|
||||||
|
external-service-integration-config: "Connect an external service"
|
||||||
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"
|
||||||
@@ -1137,7 +1295,8 @@ admin/views/instance.vue:
|
|||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
user-recommendation-config: "Recommended users"
|
pinned-users: "Pinned user"
|
||||||
|
pinned-users-info: "List up the users delimited by line breaks that you want to show as 'Pinned Users'."
|
||||||
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"
|
||||||
@@ -1149,6 +1308,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "Perform SMTP authentication"
|
smtp-auth: "Perform SMTP authentication"
|
||||||
smtp-user: "SMTP User"
|
smtp-user: "SMTP User"
|
||||||
smtp-pass: "SMTP Password"
|
smtp-pass: "SMTP Password"
|
||||||
|
test-email: "Test"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "Enable ServiceWorker"
|
enable-serviceworker: "Enable ServiceWorker"
|
||||||
serviceworker-info: "Must be enabled for push notifications."
|
serviceworker-info: "Must be enabled for push notifications."
|
||||||
@@ -1203,6 +1363,9 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "Unmark as 'sensitive'"
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
marked-as-sensitive: "Set a sensitive content notice"
|
marked-as-sensitive: "Set a sensitive content notice"
|
||||||
unmarked-as-sensitive: "Remove the sensitive content notice"
|
unmarked-as-sensitive: "Remove the sensitive content notice"
|
||||||
|
clean-remote-files: "Clear the remote files cache"
|
||||||
|
clean-remote-files-are-you-sure: "Are you sure you want to remove all cached files from remote?"
|
||||||
|
clean-up: "Clean up"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "Operations"
|
operation: "Operations"
|
||||||
username-or-userid: "Username or user ID"
|
username-or-userid: "Username or user ID"
|
||||||
@@ -1221,14 +1384,12 @@ admin/views/users.vue:
|
|||||||
silence-confirm: "Silence user?"
|
silence-confirm: "Silence user?"
|
||||||
unmake-silence: "Unsilence"
|
unmake-silence: "Unsilence"
|
||||||
unsilence-confirm: "Are you certain that you want to stop silencing this user?"
|
unsilence-confirm: "Are you certain that you want to stop silencing this user?"
|
||||||
verify: "Verify account"
|
|
||||||
verify-confirm: "Do you want this to be a verified account?"
|
|
||||||
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?"
|
||||||
|
username: "Username"
|
||||||
|
host: "Host"
|
||||||
users:
|
users:
|
||||||
title: "Users"
|
title: "Users"
|
||||||
sort:
|
sort:
|
||||||
@@ -1243,7 +1404,6 @@ admin/views/users.vue:
|
|||||||
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:
|
||||||
@@ -1260,6 +1420,12 @@ admin/views/moderators.vue:
|
|||||||
added: "Registered a Moderator."
|
added: "Registered a Moderator."
|
||||||
remove: "Discharge"
|
remove: "Discharge"
|
||||||
removed: "The moderator has been discharged"
|
removed: "The moderator has been discharged"
|
||||||
|
logs:
|
||||||
|
title: "Logs"
|
||||||
|
moderator: "Moderators"
|
||||||
|
type: "Operations"
|
||||||
|
at: "Timestamp"
|
||||||
|
info: "Information"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "Add emoji"
|
title: "Add emoji"
|
||||||
@@ -1305,6 +1471,7 @@ admin/views/federation.vue:
|
|||||||
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"
|
||||||
@@ -1351,6 +1518,9 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "Hourly"
|
hour: "Hourly"
|
||||||
day: "Daily"
|
day: "Daily"
|
||||||
|
blocked-hosts: "Blocking"
|
||||||
|
blocked-hosts-info: "List up the hosts delimited by line breaks that you want to block."
|
||||||
|
save: "Save"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "More details..."
|
about: "More details..."
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
@@ -1482,17 +1652,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "No notifications"
|
empty: "No notifications"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Add a user"
|
|
||||||
submit: "Post"
|
|
||||||
reply: "Reply"
|
|
||||||
renote: "Renote"
|
|
||||||
quote-placeholder: "Quote this post... (optional)"
|
|
||||||
reply-placeholder: "Reply to this note..."
|
|
||||||
cw-placeholder: "Comments for the post (optional)"
|
|
||||||
geolocation-alert: "Your device does not provide location services."
|
|
||||||
error: "Error"
|
|
||||||
username-prompt: "Enter user name"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/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"
|
||||||
@@ -1507,6 +1666,7 @@ 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: "Groups"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
game: "Games"
|
game: "Games"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
@@ -1519,8 +1679,6 @@ mobile/views/pages/drive.vue:
|
|||||||
rename-folder: "Rename folder"
|
rename-folder: "Rename folder"
|
||||||
move-folder: "Move this folder"
|
move-folder: "Move this folder"
|
||||||
delete-folder: "Delete this folder"
|
delete-folder: "Delete this folder"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "Lists"
|
|
||||||
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:
|
||||||
@@ -1545,10 +1703,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"
|
||||||
@@ -1560,6 +1714,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "No posts were found for '{q}'"
|
not-found: "No posts were found for '{q}'"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Choose files"
|
select-file: "Choose files"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notifications"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Signed in as {}"
|
signed-in-as: "Signed in as {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1618,28 +1774,10 @@ deck/deck.user-column.vue:
|
|||||||
activity: "Activity"
|
activity: "Activity"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
pinned-notes: "Pinned posts"
|
pinned-notes: "Pinned posts"
|
||||||
|
pinned-page: "Pinned page"
|
||||||
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:
|
||||||
@@ -1648,13 +1786,296 @@ dev/views/apps.vue:
|
|||||||
app-missing: "No apps"
|
app-missing: "No apps"
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
new-app: "New Application"
|
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-overview: "Application summary"
|
app-overview: "Application summary"
|
||||||
|
app-overview-placeholder: " ex) Misskey iOS Client."
|
||||||
app-overview-desc: "A brief description, or an introduction of your app."
|
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."
|
||||||
|
pages:
|
||||||
|
new-page: "Create a page"
|
||||||
|
edit-page: "Edit a page"
|
||||||
|
read-page: "Viewing the source"
|
||||||
|
page-created: "Created the page!"
|
||||||
|
page-updated: "Updated the page"
|
||||||
|
are-you-sure-delete: "Do you want to delete this page?"
|
||||||
|
page-deleted: "The page has been deleted"
|
||||||
|
edit-this-page: "Edit this page"
|
||||||
|
pin-this-page: "Pin to your profile"
|
||||||
|
unpin-this-page: "Unpin"
|
||||||
|
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"
|
||||||
|
variables-info: "You can make your page more dynamic by using variables. If you write down <b>{ variable name }</b> in the text, you can embed the value of the variable there. For example, if the source text is <b>Hello { thing } world!</b> and the value of variable 'thing' is <b> ai </b>, that text becomes to <b>Hello ai world!</b>."
|
||||||
|
variables-info2: "Because the evaluation(=calculating) of variables are performed from top to bottom, the variable cannot refer another variable which exists on later line. For example, when defining three variables <b>A</b>, <b>B</b> and <b>C</b>, variable <b>C</b> <i>can</i> refer the variable <b>A</b> and <b>B</b> in its expression, but variable <b>A</b> <i>cannot</i> refer the variable <b>B</b> or <b>C</b> in its expression."
|
||||||
|
variables-info3: "If you want to get some input from the user, place a 'User Input' block on the page and set the variable name as which you want to store that input in 'variable name' (variables are created automatically). You can use that variable to perform actions in response to user's input."
|
||||||
|
variables-info4: "Function allows make your processing logic as group in a reusable way. To create a function, create a variable of type 'Function'. A function can have a slot (Argument) whose value is available as a variable in the function. There are also functions that take functions as arguments in the AiScript standard (called the higher-order function.). In addition to the predefined functions, you can also set them in the slots of such higher-order functions on the fly."
|
||||||
|
more-details: "Description"
|
||||||
|
title: "Title"
|
||||||
|
url: "Page URL"
|
||||||
|
summary: "Summary of page"
|
||||||
|
align-center: "Center align"
|
||||||
|
hide-title-when-pinned: "Hide page title when pinned to profile"
|
||||||
|
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"
|
||||||
|
colored: "Color"
|
||||||
|
action: "Operation when the button pressed"
|
||||||
|
_action:
|
||||||
|
dialog: "Show a dialog"
|
||||||
|
_dialog:
|
||||||
|
content: "Content"
|
||||||
|
resetRandom: "Reset a random number"
|
||||||
|
pushEvent: "Send an event"
|
||||||
|
_pushEvent:
|
||||||
|
event: "Name of the event"
|
||||||
|
message: "Message to display when pressed"
|
||||||
|
variable: "Variable to send"
|
||||||
|
no-variable: "None"
|
||||||
|
radioButton: "Choices"
|
||||||
|
_radioButton:
|
||||||
|
name: "Variable name"
|
||||||
|
title: "Title"
|
||||||
|
values: "Item of choices that delimited by line breaks"
|
||||||
|
default: "Default value"
|
||||||
|
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: "Text Concatenation"
|
||||||
|
_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"
|
||||||
|
mod: "÷ Remaindering"
|
||||||
|
_mod:
|
||||||
|
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: "Random (Seed)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "Seed"
|
||||||
|
arg2: "Probability"
|
||||||
|
seedRannum: "Random number (Seed)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "Seed"
|
||||||
|
arg2: "Minimum"
|
||||||
|
arg3: "Maximum"
|
||||||
|
seedRandomPick: "Randomly selected from list (Seed)"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "Seed"
|
||||||
|
arg2: "Lists"
|
||||||
|
DRPWPM: "Randomly selected from weighted list (Daily updated per user)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "List of text"
|
||||||
|
pick: "Select from list"
|
||||||
|
_pick:
|
||||||
|
arg1: "Lists"
|
||||||
|
arg2: "Position"
|
||||||
|
listLen: "Get length of list"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Lists"
|
||||||
|
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"
|
||||||
|
slots-info: "Please delimit each slot with a line break"
|
||||||
|
arg1: "Output"
|
||||||
|
for: "Repeat"
|
||||||
|
_for:
|
||||||
|
arg1: "Count"
|
||||||
|
arg2: "Action"
|
||||||
|
typeError: "Slot {slot} accepts \"{expect}\" type, but It actually contains \"{actual}\" type!"
|
||||||
|
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"
|
||||||
|
room:
|
||||||
|
translate: "Move"
|
||||||
|
save: "Save"
|
||||||
|
furnitures:
|
||||||
|
moon: "M"
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ common:
|
|||||||
rich-contents: "Posts"
|
rich-contents: "Posts"
|
||||||
rich-contents-desc: "Escribe sobre tus pensamientos, eventos, todo lo que quieras compartir. Si es necesario, puedes usar varias sintaxis, decorar tus posts y añadir tus imágenes favoritas, archivos de viddeo y encuestas."
|
rich-contents-desc: "Escribe sobre tus pensamientos, eventos, todo lo que quieras compartir. Si es necesario, puedes usar varias sintaxis, decorar tus posts y añadir tus imágenes favoritas, archivos de viddeo y encuestas."
|
||||||
reaction: "Reacciones"
|
reaction: "Reacciones"
|
||||||
|
reaction-desc: "La forma mas facil de expresar tus emociones. Misskey te permite añadir varios tipos de reacciones a los posts de otros usuarios. La emperiencia emocional en Misskey nunca será igual que en otra red social, donde solo puedes poner \"likes\"."
|
||||||
ui: "Interfaz"
|
ui: "Interfaz"
|
||||||
|
ui-desc: "No hay ninguna interfaz que le vaya bien a todos. Por eso, Misskey tiene una interfaz altamente personalizable para tus gustos. Puedes hacer tu página principal única editando la interfaz de tu timeline y moviendo varios widgets para conseguir hacer de este lugar uno propio."
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Por favor, desactive el bloqueador de publicidad."
|
detected: "Por favor, desactive el bloqueador de publicidad."
|
||||||
@@ -29,6 +31,11 @@ common:
|
|||||||
signin: "Iniciar sesión"
|
signin: "Iniciar sesión"
|
||||||
signup: "¡Regístrate!"
|
signup: "¡Regístrate!"
|
||||||
signout: "Cerrar sesión"
|
signout: "Cerrar sesión"
|
||||||
|
delete-confirm: "¿Seguro que quieres borrar la publicación?"
|
||||||
|
notification-types:
|
||||||
|
all: "Todo"
|
||||||
|
reply: "Responder"
|
||||||
|
renote: "Volver a publicar"
|
||||||
got-it: "¡Listo!"
|
got-it: "¡Listo!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Consejos de personalización"
|
title: "Consejos de personalización"
|
||||||
@@ -55,6 +62,7 @@ common:
|
|||||||
month-and-day: "{day} de {month}"
|
month-and-day: "{day} de {month}"
|
||||||
trash: "Papelera"
|
trash: "Papelera"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
pages: "Páginas"
|
||||||
messaging: "Conversación"
|
messaging: "Conversación"
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
@@ -70,9 +78,18 @@ common:
|
|||||||
"write:blocks": "Editar bloques"
|
"write:blocks": "Editar bloques"
|
||||||
"read:favorites": "Ver favoritos"
|
"read:favorites": "Ver favoritos"
|
||||||
"write:favorites": "Editar favoritos"
|
"write:favorites": "Editar favoritos"
|
||||||
|
"read:following": "Ver información de seguidor"
|
||||||
"read:messaging": "Ver conversación"
|
"read:messaging": "Ver conversación"
|
||||||
|
"read:mutes": "Ver silenciados"
|
||||||
|
"write:notes": "Crear y eliminar articulos"
|
||||||
"read:notifications": "Ver notificaciones"
|
"read:notifications": "Ver notificaciones"
|
||||||
|
"read:reactions": "Ver reacciones"
|
||||||
"write:votes": "Vota"
|
"write:votes": "Vota"
|
||||||
|
post-form:
|
||||||
|
reply: "Responder"
|
||||||
|
renote: "Volver a publicar"
|
||||||
|
enter-username: "Ingresar nombre de usuario"
|
||||||
|
username-prompt: "Ingresar nombre de usuario"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "domingo"
|
sunday: "domingo"
|
||||||
monday: "lunes"
|
monday: "lunes"
|
||||||
@@ -136,8 +153,11 @@ common:
|
|||||||
default-note-visibility: "Rango de publicación predeterminado"
|
default-note-visibility: "Rango de publicación predeterminado"
|
||||||
web-search-engine: "Buscador web"
|
web-search-engine: "Buscador web"
|
||||||
web-search-engine-desc: "Ejemplo: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Ejemplo: https://www.google.com/?#q={{query}}"
|
||||||
|
this-setting-is-this-device-only: "Solo para este dispositivo"
|
||||||
use-os-default-emojis: "Usar los emoticonos estándar del sistema operativo"
|
use-os-default-emojis: "Usar los emoticonos estándar del sistema operativo"
|
||||||
line-width: "Grosor de línea"
|
line-width: "Grosor de línea"
|
||||||
|
line-width-thin: "Fino"
|
||||||
|
line-width-normal: "Normal"
|
||||||
line-width-thick: "Grosor"
|
line-width-thick: "Grosor"
|
||||||
font-size: "Tamaño del texto"
|
font-size: "Tamaño del texto"
|
||||||
font-size-x-small: "Muy pequeño"
|
font-size-x-small: "Muy pequeño"
|
||||||
@@ -162,34 +182,62 @@ common:
|
|||||||
wallpaper: "Fondo de pantalla"
|
wallpaper: "Fondo de pantalla"
|
||||||
choose-wallpaper: "Escoge un fondo de pantalla"
|
choose-wallpaper: "Escoge un fondo de pantalla"
|
||||||
delete-wallpaper: "Quitar fondo de pantalla"
|
delete-wallpaper: "Quitar fondo de pantalla"
|
||||||
|
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||||
show-clock-on-header: "Muestra el reloj en la parte superior derecha"
|
show-clock-on-header: "Muestra el reloj en la parte superior derecha"
|
||||||
|
show-reply-target: "Mostrar destinatario de la mención"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
|
show-my-renotes: "Mostrar mis renotes en la timeline"
|
||||||
|
show-renoted-my-notes: "Mostrar renotes de mis posts en la timeline"
|
||||||
sound: "Sonido"
|
sound: "Sonido"
|
||||||
enable-sounds: "Habilitar sonido"
|
enable-sounds: "Habilitar sonido"
|
||||||
volume: "Volúmen"
|
volume: "Volúmen"
|
||||||
test: "Prueba"
|
test: "Prueba"
|
||||||
|
update: "Actualizar Misskey"
|
||||||
version: "Versión"
|
version: "Versión"
|
||||||
|
latest-version: "Última versión"
|
||||||
|
update-checking: "Buscando actualizaciones"
|
||||||
no-updates: "No hay actualizaciones disponibles"
|
no-updates: "No hay actualizaciones disponibles"
|
||||||
no-updates-desc: "Tu Misskey está actualizado"
|
no-updates-desc: "Tu Misskey está actualizado"
|
||||||
update-available: "¡Una nueva versión está disponible!"
|
update-available: "¡Una nueva versión está disponible!"
|
||||||
update-available-desc: "Las actualizaciones se aplicarán cuando la página se vuelva a cargar."
|
update-available-desc: "Las actualizaciones se aplicarán cuando la página se vuelva a cargar."
|
||||||
advanced-settings: "Configuraciones avanzadas"
|
advanced-settings: "Configuraciones avanzadas"
|
||||||
navbar-position-left: "Izquierda"
|
navbar-position-left: "Izquierda"
|
||||||
|
save: "Guardar"
|
||||||
|
saved: "Guardado"
|
||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
delete: "eliminar"
|
delete: "eliminar"
|
||||||
loading: "cargando"
|
loading: "cargando"
|
||||||
|
ok: "Confirmar"
|
||||||
|
cancel: "Cancelar"
|
||||||
update-available-title: "Actualización disponible"
|
update-available-title: "Actualización disponible"
|
||||||
update-available: "Hay disponible una nueva versión de Misskey ({newer}, la versión actual es {current}). Refresca la página para aplicar las actualizaciones."
|
update-available: "Hay disponible una nueva versión de Misskey ({newer}, la versión actual es {current}). Refresca la página para aplicar las actualizaciones."
|
||||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||||
verified-user: "Cuenta verificada"
|
hide-password: "Ocultar contraseña"
|
||||||
|
show-password: "Mostrar contraseña"
|
||||||
|
enter-username: "Ingresar nombre de usuario"
|
||||||
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
|
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
|
||||||
|
user-suspended: "Este usuario ha sido suspendido"
|
||||||
|
is-remote-user: "La información sobre este usuario puede no estar completa"
|
||||||
|
is-remote-post: "Es una publicación remota"
|
||||||
|
view-on-remote: "Consultar el perfil completo"
|
||||||
|
renoted-by: "Renotado por {user}"
|
||||||
|
no-notes: "No hay publicaciones"
|
||||||
|
turn-on-darkmode: "Cambiar a modo oscuro"
|
||||||
|
turn-off-darkmode: "Modo claro"
|
||||||
|
error:
|
||||||
|
title: "Se ha producido un problema :("
|
||||||
|
retry: "Inténtalo otra vez"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
my-turn: "Mi turno"
|
my-turn: "Mi turno"
|
||||||
opponent-turn: "Turno del oponente"
|
opponent-turn: "Turno del oponente"
|
||||||
|
turn-of: "Turno de {name}"
|
||||||
|
past-turn-of: "Turno de {name}"
|
||||||
|
won: "{name} ha ganado"
|
||||||
black: "Negro"
|
black: "Negro"
|
||||||
white: "Blanco"
|
white: "Blanco"
|
||||||
total: "Total"
|
total: "Total"
|
||||||
|
this-turn: "Turno {count}"
|
||||||
widgets:
|
widgets:
|
||||||
analog-clock: "Reloj analógico"
|
analog-clock: "Reloj analógico"
|
||||||
profile: "Perfil"
|
profile: "Perfil"
|
||||||
@@ -212,8 +260,12 @@ common:
|
|||||||
nav: "Navegación"
|
nav: "Navegación"
|
||||||
tips: "Consejos"
|
tips: "Consejos"
|
||||||
hashtags: "Etiquetas"
|
hashtags: "Etiquetas"
|
||||||
|
queue: "En cola"
|
||||||
|
dev: "Se ha producido un error creando la aplicación. Intentelo de nuevo."
|
||||||
|
ai-chan-kawaii: "Ai-chan es muy mona!"
|
||||||
you: "Tú"
|
you: "Tú"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
|
share-access: "¿Deseas permitir a <i>{name}</i> acceder a tu cuenta?"
|
||||||
permission-ask: "La aplicación requiere los siguientes permisos:"
|
permission-ask: "La aplicación requiere los siguientes permisos:"
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
accept: "Garantizar acceso."
|
accept: "Garantizar acceso."
|
||||||
@@ -228,7 +280,18 @@ auth/views/index.vue:
|
|||||||
error: "Esta sesión no existe."
|
error: "Esta sesión no existe."
|
||||||
sign-in: "Por favor inicia sesión."
|
sign-in: "Por favor inicia sesión."
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "Cuenta verificada"
|
popular-users: "Usuarios populares"
|
||||||
|
recently-updated-users: "Usuarios activos recientemente"
|
||||||
|
recently-registered-users: "Usuarios que se han unido recientemente"
|
||||||
|
popular-tags: "Etiquetas populares"
|
||||||
|
federated: "Desde el fediverso"
|
||||||
|
explore: "Explorar {host}"
|
||||||
|
users-info: "Actualmente hay {users} registrados aquí"
|
||||||
|
common/views/components/url-preview.vue:
|
||||||
|
enable-player: "Activar reproducción"
|
||||||
|
disable-player: "Cerrar el reproductor"
|
||||||
|
common/views/components/user-list.vue:
|
||||||
|
no-users: "No hay usuarios."
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "Esperando por {}"
|
waiting-for: "Esperando por {}"
|
||||||
@@ -244,6 +307,7 @@ common/views/components/games/reversi/reversi.index.vue:
|
|||||||
sub-title: "¡Juega Reversi con tus amigos!"
|
sub-title: "¡Juega Reversi con tus amigos!"
|
||||||
invite: "Invitar"
|
invite: "Invitar"
|
||||||
rule: "Cómo jugar"
|
rule: "Cómo jugar"
|
||||||
|
rule-desc: "Reversi es un juego de estrategia para dos jugadores, el cual se juega en un tablero de 8x8. Hay 64 fichas llamadas discos, las cuales son claras de un lado y oscuras del otro. Los jugadores toman turnos colocando fichas en el tablero con su color asignado mirando hacia arriba. Durante una jugada, cualquier disco del color del oponente que esté en fila entre un disco del oponente y otro del mismo color, será volteado para tener el color del jugador que haya hecho la movida. El objetivo del juego es tener la mayoría de los discos de tu color cuando el último cuadro es llenado."
|
||||||
mode-invite: "Invitar"
|
mode-invite: "Invitar"
|
||||||
mode-invite-desc: "Invitar un usuario al juego."
|
mode-invite-desc: "Invitar un usuario al juego."
|
||||||
invitations: "¡Has recibido una invitación!"
|
invitations: "¡Has recibido una invitación!"
|
||||||
@@ -300,23 +364,40 @@ common/views/components/media-banner.vue:
|
|||||||
click-to-show: "Click para mostrar"
|
click-to-show: "Click para mostrar"
|
||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
theme: "Tema"
|
theme: "Tema"
|
||||||
|
light-theme: "Tema a usar en Light mode"
|
||||||
|
dark-theme: "Tema a usar en dark mode"
|
||||||
light-themes: "Tema claro"
|
light-themes: "Tema claro"
|
||||||
dark-themes: "Tema oscuro"
|
dark-themes: "Tema oscuro"
|
||||||
install-a-theme: "Instalar tema"
|
install-a-theme: "Instalar tema"
|
||||||
theme-code: "Código del tema"
|
theme-code: "Código del tema"
|
||||||
install: "Instalación"
|
install: "Instalación"
|
||||||
|
installed: "\"{}\" se ha instalado"
|
||||||
|
create-a-theme: "Crear tema"
|
||||||
|
save-created-theme: "Guardar tema"
|
||||||
primary-color: "Color primario"
|
primary-color: "Color primario"
|
||||||
secondary-color: "Color secundario"
|
secondary-color: "Color secundario"
|
||||||
|
text-color: "Color del texto"
|
||||||
base-theme: "Tema base"
|
base-theme: "Tema base"
|
||||||
base-theme-light: "Claro"
|
base-theme-light: "Claro"
|
||||||
base-theme-dark: "Oscuro"
|
base-theme-dark: "Oscuro"
|
||||||
|
find-more-theme: "Obtener más temas"
|
||||||
theme-name: "Nombre del tema"
|
theme-name: "Nombre del tema"
|
||||||
preview-created-theme: "Vista previa"
|
preview-created-theme: "Vista previa"
|
||||||
|
invalid-theme: "No es un tema válido"
|
||||||
|
already-installed: "Este tema ya está instalado."
|
||||||
|
saved: "Guardado"
|
||||||
|
manage-themes: "Gestor de temas"
|
||||||
|
builtin-themes: "Temas estandar"
|
||||||
my-themes: "Mis temas"
|
my-themes: "Mis temas"
|
||||||
installed-themes: "Temas instalados"
|
installed-themes: "Temas instalados"
|
||||||
|
select-theme: "Elegir tema"
|
||||||
uninstall: "Desinstalar"
|
uninstall: "Desinstalar"
|
||||||
|
uninstalled: "\"{}\" ha sido desinstalado"
|
||||||
|
author: "Autor"
|
||||||
|
desc: "Descripción"
|
||||||
export: "Exportar"
|
export: "Exportar"
|
||||||
import: "Importar"
|
import: "Importar"
|
||||||
|
import-by-code: "o pega el código"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
show: "Mostrar"
|
show: "Mostrar"
|
||||||
chars: "{count} letras"
|
chars: "{count} letras"
|
||||||
@@ -327,17 +408,13 @@ common/views/components/messaging.vue:
|
|||||||
you: "Tu"
|
you: "Tu"
|
||||||
no-history: "Sin historial"
|
no-history: "Sin historial"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "Sin conversaciones"
|
|
||||||
no-history: "El historial se ha acabado"
|
no-history: "El historial se ha acabado"
|
||||||
resize-form: "Arrastra para redimensionar"
|
|
||||||
new-message: "Nuevo mensaje"
|
new-message: "Nuevo mensaje"
|
||||||
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Escribe el mensaje aquí"
|
input-message-here: "Escribe el mensaje aquí"
|
||||||
send: "Enviar"
|
send: "Enviar"
|
||||||
attach-from-local: "Adjunta ficheros desde tu PC"
|
attach-from-local: "Adjunta ficheros desde tu PC"
|
||||||
attach-from-drive: "Adjunta ficheros desde tu disco"
|
attach-from-drive: "Adjunta ficheros desde tu disco"
|
||||||
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "Leer"
|
is-read: "Leer"
|
||||||
deleted: "El mensaje se ha borrado"
|
deleted: "El mensaje se ha borrado"
|
||||||
@@ -388,6 +465,8 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objetos"
|
objects: "Objetos"
|
||||||
symbols: "Símbolos"
|
symbols: "Símbolos"
|
||||||
flags: "Países"
|
flags: "Países"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "Necesitas recargar la página para que los cambios tengan efecto."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Usuario"
|
username: "Usuario"
|
||||||
password: "Contraseña"
|
password: "Contraseña"
|
||||||
@@ -430,10 +509,25 @@ common/views/components/stream-indicator.vue:
|
|||||||
connected: "Conectado"
|
connected: "Conectado"
|
||||||
common/views/components/notification-settings.vue:
|
common/views/components/notification-settings.vue:
|
||||||
title: "Notificaciones"
|
title: "Notificaciones"
|
||||||
|
common/views/components/integration-settings.vue:
|
||||||
|
title: "Integraciones"
|
||||||
|
connect: "Conectar"
|
||||||
|
disconnect: "Desconectarse"
|
||||||
|
connected-to: "Estas conectado a la siguiente cuenta"
|
||||||
common/views/components/github-setting.vue:
|
common/views/components/github-setting.vue:
|
||||||
|
description: "Una vez conectada tu cuenta de GitHub a Misskey podrás ver la información sobre tu perfil de GitHub y además podrás registrarte mediante tu cuenta de GitHub."
|
||||||
|
connected-to: "Estas conectado a esta cuenta de GitHub"
|
||||||
detail: "Ver detalles..."
|
detail: "Ver detalles..."
|
||||||
|
reconnect: "Reconectar"
|
||||||
|
connect: "Vincular tu cuenta de GitHub"
|
||||||
|
disconnect: "Desconectarse"
|
||||||
common/views/components/discord-setting.vue:
|
common/views/components/discord-setting.vue:
|
||||||
|
description: "Una vez conectada tu cuenta de Discord a Misskey podrás ver la información sobre tu perfil de Discord y además podrás registrarte mediante tu cuenta de Discord."
|
||||||
|
connected-to: "Estas conectado a esta cuenta de Discord"
|
||||||
detail: "Ver detalles..."
|
detail: "Ver detalles..."
|
||||||
|
reconnect: "Reconectar"
|
||||||
|
connect: "Vincular tu cuenta de Discord"
|
||||||
|
disconnect: "Desconectarse"
|
||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
waiting: "Un momento"
|
waiting: "Un momento"
|
||||||
common/views/components/visibility-chooser.vue:
|
common/views/components/visibility-chooser.vue:
|
||||||
@@ -445,29 +539,73 @@ common/views/components/visibility-chooser.vue:
|
|||||||
specified: "Directo"
|
specified: "Directo"
|
||||||
specified-desc: "Publica solo para los seguidores que quieras"
|
specified-desc: "Publica solo para los seguidores que quieras"
|
||||||
local-public: "Público (sólo local)"
|
local-public: "Público (sólo local)"
|
||||||
|
local-public-desc: "No publicar para remoto"
|
||||||
local-home: "Inicio (sólo local)"
|
local-home: "Inicio (sólo local)"
|
||||||
local-followers: "Seguidores (sólo local)"
|
local-followers: "Seguidores (sólo local)"
|
||||||
|
common/views/components/trends.vue:
|
||||||
|
count: "{} usuarios mencionados"
|
||||||
|
empty: "Ninguna tendencia popular ahora"
|
||||||
|
common/views/components/language-settings.vue:
|
||||||
|
title: "Mostrar idioma"
|
||||||
|
pick-language: "Selecciona un idioma"
|
||||||
|
recommended: "Recomendado"
|
||||||
|
auto: "Automático"
|
||||||
|
specify-language: "Especifica el idioma"
|
||||||
|
info: "Necesitas recargar la página para que los cambios tengan efecto."
|
||||||
common/views/components/profile-editor.vue:
|
common/views/components/profile-editor.vue:
|
||||||
title: "Perfil"
|
title: "Perfil"
|
||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
account: "Cuenta"
|
account: "Cuenta"
|
||||||
|
location: "Localización"
|
||||||
|
description: "Acerca de mí"
|
||||||
|
you-can-include-hashtags: "También puedes incluir hashtags en la descripción de tu perfil."
|
||||||
|
language: "Idioma"
|
||||||
|
birthday: "Fecha de nacimiento"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
is-cat: "Esta cuenta es un gato"
|
is-cat: "Esta cuenta es un gato"
|
||||||
is-bot: "Esta cuenta es un bot"
|
is-bot: "Esta cuenta es un bot"
|
||||||
|
is-locked: "Las peticiones de seguimiento necesitan aprobación"
|
||||||
|
careful-bot: "Las peticiones de seguimiento de bots necesitan aprobación"
|
||||||
|
auto-accept-followed: "Aprobar automaticamente las peticiones de follow de gente a la que sigues"
|
||||||
|
advanced: "Otros"
|
||||||
|
privacy: "Privacidad"
|
||||||
save: "Guardar"
|
save: "Guardar"
|
||||||
|
saved: "Perfil actualizado con exito"
|
||||||
|
uploading: "Subiendo"
|
||||||
|
upload-failed: "Error al subir"
|
||||||
|
unable-to-process: "La operación no se puede llevar a cabo"
|
||||||
|
email: "Preferencias de correo"
|
||||||
email-address: "Correo electrónico"
|
email-address: "Correo electrónico"
|
||||||
|
email-verified: "Tu cuenta de correo ha sido verificada."
|
||||||
|
email-not-verified: "Tu cuenta de correo no está verificada. Por favor comprueba tu bandeja de entrada."
|
||||||
export: "Exportar"
|
export: "Exportar"
|
||||||
import: "Importar"
|
import: "Importar"
|
||||||
|
export-and-import: "Exportar/Importar"
|
||||||
export-targets:
|
export-targets:
|
||||||
|
all-notes: "Todas las notas publicadas"
|
||||||
|
following-list: "Seguidores"
|
||||||
mute-list: "Silenciar"
|
mute-list: "Silenciar"
|
||||||
blocking-list: "Bloquear"
|
blocking-list: "Bloquear"
|
||||||
user-lists: "Listas"
|
user-lists: "Listas"
|
||||||
|
export-requested: "Has solicitado una exportación. Esto puede tardar un rato. Después de que termine la exportación el archivo se añadirá al drive."
|
||||||
|
import-requested: "Has empezado una importación. Esto puede tardar un rato."
|
||||||
enter-password: "Escribe una contraseña"
|
enter-password: "Escribe una contraseña"
|
||||||
|
danger-zone: "Zona de peligro"
|
||||||
|
delete-account: "Eliminar cuenta"
|
||||||
|
account-deleted: "Esta cuenta ha sido eliminada. Puede tardar un rato hasta que toda la información desaparazca."
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Usuarios"
|
users: "Usuarios"
|
||||||
|
rename: "Cambiar el nombre de la lista"
|
||||||
|
delete: "Eliminar lista"
|
||||||
|
remove-user: "Eliminar de la lista"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
invite: "Invitar"
|
||||||
common/views/components/user-lists.vue:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Listas"
|
||||||
list-name: "Nombre de lista"
|
list-name: "Nombre de lista"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
invites: "Invitar"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Recuperando"
|
fetching: "Recuperando"
|
||||||
no-broadcasts: "Sin emisión"
|
no-broadcasts: "Sin emisión"
|
||||||
@@ -526,6 +664,8 @@ common/views/pages/follow.vue:
|
|||||||
request-pending: "Solicitud pendiente"
|
request-pending: "Solicitud pendiente"
|
||||||
follow-processing: "Solicitud en proceso"
|
follow-processing: "Solicitud en proceso"
|
||||||
follow-request: "Solicitar suscripción"
|
follow-request: "Solicitar suscripción"
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
received-follow-requests: "Solicitudes de seguimiento"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "Corta la parte que aparece como un banner"
|
banner-crop-title: "Corta la parte que aparece como un banner"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
@@ -537,6 +677,7 @@ desktop:
|
|||||||
uploading-avatar: "Cargando un nuevo avatar"
|
uploading-avatar: "Cargando un nuevo avatar"
|
||||||
avatar-updated: "Avatar actualizado"
|
avatar-updated: "Avatar actualizado"
|
||||||
choose-avatar: "Escoge una imagen de avatar"
|
choose-avatar: "Escoge una imagen de avatar"
|
||||||
|
unable-to-process: "La operación no se puede llevar a cabo"
|
||||||
invalid-filetype: "Este tipo de archivo no es compatible aquí"
|
invalid-filetype: "Este tipo de archivo no es compatible aquí"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Negro ... Total"
|
total: "Negro ... Total"
|
||||||
@@ -595,6 +736,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
rename-folder: "Renombrar carpeta"
|
rename-folder: "Renombrar carpeta"
|
||||||
input-new-folder-name: "Escribe el nombre nuevo"
|
input-new-folder-name: "Escribe el nombre nuevo"
|
||||||
|
else-folders: "Otros"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
empty-draghover: "¡Saluda!"
|
empty-draghover: "¡Saluda!"
|
||||||
@@ -642,7 +784,7 @@ desktop/views/components/note-detail.vue:
|
|||||||
add-reaction: "Agregar una reacción"
|
add-reaction: "Agregar una reacción"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
renote: "Republicar"
|
renote: "Volver a publicar"
|
||||||
add-reaction: "Reacción"
|
add-reaction: "Reacción"
|
||||||
detail: "Detalles"
|
detail: "Detalles"
|
||||||
private: "Esta publicación es privada"
|
private: "Esta publicación es privada"
|
||||||
@@ -653,32 +795,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "No hay notificaciones"
|
empty: "No hay notificaciones"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Agregar usuario"
|
|
||||||
attach-location-information: "Agregar localización"
|
|
||||||
hide-contents: "Esconder contenidos"
|
|
||||||
reply-placeholder: "Responder a esta nota..."
|
|
||||||
quote-placeholder: "Citar esta nota..."
|
|
||||||
submit: "Publicar"
|
|
||||||
reply: "Responder"
|
|
||||||
renote: "Republicar"
|
|
||||||
posted: "¡Publicado!"
|
posted: "¡Publicado!"
|
||||||
replied: "¡Respondido!"
|
replied: "¡Respondido!"
|
||||||
reposted: "¡Republicado!"
|
reposted: "¡Republicado!"
|
||||||
note-failed: "Error al publicar nota"
|
note-failed: "Error al publicar nota"
|
||||||
reply-failed: "Error al responder"
|
reply-failed: "Error al responder"
|
||||||
renote-failed: "Error al republicar"
|
renote-failed: "Error al republicar"
|
||||||
posting: "Publicando"
|
|
||||||
attach-media-from-local: "Agregar medios de tu dispositivo"
|
|
||||||
attach-media-from-drive: "Adjunta multimedia desde tu Disco"
|
|
||||||
create-poll: "Crea una encuesta"
|
|
||||||
text-remain: "quedan {} caracteres"
|
|
||||||
recent-tags: "Reciente"
|
|
||||||
click-to-tagging: "Click para etiquetar"
|
|
||||||
visibility: "Visibilidad"
|
|
||||||
geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización."
|
|
||||||
error: "Error"
|
|
||||||
enter-username: "Por favor escribe un nombre de usuario..."
|
|
||||||
annotations: "Anotaciones a la publicación (opcional)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nota nueva"
|
note: "Nota nueva"
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
@@ -769,12 +891,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Crear una publicación"
|
post: "Crear una publicación"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Buscar"
|
placeholder: "Buscar"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
title: "Solicitudes de seguidores"
|
|
||||||
accept: "Aceptar"
|
|
||||||
reject: "Rechazar"
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "Listas de usuario"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Publicaciones"
|
notes: "Publicaciones"
|
||||||
following: "Sigue"
|
following: "Sigue"
|
||||||
@@ -788,29 +904,54 @@ admin/views/index.vue:
|
|||||||
instance: "Instancia"
|
instance: "Instancia"
|
||||||
moderators: "Moderadores"
|
moderators: "Moderadores"
|
||||||
users: "Usuarios"
|
users: "Usuarios"
|
||||||
hashtags: "Hashtags"
|
federation: "Federado"
|
||||||
|
queue: "Cola de trabajos"
|
||||||
|
logs: "Registros"
|
||||||
back-to-misskey: "Volver a Misskey"
|
back-to-misskey: "Volver a Misskey"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Panel de Control"
|
dashboard: "Panel de Control"
|
||||||
accounts: "Cuenta"
|
accounts: "Cuenta"
|
||||||
|
notes: "Publicaciones"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
instances: "Instancias"
|
instances: "Instancias"
|
||||||
this-instance: "Esta instancia"
|
this-instance: "Esta instancia"
|
||||||
|
federated: "Federado"
|
||||||
|
admin/views/queue.vue:
|
||||||
|
title: "Cola"
|
||||||
|
remove-all-jobs: "Limpiar todos los trabajos pendientes"
|
||||||
|
queue: "Cola"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Registros"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
|
title: "Abuso"
|
||||||
|
target: "Destinatario"
|
||||||
|
reporter: "Informador"
|
||||||
details: "Detalles"
|
details: "Detalles"
|
||||||
remove-report: "eliminar"
|
remove-report: "eliminar"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
instance: "Instancia"
|
instance: "Instancia"
|
||||||
instance-name: "Nombre de la instancia"
|
instance-name: "Nombre de la instancia"
|
||||||
|
instance-description: "Descripción de la instancia"
|
||||||
host: "Host"
|
host: "Host"
|
||||||
recaptcha-secret-key: "clave secreta reCAPTCHA"
|
banner-url: "URL de la imagen de banner"
|
||||||
|
error-image-url: "Error en la URL de la imagen"
|
||||||
|
languages: "Idioma de esta instancia"
|
||||||
|
languages-desc: "Puedes añadir mas de uno, separado por espacios."
|
||||||
|
maintainer-config: "Información del administrador"
|
||||||
|
maintainer-name: "Nombre del administrador"
|
||||||
|
maintainer-email: "Contactar con el administrador"
|
||||||
|
drive-config: "Ajustes del Drive"
|
||||||
|
cache-remote-files: "Mantener en cache los archivos remotos"
|
||||||
|
recaptcha-preview: "Vista previa"
|
||||||
invite: "Invitar"
|
invite: "Invitar"
|
||||||
save: "Guardar"
|
save: "Guardar"
|
||||||
|
saved: "Guardado"
|
||||||
email: "Correo electrónico"
|
email: "Correo electrónico"
|
||||||
smtp-host: "Host SMTP"
|
smtp-host: "Host SMTP"
|
||||||
smtp-port: "Puerto SMTP"
|
smtp-port: "Puerto SMTP"
|
||||||
smtp-user: "Usuario SMTP"
|
smtp-user: "Usuario SMTP"
|
||||||
smtp-pass: "Contraseña SMTP"
|
smtp-pass: "Contraseña SMTP"
|
||||||
|
test-email: "Prueba"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "Gráficos"
|
title: "Gráficos"
|
||||||
per-day: "Por día"
|
per-day: "Por día"
|
||||||
@@ -830,13 +971,18 @@ admin/views/drive.vue:
|
|||||||
mark-as-sensitive: "Marcar como 'sensible'"
|
mark-as-sensitive: "Marcar como 'sensible'"
|
||||||
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Usuario"
|
||||||
|
host: "Host"
|
||||||
users:
|
users:
|
||||||
state:
|
state:
|
||||||
all: "Todo"
|
all: "Todo"
|
||||||
moderator: "Moderadores"
|
moderator: "Moderadores"
|
||||||
verified: "Cuenta verificada"
|
|
||||||
origin:
|
origin:
|
||||||
local: "Local"
|
local: "Local"
|
||||||
|
admin/views/moderators.vue:
|
||||||
|
logs:
|
||||||
|
title: "Registros"
|
||||||
|
moderator: "Moderadores"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
add: "Agregar"
|
add: "Agregar"
|
||||||
@@ -846,12 +992,14 @@ admin/views/announcements.vue:
|
|||||||
save: "Guardar"
|
save: "Guardar"
|
||||||
remove: "eliminar"
|
remove: "eliminar"
|
||||||
add: "Agregar"
|
add: "Agregar"
|
||||||
|
saved: "Guardado"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
instance: "Instancia"
|
instance: "Instancia"
|
||||||
host: "Host"
|
host: "Host"
|
||||||
following: "Siguiendo"
|
following: "Siguiendo"
|
||||||
status: "Estado"
|
status: "Estado"
|
||||||
block: "Bloquear"
|
block: "Bloquear"
|
||||||
|
instances: "Federado"
|
||||||
states:
|
states:
|
||||||
all: "Todo"
|
all: "Todo"
|
||||||
blocked: "Bloquear"
|
blocked: "Bloquear"
|
||||||
@@ -859,6 +1007,8 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "Por hora"
|
hour: "Por hora"
|
||||||
day: "Por día"
|
day: "Por día"
|
||||||
|
blocked-hosts: "Bloquear"
|
||||||
|
save: "Guardar"
|
||||||
desktop/views/pages/selectdrive.vue:
|
desktop/views/pages/selectdrive.vue:
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
desktop/views/pages/user-list.users.vue:
|
desktop/views/pages/user-list.users.vue:
|
||||||
@@ -911,11 +1061,6 @@ mobile/views/components/note-detail.vue:
|
|||||||
location: "Localización"
|
location: "Localización"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "No hay notificaciones"
|
empty: "No hay notificaciones"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
reply: "Responder"
|
|
||||||
renote: "Republicar"
|
|
||||||
reply-placeholder: "Responder a esta nota..."
|
|
||||||
geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización."
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Esta publicación es privada"
|
private: "Esta publicación es privada"
|
||||||
deleted: "Esta publicación ha sido removida"
|
deleted: "Esta publicación ha sido removida"
|
||||||
@@ -935,8 +1080,6 @@ mobile/views/pages/drive.vue:
|
|||||||
contextmenu:
|
contextmenu:
|
||||||
upload: "Subir fichero"
|
upload: "Subir fichero"
|
||||||
create-folder: "Crear una carpeta"
|
create-folder: "Crear una carpeta"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "Listas"
|
|
||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
@@ -947,14 +1090,12 @@ mobile/views/pages/widgets.vue:
|
|||||||
customization-tips: "Consejos de personalización"
|
customization-tips: "Consejos de personalización"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
activity: "Actividad"
|
activity: "Actividad"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
title: "Solicitudes de seguimiento"
|
|
||||||
accept: "Aceptar"
|
|
||||||
reject: "Rechazar"
|
|
||||||
mobile/views/pages/games/reversi.vue:
|
mobile/views/pages/games/reversi.vue:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notificaciones"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
activity: "Actividad"
|
activity: "Actividad"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@@ -969,3 +1110,28 @@ deck:
|
|||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
activity: "Actividad"
|
activity: "Actividad"
|
||||||
|
pages:
|
||||||
|
pin-this-page: "Fijar en el perfil"
|
||||||
|
like: "Me gusta"
|
||||||
|
blocks:
|
||||||
|
post: "Formulario"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
random: "Aleatorio"
|
||||||
|
list: "Listas"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "Listas"
|
||||||
|
random: "Aleatorio"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Listas"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Listas"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Listas"
|
||||||
|
_pick:
|
||||||
|
arg1: "Listas"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listas"
|
||||||
|
types:
|
||||||
|
array: "Listas"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -15,6 +15,7 @@ const merge = (...args) => args.reduce((a, c) => ({
|
|||||||
|
|
||||||
const languages = [
|
const languages = [
|
||||||
'cs-CZ',
|
'cs-CZ',
|
||||||
|
'da-DK',
|
||||||
'de-DE',
|
'de-DE',
|
||||||
'en-US',
|
'en-US',
|
||||||
'es-ES',
|
'es-ES',
|
||||||
|
|||||||
@@ -36,6 +36,20 @@ common:
|
|||||||
signout: "ログアウト"
|
signout: "ログアウト"
|
||||||
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
||||||
fetching-as-ap-object: "連合に照会中"
|
fetching-as-ap-object: "連合に照会中"
|
||||||
|
unfollow-confirm: "{name}さんをフォロー解除しますか?"
|
||||||
|
delete-confirm: "この投稿を削除しますか?"
|
||||||
|
signin-required: "ログインしてください"
|
||||||
|
notification-type: "通知の種類"
|
||||||
|
notification-types:
|
||||||
|
all: "すべて"
|
||||||
|
pollVote: "投票"
|
||||||
|
follow: "フォロー"
|
||||||
|
receiveFollowRequest: "フォローリクエスト"
|
||||||
|
reply: "返信"
|
||||||
|
quote: "引用"
|
||||||
|
renote: "Renote"
|
||||||
|
mention: "言及"
|
||||||
|
reaction: "リアクション"
|
||||||
|
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
@@ -101,6 +115,35 @@ common:
|
|||||||
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: "ユーザー名を入力してください"
|
||||||
|
enter-file-name: "ファイル名を編集"
|
||||||
|
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -172,6 +215,11 @@ common:
|
|||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "ペースト"
|
||||||
|
pasted-file-name: "ペーストされたファイル名のテンプレート"
|
||||||
|
pasted-file-name-desc: "例: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "ペースト時にファイル名を編集"
|
||||||
|
paste-dialog-desc: "ペースト時にファイル名を編集するダイアログを表示するようにします。"
|
||||||
keep-cw: "CW保持"
|
keep-cw: "CW保持"
|
||||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
@@ -179,6 +227,7 @@ common:
|
|||||||
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
|
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
disable-showing-animated-images: "アニメーション画像を再生しない"
|
disable-showing-animated-images: "アニメーション画像を再生しない"
|
||||||
|
enable-quick-notification-view: "通知のクイックビューを有効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
@@ -254,6 +303,21 @@ common:
|
|||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
sync: "同期"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存しました"
|
||||||
|
home-profile: "ホームのプロファイル"
|
||||||
|
deck-profile: "デッキのプロファイル"
|
||||||
|
room: "ルーム"
|
||||||
|
_room:
|
||||||
|
graphicsQuality: "グラフィックの品質"
|
||||||
|
_graphicsQuality:
|
||||||
|
ultra: "最高"
|
||||||
|
high: "高"
|
||||||
|
medium: "中"
|
||||||
|
low: "低"
|
||||||
|
cheep: "最低"
|
||||||
|
useOrthographicCamera: "平行投影カメラを使用"
|
||||||
|
|
||||||
search: "検索"
|
search: "検索"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
@@ -263,9 +327,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: "このユーザーは凍結されています。"
|
||||||
@@ -339,7 +403,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: "新規ユーザー"
|
||||||
@@ -481,20 +545,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: "既読"
|
||||||
@@ -509,6 +578,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: "メンション"
|
||||||
@@ -523,7 +593,10 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "ピン留め解除"
|
unpin: "ピン留め解除"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
delete-confirm: "この投稿を削除しますか?"
|
delete-confirm: "この投稿を削除しますか?"
|
||||||
|
delete-and-edit: "削除して編集"
|
||||||
|
delete-and-edit-confirm: "この投稿を削除してもう一度編集しますか?この投稿へのリアクション、Renote、返信も全て削除されます。"
|
||||||
remote: "投稿元で見る"
|
remote: "投稿元で見る"
|
||||||
|
pin-limit-exceeded: "これ以上ピン留めできません。"
|
||||||
|
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
@@ -585,6 +658,7 @@ common/views/components/poll-editor.vue:
|
|||||||
|
|
||||||
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: "カスタム絵文字"
|
||||||
@@ -597,6 +671,15 @@ common/views/components/emoji-picker.vue:
|
|||||||
symbols: "記号"
|
symbols: "記号"
|
||||||
flags: "旗"
|
flags: "旗"
|
||||||
|
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "モード"
|
||||||
|
intro: "デスクトップ版とモバイル版のどちらを使うかを指定できます。"
|
||||||
|
choices:
|
||||||
|
auto: "自動で選択"
|
||||||
|
desktop: "デスクトップ版に固定"
|
||||||
|
mobile: "モバイル版に固定"
|
||||||
|
info: "変更はページの再度読み込み後に反映されます。"
|
||||||
|
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -607,6 +690,8 @@ common/views/components/signin.vue:
|
|||||||
signin-with-github: "GitHubでログイン"
|
signin-with-github: "GitHubでログイン"
|
||||||
signin-with-discord: "Discordでログイン"
|
signin-with-discord: "Discordでログイン"
|
||||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
|
tap-key: "セキュリティキーをクリックしてログイン"
|
||||||
|
enter-2fa-code: "認証コードを入力してください"
|
||||||
|
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "招待コード"
|
invitation-code: "招待コード"
|
||||||
@@ -629,6 +714,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: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
|
||||||
|
|
||||||
@@ -721,6 +808,9 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
unable-to-process: "操作を完了できません"
|
||||||
|
avatar-not-an-image: "アイコンとして指定したファイルは画像ではありません"
|
||||||
|
banner-not-an-image: "バナーとして指定したファイルは画像ではありません"
|
||||||
email: "メール設定"
|
email: "メール設定"
|
||||||
email-address: "メールアドレス"
|
email-address: "メールアドレス"
|
||||||
email-verified: "メールアドレスが確認されました"
|
email-verified: "メールアドレスが確認されました"
|
||||||
@@ -740,6 +830,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "危険な設定"
|
danger-zone: "危険な設定"
|
||||||
delete-account: "アカウントを削除"
|
delete-account: "アカウントを削除"
|
||||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||||
|
profile-metadata: "プロフィール補足情報"
|
||||||
|
metadata-label: "ラベル"
|
||||||
|
metadata-content: "内容"
|
||||||
|
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
@@ -748,11 +841,36 @@ 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:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
list-name: "リスト名"
|
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: "お知らせはありません"
|
||||||
@@ -825,6 +943,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: "バナー"
|
||||||
@@ -836,6 +959,7 @@ desktop:
|
|||||||
uploading-avatar: "新しいアバターをアップロードしています"
|
uploading-avatar: "新しいアバターをアップロードしています"
|
||||||
avatar-updated: "アバターを更新しました"
|
avatar-updated: "アバターを更新しました"
|
||||||
choose-avatar: "アバターにする画像を選択"
|
choose-avatar: "アバターにする画像を選択"
|
||||||
|
unable-to-process: "操作を完了できません"
|
||||||
invalid-filetype: "この形式のファイルはサポートされていません"
|
invalid-filetype: "この形式のファイルはサポートされていません"
|
||||||
|
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
@@ -884,7 +1008,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
copy-url: "URLをコピー"
|
copy-url: "URLをコピー"
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
else-files: "その他..."
|
else-files: "その他"
|
||||||
set-as-avatar: "アイコンに設定"
|
set-as-avatar: "アイコンに設定"
|
||||||
set-as-banner: "バナーに設定"
|
set-as-banner: "バナーに設定"
|
||||||
open-in-app: "アプリで開く"
|
open-in-app: "アプリで開く"
|
||||||
@@ -895,15 +1019,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
|
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
|
||||||
|
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "既定アップロード先"
|
||||||
unable-to-process: "操作を完了できません"
|
unable-to-process: "操作を完了できません"
|
||||||
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
||||||
unhandled-error: "不明なエラー"
|
unhandled-error: "不明なエラー"
|
||||||
|
unable-to-delete: "削除できません"
|
||||||
|
has-child-files-or-folders: "このフォルダは空でないため、削除できません。"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "このフォルダへ移動"
|
move-to-this-folder: "このフォルダへ移動"
|
||||||
show-in-new-window: "新しいウィンドウで表示"
|
show-in-new-window: "新しいウィンドウで表示"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
|
else-folders: "その他"
|
||||||
|
set-as-upload-folder: "既定アップロード先に設定"
|
||||||
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
@@ -978,34 +1107,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: "ドライブからメディアを添付"
|
|
||||||
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: "新規投稿"
|
||||||
@@ -1051,6 +1158,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
totp-header: "認証アプリ"
|
||||||
|
security-key-header: "セキュリティキー"
|
||||||
|
security-key: "セキュリティを強化するために、FIDO2をサポートするハードウェアセキュリティキーを使用してアカウントにログインできます。 サインインの際は、登録されたセキュリティキーまたは認証アプリが必要になります。"
|
||||||
|
last-used: "最後の使用:"
|
||||||
|
activate-key: "クリックしてセキュリティキーをアクティベートしてください"
|
||||||
|
security-key-name: "キー名"
|
||||||
|
register-security-key: "キーの登録を完了"
|
||||||
|
something-went-wrong: "わー! キーを登録する際に問題が発生しました:"
|
||||||
|
key-unregistered: "キーが削除されました"
|
||||||
|
use-password-less-login: "パスワードなしのログインを使用"
|
||||||
|
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
@@ -1079,6 +1196,9 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "容量"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
stats: "統計"
|
stats: "統計"
|
||||||
|
default-upload-folder: "既定のアップロード先フォルダ"
|
||||||
|
default-upload-folder-name: "フォルダ"
|
||||||
|
change-default-upload-folder: "フォルダを変更"
|
||||||
|
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "ミュートとブロック"
|
mute-and-block: "ミュートとブロック"
|
||||||
@@ -1137,8 +1257,10 @@ 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: "管理"
|
||||||
|
room: "ルーム"
|
||||||
|
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
@@ -1152,14 +1274,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: "リスト"
|
|
||||||
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1185,12 +1299,18 @@ admin/views/index.vue:
|
|||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
hashtags: "ハッシュタグ"
|
|
||||||
abuse: "スパム報告"
|
abuse: "スパム報告"
|
||||||
queue: "ジョブキュー"
|
queue: "ジョブキュー"
|
||||||
logs: "ログ"
|
logs: "ログ"
|
||||||
|
db: "データベース"
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "テーブル"
|
||||||
|
vacuum: "バキューム"
|
||||||
|
vacuum-info: "データベースの掃除を行います。データはそのままで、ディスク使用量を減らします。通常この操作は自動で定期的に行われます。"
|
||||||
|
vacuum-exclamation: "バキュームを行うと、しばらくの間データベースの負荷が高くなり、ユーザーの操作を受け付けなくなる場合があります。"
|
||||||
|
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
accounts: "アカウント"
|
accounts: "アカウント"
|
||||||
@@ -1203,6 +1323,33 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "キュー"
|
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: "スパム報告"
|
||||||
@@ -1216,14 +1363,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: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
@@ -1231,9 +1398,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連携を有効にする"
|
||||||
@@ -1264,7 +1436,8 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
user-recommendation-config: "おすすめユーザー"
|
pinned-users: "ピン留めユーザー"
|
||||||
|
pinned-users-info: "ピン留めしたいユーザーを改行で区切って記述します。"
|
||||||
email-config: "メールサーバーの設定"
|
email-config: "メールサーバーの設定"
|
||||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
enable-email: "メール配信を有効にする"
|
enable-email: "メール配信を有効にする"
|
||||||
@@ -1276,6 +1449,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "SMTP認証を行う"
|
smtp-auth: "SMTP認証を行う"
|
||||||
smtp-user: "SMTPユーザー"
|
smtp-user: "SMTPユーザー"
|
||||||
smtp-pass: "SMTPパスワード"
|
smtp-pass: "SMTPパスワード"
|
||||||
|
test-email: "テスト"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "ServiceWorkerを有効にする"
|
enable-serviceworker: "ServiceWorkerを有効にする"
|
||||||
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
||||||
@@ -1332,6 +1506,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: "操作"
|
||||||
@@ -1351,14 +1528,12 @@ admin/views/users.vue:
|
|||||||
silence-confirm: "サイレンスしますか?"
|
silence-confirm: "サイレンスしますか?"
|
||||||
unmake-silence: "サイレンスの解除"
|
unmake-silence: "サイレンスの解除"
|
||||||
unsilence-confirm: "サイレンスを解除しますか?"
|
unsilence-confirm: "サイレンスを解除しますか?"
|
||||||
verify: "公式アカウントにする"
|
|
||||||
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: "すべてのファイルを削除しますか?"
|
||||||
|
username: "ユーザー名"
|
||||||
|
host: "ホスト"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@@ -1373,7 +1548,6 @@ admin/views/users.vue:
|
|||||||
admin: "管理者"
|
admin: "管理者"
|
||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
|
||||||
silenced: "サイレンス済み"
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
@@ -1391,6 +1565,12 @@ admin/views/moderators.vue:
|
|||||||
added: "モデレーターを登録しました"
|
added: "モデレーターを登録しました"
|
||||||
remove: "解除"
|
remove: "解除"
|
||||||
removed: "モデレーター登録を解除しました"
|
removed: "モデレーター登録を解除しました"
|
||||||
|
logs:
|
||||||
|
title: "ログ"
|
||||||
|
moderator: "モデレーター"
|
||||||
|
type: "操作"
|
||||||
|
at: "日時"
|
||||||
|
info: "情報"
|
||||||
|
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
@@ -1440,6 +1620,7 @@ admin/views/federation.vue:
|
|||||||
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: "照会"
|
||||||
@@ -1486,6 +1667,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: "詳しく..."
|
||||||
@@ -1648,18 +1832,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: "内容への注釈 (オプション)"
|
|
||||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
|
||||||
error: "エラー"
|
|
||||||
username-prompt: "ユーザー名を入力してください"
|
|
||||||
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -1676,6 +1848,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
|
user-groups: "グループ"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
@@ -1690,9 +1863,6 @@ mobile/views/pages/drive.vue:
|
|||||||
move-folder: "このフォルダを移動"
|
move-folder: "このフォルダを移動"
|
||||||
delete-folder: "このフォルダを削除"
|
delete-folder: "このフォルダを削除"
|
||||||
|
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "リスト"
|
|
||||||
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
|
|
||||||
@@ -1725,11 +1895,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: "前の投稿"
|
||||||
@@ -1745,6 +1910,9 @@ mobile/views/pages/search.vue:
|
|||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
|
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "通知"
|
||||||
|
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
|
|
||||||
@@ -1809,6 +1977,7 @@ deck/deck.user-column.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
pinned-page: "ピン留めされたページ"
|
||||||
|
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
||||||
@@ -1848,8 +2017,14 @@ pages:
|
|||||||
are-you-sure-delete: "このページを削除しますか?"
|
are-you-sure-delete: "このページを削除しますか?"
|
||||||
page-deleted: "ページを削除しました"
|
page-deleted: "ページを削除しました"
|
||||||
edit-this-page: "このページを編集"
|
edit-this-page: "このページを編集"
|
||||||
|
pin-this-page: "ピン留め"
|
||||||
|
unpin-this-page: "ピン留め解除"
|
||||||
view-source: "ソースを表示"
|
view-source: "ソースを表示"
|
||||||
view-page: "ページを見る"
|
view-page: "ページを見る"
|
||||||
|
like: "いいね"
|
||||||
|
unlike: "いいね解除"
|
||||||
|
liked-pages: "いいねしたページ"
|
||||||
|
my-pages: "自分のページ"
|
||||||
inspector: "インスペクター"
|
inspector: "インスペクター"
|
||||||
content: "ページブロック"
|
content: "ページブロック"
|
||||||
variables: "変数"
|
variables: "変数"
|
||||||
@@ -1862,11 +2037,12 @@ pages:
|
|||||||
url: "ページURL"
|
url: "ページURL"
|
||||||
summary: "ページの要約"
|
summary: "ページの要約"
|
||||||
align-center: "中央寄せ"
|
align-center: "中央寄せ"
|
||||||
|
hide-title-when-pinned: "ピン留めされているときにタイトルを非表示"
|
||||||
font: "フォント"
|
font: "フォント"
|
||||||
fontSerif: "セリフ"
|
fontSerif: "セリフ"
|
||||||
fontSansSerif: "サンセリフ"
|
fontSansSerif: "サンセリフ"
|
||||||
set-eye-catchig-image: "アイキャッチ画像を設定"
|
set-eye-catching-image: "アイキャッチ画像を設定"
|
||||||
remove-eye-catchig-image: "アイキャッチ画像を削除"
|
remove-eye-catching-image: "アイキャッチ画像を削除"
|
||||||
choose-block: "ブロックを追加"
|
choose-block: "ブロックを追加"
|
||||||
select-type: "種類を選択"
|
select-type: "種類を選択"
|
||||||
enter-variable-name: "変数名を決めてください"
|
enter-variable-name: "変数名を決めてください"
|
||||||
@@ -1915,14 +2091,34 @@ pages:
|
|||||||
text: "タイトル"
|
text: "タイトル"
|
||||||
default: "デフォルト値"
|
default: "デフォルト値"
|
||||||
|
|
||||||
|
counter: "カウンター"
|
||||||
|
_counter:
|
||||||
|
name: "変数名"
|
||||||
|
text: "タイトル"
|
||||||
|
inc: "増加値"
|
||||||
|
|
||||||
_button:
|
_button:
|
||||||
text: "タイトル"
|
text: "タイトル"
|
||||||
|
colored: "色付き"
|
||||||
action: "ボタンを押したときの動作"
|
action: "ボタンを押したときの動作"
|
||||||
_action:
|
_action:
|
||||||
dialog: "ダイアログを表示する"
|
dialog: "ダイアログを表示する"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "内容"
|
content: "内容"
|
||||||
resetRandom: "乱数をリセット"
|
resetRandom: "乱数をリセット"
|
||||||
|
pushEvent: "イベントを送信させる"
|
||||||
|
_pushEvent:
|
||||||
|
event: "イベント名"
|
||||||
|
message: "押したときに表示するメッセージ"
|
||||||
|
variable: "送信する変数"
|
||||||
|
no-variable: "なし"
|
||||||
|
|
||||||
|
radioButton: "選択肢"
|
||||||
|
_radioButton:
|
||||||
|
name: "変数名"
|
||||||
|
title: "タイトル"
|
||||||
|
values: "改行で区切った選択肢"
|
||||||
|
default: "デフォルト値"
|
||||||
|
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
@@ -1935,6 +2131,7 @@ pages:
|
|||||||
fn: "関数"
|
fn: "関数"
|
||||||
text: "テキスト操作"
|
text: "テキスト操作"
|
||||||
convert: "変換"
|
convert: "変換"
|
||||||
|
list: "リスト"
|
||||||
blocks:
|
blocks:
|
||||||
text: "テキスト"
|
text: "テキスト"
|
||||||
multiLineText: "テキスト(複数行)"
|
multiLineText: "テキスト(複数行)"
|
||||||
@@ -1976,6 +2173,10 @@ pages:
|
|||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
mod: "÷ 割った余り"
|
||||||
|
_mod:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
eq: "AとBが同じ"
|
eq: "AとBが同じ"
|
||||||
_eq:
|
_eq:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
@@ -2049,6 +2250,16 @@ pages:
|
|||||||
_seedRandomPick:
|
_seedRandomPick:
|
||||||
arg1: "シード"
|
arg1: "シード"
|
||||||
arg2: "リスト"
|
arg2: "リスト"
|
||||||
|
DRPWPM: "確率付きリストからランダムに選択 (ユーザーごとに日替わり)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "テキストのリスト"
|
||||||
|
pick: "リストから選択"
|
||||||
|
_pick:
|
||||||
|
arg1: "リスト"
|
||||||
|
arg2: "位置"
|
||||||
|
listLen: "リストの長さを取得"
|
||||||
|
_listLen:
|
||||||
|
arg1: "リスト"
|
||||||
number: "数値"
|
number: "数値"
|
||||||
stringToNumber: "テキストを数値に"
|
stringToNumber: "テキストを数値に"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
@@ -2081,3 +2292,55 @@ pages:
|
|||||||
enviromentVariables: "環境変数"
|
enviromentVariables: "環境変数"
|
||||||
pageVariables: "ページ要素"
|
pageVariables: "ページ要素"
|
||||||
argVariables: "入力スロット"
|
argVariables: "入力スロット"
|
||||||
|
|
||||||
|
room:
|
||||||
|
add-furniture: "家具を置く"
|
||||||
|
translate: "移動"
|
||||||
|
rotate: "回転"
|
||||||
|
exit: "戻る"
|
||||||
|
remove: "しまう"
|
||||||
|
save: "保存"
|
||||||
|
chooseImage: "画像を選択"
|
||||||
|
room-type: "部屋のタイプ"
|
||||||
|
carpet-color: "床の色"
|
||||||
|
rooms:
|
||||||
|
default: "デフォルト"
|
||||||
|
washitsu: "和室"
|
||||||
|
furnitures:
|
||||||
|
milk: "牛乳パック"
|
||||||
|
bed: "ベッド"
|
||||||
|
low-table: "ローテーブル"
|
||||||
|
desk: "デスク"
|
||||||
|
chair: "チェア"
|
||||||
|
chair2: "チェア2"
|
||||||
|
fan: "換気扇"
|
||||||
|
pc: "パソコン"
|
||||||
|
plant: "観葉植物"
|
||||||
|
plant2: "観葉植物2"
|
||||||
|
eraser: "消しゴム"
|
||||||
|
pencil: "鉛筆"
|
||||||
|
pudding: "プリン"
|
||||||
|
cardboard-box: "段ボール箱"
|
||||||
|
cardboard-box2: "段ボール箱2"
|
||||||
|
cardboard-box3: "段ボール箱3"
|
||||||
|
book: "本"
|
||||||
|
book2: "本2"
|
||||||
|
piano: "ピアノ"
|
||||||
|
facial-tissue: "ティッシュボックス"
|
||||||
|
server: "サーバー"
|
||||||
|
moon: "月"
|
||||||
|
corkboard: "コルクボード"
|
||||||
|
mousepad: "マウスパッド"
|
||||||
|
monitor: "モニター"
|
||||||
|
keyboard: "キーボード"
|
||||||
|
carpet-stripe: "カーペット(縞)"
|
||||||
|
mat: "マット"
|
||||||
|
color-box: "カラーボックス"
|
||||||
|
wall-clock: "壁掛け時計"
|
||||||
|
photoframe: "額縁"
|
||||||
|
cube: "キューブ"
|
||||||
|
tv: "テレビ"
|
||||||
|
pinguin: "ピンギン"
|
||||||
|
rubik-cube: "ルービックキューブ"
|
||||||
|
poster-h: "ポスター(横長)"
|
||||||
|
poster-v: "ポスター(縦長)"
|
||||||
|
|||||||
@@ -27,6 +27,13 @@ common:
|
|||||||
load-more: "もっとあらへんのか!"
|
load-more: "もっとあらへんのか!"
|
||||||
enter-password: "パスワードを入れてや"
|
enter-password: "パスワードを入れてや"
|
||||||
2fa: "二段階認証"
|
2fa: "二段階認証"
|
||||||
|
delete-confirm: "この投稿を削除してもええか?"
|
||||||
|
notification-types:
|
||||||
|
all: "すべて"
|
||||||
|
follow: "フォロー"
|
||||||
|
reply: "返す"
|
||||||
|
renote: "Renote"
|
||||||
|
reaction: "リアクション"
|
||||||
got-it: "ほい"
|
got-it: "ほい"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -62,6 +69,14 @@ common:
|
|||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
permissions:
|
permissions:
|
||||||
"write:votes": "投票するで"
|
"write:votes": "投票するで"
|
||||||
|
post-form:
|
||||||
|
submit: "投稿"
|
||||||
|
reply: "返す"
|
||||||
|
renote: "Renote"
|
||||||
|
error: "エラー"
|
||||||
|
enter-username: "ユーザー名を入力してや"
|
||||||
|
add-visible-user: "ユーザー増やす"
|
||||||
|
username-prompt: "ユーザー名を入力してや"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -115,13 +130,15 @@ common:
|
|||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
other: "その他"
|
other: "その他"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存したで!"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
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: "ユーザー名を入力してや"
|
||||||
do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
|
do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
|
||||||
is-remote-post: "この投稿情報はコピーです。"
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
view-on-remote: "ちゃんとした情報見せてや!"
|
view-on-remote: "ちゃんとした情報見せてや!"
|
||||||
@@ -181,7 +198,6 @@ auth/views/index.vue:
|
|||||||
error: "セッションが存在してへん。"
|
error: "セッションが存在してへん。"
|
||||||
sign-in: "サインインしてや"
|
sign-in: "サインインしてや"
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "アメちゃん付きアカウント"
|
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
@@ -296,18 +312,15 @@ 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: "このメッセージは削除されたわ"
|
||||||
@@ -359,6 +372,8 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "物"
|
objects: "物"
|
||||||
symbols: "記号"
|
symbols: "記号"
|
||||||
flags: "旗"
|
flags: "旗"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "ページもっぺん読み込んだら反映したるで。"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -464,6 +479,7 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存したで"
|
saved: "プロフィールを保存したで"
|
||||||
uploading: "アップロードしとります"
|
uploading: "アップロードしとります"
|
||||||
upload-failed: "これアップロードでけへんわ"
|
upload-failed: "これアップロードでけへんわ"
|
||||||
|
unable-to-process: "あかん、無理やわ"
|
||||||
email: "メール設定"
|
email: "メール設定"
|
||||||
email-address: "メールアドレス"
|
email-address: "メールアドレス"
|
||||||
email-verified: "このメールアドレスOKや!"
|
email-verified: "このメールアドレスOKや!"
|
||||||
@@ -478,8 +494,14 @@ common/views/components/profile-editor.vue:
|
|||||||
enter-password: "パスワードを入れてや"
|
enter-password: "パスワードを入れてや"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
|
add-user: "ユーザー増やす"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
invite: "招待"
|
||||||
common/views/components/user-lists.vue:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "リスト"
|
||||||
list-name: "リスト名"
|
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: "お知らせはあらへんで"
|
||||||
@@ -538,6 +560,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: "バナー"
|
||||||
@@ -549,6 +573,7 @@ desktop:
|
|||||||
uploading-avatar: "新しいアバターをアップロードしとるで"
|
uploading-avatar: "新しいアバターをアップロードしとるで"
|
||||||
avatar-updated: "アバターを更新したで"
|
avatar-updated: "アバターを更新したで"
|
||||||
choose-avatar: "アバターにする画像選んでや"
|
choose-avatar: "アバターにする画像選んでや"
|
||||||
|
unable-to-process: "あかん、無理やわ"
|
||||||
invalid-filetype: "この形式のファイル無理やねん"
|
invalid-filetype: "この形式のファイル無理やねん"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "黒いの ... 全部"
|
total: "黒いの ... 全部"
|
||||||
@@ -589,7 +614,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "やっぱ見せたるわ"
|
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||||
copy-url: "URLをコピー"
|
copy-url: "URLをコピー"
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
else-files: "まだあんで..."
|
else-files: "その他"
|
||||||
set-as-avatar: "アイコンにする"
|
set-as-avatar: "アイコンにする"
|
||||||
set-as-banner: "バナーにする"
|
set-as-banner: "バナーにする"
|
||||||
open-in-app: "アプリで開く"
|
open-in-app: "アプリで開く"
|
||||||
@@ -608,6 +633,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変えるで"
|
rename: "名前を変えるで"
|
||||||
rename-folder: "フォルダ名を変えるで"
|
rename-folder: "フォルダ名を変えるで"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してや"
|
input-new-folder-name: "新しいフォルダ名を入力してや"
|
||||||
|
else-folders: "その他"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
empty-draghover: "ドロップするにゃ!お魚以外なら何でもいいにゃ!"
|
empty-draghover: "ドロップするにゃ!お魚以外なら何でもいいにゃ!"
|
||||||
@@ -666,33 +692,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
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: "ドライブからメディア持ってくる"
|
|
||||||
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: "新規投稿"
|
||||||
reply: "返す"
|
reply: "返す"
|
||||||
@@ -756,6 +761,7 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "容量"
|
max: "容量"
|
||||||
in-use: "使うとる"
|
in-use: "使うとる"
|
||||||
stats: "統計"
|
stats: "統計"
|
||||||
|
default-upload-folder-name: "フォルダ"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "ミュートとブロック"
|
mute-and-block: "ミュートとブロック"
|
||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
@@ -811,12 +817,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: "リスト"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -838,7 +838,6 @@ admin/views/index.vue:
|
|||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
announcements: "知っといてや"
|
announcements: "知っといてや"
|
||||||
hashtags: "ハッシュタグ"
|
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Misskeyに戻る"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
@@ -848,6 +847,10 @@ admin/views/dashboard.vue:
|
|||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
this-instance: "ワイのインスタンス"
|
this-instance: "ワイのインスタンス"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
levels:
|
||||||
|
info: "情報"
|
||||||
|
error: "エラー"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "もっと"
|
details: "もっと"
|
||||||
remove-report: "削除"
|
remove-report: "削除"
|
||||||
@@ -863,6 +866,7 @@ admin/views/instance.vue:
|
|||||||
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: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
@@ -871,8 +875,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連携を有効にする"
|
||||||
@@ -899,7 +902,6 @@ admin/views/instance.vue:
|
|||||||
invite: "来てや"
|
invite: "来てや"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
user-recommendation-config: "このユーザーええで"
|
|
||||||
email-config: "メールサーバーの設定"
|
email-config: "メールサーバーの設定"
|
||||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
|
||||||
enable-email: "メール配信を有効にする"
|
enable-email: "メール配信を有効にする"
|
||||||
@@ -951,14 +953,20 @@ admin/views/users.vue:
|
|||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
password-updated: "パスワードは現在「{password} 」やで"
|
password-updated: "パスワードは現在「{password} 」やで"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
username: "ユーザー名"
|
||||||
|
host: "ホスト"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
state:
|
state:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
verified: "アメちゃん付きアカウント"
|
|
||||||
origin:
|
origin:
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
|
admin/views/moderators.vue:
|
||||||
|
logs:
|
||||||
|
moderator: "モデレーター"
|
||||||
|
type: "操作"
|
||||||
|
info: "情報"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
@@ -995,6 +1003,8 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "1時間ごと"
|
hour: "1時間ごと"
|
||||||
day: "1日ごと"
|
day: "1日ごと"
|
||||||
|
blocked-hosts: "ブロック"
|
||||||
|
save: "保存"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "もうちょい……"
|
about: "もうちょい……"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
@@ -1118,17 +1128,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
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: "内容への注釈 (オプション)"
|
|
||||||
geolocation-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
|
|
||||||
error: "エラー"
|
|
||||||
username-prompt: "ユーザー名を入力してや"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
@@ -1151,8 +1150,6 @@ mobile/views/pages/drive.vue:
|
|||||||
contextmenu:
|
contextmenu:
|
||||||
upload: "ファイル上げる"
|
upload: "ファイル上げる"
|
||||||
create-folder: "フォルダー作る"
|
create-folder: "フォルダー作る"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "リスト"
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めようや"
|
lets-start: "📦 始めようや"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1175,10 +1172,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: "前のやつ"
|
||||||
@@ -1190,6 +1183,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "ワイは「{q}」なんて投稿知らんわ、無いんちゃう?知らんけど。"
|
not-found: "ワイは「{q}」なんて投稿知らんわ、無いんちゃう?知らんけど。"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "ファイル選んでや"
|
select-file: "ファイル選んでや"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "通知"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "あんたは橋の下で拾った{}や!"
|
signed-in-as: "あんたは橋の下で拾った{}や!"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1246,25 +1241,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:
|
||||||
@@ -1281,3 +1257,30 @@ dev/views/new-app.vue:
|
|||||||
authority: "権限"
|
authority: "権限"
|
||||||
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
||||||
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
||||||
|
pages:
|
||||||
|
pin-this-page: "ピン留め"
|
||||||
|
unpin-this-page: "ピン留めやめる"
|
||||||
|
like: "ええやん"
|
||||||
|
blocks:
|
||||||
|
image: "画像"
|
||||||
|
post: "投稿フォーム"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
random: "いんじゃんほい"
|
||||||
|
list: "リスト"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "リスト"
|
||||||
|
random: "いんじゃんほい"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "リスト"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "リスト"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "リスト"
|
||||||
|
_pick:
|
||||||
|
arg1: "リスト"
|
||||||
|
_listLen:
|
||||||
|
arg1: "リスト"
|
||||||
|
types:
|
||||||
|
array: "リスト"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,6 +8,11 @@ common:
|
|||||||
reaction: "Reactie"
|
reaction: "Reactie"
|
||||||
close: "Sluiten"
|
close: "Sluiten"
|
||||||
enter-password: "Voer het wachtwoord in"
|
enter-password: "Voer het wachtwoord in"
|
||||||
|
notification-types:
|
||||||
|
all: "Alle"
|
||||||
|
follow: "Volgend"
|
||||||
|
reply: "Beantwoorden"
|
||||||
|
reaction: "Reactie"
|
||||||
time:
|
time:
|
||||||
unknown: "onbekend"
|
unknown: "onbekend"
|
||||||
future: "toekomstig"
|
future: "toekomstig"
|
||||||
@@ -25,6 +30,10 @@ common:
|
|||||||
favorites: "Deze notitie toevoegen aan favorieten"
|
favorites: "Deze notitie toevoegen aan favorieten"
|
||||||
permissions:
|
permissions:
|
||||||
"write:votes": "Stemmen"
|
"write:votes": "Stemmen"
|
||||||
|
post-form:
|
||||||
|
submit: "Bericht"
|
||||||
|
reply: "Beantwoorden"
|
||||||
|
add-visible-user: "Gebruiker toevoegen"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Z"
|
sunday: "Z"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -104,10 +113,9 @@ common/views/components/messaging.vue:
|
|||||||
search-user: "Gebruiker zoeken"
|
search-user: "Gebruiker zoeken"
|
||||||
you: "Jij"
|
you: "Jij"
|
||||||
no-history: "Geen geschiedenis"
|
no-history: "Geen geschiedenis"
|
||||||
|
user: "Gebruiker"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "Geen gesprekken"
|
|
||||||
no-history: "Er is geen verdere geschiedenis"
|
no-history: "Er is geen verdere geschiedenis"
|
||||||
resize-form: "Versleep om grootte te wijzigen"
|
|
||||||
new-message: "Nieuw bericht"
|
new-message: "Nieuw bericht"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Voer hier je bericht in"
|
input-message-here: "Voer hier je bericht in"
|
||||||
@@ -196,12 +204,16 @@ common/views/components/profile-editor.vue:
|
|||||||
name: "Naam"
|
name: "Naam"
|
||||||
avatar: "Gebruikersafbeelding"
|
avatar: "Gebruikersafbeelding"
|
||||||
banner: "Omslagfoto"
|
banner: "Omslagfoto"
|
||||||
|
unable-to-process: "De operatie kan niet worden voltooid."
|
||||||
export-targets:
|
export-targets:
|
||||||
following-list: "Volgend"
|
following-list: "Volgend"
|
||||||
user-lists: "Lijsten"
|
user-lists: "Lijsten"
|
||||||
enter-password: "Voer het wachtwoord in"
|
enter-password: "Voer het wachtwoord in"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Gebruiker"
|
users: "Gebruiker"
|
||||||
|
add-user: "Gebruiker toevoegen"
|
||||||
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Lijsten"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Bezig met ophalen"
|
fetching: "Bezig met ophalen"
|
||||||
no-broadcasts: "Geen uitzendingen"
|
no-broadcasts: "Geen uitzendingen"
|
||||||
@@ -220,6 +232,7 @@ common/views/pages/follow.vue:
|
|||||||
follow: "Volgend"
|
follow: "Volgend"
|
||||||
desktop:
|
desktop:
|
||||||
banner: "Omslagfoto"
|
banner: "Omslagfoto"
|
||||||
|
unable-to-process: "De operatie kan niet worden voltooid."
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Zwart ... totaal"
|
total: "Zwart ... totaal"
|
||||||
notes: "Blauw ... notities"
|
notes: "Blauw ... notities"
|
||||||
@@ -254,7 +267,6 @@ desktop/views/components/drive.file.vue:
|
|||||||
rename: "Naam wijzigen"
|
rename: "Naam wijzigen"
|
||||||
copy-url: "URL kopiëren"
|
copy-url: "URL kopiëren"
|
||||||
download: "Downloaden"
|
download: "Downloaden"
|
||||||
else-files: "Overig"
|
|
||||||
set-as-avatar: "Instellen als gebruikersafbeelding"
|
set-as-avatar: "Instellen als gebruikersafbeelding"
|
||||||
set-as-banner: "Instellen als omslagfoto"
|
set-as-banner: "Instellen als omslagfoto"
|
||||||
open-in-app: "Openen in app"
|
open-in-app: "Openen in app"
|
||||||
@@ -323,21 +335,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Geen meldingen"
|
empty: "Geen meldingen"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
reply-placeholder: "Deze notitie beantwoorden..."
|
|
||||||
quote-placeholder: "Deze notitie citeren..."
|
|
||||||
submit: "Bericht"
|
|
||||||
reply: "Beantwoorden"
|
|
||||||
posted: "Geplaatst!"
|
posted: "Geplaatst!"
|
||||||
replied: "Beantwoord!"
|
replied: "Beantwoord!"
|
||||||
reposted: "Hergeplaatst!"
|
reposted: "Hergeplaatst!"
|
||||||
note-failed: "Noteren mislukt"
|
note-failed: "Noteren mislukt"
|
||||||
reply-failed: "Beantwoorden mislukt"
|
reply-failed: "Beantwoorden mislukt"
|
||||||
renote-failed: "Renote mislukt"
|
renote-failed: "Renote mislukt"
|
||||||
posting: "Bezig met plaatsen"
|
|
||||||
attach-media-from-local: "Media bijvoegen van je computer"
|
|
||||||
attach-media-from-drive: "Media bijvoegen uit je Drive"
|
|
||||||
create-poll: "Peiling creëren"
|
|
||||||
text-remain: "{} resterende tekens"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nieuwe notitie"
|
note: "Nieuwe notitie"
|
||||||
reply: "Beantwoorden"
|
reply: "Beantwoorden"
|
||||||
@@ -380,6 +383,7 @@ common/views/components/api-settings.vue:
|
|||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
in-use: "gebruikt"
|
in-use: "gebruikt"
|
||||||
stats: "Statistieken"
|
stats: "Statistieken"
|
||||||
|
default-upload-folder-name: "Map(pen)"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "(dit bericht is privé)"
|
private: "(dit bericht is privé)"
|
||||||
poll: "Peilingen"
|
poll: "Peilingen"
|
||||||
@@ -401,8 +405,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Nieuw bericht opstellen"
|
post: "Nieuw bericht opstellen"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Zoeken"
|
placeholder: "Zoeken"
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "Lijsten"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Berichten"
|
notes: "Berichten"
|
||||||
following: "Volgend"
|
following: "Volgend"
|
||||||
@@ -422,8 +424,6 @@ admin/views/dashboard.vue:
|
|||||||
notes: "Bericht"
|
notes: "Bericht"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
remove-report: "Verwijderen"
|
remove-report: "Verwijderen"
|
||||||
admin/views/instance.vue:
|
|
||||||
user-recommendation-config: "Aanbevolen gebruikers"
|
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
notes: "Bericht"
|
notes: "Bericht"
|
||||||
users: "Gebruiker"
|
users: "Gebruiker"
|
||||||
@@ -432,6 +432,7 @@ admin/views/drive.vue:
|
|||||||
local: "Lokaal"
|
local: "Lokaal"
|
||||||
delete: "Verwijderen"
|
delete: "Verwijderen"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Gebruikersnaam"
|
||||||
users:
|
users:
|
||||||
title: "Gebruiker"
|
title: "Gebruiker"
|
||||||
state:
|
state:
|
||||||
@@ -540,11 +541,6 @@ mobile/views/components/note-detail.vue:
|
|||||||
location: "Locatie"
|
location: "Locatie"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Geen meldingen"
|
empty: "Geen meldingen"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Gebruiker toevoegen"
|
|
||||||
submit: "Plaatsen"
|
|
||||||
reply: "Antwoord"
|
|
||||||
reply-placeholder: "Deze notitie beantwoorden..."
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "(dit bericht is privé)"
|
private: "(dit bericht is privé)"
|
||||||
media-count: "{} media"
|
media-count: "{} media"
|
||||||
@@ -560,8 +556,6 @@ mobile/views/pages/drive.vue:
|
|||||||
contextmenu:
|
contextmenu:
|
||||||
upload: "Bestand uploaden"
|
upload: "Bestand uploaden"
|
||||||
create-folder: "Map creëren"
|
create-folder: "Map creëren"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "Lijsten"
|
|
||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "Startpagina"
|
home: "Startpagina"
|
||||||
local: "Lokaal"
|
local: "Lokaal"
|
||||||
@@ -580,6 +574,8 @@ mobile/views/pages/search.vue:
|
|||||||
search: "Zoeken"
|
search: "Zoeken"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Kies een bestand"
|
select-file: "Kies een bestand"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Meldingen"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Ingelogd als {}"
|
signed-in-as: "Ingelogd als {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -619,13 +615,30 @@ deck/deck.user-column.vue:
|
|||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
|
edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
|
||||||
edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
|
edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
|
||||||
api:
|
pages:
|
||||||
entities:
|
pin-this-page: "Vastmaken aan profielpagina"
|
||||||
properties: "Eigenschappen"
|
like: "Leuk"
|
||||||
endpoints:
|
blocks:
|
||||||
params: "Parameters"
|
image: "Afbeeldingen"
|
||||||
res: "Antwoord"
|
script:
|
||||||
props:
|
categories:
|
||||||
name: "Naam"
|
list: "Lijsten"
|
||||||
type: "Type"
|
blocks:
|
||||||
description: "Omschrijving"
|
_join:
|
||||||
|
arg1: "Lijsten"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Lijsten"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Lijsten"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Lijsten"
|
||||||
|
_pick:
|
||||||
|
arg1: "Lijsten"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Lijsten"
|
||||||
|
types:
|
||||||
|
array: "Lijsten"
|
||||||
|
room:
|
||||||
|
translate: "Verplaatsen"
|
||||||
|
furnitures:
|
||||||
|
moon: "M"
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ common:
|
|||||||
rich-contents: "Innlegg"
|
rich-contents: "Innlegg"
|
||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
|
notification-types:
|
||||||
|
all: "Alle"
|
||||||
|
follow: "Følger"
|
||||||
|
reply: "Svar"
|
||||||
got-it: "Skjønner!"
|
got-it: "Skjønner!"
|
||||||
notification:
|
notification:
|
||||||
file-uploaded: "Filen ble lastet opp!"
|
file-uploaded: "Filen ble lastet opp!"
|
||||||
@@ -39,6 +43,10 @@ common:
|
|||||||
favorites: "Merket som favoritt"
|
favorites: "Merket som favoritt"
|
||||||
permissions:
|
permissions:
|
||||||
"write:votes": "Stem"
|
"write:votes": "Stem"
|
||||||
|
post-form:
|
||||||
|
submit: "Innlegg"
|
||||||
|
reply: "Svar"
|
||||||
|
error: "Feil"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "S"
|
sunday: "S"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -74,6 +82,7 @@ common:
|
|||||||
_settings:
|
_settings:
|
||||||
notification: "Notifikasjon"
|
notification: "Notifikasjon"
|
||||||
password: "Passord"
|
password: "Passord"
|
||||||
|
save: "Lagre"
|
||||||
search: "Søk"
|
search: "Søk"
|
||||||
delete: "Slett"
|
delete: "Slett"
|
||||||
loading: "Laster inn..."
|
loading: "Laster inn..."
|
||||||
@@ -130,6 +139,7 @@ common/views/components/cw-button.vue:
|
|||||||
hide: "Skjul"
|
hide: "Skjul"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
you: "Du"
|
you: "Du"
|
||||||
|
user: "Bruker"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
send: "Send"
|
send: "Send"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
@@ -192,8 +202,13 @@ common/views/components/profile-editor.vue:
|
|||||||
user-lists: "Lister"
|
user-lists: "Lister"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Bruker"
|
users: "Bruker"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
invite: "Inviter"
|
||||||
common/views/components/user-lists.vue:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Lister"
|
||||||
list-name: "Liste navn"
|
list-name: "Liste navn"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
invites: "Inviter"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Henter"
|
fetching: "Henter"
|
||||||
next: "Neste"
|
next: "Neste"
|
||||||
@@ -255,13 +270,6 @@ desktop/views/components/note.vue:
|
|||||||
detail: "Detaljer"
|
detail: "Detaljer"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
retry: "Prøv på nytt"
|
retry: "Prøv på nytt"
|
||||||
desktop/views/components/post-form.vue:
|
|
||||||
submit: "Send"
|
|
||||||
reply: "Svar"
|
|
||||||
posting: "Publiserer"
|
|
||||||
recent-tags: "Nylig"
|
|
||||||
visibility: "Synlighet"
|
|
||||||
error: "Feil"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nytt innlegg"
|
note: "Nytt innlegg"
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
@@ -283,6 +291,7 @@ common/views/components/api-settings.vue:
|
|||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
in-use: "brukt"
|
in-use: "brukt"
|
||||||
stats: "Statistikk"
|
stats: "Statistikk"
|
||||||
|
default-upload-folder-name: "Mappe(r)"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
save: "Lagre"
|
save: "Lagre"
|
||||||
desktop/views/components/settings.tags.vue:
|
desktop/views/components/settings.tags.vue:
|
||||||
@@ -307,11 +316,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Skriv nytt innlegg"
|
post: "Skriv nytt innlegg"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Søk"
|
placeholder: "Søk"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
accept: "Godta"
|
|
||||||
reject: "Avslå"
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "Brukerlister"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Innlegg"
|
notes: "Innlegg"
|
||||||
following: "Følger"
|
following: "Følger"
|
||||||
@@ -327,6 +331,10 @@ admin/views/index.vue:
|
|||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
notes: "Innlegg"
|
notes: "Innlegg"
|
||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
levels:
|
||||||
|
info: "Informasjon"
|
||||||
|
error: "Feil"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "Detaljer"
|
details: "Detaljer"
|
||||||
remove-report: "Slett"
|
remove-report: "Slett"
|
||||||
@@ -342,12 +350,16 @@ admin/views/drive.vue:
|
|||||||
local: "Lokalt"
|
local: "Lokalt"
|
||||||
delete: "Slett"
|
delete: "Slett"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Brukernavn"
|
||||||
users:
|
users:
|
||||||
title: "Bruker"
|
title: "Bruker"
|
||||||
state:
|
state:
|
||||||
all: "Alle"
|
all: "Alle"
|
||||||
origin:
|
origin:
|
||||||
local: "Lokalt"
|
local: "Lokalt"
|
||||||
|
admin/views/moderators.vue:
|
||||||
|
logs:
|
||||||
|
info: "Informasjon"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
add: "Legg til"
|
add: "Legg til"
|
||||||
@@ -365,6 +377,7 @@ admin/views/federation.vue:
|
|||||||
status: "Status"
|
status: "Status"
|
||||||
states:
|
states:
|
||||||
all: "Alle"
|
all: "Alle"
|
||||||
|
save: "Lagre"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
announcements: "Kunngjøringer"
|
announcements: "Kunngjøringer"
|
||||||
info: "Informasjon"
|
info: "Informasjon"
|
||||||
@@ -436,10 +449,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
admin: "admin"
|
admin: "admin"
|
||||||
bot: "bot"
|
bot: "bot"
|
||||||
cat: "katt"
|
cat: "katt"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
submit: "Send"
|
|
||||||
reply: "Svar"
|
|
||||||
error: "Feil"
|
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
adjective: "Mr."
|
adjective: "Mr."
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
@@ -448,17 +457,12 @@ mobile/views/components/ui.nav.vue:
|
|||||||
user-lists: "Lister"
|
user-lists: "Lister"
|
||||||
game: "Spill"
|
game: "Spill"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "Lister"
|
|
||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "Hjem"
|
home: "Hjem"
|
||||||
local: "Lokalt"
|
local: "Lokalt"
|
||||||
global: "Globalt"
|
global: "Globalt"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
add-widget: "Legg til"
|
add-widget: "Legg til"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
accept: "Godta"
|
|
||||||
reject: "Avslå"
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "Innlegg"
|
title: "Innlegg"
|
||||||
prev: "Forrige innlegg"
|
prev: "Forrige innlegg"
|
||||||
@@ -467,6 +471,8 @@ mobile/views/pages/games/reversi.vue:
|
|||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Søk"
|
search: "Søk"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notifikasjon"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
following: "Følger"
|
following: "Følger"
|
||||||
followers: "Følgere"
|
followers: "Følgere"
|
||||||
@@ -489,14 +495,28 @@ deck/deck.user-column.vue:
|
|||||||
following: "Følger"
|
following: "Følger"
|
||||||
followers: "Følgere"
|
followers: "Følgere"
|
||||||
images: "Bilder"
|
images: "Bilder"
|
||||||
docs:
|
pages:
|
||||||
api:
|
pin-this-page: "Fest til profilen din"
|
||||||
entities:
|
like: "Lik"
|
||||||
properties: "Egenskaper"
|
blocks:
|
||||||
endpoints:
|
image: "Bilder"
|
||||||
params: "Parametere"
|
script:
|
||||||
res: "Respons"
|
categories:
|
||||||
props:
|
random: "Tilfeldig"
|
||||||
name: "Navn"
|
list: "Lister"
|
||||||
type: "Type"
|
blocks:
|
||||||
description: "Beskrivelse"
|
_join:
|
||||||
|
arg1: "Lister"
|
||||||
|
random: "Tilfeldig"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Lister"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Lister"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Lister"
|
||||||
|
_pick:
|
||||||
|
arg1: "Lister"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Lister"
|
||||||
|
types:
|
||||||
|
array: "Lister"
|
||||||
|
|||||||
@@ -28,6 +28,18 @@ common:
|
|||||||
signin: "Zaloguj się"
|
signin: "Zaloguj się"
|
||||||
signup: "Rejestracja"
|
signup: "Rejestracja"
|
||||||
signout: "Wyloguj się"
|
signout: "Wyloguj się"
|
||||||
|
delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
|
||||||
|
notification-type: "Typy powiadomień"
|
||||||
|
notification-types:
|
||||||
|
all: "Wszyscy"
|
||||||
|
pollVote: "Głosy"
|
||||||
|
follow: "Śledzeni"
|
||||||
|
receiveFollowRequest: "Prośby o śledzenie"
|
||||||
|
reply: "Odpowiedzi"
|
||||||
|
quote: "Cytat"
|
||||||
|
renote: "Udostępnij"
|
||||||
|
mention: "Wzmianki"
|
||||||
|
reaction: "Reakcje"
|
||||||
got-it: "Rozumiem!"
|
got-it: "Rozumiem!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Wskazówki o dostosowywaniu"
|
title: "Wskazówki o dostosowywaniu"
|
||||||
@@ -54,6 +66,7 @@ common:
|
|||||||
month-and-day: "{month}-{day}"
|
month-and-day: "{month}-{day}"
|
||||||
trash: "Kosz"
|
trash: "Kosz"
|
||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
|
pages: "Strony"
|
||||||
messaging: "Rozmowy"
|
messaging: "Rozmowy"
|
||||||
home: "Strona główna"
|
home: "Strona główna"
|
||||||
deck: "Tablice"
|
deck: "Tablice"
|
||||||
@@ -64,9 +77,29 @@ common:
|
|||||||
favorites: "Moje ulubione"
|
favorites: "Moje ulubione"
|
||||||
permissions:
|
permissions:
|
||||||
"read:drive": "Wyświetl dysk"
|
"read:drive": "Wyświetl dysk"
|
||||||
|
"read:messaging": "Zobacz konwersację"
|
||||||
"write:votes": "Zagłosuj"
|
"write:votes": "Zagłosuj"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
explore: "Poznaj"
|
explore: "Poznaj"
|
||||||
|
post-form:
|
||||||
|
hide-contents: "Ukryj zawartość"
|
||||||
|
reply-placeholder: "Odpowiedź na ten wpis…"
|
||||||
|
quote-placeholder: "Zacytuj ten wpis…"
|
||||||
|
quote-attached: "Z cytatem"
|
||||||
|
submit: "Wpis"
|
||||||
|
reply: "Odpowiedz"
|
||||||
|
renote: "Udostępnij"
|
||||||
|
posting: "Wysyłanie"
|
||||||
|
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
||||||
|
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
||||||
|
create-poll: "Utwórz ankietę"
|
||||||
|
text-remain: "pozostałe znaki: {}"
|
||||||
|
recent-tags: "Ostatnie"
|
||||||
|
visibility: "Widoczność"
|
||||||
|
error: "Błąd"
|
||||||
|
enter-username: "Wprowadź nazwę użytkownika"
|
||||||
|
add-visible-user: "Dodaj użytkownika"
|
||||||
|
username-prompt: "Wprowadź nazwę użytkownika"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "N"
|
sunday: "N"
|
||||||
monday: "Pn"
|
monday: "Pn"
|
||||||
@@ -127,6 +160,7 @@ common:
|
|||||||
behavior: "Zachowanie"
|
behavior: "Zachowanie"
|
||||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||||
note-visibility: "Widoczność wpisów"
|
note-visibility: "Widoczność wpisów"
|
||||||
|
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||||
web-search-engine: "Wyszukiwarka internetowa"
|
web-search-engine: "Wyszukiwarka internetowa"
|
||||||
line-width: "Szerokości linii"
|
line-width: "Szerokości linii"
|
||||||
line-width-thin: "Cienka"
|
line-width-thin: "Cienka"
|
||||||
@@ -156,6 +190,8 @@ common:
|
|||||||
version: "Wersja:"
|
version: "Wersja:"
|
||||||
do-update: "Sprawdź dostępność nowych aktualizacji"
|
do-update: "Sprawdź dostępność nowych aktualizacji"
|
||||||
navbar-position-left: "Z lewej"
|
navbar-position-left: "Z lewej"
|
||||||
|
save: "Zapisz"
|
||||||
|
saved: "Zapisano"
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
delete: "Usuń"
|
delete: "Usuń"
|
||||||
loading: "Ładowanie"
|
loading: "Ładowanie"
|
||||||
@@ -164,9 +200,9 @@ common:
|
|||||||
update-available-title: "Aktualizacja jest dostępna"
|
update-available-title: "Aktualizacja jest dostępna"
|
||||||
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
|
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
|
||||||
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
||||||
verified-user: "Zweryfikowane konto"
|
|
||||||
hide-password: "Ukryj hasło"
|
hide-password: "Ukryj hasło"
|
||||||
show-password: "Pokaż hasło"
|
show-password: "Pokaż hasło"
|
||||||
|
enter-username: "Wprowadź nazwę użytkownika"
|
||||||
view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
|
view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
|
||||||
renoted-by: "{user} udostępnił(a)"
|
renoted-by: "{user} udostępnił(a)"
|
||||||
error:
|
error:
|
||||||
@@ -217,7 +253,8 @@ auth/views/index.vue:
|
|||||||
error: "Sesja nie istnieje."
|
error: "Sesja nie istnieje."
|
||||||
sign-in: "Proszę zalogować się."
|
sign-in: "Proszę zalogować się."
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "Zweryfikowane konto"
|
popular-users: "Popularni użytkownicy"
|
||||||
|
popular-tags: "Popularne tagi"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "Oczekiwanie na {}"
|
waiting-for: "Oczekiwanie na {}"
|
||||||
@@ -324,18 +361,15 @@ common/views/components/messaging.vue:
|
|||||||
search-user: "Znajdź użytkownika"
|
search-user: "Znajdź użytkownika"
|
||||||
you: "Ty"
|
you: "Ty"
|
||||||
no-history: "Brak historii"
|
no-history: "Brak historii"
|
||||||
|
user: "Użytkownicy"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "Brak konwersacji"
|
|
||||||
no-history: "Brak dalszej historii"
|
no-history: "Brak dalszej historii"
|
||||||
resize-form: "Przeciągnij aby zmienić rozmiar"
|
|
||||||
new-message: "Nowa wiadomość"
|
new-message: "Nowa wiadomość"
|
||||||
only-one-file-attached: "Tylko JEDEN plik może zostać dołączony do wiadomości"
|
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Wprowadź wiadomość tutaj"
|
input-message-here: "Wprowadź wiadomość tutaj"
|
||||||
send: "Wyślij"
|
send: "Wyślij"
|
||||||
attach-from-local: "Załącz pliki z komputera"
|
attach-from-local: "Załącz pliki z komputera"
|
||||||
attach-from-drive: "Załącz pliki z dysku"
|
attach-from-drive: "Załącz pliki z dysku"
|
||||||
only-one-file-attached: "Tylko jeden plik może zostać dołączony do wiadomości"
|
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "Przeczytano"
|
is-read: "Przeczytano"
|
||||||
deleted: "Wiadomość została usunięta"
|
deleted: "Wiadomość została usunięta"
|
||||||
@@ -394,6 +428,8 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Rzeczy"
|
objects: "Rzeczy"
|
||||||
symbols: "Symbole"
|
symbols: "Symbole"
|
||||||
flags: "Flagi"
|
flags: "Flagi"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Nazwa użytkownika"
|
username: "Nazwa użytkownika"
|
||||||
password: "Hasło"
|
password: "Hasło"
|
||||||
@@ -494,6 +530,7 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Pomyślnie zaktualizowano profil"
|
saved: "Pomyślnie zaktualizowano profil"
|
||||||
uploading: "Wysyłanie"
|
uploading: "Wysyłanie"
|
||||||
upload-failed: "Wysyłanie nie powiodło się"
|
upload-failed: "Wysyłanie nie powiodło się"
|
||||||
|
unable-to-process: "Nie udało się ukończyć działania."
|
||||||
email: "Ustawienia e-mail"
|
email: "Ustawienia e-mail"
|
||||||
email-address: "Adres e-mail"
|
email-address: "Adres e-mail"
|
||||||
email-verified: "Twój adres e-mail został zweryfikowany."
|
email-verified: "Twój adres e-mail został zweryfikowany."
|
||||||
@@ -512,8 +549,15 @@ common/views/components/user-list-editor.vue:
|
|||||||
remove-user: "Usuń z tej listy"
|
remove-user: "Usuń z tej listy"
|
||||||
delete-are-you-sure: "Usunąć listę \"$1\"?"
|
delete-are-you-sure: "Usunąć listę \"$1\"?"
|
||||||
deleted: "Usunięto"
|
deleted: "Usunięto"
|
||||||
|
add-user: "Dodaj użytkownika"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
deleted: "Usunięto"
|
||||||
|
invite: "Zaproś"
|
||||||
common/views/components/user-lists.vue:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "Listy"
|
||||||
list-name: "Nazwa listy"
|
list-name: "Nazwa listy"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
invites: "Zaproś"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Sprawdzanie"
|
fetching: "Sprawdzanie"
|
||||||
no-broadcasts: "Brak transmisji"
|
no-broadcasts: "Brak transmisji"
|
||||||
@@ -569,6 +613,8 @@ common/views/pages/follow.vue:
|
|||||||
request-pending: "Oczekiwanie na pozwolenie"
|
request-pending: "Oczekiwanie na pozwolenie"
|
||||||
follow-processing: "Przetwarzanie śledzenia"
|
follow-processing: "Przetwarzanie śledzenia"
|
||||||
follow-request: "Poproś o śledzenie"
|
follow-request: "Poproś o śledzenie"
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
received-follow-requests: "Prośby o śledzenie"
|
||||||
desktop:
|
desktop:
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
uploading-banner: "Wysyłanie baneru"
|
uploading-banner: "Wysyłanie baneru"
|
||||||
@@ -579,6 +625,7 @@ desktop:
|
|||||||
uploading-avatar: "Wysyłanie awatara"
|
uploading-avatar: "Wysyłanie awatara"
|
||||||
avatar-updated: "Wysłano awatar"
|
avatar-updated: "Wysłano awatar"
|
||||||
choose-avatar: "Wybierz awatar"
|
choose-avatar: "Wybierz awatar"
|
||||||
|
unable-to-process: "Nie udało się ukończyć działania."
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Czarny … Łącznie"
|
total: "Czarny … Łącznie"
|
||||||
notes: "Niebieski … Wpisy"
|
notes: "Niebieski … Wpisy"
|
||||||
@@ -637,6 +684,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
rename-folder: "Zmień nazwę katalogu"
|
rename-folder: "Zmień nazwę katalogu"
|
||||||
input-new-folder-name: "Wprowadź nową nazwę"
|
input-new-folder-name: "Wprowadź nową nazwę"
|
||||||
|
else-folders: "Inne"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
empty-draghover: "Przeciągnij tutaj!"
|
empty-draghover: "Przeciągnij tutaj!"
|
||||||
@@ -695,33 +743,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Brak powiadomień"
|
empty: "Brak powiadomień"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Dodaj użytkownika"
|
|
||||||
attach-location-information: "Załącz informacje o lokalizacji"
|
|
||||||
hide-contents: "Ukryj zawartość"
|
|
||||||
reply-placeholder: "Odpowiedz na ten wpis…"
|
|
||||||
quote-placeholder: "Zacytuj ten wpis…"
|
|
||||||
submit: "Wyślij"
|
|
||||||
reply: "Odpowiedz"
|
|
||||||
renote: "Udostępnienie"
|
|
||||||
posted: "Opublikowano!"
|
posted: "Opublikowano!"
|
||||||
replied: "Odpowiedziano!"
|
replied: "Odpowiedziano!"
|
||||||
reposted: "Udostępniono!"
|
reposted: "Udostępniono!"
|
||||||
note-failed: "Nie udało się wysłać"
|
note-failed: "Nie udało się wysłać"
|
||||||
reply-failed: "Nie udało się odpowiedzieć"
|
reply-failed: "Nie udało się odpowiedzieć"
|
||||||
renote-failed: "Nie udało się udostępnić"
|
renote-failed: "Nie udało się udostępnić"
|
||||||
posting: "Wysyłanie"
|
|
||||||
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
|
||||||
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Utwórz ankietę"
|
|
||||||
text-remain: "pozostałe znaki: {}"
|
|
||||||
recent-tags: "Ostatnie"
|
|
||||||
click-to-tagging: "Naciśnij aby oznaczyć"
|
|
||||||
visibility: "Widoczność"
|
|
||||||
geolocation-alert: "Twoje urządzenie nie obsługuje geolokalizacji."
|
|
||||||
error: "Bład"
|
|
||||||
enter-username: "Wprowadź nazwę użytkownika…"
|
|
||||||
annotations: "Treść ostrzeżenia (opcjonalnie)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nowy wpis"
|
note: "Nowy wpis"
|
||||||
reply: "Odpowiedz"
|
reply: "Odpowiedz"
|
||||||
@@ -777,6 +804,7 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "Max"
|
max: "Max"
|
||||||
in-use: "użyto"
|
in-use: "użyto"
|
||||||
stats: "Statystyki"
|
stats: "Statystyki"
|
||||||
|
default-upload-folder-name: "Katalog(i)"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "Wycisz / Zablokuj"
|
mute-and-block: "Wycisz / Zablokuj"
|
||||||
mute: "Wycisz"
|
mute: "Wycisz"
|
||||||
@@ -830,12 +858,6 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Utwórz nowy wpis"
|
post: "Utwórz nowy wpis"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Szukaj"
|
placeholder: "Szukaj"
|
||||||
desktop/views/components/received-follow-requests-window.vue:
|
|
||||||
title: "Prośby o śledzenie"
|
|
||||||
accept: "Zatwierdź"
|
|
||||||
reject: "Odmów"
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
|
||||||
title: "Listy"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Wpisy"
|
notes: "Wpisy"
|
||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
@@ -856,18 +878,22 @@ admin/views/index.vue:
|
|||||||
moderators: "Moderatorzy"
|
moderators: "Moderatorzy"
|
||||||
users: "Użytkownicy"
|
users: "Użytkownicy"
|
||||||
announcements: "Ogłoszenia"
|
announcements: "Ogłoszenia"
|
||||||
hashtags: "Hashtagi"
|
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Kokpit"
|
dashboard: "Kokpit"
|
||||||
accounts: "Konta"
|
accounts: "Konta"
|
||||||
notes: "Wpisy"
|
notes: "Wpisy"
|
||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
instances: "Instancja"
|
instances: "Instancja"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
levels:
|
||||||
|
info: "Informacje"
|
||||||
|
error: "Błąd"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "Szczegóły"
|
details: "Szczegóły"
|
||||||
remove-report: "Usuń"
|
remove-report: "Usuń"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
instance: "Instancja"
|
instance: "Instancja"
|
||||||
|
recaptcha-preview: "Pokaż podgląd"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
@@ -875,8 +901,8 @@ admin/views/instance.vue:
|
|||||||
invite: "Zaproś"
|
invite: "Zaproś"
|
||||||
save: "Zapisz"
|
save: "Zapisz"
|
||||||
saved: "Zapisano"
|
saved: "Zapisano"
|
||||||
user-recommendation-config: "Polecani użytkownicy"
|
|
||||||
email: "Adres e-mail"
|
email: "Adres e-mail"
|
||||||
|
test-email: "Test"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
notes: "Wpisy"
|
notes: "Wpisy"
|
||||||
users: "Użytkownicy"
|
users: "Użytkownicy"
|
||||||
@@ -898,6 +924,7 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "Cofnij oznaczenie jako zawartość wrażliwą"
|
unmark-as-sensitive: "Cofnij oznaczenie jako zawartość wrażliwą"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
user-not-found: "Nie znaleziono użytkownika"
|
user-not-found: "Nie znaleziono użytkownika"
|
||||||
|
username: "Nazwa użytkownika"
|
||||||
users:
|
users:
|
||||||
title: "Użytkownicy"
|
title: "Użytkownicy"
|
||||||
sort:
|
sort:
|
||||||
@@ -905,7 +932,6 @@ admin/views/users.vue:
|
|||||||
state:
|
state:
|
||||||
all: "Wszyscy"
|
all: "Wszyscy"
|
||||||
moderator: "Moderatorzy"
|
moderator: "Moderatorzy"
|
||||||
verified: "Zweryfikowane konto"
|
|
||||||
origin:
|
origin:
|
||||||
title: "Źródło"
|
title: "Źródło"
|
||||||
local: "Lokalny"
|
local: "Lokalny"
|
||||||
@@ -914,6 +940,9 @@ admin/views/users.vue:
|
|||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
add: "Zarejestruj się"
|
add: "Zarejestruj się"
|
||||||
|
logs:
|
||||||
|
moderator: "Moderatorzy"
|
||||||
|
info: "Informacje"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
name: "Nazwa Emoji"
|
name: "Nazwa Emoji"
|
||||||
@@ -951,6 +980,8 @@ admin/views/federation.vue:
|
|||||||
blocked: "Zablokuj"
|
blocked: "Zablokuj"
|
||||||
chart-srcs:
|
chart-srcs:
|
||||||
requests: "Żądania"
|
requests: "Żądania"
|
||||||
|
blocked-hosts: "Zablokuj"
|
||||||
|
save: "Zapisz"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "O Misskey"
|
about: "O Misskey"
|
||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
@@ -1073,17 +1104,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "kot"
|
cat: "kot"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Brak powiadomień"
|
empty: "Brak powiadomień"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Dodaj użytkownika"
|
|
||||||
submit: "Wyślij"
|
|
||||||
reply: "Odpowiedz"
|
|
||||||
renote: "Udostępnij"
|
|
||||||
quote-placeholder: "Zacytuj ten wpis… (nieobowiązkowe)"
|
|
||||||
reply-placeholder: "Odpowiedź na ten wpis…"
|
|
||||||
cw-placeholder: "Treść ostrzeżenia (opcjonalnie)"
|
|
||||||
geolocation-alert: "Twoje urządzenie nie obsługuje geolokalizacji."
|
|
||||||
error: "Błąd"
|
|
||||||
username-prompt: "Wprowadź nazwę użytkownika"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "ten wpis jest prywatny"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "ten wpis został usunięty"
|
deleted: "ten wpis został usunięty"
|
||||||
@@ -1105,8 +1125,6 @@ mobile/views/pages/drive.vue:
|
|||||||
contextmenu:
|
contextmenu:
|
||||||
upload: "Wyślij plik"
|
upload: "Wyślij plik"
|
||||||
create-folder: "Utwórz katalog"
|
create-folder: "Utwórz katalog"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "Listy"
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "Rozpocznijmy! 📦"
|
lets-start: "Rozpocznijmy! 📦"
|
||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
@@ -1121,10 +1139,6 @@ mobile/views/pages/widgets.vue:
|
|||||||
customization-tips: "Wskazówki o dostosowywaniu"
|
customization-tips: "Wskazówki o dostosowywaniu"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
activity: "Aktywność"
|
activity: "Aktywność"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
|
||||||
title: "Prośby o śledzenie"
|
|
||||||
accept: "Zatwierdź"
|
|
||||||
reject: "Odmów"
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "Wpis"
|
title: "Wpis"
|
||||||
prev: "Poprzedni wpis"
|
prev: "Poprzedni wpis"
|
||||||
@@ -1135,6 +1149,8 @@ mobile/views/pages/search.vue:
|
|||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Wybierz plik"
|
select-file: "Wybierz plik"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Powiadomienia"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Zalogowany jako {}"
|
signed-in-as: "Zalogowany jako {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1190,23 +1206,6 @@ deck/deck.user-column.vue:
|
|||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Znalazłeś błąd lub chcesz pomóc w tworzeniu dokumentacji?"
|
edit-this-page-on-github: "Znalazłeś błąd lub chcesz pomóc w tworzeniu dokumentacji?"
|
||||||
edit-this-page-on-github-link: "Edytuj stronę na GitHubie!"
|
edit-this-page-on-github-link: "Edytuj stronę na GitHubie!"
|
||||||
api:
|
|
||||||
entities:
|
|
||||||
properties: "Właściwości"
|
|
||||||
endpoints:
|
|
||||||
params: "Parametry"
|
|
||||||
no-params: "Brak parametrów."
|
|
||||||
res: "Odpowiedź"
|
|
||||||
require-credential: "Punkt końcowy wymaga informacji o uwierzytelnieniu."
|
|
||||||
require-permission: "Ten punkt końcowy wymaga uprawnienia {permission}."
|
|
||||||
has-limit: "Istnieje limit częstotliwości."
|
|
||||||
min-interval-limit: "Nie możesz wykonać żądania przed upłynięciem {interval} od ostatniego żądania."
|
|
||||||
show-src: "Możesz zobaczyć kod źródłowy tego punktu końcowego."
|
|
||||||
show-src-link: "Zobacz kod na GitHubie"
|
|
||||||
props:
|
|
||||||
name: "Nazwa"
|
|
||||||
type: "Rodzaj"
|
|
||||||
description: "Opis"
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Zarządzaj aplikacjami"
|
manage-apps: "Zarządzaj aplikacjami"
|
||||||
dev/views/apps.vue:
|
dev/views/apps.vue:
|
||||||
@@ -1215,3 +1214,50 @@ dev/views/apps.vue:
|
|||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
app-name: "Nazwa Aplikacji"
|
app-name: "Nazwa Aplikacji"
|
||||||
authority: "Uprawnienia"
|
authority: "Uprawnienia"
|
||||||
|
pages:
|
||||||
|
pin-this-page: "Przypnij do profilu"
|
||||||
|
unpin-this-page: "Odepnij"
|
||||||
|
like: "Lubię"
|
||||||
|
title: "Tytuł"
|
||||||
|
blocks:
|
||||||
|
image: "Zdjęcia"
|
||||||
|
post: "Formularz tworzenia"
|
||||||
|
_textInput:
|
||||||
|
text: "Tytuł"
|
||||||
|
_textareaInput:
|
||||||
|
text: "Tytuł"
|
||||||
|
_numberInput:
|
||||||
|
text: "Tytuł"
|
||||||
|
_switch:
|
||||||
|
text: "Tytuł"
|
||||||
|
_counter:
|
||||||
|
text: "Tytuł"
|
||||||
|
_button:
|
||||||
|
text: "Tytuł"
|
||||||
|
_radioButton:
|
||||||
|
title: "Tytuł"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
random: "Losowy"
|
||||||
|
list: "Listy"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "Listy"
|
||||||
|
random: "Losowy"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Listy"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Listy"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Listy"
|
||||||
|
_pick:
|
||||||
|
arg1: "Listy"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listy"
|
||||||
|
types:
|
||||||
|
array: "Listy"
|
||||||
|
room:
|
||||||
|
translate: "Przenieś"
|
||||||
|
save: "Zapisz"
|
||||||
|
furnitures:
|
||||||
|
moon: "Pn"
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ common:
|
|||||||
application-authorization: "Aplicativos autorizados"
|
application-authorization: "Aplicativos autorizados"
|
||||||
close: "Fechar"
|
close: "Fechar"
|
||||||
do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
|
do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
|
||||||
|
notification-types:
|
||||||
|
follow: "Seguindo"
|
||||||
got-it: "Entendi!"
|
got-it: "Entendi!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Dicas de personalização"
|
title: "Dicas de personalização"
|
||||||
@@ -45,6 +47,9 @@ common:
|
|||||||
trash: "Lixo"
|
trash: "Lixo"
|
||||||
timeline: "Linha do tempo"
|
timeline: "Linha do tempo"
|
||||||
followers: "Seguidores"
|
followers: "Seguidores"
|
||||||
|
post-form:
|
||||||
|
enter-username: "Digite o nome de usuário."
|
||||||
|
username-prompt: "Digite o nome de usuário."
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Dom"
|
sunday: "Dom"
|
||||||
monday: "Seg"
|
monday: "Seg"
|
||||||
@@ -89,7 +94,7 @@ common:
|
|||||||
update-available-title: "Atualização disponível"
|
update-available-title: "Atualização disponível"
|
||||||
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
|
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
|
||||||
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
|
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
|
||||||
verified-user: "Conta verificada"
|
enter-username: "Digite o nome de usuário."
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
my-turn: "Seu turno"
|
my-turn: "Seu turno"
|
||||||
@@ -129,8 +134,6 @@ auth/views/index.vue:
|
|||||||
please-go-back: "Por favor, volte ao aplicativo."
|
please-go-back: "Por favor, volte ao aplicativo."
|
||||||
error: "A sessão não existe."
|
error: "A sessão não existe."
|
||||||
sign-in: "Por favor, entre."
|
sign-in: "Por favor, entre."
|
||||||
common/views/pages/explore.vue:
|
|
||||||
verified-users: "Conta verificada"
|
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
invite: "Convidar"
|
invite: "Convidar"
|
||||||
rule: "Como jogar"
|
rule: "Como jogar"
|
||||||
@@ -163,6 +166,10 @@ common/views/components/profile-editor.vue:
|
|||||||
name: "Nome"
|
name: "Nome"
|
||||||
export-targets:
|
export-targets:
|
||||||
following-list: "Seguindo"
|
following-list: "Seguindo"
|
||||||
|
common/views/components/user-group-editor.vue:
|
||||||
|
invite: "Convidar"
|
||||||
|
common/views/components/user-groups.vue:
|
||||||
|
invites: "Convidar"
|
||||||
common/views/widgets/posts-monitor.vue:
|
common/views/widgets/posts-monitor.vue:
|
||||||
title: "Gráfico de publicações"
|
title: "Gráfico de publicações"
|
||||||
common/views/widgets/memo.vue:
|
common/views/widgets/memo.vue:
|
||||||
@@ -194,10 +201,6 @@ admin/views/instance.vue:
|
|||||||
invite: "Convidar"
|
invite: "Convidar"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
delete: "Apagar"
|
delete: "Apagar"
|
||||||
admin/views/users.vue:
|
|
||||||
users:
|
|
||||||
state:
|
|
||||||
verified: "Conta verificada"
|
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
emojis:
|
emojis:
|
||||||
remove: "Apagar"
|
remove: "Apagar"
|
||||||
@@ -274,18 +277,10 @@ deck/deck.user-column.vue:
|
|||||||
timeline: "Linha do tempo"
|
timeline: "Linha do tempo"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github-link: "Edite esta página no GitHub!"
|
edit-this-page-on-github-link: "Edite esta página no GitHub!"
|
||||||
api:
|
|
||||||
entities:
|
|
||||||
properties: "Propriedades"
|
|
||||||
endpoints:
|
|
||||||
params: "Parâmetros"
|
|
||||||
no-params: "Sem parâmetros"
|
|
||||||
res: "Resposta"
|
|
||||||
show-src-link: "Veja o código no GitHub"
|
|
||||||
generated: "Este documento foi gerado pelas definições da API."
|
|
||||||
props:
|
|
||||||
name: "Nome"
|
|
||||||
type: "Tipo"
|
|
||||||
description: "Descrição"
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Gerenciar aplicativos"
|
manage-apps: "Gerenciar aplicativos"
|
||||||
|
pages:
|
||||||
|
like: "Curtir"
|
||||||
|
blocks:
|
||||||
|
image: "Imagens"
|
||||||
|
post: "Formulário de publicação"
|
||||||
|
|||||||
@@ -26,6 +26,14 @@ common:
|
|||||||
do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
|
do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
|
||||||
load-more: "Загрузить больше"
|
load-more: "Загрузить больше"
|
||||||
enter-password: "Пожалуйста, введите ваш пароль"
|
enter-password: "Пожалуйста, введите ваш пароль"
|
||||||
|
2fa: "Двухфакторная аутентификация"
|
||||||
|
customize-home: "Настройка домашней страницы"
|
||||||
|
featured-notes: "Рекомендуемые"
|
||||||
|
dark-mode: "Тёмная тема"
|
||||||
|
signin: "Войти"
|
||||||
|
signup: "Регистрация"
|
||||||
|
signout: "Выйти"
|
||||||
|
reload-to-apply-the-setting: "Вам необходимо перезагрузить страницу, чтобы применить настройки. Вы хотите перезагрузить сейчас?"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Советы по настройке"
|
title: "Советы по настройке"
|
||||||
gotit: "Понятно!"
|
gotit: "Понятно!"
|
||||||
@@ -51,7 +59,14 @@ common:
|
|||||||
month-and-day: "{day}.{month}"
|
month-and-day: "{day}.{month}"
|
||||||
trash: "Мусорное ведро"
|
trash: "Мусорное ведро"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
pages: "Страницы"
|
||||||
messaging: "Чат"
|
messaging: "Чат"
|
||||||
|
timeline: "Лента"
|
||||||
|
followers: "Подписчики"
|
||||||
|
favorites: "Избранное"
|
||||||
|
post-form:
|
||||||
|
reply: "Ответить"
|
||||||
|
create-poll: "Создать опрос"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Вс"
|
sunday: "Вс"
|
||||||
monday: "Пн"
|
monday: "Пн"
|
||||||
@@ -146,3 +161,10 @@ mobile/views/components/sub-note-content.vue:
|
|||||||
poll: "Голосования"
|
poll: "Голосования"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
customization-tips: "Советы по настройке"
|
customization-tips: "Советы по настройке"
|
||||||
|
pages:
|
||||||
|
like: "Нравится"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
random: "Случайно"
|
||||||
|
blocks:
|
||||||
|
random: "Случайно"
|
||||||
|
|||||||
@@ -35,6 +35,20 @@ common:
|
|||||||
signout: "退出"
|
signout: "退出"
|
||||||
reload-to-apply-the-setting: "必须重新加载页面以应用此设置。 确实要立即重新加载吗?"
|
reload-to-apply-the-setting: "必须重新加载页面以应用此设置。 确实要立即重新加载吗?"
|
||||||
fetching-as-ap-object: "联合查询"
|
fetching-as-ap-object: "联合查询"
|
||||||
|
unfollow-confirm: "取消对{name}的关注?"
|
||||||
|
delete-confirm: "确定删除这个投稿吗?"
|
||||||
|
signin-required: "请先登录"
|
||||||
|
notification-type: "通知类型"
|
||||||
|
notification-types:
|
||||||
|
all: "所有"
|
||||||
|
pollVote: "投票"
|
||||||
|
follow: "关注中"
|
||||||
|
receiveFollowRequest: "关注请求"
|
||||||
|
reply: "回复"
|
||||||
|
quote: "引用"
|
||||||
|
renote: "转推"
|
||||||
|
mention: "提及"
|
||||||
|
reaction: "回应"
|
||||||
got-it: "知道了"
|
got-it: "知道了"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "自定义提示"
|
title: "自定义提示"
|
||||||
@@ -62,6 +76,7 @@ common:
|
|||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "垃圾箱"
|
trash: "垃圾箱"
|
||||||
drive: "网盘"
|
drive: "网盘"
|
||||||
|
pages: "页面"
|
||||||
messaging: "聊天"
|
messaging: "聊天"
|
||||||
home: "首页"
|
home: "首页"
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
@@ -94,6 +109,34 @@ common:
|
|||||||
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: "转推"
|
||||||
|
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: "输入用户名"
|
||||||
|
enter-file-name: "编辑文件名"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "一"
|
monday: "一"
|
||||||
@@ -144,7 +187,7 @@ common:
|
|||||||
profile: "个人资料"
|
profile: "个人资料"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "应用程序"
|
apps: "应用程序"
|
||||||
tags: "标签"
|
tags: "哈希标签"
|
||||||
mute-and-block: "屏蔽/拉黑"
|
mute-and-block: "屏蔽/拉黑"
|
||||||
blocking: "拉黑"
|
blocking: "拉黑"
|
||||||
security: "安全性"
|
security: "安全性"
|
||||||
@@ -160,6 +203,11 @@ common:
|
|||||||
remember-note-visibility: "记住帖子可见性"
|
remember-note-visibility: "记住帖子可见性"
|
||||||
web-search-engine: "搜索引擎"
|
web-search-engine: "搜索引擎"
|
||||||
web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "粘贴"
|
||||||
|
pasted-file-name: "粘贴的文件名模板"
|
||||||
|
pasted-file-name-desc: "例: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "粘贴时编辑文件名"
|
||||||
|
paste-dialog-desc: "粘贴时显示编辑文件名的对话框"
|
||||||
keep-cw: "保留内容警告"
|
keep-cw: "保留内容警告"
|
||||||
keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。"
|
keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。"
|
||||||
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
||||||
@@ -167,7 +215,8 @@ common:
|
|||||||
use-avatar-reversi-stones: "用头像作为黑白棋的棋子"
|
use-avatar-reversi-stones: "用头像作为黑白棋的棋子"
|
||||||
disable-animated-mfm: "在帖子中禁用动画文本"
|
disable-animated-mfm: "在帖子中禁用动画文本"
|
||||||
disable-showing-animated-images: "不播放动画"
|
disable-showing-animated-images: "不播放动画"
|
||||||
suggest-recent-hashtags: "在帖子表单上显示最近流行的主题标签"
|
enable-quick-notification-view: "启用通知快速查看"
|
||||||
|
suggest-recent-hashtags: "在帖子表单上显示最近流行的哈希标签"
|
||||||
always-show-nsfw: "总是显示 NSFW 的内容"
|
always-show-nsfw: "总是显示 NSFW 的内容"
|
||||||
always-mark-nsfw: "总是用 NSFW 来标记附件"
|
always-mark-nsfw: "总是用 NSFW 来标记附件"
|
||||||
show-full-acct: "不要从用户名中忽略主机名"
|
show-full-acct: "不要从用户名中忽略主机名"
|
||||||
@@ -242,6 +291,11 @@ common:
|
|||||||
disable-via-mobile: "不要将帖子标记为“来自手机”"
|
disable-via-mobile: "不要将帖子标记为“来自手机”"
|
||||||
load-raw-images: "以原始质量显示附加图像"
|
load-raw-images: "以原始质量显示附加图像"
|
||||||
load-remote-media: "显示来自远程服务器的媒体"
|
load-remote-media: "显示来自远程服务器的媒体"
|
||||||
|
sync: "同步"
|
||||||
|
save: "保存"
|
||||||
|
saved: "已保存"
|
||||||
|
home-profile: "定制首页数据"
|
||||||
|
deck-profile: "定制Deck数据"
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
delete: "删除"
|
delete: "删除"
|
||||||
loading: "正在加载中"
|
loading: "正在加载中"
|
||||||
@@ -250,9 +304,9 @@ common:
|
|||||||
update-available-title: "有可用更新"
|
update-available-title: "有可用更新"
|
||||||
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
|
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
|
||||||
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
||||||
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: "此用户信息可能不准确。"
|
||||||
@@ -297,7 +351,7 @@ common:
|
|||||||
server: "服务器信息"
|
server: "服务器信息"
|
||||||
nav: "导航"
|
nav: "导航"
|
||||||
tips: "提示"
|
tips: "提示"
|
||||||
hashtags: "标签"
|
hashtags: "哈希标签"
|
||||||
queue: "队列"
|
queue: "队列"
|
||||||
dev: "构建应用程序失败,请再试一次。"
|
dev: "构建应用程序失败,请再试一次。"
|
||||||
ai-chan-kawaii: "小蓝真可爱"
|
ai-chan-kawaii: "小蓝真可爱"
|
||||||
@@ -318,7 +372,7 @@ auth/views/index.vue:
|
|||||||
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: "新用户"
|
||||||
@@ -448,18 +502,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: "从电脑中添加文件"
|
attach-from-local: "从电脑中添加文件"
|
||||||
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: "此消息已被删除"
|
||||||
@@ -469,9 +528,10 @@ common/views/components/nav.vue:
|
|||||||
status: "状态"
|
status: "状态"
|
||||||
wiki: "维基百科"
|
wiki: "维基百科"
|
||||||
donors: "捐赠者"
|
donors: "捐赠者"
|
||||||
repository: "代码库"
|
repository: "源码库"
|
||||||
develop: "开发人员"
|
develop: "开发人员"
|
||||||
feedback: "反馈"
|
feedback: "反馈"
|
||||||
|
tos: "服务条款"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "提到"
|
mention: "提到"
|
||||||
detail: "详细信息"
|
detail: "详细信息"
|
||||||
@@ -485,7 +545,10 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "取消置顶"
|
unpin: "取消置顶"
|
||||||
delete: "删除"
|
delete: "删除"
|
||||||
delete-confirm: "确定删除这个投稿吗?"
|
delete-confirm: "确定删除这个投稿吗?"
|
||||||
|
delete-and-edit: "删除和编辑"
|
||||||
|
delete-and-edit-confirm: "要删除此帖并再次编辑吗?对此帖的所有回应,转推和回复也将被删除。"
|
||||||
remote: "显示原始投稿"
|
remote: "显示原始投稿"
|
||||||
|
pin-limit-exceeded: "无法置顶更多了。"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "提到"
|
mention: "提到"
|
||||||
mute: "屏蔽"
|
mute: "屏蔽"
|
||||||
@@ -543,6 +606,7 @@ common/views/components/poll-editor.vue:
|
|||||||
day: "日"
|
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: "人"
|
||||||
@@ -553,6 +617,14 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "物品"
|
objects: "物品"
|
||||||
symbols: "符号"
|
symbols: "符号"
|
||||||
flags: "旗帜"
|
flags: "旗帜"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "模式"
|
||||||
|
intro: "您可以指定使用桌面版或移动版。"
|
||||||
|
choices:
|
||||||
|
auto: "自动选择"
|
||||||
|
desktop: "固定为桌面版"
|
||||||
|
mobile: "固定为移动版"
|
||||||
|
info: "更改将在刷新页面后生效。"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "用户名"
|
username: "用户名"
|
||||||
password: "密码"
|
password: "密码"
|
||||||
@@ -563,6 +635,8 @@ common/views/components/signin.vue:
|
|||||||
signin-with-github: "用 GitHub 登录"
|
signin-with-github: "用 GitHub 登录"
|
||||||
signin-with-discord: "用 Discord 登录"
|
signin-with-discord: "用 Discord 登录"
|
||||||
login-failed: "登录失败。请检查用户名和密码。"
|
login-failed: "登录失败。请检查用户名和密码。"
|
||||||
|
tap-key: "点击安全密钥登录"
|
||||||
|
enter-2fa-code: "输入验证码"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "邀请码"
|
invitation-code: "邀请码"
|
||||||
invitation-info: "如果您没有邀请码,请联系<a href=\"{}\">管理员</a>。"
|
invitation-info: "如果您没有邀请码,请联系<a href=\"{}\">管理员</a>。"
|
||||||
@@ -584,6 +658,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:
|
||||||
@@ -665,6 +741,9 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "您的个人资料已保存"
|
saved: "您的个人资料已保存"
|
||||||
uploading: "正在上传"
|
uploading: "正在上传"
|
||||||
upload-failed: "上传失败"
|
upload-failed: "上传失败"
|
||||||
|
unable-to-process: "无法完成操作"
|
||||||
|
avatar-not-an-image: "选择的头像文件不是图片格式"
|
||||||
|
banner-not-an-image: "选择的横幅背景不是图片格式"
|
||||||
email: "邮件设置"
|
email: "邮件设置"
|
||||||
email-address: "电子邮件地址"
|
email-address: "电子邮件地址"
|
||||||
email-verified: "电子邮件地址已验证"
|
email-verified: "电子邮件地址已验证"
|
||||||
@@ -684,6 +763,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "危险选项"
|
danger-zone: "危险选项"
|
||||||
delete-account: "删除帐户"
|
delete-account: "删除帐户"
|
||||||
account-deleted: "帐户已被删除。 数据会在一段时间之后清除。"
|
account-deleted: "帐户已被删除。 数据会在一段时间之后清除。"
|
||||||
|
profile-metadata: "个人资料补充信息"
|
||||||
|
metadata-label: "标签"
|
||||||
|
metadata-content: "内容"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "用户"
|
users: "用户"
|
||||||
rename: "重命名列表"
|
rename: "重命名列表"
|
||||||
@@ -691,9 +773,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:
|
common/views/components/user-lists.vue:
|
||||||
|
user-lists: "列表"
|
||||||
create-list: "创建列表"
|
create-list: "创建列表"
|
||||||
list-name: "列表名称"
|
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: "没有公告"
|
||||||
@@ -713,7 +818,7 @@ common/views/widgets/posts-monitor.vue:
|
|||||||
title: "投稿表格"
|
title: "投稿表格"
|
||||||
toggle: "切换视图"
|
toggle: "切换视图"
|
||||||
common/views/widgets/hashtags.vue:
|
common/views/widgets/hashtags.vue:
|
||||||
title: "标签"
|
title: "哈希标签"
|
||||||
common/views/widgets/server.vue:
|
common/views/widgets/server.vue:
|
||||||
title: "服务器信息"
|
title: "服务器信息"
|
||||||
toggle: "切换显示"
|
toggle: "切换显示"
|
||||||
@@ -755,6 +860,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: "背景"
|
||||||
@@ -766,6 +875,7 @@ desktop:
|
|||||||
uploading-avatar: "上传一个新的头像"
|
uploading-avatar: "上传一个新的头像"
|
||||||
avatar-updated: "成功上传头像"
|
avatar-updated: "成功上传头像"
|
||||||
choose-avatar: "选择作为头像的图片"
|
choose-avatar: "选择作为头像的图片"
|
||||||
|
unable-to-process: "无法完成操作"
|
||||||
invalid-filetype: "不接受此文件类型"
|
invalid-filetype: "不接受此文件类型"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "黑 ... 总计"
|
total: "黑 ... 总计"
|
||||||
@@ -795,7 +905,7 @@ desktop/views/components/crop-window.vue:
|
|||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
ok: "确定"
|
ok: "确定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "已使用"
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "头像"
|
avatar: "头像"
|
||||||
banner: "背景"
|
banner: "背景"
|
||||||
@@ -806,7 +916,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "取消标记为“敏感”"
|
unmark-as-sensitive: "取消标记为“敏感”"
|
||||||
copy-url: "复制链接"
|
copy-url: "复制链接"
|
||||||
download: "下载"
|
download: "下载"
|
||||||
else-files: "其他..."
|
else-files: "其他"
|
||||||
set-as-avatar: "设置为头像"
|
set-as-avatar: "设置为头像"
|
||||||
set-as-banner: "设置为背景"
|
set-as-banner: "设置为背景"
|
||||||
open-in-app: "在应用程序中打开"
|
open-in-app: "在应用程序中打开"
|
||||||
@@ -816,15 +926,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied: "已复制"
|
copied: "已复制"
|
||||||
copied-url-to-clipboard: "已复制链接到剪贴板"
|
copied-url-to-clipboard: "已复制链接到剪贴板"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "默认上传文件夹"
|
||||||
unable-to-process: "无法完成操作"
|
unable-to-process: "无法完成操作"
|
||||||
circular-reference-detected: "目标文件夹是您要移动的文件夹的子文件夹。"
|
circular-reference-detected: "目标文件夹是您要移动的文件夹的子文件夹。"
|
||||||
unhandled-error: "未知错误"
|
unhandled-error: "未知错误"
|
||||||
|
unable-to-delete: "无法删除"
|
||||||
|
has-child-files-or-folders: "此文件夹不为空,无法删除。"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "移动到此文件夹"
|
move-to-this-folder: "移动到此文件夹"
|
||||||
show-in-new-window: "在新窗口打开"
|
show-in-new-window: "在新窗口打开"
|
||||||
rename: "重命名"
|
rename: "重命名"
|
||||||
rename-folder: "重命名文件夹"
|
rename-folder: "重命名文件夹"
|
||||||
input-new-folder-name: "请输入新文件名"
|
input-new-folder-name: "请输入新文件名"
|
||||||
|
else-folders: "其他"
|
||||||
|
set-as-upload-folder: "设置为默认上传文件夹"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
empty-draghover: "放在这里!因为你知道我很可爱,对吗?"
|
empty-draghover: "放在这里!因为你知道我很可爱,对吗?"
|
||||||
@@ -885,34 +1000,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
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: "转推"
|
|
||||||
posted: "已发送投稿!"
|
posted: "已发送投稿!"
|
||||||
replied: "已回复!"
|
replied: "已回复!"
|
||||||
reposted: "已转推!"
|
reposted: "已转推!"
|
||||||
note-failed: "发帖失败"
|
note-failed: "发帖失败"
|
||||||
reply-failed: "回复失败"
|
reply-failed: "回复失败"
|
||||||
renote-failed: "转推失败"
|
renote-failed: "转推失败"
|
||||||
posting: "发送中"
|
|
||||||
attach-media-from-local: "从设备中添加媒体文件"
|
|
||||||
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: "请填写一个用户名"
|
|
||||||
annotations: "注释帖子(可选)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "新建帖子"
|
note: "新建帖子"
|
||||||
reply: "回复"
|
reply: "回复"
|
||||||
@@ -952,6 +1045,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "设置完成"
|
success: "设置完成"
|
||||||
failed: "设置失败, 请确保您的密钥是正确的。"
|
failed: "设置失败, 请确保您的密钥是正确的。"
|
||||||
info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
|
info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
|
||||||
|
totp-header: "身份验证 App"
|
||||||
|
security-key-header: "安全密钥"
|
||||||
|
security-key: "为了增强安全性,您可以使用支持FIDO2的硬件安全密钥登录您的帐户。 登录时,您将需要注册安全密钥或身份验证应用。"
|
||||||
|
last-used: "最后使用:"
|
||||||
|
activate-key: "单击以激活您的安全密钥"
|
||||||
|
security-key-name: "密钥名称"
|
||||||
|
register-security-key: "安全密钥注册完成"
|
||||||
|
something-went-wrong: "糟糕!安全密钥注册出现问题:"
|
||||||
|
key-unregistered: "安全密钥已被删除。"
|
||||||
|
use-password-less-login: "使用免密码登录"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "阅读注意"
|
sensitive: "阅读注意"
|
||||||
click-to-show: "点击查看"
|
click-to-show: "点击查看"
|
||||||
@@ -974,8 +1077,11 @@ 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: "已使用"
|
||||||
stats: "统计"
|
stats: "统计"
|
||||||
|
default-upload-folder: "默认上传文件夹"
|
||||||
|
default-upload-folder-name: "文件夹"
|
||||||
|
change-default-upload-folder: "更改文件夹"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "屏蔽/拉黑"
|
mute-and-block: "屏蔽/拉黑"
|
||||||
mute: "屏蔽"
|
mute: "屏蔽"
|
||||||
@@ -1016,8 +1122,8 @@ desktop/views/components/timeline.vue:
|
|||||||
mentions: "提到的"
|
mentions: "提到的"
|
||||||
messages: "直接发布"
|
messages: "直接发布"
|
||||||
list: "列表"
|
list: "列表"
|
||||||
hashtag: "标签"
|
hashtag: "哈希标签"
|
||||||
add-tag-timeline: "添加标签"
|
add-tag-timeline: "添加哈希标签"
|
||||||
add-list: "添加列表"
|
add-list: "添加列表"
|
||||||
list-name: "列表名称"
|
list-name: "列表名称"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
@@ -1026,6 +1132,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:
|
||||||
@@ -1036,12 +1143,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: "用户列表"
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "帖子"
|
notes: "帖子"
|
||||||
following: "关注中"
|
following: "关注中"
|
||||||
@@ -1063,11 +1164,16 @@ admin/views/index.vue:
|
|||||||
users: "用户"
|
users: "用户"
|
||||||
federation: "联合"
|
federation: "联合"
|
||||||
announcements: "公告"
|
announcements: "公告"
|
||||||
hashtags: "标签"
|
|
||||||
abuse: "举报垃圾信息"
|
abuse: "举报垃圾信息"
|
||||||
queue: "作业队列"
|
queue: "作业队列"
|
||||||
logs: "登录"
|
logs: "登录"
|
||||||
|
db: "数据库"
|
||||||
back-to-misskey: "返回 Misskey"
|
back-to-misskey: "返回 Misskey"
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "表格"
|
||||||
|
vacuum: "VACUUM"
|
||||||
|
vacuum-info: "清理数据库。 保持数据完整并减少磁盘使用量。 此操作通常会自动定期执行。"
|
||||||
|
vacuum-exclamation: "运行VACUUM之后,数据库上的负载可能会持续一段时间,并且可能不响应用户操作。"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
accounts: "账户"
|
accounts: "账户"
|
||||||
@@ -1079,6 +1185,32 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "队列"
|
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: "举报垃圾信息"
|
||||||
target: "目标"
|
target: "目标"
|
||||||
@@ -1090,14 +1222,34 @@ admin/views/instance.vue:
|
|||||||
instance-name: "实例名称"
|
instance-name: "实例名称"
|
||||||
instance-description: "实例介绍"
|
instance-description: "实例介绍"
|
||||||
host: "主机名"
|
host: "主机名"
|
||||||
|
icon-url: "图标URL"
|
||||||
|
logo-url: "Logo URL"
|
||||||
banner-url: "背景图片地址"
|
banner-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: "每个用户的网盘空间"
|
||||||
@@ -1105,9 +1257,14 @@ admin/views/instance.vue:
|
|||||||
mb: "以兆字节(Mbps)为单位"
|
mb: "以兆字节(Mbps)为单位"
|
||||||
recaptcha-config: "reCAPTCHA设置"
|
recaptcha-config: "reCAPTCHA设置"
|
||||||
recaptcha-info: "reCAPTCHA token是必要的. 请从 https://www.google.com/recaptcha/intro/ 获取。\n请注意, 该功能在中国大陆不可用。"
|
recaptcha-info: "reCAPTCHA token是必要的. 请从 https://www.google.com/recaptcha/intro/ 获取。\n请注意, 该功能在中国大陆不可用。"
|
||||||
|
recaptcha-info2: "不支持v3。请使用v2。"
|
||||||
enable-recaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)"
|
enable-recaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)"
|
||||||
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"
|
||||||
@@ -1138,7 +1295,8 @@ admin/views/instance.vue:
|
|||||||
invite: "邀请"
|
invite: "邀请"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存完毕"
|
saved: "保存完毕"
|
||||||
user-recommendation-config: "推荐用户"
|
pinned-users: "置顶用户"
|
||||||
|
pinned-users-info: "描述您要置顶的用户,以换行符分隔。"
|
||||||
email-config: "电子邮件服务器设置"
|
email-config: "电子邮件服务器设置"
|
||||||
email-config-info: "用于确认电子邮件和密码重置等。"
|
email-config-info: "用于确认电子邮件和密码重置等。"
|
||||||
enable-email: "启用电子邮件送递"
|
enable-email: "启用电子邮件送递"
|
||||||
@@ -1150,6 +1308,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "SMTP身份验证"
|
smtp-auth: "SMTP身份验证"
|
||||||
smtp-user: "SMTP 用户名"
|
smtp-user: "SMTP 用户名"
|
||||||
smtp-pass: "SMTP 密码"
|
smtp-pass: "SMTP 密码"
|
||||||
|
test-email: "测试"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "启用ServiceWorker"
|
enable-serviceworker: "启用ServiceWorker"
|
||||||
serviceworker-info: "您需要启用推送通知"
|
serviceworker-info: "您需要启用推送通知"
|
||||||
@@ -1204,6 +1363,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: "操作"
|
||||||
username-or-userid: "用户名或用户ID"
|
username-or-userid: "用户名或用户ID"
|
||||||
@@ -1222,14 +1384,12 @@ admin/views/users.vue:
|
|||||||
silence-confirm: "确认屏蔽?"
|
silence-confirm: "确认屏蔽?"
|
||||||
unmake-silence: "解除禁言"
|
unmake-silence: "解除禁言"
|
||||||
unsilence-confirm: "解除屏蔽?"
|
unsilence-confirm: "解除屏蔽?"
|
||||||
verify: "认证用户"
|
|
||||||
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: "删除所有文件吗?"
|
||||||
|
username: "用户名"
|
||||||
|
host: "主机名"
|
||||||
users:
|
users:
|
||||||
title: "用户"
|
title: "用户"
|
||||||
sort:
|
sort:
|
||||||
@@ -1244,7 +1404,6 @@ admin/views/users.vue:
|
|||||||
admin: "管理员"
|
admin: "管理员"
|
||||||
moderator: "版主"
|
moderator: "版主"
|
||||||
adminOrModerator: "管理员+版主"
|
adminOrModerator: "管理员+版主"
|
||||||
verified: "官方认证账户"
|
|
||||||
silenced: "已禁言"
|
silenced: "已禁言"
|
||||||
suspended: "已冻结"
|
suspended: "已冻结"
|
||||||
origin:
|
origin:
|
||||||
@@ -1261,6 +1420,12 @@ admin/views/moderators.vue:
|
|||||||
added: "已注册版主。"
|
added: "已注册版主。"
|
||||||
remove: "取消"
|
remove: "取消"
|
||||||
removed: "取消注册版主"
|
removed: "取消注册版主"
|
||||||
|
logs:
|
||||||
|
title: "登录"
|
||||||
|
moderator: "版主"
|
||||||
|
type: "操作"
|
||||||
|
at: "日期和时间"
|
||||||
|
info: "信息"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "添加emoji"
|
title: "添加emoji"
|
||||||
@@ -1306,6 +1471,7 @@ admin/views/federation.vue:
|
|||||||
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: "查询"
|
||||||
@@ -1352,6 +1518,9 @@ admin/views/federation.vue:
|
|||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "每小时"
|
hour: "每小时"
|
||||||
day: "每天"
|
day: "每天"
|
||||||
|
blocked-hosts: "拉黑"
|
||||||
|
blocked-hosts-info: "描述您要阻止的主机,以换行符分隔。"
|
||||||
|
save: "保存"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "更多信息..."
|
about: "更多信息..."
|
||||||
timeline: "时间线"
|
timeline: "时间线"
|
||||||
@@ -1373,7 +1542,7 @@ desktop/views/pages/search.vue:
|
|||||||
not-available: "在此实例的设置中关闭搜索功能。"
|
not-available: "在此实例的设置中关闭搜索功能。"
|
||||||
not-found: "没有找到“{q}”的帖子"
|
not-found: "没有找到“{q}”的帖子"
|
||||||
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:
|
||||||
users: "用户"
|
users: "用户"
|
||||||
add-user: "添加用户"
|
add-user: "添加用户"
|
||||||
@@ -1428,7 +1597,7 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "更多"
|
refresh: "更多"
|
||||||
no-one: "不是!"
|
no-one: "不是!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
used: "使用中"
|
used: "已使用"
|
||||||
folder-count: "文件夹"
|
folder-count: "文件夹"
|
||||||
count-separator: ","
|
count-separator: ","
|
||||||
file-count: "文件"
|
file-count: "文件"
|
||||||
@@ -1449,7 +1618,7 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
download: "下载"
|
download: "下载"
|
||||||
rename: "重命名"
|
rename: "重命名"
|
||||||
move: "移动"
|
move: "移动"
|
||||||
hash: "Hash (md5)"
|
hash: "哈希(md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
nsfw: "阅读注意"
|
nsfw: "阅读注意"
|
||||||
mark-as-sensitive: "标记为“敏感”"
|
mark-as-sensitive: "标记为“敏感”"
|
||||||
@@ -1483,17 +1652,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "没有通知哦!"
|
empty: "没有通知哦!"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "添加用户"
|
|
||||||
submit: "帖子"
|
|
||||||
reply: "回复"
|
|
||||||
renote: "转推"
|
|
||||||
quote-placeholder: "引用这个帖子t... (可选)"
|
|
||||||
reply-placeholder: "回复这个帖子"
|
|
||||||
cw-placeholder: "评论帖子(可选)"
|
|
||||||
geolocation-alert: "您的设备不提供位置服务"
|
|
||||||
error: "错误"
|
|
||||||
username-prompt: "请输入用户名"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "私密帖子"
|
private: "私密帖子"
|
||||||
deleted: "帖子已删除"
|
deleted: "帖子已删除"
|
||||||
@@ -1508,6 +1666,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
follow-requests: "关注申请"
|
follow-requests: "关注申请"
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
user-lists: "列表"
|
user-lists: "列表"
|
||||||
|
user-groups: "群组"
|
||||||
widgets: "小部件"
|
widgets: "小部件"
|
||||||
game: "游戏"
|
game: "游戏"
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
@@ -1520,8 +1679,6 @@ mobile/views/pages/drive.vue:
|
|||||||
rename-folder: "重命名文件夹"
|
rename-folder: "重命名文件夹"
|
||||||
move-folder: "移动此文件夹"
|
move-folder: "移动此文件夹"
|
||||||
delete-folder: "删除此文件夹"
|
delete-folder: "删除此文件夹"
|
||||||
mobile/views/pages/user-lists.vue:
|
|
||||||
title: "列表"
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "您的账户现已准备就绪! 📦"
|
lets-start: "您的账户现已准备就绪! 📦"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
@@ -1536,7 +1693,7 @@ mobile/views/pages/home.vue:
|
|||||||
mentions: "Mentions"
|
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: "您可以添加/删除/重新排列小部件。 要移动小部件,请拖动“三”。 点击“×”删除小部件。 某些小部件可以通过点击来更改显示。"
|
widgets-hints: "您可以添加/删除/重新排列小部件。 要移动小部件,请拖动“三”。 点击“×”删除小部件。 某些小部件可以通过点击来更改显示。"
|
||||||
@@ -1546,10 +1703,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: "上一个帖子"
|
||||||
@@ -1561,6 +1714,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "没有找到有关于“{q}”的帖子"
|
not-found: "没有找到有关于“{q}”的帖子"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "选择文件"
|
select-file: "选择文件"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "通知"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "以{}登录"
|
signed-in-as: "以{}登录"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1588,7 +1743,7 @@ deck:
|
|||||||
home: "首页"
|
home: "首页"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "社交"
|
hybrid: "社交"
|
||||||
hashtag: "标签"
|
hashtag: "哈希标签"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
direct: "直接发布"
|
direct: "直接发布"
|
||||||
@@ -1619,28 +1774,10 @@ deck/deck.user-column.vue:
|
|||||||
activity: "活动"
|
activity: "活动"
|
||||||
timeline: "时间线"
|
timeline: "时间线"
|
||||||
pinned-notes: "置顶帖"
|
pinned-notes: "置顶帖"
|
||||||
|
pinned-page: "已置顶的页面"
|
||||||
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:
|
||||||
@@ -1663,3 +1800,282 @@ dev/views/new-app.vue:
|
|||||||
authority: "权限"
|
authority: "权限"
|
||||||
authority-desc: "只能通过API访问此处请求的功能。"
|
authority-desc: "只能通过API访问此处请求的功能。"
|
||||||
authority-warning: "您可以在创建应用程序后对其进行更改,但如果您授予不同的权限,则当时关联的所有用户密钥都将失效。"
|
authority-warning: "您可以在创建应用程序后对其进行更改,但如果您授予不同的权限,则当时关联的所有用户密钥都将失效。"
|
||||||
|
pages:
|
||||||
|
new-page: "创建页面"
|
||||||
|
edit-page: "编辑页面"
|
||||||
|
read-page: "查看源"
|
||||||
|
page-created: "页面已创建"
|
||||||
|
page-updated: "页面已更新"
|
||||||
|
are-you-sure-delete: "是否删除此页面?"
|
||||||
|
page-deleted: "该页面已被删除。"
|
||||||
|
edit-this-page: "编辑此页面"
|
||||||
|
pin-this-page: "置顶"
|
||||||
|
unpin-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标准中还有一些函数会将函数作为参数(称为高阶函数)。\n除了已经预先定义的函数外,您也可以将它们设置为这些高阶函数的槽函数。"
|
||||||
|
more-details: "详细说明"
|
||||||
|
title: "标题"
|
||||||
|
url: "页面URL"
|
||||||
|
summary: "页面摘要"
|
||||||
|
align-center: "居中"
|
||||||
|
hide-title-when-pinned: "置顶时隐藏标题"
|
||||||
|
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: "标题"
|
||||||
|
colored: "彩色"
|
||||||
|
action: "按下按钮时的行为"
|
||||||
|
_action:
|
||||||
|
dialog: "显示对话框"
|
||||||
|
_dialog:
|
||||||
|
content: "内容"
|
||||||
|
resetRandom: "随机值重置"
|
||||||
|
pushEvent: "发送事件"
|
||||||
|
_pushEvent:
|
||||||
|
event: "事件名称"
|
||||||
|
message: "按下时显示的消息"
|
||||||
|
variable: "发送的变量"
|
||||||
|
no-variable: "空"
|
||||||
|
radioButton: "选择项"
|
||||||
|
_radioButton:
|
||||||
|
name: "变量名"
|
||||||
|
title: "标题"
|
||||||
|
values: "使用换行区分的选择项"
|
||||||
|
default: "默认值"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
flow: "控制"
|
||||||
|
logical: "逻辑运算"
|
||||||
|
operation: "计算"
|
||||||
|
comparison: "比较"
|
||||||
|
random: "随机"
|
||||||
|
value: "值"
|
||||||
|
fn: "函数"
|
||||||
|
text: "文本操作"
|
||||||
|
convert: "转换"
|
||||||
|
list: "列表"
|
||||||
|
blocks:
|
||||||
|
text: "文本"
|
||||||
|
multiLineText: "文本 (多行)"
|
||||||
|
textList: "文本列表"
|
||||||
|
_textList:
|
||||||
|
info: "情使用换行符分隔每行"
|
||||||
|
strLen: "文本长度"
|
||||||
|
_strLen:
|
||||||
|
arg1: "文本"
|
||||||
|
strPick: "字符提取"
|
||||||
|
_strPick:
|
||||||
|
arg1: "文本"
|
||||||
|
arg2: "字符位置"
|
||||||
|
strReplace: "文本替换"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "文本"
|
||||||
|
arg2: "替换之前"
|
||||||
|
arg3: "替换之后"
|
||||||
|
strReverse: "文本反向"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "文本"
|
||||||
|
join: "合并文本"
|
||||||
|
_join:
|
||||||
|
arg1: "列表"
|
||||||
|
arg2: "分隔符"
|
||||||
|
add: "+ 加"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "- 减"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "× 乘"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "÷ 除"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
mod: "÷ 取模"
|
||||||
|
_mod:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
eq: "A和B相等"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "A和B不等"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "A和B"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "A或B"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "< A小于B"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "> A大于B"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "<= A小于等于B"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: ">= A大于等于B"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "分支"
|
||||||
|
_if:
|
||||||
|
arg1: "如果"
|
||||||
|
arg2: "的话"
|
||||||
|
arg3: "否则"
|
||||||
|
not: "否定"
|
||||||
|
_not:
|
||||||
|
arg1: "否定"
|
||||||
|
random: "随机"
|
||||||
|
_random:
|
||||||
|
arg1: "概率"
|
||||||
|
rannum: "随机"
|
||||||
|
_rannum:
|
||||||
|
arg1: "最小"
|
||||||
|
arg2: "最大"
|
||||||
|
randomPick: "从列表中随机选择"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "列表"
|
||||||
|
dailyRandom: "随机(每个用户每日)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "概率"
|
||||||
|
dailyRannum: "随机数(每个用户每日)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "最小"
|
||||||
|
arg2: "最大"
|
||||||
|
dailyRandomPick: "从列表中随机选择(每个用户每日)"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "列表"
|
||||||
|
seedRandom: "随机 (种子)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "种子"
|
||||||
|
arg2: "概率"
|
||||||
|
seedRannum: "随机数(种子)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "种子"
|
||||||
|
arg2: "最小"
|
||||||
|
arg3: "最大"
|
||||||
|
seedRandomPick: "从列表中随机选择 (种子)"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "种子"
|
||||||
|
arg2: "列表"
|
||||||
|
DRPWPM: "从概率列表中随机选择(每用户每天)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "文本列表"
|
||||||
|
pick: "从列表中选择"
|
||||||
|
_pick:
|
||||||
|
arg1: "列表"
|
||||||
|
arg2: "位置"
|
||||||
|
listLen: "获取列表长度"
|
||||||
|
_listLen:
|
||||||
|
arg1: "列表"
|
||||||
|
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: "输入槽函数"
|
||||||
|
room:
|
||||||
|
translate: "移动"
|
||||||
|
save: "保存"
|
||||||
|
furnitures:
|
||||||
|
moon: "一"
|
||||||
|
|||||||
@@ -86,3 +86,5 @@ admin/views/dashboard.vue:
|
|||||||
drive: "雲端硬碟"
|
drive: "雲端硬碟"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
drive: "雲端硬碟"
|
drive: "雲端硬碟"
|
||||||
|
pages:
|
||||||
|
like: "贊"
|
||||||
|
|||||||
485
migration/1000000000000-Init.ts
Normal file
485
migration/1000000000000-Init.ts
Normal file
@@ -0,0 +1,485 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class Init1000000000000 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TYPE "log_level_enum" AS ENUM('error', 'warning', 'info', 'success', 'debug')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "domain" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "level" "log_level_enum" NOT NULL, "worker" character varying(8) NOT NULL, "machine" character varying(128) NOT NULL, "message" character varying(1024) NOT NULL, "data" jsonb NOT NULL DEFAULT '{}', CONSTRAINT "PK_350604cbdf991d5930d9e618fbd" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8e4eb51a35d81b64dda28eed0a" ON "log" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8cb40cfc8f3c28261e6f887b03" ON "log" ("domain") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_584b536b49e53ac81beb39a177" ON "log" ("level") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "drive_folder" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(128) NOT NULL, "userId" character varying(32), "parentId" character varying(32), CONSTRAINT "PK_7a0c089191f5ebdc214e0af808a" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_02878d441ceae15ce060b73daf" ON "drive_folder" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f4fc06e49c0171c85f1c48060d" ON "drive_folder" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_00ceffb0cdc238b3233294f08f" ON "drive_folder" ("parentId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "drive_file" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32), "userHost" character varying(128), "md5" character varying(32) NOT NULL, "name" character varying(256) NOT NULL, "type" character varying(128) NOT NULL, "size" integer NOT NULL, "comment" character varying(512), "properties" jsonb NOT NULL DEFAULT '{}', "storedInternal" boolean NOT NULL, "url" character varying(512) NOT NULL, "thumbnailUrl" character varying(512), "webpublicUrl" character varying(512), "accessKey" character varying(256), "thumbnailAccessKey" character varying(256), "webpublicAccessKey" character varying(256), "uri" character varying(512), "src" character varying(512), "folderId" character varying(32), "isSensitive" boolean NOT NULL DEFAULT false, "isLink" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_43ddaaaf18c9e68029b7cbb032e" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c8dfad3b72196dd1d6b5db168a" ON "drive_file" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_860fa6f6c7df5bb887249fba22" ON "drive_file" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_92779627994ac79277f070c91e" ON "drive_file" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_37bb9a1b4585f8a3beb24c62d6" ON "drive_file" ("md5") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a40b8df8c989d7db937ea27cf6" ON "drive_file" ("type") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d85a184c2540d2deba33daf642" ON "drive_file" ("accessKey") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e74022ce9a074b3866f70e0d27" ON "drive_file" ("thumbnailAccessKey") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_c55b2b7c284d9fef98026fc88e" ON "drive_file" ("webpublicAccessKey") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e5848eac4940934e23dbc17581" ON "drive_file" ("uri") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bb90d1956dafc4068c28aa7560" ON "drive_file" ("folderId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE, "lastFetchedAt" TIMESTAMP WITH TIME ZONE, "username" character varying(128) NOT NULL, "usernameLower" character varying(128) NOT NULL, "name" character varying(128), "followersCount" integer NOT NULL DEFAULT 0, "followingCount" integer NOT NULL DEFAULT 0, "notesCount" integer NOT NULL DEFAULT 0, "avatarId" character varying(32), "bannerId" character varying(32), "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "avatarUrl" character varying(512), "bannerUrl" character varying(512), "avatarColor" character varying(32), "bannerColor" character varying(32), "isSuspended" boolean NOT NULL DEFAULT false, "isSilenced" boolean NOT NULL DEFAULT false, "isLocked" boolean NOT NULL DEFAULT false, "isBot" boolean NOT NULL DEFAULT false, "isCat" boolean NOT NULL DEFAULT false, "isAdmin" boolean NOT NULL DEFAULT false, "isModerator" boolean NOT NULL DEFAULT false, "isVerified" boolean NOT NULL DEFAULT false, "emojis" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "host" character varying(128), "inbox" character varying(512), "sharedInbox" character varying(512), "featured" character varying(512), "uri" character varying(512), "token" character(16), CONSTRAINT "UQ_a854e557b1b14814750c7c7b0c9" UNIQUE ("token"), CONSTRAINT "REL_58f5c71eaab331645112cf8cfa" UNIQUE ("avatarId"), CONSTRAINT "REL_afc64b53f8db3707ceb34eb28e" UNIQUE ("bannerId"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e11e649824a45d8ed01d597fd9" ON "user" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_80ca6e6ef65fb9ef34ea8c90f4" ON "user" ("updatedAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a27b942a0d6dcff90e3ee9b5e8" ON "user" ("usernameLower") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_fa99d777623947a5b05f394cae" ON "user" ("tags") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3252a5df8d5bbd16b281f7799e" ON "user" ("host") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_be623adaa4c566baf5d29ce0c8" ON "user" ("uri") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a854e557b1b14814750c7c7b0c" ON "user" ("token") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5deb01ae162d1d70b80d064c27" ON "user" ("usernameLower", "host") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "app" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32), "secret" character varying(64) NOT NULL, "name" character varying(128) NOT NULL, "description" character varying(512) NOT NULL, "permission" character varying(64) array NOT NULL, "callbackUrl" character varying(512), CONSTRAINT "PK_9478629fc093d229df09e560aea" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_048a757923ed8b157e9895da53" ON "app" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3f5b0899ef90527a3462d7c2cb" ON "app" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f49922d511d666848f250663c4" ON "app" ("secret") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "access_token" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "token" character varying(128) NOT NULL, "hash" character varying(128) NOT NULL, "userId" character varying(32) NOT NULL, "appId" character varying(32) NOT NULL, CONSTRAINT "PK_f20f028607b2603deabd8182d12" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_70ba8f6af34bc924fc9e12adb8" ON "access_token" ("token") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_64c327441248bae40f7d92f34f" ON "access_token" ("hash") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_9949557d0e1b2c19e5344c171e" ON "access_token" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TYPE "note_visibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "replyId" character varying(32), "renoteId" character varying(32), "text" text, "name" character varying(256), "cw" character varying(512), "appId" character varying(32), "userId" character varying(32) NOT NULL, "viaMobile" boolean NOT NULL DEFAULT false, "localOnly" boolean NOT NULL DEFAULT false, "renoteCount" smallint NOT NULL DEFAULT 0, "repliesCount" smallint NOT NULL DEFAULT 0, "reactions" jsonb NOT NULL DEFAULT '{}', "visibility" "note_visibility_enum" NOT NULL, "uri" character varying(512), "score" integer NOT NULL DEFAULT 0, "fileIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "attachedFileTypes" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "visibleUserIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "mentions" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "mentionedRemoteUsers" text NOT NULL DEFAULT '[]', "emojis" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "hasPoll" boolean NOT NULL DEFAULT false, "geo" jsonb DEFAULT null, "userHost" character varying(128), "replyUserId" character varying(32), "replyUserHost" character varying(128), "renoteUserId" character varying(32), "renoteUserHost" character varying(128), CONSTRAINT "PK_96d0c172a4fba276b1bbed43058" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e7c0567f5261063592f022e9b5" ON "note" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_17cb3553c700a4985dff5a30ff" ON "note" ("replyId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_52ccc804d7c69037d558bac4c9" ON "note" ("renoteId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_153536c67d05e9adb24e99fc2b" ON "note" ("uri") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_51c063b6a133a9cb87145450f5" ON "note" ("fileIds") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_25dfc71b0369b003a4cd434d0b" ON "note" ("attachedFileTypes") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_796a8c03959361f97dc2be1d5c" ON "note" ("visibleUserIds") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_54ebcb6d27222913b908d56fd8" ON "note" ("mentions") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_88937d94d7443d9a99a76fa5c0" ON "note" ("tags") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7125a826ab192eb27e11d358a5" ON "note" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "poll_vote" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "choice" integer NOT NULL, CONSTRAINT "PK_fd002d371201c472490ba89c6a0" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0fb627e1c2f753262a74f0562d" ON "poll_vote" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_66d2bd2ee31d14bcc23069a89f" ON "poll_vote" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_aecfbd5ef60374918e63ee95fa" ON "poll_vote" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_50bd7164c5b78f1f4a42c4d21f" ON "poll_vote" ("userId", "noteId", "choice") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_reaction" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "reaction" character varying(128) NOT NULL, CONSTRAINT "PK_767ec729b108799b587a3fcc9cf" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_01f4581f114e0ebd2bbb876f0b" ON "note_reaction" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_13761f64257f40c5636d0ff95e" ON "note_reaction" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_45145e4953780f3cd5656f0ea6" ON "note_reaction" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_ad0c221b25672daf2df320a817" ON "note_reaction" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_watching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "noteUserId" character varying(32) NOT NULL, CONSTRAINT "PK_49286fdb23725945a74aa27d757" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_318cdf42a9cfc11f479bd802bb" ON "note_watching" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b0134ec406e8d09a540f818288" ON "note_watching" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_03e7028ab8388a3f5e3ce2a861" ON "note_watching" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_44499765eec6b5489d72c4253b" ON "note_watching" ("noteUserId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a42c93c69989ce1d09959df4cf" ON "note_watching" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_unread" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "noteUserId" character varying(32) NOT NULL, "isSpecified" boolean NOT NULL, CONSTRAINT "PK_1904eda61a784f57e6e51fa9c1f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_56b0166d34ddae49d8ef7610bb" ON "note_unread" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e637cba4dc4410218c4251260e" ON "note_unread" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d908433a4953cc13216cd9c274" ON "note_unread" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "notification" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "notifieeId" character varying(32) NOT NULL, "notifierId" character varying(32) NOT NULL, "type" character varying(32) NOT NULL, "isRead" boolean NOT NULL DEFAULT false, "noteId" character varying(32), "reaction" character varying(128), "choice" integer, CONSTRAINT "PK_705b6c7cdf9b2c2ff7ac7872cb7" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON "notification" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON "notification" ("notifieeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/assets/ai.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT 'https://xn--931a.moe/aiart/yubitun.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT true, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "following" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_c76c6e044bdf76ecf8bfb82a645" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_582f8fab771a9040a12961f3e7" ON "following" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_24e0042143a18157b234df186c" ON "following" ("followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6516c5a6f3c015b4eed39978be" ON "following" ("followerId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_307be5f1d1252e0388662acb96" ON "following" ("followerId", "followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "instance" ("id" character varying(32) NOT NULL, "caughtAt" TIMESTAMP WITH TIME ZONE NOT NULL, "host" character varying(128) NOT NULL, "system" character varying(64), "usersCount" integer NOT NULL DEFAULT 0, "notesCount" integer NOT NULL DEFAULT 0, "followingCount" integer NOT NULL DEFAULT 0, "followersCount" integer NOT NULL DEFAULT 0, "driveUsage" integer NOT NULL DEFAULT 0, "driveFiles" integer NOT NULL DEFAULT 0, "latestRequestSentAt" TIMESTAMP WITH TIME ZONE, "latestStatus" integer, "latestRequestReceivedAt" TIMESTAMP WITH TIME ZONE, "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "isNotResponding" boolean NOT NULL DEFAULT false, "isMarkedAsClosed" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_eaf60e4a0c399c9935413e06474" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2cd3b2a6b4cf0b910b260afe08" ON "instance" ("caughtAt") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_8d5afc98982185799b160e10eb" ON "instance" ("host") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "muteeId" character varying(32) NOT NULL, "muterId" character varying(32) NOT NULL, CONSTRAINT "PK_2e92d06c8b5c602eeb27ca9ba48" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f86d57fbca33c7a4e6897490cc" ON "muting" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ec96b4fed9dae517e0dbbe0675" ON "muting" ("muteeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_93060675b4a79a577f31d260c6" ON "muting" ("muterId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_1eb9d9824a630321a29fd3b290" ON "muting" ("muterId", "muteeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "sw_subscription" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "endpoint" character varying(512) NOT NULL, "auth" character varying(256) NOT NULL, "publickey" character varying(128) NOT NULL, CONSTRAINT "PK_e8f763631530051b95eb6279b91" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_97754ca6f2baff9b4abb7f853d" ON "sw_subscription" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "blocking" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "blockeeId" character varying(32) NOT NULL, "blockerId" character varying(32) NOT NULL, CONSTRAINT "PK_e5d9a541cc1965ee7e048ea09dd" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b9a354f7941c1e779f3b33aea6" ON "blocking" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2cd4a2743a99671308f5417759" ON "blocking" ("blockeeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0627125f1a8a42c9a1929edb55" ON "blocking" ("blockerId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_98a1bc5cb30dfd159de056549f" ON "blocking" ("blockerId", "blockeeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_list" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, CONSTRAINT "PK_87bab75775fd9b1ff822b656402" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b7fcefbdd1c18dce86687531f9" ON "user_list" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_list_joining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userListId" character varying(32) NOT NULL, CONSTRAINT "PK_11abb3768da1c5f8de101c9df45" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d844bfc6f3f523a05189076efa" ON "user_list_joining" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_605472305f26818cc93d1baaa7" ON "user_list_joining" ("userListId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "hashtag" ("id" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, "mentionedUserIds" character varying(32) array NOT NULL, "mentionedUsersCount" integer NOT NULL DEFAULT 0, "mentionedLocalUserIds" character varying(32) array NOT NULL, "mentionedLocalUsersCount" integer NOT NULL DEFAULT 0, "mentionedRemoteUserIds" character varying(32) array NOT NULL, "mentionedRemoteUsersCount" integer NOT NULL DEFAULT 0, "attachedUserIds" character varying(32) array NOT NULL, "attachedUsersCount" integer NOT NULL DEFAULT 0, "attachedLocalUserIds" character varying(32) array NOT NULL, "attachedLocalUsersCount" integer NOT NULL DEFAULT 0, "attachedRemoteUserIds" character varying(32) array NOT NULL, "attachedRemoteUsersCount" integer NOT NULL DEFAULT 0, CONSTRAINT "PK_cb36eb8af8412bfa978f1165d78" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_347fec870eafea7b26c8a73bac" ON "hashtag" ("name") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2710a55f826ee236ea1a62698f" ON "hashtag" ("mentionedUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0e206cec573f1edff4a3062923" ON "hashtag" ("mentionedLocalUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_4c02d38a976c3ae132228c6fce" ON "hashtag" ("mentionedRemoteUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d57f9030cd3af7f63ffb1c267c" ON "hashtag" ("attachedUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0c44bf4f680964145f2a68a341" ON "hashtag" ("attachedLocalUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0b03cbcd7e6a7ce068efa8ecc2" ON "hashtag" ("attachedRemoteUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_favorite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_af0da35a60b9fa4463a62082b36" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_47f4b1892f5d6ba8efb3057d81" ON "note_favorite" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0f4fb9ad355f3effff221ef245" ON "note_favorite" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "abuse_user_report" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "reporterId" character varying(32) NOT NULL, "comment" character varying(512) NOT NULL, CONSTRAINT "PK_87873f5f5cc5c321a1306b2d18c" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_db2098070b2b5a523c58181f74" ON "abuse_user_report" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d049123c413e68ca52abe73420" ON "abuse_user_report" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_04cc96756f89d0b7f9473e8cdf" ON "abuse_user_report" ("reporterId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5cd442c3b2e74fdd99dae20243" ON "abuse_user_report" ("userId", "reporterId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "registration_ticket" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "code" character varying(64) NOT NULL, CONSTRAINT "PK_f11696b6fafcf3662d4292734f8" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0ff69e8dfa9fe31bb4a4660f59" ON "registration_ticket" ("code") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "messaging_message" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "recipientId" character varying(32) NOT NULL, "text" character varying(4096), "isRead" boolean NOT NULL DEFAULT false, "fileId" character varying(32), CONSTRAINT "PK_db398fd79dc95d0eb8c30456eaa" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e21cd3646e52ef9c94aaf17c2e" ON "messaging_message" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5377c307783fce2b6d352e1203" ON "messaging_message" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_cac14a4e3944454a5ce7daa514" ON "messaging_message" ("recipientId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "signin" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "ip" character varying(128) NOT NULL, "headers" jsonb NOT NULL, "success" boolean NOT NULL, CONSTRAINT "PK_9e96ddc025712616fc492b3b588" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2c308dbdc50d94dc625670055f" ON "signin" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "auth_session" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "token" character varying(128) NOT NULL, "userId" character varying(32), "appId" character varying(32) NOT NULL, CONSTRAINT "PK_19354ed146424a728c1112a8cbf" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_62cb09e1129f6ec024ef66e183" ON "auth_session" ("token") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "follow_request" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "requestId" character varying(128), "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_53a9aa3725f7a3deb150b39dbfc" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_12c01c0d1a79f77d9f6c15fadd" ON "follow_request" ("followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a7fd92dd6dc519e6fb435dd108" ON "follow_request" ("followerId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d54a512b822fac7ed52800f6b4" ON "follow_request" ("followerId", "followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "emoji" ("id" character varying(32) NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE, "name" character varying(128) NOT NULL, "host" character varying(128), "url" character varying(512) NOT NULL, "uri" character varying(512), "type" character varying(64), "aliases" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_df74ce05e24999ee01ea0bc50a3" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b37dafc86e9af007e3295c2781" ON "emoji" ("name") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5900e907bb46516ddf2871327c" ON "emoji" ("host") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_4f4d35e1256c84ae3d1f0eab10" ON "emoji" ("name", "host") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "reversi_game" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "startedAt" TIMESTAMP WITH TIME ZONE, "user1Id" character varying(32) NOT NULL, "user2Id" character varying(32) NOT NULL, "user1Accepted" boolean NOT NULL DEFAULT false, "user2Accepted" boolean NOT NULL DEFAULT false, "black" integer, "isStarted" boolean NOT NULL DEFAULT false, "isEnded" boolean NOT NULL DEFAULT false, "winnerId" character varying(32), "surrendered" character varying(32), "logs" jsonb NOT NULL DEFAULT '[]', "map" character varying(64) array NOT NULL, "bw" character varying(32) NOT NULL, "isLlotheo" boolean NOT NULL DEFAULT false, "canPutEverywhere" boolean NOT NULL DEFAULT false, "loopedBoard" boolean NOT NULL DEFAULT false, "form1" jsonb DEFAULT null, "form2" jsonb DEFAULT null, "crc32" character varying(32), CONSTRAINT "PK_76b30eeba71b1193ad7c5311c3f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b46ec40746efceac604142be1c" ON "reversi_game" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "reversi_matching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "parentId" character varying(32) NOT NULL, "childId" character varying(32) NOT NULL, CONSTRAINT "PK_880bd0afbab232f21c8b9d146cf" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b604d92d6c7aec38627f6eaf16" ON "reversi_matching" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3b25402709dd9882048c2bbade" ON "reversi_matching" ("parentId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e247b23a3c9b45f89ec1299d06" ON "reversi_matching" ("childId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_note_pining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_a6a2dad4ae000abce2ea9d9b103" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bfbc6f79ba4007b4ce5097f08d" ON "user_note_pining" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_410cd649884b501c02d6e72738" ON "user_note_pining" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TYPE "poll_notevisibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "poll" ("noteId" character varying(32) NOT NULL, "expiresAt" TIMESTAMP WITH TIME ZONE, "multiple" boolean NOT NULL, "choices" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "votes" integer array NOT NULL, "noteVisibility" "poll_notevisibility_enum" NOT NULL, "userId" character varying(32) NOT NULL, "userHost" character varying(128), CONSTRAINT "REL_da851e06d0dfe2ef397d8b1bf1" UNIQUE ("noteId"), CONSTRAINT "PK_da851e06d0dfe2ef397d8b1bf1b" PRIMARY KEY ("noteId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0610ebcfcfb4a18441a9bcdab2" ON "poll" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7fa20a12319c7f6dc3aed98c0a" ON "poll" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_keypair" ("userId" character varying(32) NOT NULL, "publicKey" character varying(4096) NOT NULL, "privateKey" character varying(4096) NOT NULL, CONSTRAINT "REL_f4853eb41ab722fe05f81cedeb" UNIQUE ("userId"), CONSTRAINT "PK_f4853eb41ab722fe05f81cedeb6" PRIMARY KEY ("userId"))`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_publickey" ("userId" character varying(32) NOT NULL, "keyId" character varying(256) NOT NULL, "keyPem" character varying(4096) NOT NULL, CONSTRAINT "REL_10c146e4b39b443ede016f6736" UNIQUE ("userId"), CONSTRAINT "PK_10c146e4b39b443ede016f6736d" PRIMARY KEY ("userId"))`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_171e64971c780ebd23fae140bb" ON "user_publickey" ("keyId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_profile" ("userId" character varying(32) NOT NULL, "location" character varying(128), "birthday" character(10), "description" character varying(1024), "fields" jsonb NOT NULL DEFAULT '[]', "url" character varying(512), "email" character varying(128), "emailVerifyCode" character varying(128), "emailVerified" boolean NOT NULL DEFAULT false, "twoFactorTempSecret" character varying(128), "twoFactorSecret" character varying(128), "twoFactorEnabled" boolean NOT NULL DEFAULT false, "password" character varying(128), "clientData" jsonb NOT NULL DEFAULT '{}', "autoWatch" boolean NOT NULL DEFAULT false, "autoAcceptFollowed" boolean NOT NULL DEFAULT false, "alwaysMarkNsfw" boolean NOT NULL DEFAULT false, "carefulBot" boolean NOT NULL DEFAULT false, "twitter" boolean NOT NULL DEFAULT false, "twitterAccessToken" character varying(64) DEFAULT null, "twitterAccessTokenSecret" character varying(64) DEFAULT null, "twitterUserId" character varying(64) DEFAULT null, "twitterScreenName" character varying(64) DEFAULT null, "github" boolean NOT NULL DEFAULT false, "githubAccessToken" character varying(64) DEFAULT null, "githubId" integer DEFAULT null, "githubLogin" character varying(64) DEFAULT null, "discord" boolean NOT NULL DEFAULT false, "discordAccessToken" character varying(64) DEFAULT null, "discordRefreshToken" character varying(64) DEFAULT null, "discordExpiresDate" integer DEFAULT null, "discordId" character varying(64) DEFAULT null, "discordUsername" character varying(64) DEFAULT null, "discordDiscriminator" character varying(64) DEFAULT null, "userHost" character varying(128), CONSTRAINT "REL_51cb79b5555effaf7d69ba1cff" UNIQUE ("userId"), CONSTRAINT "PK_51cb79b5555effaf7d69ba1cff9" PRIMARY KEY ("userId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_dce530b98e454793dac5ec2f5a" ON "user_profile" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__active_users_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__active_users" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__active_users_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_317237a9f733b970604a11e314f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__drive_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__drive" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__drive_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_totalCount" bigint NOT NULL, "___local_totalSize" bigint NOT NULL, "___local_incCount" bigint NOT NULL, "___local_incSize" bigint NOT NULL, "___local_decCount" bigint NOT NULL, "___local_decSize" bigint NOT NULL, "___remote_totalCount" bigint NOT NULL, "___remote_totalSize" bigint NOT NULL, "___remote_incCount" bigint NOT NULL, "___remote_incSize" bigint NOT NULL, "___remote_decCount" bigint NOT NULL, "___remote_decSize" bigint NOT NULL, CONSTRAINT "PK_f96bc548a765cd4b3b354221ce7" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__federation_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__federation" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__federation_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___instance_total" bigint NOT NULL, "___instance_inc" bigint NOT NULL, "___instance_dec" bigint NOT NULL, CONSTRAINT "PK_b39dcd31a0fe1a7757e348e85fd" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__hashtag_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__hashtag" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__hashtag_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_c32f1ea2b44a5d2f7881e37f8f9" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__instance_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__instance" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__instance_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___requests_failed" bigint NOT NULL, "___requests_succeeded" bigint NOT NULL, "___requests_received" bigint NOT NULL, "___notes_total" bigint NOT NULL, "___notes_inc" bigint NOT NULL, "___notes_dec" bigint NOT NULL, "___notes_diffs_normal" bigint NOT NULL, "___notes_diffs_reply" bigint NOT NULL, "___notes_diffs_renote" bigint NOT NULL, "___users_total" bigint NOT NULL, "___users_inc" bigint NOT NULL, "___users_dec" bigint NOT NULL, "___following_total" bigint NOT NULL, "___following_inc" bigint NOT NULL, "___following_dec" bigint NOT NULL, "___followers_total" bigint NOT NULL, "___followers_inc" bigint NOT NULL, "___followers_dec" bigint NOT NULL, "___drive_totalFiles" bigint NOT NULL, "___drive_totalUsage" bigint NOT NULL, "___drive_incFiles" bigint NOT NULL, "___drive_incUsage" bigint NOT NULL, "___drive_decFiles" bigint NOT NULL, "___drive_decUsage" bigint NOT NULL, CONSTRAINT "PK_1267c67c7c2d47b4903975f2c00" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__network_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__network" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__network_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___incomingRequests" bigint NOT NULL, "___outgoingRequests" bigint NOT NULL, "___totalTime" bigint NOT NULL, "___incomingBytes" bigint NOT NULL, "___outgoingBytes" bigint NOT NULL, CONSTRAINT "PK_bc4290c2e27fad14ef0c1ca93f3" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__notes_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__notes" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__notes_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_total" bigint NOT NULL, "___local_inc" bigint NOT NULL, "___local_dec" bigint NOT NULL, "___local_diffs_normal" bigint NOT NULL, "___local_diffs_reply" bigint NOT NULL, "___local_diffs_renote" bigint NOT NULL, "___remote_total" bigint NOT NULL, "___remote_inc" bigint NOT NULL, "___remote_dec" bigint NOT NULL, "___remote_diffs_normal" bigint NOT NULL, "___remote_diffs_reply" bigint NOT NULL, "___remote_diffs_renote" bigint NOT NULL, CONSTRAINT "PK_0aec823fa85c7f901bdb3863b14" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_drive_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_drive" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_drive_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___totalCount" bigint NOT NULL, "___totalSize" bigint NOT NULL, "___incCount" bigint NOT NULL, "___incSize" bigint NOT NULL, "___decCount" bigint NOT NULL, "___decSize" bigint NOT NULL, CONSTRAINT "PK_d0ef23d24d666e1a44a0cd3d208" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_following_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_following" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_following_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_followings_total" bigint NOT NULL, "___local_followings_inc" bigint NOT NULL, "___local_followings_dec" bigint NOT NULL, "___local_followers_total" bigint NOT NULL, "___local_followers_inc" bigint NOT NULL, "___local_followers_dec" bigint NOT NULL, "___remote_followings_total" bigint NOT NULL, "___remote_followings_inc" bigint NOT NULL, "___remote_followings_dec" bigint NOT NULL, "___remote_followers_total" bigint NOT NULL, "___remote_followers_inc" bigint NOT NULL, "___remote_followers_dec" bigint NOT NULL, CONSTRAINT "PK_85bb1b540363a29c2fec83bd907" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_notes_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_notes" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_notes_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___total" bigint NOT NULL, "___inc" bigint NOT NULL, "___dec" bigint NOT NULL, "___diffs_normal" bigint NOT NULL, "___diffs_reply" bigint NOT NULL, "___diffs_renote" bigint NOT NULL, CONSTRAINT "PK_334acf6e915af2f29edc11b8e50" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_reaction_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_reaction" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_reaction_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_984f54dae441e65b633e8d27a7f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__test_grouped_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__test_grouped" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_grouped_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo_total" bigint NOT NULL, "___foo_inc" bigint NOT NULL, "___foo_dec" bigint NOT NULL, CONSTRAINT "PK_f4a2b175d308695af30d4293272" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__test_unique_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__test_unique" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_unique_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo" bigint NOT NULL, CONSTRAINT "PK_409bac9c97cc612d8500012319d" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__test_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__test" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo_total" bigint NOT NULL, "___foo_inc" bigint NOT NULL, "___foo_dec" bigint NOT NULL, CONSTRAINT "PK_b4bc31dffbd1b785276a3ecfc1e" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__users_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__users" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__users_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_total" bigint NOT NULL, "___local_inc" bigint NOT NULL, "___local_dec" bigint NOT NULL, "___remote_total" bigint NOT NULL, "___remote_inc" bigint NOT NULL, "___remote_dec" bigint NOT NULL, CONSTRAINT "PK_4dfcf2c78d03524b9eb2c99d328" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" ADD CONSTRAINT "FK_f4fc06e49c0171c85f1c48060d2" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" ADD CONSTRAINT "FK_00ceffb0cdc238b3233294f08f2" FOREIGN KEY ("parentId") REFERENCES "drive_folder"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" ADD CONSTRAINT "FK_860fa6f6c7df5bb887249fba22e" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" ADD CONSTRAINT "FK_bb90d1956dafc4068c28aa7560a" FOREIGN KEY ("folderId") REFERENCES "drive_folder"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" ADD CONSTRAINT "FK_58f5c71eaab331645112cf8cfa5" FOREIGN KEY ("avatarId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" ADD CONSTRAINT "FK_afc64b53f8db3707ceb34eb28e2" FOREIGN KEY ("bannerId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "app" ADD CONSTRAINT "FK_3f5b0899ef90527a3462d7c2cb3" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_9949557d0e1b2c19e5344c171e9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_52ccc804d7c69037d558bac4c96" FOREIGN KEY ("renoteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_ec5c201576192ba8904c345c5cc" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_5b87d9d19127bd5d92026017a7b" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" ADD CONSTRAINT "FK_66d2bd2ee31d14bcc23069a89f8" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" ADD CONSTRAINT "FK_aecfbd5ef60374918e63ee95fa7" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" ADD CONSTRAINT "FK_13761f64257f40c5636d0ff95ee" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" ADD CONSTRAINT "FK_45145e4953780f3cd5656f0ea6a" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" ADD CONSTRAINT "FK_b0134ec406e8d09a540f8182888" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" ADD CONSTRAINT "FK_03e7028ab8388a3f5e3ce2a8619" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" ADD CONSTRAINT "FK_56b0166d34ddae49d8ef7610bb9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" ADD CONSTRAINT "FK_e637cba4dc4410218c4251260e4" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9" FOREIGN KEY ("notifieeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" ADD CONSTRAINT "FK_24e0042143a18157b234df186c3" FOREIGN KEY ("followeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" ADD CONSTRAINT "FK_6516c5a6f3c015b4eed39978be5" FOREIGN KEY ("followerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" ADD CONSTRAINT "FK_ec96b4fed9dae517e0dbbe0675c" FOREIGN KEY ("muteeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" ADD CONSTRAINT "FK_93060675b4a79a577f31d260c67" FOREIGN KEY ("muterId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "sw_subscription" ADD CONSTRAINT "FK_97754ca6f2baff9b4abb7f853dd" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" ADD CONSTRAINT "FK_2cd4a2743a99671308f5417759e" FOREIGN KEY ("blockeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" ADD CONSTRAINT "FK_0627125f1a8a42c9a1929edb552" FOREIGN KEY ("blockerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list" ADD CONSTRAINT "FK_b7fcefbdd1c18dce86687531f99" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" ADD CONSTRAINT "FK_d844bfc6f3f523a05189076efaa" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" ADD CONSTRAINT "FK_605472305f26818cc93d1baaa74" FOREIGN KEY ("userListId") REFERENCES "user_list"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" ADD CONSTRAINT "FK_47f4b1892f5d6ba8efb3057d81a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" ADD CONSTRAINT "FK_0e00498f180193423c992bc4370" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_d049123c413e68ca52abe734203" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_04cc96756f89d0b7f9473e8cdf3" FOREIGN KEY ("reporterId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_5377c307783fce2b6d352e1203b" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_cac14a4e3944454a5ce7daa5142" FOREIGN KEY ("recipientId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_535def119223ac05ad3fa9ef64b" FOREIGN KEY ("fileId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "signin" ADD CONSTRAINT "FK_2c308dbdc50d94dc625670055f7" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" ADD CONSTRAINT "FK_c072b729d71697f959bde66ade0" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" ADD CONSTRAINT "FK_dbe037d4bddd17b03a1dc778dee" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" ADD CONSTRAINT "FK_12c01c0d1a79f77d9f6c15fadd2" FOREIGN KEY ("followeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" ADD CONSTRAINT "FK_a7fd92dd6dc519e6fb435dd108f" FOREIGN KEY ("followerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_f7467510c60a45ce5aca6292743" FOREIGN KEY ("user1Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_6649a4e8c5d5cf32fb03b5da9f6" FOREIGN KEY ("user2Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_3b25402709dd9882048c2bbade0" FOREIGN KEY ("parentId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_e247b23a3c9b45f89ec1299d066" FOREIGN KEY ("childId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" ADD CONSTRAINT "FK_bfbc6f79ba4007b4ce5097f08d6" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" ADD CONSTRAINT "FK_68881008f7c3588ad7ecae471cf" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll" ADD CONSTRAINT "FK_da851e06d0dfe2ef397d8b1bf1b" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_keypair" ADD CONSTRAINT "FK_f4853eb41ab722fe05f81cedeb6" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_publickey" ADD CONSTRAINT "FK_10c146e4b39b443ede016f6736d" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "FK_51cb79b5555effaf7d69ba1cff9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "FK_51cb79b5555effaf7d69ba1cff9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_publickey" DROP CONSTRAINT "FK_10c146e4b39b443ede016f6736d"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_keypair" DROP CONSTRAINT "FK_f4853eb41ab722fe05f81cedeb6"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll" DROP CONSTRAINT "FK_da851e06d0dfe2ef397d8b1bf1b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" DROP CONSTRAINT "FK_68881008f7c3588ad7ecae471cf"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" DROP CONSTRAINT "FK_bfbc6f79ba4007b4ce5097f08d6"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" DROP CONSTRAINT "FK_e247b23a3c9b45f89ec1299d066"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" DROP CONSTRAINT "FK_3b25402709dd9882048c2bbade0"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" DROP CONSTRAINT "FK_6649a4e8c5d5cf32fb03b5da9f6"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" DROP CONSTRAINT "FK_f7467510c60a45ce5aca6292743"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" DROP CONSTRAINT "FK_a7fd92dd6dc519e6fb435dd108f"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" DROP CONSTRAINT "FK_12c01c0d1a79f77d9f6c15fadd2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" DROP CONSTRAINT "FK_dbe037d4bddd17b03a1dc778dee"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" DROP CONSTRAINT "FK_c072b729d71697f959bde66ade0"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "signin" DROP CONSTRAINT "FK_2c308dbdc50d94dc625670055f7"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_535def119223ac05ad3fa9ef64b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_cac14a4e3944454a5ce7daa5142"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_5377c307783fce2b6d352e1203b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_04cc96756f89d0b7f9473e8cdf3"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_d049123c413e68ca52abe734203"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" DROP CONSTRAINT "FK_0e00498f180193423c992bc4370"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" DROP CONSTRAINT "FK_47f4b1892f5d6ba8efb3057d81a"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" DROP CONSTRAINT "FK_605472305f26818cc93d1baaa74"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" DROP CONSTRAINT "FK_d844bfc6f3f523a05189076efaa"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list" DROP CONSTRAINT "FK_b7fcefbdd1c18dce86687531f99"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" DROP CONSTRAINT "FK_0627125f1a8a42c9a1929edb552"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" DROP CONSTRAINT "FK_2cd4a2743a99671308f5417759e"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "sw_subscription" DROP CONSTRAINT "FK_97754ca6f2baff9b4abb7f853dd"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" DROP CONSTRAINT "FK_93060675b4a79a577f31d260c67"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" DROP CONSTRAINT "FK_ec96b4fed9dae517e0dbbe0675c"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" DROP CONSTRAINT "FK_6516c5a6f3c015b4eed39978be5"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" DROP CONSTRAINT "FK_24e0042143a18157b234df186c3"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" DROP CONSTRAINT "FK_e637cba4dc4410218c4251260e4"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" DROP CONSTRAINT "FK_56b0166d34ddae49d8ef7610bb9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" DROP CONSTRAINT "FK_03e7028ab8388a3f5e3ce2a8619"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" DROP CONSTRAINT "FK_b0134ec406e8d09a540f8182888"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" DROP CONSTRAINT "FK_45145e4953780f3cd5656f0ea6a"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" DROP CONSTRAINT "FK_13761f64257f40c5636d0ff95ee"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" DROP CONSTRAINT "FK_aecfbd5ef60374918e63ee95fa7"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" DROP CONSTRAINT "FK_66d2bd2ee31d14bcc23069a89f8"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_5b87d9d19127bd5d92026017a7b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_ec5c201576192ba8904c345c5cc"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_52ccc804d7c69037d558bac4c96"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_9949557d0e1b2c19e5344c171e9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "app" DROP CONSTRAINT "FK_3f5b0899ef90527a3462d7c2cb3"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" DROP CONSTRAINT "FK_afc64b53f8db3707ceb34eb28e2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" DROP CONSTRAINT "FK_58f5c71eaab331645112cf8cfa5"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" DROP CONSTRAINT "FK_bb90d1956dafc4068c28aa7560a"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" DROP CONSTRAINT "FK_860fa6f6c7df5bb887249fba22e"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" DROP CONSTRAINT "FK_00ceffb0cdc238b3233294f08f2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" DROP CONSTRAINT "FK_f4fc06e49c0171c85f1c48060d2"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__users"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__users_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__test"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__test_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__test_unique"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__test_unique_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__test_grouped"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__test_grouped_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_reaction"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_reaction_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_notes"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_notes_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_following"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_following_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_drive"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_drive_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__notes"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__notes_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__network"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__network_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__instance"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__instance_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__hashtag"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__hashtag_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__federation"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__federation_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__drive"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__drive_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__active_users"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__active_users_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dce530b98e454793dac5ec2f5a"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_profile"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_171e64971c780ebd23fae140bb"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_publickey"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_keypair"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7fa20a12319c7f6dc3aed98c0a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0610ebcfcfb4a18441a9bcdab2"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "poll"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "poll_notevisibility_enum"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_410cd649884b501c02d6e72738"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bfbc6f79ba4007b4ce5097f08d"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_note_pining"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e247b23a3c9b45f89ec1299d06"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3b25402709dd9882048c2bbade"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b604d92d6c7aec38627f6eaf16"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "reversi_matching"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b46ec40746efceac604142be1c"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "reversi_game"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4f4d35e1256c84ae3d1f0eab10"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5900e907bb46516ddf2871327c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b37dafc86e9af007e3295c2781"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "emoji"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d54a512b822fac7ed52800f6b4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a7fd92dd6dc519e6fb435dd108"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_12c01c0d1a79f77d9f6c15fadd"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "follow_request"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_62cb09e1129f6ec024ef66e183"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "auth_session"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2c308dbdc50d94dc625670055f"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "signin"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_cac14a4e3944454a5ce7daa514"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5377c307783fce2b6d352e1203"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e21cd3646e52ef9c94aaf17c2e"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "messaging_message"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0ff69e8dfa9fe31bb4a4660f59"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "registration_ticket"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5cd442c3b2e74fdd99dae20243"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_04cc96756f89d0b7f9473e8cdf"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d049123c413e68ca52abe73420"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_db2098070b2b5a523c58181f74"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "abuse_user_report"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0f4fb9ad355f3effff221ef245"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_47f4b1892f5d6ba8efb3057d81"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_favorite"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0b03cbcd7e6a7ce068efa8ecc2"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0c44bf4f680964145f2a68a341"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d57f9030cd3af7f63ffb1c267c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4c02d38a976c3ae132228c6fce"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0e206cec573f1edff4a3062923"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2710a55f826ee236ea1a62698f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_347fec870eafea7b26c8a73bac"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "hashtag"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_605472305f26818cc93d1baaa7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d844bfc6f3f523a05189076efa"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_list_joining"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b7fcefbdd1c18dce86687531f9"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_list"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_98a1bc5cb30dfd159de056549f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0627125f1a8a42c9a1929edb55"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2cd4a2743a99671308f5417759"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b9a354f7941c1e779f3b33aea6"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "blocking"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_97754ca6f2baff9b4abb7f853d"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "sw_subscription"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_1eb9d9824a630321a29fd3b290"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_93060675b4a79a577f31d260c6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ec96b4fed9dae517e0dbbe0675"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f86d57fbca33c7a4e6897490cc"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "muting"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8d5afc98982185799b160e10eb"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2cd3b2a6b4cf0b910b260afe08"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "instance"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_307be5f1d1252e0388662acb96"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6516c5a6f3c015b4eed39978be"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_24e0042143a18157b234df186c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_582f8fab771a9040a12961f3e7"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "following"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "meta"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3c601b70a1066d2c8b517094cb"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b11a5e627c41d4dc3170f1d370"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "notification"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d908433a4953cc13216cd9c274"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e637cba4dc4410218c4251260e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_56b0166d34ddae49d8ef7610bb"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_unread"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a42c93c69989ce1d09959df4cf"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_44499765eec6b5489d72c4253b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_03e7028ab8388a3f5e3ce2a861"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b0134ec406e8d09a540f818288"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_318cdf42a9cfc11f479bd802bb"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_watching"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ad0c221b25672daf2df320a817"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_45145e4953780f3cd5656f0ea6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_13761f64257f40c5636d0ff95e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_01f4581f114e0ebd2bbb876f0b"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_reaction"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_50bd7164c5b78f1f4a42c4d21f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_aecfbd5ef60374918e63ee95fa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_66d2bd2ee31d14bcc23069a89f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0fb627e1c2f753262a74f0562d"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "poll_vote"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7125a826ab192eb27e11d358a5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_88937d94d7443d9a99a76fa5c0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_54ebcb6d27222913b908d56fd8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_796a8c03959361f97dc2be1d5c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25dfc71b0369b003a4cd434d0b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_51c063b6a133a9cb87145450f5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_153536c67d05e9adb24e99fc2b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5b87d9d19127bd5d92026017a7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_52ccc804d7c69037d558bac4c9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_17cb3553c700a4985dff5a30ff"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e7c0567f5261063592f022e9b5"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "note_visibility_enum"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9949557d0e1b2c19e5344c171e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_64c327441248bae40f7d92f34f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_70ba8f6af34bc924fc9e12adb8"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "access_token"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f49922d511d666848f250663c4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3f5b0899ef90527a3462d7c2cb"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_048a757923ed8b157e9895da53"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "app"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5deb01ae162d1d70b80d064c27"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a854e557b1b14814750c7c7b0c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_be623adaa4c566baf5d29ce0c8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3252a5df8d5bbd16b281f7799e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fa99d777623947a5b05f394cae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a27b942a0d6dcff90e3ee9b5e8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_80ca6e6ef65fb9ef34ea8c90f4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e11e649824a45d8ed01d597fd9"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bb90d1956dafc4068c28aa7560"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e5848eac4940934e23dbc17581"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c55b2b7c284d9fef98026fc88e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e74022ce9a074b3866f70e0d27"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d85a184c2540d2deba33daf642"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a40b8df8c989d7db937ea27cf6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_37bb9a1b4585f8a3beb24c62d6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_92779627994ac79277f070c91e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_860fa6f6c7df5bb887249fba22"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c8dfad3b72196dd1d6b5db168a"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "drive_file"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_00ceffb0cdc238b3233294f08f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f4fc06e49c0171c85f1c48060d"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_02878d441ceae15ce060b73daf"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "drive_folder"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_584b536b49e53ac81beb39a177"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8cb40cfc8f3c28261e6f887b03"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8e4eb51a35d81b64dda28eed0a"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "log"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "log_level_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"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
29
migration/1561706992953-webauthn.ts
Normal file
29
migration/1561706992953-webauthn.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class webauthn1561706992953 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "attestation_challenge" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "challenge" character varying(64) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "registrationChallenge" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_d0ba6786e093f1bcb497572a6b5" PRIMARY KEY ("id", "userId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f1a461a618fa1755692d0e0d59" ON "attestation_challenge" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_47efb914aed1f72dd39a306c7b" ON "attestation_challenge" ("challenge") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_security_key" ("id" character varying NOT NULL, "userId" character varying(32) NOT NULL, "publicKey" character varying NOT NULL, "lastUsed" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(30) NOT NULL, CONSTRAINT "PK_3e508571121ab39c5f85d10c166" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ff9ca3b5f3ee3d0681367a9b44" ON "user_security_key" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0d7718e562dcedd0aa5cf2c9f7" ON "user_security_key" ("publicKey") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "securityKeysAvailable" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "attestation_challenge" ADD CONSTRAINT "FK_f1a461a618fa1755692d0e0d592" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_security_key" ADD CONSTRAINT "FK_ff9ca3b5f3ee3d0681367a9b447" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_security_key" DROP CONSTRAINT "FK_ff9ca3b5f3ee3d0681367a9b447"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "attestation_challenge" DROP CONSTRAINT "FK_f1a461a618fa1755692d0e0d592"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "securityKeysAvailable"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0d7718e562dcedd0aa5cf2c9f7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ff9ca3b5f3ee3d0681367a9b44"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_security_key"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_47efb914aed1f72dd39a306c7b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f1a461a618fa1755692d0e0d59"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "attestation_challenge"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
201
migration/1561873850023-ChartIndexes.ts
Normal file
201
migration/1561873850023-ChartIndexes.ts
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class ChartIndexes1561873850023 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc" ON "__chart__active_users" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_15e91a03aeeac9dbccdf43fc06" ON "__chart__active_users" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_00ed5f86db1f7efafb1978bf21" ON "__chart__active_users" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_20f57cc8f142c131340ee16742" ON "__chart__active_users" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_9a3ed15a30ab7e3a37702e6e08" ON "__chart__active_users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c26e2c1cbb6e911e0554b27416" ON "__chart__active_users" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_13565815f618a1ff53886c5b28" ON "__chart__drive" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3fa0d0f17ca72e3dc80999a032" ON "__chart__drive" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7a170f67425e62a8fabb76c872" ON "__chart__drive" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6e1df243476e20cbf86572ecc0" ON "__chart__drive" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3313d7288855ec105b5bbf6c21" ON "__chart__drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_06690fc959f1c9fdaf21928222" ON "__chart__drive" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_36cb699c49580d4e6c2e6159f9" ON "__chart__federation" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e447064455928cf627590ef527" ON "__chart__federation" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_76e87c7bfc5d925fcbba405d84" ON "__chart__federation" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2d416e6af791a82e338c79d480" ON "__chart__federation" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_dd907becf76104e4b656659e6b" ON "__chart__federation" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e9cd07672b37d8966cf3709283" ON "__chart__federation" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_07747a1038c05f532a718fe1de" ON "__chart__hashtag" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_fcc181fb8283009c61cc4083ef" ON "__chart__hashtag" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_99a7d2faaef84a6f728d714ad6" ON "__chart__hashtag" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_49975586f50ed7b800fdd88fbd" ON "__chart__hashtag" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_25a97c02003338124b2b75fdbc" ON "__chart__hashtag" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6d6f156ceefc6bc5f273a0e370" ON "__chart__hashtag" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6b8f34a1a64b06014b6fb66824" ON "__chart__instance" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c12f0af4a66cdd30c2287ce8aa" ON "__chart__instance" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63" ON "__chart__instance" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d0a4f79af5a97b08f37b547197" ON "__chart__instance" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_39ee857ab2f23493037c6b6631" ON "__chart__instance" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f5448d9633cff74208d850aabe" ON "__chart__instance" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a1efd3e0048a5f2793a47360dc" ON "__chart__network" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f8dd01baeded2ffa833e0a610a" ON "__chart__network" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7b5da130992ec9df96712d4290" ON "__chart__network" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_08fac0eb3b11f04c200c0b40dd" ON "__chart__network" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0a905b992fecd2b5c3fb98759e" ON "__chart__network" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_9ff6944f01acb756fdc92d7563" ON "__chart__network" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_42eb716a37d381cdf566192b2b" ON "__chart__notes" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e69096589f11e3baa98ddd64d0" ON "__chart__notes" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7036f2957151588b813185c794" ON "__chart__notes" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0c9a159c5082cbeef3ca6706b5" ON "__chart__notes" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f09d543e3acb16c5976bdb31fa" ON "__chart__notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_924fc196c80ca24bae01dd37e4" ON "__chart__notes" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5f86db6492274e07c1a3cdf286" ON "__chart__per_user_drive" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_328f259961e60c4fa0bfcf55ca" ON "__chart__per_user_drive" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e496ca8096d28f6b9b509264dc" ON "__chart__per_user_drive" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53" ON "__chart__per_user_drive" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_30bf67687f483ace115c5ca642" ON "__chart__per_user_drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f2aeafde2ae6fbad38e857631b" ON "__chart__per_user_drive" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7af07790712aa3438ff6773f3b" ON "__chart__per_user_following" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f92dd6d03f8d994f29987f6214" ON "__chart__per_user_following" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_4b3593098b6edc9c5afe36b18b" ON "__chart__per_user_following" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f" ON "__chart__per_user_following" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b77d4dd9562c3a899d9a286fcd" ON "__chart__per_user_following" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_4db3b84c7be0d3464714f3e0b1" ON "__chart__per_user_following" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_84234bd1abb873f07329681c83" ON "__chart__per_user_notes" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8d2cbbc8114d90d19b44d626b6" ON "__chart__per_user_notes" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_55bf20f366979f2436de99206b" ON "__chart__per_user_notes" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_046feeb12e9ef5f783f409866a" ON "__chart__per_user_notes" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5048e9daccbbbc6d567bb142d3" ON "__chart__per_user_notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f68a5ab958f9f5fa17a32ac23b" ON "__chart__per_user_notes" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f7bf4c62059764c2c2bb40fdab" ON "__chart__per_user_reaction" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_65633a106bce43fc7c5c30a5c7" ON "__chart__per_user_reaction" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8cf3156fd7a6b15c43459c6e3b" ON "__chart__per_user_reaction" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_edeb73c09c3143a81bcb34d569" ON "__chart__per_user_reaction" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_229a41ad465f9205f1f5703291" ON "__chart__per_user_reaction" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e316f01a6d24eb31db27f88262" ON "__chart__per_user_reaction" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0c641990ecf47d2545df4edb75" ON "__chart__test_grouped" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2be7ec6cebddc14dc11e206686" ON "__chart__test_grouped" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_234dff3c0b56a6150b95431ab9" ON "__chart__test_grouped" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a5133470f4825902e170328ca5" ON "__chart__test_grouped" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b14489029e4b3aaf4bba5fb524" ON "__chart__test_grouped" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_84e661abb7bd1e51b690d4b017" ON "__chart__test_grouped" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_437bab3c6061d90f6bb65fd2cc" ON "__chart__test_unique" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5c73bf61da4f6e6f15bae88ed1" ON "__chart__test_unique" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bbfa573a8181018851ed0b6357" ON "__chart__test_unique" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d70c86baedc68326be11f9c0ce" ON "__chart__test_unique" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a0cd75442dd10d0643a17c4a49" ON "__chart__test_unique" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_66e1e1ecd2f29e57778af35b59" ON "__chart__test_unique" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b070a906db04b44c67c6c2144d" ON "__chart__test" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_92255988735563f0fe4aba1f05" ON "__chart__test" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d41cce6aee1a50bfc062038f9b" ON "__chart__test" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c5870993e25c3d5771f91f5003" ON "__chart__test" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a319e5dbf47e8a17497623beae" ON "__chart__test" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f170de677ea75ad4533de2723e" ON "__chart__test" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_845254b3eaf708ae8a6cac3026" ON "__chart__users" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7c184198ecf66a8d3ecb253ab3" ON "__chart__users" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ed9b95919c672a13008e9487ee" ON "__chart__users" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f091abb24193d50c653c6b77fc" ON "__chart__users" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_337e9599f278bd7537fe30876f" ON "__chart__users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a770a57c70e668cc61590c9161" ON "__chart__users" ("span", "date", "group") `);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a770a57c70e668cc61590c9161"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_337e9599f278bd7537fe30876f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f091abb24193d50c653c6b77fc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ed9b95919c672a13008e9487ee"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7c184198ecf66a8d3ecb253ab3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_845254b3eaf708ae8a6cac3026"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f170de677ea75ad4533de2723e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a319e5dbf47e8a17497623beae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c5870993e25c3d5771f91f5003"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d41cce6aee1a50bfc062038f9b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_92255988735563f0fe4aba1f05"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b070a906db04b44c67c6c2144d"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_66e1e1ecd2f29e57778af35b59"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a0cd75442dd10d0643a17c4a49"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d70c86baedc68326be11f9c0ce"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bbfa573a8181018851ed0b6357"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5c73bf61da4f6e6f15bae88ed1"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_437bab3c6061d90f6bb65fd2cc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_84e661abb7bd1e51b690d4b017"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b14489029e4b3aaf4bba5fb524"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a5133470f4825902e170328ca5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_234dff3c0b56a6150b95431ab9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2be7ec6cebddc14dc11e206686"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0c641990ecf47d2545df4edb75"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e316f01a6d24eb31db27f88262"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_229a41ad465f9205f1f5703291"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_edeb73c09c3143a81bcb34d569"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8cf3156fd7a6b15c43459c6e3b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_65633a106bce43fc7c5c30a5c7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f7bf4c62059764c2c2bb40fdab"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f68a5ab958f9f5fa17a32ac23b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5048e9daccbbbc6d567bb142d3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_046feeb12e9ef5f783f409866a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_55bf20f366979f2436de99206b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8d2cbbc8114d90d19b44d626b6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_84234bd1abb873f07329681c83"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4db3b84c7be0d3464714f3e0b1"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b77d4dd9562c3a899d9a286fcd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4b3593098b6edc9c5afe36b18b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f92dd6d03f8d994f29987f6214"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7af07790712aa3438ff6773f3b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f2aeafde2ae6fbad38e857631b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_30bf67687f483ace115c5ca642"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e496ca8096d28f6b9b509264dc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_328f259961e60c4fa0bfcf55ca"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5f86db6492274e07c1a3cdf286"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_924fc196c80ca24bae01dd37e4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f09d543e3acb16c5976bdb31fa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0c9a159c5082cbeef3ca6706b5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7036f2957151588b813185c794"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e69096589f11e3baa98ddd64d0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_42eb716a37d381cdf566192b2b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9ff6944f01acb756fdc92d7563"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0a905b992fecd2b5c3fb98759e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_08fac0eb3b11f04c200c0b40dd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7b5da130992ec9df96712d4290"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f8dd01baeded2ffa833e0a610a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a1efd3e0048a5f2793a47360dc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f5448d9633cff74208d850aabe"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_39ee857ab2f23493037c6b6631"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d0a4f79af5a97b08f37b547197"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c12f0af4a66cdd30c2287ce8aa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6b8f34a1a64b06014b6fb66824"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6d6f156ceefc6bc5f273a0e370"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25a97c02003338124b2b75fdbc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_49975586f50ed7b800fdd88fbd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_99a7d2faaef84a6f728d714ad6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fcc181fb8283009c61cc4083ef"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_07747a1038c05f532a718fe1de"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e9cd07672b37d8966cf3709283"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dd907becf76104e4b656659e6b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2d416e6af791a82e338c79d480"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_76e87c7bfc5d925fcbba405d84"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e447064455928cf627590ef527"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_36cb699c49580d4e6c2e6159f9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_06690fc959f1c9fdaf21928222"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3313d7288855ec105b5bbf6c21"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6e1df243476e20cbf86572ecc0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7a170f67425e62a8fabb76c872"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3fa0d0f17ca72e3dc80999a032"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_13565815f618a1ff53886c5b28"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c26e2c1cbb6e911e0554b27416"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9a3ed15a30ab7e3a37702e6e08"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_20f57cc8f142c131340ee16742"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_00ed5f86db1f7efafb1978bf21"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_15e91a03aeeac9dbccdf43fc06"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_90148bbc2bf0854428786bfc15"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_88937d94d7443d9a99a76fa5c0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_54ebcb6d27222913b908d56fd8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_796a8c03959361f97dc2be1d5c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25dfc71b0369b003a4cd434d0b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_51c063b6a133a9cb87145450f5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fa99d777623947a5b05f394cae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_315c779174fe8247ab324f036e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c5d46cbfda48b1c33ed852e21b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8cb40cfc8f3c28261e6f887b03"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1562422242907-PasswordLessLogin.ts
Normal file
13
migration/1562422242907-PasswordLessLogin.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PasswordLessLogin1562422242907 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "usePasswordLessLogin" boolean DEFAULT false NOT NULL`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "usePasswordLessLogin"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
17
migration/1562444565093-PinnedPage.ts
Normal file
17
migration/1562444565093-PinnedPage.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PinnedPage1562444565093 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "pinnedPageId" character varying(32)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27" UNIQUE ("pinnedPageId")`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27" FOREIGN KEY ("pinnedPageId") REFERENCES "page"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "pinnedPageId"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1562448332510-PageTitleHideOption.ts
Normal file
13
migration/1562448332510-PageTitleHideOption.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PageTitleHideOption1562448332510 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" ADD "hideTitleWhenPinned" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "hideTitleWhenPinned"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
17
migration/1562869971568-ModerationLog.ts
Normal file
17
migration/1562869971568-ModerationLog.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class ModerationLog1562869971568 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "moderation_log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "type" character varying(128) NOT NULL, "info" jsonb NOT NULL, CONSTRAINT "PK_d0adca6ecfd068db83e4526cc26" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a08ad074601d204e0f69da9a95" ON "moderation_log" ("userId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "moderation_log" ADD CONSTRAINT "FK_a08ad074601d204e0f69da9a954" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "moderation_log" DROP CONSTRAINT "FK_a08ad074601d204e0f69da9a954"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a08ad074601d204e0f69da9a95"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "moderation_log"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1563757595828-UsedUsername.ts
Normal file
13
migration/1563757595828-UsedUsername.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class UsedUsername1563757595828 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "used_username" ("username" character varying(128) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, CONSTRAINT "PK_78fd79d2d24c6ac2f4cc9a31a5d" PRIMARY KEY ("username"))`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`DROP TABLE "used_username"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1565634203341-room.ts
Normal file
13
migration/1565634203341-room.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class room1565634203341 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "room" jsonb NOT NULL DEFAULT '{}'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "room"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
17
ormconfig.js
Normal file
17
ormconfig.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
const config = require('./built/config').default;
|
||||||
|
const entities = require('./built/db/postgre').entities;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: 'postgres',
|
||||||
|
host: config.db.host,
|
||||||
|
port: config.db.port,
|
||||||
|
username: config.db.user,
|
||||||
|
password: config.db.pass,
|
||||||
|
database: config.db.db,
|
||||||
|
extra: config.db.extra,
|
||||||
|
entities: entities,
|
||||||
|
migrations: ['migration/*.ts'],
|
||||||
|
cli: {
|
||||||
|
migrationsDir: 'migration'
|
||||||
|
}
|
||||||
|
};
|
||||||
193
package.json
193
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "11.8.1",
|
"version": "11.28.1",
|
||||||
"codename": "daybreak",
|
"codename": "daybreak",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./index.js",
|
"start": "node ./index.js",
|
||||||
"init": "node ./built/init.js",
|
"init": "npm run migrate",
|
||||||
|
"ormconfig": "node ./built/ormconfig.js",
|
||||||
|
"migrate": "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",
|
||||||
@@ -22,108 +25,115 @@
|
|||||||
"test": "gulp test",
|
"test": "gulp test",
|
||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"gulp-cssnano/cssnano/postcss-svgo/svgo/js-yaml": "^3.13.1",
|
||||||
|
"lodash": "^4.17.13"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@elastic/elasticsearch": "7.0.0-rc.2",
|
"@elastic/elasticsearch": "7.3.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.15",
|
"@fortawesome/fontawesome-svg-core": "1.2.19",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.7.2",
|
"@fortawesome/free-brands-svg-icons": "5.9.0",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.7.2",
|
"@fortawesome/free-regular-svg-icons": "5.9.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.7.2",
|
"@fortawesome/free-solid-svg-icons": "5.9.0",
|
||||||
"@fortawesome/vue-fontawesome": "0.1.5",
|
"@fortawesome/vue-fontawesome": "0.1.6",
|
||||||
"@koa/cors": "2.2.3",
|
"@koa/cors": "3.0.0",
|
||||||
"@prezzemolo/zip": "0.0.3",
|
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.5.11",
|
"@types/bull": "3.5.15",
|
||||||
|
"@types/cbor": "2.0.0",
|
||||||
"@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.1",
|
||||||
"@types/file-type": "10.9.1",
|
|
||||||
"@types/gulp": "4.0.6",
|
"@types/gulp": "4.0.6",
|
||||||
"@types/gulp-mocha": "0.0.32",
|
"@types/gulp-mocha": "0.0.32",
|
||||||
"@types/gulp-rename": "0.0.33",
|
"@types/gulp-rename": "0.0.33",
|
||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
"@types/gulp-uglify": "3.0.6",
|
"@types/gulp-uglify": "3.0.6",
|
||||||
"@types/gulp-util": "3.0.34",
|
"@types/gulp-util": "3.0.34",
|
||||||
"@types/is-root": "1.0.0",
|
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.12.1",
|
"@types/js-yaml": "3.12.1",
|
||||||
"@types/jsdom": "12.2.3",
|
"@types/jsdom": "12.2.4",
|
||||||
"@types/katex": "0.10.1",
|
"@types/katex": "0.10.1",
|
||||||
"@types/koa": "2.0.48",
|
"@types/koa": "2.0.49",
|
||||||
"@types/koa-bodyparser": "5.0.2",
|
"@types/koa-bodyparser": "5.0.2",
|
||||||
"@types/koa-compress": "2.0.9",
|
"@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": "4.0.0",
|
||||||
"@types/koa-multer": "1.0.0",
|
"@types/koa-multer": "1.0.0",
|
||||||
"@types/koa-router": "7.0.40",
|
"@types/koa-router": "7.0.42",
|
||||||
"@types/koa-send": "4.1.2",
|
"@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/lolex": "3.1.1",
|
||||||
"@types/minio": "7.0.1",
|
"@types/mocha": "5.2.7",
|
||||||
"@types/mocha": "5.2.6",
|
"@types/node": "12.0.10",
|
||||||
"@types/node": "11.13.4",
|
"@types/nodemailer": "6.2.0",
|
||||||
"@types/nodemailer": "4.6.7",
|
"@types/nprogress": "0.2.0",
|
||||||
"@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.2",
|
"@types/qrcode": "1.3.3",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.12",
|
"@types/redis": "2.8.13",
|
||||||
"@types/rename": "1.0.1",
|
"@types/rename": "1.0.1",
|
||||||
"@types/request": "2.48.1",
|
"@types/request": "2.48.2",
|
||||||
"@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.28",
|
"@types/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.22.1",
|
"@types/sharp": "0.22.2",
|
||||||
"@types/showdown": "1.9.2",
|
"@types/showdown": "1.9.3",
|
||||||
"@types/speakeasy": "2.0.4",
|
"@types/speakeasy": "2.0.4",
|
||||||
"@types/systeminformation": "3.23.1",
|
"@types/systeminformation": "3.23.1",
|
||||||
"@types/tinycolor2": "1.4.1",
|
"@types/tinycolor2": "1.4.2",
|
||||||
"@types/tmp": "0.1.0",
|
"@types/tmp": "0.1.0",
|
||||||
"@types/uuid": "3.4.4",
|
"@types/uuid": "3.4.5",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.0",
|
||||||
"@types/webpack": "4.4.27",
|
"@types/webpack": "4.4.34",
|
||||||
"@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",
|
"@typescript-eslint/parser": "1.11.0",
|
||||||
"apexcharts": "3.6.9",
|
"agentkeepalive": "4.0.2",
|
||||||
|
"animejs": "3.1.0",
|
||||||
|
"apexcharts": "3.8.4",
|
||||||
"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",
|
||||||
|
"aws-sdk": "2.512.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
|
"bootstrap": "4.3.1",
|
||||||
"bootstrap-vue": "2.0.0-rc.13",
|
"bootstrap-vue": "2.0.0-rc.13",
|
||||||
"bull": "3.8.1",
|
"bull": "3.10.0",
|
||||||
"cafy": "15.1.1",
|
"cafy": "15.1.1",
|
||||||
|
"cbor": "4.2.1",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chalk": "2.4.2",
|
"chalk": "2.4.2",
|
||||||
"cli-highlight": "2.1.0",
|
"cli-highlight": "2.1.1",
|
||||||
"commander": "2.20.0",
|
"commander": "2.20.0",
|
||||||
"content-disposition": "0.5.3",
|
"content-disposition": "0.5.3",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "2.1.1",
|
"css-loader": "3.2.0",
|
||||||
"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",
|
||||||
"diskusage": "1.1.0",
|
"diskusage": "1.1.3",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"emojilib": "2.4.0",
|
"emojilib": "2.4.0",
|
||||||
"eslint": "5.16.0",
|
"eslint": "6.1.0",
|
||||||
"eslint-plugin-vue": "5.2.2",
|
"eslint-plugin-vue": "5.2.3",
|
||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "4.0.0",
|
||||||
"feed": "2.0.4",
|
"feed": "3.0.0",
|
||||||
"file-type": "10.11.0",
|
"file-type": "12.1.0",
|
||||||
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "4.0.1",
|
"gulp": "4.0.2",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-imagemin": "5.0.3",
|
"gulp-imagemin": "6.0.0",
|
||||||
"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",
|
||||||
@@ -136,20 +146,22 @@
|
|||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
"html-minifier": "4.0.0",
|
"html-minifier": "4.0.0",
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.2.0",
|
"https-proxy-agent": "2.2.2",
|
||||||
|
"insert-text-at-cursor": "0.3.0",
|
||||||
"is-root": "2.1.0",
|
"is-root": "2.1.0",
|
||||||
"is-svg": "4.1.0",
|
"is-svg": "4.2.0",
|
||||||
"js-yaml": "3.13.1",
|
"js-yaml": "3.13.1",
|
||||||
"jsdom": "15.0.0",
|
"jsdom": "15.1.1",
|
||||||
"json5": "2.1.0",
|
"json5": "2.1.0",
|
||||||
"json5-loader": "2.0.0",
|
"json5-loader": "3.0.0",
|
||||||
"katex": "0.10.1",
|
"jsrsasign": "8.0.12",
|
||||||
|
"katex": "0.11.0",
|
||||||
"koa": "2.7.0",
|
"koa": "2.7.0",
|
||||||
"koa-bodyparser": "4.2.1",
|
"koa-bodyparser": "4.2.1",
|
||||||
"koa-compress": "3.0.0",
|
"koa-compress": "3.0.0",
|
||||||
"koa-favicon": "2.0.1",
|
"koa-favicon": "2.0.1",
|
||||||
"koa-json-body": "5.3.0",
|
"koa-json-body": "5.3.0",
|
||||||
"koa-logger": "3.2.0",
|
"koa-logger": "3.2.1",
|
||||||
"koa-mount": "4.0.0",
|
"koa-mount": "4.0.0",
|
||||||
"koa-multer": "1.0.2",
|
"koa-multer": "1.0.2",
|
||||||
"koa-router": "7.4.0",
|
"koa-router": "7.4.0",
|
||||||
@@ -158,36 +170,33 @@
|
|||||||
"koa-views": "6.2.0",
|
"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",
|
"lolex": "4.2.0",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"minio": "7.0.7",
|
"mocha": "6.2.0",
|
||||||
"mocha": "6.1.3",
|
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"moment": "2.24.0",
|
"ms": "2.1.2",
|
||||||
"ms": "2.1.1",
|
"nested-property": "1.0.1",
|
||||||
"nested-property": "0.0.7",
|
"node-fetch": "2.6.0",
|
||||||
"node-fetch": "2.3.0",
|
"nodemailer": "6.3.0",
|
||||||
"nodemailer": "6.1.1",
|
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"parse5": "5.1.0",
|
"parse5": "5.1.0",
|
||||||
"parsimmon": "1.12.0",
|
"parsimmon": "1.13.0",
|
||||||
"pg": "7.10.0",
|
"pg": "7.12.1",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "3.0.0",
|
||||||
"prismjs": "1.16.0",
|
"prismjs": "1.17.1",
|
||||||
"progress-bar-webpack-plugin": "1.12.1",
|
"progress-bar-webpack-plugin": "1.12.1",
|
||||||
"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.4",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
"pureimage": "0.1.6",
|
"pureimage": "0.1.6",
|
||||||
"qrcode": "1.3.3",
|
"qrcode": "1.4.1",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"randomcolor": "0.5.4",
|
"randomcolor": "0.5.4",
|
||||||
"ratelimiter": "3.3.0",
|
"ratelimiter": "3.3.1",
|
||||||
"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",
|
||||||
@@ -200,60 +209,62 @@
|
|||||||
"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": "3.0.1",
|
"seedrandom": "3.0.3",
|
||||||
"sharp": "0.22.1",
|
"sharp": "0.23.0",
|
||||||
"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",
|
||||||
"stringz": "1.0.0",
|
"stringz": "2.0.0",
|
||||||
"style-loader": "0.23.1",
|
"style-loader": "0.23.1",
|
||||||
"stylus": "0.54.5",
|
"stylus": "0.54.5",
|
||||||
"stylus-loader": "3.0.2",
|
"stylus-loader": "3.0.2",
|
||||||
"summaly": "2.2.0",
|
"summaly": "2.3.0",
|
||||||
"systeminformation": "4.1.6",
|
"systeminformation": "4.14.4",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"terser-webpack-plugin": "1.2.3",
|
"terser-webpack-plugin": "1.4.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
|
"three": "0.107.0",
|
||||||
"tinycolor2": "1.4.1",
|
"tinycolor2": "1.4.1",
|
||||||
"tmp": "0.1.0",
|
"tmp": "0.1.0",
|
||||||
"ts-loader": "5.3.3",
|
"ts-loader": "5.3.3",
|
||||||
"ts-node": "7.0.1",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.15.0",
|
"tslint": "5.18.0",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"typeorm": "0.2.16-rc.1",
|
"typeorm": "0.2.18",
|
||||||
"typescript": "3.3.3333",
|
"typescript": "3.5.3",
|
||||||
"typescript-eslint-parser": "22.0.0",
|
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "2.1.0",
|
||||||
"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",
|
"v-debounce": "0.1.2",
|
||||||
"video-thumbnail-generator": "1.1.3",
|
|
||||||
"vue": "2.6.10",
|
"vue": "2.6.10",
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.0",
|
||||||
"vue-content-loading": "1.6.0",
|
"vue-content-loading": "1.6.0",
|
||||||
"vue-cropperjs": "3.0.0",
|
"vue-cropperjs": "4.0.0",
|
||||||
"vue-i18n": "8.11.1",
|
"vue-i18n": "8.14.0",
|
||||||
"vue-js-modal": "1.3.28",
|
"vue-js-modal": "1.3.31",
|
||||||
"vue-json-pretty": "1.6.0",
|
"vue-json-pretty": "1.6.0",
|
||||||
"vue-loader": "15.7.0",
|
"vue-loader": "15.7.1",
|
||||||
"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.6",
|
"vue-router": "3.1.2",
|
||||||
"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.15",
|
"vue-svg-inline-loader": "1.2.16",
|
||||||
"vue-template-compiler": "2.6.10",
|
"vue-template-compiler": "2.6.10",
|
||||||
"vuedraggable": "2.20.0",
|
"vuedraggable": "2.23.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",
|
||||||
"webpack": "4.30.0",
|
"webpack": "4.39.2",
|
||||||
"webpack-cli": "3.3.0",
|
"webpack-cli": "3.3.7",
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.29",
|
||||||
"ws": "6.2.1",
|
"ws": "7.1.2",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/fluent-ffmpeg": "2.1.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
803
src/@types/jsrsasign.d.ts
vendored
Normal file
803
src/@types/jsrsasign.d.ts
vendored
Normal file
@@ -0,0 +1,803 @@
|
|||||||
|
// Attention: Partial Type Definition
|
||||||
|
|
||||||
|
declare module 'jsrsasign' {
|
||||||
|
//// HELPER TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attention: The value might be changed by the function.
|
||||||
|
*/
|
||||||
|
type Mutable<T> = T;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deprecated: The function might be deleted in future release.
|
||||||
|
*/
|
||||||
|
type Deprecated<T> = T;
|
||||||
|
|
||||||
|
//// COMMON TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* byte number
|
||||||
|
*/
|
||||||
|
type ByteNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hexadecimal string /[0-9A-F]/
|
||||||
|
*/
|
||||||
|
type HexString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* binary string /[01]/
|
||||||
|
*/
|
||||||
|
type BinString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64 string /[A-Za-z0-9+/]=+/
|
||||||
|
*/
|
||||||
|
type Base64String = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64 URL encoded string /[A-Za-z0-9_-]/
|
||||||
|
*/
|
||||||
|
type Base64URLString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* time value (ex. "151231235959Z")
|
||||||
|
*/
|
||||||
|
type TimeValue = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OID string (ex. '1.2.3.4.567')
|
||||||
|
*/
|
||||||
|
type OID = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OID name
|
||||||
|
*/
|
||||||
|
type OIDName = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PEM formatted string
|
||||||
|
*/
|
||||||
|
type PEM = string;
|
||||||
|
|
||||||
|
//// ASN1 TYPES
|
||||||
|
|
||||||
|
class ASN1Object {
|
||||||
|
public isModified: boolean;
|
||||||
|
|
||||||
|
public hTLV: ASN1TLV;
|
||||||
|
|
||||||
|
public hT: ASN1T;
|
||||||
|
|
||||||
|
public hL: ASN1L;
|
||||||
|
|
||||||
|
public hV: ASN1V;
|
||||||
|
|
||||||
|
public getLengthHexFromValue(): HexString;
|
||||||
|
|
||||||
|
public getEncodedHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getValueHex(): ASN1V;
|
||||||
|
|
||||||
|
public getFreshValueHex(): ASN1V;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DERAbstractStructured extends ASN1Object {
|
||||||
|
constructor(params?: Partial<Record<'array', ASN1Object[]>>);
|
||||||
|
|
||||||
|
public setByASN1ObjectArray(asn1ObjectArray: ASN1Object[]): void;
|
||||||
|
|
||||||
|
public appendASN1Object(asn1Object: ASN1Object): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DERSequence extends DERAbstractStructured {
|
||||||
|
constructor(params?: Partial<Record<'array', ASN1Object[]>>);
|
||||||
|
|
||||||
|
public getFreshValueHex(): ASN1V;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// ASN1HEX TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 DER encoded data (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1S = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of something
|
||||||
|
*/
|
||||||
|
type Idx<T extends { [idx: string]: unknown } | { [idx: number]: unknown }> = ASN1S extends { [idx: string]: unknown } ? string : ASN1S extends { [idx: number]: unknown } ? number : never;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* byte length of something
|
||||||
|
*/
|
||||||
|
type ByteLength<T extends { length: unknown }> = T['length'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 L(length) (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1L = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 T(tag) (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1T = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 V(value) (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1V = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 TLV (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1TLV = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 object string
|
||||||
|
*/
|
||||||
|
type ASN1ObjectString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nth
|
||||||
|
*/
|
||||||
|
type Nth = number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 DER encoded OID value (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1OIDV = HexString;
|
||||||
|
|
||||||
|
class ASN1HEX {
|
||||||
|
public static getLblen(s: ASN1S, idx: Idx<ASN1S>): ByteLength<ASN1L>;
|
||||||
|
|
||||||
|
public static getL(s: ASN1S, idx: Idx<ASN1S>): ASN1L;
|
||||||
|
|
||||||
|
public static getVblen(s: ASN1S, idx: Idx<ASN1S>): ByteLength<ASN1V>;
|
||||||
|
|
||||||
|
public static getVidx(s: ASN1S, idx: Idx<ASN1S>): Idx<ASN1V>;
|
||||||
|
|
||||||
|
public static getV(s: ASN1S, idx: Idx<ASN1S>): ASN1V;
|
||||||
|
|
||||||
|
public static getTLV(s: ASN1S, idx: Idx<ASN1S>): ASN1TLV;
|
||||||
|
|
||||||
|
public static getNextSiblingIdx(s: ASN1S, idx: Idx<ASN1S>): Idx<ASN1ObjectString>;
|
||||||
|
|
||||||
|
public static getChildIdx(h: ASN1S, pos: Idx<ASN1S>): Idx<ASN1ObjectString>[];
|
||||||
|
|
||||||
|
public static getNthChildIdx(h: ASN1S, idx: Idx<ASN1S>, nth: Nth): Idx<ASN1ObjectString>;
|
||||||
|
|
||||||
|
public static getIdxbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): Idx<Mutable<Nth[]>>;
|
||||||
|
|
||||||
|
public static getTLVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): ASN1TLV;
|
||||||
|
|
||||||
|
public static getVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string, removeUnusedbits?: boolean): ASN1V;
|
||||||
|
|
||||||
|
public static hextooidstr(hex: ASN1OIDV): OID;
|
||||||
|
|
||||||
|
public static dump(hexOrObj: ASN1S | ASN1Object, flags?: Record<string, unknown>, idx?: Idx<ASN1S>, indent?: string): string;
|
||||||
|
|
||||||
|
public static isASN1HEX(hex: string): hex is HexString;
|
||||||
|
|
||||||
|
public static oidname(oidDotOrHex: OID | ASN1OIDV): OIDName;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// BIG INTEGER TYPES (PARTIAL)
|
||||||
|
|
||||||
|
class BigInteger {
|
||||||
|
constructor(a: null);
|
||||||
|
|
||||||
|
constructor(a: number, b: SecureRandom);
|
||||||
|
|
||||||
|
constructor(a: number, b: number, c: SecureRandom);
|
||||||
|
|
||||||
|
constructor(a: unknown);
|
||||||
|
|
||||||
|
constructor(a: string, b: number);
|
||||||
|
|
||||||
|
public am(i: number, x: number, w: number, j: number, c: number, n: number): number;
|
||||||
|
|
||||||
|
public DB: number;
|
||||||
|
|
||||||
|
public DM: number;
|
||||||
|
|
||||||
|
public DV: number;
|
||||||
|
|
||||||
|
public FV: number;
|
||||||
|
|
||||||
|
public F1: number;
|
||||||
|
|
||||||
|
public F2: number;
|
||||||
|
|
||||||
|
protected copyTo(r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected fromInt(x: number): void;
|
||||||
|
|
||||||
|
protected fromString(s: string, b: number): void;
|
||||||
|
|
||||||
|
protected clamp(): void;
|
||||||
|
|
||||||
|
public toString(b: number): string;
|
||||||
|
|
||||||
|
public negate(): BigInteger;
|
||||||
|
|
||||||
|
public abs(): BigInteger;
|
||||||
|
|
||||||
|
public compareTo(a: BigInteger): number;
|
||||||
|
|
||||||
|
public bitLength(): number;
|
||||||
|
|
||||||
|
protected dlShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected drShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected lShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected rShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected subTo(a: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected multiplyTo(a: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected squareTo(r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected divRemTo(m: BigInteger, q: Mutable<BigInteger>, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public mod(a: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
protected invDigit(): number;
|
||||||
|
|
||||||
|
protected isEven(): boolean;
|
||||||
|
|
||||||
|
protected exp(e: number, z: Classic | Montgomery): BigInteger;
|
||||||
|
|
||||||
|
public modPowInt(e: number, m: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public static ZERO: BigInteger;
|
||||||
|
|
||||||
|
public static ONE: BigInteger;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Classic {
|
||||||
|
constructor(m: BigInteger);
|
||||||
|
|
||||||
|
public convert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public revert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public reduce(x: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public mulTo(x: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public sqrTo(x: BigInteger, y: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Montgomery {
|
||||||
|
constructor(m: BigInteger);
|
||||||
|
|
||||||
|
public convert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public revert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public reduce(x: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public mulTo(x: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public sqrTo(x: BigInteger, y: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// KEYUTIL TYPES
|
||||||
|
|
||||||
|
type DecryptAES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type Decrypt3DES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type DecryptDES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type EncryptAES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type Encrypt3DES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type EncryptDES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type AlgList = {
|
||||||
|
'AES-256-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 32; ivlen: 16; };
|
||||||
|
'AES-192-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 24; ivlen: 16; };
|
||||||
|
'AES-128-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 16; ivlen: 16; };
|
||||||
|
'DES-EDE3-CBC': { 'proc': Decrypt3DES; 'eproc': Encrypt3DES; keylen: 24; ivlen: 8; };
|
||||||
|
'DES-CBC': { 'proc': DecryptDES; 'eproc': EncryptDES; keylen: 8; ivlen: 8; };
|
||||||
|
};
|
||||||
|
|
||||||
|
type AlgName = keyof AlgList;
|
||||||
|
|
||||||
|
type PEMHeadAlgName = 'RSA' | 'EC' | 'DSA';
|
||||||
|
|
||||||
|
type GetKeyRSAParam = RSAKey | {
|
||||||
|
n: BigInteger;
|
||||||
|
e: number;
|
||||||
|
} | Record<'n' | 'e', HexString> | Record<'n' | 'e', HexString> & Record<'d' | 'p' | 'q' | 'dp' | 'dq' | 'co', HexString | null> | {
|
||||||
|
n: BigInteger;
|
||||||
|
e: number;
|
||||||
|
d: BigInteger;
|
||||||
|
} | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e', Base64URLString> | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e' | 'd' | 'p' | 'q' | 'dp' | 'dq' | 'qi', Base64URLString> | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e' | 'd', Base64URLString>;
|
||||||
|
|
||||||
|
type GetKeyECDSAParam = KJUR.crypto.ECDSA | {
|
||||||
|
curve: KJUR.crypto.CurveName;
|
||||||
|
xy: HexString;
|
||||||
|
} | {
|
||||||
|
curve: KJUR.crypto.CurveName;
|
||||||
|
d: HexString;
|
||||||
|
} | {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
} | {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
d: Base64URLString;
|
||||||
|
};
|
||||||
|
|
||||||
|
type GetKeyDSAParam = KJUR.crypto.DSA | Record<'p' | 'q' | 'g', BigInteger> & Record<'y', BigInteger | null> | Record<'p' | 'q' | 'g' | 'x', BigInteger> & Record<'y', BigInteger | null>;
|
||||||
|
|
||||||
|
type GetKeyParam = GetKeyRSAParam | GetKeyECDSAParam | GetKeyDSAParam | string;
|
||||||
|
|
||||||
|
class KEYUTIL {
|
||||||
|
public version: '1.0.0';
|
||||||
|
|
||||||
|
public parsePKCS5PEM(sPKCS5PEM: PEM): Partial<Record<'type' | 's', string>> & (Record<'cipher' | 'ivsalt', string> | Record<'cipher' | 'ivsalt', undefined>);
|
||||||
|
|
||||||
|
public getKeyAndUnusedIvByPasscodeAndIvsalt(algName: AlgName, passcode: string, ivsaltHex: HexString): Record<'keyhex' | 'ivhex', HexString>;
|
||||||
|
|
||||||
|
public decryptKeyB64(privateKeyB64: Base64String, sharedKeyAlgName: AlgName, sharedKeyHex: HexString, ivsaltHex: HexString): Base64String;
|
||||||
|
|
||||||
|
public getDecryptedKeyHex(sEncryptedPEM: PEM, passcode: string): HexString;
|
||||||
|
|
||||||
|
public getEncryptedPKCS5PEMFromPrvKeyHex(pemHeadAlg: PEMHeadAlgName, hPrvKey: string, passcode: string, sharedKeyAlgName?: AlgName | null, ivsaltHex?: HexString | null): PEM;
|
||||||
|
|
||||||
|
public parseHexOfEncryptedPKCS8(sHEX: HexString): {
|
||||||
|
ciphertext: ASN1V;
|
||||||
|
encryptionSchemeAlg: 'TripleDES';
|
||||||
|
encryptionSchemeIV: ASN1V;
|
||||||
|
pbkdf2Salt: ASN1V;
|
||||||
|
pbkdf2Iter: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
public getPBKDF2KeyHexFromParam(info: ReturnType<this['parseHexOfEncryptedPKCS8']>, passcode: string): HexString;
|
||||||
|
|
||||||
|
private _getPlainPKCS8HexFromEncryptedPKCS8PEM(pkcs8PEM: PEM, passcode: string): HexString;
|
||||||
|
|
||||||
|
public getKeyFromEncryptedPKCS8PEM(prvKeyHex: HexString): ReturnType<this['getKeyFromPlainPrivatePKCS8Hex']>;
|
||||||
|
|
||||||
|
public parsePlainPrivatePKCS8Hex(pkcs8PrvHex: HexString): {
|
||||||
|
algparam: ASN1V | null;
|
||||||
|
algoid: ASN1V;
|
||||||
|
keyidx: Idx<ASN1V>;
|
||||||
|
};
|
||||||
|
|
||||||
|
public getKeyFromPlainPrivatePKCS8PEM(prvKeyHex: HexString): ReturnType<this['getKeyFromPlainPrivatePKCS8Hex']>;
|
||||||
|
|
||||||
|
public getKeyFromPlainPrivatePKCS8Hex(prvKeyHex: HexString): RSAKey | KJUR.crypto.DSA | KJUR.crypto.ECDSA;
|
||||||
|
|
||||||
|
private _getKeyFromPublicPKCS8Hex(h: HexString): RSAKey | KJUR.crypto.DSA | KJUR.crypto.ECDSA;
|
||||||
|
|
||||||
|
public parsePublicRawRSAKeyHex(pubRawRSAHex: HexString): Record<'n' | 'e', ASN1V>;
|
||||||
|
|
||||||
|
public parsePublicPKCS8Hex(pkcs8PubHex: HexString): {
|
||||||
|
algparam: ASN1V | Record<'p' | 'q' | 'g', ASN1V> | null;
|
||||||
|
algoid: ASN1V;
|
||||||
|
key: ASN1V;
|
||||||
|
};
|
||||||
|
|
||||||
|
public static getKey(param: GetKeyRSAParam): RSAKey;
|
||||||
|
|
||||||
|
public static getKey(param: GetKeyECDSAParam): KJUR.crypto.ECDSA;
|
||||||
|
|
||||||
|
public static getKey(param: GetKeyDSAParam): KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static getKey(param: string, passcode?: string, hextype?: string): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static generateKeypair(alg: 'RSA', keylen: number): Record<'prvKeyObj' | 'pubKeyObj', RSAKey>;
|
||||||
|
|
||||||
|
public static generateKeypair(alg: 'EC', curve: KJUR.crypto.CurveName): Record<'prvKeyObj' | 'pubKeyObj', KJUR.crypto.ECDSA>;
|
||||||
|
|
||||||
|
public static getPEM(keyObjOrHex: RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA, formatType?: 'PKCS1PRV' | 'PKCS5PRV' | 'PKCS8PRV', passwd?: string, encAlg?: 'DES-CBC' | 'DES-EDE3-CBC' | 'AES-128-CBC' | 'AES-192-CBC' | 'AES-256-CBC', hexType?: string, ivsaltHex?: HexString): object; // To Do
|
||||||
|
|
||||||
|
public static getKeyFromCSRPEM(csrPEM: PEM): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static getKeyFromCSRHex(csrHex: HexString): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static parseCSRHex(csrHex: HexString): Record<'p8pubkeyhex', ASN1TLV>;
|
||||||
|
|
||||||
|
public static getJWKFromKey(keyObj: RSAKey): {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e' | 'd' | 'p' | 'q' | 'dp' | 'dq' | 'qi', Base64URLString> | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e', Base64URLString>;
|
||||||
|
|
||||||
|
public static getJWKFromKey(keyObj: KJUR.crypto.ECDSA): {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
d: Base64URLString;
|
||||||
|
} | {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//// KJUR NAMESPACE (PARTIAL)
|
||||||
|
|
||||||
|
namespace KJUR {
|
||||||
|
namespace crypto {
|
||||||
|
type CurveName = 'secp128r1' | 'secp160k1' | 'secp160r1' | 'secp192k1' | 'secp192r1' | 'secp224r1' | 'secp256k1' | 'secp256r1' | 'secp384r1' | 'secp521r1';
|
||||||
|
|
||||||
|
class DSA {
|
||||||
|
public p: BigInteger | null;
|
||||||
|
|
||||||
|
public q: BigInteger | null;
|
||||||
|
|
||||||
|
public g: BigInteger | null;
|
||||||
|
|
||||||
|
public y: BigInteger | null;
|
||||||
|
|
||||||
|
public x: BigInteger | null;
|
||||||
|
|
||||||
|
public type: 'DSA';
|
||||||
|
|
||||||
|
public isPrivate: boolean;
|
||||||
|
|
||||||
|
public isPublic: boolean;
|
||||||
|
|
||||||
|
public setPrivate(p: BigInteger, q: BigInteger, g: BigInteger, y: BigInteger | null, x: BigInteger): void;
|
||||||
|
|
||||||
|
public setPrivateHex(hP: HexString, hQ: HexString, hG: HexString, hY: HexString | null, hX: HexString): void;
|
||||||
|
|
||||||
|
public setPublic(p: BigInteger, q: BigInteger, g: BigInteger, y: BigInteger): void;
|
||||||
|
|
||||||
|
public setPublicHex(hP: HexString, hQ: HexString, hG: HexString, hY: HexString): void;
|
||||||
|
|
||||||
|
public signWithMessageHash(sHashHex: HexString): HexString;
|
||||||
|
|
||||||
|
public verifyWithMessageHash(sHashHex: HexString, hSigVal: HexString): boolean;
|
||||||
|
|
||||||
|
public parseASN1Signature(hSigVal: HexString): [BigInteger, BigInteger];
|
||||||
|
|
||||||
|
public readPKCS5PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readCertPubKeyHex(h: HexString, nthPKI: number): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ECDSA {
|
||||||
|
constructor(params?: {
|
||||||
|
curve?: CurveName;
|
||||||
|
prv?: HexString;
|
||||||
|
pub?: HexString;
|
||||||
|
});
|
||||||
|
|
||||||
|
public p: BigInteger | null;
|
||||||
|
|
||||||
|
public q: BigInteger | null;
|
||||||
|
|
||||||
|
public g: BigInteger | null;
|
||||||
|
|
||||||
|
public y: BigInteger | null;
|
||||||
|
|
||||||
|
public x: BigInteger | null;
|
||||||
|
|
||||||
|
public type: 'EC';
|
||||||
|
|
||||||
|
public isPrivate: boolean;
|
||||||
|
|
||||||
|
public isPublic: boolean;
|
||||||
|
|
||||||
|
public getBigRandom(limit: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public setNamedCurve(curveName: CurveName): void;
|
||||||
|
|
||||||
|
public setPrivateKeyHex(prvKeyHex: HexString): void;
|
||||||
|
|
||||||
|
public setPublicKeyHex(pubKeyHex: HexString): void;
|
||||||
|
|
||||||
|
public getPublicKeyXYHex(): Record<'x' | 'y', HexString>;
|
||||||
|
|
||||||
|
public getShortNISTPCurveName(): 'P-256' | 'P-384' | null;
|
||||||
|
|
||||||
|
public generateKeyPairHex(): Record<'ecprvhex' | 'ecpubhex', HexString>;
|
||||||
|
|
||||||
|
public signWithMessageHash(hashHex: HexString): HexString;
|
||||||
|
|
||||||
|
public signHex(hashHex: HexString, privHex: HexString): HexString;
|
||||||
|
|
||||||
|
public verifyWithMessageHash(sHashHex: HexString, hSigVal: HexString): boolean;
|
||||||
|
|
||||||
|
public parseASN1Signature(hSigVal: HexString): [BigInteger, BigInteger];
|
||||||
|
|
||||||
|
public readPKCS5PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readCertPubKeyHex(h: HexString, nthPKI: number): void;
|
||||||
|
|
||||||
|
public static parseSigHex(sigHex: HexString): Record<'r' | 's', BigInteger>;
|
||||||
|
|
||||||
|
public static parseSigHexInHexRS(sigHex: HexString): Record<'r' | 's', ASN1V>;
|
||||||
|
|
||||||
|
public static asn1SigToConcatSig(asn1Sig: HexString): HexString;
|
||||||
|
|
||||||
|
public static concatSigToASN1Sig(concatSig: HexString): ASN1TLV;
|
||||||
|
|
||||||
|
public static hexRSSigToASN1Sig(hR: HexString, hS: HexString): ASN1TLV;
|
||||||
|
|
||||||
|
public static biRSSigToASN1Sig(biR: BigInteger, biS: BigInteger): ASN1TLV;
|
||||||
|
|
||||||
|
public static getName(s: CurveName | HexString): 'secp256r1' | 'secp256k1' | 'secp384r1' | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Signature {
|
||||||
|
constructor(params?: ({
|
||||||
|
alg: string;
|
||||||
|
prov?: string;
|
||||||
|
} | {}) & ({
|
||||||
|
psssaltlen: number;
|
||||||
|
} | {}) & ({
|
||||||
|
prvkeypem: PEM;
|
||||||
|
prvkeypas?: never;
|
||||||
|
} | {}));
|
||||||
|
|
||||||
|
private _setAlgNames(): void;
|
||||||
|
|
||||||
|
private _zeroPaddingOfSignature(hex: HexString, bitLength: number): HexString;
|
||||||
|
|
||||||
|
public setAlgAndProvider(alg: string, prov: string): void;
|
||||||
|
|
||||||
|
public init(key: GetKeyParam, pass?: string): void;
|
||||||
|
|
||||||
|
public updateString(str: string): void;
|
||||||
|
|
||||||
|
public updateHex(hex: HexString): void;
|
||||||
|
|
||||||
|
public sign(): HexString;
|
||||||
|
|
||||||
|
public signString(str: string): HexString;
|
||||||
|
|
||||||
|
public signHex(hex: HexString): HexString;
|
||||||
|
|
||||||
|
public verify(hSigVal: string): boolean | 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//// RSAKEY TYPES
|
||||||
|
|
||||||
|
class RSAKey {
|
||||||
|
public n: BigInteger | null;
|
||||||
|
|
||||||
|
public e: number;
|
||||||
|
|
||||||
|
public d: BigInteger | null;
|
||||||
|
|
||||||
|
public p: BigInteger | null;
|
||||||
|
|
||||||
|
public q: BigInteger | null;
|
||||||
|
|
||||||
|
public dmp1: BigInteger | null;
|
||||||
|
|
||||||
|
public dmq1: BigInteger | null;
|
||||||
|
|
||||||
|
public coeff: BigInteger | null;
|
||||||
|
|
||||||
|
public type: 'RSA';
|
||||||
|
|
||||||
|
public isPrivate?: boolean;
|
||||||
|
|
||||||
|
public isPublic?: boolean;
|
||||||
|
|
||||||
|
//// RSA PUBLIC
|
||||||
|
|
||||||
|
protected doPublic(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public setPublic(N: BigInteger, E: number): void;
|
||||||
|
|
||||||
|
public setPublic(N: HexString, E: HexString): void;
|
||||||
|
|
||||||
|
public encrypt(text: string): HexString | null;
|
||||||
|
|
||||||
|
public encryptOAEP(text: string, hash?: string, hashLen?: number): HexString | null;
|
||||||
|
|
||||||
|
public encryptOAEP(text: string, hash?: (s: string) => string, hashLen?: number): HexString | null;
|
||||||
|
|
||||||
|
//// RSA PRIVATE
|
||||||
|
|
||||||
|
protected doPrivate(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public setPrivate(N: BigInteger, E: number, D: BigInteger): void;
|
||||||
|
|
||||||
|
public setPrivate(N: HexString, E: HexString, D: HexString): void;
|
||||||
|
|
||||||
|
public setPrivateEx(N: HexString, E: HexString, D?: HexString | null, P?: HexString | null, Q?: HexString | null, DP?: HexString | null, DQ?: HexString | null, C?: HexString | null): void;
|
||||||
|
|
||||||
|
public generate(B: number, E: HexString): void;
|
||||||
|
|
||||||
|
public decrypt(ctext: HexString): string;
|
||||||
|
|
||||||
|
public decryptOAEP(ctext: HexString, hash?: string, hashLen?: number): string | null;
|
||||||
|
|
||||||
|
public encryptOAEP(ctext: HexString, hash?: (s: string) => string, hashLen?: number): string | null;
|
||||||
|
|
||||||
|
//// RSA PEM
|
||||||
|
|
||||||
|
public getPosArrayOfChildrenFromHex(hPrivateKey: PEM): Idx<ASN1ObjectString>[];
|
||||||
|
|
||||||
|
public getHexValueArrayOfChildrenFromHex(hPrivateKey: PEM): Idx<ASN1ObjectString>[];
|
||||||
|
|
||||||
|
public readPrivateKeyFromPEMString(keyPEM: PEM): void;
|
||||||
|
|
||||||
|
public readPKCS5PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS5PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readCertPubKeyHex(h: HexString, nthPKI: Nth): void;
|
||||||
|
|
||||||
|
//// RSA SIGN
|
||||||
|
|
||||||
|
public sign(s: string, hashAlg: string): HexString;
|
||||||
|
|
||||||
|
public signWithMessageHash(sHashHex: HexString, hashAlg: string): HexString;
|
||||||
|
|
||||||
|
public signPSS(s: string, hashAlg: string, sLen: number): HexString;
|
||||||
|
|
||||||
|
public signWithMessageHashPSS(hHash: HexString, hashAlg: string, sLen: number): HexString;
|
||||||
|
|
||||||
|
public verify(sMsg: string, hSig: HexString): boolean | 0;
|
||||||
|
|
||||||
|
public verifyWithMessageHash(sHashHex: HexString, hSig: HexString): boolean | 0;
|
||||||
|
|
||||||
|
public verifyPSS(sMsg: string, hSig: HexString, hashAlg: string, sLen: number): boolean;
|
||||||
|
|
||||||
|
public verifyWithMessageHashPSS(hHash: HexString, hSig: HexString, hashAlg: string, sLen: number): boolean;
|
||||||
|
|
||||||
|
public static SALT_LEN_HLEN: -1;
|
||||||
|
|
||||||
|
public static SALT_LEN_MAX: -2;
|
||||||
|
|
||||||
|
public static SALT_LEN_RECOVER: -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// RNG TYPES
|
||||||
|
class SecureRandom {
|
||||||
|
public nextBytes(ba: Mutable<ByteNumber[]>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// X509 TYPES
|
||||||
|
|
||||||
|
type ExtInfo = {
|
||||||
|
critical: boolean;
|
||||||
|
oid: OID;
|
||||||
|
vidx: Idx<ASN1V>;
|
||||||
|
};
|
||||||
|
|
||||||
|
type ExtAIAInfo = Record<'ocsp' | 'caissuer', string>;
|
||||||
|
|
||||||
|
type ExtCertificatePolicy = {
|
||||||
|
id: OIDName;
|
||||||
|
} & Partial<{
|
||||||
|
cps: string;
|
||||||
|
} | {
|
||||||
|
unotice: string;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
class X509 {
|
||||||
|
public hex: HexString | null;
|
||||||
|
|
||||||
|
public version: number;
|
||||||
|
|
||||||
|
public foffset: number;
|
||||||
|
|
||||||
|
public aExtInfo: null;
|
||||||
|
|
||||||
|
public getVersion(): number;
|
||||||
|
|
||||||
|
public getSerialNumberHex(): ASN1V;
|
||||||
|
|
||||||
|
public getSignatureAlgorithmField(): OIDName;
|
||||||
|
|
||||||
|
public getIssuerHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getIssuerString(): HexString;
|
||||||
|
|
||||||
|
public getSubjectHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getSubjectString(): HexString;
|
||||||
|
|
||||||
|
public getNotBefore(): TimeValue;
|
||||||
|
|
||||||
|
public getNotAfter(): TimeValue;
|
||||||
|
|
||||||
|
public getPublicKeyHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getPublicKeyIdx(): Idx<Mutable<Nth[]>>;
|
||||||
|
|
||||||
|
public getPublicKeyContentIdx(): Idx<Mutable<Nth[]>>;
|
||||||
|
|
||||||
|
public getPublicKey(): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public getSignatureAlgorithmName(): OIDName;
|
||||||
|
|
||||||
|
public getSignatureValueHex(): ASN1V;
|
||||||
|
|
||||||
|
public verifySignature(pubKey: GetKeyParam): boolean | 0;
|
||||||
|
|
||||||
|
public parseExt(): void;
|
||||||
|
|
||||||
|
public getExtInfo(oidOrName: OID | string): ExtInfo | undefined;
|
||||||
|
|
||||||
|
public getExtBasicConstraints(): ExtInfo | {} | {
|
||||||
|
cA: true;
|
||||||
|
pathLen?: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
public getExtKeyUsageBin(): BinString;
|
||||||
|
|
||||||
|
public getExtKeyUsageString(): string;
|
||||||
|
|
||||||
|
public getExtSubjectKeyIdentifier(): ASN1V | undefined;
|
||||||
|
|
||||||
|
public getExtAuthorityKeyIdentifier(): {
|
||||||
|
kid: ASN1V;
|
||||||
|
} | undefined;
|
||||||
|
|
||||||
|
public getExtExtKeyUsageName(): OIDName[] | undefined;
|
||||||
|
|
||||||
|
public getExtSubjectAltName(): Deprecated<string[]>;
|
||||||
|
|
||||||
|
public getExtSubjectAltName2(): ['MAIL' | 'DNS' | 'DN' | 'URI' | 'IP', string][] | undefined;
|
||||||
|
|
||||||
|
public getExtCRLDistributionPointsURI(): string[] | undefined;
|
||||||
|
|
||||||
|
public getExtAIAInfo(): ExtAIAInfo | undefined;
|
||||||
|
|
||||||
|
public getExtCertificatePolicies(): ExtCertificatePolicy[] | undefined;
|
||||||
|
|
||||||
|
public readCertPEM(sCertPEM: PEM): void;
|
||||||
|
|
||||||
|
public readCertHex(sCertHex: HexString): void;
|
||||||
|
|
||||||
|
public getInfo(): string;
|
||||||
|
|
||||||
|
public static hex2dn(hex: HexString, idx?: Idx<HexString>): string;
|
||||||
|
|
||||||
|
public static hex2rdn(hex: HexString, idx?: Idx<HexString>): string;
|
||||||
|
|
||||||
|
public static hex2attrTypeValue(hex: HexString, idx?: Idx<HexString>): string;
|
||||||
|
|
||||||
|
public static getPublicKeyFromCertPEM(sCertPEM: PEM): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static getPublicKeyInfoPropOfCertPEM(sCertPEM: PEM): {
|
||||||
|
algparam: ASN1V | null;
|
||||||
|
leyhex: ASN1V;
|
||||||
|
algoid: ASN1V;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/@types/lookup-dns-cache.d.ts
vendored
20
src/@types/lookup-dns-cache.d.ts
vendored
@@ -1,17 +1,9 @@
|
|||||||
declare module 'lookup-dns-cache' {
|
declare module 'lookup-dns-cache' {
|
||||||
type IPv4 = 4;
|
import { LookupOneOptions, LookupAllOptions, LookupOptions, LookupAddress } from 'dns';
|
||||||
|
|
||||||
type IPv6 = 6;
|
function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
||||||
|
function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
||||||
type Family = IPv4 | IPv6 | undefined;
|
function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void): void;
|
||||||
|
function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void): void;
|
||||||
interface IRunOptions {
|
function lookup(hostname: string, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
||||||
family?: Family;
|
|
||||||
all?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
type RunCallback = (error: Error | null, address?: string | string[], family?: Family) => void;
|
|
||||||
|
|
||||||
export function lookup(hostname: string, options: IRunOptions | Family, callback: RunCallback): {} | undefined;
|
|
||||||
export function lookup(hostname: string, callback: RunCallback): {} | undefined;
|
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/@types/promise-any.d.ts
vendored
7
src/@types/promise-any.d.ts
vendored
@@ -1,7 +0,0 @@
|
|||||||
declare module 'promise-any' {
|
|
||||||
function promiseAny<T>(iterable: Iterable<T | PromiseLike<T>>): Promise<T>;
|
|
||||||
|
|
||||||
namespace promiseAny {} // Hack
|
|
||||||
|
|
||||||
export = promiseAny;
|
|
||||||
}
|
|
||||||
@@ -50,7 +50,7 @@ export async function masterMain() {
|
|||||||
// initialize app
|
// initialize app
|
||||||
config = await init();
|
config = await init();
|
||||||
|
|
||||||
if (config.port == null) {
|
if (config.port == null || Number.isNaN(config.port)) {
|
||||||
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
@@ -79,6 +79,7 @@ export async function masterMain() {
|
|||||||
require('../daemons/server-stats').default();
|
require('../daemons/server-stats').default();
|
||||||
require('../daemons/notes-stats').default();
|
require('../daemons/notes-stats').default();
|
||||||
require('../daemons/queue-stats').default();
|
require('../daemons/queue-stats').default();
|
||||||
|
require('../daemons/janitor').default();
|
||||||
}
|
}
|
||||||
|
|
||||||
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
|
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
</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>
|
||||||
@@ -27,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
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ export default Vue.extend({
|
|||||||
this.connection = this.$root.stream.useSharedConnection('serverStats');
|
this.connection = this.$root.stream.useSharedConnection('serverStats');
|
||||||
|
|
||||||
this.updateStats();
|
this.updateStats();
|
||||||
this.clock = setInterval(this.updateStats, 1000);
|
this.clock = setInterval(this.updateStats, 3000);
|
||||||
|
|
||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta().then(meta => {
|
||||||
this.meta = meta;
|
this.meta = meta;
|
||||||
|
|||||||
61
src/client/app/admin/views/db.vue
Normal file
61
src/client/app/admin/views/db.vue
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faDatabase"/> {{ $t('tables') }}</template>
|
||||||
|
<section v-if="tables">
|
||||||
|
<div v-for="table in Object.keys(tables)"><b>{{ table }}</b> {{ tables[table].count | number }} {{ tables[table].size | bytes }}</div>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="faBroom"/> {{ $t('vacuum') }}</header>
|
||||||
|
<ui-info>{{ $t('vacuum-info') }}</ui-info>
|
||||||
|
<ui-switch v-model="fullVacuum">FULL</ui-switch>
|
||||||
|
<ui-switch v-model="analyzeVacuum">ANALYZE</ui-switch>
|
||||||
|
<ui-button @click="vacuum()"><fa :icon="faBroom"/> {{ $t('vacuum') }}</ui-button>
|
||||||
|
<ui-info warn>{{ $t('vacuum-exclamation') }}</ui-info>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import { faDatabase, faBroom } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('admin/views/db.vue'),
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
tables: null,
|
||||||
|
fullVacuum: true,
|
||||||
|
analyzeVacuum: true,
|
||||||
|
faDatabase, faBroom
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.$root.api('admin/get-table-stats').then(tables => {
|
||||||
|
this.tables = tables;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
vacuum() {
|
||||||
|
this.$root.api('admin/vacuum', {
|
||||||
|
full: this.fullVacuum,
|
||||||
|
analyze: this.analyzeVacuum,
|
||||||
|
}).then(() => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -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>
|
||||||
@@ -227,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>
|
||||||
|
|||||||
@@ -54,7 +54,6 @@
|
|||||||
<span>{{ $t('latest-request-received-at') }}</span>
|
<span>{{ $t('latest-request-received-at') }}</span>
|
||||||
<template #prefix><fa :icon="faInbox"/></template>
|
<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>
|
||||||
@@ -79,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>
|
||||||
@@ -130,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>
|
||||||
@@ -142,6 +145,16 @@
|
|||||||
<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>
|
||||||
|
|
||||||
@@ -149,7 +162,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faTrafficLight, faInbox } from '@fortawesome/free-solid-svg-icons';
|
import { 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';
|
||||||
|
|
||||||
@@ -176,7 +189,8 @@ export default Vue.extend({
|
|||||||
chartSrc: 'requests',
|
chartSrc: 'requests',
|
||||||
chartSpan: 'hour',
|
chartSpan: 'hour',
|
||||||
chartInstance: null,
|
chartInstance: null,
|
||||||
faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
|
blockedHosts: '',
|
||||||
|
faTrashAlt, faBan, faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -246,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() {
|
||||||
@@ -293,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,
|
||||||
@@ -477,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="hiddenTags"></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 {
|
|
||||||
hiddenTags: '',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
this.hiddenTags = meta.hiddenTags.join('\n');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
save() {
|
|
||||||
this.$root.api('admin/update-meta', {
|
|
||||||
hiddenTags: this.hiddenTags.split('\n')
|
|
||||||
}).then(() => {
|
|
||||||
//this.$root.os.apis.dialog({ text: `Saved` });
|
|
||||||
}).catch(e => {
|
|
||||||
//this.$root.os.apis.dialog({ text: `Failed ${e}` });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
||||||
<li @click="nav('queue')" :class="{ active: page == 'queue' }"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</li>
|
<li @click="nav('queue')" :class="{ active: page == 'queue' }"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</li>
|
||||||
<li @click="nav('logs')" :class="{ active: page == 'logs' }"><fa :icon="faStream" fixed-width/>{{ $t('logs') }}</li>
|
<li @click="nav('logs')" :class="{ active: page == 'logs' }"><fa :icon="faStream" fixed-width/>{{ $t('logs') }}</li>
|
||||||
|
<li @click="nav('db')" :class="{ active: page == 'db' }"><fa :icon="faDatabase" fixed-width/>{{ $t('db') }}</li>
|
||||||
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
|
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
|
||||||
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
|
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
|
||||||
<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
|
<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
|
||||||
<li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="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">
|
||||||
@@ -44,11 +44,11 @@
|
|||||||
<div v-if="page == 'instance'"><x-instance/></div>
|
<div v-if="page == 'instance'"><x-instance/></div>
|
||||||
<div v-if="page == 'queue'"><x-queue/></div>
|
<div v-if="page == 'queue'"><x-queue/></div>
|
||||||
<div v-if="page == 'logs'"><x-logs/></div>
|
<div v-if="page == 'logs'"><x-logs/></div>
|
||||||
|
<div v-if="page == 'db'"><x-db/></div>
|
||||||
<div v-if="page == 'moderators'"><x-moderators/></div>
|
<div v-if="page == 'moderators'"><x-moderators/></div>
|
||||||
<div v-if="page == 'users'"><x-users/></div>
|
<div v-if="page == 'users'"><x-users/></div>
|
||||||
<div v-if="page == 'emoji'"><x-emoji/></div>
|
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||||
<div v-if="page == 'announcements'"><x-announcements/></div>
|
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||||
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
|
||||||
<div v-if="page == '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>
|
||||||
@@ -61,20 +61,20 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { version } from '../../config';
|
import { version } from '../../config';
|
||||||
import XDashboard from "./dashboard.vue";
|
import XDashboard from './dashboard.vue';
|
||||||
import XInstance from "./instance.vue";
|
import XInstance from './instance.vue';
|
||||||
import XQueue from "./queue.vue";
|
import XQueue from './queue.vue';
|
||||||
import XLogs from "./logs.vue";
|
import XLogs from './logs.vue';
|
||||||
import XModerators from "./moderators.vue";
|
import XDb from './db.vue';
|
||||||
import XEmoji from "./emoji.vue";
|
import XModerators from './moderators.vue';
|
||||||
import XAnnouncements from "./announcements.vue";
|
import XEmoji from './emoji.vue';
|
||||||
import XHashtags from "./hashtags.vue";
|
import XAnnouncements from './announcements.vue';
|
||||||
import XUsers from "./users.vue";
|
import XUsers from './users.vue';
|
||||||
import XDrive from "./drive.vue";
|
import XDrive from './drive.vue';
|
||||||
import XAbuse from "./abuse.vue";
|
import XAbuse from './abuse.vue';
|
||||||
import XFederation from "./federation.vue";
|
import XFederation from './federation.vue';
|
||||||
|
|
||||||
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream } from '@fortawesome/free-solid-svg-icons';
|
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream, faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
// Detect the user agent
|
// Detect the user agent
|
||||||
@@ -88,10 +88,10 @@ export default Vue.extend({
|
|||||||
XInstance,
|
XInstance,
|
||||||
XQueue,
|
XQueue,
|
||||||
XLogs,
|
XLogs,
|
||||||
|
XDb,
|
||||||
XModerators,
|
XModerators,
|
||||||
XEmoji,
|
XEmoji,
|
||||||
XAnnouncements,
|
XAnnouncements,
|
||||||
XHashtags,
|
|
||||||
XUsers,
|
XUsers,
|
||||||
XDrive,
|
XDrive,
|
||||||
XAbuse,
|
XAbuse,
|
||||||
@@ -112,7 +112,8 @@ export default Vue.extend({
|
|||||||
faGlobe,
|
faGlobe,
|
||||||
faExclamationCircle,
|
faExclamationCircle,
|
||||||
faTasks,
|
faTasks,
|
||||||
faStream
|
faStream,
|
||||||
|
faDatabase,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@@ -2,56 +2,122 @@
|
|||||||
<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="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="ToSUrl"><template #icon><fa icon="link"/></template>{{ $t('tos-url') }}</ui-input>
|
||||||
|
<details>
|
||||||
|
<summary>{{ $t('advanced-config') }}</summary>
|
||||||
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
|
<ui-input v-model="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="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>
|
||||||
<ui-switch v-model="enableEmojiReaction">{{ $t('enable-emoji-reaction') }}</ui-switch>
|
<ui-switch v-model="enableEmojiReaction">{{ $t('enable-emoji-reaction') }}</ui-switch>
|
||||||
<ui-switch v-model="useStarForReactionFallback">{{ $t('use-star-for-reaction-fallback') }}</ui-switch>
|
<ui-switch v-model="useStarForReactionFallback">{{ $t('use-star-for-reaction-fallback') }}</ui-switch>
|
||||||
</section>
|
</section>
|
||||||
<section class="fit-bottom">
|
<section>
|
||||||
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
<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>
|
||||||
|
<template v-if="enableEmail">
|
||||||
<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
|
<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
||||||
@@ -60,74 +126,119 @@
|
|||||||
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
|
||||||
<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
||||||
|
<ui-button @click="testEmail()">{{ $t('test-email') }}</ui-button>
|
||||||
|
</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>
|
||||||
|
<template v-if="enableServiceWorker">
|
||||||
<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
|
<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
|
||||||
<ui-horizon-group inputs class="fit-bottom">
|
<ui-horizon-group inputs class="fit-bottom">
|
||||||
<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
|
<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input>
|
||||||
<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
|
<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
</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>
|
|
||||||
<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>
|
||||||
|
<template v-if="enableTwitterIntegration">
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
||||||
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
</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>
|
||||||
|
<template v-if="enableGithubIntegration">
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
|
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
|
||||||
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
|
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
</template>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
|
||||||
|
|
||||||
<ui-card>
|
|
||||||
<template #title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template>
|
|
||||||
<section>
|
<section>
|
||||||
|
<header><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</header>
|
||||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||||
|
<template v-if="enableDiscordIntegration">
|
||||||
<ui-horizon-group>
|
<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="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-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
</template>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary style="color:var(--text);">{{ $t('advanced-config') }}</summary>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faHashtag"/> {{ $t('hidden-tags') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-textarea v-model="hiddenTags">
|
||||||
|
<template #desc>{{ $t('hidden-tags-info') }}</template>
|
||||||
|
</ui-textarea>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title>summaly Proxy</template>
|
||||||
|
<section class="fit-top fit-bottom">
|
||||||
|
<ui-input v-model="summalyProxy">URL</ui-input>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</details>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -136,8 +247,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'),
|
||||||
@@ -148,6 +259,9 @@ 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,
|
||||||
@@ -177,7 +291,6 @@ export default Vue.extend({
|
|||||||
discordClientId: null,
|
discordClientId: null,
|
||||||
discordClientSecret: null,
|
discordClientSecret: null,
|
||||||
proxyAccount: null,
|
proxyAccount: null,
|
||||||
inviteCode: null,
|
|
||||||
summalyProxy: null,
|
summalyProxy: null,
|
||||||
enableEmail: false,
|
enableEmail: false,
|
||||||
email: null,
|
email: null,
|
||||||
@@ -190,7 +303,19 @@ 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
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -198,6 +323,9 @@ export default Vue.extend({
|
|||||||
this.$root.getMeta(true).then(meta => {
|
this.$root.getMeta(true).then(meta => {
|
||||||
this.maintainerName = meta.maintainerName;
|
this.maintainerName = meta.maintainerName;
|
||||||
this.maintainerEmail = meta.maintainerEmail;
|
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;
|
||||||
@@ -239,13 +367,74 @@ 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 => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async testEmail() {
|
||||||
|
this.$root.api('admin/send-email', {
|
||||||
|
to: this.maintainerEmail,
|
||||||
|
subject: 'Test email',
|
||||||
|
text: 'Yo'
|
||||||
|
}).then(x => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
@@ -258,6 +447,9 @@ 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,
|
||||||
@@ -297,7 +489,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',
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
</details>
|
</details>
|
||||||
</code>
|
</code>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ui-button @click="deleteAll()">{{ $t('delete-all') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -78,6 +80,15 @@ export default Vue.extend({
|
|||||||
}).then(logs => {
|
}).then(logs => {
|
||||||
this.logs = logs.reverse();
|
this.logs = logs.reverse();
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteAll() {
|
||||||
|
this.$root.api('admin/delete-logs').then(() => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,6 +12,31 @@
|
|||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title>{{ $t('logs.title') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
|
<div v-for="log in logs" :key="log.id" class="">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input :value="log.user | acct" type="text" readonly>
|
||||||
|
<span>{{ $t('logs.moderator') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="log.type" type="text" readonly>
|
||||||
|
<span>{{ $t('logs.type') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="log.createdAt | date" type="text" readonly>
|
||||||
|
<span>{{ $t('logs.at') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-textarea :value="JSON.stringify(log.info, null, 4)" readonly>
|
||||||
|
<span>{{ $t('logs.info') }}</span>
|
||||||
|
</ui-textarea>
|
||||||
|
</div>
|
||||||
|
</sequential-entrance>
|
||||||
|
<ui-button v-if="existMoreLogs" @click="fetchLogs">{{ $t('@.load-more') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -26,10 +51,17 @@ export default Vue.extend({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
username: '',
|
username: '',
|
||||||
changing: false
|
changing: false,
|
||||||
|
logs: [],
|
||||||
|
untilLogId: null,
|
||||||
|
existMoreLogs: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.fetchLogs();
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
async add() {
|
async add() {
|
||||||
this.changing = true;
|
this.changing = true;
|
||||||
@@ -74,6 +106,22 @@ export default Vue.extend({
|
|||||||
|
|
||||||
this.changing = false;
|
this.changing = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
fetchLogs() {
|
||||||
|
this.$root.api('admin/show-moderation-logs', {
|
||||||
|
untilId: this.untilId,
|
||||||
|
limit: 10 + 1
|
||||||
|
}).then(logs => {
|
||||||
|
if (logs.length == 10 + 1) {
|
||||||
|
logs.pop();
|
||||||
|
this.existMoreLogs = true;
|
||||||
|
} else {
|
||||||
|
this.existMoreLogs = false;
|
||||||
|
}
|
||||||
|
this.logs = this.logs.concat(logs);
|
||||||
|
this.untilLogId = this.logs[this.logs.length - 1].id;
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
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>
|
||||||
@@ -2,59 +2,27 @@
|
|||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="faChartBar"/> {{ $t('title') }}</template>
|
<template #title><fa :icon="faChartBar"/> {{ $t('title') }}</template>
|
||||||
<section class="wptihjuy">
|
<section>
|
||||||
<header><fa :icon="faPaperPlane"/> Deliver</header>
|
<header><fa :icon="faPaperPlane"/> {{ $t('domains.deliver') }}</header>
|
||||||
<ui-info warn v-if="latestStats && latestStats.deliver.waiting > 0">The queue is jammed.</ui-info>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="deliver"/>
|
||||||
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
|
||||||
<ui-input :value="latestStats.deliver.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.deliver.active | number" type="text" readonly>
|
|
||||||
<span>Active</span>
|
|
||||||
<template #prefix><fa :icon="farPlayCircle"/></template>
|
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
<ui-input :value="latestStats.deliver.waiting | number" type="text" readonly>
|
|
||||||
<span>Waiting</span>
|
|
||||||
<template #prefix><fa :icon="faStopCircle"/></template>
|
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
<ui-input :value="latestStats.deliver.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="deliverChart" class="chart"></div>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="wptihjuy">
|
<section>
|
||||||
<header><fa :icon="faInbox"/> Inbox</header>
|
<header><fa :icon="faInbox"/> {{ $t('domains.inbox') }}</header>
|
||||||
<ui-info warn v-if="latestStats && latestStats.inbox.waiting > 0">The queue is jammed.</ui-info>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="inbox"/>
|
||||||
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
</section>
|
||||||
<ui-input :value="latestStats.inbox.activeSincePrevTick | number" type="text" readonly>
|
<section>
|
||||||
<span>Process</span>
|
<details>
|
||||||
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
<summary>{{ $t('other-queues') }}</summary>
|
||||||
<template #suffix>jobs/tick</template>
|
<section>
|
||||||
</ui-input>
|
<header><fa :icon="faDatabase"/> {{ $t('domains.db') }}</header>
|
||||||
<ui-input :value="latestStats.inbox.active | number" type="text" readonly>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="db"/>
|
||||||
<span>Active</span>
|
</section>
|
||||||
<template #prefix><fa :icon="farPlayCircle"/></template>
|
<ui-hr/>
|
||||||
<template #suffix>jobs</template>
|
<section>
|
||||||
</ui-input>
|
<header><fa :icon="faCloud"/> {{ $t('domains.objectStorage') }}</header>
|
||||||
<ui-input :value="latestStats.inbox.waiting | number" type="text" readonly>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="objectStorage"/>
|
||||||
<span>Waiting</span>
|
</section>
|
||||||
<template #prefix><fa :icon="faStopCircle"/></template>
|
</details>
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
<ui-input :value="latestStats.inbox.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="inboxChart" class="chart"></div>
|
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
||||||
@@ -69,9 +37,13 @@
|
|||||||
<template #label>{{ $t('queue') }}</template>
|
<template #label>{{ $t('queue') }}</template>
|
||||||
<option value="deliver">{{ $t('domains.deliver') }}</option>
|
<option value="deliver">{{ $t('domains.deliver') }}</option>
|
||||||
<option value="inbox">{{ $t('domains.inbox') }}</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>
|
||||||
<ui-select v-model="state">
|
<ui-select v-model="state">
|
||||||
<template #label>{{ $t('state') }}</template>
|
<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>
|
<option value="delayed">{{ $t('states.delayed') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
@@ -94,74 +66,31 @@
|
|||||||
|
|
||||||
<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 ApexCharts from 'apexcharts';
|
import XChart from './queue.chart.vue';
|
||||||
import * as tinycolor from 'tinycolor2';
|
|
||||||
import { faTasks, faInbox, faStopwatch, faPlayCircle as fasPlayCircle } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { faPaperPlane, faStopCircle, faPlayCircle as farPlayCircle, faChartBar } from '@fortawesome/free-regular-svg-icons';
|
|
||||||
|
|
||||||
const limit = 200;
|
|
||||||
|
|
||||||
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 {
|
||||||
stats: [],
|
connection: null,
|
||||||
deliverChart: null,
|
chartLimit: 200,
|
||||||
inboxChart: null,
|
|
||||||
jobs: [],
|
jobs: [],
|
||||||
jobsLimit: 50,
|
jobsLimit: 50,
|
||||||
domain: 'deliver',
|
domain: 'deliver',
|
||||||
state: 'delayed',
|
state: 'delayed',
|
||||||
faTasks, faPaperPlane, faInbox, faStopwatch, faStopCircle, farPlayCircle, fasPlayCircle, faChartBar
|
faTasks, faPaperPlane, faInbox, faChartBar, faDatabase, faCloud
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
|
||||||
latestStats(): any {
|
|
||||||
return this.stats[this.stats.length - 1];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
stats(stats) {
|
|
||||||
this.inboxChart.updateSeries([{
|
|
||||||
name: 'Process',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.activeSincePrevTick }))
|
|
||||||
}, {
|
|
||||||
name: 'Active',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.active }))
|
|
||||||
}, {
|
|
||||||
name: 'Waiting',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.waiting }))
|
|
||||||
}, {
|
|
||||||
name: 'Delayed',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.delayed }))
|
|
||||||
}]);
|
|
||||||
this.deliverChart.updateSeries([{
|
|
||||||
name: 'Process',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.activeSincePrevTick }))
|
|
||||||
}, {
|
|
||||||
name: 'Active',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.active }))
|
|
||||||
}, {
|
|
||||||
name: 'Waiting',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.waiting }))
|
|
||||||
}, {
|
|
||||||
name: 'Delayed',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.delayed }))
|
|
||||||
}]);
|
|
||||||
},
|
|
||||||
|
|
||||||
domain() {
|
domain() {
|
||||||
this.jobs = [];
|
this.jobs = [];
|
||||||
this.fetchJobs();
|
this.fetchJobs();
|
||||||
@@ -176,83 +105,14 @@ export default Vue.extend({
|
|||||||
mounted() {
|
mounted() {
|
||||||
this.fetchJobs();
|
this.fetchJobs();
|
||||||
|
|
||||||
const chartOpts = id => ({
|
this.connection = this.$root.stream.useSharedConnection('queueStats');
|
||||||
chart: {
|
this.connection.send('requestLog', {
|
||||||
id,
|
|
||||||
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.inboxChart = new ApexCharts(this.$refs.inboxChart, chartOpts('a'));
|
|
||||||
this.deliverChart = new ApexCharts(this.$refs.deliverChart, chartOpts('b'));
|
|
||||||
|
|
||||||
this.inboxChart.render();
|
|
||||||
this.deliverChart.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),
|
id: Math.random().toString().substr(2, 8),
|
||||||
length: limit
|
length: this.chartLimit
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$once('hook:beforeDestroy', () => {
|
this.$once('hook:beforeDestroy', () => {
|
||||||
connection.dispose();
|
this.connection.dispose();
|
||||||
this.inboxChart.destroy();
|
|
||||||
this.deliverChart.destroy();
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -274,17 +134,6 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
fetchJobs() {
|
fetchJobs() {
|
||||||
this.$root.api('admin/queue/jobs', {
|
this.$root.api('admin/queue/jobs', {
|
||||||
domain: this.domain,
|
domain: this.domain,
|
||||||
@@ -299,11 +148,6 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.wptihjuy
|
|
||||||
> .chart
|
|
||||||
min-height 200px !important
|
|
||||||
margin 0 -8px
|
|
||||||
|
|
||||||
.xvvuvgsv
|
.xvvuvgsv
|
||||||
> b
|
> b
|
||||||
margin-right 16px
|
margin-right 16px
|
||||||
|
|||||||
@@ -5,13 +5,12 @@
|
|||||||
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div @click="click(user.id)">
|
||||||
<header>
|
<header>
|
||||||
<b><mk-user-name :user="user"/></b>
|
<b><mk-user-name :user="user"/></b>
|
||||||
<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>
|
||||||
@@ -33,7 +32,7 @@ import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
|||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/users.vue'),
|
i18n: i18n('admin/views/users.vue'),
|
||||||
props: ['user'],
|
props: ['user', 'click'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
faSnowflake, faMicrophoneSlash
|
faSnowflake, faMicrophoneSlash
|
||||||
@@ -45,7 +44,7 @@ export default Vue.extend({
|
|||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.kofvwchc
|
.kofvwchc
|
||||||
display flex
|
display flex
|
||||||
padding 16px 0
|
padding 16px
|
||||||
border-top solid 1px var(--faceDivider)
|
border-top solid 1px var(--faceDivider)
|
||||||
|
|
||||||
> div:first-child
|
> div:first-child
|
||||||
@@ -56,6 +55,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> div:last-child
|
> div:last-child
|
||||||
flex 1
|
flex 1
|
||||||
|
cursor pointer
|
||||||
padding-left 16px
|
padding-left 16px
|
||||||
|
|
||||||
@media (max-width 500px)
|
@media (max-width 500px)
|
||||||
@@ -77,9 +77,19 @@ 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
|
||||||
color #4dabf7
|
color #4dabf7
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color var(--primaryForeground)
|
||||||
|
background var(--primary)
|
||||||
|
text-decoration none
|
||||||
|
border-radius 3px
|
||||||
|
|
||||||
|
&:active
|
||||||
|
color var(--primaryForeground)
|
||||||
|
background var(--primaryDarken10)
|
||||||
|
border-radius 3px
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -8,14 +8,11 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<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 ref="user" class="user" v-if="user" :key="user.id">
|
||||||
<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>
|
||||||
@@ -58,8 +54,16 @@
|
|||||||
<option value="remote">{{ $t('users.origin.remote') }}</option>
|
<option value="remote">{{ $t('users.origin.remote') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
<ui-horizon-group searchboxes>
|
||||||
|
<ui-input v-model="searchUsername" type="text" spellcheck="false" @input="fetchUsers(true)">
|
||||||
|
<span>{{ $t('username') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input v-model="searchHost" type="text" spellcheck="false" @input="fetchUsers(true)" :disabled="origin === 'local'">
|
||||||
|
<span>{{ $t('host') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<x-user v-for="user in users" :user='user' :key="user.id"/>
|
<x-user v-for="user in users" :key="user.id" :user='user' :click="showUserOnClick"/>
|
||||||
</sequential-entrance>
|
</sequential-entrance>
|
||||||
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
@@ -71,8 +75,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,18 +88,18 @@ 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',
|
||||||
state: 'all',
|
state: 'all',
|
||||||
origin: 'local',
|
origin: 'local',
|
||||||
|
searchUsername: '',
|
||||||
|
searchHost: '',
|
||||||
limit: 10,
|
limit: 10,
|
||||||
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
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -113,6 +117,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
origin() {
|
origin() {
|
||||||
|
if (this.origin === 'local') this.searchHost = '';
|
||||||
this.users = [];
|
this.users = [];
|
||||||
this.offset = 0;
|
this.offset = 0;
|
||||||
this.fetchUsers();
|
this.fetchUsers();
|
||||||
@@ -163,6 +168,15 @@ export default Vue.extend({
|
|||||||
this.target = '';
|
this.target = '';
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async showUserOnClick(userId: string) {
|
||||||
|
this.$root.api('admin/show-user', { userId: userId }).then(info => {
|
||||||
|
this.user = info;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.user.scrollIntoView();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/** 処理対象ユーザーの情報を更新する */
|
/** 処理対象ユーザーの情報を更新する */
|
||||||
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 => {
|
||||||
@@ -181,56 +195,6 @@ 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;
|
if (!await this.getConfirmed(this.$t('silence-confirm'))) return;
|
||||||
|
|
||||||
@@ -334,6 +298,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',
|
||||||
@@ -345,13 +328,16 @@ export default Vue.extend({
|
|||||||
return !confirm.canceled;
|
return !confirm.canceled;
|
||||||
},
|
},
|
||||||
|
|
||||||
fetchUsers() {
|
fetchUsers(truncate?: boolean) {
|
||||||
|
if (truncate) this.offset = 0;
|
||||||
this.$root.api('admin/show-users', {
|
this.$root.api('admin/show-users', {
|
||||||
state: this.state,
|
state: this.state,
|
||||||
origin: this.origin,
|
origin: this.origin,
|
||||||
sort: this.sort,
|
sort: this.sort,
|
||||||
offset: this.offset,
|
offset: this.offset,
|
||||||
limit: this.limit + 1
|
limit: this.limit + 1,
|
||||||
|
username: this.searchUsername,
|
||||||
|
hostname: this.searchHost
|
||||||
}).then(users => {
|
}).then(users => {
|
||||||
if (users.length == this.limit + 1) {
|
if (users.length == this.limit + 1) {
|
||||||
users.pop();
|
users.pop();
|
||||||
@@ -359,7 +345,7 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
this.users = this.users.concat(users);
|
this.users = truncate ? users : this.users.concat(users);
|
||||||
this.offset += this.limit;
|
this.offset += this.limit;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<header>
|
<header>
|
||||||
<h1 v-html="$t('share-access', { name: app.name })"></h1>
|
<h1 v-html="$t('share-access', { name })"></h1>
|
||||||
<img :src="app.iconUrl"/>
|
<img :src="app.iconUrl"/>
|
||||||
</header>
|
</header>
|
||||||
<div class="app">
|
<div class="app">
|
||||||
@@ -34,6 +34,11 @@ export default Vue.extend({
|
|||||||
i18n: i18n('auth/views/form.vue'),
|
i18n: i18n('auth/views/form.vue'),
|
||||||
props: ['session'],
|
props: ['session'],
|
||||||
computed: {
|
computed: {
|
||||||
|
name(): string {
|
||||||
|
const el = document.createElement('div');
|
||||||
|
el.textContent = this.app.name
|
||||||
|
return el.innerHTML;
|
||||||
|
},
|
||||||
app(): any {
|
app(): any {
|
||||||
return this.session.app;
|
return this.session.app;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
|
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
|
||||||
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
|
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
|
||||||
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
|
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
|
||||||
if (`${url.pathname}/`.startsWith('/test/')) app = 'test';
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// Script version
|
// Script version
|
||||||
@@ -85,7 +84,14 @@
|
|||||||
|
|
||||||
// Detect the user agent
|
// Detect the user agent
|
||||||
const ua = navigator.userAgent.toLowerCase();
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
const isMobile = /mobile|iphone|ipad|android/.test(ua);
|
let isMobile = /mobile|iphone|ipad|android/.test(ua) || window.innerWidth < 576;
|
||||||
|
if (settings && settings.device.appTypeForce) {
|
||||||
|
if (settings.device.appTypeForce === 'mobile') {
|
||||||
|
isMobile = true;
|
||||||
|
} else if (settings.device.appTypeForce === 'desktop') {
|
||||||
|
isMobile = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get the <head> element
|
// Get the <head> element
|
||||||
const head = document.getElementsByTagName('head')[0];
|
const head = document.getElementsByTagName('head')[0];
|
||||||
|
|||||||
@@ -60,9 +60,9 @@ export default function <T extends object>(data: {
|
|||||||
|
|
||||||
save() {
|
save() {
|
||||||
if (this.platform == 'deck') {
|
if (this.platform == 'deck') {
|
||||||
this.$store.commit('device/updateDeckColumn', this.column);
|
this.$store.commit('updateDeckColumn', this.column);
|
||||||
} else {
|
} else {
|
||||||
this.$store.commit('device/updateWidget', this.widget);
|
this.$store.commit('updateWidget', this.widget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ function match(e: KeyboardEvent, patterns: action['patterns']): boolean {
|
|||||||
pattern.ctrl == e.ctrlKey &&
|
pattern.ctrl == e.ctrlKey &&
|
||||||
pattern.shift == e.shiftKey &&
|
pattern.shift == e.shiftKey &&
|
||||||
pattern.alt == e.altKey &&
|
pattern.alt == e.altKey &&
|
||||||
e.metaKey == false
|
!e.metaKey
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
5
src/client/app/common/scripts/2fa.ts
Normal file
5
src/client/app/common/scripts/2fa.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export function hexifyAB(buffer) {
|
||||||
|
return Array.from(new Uint8Array(buffer))
|
||||||
|
.map(item => item.toString(16).padStart(2, 0))
|
||||||
|
.join('');
|
||||||
|
}
|
||||||
@@ -26,6 +26,18 @@ export function collectPageVars(content) {
|
|||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
value: x.default || false
|
value: x.default || false
|
||||||
});
|
});
|
||||||
|
} else if (x.type === 'counter') {
|
||||||
|
pageVars.push({
|
||||||
|
name: x.name,
|
||||||
|
type: 'number',
|
||||||
|
value: 0
|
||||||
|
});
|
||||||
|
} else if (x.type === 'radioButton') {
|
||||||
|
pageVars.push({
|
||||||
|
name: x.name,
|
||||||
|
type: 'string',
|
||||||
|
value: x.default || ''
|
||||||
|
});
|
||||||
} else if (x.children) {
|
} else if (x.children) {
|
||||||
collect(x.children);
|
collect(x.children);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ const faces = [
|
|||||||
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
||||||
'✌️(´・_・`)✌️',
|
'✌️(´・_・`)✌️',
|
||||||
'(。>﹏<。)',
|
'(。>﹏<。)',
|
||||||
'(Δ・x・Δ)'
|
'(Δ・x・Δ)',
|
||||||
|
'(コ`・ヘ・´ケ)'
|
||||||
];
|
];
|
||||||
|
|
||||||
export default () => faces[Math.floor(Math.random() * faces.length)];
|
export default () => faces[Math.floor(Math.random() * faces.length)];
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import { sum, unique } from '../../../../prelude/array';
|
|||||||
import shouldMuteNote from './should-mute-note';
|
import shouldMuteNote from './should-mute-note';
|
||||||
import MkNoteMenu from '../views/components/note-menu.vue';
|
import MkNoteMenu from '../views/components/note-menu.vue';
|
||||||
import MkReactionPicker from '../views/components/reaction-picker.vue';
|
import MkReactionPicker from '../views/components/reaction-picker.vue';
|
||||||
|
import pleaseLogin from './please-login';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
|
||||||
function focus(el, fn) {
|
function focus(el, fn) {
|
||||||
const target = fn(el);
|
const target = fn(el);
|
||||||
@@ -20,6 +22,8 @@ type Opts = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default (opts: Opts = {}) => ({
|
export default (opts: Opts = {}) => ({
|
||||||
|
i18n: i18n(),
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
showContent: false,
|
showContent: false,
|
||||||
@@ -83,9 +87,19 @@ export default (opts: Opts = {}) => ({
|
|||||||
if (this.appearNote.text) {
|
if (this.appearNote.text) {
|
||||||
const ast = parse(this.appearNote.text);
|
const ast = parse(this.appearNote.text);
|
||||||
// TODO: 再帰的にURL要素がないか調べる
|
// TODO: 再帰的にURL要素がないか調べる
|
||||||
return unique(ast
|
const urls = unique(ast
|
||||||
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
|
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
|
||||||
.map(t => t.node.props.url));
|
.map(t => t.node.props.url));
|
||||||
|
|
||||||
|
// unique without hash
|
||||||
|
// [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ]
|
||||||
|
const removeHash = x => x.replace(/#[^#]*$/, '');
|
||||||
|
|
||||||
|
return urls.reduce((array, url) => {
|
||||||
|
const removed = removeHash(url);
|
||||||
|
if (!array.map(x => removeHash(x)).includes(removed)) array.push(url);
|
||||||
|
return array;
|
||||||
|
}, []);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -98,6 +112,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
reply(viaKeyboard = false) {
|
reply(viaKeyboard = false) {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.$root.$post({
|
this.$root.$post({
|
||||||
reply: this.appearNote,
|
reply: this.appearNote,
|
||||||
animation: !viaKeyboard,
|
animation: !viaKeyboard,
|
||||||
@@ -108,6 +123,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
renote(viaKeyboard = false) {
|
renote(viaKeyboard = false) {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.$root.$post({
|
this.$root.$post({
|
||||||
renote: this.appearNote,
|
renote: this.appearNote,
|
||||||
animation: !viaKeyboard,
|
animation: !viaKeyboard,
|
||||||
@@ -124,6 +140,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
react(viaKeyboard = false) {
|
react(viaKeyboard = false) {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.blur();
|
this.blur();
|
||||||
this.$root.new(MkReactionPicker, {
|
this.$root.new(MkReactionPicker, {
|
||||||
source: this.$refs.reactButton,
|
source: this.$refs.reactButton,
|
||||||
@@ -149,6 +166,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
favorite() {
|
favorite() {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.$root.api('notes/favorites/create', {
|
this.$root.api('notes/favorites/create', {
|
||||||
noteId: this.appearNote.id
|
noteId: this.appearNote.id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
@@ -160,9 +178,17 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
del() {
|
del() {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('@.delete-confirm'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
|
||||||
this.$root.api('notes/delete', {
|
this.$root.api('notes/delete', {
|
||||||
noteId: this.appearNote.id
|
noteId: this.appearNote.id
|
||||||
});
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
|
|||||||
@@ -144,8 +144,6 @@ export default prop => ({
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$emit(`update:${prop}`, this.$_ns_note_);
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
189
src/client/app/common/scripts/paging.ts
Normal file
189
src/client/app/common/scripts/paging.ts
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default (opts) => ({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
items: [],
|
||||||
|
queue: [],
|
||||||
|
offset: 0,
|
||||||
|
fetching: true,
|
||||||
|
moreFetching: false,
|
||||||
|
inited: false,
|
||||||
|
more: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
empty(): boolean {
|
||||||
|
return this.items.length == 0 && !this.fetching && this.inited;
|
||||||
|
},
|
||||||
|
|
||||||
|
error(): boolean {
|
||||||
|
return !this.fetching && !this.inited;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
queue(x) {
|
||||||
|
if (opts.onQueueChanged) opts.onQueueChanged(this, x);
|
||||||
|
},
|
||||||
|
|
||||||
|
pagination() {
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
opts.displayLimit = opts.displayLimit || 30;
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
if (opts.captureWindowScroll) {
|
||||||
|
this.isScrollTop = () => {
|
||||||
|
return window.scrollY <= 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener('scroll', this.onScroll, { passive: true });
|
||||||
|
} else if (opts.isContainer) {
|
||||||
|
this.isScrollTop = () => {
|
||||||
|
return this.$el.scrollTop <= 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$el.addEventListener('scroll', this.onScroll, { passive: true });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
if (opts.captureWindowScroll) {
|
||||||
|
window.removeEventListener('scroll', this.onScroll);
|
||||||
|
} else if (opts.isContainer) {
|
||||||
|
this.$el.removeEventListener('scroll', this.onScroll);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
updateItem(i, item) {
|
||||||
|
Vue.set((this as any).items, i, item);
|
||||||
|
},
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
this.queue = [];
|
||||||
|
this.items = [];
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
|
||||||
|
async init() {
|
||||||
|
this.fetching = true;
|
||||||
|
if (opts.beforeInit) opts.beforeInit(this);
|
||||||
|
let params = typeof this.pagination.params === 'function' ? this.pagination.params(true) : this.pagination.params;
|
||||||
|
if (params && params.then) params = await params;
|
||||||
|
await this.$root.api(this.pagination.endpoint, {
|
||||||
|
limit: (this.pagination.limit || 10) + 1,
|
||||||
|
...params
|
||||||
|
}).then(x => {
|
||||||
|
if (x.length == (this.pagination.limit || 10) + 1) {
|
||||||
|
x.pop();
|
||||||
|
this.items = x;
|
||||||
|
this.more = true;
|
||||||
|
} else {
|
||||||
|
this.items = x;
|
||||||
|
this.more = false;
|
||||||
|
}
|
||||||
|
this.offset = x.length;
|
||||||
|
this.inited = true;
|
||||||
|
this.fetching = false;
|
||||||
|
if (opts.onInited) opts.onInited(this);
|
||||||
|
}, e => {
|
||||||
|
this.fetching = false;
|
||||||
|
if (opts.onInited) opts.onInited(this);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async fetchMore() {
|
||||||
|
if (!this.more || this.moreFetching || this.items.length === 0) return;
|
||||||
|
this.moreFetching = true;
|
||||||
|
let params = typeof this.pagination.params === 'function' ? this.pagination.params(false) : this.pagination.params;
|
||||||
|
if (params && params.then) params = await params;
|
||||||
|
await this.$root.api(this.pagination.endpoint, {
|
||||||
|
limit: (this.pagination.limit || 10) + 1,
|
||||||
|
...(this.pagination.endpoint === 'notes/search' ? {
|
||||||
|
offset: this.offset,
|
||||||
|
} : {
|
||||||
|
untilId: this.items[this.items.length - 1].id,
|
||||||
|
}),
|
||||||
|
...params
|
||||||
|
}).then(x => {
|
||||||
|
if (x.length == (this.pagination.limit || 10) + 1) {
|
||||||
|
x.pop();
|
||||||
|
this.items = this.items.concat(x);
|
||||||
|
this.more = true;
|
||||||
|
} else {
|
||||||
|
this.items = this.items.concat(x);
|
||||||
|
this.more = false;
|
||||||
|
}
|
||||||
|
this.offset += x.length;
|
||||||
|
this.moreFetching = false;
|
||||||
|
}, e => {
|
||||||
|
this.moreFetching = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
prepend(item, silent = false) {
|
||||||
|
if (opts.onPrepend) {
|
||||||
|
const cancel = opts.onPrepend(this, item, silent);
|
||||||
|
if (cancel) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.isScrollTop == null || this.isScrollTop()) {
|
||||||
|
// Prepend the item
|
||||||
|
this.items.unshift(item);
|
||||||
|
|
||||||
|
// オーバーフローしたら古い投稿は捨てる
|
||||||
|
if (this.items.length >= opts.displayLimit) {
|
||||||
|
this.items = this.items.slice(0, opts.displayLimit);
|
||||||
|
this.more = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.queue.push(item);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
append(item) {
|
||||||
|
this.items.push(item);
|
||||||
|
},
|
||||||
|
|
||||||
|
releaseQueue() {
|
||||||
|
for (const n of this.queue) {
|
||||||
|
this.prepend(n, true);
|
||||||
|
}
|
||||||
|
this.queue = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
onScroll() {
|
||||||
|
if (this.isScrollTop()) {
|
||||||
|
this.onTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.$store.state.settings.fetchOnScroll) {
|
||||||
|
// 親要素が display none だったら弾く
|
||||||
|
// https://github.com/syuilo/misskey/issues/1569
|
||||||
|
// http://d.hatena.ne.jp/favril/20091105/1257403319
|
||||||
|
if (this.$el.offsetHeight == 0) return;
|
||||||
|
|
||||||
|
const bottomPosition = opts.isContainer ? this.$el.scrollHeight : document.body.offsetHeight;
|
||||||
|
|
||||||
|
const currentBottomPosition = opts.isContainer ? this.$el.scrollTop + this.$el.clientHeight : window.scrollY + window.innerHeight;
|
||||||
|
if (currentBottomPosition > (bottomPosition - 8)) this.onBottom();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onTop() {
|
||||||
|
this.releaseQueue();
|
||||||
|
},
|
||||||
|
|
||||||
|
onBottom() {
|
||||||
|
this.fetchMore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
10
src/client/app/common/scripts/please-login.ts
Normal file
10
src/client/app/common/scripts/please-login.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
export default ($root: any) => {
|
||||||
|
if ($root.$store.getters.isSignedIn) return;
|
||||||
|
|
||||||
|
$root.dialog({
|
||||||
|
title: $root.$t('@.signin-required'),
|
||||||
|
text: null
|
||||||
|
});
|
||||||
|
|
||||||
|
throw new Error('signin required');
|
||||||
|
};
|
||||||
526
src/client/app/common/scripts/post-form.ts
Normal file
526
src/client/app/common/scripts/post-form.ts
Normal file
@@ -0,0 +1,526 @@
|
|||||||
|
import insertTextAtCursor from 'insert-text-at-cursor';
|
||||||
|
import { length } from 'stringz';
|
||||||
|
import { toASCII } from 'punycode';
|
||||||
|
import MkVisibilityChooser from '../views/components/visibility-chooser.vue';
|
||||||
|
import getFace from './get-face';
|
||||||
|
import { parse } from '../../../../mfm/parse';
|
||||||
|
import { host, url } from '../../config';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import { erase, unique } from '../../../../prelude/array';
|
||||||
|
import extractMentions from '../../../../misc/extract-mentions';
|
||||||
|
import { formatTimeString } from '../../../../misc/format-time-string';
|
||||||
|
|
||||||
|
export default (opts) => ({
|
||||||
|
i18n: i18n(),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XPostFormAttaches: () => import('../views/components/post-form-attaches.vue').then(m => m.default),
|
||||||
|
XPollEditor: () => import('../views/components/poll-editor.vue').then(m => m.default)
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
reply: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
renote: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
mention: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
initialText: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
initialNote: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
instant: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
posting: false,
|
||||||
|
text: '',
|
||||||
|
files: [],
|
||||||
|
uploadings: [],
|
||||||
|
poll: false,
|
||||||
|
pollChoices: [],
|
||||||
|
pollMultiple: false,
|
||||||
|
pollExpiration: [],
|
||||||
|
useCw: false,
|
||||||
|
cw: null,
|
||||||
|
geo: null,
|
||||||
|
visibility: 'public',
|
||||||
|
visibleUsers: [],
|
||||||
|
localOnly: false,
|
||||||
|
autocomplete: null,
|
||||||
|
draghover: false,
|
||||||
|
quoteId: null,
|
||||||
|
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
|
||||||
|
maxNoteTextLength: 1000
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
draftId(): string {
|
||||||
|
return this.renote
|
||||||
|
? `renote:${this.renote.id}`
|
||||||
|
: this.reply
|
||||||
|
? `reply:${this.reply.id}`
|
||||||
|
: 'note';
|
||||||
|
},
|
||||||
|
|
||||||
|
placeholder(): string {
|
||||||
|
const xs = [
|
||||||
|
this.$t('@.note-placeholders.a'),
|
||||||
|
this.$t('@.note-placeholders.b'),
|
||||||
|
this.$t('@.note-placeholders.c'),
|
||||||
|
this.$t('@.note-placeholders.d'),
|
||||||
|
this.$t('@.note-placeholders.e'),
|
||||||
|
this.$t('@.note-placeholders.f')
|
||||||
|
];
|
||||||
|
const x = xs[Math.floor(Math.random() * xs.length)];
|
||||||
|
|
||||||
|
return this.renote
|
||||||
|
? opts.mobile ? this.$t('@.post-form.option-quote-placeholder') : this.$t('@.post-form.quote-placeholder')
|
||||||
|
: this.reply
|
||||||
|
? this.$t('@.post-form.reply-placeholder')
|
||||||
|
: x;
|
||||||
|
},
|
||||||
|
|
||||||
|
submitText(): string {
|
||||||
|
return this.renote
|
||||||
|
? this.$t('@.post-form.renote')
|
||||||
|
: this.reply
|
||||||
|
? this.$t('@.post-form.reply')
|
||||||
|
: this.$t('@.post-form.submit');
|
||||||
|
},
|
||||||
|
|
||||||
|
canPost(): boolean {
|
||||||
|
return !this.posting &&
|
||||||
|
(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
|
||||||
|
(length(this.text.trim()) <= this.maxNoteTextLength) &&
|
||||||
|
(!this.poll || this.pollChoices.length >= 2);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.$root.getMeta().then(meta => {
|
||||||
|
this.maxNoteTextLength = meta.maxNoteTextLength;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
if (this.initialText) {
|
||||||
|
this.text = this.initialText;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.mention) {
|
||||||
|
this.text = this.mention.host ? `@${this.mention.username}@${toASCII(this.mention.host)}` : `@${this.mention.username}`;
|
||||||
|
this.text += ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.reply && this.reply.user.host != null) {
|
||||||
|
this.text = `@${this.reply.user.username}@${toASCII(this.reply.user.host)} `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.reply && this.reply.text != null) {
|
||||||
|
const ast = parse(this.reply.text);
|
||||||
|
|
||||||
|
for (const x of extractMentions(ast)) {
|
||||||
|
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
||||||
|
|
||||||
|
// 自分は除外
|
||||||
|
if (this.$store.state.i.username == x.username && x.host == null) continue;
|
||||||
|
if (this.$store.state.i.username == x.username && x.host == host) continue;
|
||||||
|
|
||||||
|
// 重複は除外
|
||||||
|
if (this.text.indexOf(`${mention} `) != -1) continue;
|
||||||
|
|
||||||
|
this.text += `${mention} `;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// デフォルト公開範囲
|
||||||
|
this.applyVisibility(this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility);
|
||||||
|
|
||||||
|
// 公開以外へのリプライ時は元の公開範囲を引き継ぐ
|
||||||
|
if (this.reply && ['home', 'followers', 'specified'].includes(this.reply.visibility)) {
|
||||||
|
this.visibility = this.reply.visibility;
|
||||||
|
if (this.reply.visibility === 'specified') {
|
||||||
|
this.$root.api('users/show', {
|
||||||
|
userIds: this.reply.visibleUserIds.filter(uid => uid !== this.$store.state.i.id && uid !== this.reply.userId)
|
||||||
|
}).then(users => {
|
||||||
|
this.visibleUsers.push(...users);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.reply && this.reply.userId !== this.$store.state.i.id) {
|
||||||
|
this.$root.api('users/show', { userId: this.reply.userId }).then(user => {
|
||||||
|
this.visibleUsers.push(user);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep cw when reply
|
||||||
|
if (this.$store.state.settings.keepCw && this.reply && this.reply.cw) {
|
||||||
|
this.useCw = true;
|
||||||
|
this.cw = this.reply.cw;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.focus();
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
// 書きかけの投稿を復元
|
||||||
|
if (!this.instant && !this.mention) {
|
||||||
|
const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId];
|
||||||
|
if (draft) {
|
||||||
|
this.text = draft.data.text;
|
||||||
|
this.files = (draft.data.files || []).filter(e => e);
|
||||||
|
if (draft.data.poll) {
|
||||||
|
this.poll = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
(this.$refs.poll as any).set(draft.data.poll);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.initialNote) {
|
||||||
|
// 削除して編集
|
||||||
|
const init = this.initialNote;
|
||||||
|
this.text = init.text ? init.text : '';
|
||||||
|
this.files = init.files;
|
||||||
|
this.cw = init.cw;
|
||||||
|
this.useCw = init.cw != null;
|
||||||
|
if (init.poll) {
|
||||||
|
this.poll = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
(this.$refs.poll as any).set({
|
||||||
|
choices: init.poll.choices.map(c => c.text),
|
||||||
|
multiple: init.poll.multiple
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// hack 位置情報投稿が動くようになったら適用する
|
||||||
|
this.geo = null;
|
||||||
|
this.visibility = init.visibility;
|
||||||
|
this.localOnly = init.localOnly;
|
||||||
|
this.quoteId = init.renote ? init.renote.id : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$nextTick(() => this.watch());
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
watch() {
|
||||||
|
this.$watch('text', () => this.saveDraft());
|
||||||
|
this.$watch('poll', () => this.saveDraft());
|
||||||
|
this.$watch('files', () => this.saveDraft());
|
||||||
|
},
|
||||||
|
|
||||||
|
trimmedLength(text: string) {
|
||||||
|
return length(text.trim());
|
||||||
|
},
|
||||||
|
|
||||||
|
addTag(tag: string) {
|
||||||
|
insertTextAtCursor(this.$refs.text, ` #${tag} `);
|
||||||
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
(this.$refs.text as any).focus();
|
||||||
|
},
|
||||||
|
|
||||||
|
chooseFile() {
|
||||||
|
(this.$refs.file as any).click();
|
||||||
|
},
|
||||||
|
|
||||||
|
chooseFileFromDrive() {
|
||||||
|
this.$chooseDriveFile({
|
||||||
|
multiple: true
|
||||||
|
}).then(files => {
|
||||||
|
for (const x of files) this.attachMedia(x);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
attachMedia(driveFile) {
|
||||||
|
this.files.push(driveFile);
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
},
|
||||||
|
|
||||||
|
detachMedia(id) {
|
||||||
|
this.files = this.files.filter(x => x.id != id);
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
},
|
||||||
|
|
||||||
|
onChangeFile() {
|
||||||
|
for (const x of Array.from((this.$refs.file as any).files)) this.upload(x);
|
||||||
|
},
|
||||||
|
|
||||||
|
upload(file: File, name?: string) {
|
||||||
|
(this.$refs.uploader as any).upload(file, this.$store.state.settings.uploadFolder, name);
|
||||||
|
},
|
||||||
|
|
||||||
|
onChangeUploadings(uploads) {
|
||||||
|
this.$emit('change-uploadings', uploads);
|
||||||
|
},
|
||||||
|
|
||||||
|
onPollUpdate() {
|
||||||
|
const got = this.$refs.poll.get();
|
||||||
|
this.pollChoices = got.choices;
|
||||||
|
this.pollMultiple = got.multiple;
|
||||||
|
this.pollExpiration = [got.expiration, got.expiresAt || got.expiredAfter];
|
||||||
|
this.saveDraft();
|
||||||
|
},
|
||||||
|
|
||||||
|
setGeo() {
|
||||||
|
if (navigator.geolocation == null) {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('@.post-form.geolocation-alert')
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
navigator.geolocation.getCurrentPosition(pos => {
|
||||||
|
this.geo = pos.coords;
|
||||||
|
this.$emit('geo-attached', this.geo);
|
||||||
|
}, err => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
title: this.$t('@.post-form.error'),
|
||||||
|
text: err.message
|
||||||
|
});
|
||||||
|
}, {
|
||||||
|
enableHighAccuracy: true
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeGeo() {
|
||||||
|
this.geo = null;
|
||||||
|
this.$emit('geo-dettached');
|
||||||
|
},
|
||||||
|
|
||||||
|
setVisibility() {
|
||||||
|
const w = this.$root.new(MkVisibilityChooser, {
|
||||||
|
source: this.$refs.visibilityButton,
|
||||||
|
currentVisibility: this.visibility
|
||||||
|
});
|
||||||
|
w.$once('chosen', v => {
|
||||||
|
this.applyVisibility(v);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
applyVisibility(v: string) {
|
||||||
|
const m = v.match(/^local-(.+)/);
|
||||||
|
if (m) {
|
||||||
|
this.localOnly = true;
|
||||||
|
this.visibility = m[1];
|
||||||
|
} else {
|
||||||
|
this.localOnly = false;
|
||||||
|
this.visibility = v;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
addVisibleUser() {
|
||||||
|
this.$root.dialog({
|
||||||
|
title: this.$t('@.post-form.enter-username'),
|
||||||
|
user: true
|
||||||
|
}).then(({ canceled, result: user }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
this.visibleUsers.push(user);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeVisibleUser(user) {
|
||||||
|
this.visibleUsers = erase(user, this.visibleUsers);
|
||||||
|
},
|
||||||
|
|
||||||
|
clear() {
|
||||||
|
this.text = '';
|
||||||
|
this.files = [];
|
||||||
|
this.poll = false;
|
||||||
|
this.quoteId = null;
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
},
|
||||||
|
|
||||||
|
onKeydown(e) {
|
||||||
|
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && this.canPost) this.post();
|
||||||
|
},
|
||||||
|
|
||||||
|
async onPaste(e: ClipboardEvent) {
|
||||||
|
for (const { item, i } of Array.from(e.clipboardData.items).map((item, i) => ({item, i}))) {
|
||||||
|
if (item.kind == 'file') {
|
||||||
|
const file = item.getAsFile();
|
||||||
|
const lio = file.name.lastIndexOf('.');
|
||||||
|
const ext = lio >= 0 ? file.name.slice(lio) : '';
|
||||||
|
const formatted = `${formatTimeString(new Date(file.lastModified), this.$store.state.settings.pastedFileName).replace(/{{number}}/g, `${i + 1}`)}${ext}`;
|
||||||
|
const name = this.$store.state.settings.pasteDialog
|
||||||
|
? await this.$root.dialog({
|
||||||
|
title: this.$t('@.post-form.enter-file-name'),
|
||||||
|
input: {
|
||||||
|
default: formatted
|
||||||
|
},
|
||||||
|
allowEmpty: false
|
||||||
|
}).then(({ canceled, result }) => canceled ? false : result)
|
||||||
|
: formatted;
|
||||||
|
if (name) this.upload(file, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const paste = e.clipboardData.getData('text');
|
||||||
|
|
||||||
|
if (!this.renote && !this.quoteId && paste.startsWith(url + '/notes/')) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'info',
|
||||||
|
text: this.$t('@.post-form.quote-question'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) {
|
||||||
|
insertTextAtCursor(this.$refs.text, paste);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.quoteId = paste.substr(url.length).match(/^\/notes\/(.+?)\/?$/)[1];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onDragover(e) {
|
||||||
|
const isFile = e.dataTransfer.items[0].kind == 'file';
|
||||||
|
const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file';
|
||||||
|
if (isFile || isDriveFile) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.draghover = true;
|
||||||
|
e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onDragenter(e) {
|
||||||
|
this.draghover = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
onDragleave(e) {
|
||||||
|
this.draghover = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
onDrop(e): void {
|
||||||
|
this.draghover = false;
|
||||||
|
|
||||||
|
// ファイルだったら
|
||||||
|
if (e.dataTransfer.files.length > 0) {
|
||||||
|
e.preventDefault();
|
||||||
|
for (const x of Array.from(e.dataTransfer.files)) this.upload(x);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region ドライブのファイル
|
||||||
|
const driveFile = e.dataTransfer.getData('mk_drive_file');
|
||||||
|
if (driveFile != null && driveFile != '') {
|
||||||
|
const file = JSON.parse(driveFile);
|
||||||
|
this.files.push(file);
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
},
|
||||||
|
|
||||||
|
async emoji() {
|
||||||
|
const Picker = await import('../../desktop/views/components/emoji-picker-dialog.vue').then(m => m.default);
|
||||||
|
const button = this.$refs.emoji;
|
||||||
|
const rect = button.getBoundingClientRect();
|
||||||
|
const vm = this.$root.new(Picker, {
|
||||||
|
x: button.offsetWidth + rect.left + window.pageXOffset,
|
||||||
|
y: rect.top + window.pageYOffset
|
||||||
|
});
|
||||||
|
vm.$once('chosen', emoji => {
|
||||||
|
insertTextAtCursor(this.$refs.text, emoji);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
saveDraft() {
|
||||||
|
if (this.instant) return;
|
||||||
|
|
||||||
|
const data = JSON.parse(localStorage.getItem('drafts') || '{}');
|
||||||
|
|
||||||
|
data[this.draftId] = {
|
||||||
|
updatedAt: new Date(),
|
||||||
|
data: {
|
||||||
|
text: this.text,
|
||||||
|
files: this.files,
|
||||||
|
poll: this.poll && this.$refs.poll ? (this.$refs.poll as any).get() : undefined
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
localStorage.setItem('drafts', JSON.stringify(data));
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteDraft() {
|
||||||
|
const data = JSON.parse(localStorage.getItem('drafts') || '{}');
|
||||||
|
|
||||||
|
delete data[this.draftId];
|
||||||
|
|
||||||
|
localStorage.setItem('drafts', JSON.stringify(data));
|
||||||
|
},
|
||||||
|
|
||||||
|
kao() {
|
||||||
|
this.text += getFace();
|
||||||
|
},
|
||||||
|
|
||||||
|
post() {
|
||||||
|
this.posting = true;
|
||||||
|
const viaMobile = opts.mobile && !this.$store.state.settings.disableViaMobile;
|
||||||
|
this.$root.api('notes/create', {
|
||||||
|
text: this.text == '' ? undefined : this.text,
|
||||||
|
fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
||||||
|
replyId: this.reply ? this.reply.id : undefined,
|
||||||
|
renoteId: this.renote ? this.renote.id : this.quoteId ? this.quoteId : undefined,
|
||||||
|
poll: this.poll ? (this.$refs.poll as any).get() : undefined,
|
||||||
|
cw: this.useCw ? this.cw || '' : undefined,
|
||||||
|
visibility: this.visibility,
|
||||||
|
visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
|
||||||
|
localOnly: this.localOnly,
|
||||||
|
geo: this.geo ? {
|
||||||
|
coordinates: [this.geo.longitude, this.geo.latitude],
|
||||||
|
altitude: this.geo.altitude,
|
||||||
|
accuracy: this.geo.accuracy,
|
||||||
|
altitudeAccuracy: this.geo.altitudeAccuracy,
|
||||||
|
heading: isNaN(this.geo.heading) ? null : this.geo.heading,
|
||||||
|
speed: this.geo.speed,
|
||||||
|
} : null,
|
||||||
|
viaMobile: viaMobile
|
||||||
|
}).then(data => {
|
||||||
|
this.clear();
|
||||||
|
this.deleteDraft();
|
||||||
|
this.$emit('posted');
|
||||||
|
if (opts.onSuccess) opts.onSuccess(this);
|
||||||
|
}).catch(err => {
|
||||||
|
if (opts.onSuccess) opts.onFailure(this);
|
||||||
|
}).then(() => {
|
||||||
|
this.posting = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.text && this.text != '') {
|
||||||
|
const hashtags = parse(this.text).filter(x => x.node.type === 'hashtag').map(x => x.node.props.hashtag);
|
||||||
|
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
||||||
|
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
21
src/client/app/common/scripts/room/furniture.ts
Normal file
21
src/client/app/common/scripts/room/furniture.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
export type RoomInfo = {
|
||||||
|
roomType: string;
|
||||||
|
carpetColor: string;
|
||||||
|
furnitures: Furniture[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Furniture = {
|
||||||
|
id: string; // 同じ家具が複数ある場合にそれぞれを識別するためのIDであり、家具IDではない
|
||||||
|
type: string; // こっちが家具ID(chairとか)
|
||||||
|
position: {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
z: number;
|
||||||
|
};
|
||||||
|
rotation: {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
z: number;
|
||||||
|
};
|
||||||
|
props?: Record<string, any>;
|
||||||
|
};
|
||||||
324
src/client/app/common/scripts/room/furnitures.json5
Normal file
324
src/client/app/common/scripts/room/furnitures.json5
Normal file
@@ -0,0 +1,324 @@
|
|||||||
|
// 家具メタデータ
|
||||||
|
|
||||||
|
// 家具にはユーザーが設定できるプロパティを設定可能です:
|
||||||
|
//
|
||||||
|
// props: {
|
||||||
|
// <propname>: <proptype>
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// proptype一覧:
|
||||||
|
// * image ... 画像選択ダイアログを出し、その画像のURLが格納されます
|
||||||
|
// * color ... 色選択コントロールを出し、選択された色が格納されます
|
||||||
|
|
||||||
|
// 家具にカスタムテクスチャを適用できるようにするには、textureプロパティに以下の追加の情報を含めます:
|
||||||
|
// 便宜上そのUVのどの部分にカスタムテクスチャを貼り合わせるかのエリアをテクスチャエリアと呼びます。
|
||||||
|
// UVは1024*1024だと仮定します。
|
||||||
|
//
|
||||||
|
// <key>: {
|
||||||
|
// prop: <プロパティ名>,
|
||||||
|
// uv: {
|
||||||
|
// x: <テクスチャエリアX座標>,
|
||||||
|
// y: <テクスチャエリアY座標>,
|
||||||
|
// width: <テクスチャエリアの幅>,
|
||||||
|
// height: <テクスチャエリアの高さ>,
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// <key>には、カスタムテクスチャを適用したいメッシュ名を指定します
|
||||||
|
// <プロパティ名>には、カスタムテクスチャとして使用する画像を格納するプロパティ(前述)名を指定します
|
||||||
|
|
||||||
|
// 家具にカスタムカラーを適用できるようにするには、colorプロパティに以下の追加の情報を含めます:
|
||||||
|
//
|
||||||
|
// <key>: <プロパティ名>
|
||||||
|
//
|
||||||
|
// <key>には、カスタムカラーを適用したいマテリアル名を指定します
|
||||||
|
// <プロパティ名>には、カスタムカラーとして使用する色を格納するプロパティ(前述)名を指定します
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
id: "milk",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "bed",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "low-table",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Table: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "desk",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Board: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "chair",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Chair: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "chair2",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color1: 'color',
|
||||||
|
color2: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Cushion: 'color1',
|
||||||
|
Leg: 'color2'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "fan",
|
||||||
|
place: "wall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pc",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "plant",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "plant2",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "eraser",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pencil",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pudding",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cardboard-box",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cardboard-box2",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cardboard-box3",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "book",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Cover: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "book2",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "piano",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "facial-tissue",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "server",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "moon",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "corkboard",
|
||||||
|
place: "wall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "mousepad",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Pad: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "monitor",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
screen: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Screen: {
|
||||||
|
prop: 'screen',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 434,
|
||||||
|
width: 1024,
|
||||||
|
height: 588,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "tv",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
screen: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Screen: {
|
||||||
|
prop: 'screen',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 434,
|
||||||
|
width: 1024,
|
||||||
|
height: 588,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "keyboard",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "carpet-stripe",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color1: 'color',
|
||||||
|
color2: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
CarpetAreaA: 'color1',
|
||||||
|
CarpetAreaB: 'color2'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "mat",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Mat: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "color-box",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
main: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "wall-clock",
|
||||||
|
place: "wall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cube",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Cube: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "photoframe",
|
||||||
|
place: "wall",
|
||||||
|
props: {
|
||||||
|
photo: 'image',
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Photo: {
|
||||||
|
prop: 'photo',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 342,
|
||||||
|
width: 1024,
|
||||||
|
height: 683,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Frame: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pinguin",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "rubik-cube",
|
||||||
|
place: "floor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "poster-h",
|
||||||
|
place: "wall",
|
||||||
|
props: {
|
||||||
|
picture: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Poster: {
|
||||||
|
prop: 'picture',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 277,
|
||||||
|
width: 1024,
|
||||||
|
height: 745,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "poster-v",
|
||||||
|
place: "wall",
|
||||||
|
props: {
|
||||||
|
picture: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Poster: {
|
||||||
|
prop: 'picture',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width: 745,
|
||||||
|
height: 1024,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
695
src/client/app/common/scripts/room/room.ts
Normal file
695
src/client/app/common/scripts/room/room.ts
Normal file
@@ -0,0 +1,695 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import * as THREE from 'three';
|
||||||
|
import { GLTFLoader, GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
|
||||||
|
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
|
||||||
|
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
|
||||||
|
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
|
||||||
|
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';
|
||||||
|
import { BloomPass } from 'three/examples/jsm/postprocessing/BloomPass.js';
|
||||||
|
import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js';
|
||||||
|
import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';
|
||||||
|
import { Furniture, RoomInfo } from './furniture';
|
||||||
|
import { v4 as uuid } from 'uuid';
|
||||||
|
const furnitureDefs = require('./furnitures.json5');
|
||||||
|
|
||||||
|
THREE.ImageUtils.crossOrigin = '';
|
||||||
|
|
||||||
|
type Options = {
|
||||||
|
graphicsQuality: Room['graphicsQuality'];
|
||||||
|
onChangeSelect: Room['onChangeSelect'];
|
||||||
|
useOrthographicCamera: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export class Room {
|
||||||
|
private clock: THREE.Clock;
|
||||||
|
private scene: THREE.Scene;
|
||||||
|
private renderer: THREE.WebGLRenderer;
|
||||||
|
private camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;
|
||||||
|
private controls: OrbitControls;
|
||||||
|
private composer: EffectComposer;
|
||||||
|
private mixers: THREE.AnimationMixer[] = [];
|
||||||
|
private furnitureControl: TransformControls;
|
||||||
|
private roomInfo: RoomInfo;
|
||||||
|
private graphicsQuality: 'cheep' | 'low' | 'medium' | 'high' | 'ultra';
|
||||||
|
private roomObj: THREE.Object3D;
|
||||||
|
private objects: THREE.Object3D[] = [];
|
||||||
|
private selectedObject: THREE.Object3D = null;
|
||||||
|
private onChangeSelect: Function;
|
||||||
|
private isTransformMode = false;
|
||||||
|
public canvas: HTMLCanvasElement;
|
||||||
|
|
||||||
|
private get furnitures(): Furniture[] {
|
||||||
|
return this.roomInfo.furnitures;
|
||||||
|
}
|
||||||
|
|
||||||
|
private set furnitures(furnitures: Furniture[]) {
|
||||||
|
this.roomInfo.furnitures = furnitures;
|
||||||
|
}
|
||||||
|
|
||||||
|
private get enableShadow() {
|
||||||
|
return this.graphicsQuality != 'cheep';
|
||||||
|
}
|
||||||
|
|
||||||
|
private get usePostFXs() {
|
||||||
|
return this.graphicsQuality !== 'cheep' && this.graphicsQuality !== 'low';
|
||||||
|
}
|
||||||
|
|
||||||
|
private get shadowQuality() {
|
||||||
|
return (
|
||||||
|
this.graphicsQuality === 'ultra' ? 16384 :
|
||||||
|
this.graphicsQuality === 'high' ? 8192 :
|
||||||
|
this.graphicsQuality === 'medium' ? 4096 :
|
||||||
|
this.graphicsQuality === 'low' ? 1024 :
|
||||||
|
0); // cheep
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(user, isMyRoom, roomInfo: RoomInfo, container, options: Options) {
|
||||||
|
this.roomInfo = roomInfo;
|
||||||
|
this.graphicsQuality = options.graphicsQuality;
|
||||||
|
this.onChangeSelect = options.onChangeSelect;
|
||||||
|
|
||||||
|
this.clock = new THREE.Clock(true);
|
||||||
|
|
||||||
|
//#region Init a scene
|
||||||
|
this.scene = new THREE.Scene();
|
||||||
|
|
||||||
|
const width = window.innerWidth;
|
||||||
|
const height = window.innerHeight;
|
||||||
|
|
||||||
|
//#region Init a renderer
|
||||||
|
this.renderer = new THREE.WebGLRenderer({
|
||||||
|
antialias: false,
|
||||||
|
stencil: false,
|
||||||
|
alpha: false,
|
||||||
|
powerPreference:
|
||||||
|
this.graphicsQuality === 'ultra' ? 'high-performance' :
|
||||||
|
this.graphicsQuality === 'high' ? 'high-performance' :
|
||||||
|
this.graphicsQuality === 'medium' ? 'default' :
|
||||||
|
this.graphicsQuality === 'low' ? 'low-power' :
|
||||||
|
'low-power' // cheep
|
||||||
|
});
|
||||||
|
|
||||||
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
||||||
|
this.renderer.setSize(width, height);
|
||||||
|
this.renderer.autoClear = false;
|
||||||
|
this.renderer.setClearColor(new THREE.Color(0x051f2d));
|
||||||
|
this.renderer.shadowMap.enabled = this.enableShadow;
|
||||||
|
this.renderer.gammaOutput = true;
|
||||||
|
this.renderer.shadowMap.type =
|
||||||
|
this.graphicsQuality === 'ultra' ? THREE.PCFSoftShadowMap :
|
||||||
|
this.graphicsQuality === 'high' ? THREE.PCFSoftShadowMap :
|
||||||
|
this.graphicsQuality === 'medium' ? THREE.PCFShadowMap :
|
||||||
|
this.graphicsQuality === 'low' ? THREE.BasicShadowMap :
|
||||||
|
THREE.BasicShadowMap; // cheep
|
||||||
|
|
||||||
|
this.canvas = this.renderer.domElement;
|
||||||
|
container.appendChild(this.renderer.domElement);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Init a camera
|
||||||
|
this.camera = options.useOrthographicCamera
|
||||||
|
? new THREE.OrthographicCamera(
|
||||||
|
width / - 2, width / 2, height / 2, height / - 2, -10, 10)
|
||||||
|
: new THREE.PerspectiveCamera(45, width / height);
|
||||||
|
|
||||||
|
if (options.useOrthographicCamera) {
|
||||||
|
this.camera.position.x = 2;
|
||||||
|
this.camera.position.y = 2;
|
||||||
|
this.camera.position.z = 2;
|
||||||
|
this.camera.zoom = 100;
|
||||||
|
this.camera.updateProjectionMatrix();
|
||||||
|
} else {
|
||||||
|
this.camera.position.x = 5;
|
||||||
|
this.camera.position.y = 2;
|
||||||
|
this.camera.position.z = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.add(this.camera);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region AmbientLight
|
||||||
|
const ambientLight = new THREE.AmbientLight(0xffffff, 1);
|
||||||
|
this.scene.add(ambientLight);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
if (this.graphicsQuality !== 'cheep') {
|
||||||
|
//#region Room light
|
||||||
|
const roomLight = new THREE.SpotLight(0xffffff, 0.1);
|
||||||
|
|
||||||
|
roomLight.position.set(0, 8, 0);
|
||||||
|
roomLight.castShadow = this.enableShadow;
|
||||||
|
roomLight.shadow.bias = -0.0001;
|
||||||
|
roomLight.shadow.mapSize.width = this.shadowQuality;
|
||||||
|
roomLight.shadow.mapSize.height = this.shadowQuality;
|
||||||
|
roomLight.shadow.camera.near = 0.1;
|
||||||
|
roomLight.shadow.camera.far = 9;
|
||||||
|
roomLight.shadow.camera.fov = 45;
|
||||||
|
|
||||||
|
this.scene.add(roomLight);
|
||||||
|
//#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region Out light
|
||||||
|
const outLight = new THREE.SpotLight(0xffffff, 0.4);
|
||||||
|
|
||||||
|
outLight.position.set(9, 3, -2);
|
||||||
|
outLight.castShadow = this.enableShadow;
|
||||||
|
outLight.shadow.bias = -0.001; // アクネ、アーチファクト対策 その代わりピーターパンが発生する可能性がある
|
||||||
|
outLight.shadow.mapSize.width = this.shadowQuality;
|
||||||
|
outLight.shadow.mapSize.height = this.shadowQuality;
|
||||||
|
outLight.shadow.camera.near = 6;
|
||||||
|
outLight.shadow.camera.far = 15;
|
||||||
|
outLight.shadow.camera.fov = 45;
|
||||||
|
|
||||||
|
this.scene.add(outLight);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Init a controller
|
||||||
|
this.controls = new OrbitControls(this.camera, this.renderer.domElement);
|
||||||
|
|
||||||
|
this.controls.target.set(0, 1, 0);
|
||||||
|
this.controls.enableZoom = true;
|
||||||
|
this.controls.enablePan = isMyRoom;
|
||||||
|
this.controls.minPolarAngle = 0;
|
||||||
|
this.controls.maxPolarAngle = Math.PI / 2;
|
||||||
|
this.controls.minAzimuthAngle = 0;
|
||||||
|
this.controls.maxAzimuthAngle = Math.PI / 2;
|
||||||
|
this.controls.enableDamping = true;
|
||||||
|
this.controls.dampingFactor = 0.2;
|
||||||
|
this.controls.mouseButtons.LEFT = 1;
|
||||||
|
this.controls.mouseButtons.MIDDLE = 2;
|
||||||
|
this.controls.mouseButtons.RIGHT = 0;
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region POST FXs
|
||||||
|
if (!this.usePostFXs) {
|
||||||
|
this.composer = null;
|
||||||
|
} else {
|
||||||
|
const renderTarget = new THREE.WebGLRenderTarget(width, height, {
|
||||||
|
minFilter: THREE.LinearFilter,
|
||||||
|
magFilter: THREE.LinearFilter,
|
||||||
|
format: THREE.RGBFormat,
|
||||||
|
stencilBuffer: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const fxaa = new ShaderPass(FXAAShader);
|
||||||
|
fxaa.uniforms['resolution'].value = new THREE.Vector2(1 / width, 1 / height);
|
||||||
|
fxaa.renderToScreen = true;
|
||||||
|
|
||||||
|
this.composer = new EffectComposer(this.renderer, renderTarget);
|
||||||
|
this.composer.addPass(new RenderPass(this.scene, this.camera));
|
||||||
|
if (this.graphicsQuality === 'ultra') {
|
||||||
|
this.composer.addPass(new BloomPass(0.25, 30, 128.0, 512));
|
||||||
|
}
|
||||||
|
this.composer.addPass(fxaa);
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Label
|
||||||
|
//#region Avatar
|
||||||
|
const avatarUrl = user.avatarUrl;
|
||||||
|
|
||||||
|
const textureLoader = new THREE.TextureLoader();
|
||||||
|
textureLoader.crossOrigin = 'anonymous';
|
||||||
|
|
||||||
|
const iconTexture = textureLoader.load(avatarUrl);
|
||||||
|
iconTexture.wrapS = THREE.RepeatWrapping;
|
||||||
|
iconTexture.wrapT = THREE.RepeatWrapping;
|
||||||
|
iconTexture.anisotropy = 16;
|
||||||
|
|
||||||
|
const avatarMaterial = new THREE.MeshLambertMaterial({
|
||||||
|
emissive: 0x111111,
|
||||||
|
map: iconTexture,
|
||||||
|
side: THREE.DoubleSide,
|
||||||
|
alphaTest: 0.5
|
||||||
|
});
|
||||||
|
|
||||||
|
const iconGeometry = new THREE.PlaneGeometry(1, 1);
|
||||||
|
|
||||||
|
const avatarObject = new THREE.Mesh(iconGeometry, avatarMaterial);
|
||||||
|
avatarObject.position.set(-3, 2.5, 2);
|
||||||
|
avatarObject.rotation.y = Math.PI / 2;
|
||||||
|
avatarObject.castShadow = false;
|
||||||
|
|
||||||
|
this.scene.add(avatarObject);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Username
|
||||||
|
const name = user.username;
|
||||||
|
|
||||||
|
new THREE.FontLoader().load('/assets/fonts/helvetiker_regular.typeface.json', font => {
|
||||||
|
const nameGeometry = new THREE.TextGeometry(name, {
|
||||||
|
size: 0.5,
|
||||||
|
height: 0,
|
||||||
|
curveSegments: 8,
|
||||||
|
font: font,
|
||||||
|
bevelThickness: 0,
|
||||||
|
bevelSize: 0,
|
||||||
|
bevelEnabled: false
|
||||||
|
});
|
||||||
|
|
||||||
|
const nameMaterial = new THREE.MeshLambertMaterial({
|
||||||
|
color: 0xffffff
|
||||||
|
});
|
||||||
|
|
||||||
|
const nameObject = new THREE.Mesh(nameGeometry, nameMaterial);
|
||||||
|
nameObject.position.set(-3, 2.25, 1.25);
|
||||||
|
nameObject.rotation.y = Math.PI / 2;
|
||||||
|
nameObject.castShadow = false;
|
||||||
|
|
||||||
|
this.scene.add(nameObject);
|
||||||
|
});
|
||||||
|
//#endregion
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Interaction
|
||||||
|
if (isMyRoom) {
|
||||||
|
this.furnitureControl = new TransformControls(this.camera, this.renderer.domElement);
|
||||||
|
this.scene.add(this.furnitureControl);
|
||||||
|
|
||||||
|
// Hover highlight
|
||||||
|
this.renderer.domElement.onmousemove = this.onmousemove;
|
||||||
|
|
||||||
|
// Click
|
||||||
|
this.renderer.domElement.onmousedown = this.onmousedown;
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Init room
|
||||||
|
this.loadRoom();
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Load furnitures
|
||||||
|
for (const furniture of this.furnitures) {
|
||||||
|
this.loadFurniture(furniture).then(obj => {
|
||||||
|
this.scene.add(obj.scene);
|
||||||
|
this.objects.push(obj.scene);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
// Start render
|
||||||
|
if (this.usePostFXs) {
|
||||||
|
this.renderWithPostFXs();
|
||||||
|
} else {
|
||||||
|
this.renderWithoutPostFXs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private renderWithoutPostFXs() {
|
||||||
|
requestAnimationFrame(this.renderWithoutPostFXs);
|
||||||
|
|
||||||
|
// Update animations
|
||||||
|
const clock = this.clock.getDelta();
|
||||||
|
for (const mixer of this.mixers) {
|
||||||
|
mixer.update(clock);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.controls.update();
|
||||||
|
this.renderer.render(this.scene, this.camera);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private renderWithPostFXs() {
|
||||||
|
requestAnimationFrame(this.renderWithPostFXs);
|
||||||
|
|
||||||
|
// Update animations
|
||||||
|
const clock = this.clock.getDelta();
|
||||||
|
for (const mixer of this.mixers) {
|
||||||
|
mixer.update(clock);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.controls.update();
|
||||||
|
this.renderer.clear();
|
||||||
|
this.composer.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private loadRoom() {
|
||||||
|
new GLTFLoader().load(`/assets/room/rooms/${this.roomInfo.roomType}/${this.roomInfo.roomType}.glb`, gltf => {
|
||||||
|
gltf.scene.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
|
||||||
|
child.receiveShadow = this.enableShadow;
|
||||||
|
|
||||||
|
child.material = new THREE.MeshLambertMaterial({
|
||||||
|
color: (child.material as THREE.MeshStandardMaterial).color,
|
||||||
|
map: (child.material as THREE.MeshStandardMaterial).map,
|
||||||
|
name: (child.material as THREE.MeshStandardMaterial).name,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 異方性フィルタリング
|
||||||
|
if ((child.material as THREE.MeshLambertMaterial).map && this.graphicsQuality !== 'cheep') {
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.minFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.magFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.anisotropy = 8;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
gltf.scene.position.set(0, 0, 0);
|
||||||
|
|
||||||
|
this.scene.add(gltf.scene);
|
||||||
|
this.roomObj = gltf.scene;
|
||||||
|
if (this.roomInfo.roomType === 'default') {
|
||||||
|
this.applyCarpetColor();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private loadFurniture(furniture: Furniture) {
|
||||||
|
const def = furnitureDefs.find(d => d.id === furniture.type);
|
||||||
|
return new Promise<GLTF>((res, rej) => {
|
||||||
|
const loader = new GLTFLoader();
|
||||||
|
loader.load(`/assets/room/furnitures/${furniture.type}/${furniture.type}.glb`, gltf => {
|
||||||
|
const model = gltf.scene;
|
||||||
|
|
||||||
|
// Load animation
|
||||||
|
if (gltf.animations.length > 0) {
|
||||||
|
const mixer = new THREE.AnimationMixer(model);
|
||||||
|
this.mixers.push(mixer);
|
||||||
|
for (const clip of gltf.animations) {
|
||||||
|
mixer.clipAction(clip).play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
model.name = furniture.id;
|
||||||
|
model.position.x = furniture.position.x;
|
||||||
|
model.position.y = furniture.position.y;
|
||||||
|
model.position.z = furniture.position.z;
|
||||||
|
model.rotation.x = furniture.rotation.x;
|
||||||
|
model.rotation.y = furniture.rotation.y;
|
||||||
|
model.rotation.z = furniture.rotation.z;
|
||||||
|
|
||||||
|
model.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
child.castShadow = this.enableShadow;
|
||||||
|
child.receiveShadow = this.enableShadow;
|
||||||
|
child.material = new THREE.MeshLambertMaterial({
|
||||||
|
color: (child.material as THREE.MeshStandardMaterial).color,
|
||||||
|
map: (child.material as THREE.MeshStandardMaterial).map,
|
||||||
|
name: (child.material as THREE.MeshStandardMaterial).name,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 異方性フィルタリング
|
||||||
|
if ((child.material as THREE.MeshLambertMaterial).map && this.graphicsQuality !== 'cheep') {
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.minFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.magFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.anisotropy = 8;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (def.color) { // カスタムカラー
|
||||||
|
this.applyCustomColor(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (def.texture) { // カスタムテクスチャ
|
||||||
|
this.applyCustomTexture(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
res(gltf);
|
||||||
|
}, null, rej);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private applyCarpetColor() {
|
||||||
|
this.roomObj.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
if (child.material && (child.material as THREE.MeshStandardMaterial).name && (child.material as THREE.MeshStandardMaterial).name === 'Carpet') {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).color.setHex(parseInt(this.roomInfo.carpetColor.substr(1), 16));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public applyCustomColor(model: THREE.Object3D) {
|
||||||
|
const furniture = this.furnitures.find(furniture => furniture.id === model.name);
|
||||||
|
const def = furnitureDefs.find(d => d.id === furniture.type);
|
||||||
|
if (def.color == null) return;
|
||||||
|
model.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
for (const t of Object.keys(def.color)) {
|
||||||
|
if (!child.material || !(child.material as THREE.MeshStandardMaterial).name || (child.material as THREE.MeshStandardMaterial).name !== t) continue;
|
||||||
|
|
||||||
|
const prop = def.color[t];
|
||||||
|
const val = furniture.props ? furniture.props[prop] : undefined;
|
||||||
|
|
||||||
|
if (val == null) continue;
|
||||||
|
|
||||||
|
(child.material as THREE.MeshStandardMaterial).color.setHex(parseInt(val.substr(1), 16));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public applyCustomTexture(model: THREE.Object3D) {
|
||||||
|
const furniture = this.furnitures.find(furniture => furniture.id === model.name);
|
||||||
|
const def = furnitureDefs.find(d => d.id === furniture.type);
|
||||||
|
if (def.texture == null) return;
|
||||||
|
model.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
for (const t of Object.keys(def.texture)) {
|
||||||
|
if (child.name !== t) continue;
|
||||||
|
|
||||||
|
const prop = def.texture[t].prop;
|
||||||
|
const val = furniture.props ? furniture.props[prop] : undefined;
|
||||||
|
|
||||||
|
if (val == null) continue;
|
||||||
|
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.height = 1024;
|
||||||
|
canvas.width = 1024;
|
||||||
|
|
||||||
|
child.material = new THREE.MeshLambertMaterial({
|
||||||
|
emissive: 0x111111,
|
||||||
|
side: THREE.DoubleSide,
|
||||||
|
alphaTest: 0.5,
|
||||||
|
});
|
||||||
|
|
||||||
|
const img = new Image();
|
||||||
|
img.crossOrigin = 'anonymous';
|
||||||
|
img.onload = () => {
|
||||||
|
const uvInfo = def.texture[t].uv;
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
ctx.drawImage(img, 0, 0, img.width, img.height, uvInfo.x, uvInfo.y, uvInfo.width, uvInfo.height);
|
||||||
|
|
||||||
|
const texture = new THREE.Texture(canvas);
|
||||||
|
texture.wrapS = THREE.RepeatWrapping;
|
||||||
|
texture.wrapT = THREE.RepeatWrapping;
|
||||||
|
texture.anisotropy = 16;
|
||||||
|
texture.flipY = false;
|
||||||
|
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map = texture;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).needsUpdate = true;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.needsUpdate = true;
|
||||||
|
};
|
||||||
|
img.src = val;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private onmousemove(ev: MouseEvent) {
|
||||||
|
if (this.isTransformMode) return;
|
||||||
|
|
||||||
|
const rect = (ev.target as HTMLElement).getBoundingClientRect();
|
||||||
|
const x = (((ev.clientX * window.devicePixelRatio) - rect.left) / this.renderer.domElement.width) * 2 - 1;
|
||||||
|
const y = -(((ev.clientY * window.devicePixelRatio) - rect.top) / this.renderer.domElement.height) * 2 + 1;
|
||||||
|
const pos = new THREE.Vector2(x, y);
|
||||||
|
|
||||||
|
this.camera.updateMatrixWorld();
|
||||||
|
|
||||||
|
const raycaster = new THREE.Raycaster();
|
||||||
|
raycaster.setFromCamera(pos, this.camera);
|
||||||
|
|
||||||
|
const intersects = raycaster.intersectObjects(this.objects, true);
|
||||||
|
|
||||||
|
for (const object of this.objects) {
|
||||||
|
if (this.isSelectedObject(object)) continue;
|
||||||
|
object.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x000000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intersects.length > 0) {
|
||||||
|
const intersected = this.getRoot(intersects[0].object);
|
||||||
|
if (!this.isSelectedObject(intersected)) {
|
||||||
|
intersected.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x191919);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private onmousedown(ev: MouseEvent) {
|
||||||
|
if (this.isTransformMode) return;
|
||||||
|
if (ev.target !== this.renderer.domElement || ev.button !== 0) return;
|
||||||
|
|
||||||
|
const rect = (ev.target as HTMLElement).getBoundingClientRect();
|
||||||
|
const x = (((ev.clientX * window.devicePixelRatio) - rect.left) / this.renderer.domElement.width) * 2 - 1;
|
||||||
|
const y = -(((ev.clientY * window.devicePixelRatio) - rect.top) / this.renderer.domElement.height) * 2 + 1;
|
||||||
|
const pos = new THREE.Vector2(x, y);
|
||||||
|
|
||||||
|
this.camera.updateMatrixWorld();
|
||||||
|
|
||||||
|
const raycaster = new THREE.Raycaster();
|
||||||
|
raycaster.setFromCamera(pos, this.camera);
|
||||||
|
|
||||||
|
const intersects = raycaster.intersectObjects(this.objects, true);
|
||||||
|
|
||||||
|
for (const object of this.objects) {
|
||||||
|
object.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x000000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intersects.length > 0) {
|
||||||
|
const selectedObj = this.getRoot(intersects[0].object);
|
||||||
|
this.selectFurniture(selectedObj);
|
||||||
|
} else {
|
||||||
|
this.selectedObject = null;
|
||||||
|
this.onChangeSelect(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private getRoot(obj: THREE.Object3D): THREE.Object3D {
|
||||||
|
let found = false;
|
||||||
|
let x = obj.parent;
|
||||||
|
while (!found) {
|
||||||
|
if (x.parent.parent == null) {
|
||||||
|
found = true;
|
||||||
|
} else {
|
||||||
|
x = x.parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private isSelectedObject(obj: THREE.Object3D): boolean {
|
||||||
|
if (this.selectedObject == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return obj.name === this.selectedObject.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private selectFurniture(obj: THREE.Object3D) {
|
||||||
|
this.selectedObject = obj;
|
||||||
|
this.onChangeSelect(obj);
|
||||||
|
obj.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0xff0000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public enterTransformMode(type: 'translate' | 'rotate') {
|
||||||
|
this.isTransformMode = true;
|
||||||
|
this.furnitureControl.setMode(type);
|
||||||
|
this.furnitureControl.attach(this.selectedObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public exitTransformMode() {
|
||||||
|
this.isTransformMode = false;
|
||||||
|
this.furnitureControl.detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public updateProp(key: string, value: any) {
|
||||||
|
const furniture = this.furnitures.find(furniture => furniture.id === this.selectedObject.name);
|
||||||
|
if (furniture.props == null) furniture.props = {};
|
||||||
|
furniture.props[key] = value;
|
||||||
|
this.applyCustomColor(this.selectedObject);
|
||||||
|
this.applyCustomTexture(this.selectedObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public addFurniture(type: string) {
|
||||||
|
const furniture = {
|
||||||
|
id: uuid(),
|
||||||
|
type: type,
|
||||||
|
position: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: 0,
|
||||||
|
},
|
||||||
|
rotation: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
this.furnitures.push(furniture);
|
||||||
|
|
||||||
|
this.loadFurniture(furniture).then(obj => {
|
||||||
|
this.scene.add(obj.scene);
|
||||||
|
this.objects.push(obj.scene);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public removeFurniture() {
|
||||||
|
this.exitTransformMode();
|
||||||
|
const obj = this.selectedObject;
|
||||||
|
this.scene.remove(obj);
|
||||||
|
this.objects = this.objects.filter(object => object.name !== obj.name);
|
||||||
|
this.furnitures = this.furnitures.filter(furniture => furniture.id !== obj.name);
|
||||||
|
this.selectedObject = null;
|
||||||
|
this.onChangeSelect(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public updateCarpetColor(color: string) {
|
||||||
|
this.roomInfo.carpetColor = color;
|
||||||
|
this.applyCarpetColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public changeRoomType(type: string) {
|
||||||
|
this.roomInfo.roomType = type;
|
||||||
|
this.scene.remove(this.roomObj);
|
||||||
|
this.loadRoom();
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public getRoomInfo() {
|
||||||
|
for (const obj of this.objects) {
|
||||||
|
const furniture = this.furnitures.find(f => f.id === obj.name);
|
||||||
|
furniture.position.x = obj.position.x;
|
||||||
|
furniture.position.y = obj.position.y;
|
||||||
|
furniture.position.z = obj.position.z;
|
||||||
|
furniture.rotation.x = obj.rotation.x;
|
||||||
|
furniture.rotation.y = obj.rotation.y;
|
||||||
|
furniture.rotation.z = obj.rotation.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.roomInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public getSelectedObject() {
|
||||||
|
return this.selectedObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public findFurnitureById(id: string) {
|
||||||
|
return this.furnitures.find(furniture => furniture.id === id);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,9 +11,9 @@ export default function(me, settings, note) {
|
|||||||
return (
|
return (
|
||||||
(!isMyNote && note.reply && includesMutedWords(note.reply.text)) ||
|
(!isMyNote && note.reply && includesMutedWords(note.reply.text)) ||
|
||||||
(!isMyNote && note.renote && includesMutedWords(note.renote.text)) ||
|
(!isMyNote && note.renote && includesMutedWords(note.renote.text)) ||
|
||||||
(settings.showMyRenotes === false && isMyNote && isPureRenote) ||
|
(!settings.showMyRenotes && isMyNote && isPureRenote) ||
|
||||||
(settings.showRenotedMyNotes === false && isPureRenote && note.renote.userId == me.id) ||
|
(!settings.showRenotedMyNotes && isPureRenote && note.renote.userId == me.id) ||
|
||||||
(settings.showLocalRenotes === false && isPureRenote && note.renote.user.host == null) ||
|
(!settings.showLocalRenotes && isPureRenote && note.renote.user.host == null) ||
|
||||||
(!isMyNote && includesMutedWords(note.text))
|
(!isMyNote && includesMutedWords(note.text))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export default class Stream extends EventEmitter {
|
|||||||
|
|
||||||
const user = os.store.state.i;
|
const user = os.store.state.i;
|
||||||
|
|
||||||
this.stream = new ReconnectingWebsocket(wsUrl + (user ? `?i=${user.token}` : ''));
|
this.stream = new ReconnectingWebsocket(wsUrl + (user ? `?i=${user.token}` : ''), '', { minReconnectionDelay: 1 }); // https://github.com/pladaria/reconnecting-websocket/issues/91
|
||||||
this.stream.addEventListener('open', this.onOpen);
|
this.stream.addEventListener('open', this.onOpen);
|
||||||
this.stream.addEventListener('close', this.onClose);
|
this.stream.addEventListener('close', this.onClose);
|
||||||
this.stream.addEventListener('message', this.onMessage);
|
this.stream.addEventListener('message', this.onMessage);
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ export default Vue.extend({
|
|||||||
columnWidth: '80%'
|
columnWidth: '80%'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
grid: {
|
grid: {
|
||||||
clipMarkers: false,
|
clipMarkers: false,
|
||||||
padding: {
|
padding: {
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
ms(): number {
|
ms(): number {
|
||||||
return this.now.getMilliseconds() * this.smooth;
|
return this.now.getMilliseconds() * this.smooth;
|
||||||
}
|
},
|
||||||
s(): number {
|
s(): number {
|
||||||
return this.now.getSeconds();
|
return this.now.getSeconds();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
</ol>
|
</ol>
|
||||||
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
||||||
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
||||||
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
||||||
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
||||||
@@ -31,6 +31,7 @@ import Vue from 'vue';
|
|||||||
import * as emojilib from 'emojilib';
|
import * as emojilib from 'emojilib';
|
||||||
import contains from '../../../common/scripts/contains';
|
import contains from '../../../common/scripts/contains';
|
||||||
import { twemojiBase } from '../../../../../misc/twemoji-base';
|
import { twemojiBase } from '../../../../../misc/twemoji-base';
|
||||||
|
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
||||||
|
|
||||||
type EmojiDef = {
|
type EmojiDef = {
|
||||||
emoji: string;
|
emoji: string;
|
||||||
@@ -78,6 +79,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
getStaticImageUrl,
|
||||||
fetching: true,
|
fetching: true,
|
||||||
users: [],
|
users: [],
|
||||||
hashtags: [],
|
hashtags: [],
|
||||||
|
|||||||
27
src/client/app/common/views/components/avatars.vue
Normal file
27
src/client/app/common/views/components/avatars.vue
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<mk-avatar v-for="user in us" :user="user" :key="user.id" style="width:32px;height:32px;"/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
userIds: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
us: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
async created() {
|
||||||
|
this.us = await this.$root.api('users/show', {
|
||||||
|
userIds: this.userIds
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
<fa icon="spinner" pulse v-if="type === 'waiting'"/>
|
<fa icon="spinner" pulse v-if="type === 'waiting'"/>
|
||||||
</div>
|
</div>
|
||||||
<header v-if="title" v-html="title"></header>
|
<header v-if="title" v-html="title"></header>
|
||||||
|
<header v-if="title == null && user">{{ $t('@.enter-username') }}</header>
|
||||||
<div class="body" v-if="text" v-html="text"></div>
|
<div class="body" v-if="text" v-html="text"></div>
|
||||||
<ui-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></ui-input>
|
<ui-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></ui-input>
|
||||||
<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></ui-input>
|
<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></ui-input>
|
||||||
@@ -32,7 +33,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash && (showOkButton || showCancelButton)">
|
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash && (showOkButton || showCancelButton)">
|
||||||
<ui-button @click="ok" v-if="showOkButton" primary :autofocus="!input && !select && !user">{{ (showCancelButton || input || select || user) ? $t('@.ok') : $t('@.got-it') }}</ui-button>
|
<ui-button @click="ok" v-if="showOkButton" primary :autofocus="!input && !select && !user" :disabled="!canOk">{{ (showCancelButton || input || select || user) ? $t('@.ok') : $t('@.got-it') }}</ui-button>
|
||||||
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">{{ $t('@.cancel') }}</ui-button>
|
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">{{ $t('@.cancel') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</template>
|
</template>
|
||||||
@@ -97,12 +98,27 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
inputValue: this.input && this.input.default ? this.input.default : null,
|
inputValue: this.input && this.input.default ? this.input.default : null,
|
||||||
userInputValue: null,
|
userInputValue: null,
|
||||||
selectedValue: null,
|
selectedValue: this.select ? this.select.default ? this.select.default : this.select.items ? this.select.items[0].value : this.select.groupedItems[0].items[0].value : null,
|
||||||
|
canOk: true,
|
||||||
faTimesCircle, faQuestionCircle
|
faTimesCircle, faQuestionCircle
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
userInputValue() {
|
||||||
|
if (this.user) {
|
||||||
|
this.$root.api('users/show', parseAcct(this.userInputValue)).then(u => {
|
||||||
|
this.canOk = u != null;
|
||||||
|
}).catch(() => {
|
||||||
|
this.canOk = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
if (this.user) this.canOk = false;
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
(this.$refs.bg as any).style.pointerEvents = 'auto';
|
(this.$refs.bg as any).style.pointerEvents = 'auto';
|
||||||
anime({
|
anime({
|
||||||
@@ -130,6 +146,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
async ok() {
|
async ok() {
|
||||||
|
if (!this.canOk) return;
|
||||||
if (!this.showOkButton) return;
|
if (!this.showOkButton) return;
|
||||||
|
|
||||||
if (this.user) {
|
if (this.user) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user