Compare commits
834 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a29d7a0475 | ||
|
|
d5408c429b | ||
|
|
501b07c383 | ||
|
|
9dd21a19ff | ||
|
|
a8d05cba5a | ||
|
|
f5ddfb29f2 | ||
|
|
ba228a6b10 | ||
|
|
cb6f390fb6 | ||
|
|
5675ecead9 | ||
|
|
001bb7bbcd | ||
|
|
1585bb12cf | ||
|
|
26b47c18fd | ||
|
|
665fa7f2aa | ||
|
|
0068dc30d3 | ||
|
|
8f39655fef | ||
|
|
b1a4fc03bc | ||
|
|
05d20f1044 | ||
|
|
66a90b3fb1 | ||
|
|
826d9d9fdf | ||
|
|
4a9a61f108 | ||
|
|
b72d15b56c | ||
|
|
8c68992594 | ||
|
|
c052028fc3 | ||
|
|
c46fbcf345 | ||
|
|
06b66f0209 | ||
|
|
2de48110bb | ||
|
|
87d4452d19 | ||
|
|
328fc64ca9 | ||
|
|
a6f8327aa2 | ||
|
|
d5ab6b41c9 | ||
|
|
ffdd0b7de7 | ||
|
|
1808eb6eee | ||
|
|
438563b505 | ||
|
|
92dfcdad57 | ||
|
|
c178cfabfa | ||
|
|
260e4c955d | ||
|
|
0c46f5ce70 | ||
|
|
6d67cd07a0 | ||
|
|
fb8af53751 | ||
|
|
37999f4af7 | ||
|
|
3b6ab327c1 | ||
|
|
d3ff3a7d54 | ||
|
|
cf36106520 | ||
|
|
1642fbec31 | ||
|
|
b195fd8145 | ||
|
|
5f59b980a7 | ||
|
|
2a5c19cd01 | ||
|
|
42e007ddb7 | ||
|
|
756dc397d9 | ||
|
|
8f714b5b12 | ||
|
|
06bb2a1c7c | ||
|
|
ac50bb9225 | ||
|
|
8fd95de25b | ||
|
|
0e14b2eba4 | ||
|
|
08413a7550 | ||
|
|
5e0f2a5b06 | ||
|
|
3b505709c6 | ||
|
|
af32d1f81e | ||
|
|
67d8773e38 | ||
|
|
e445d39c2f | ||
|
|
961ed969db | ||
|
|
e9a3495225 | ||
|
|
6c5a78aeb2 | ||
|
|
34e249317a | ||
|
|
6d8ea89f09 | ||
|
|
64f89ba13e | ||
|
|
f6b2f76bbf | ||
|
|
1235bef038 | ||
|
|
2e11f3a843 | ||
|
|
84b7e0bb7d | ||
|
|
9f5dc2c0df | ||
|
|
e640dbc501 | ||
|
|
85db090d9f | ||
|
|
9f2d8e1d51 | ||
|
|
0c98a90b75 | ||
|
|
0047920c1a | ||
|
|
e4bb534f20 | ||
|
|
3fc04fcdc5 | ||
|
|
e542dcac30 | ||
|
|
a0b13505a0 | ||
|
|
389f9bfea2 | ||
|
|
630a534cee | ||
|
|
5744c391e6 | ||
|
|
b9b05a7401 | ||
|
|
359470a263 | ||
|
|
3fe934ee62 | ||
|
|
3abe632f06 | ||
|
|
65961bc15b | ||
|
|
12f932d48a | ||
|
|
54e9147782 | ||
|
|
31b7626d01 | ||
|
|
200ebefe92 | ||
|
|
9d29a2e85a | ||
|
|
c62a225542 | ||
|
|
d5d995a3e6 | ||
|
|
b7f10fdc10 | ||
|
|
cbba03b376 | ||
|
|
f84e9c7dc8 | ||
|
|
a22ddb1fb9 | ||
|
|
0d23ce3d45 | ||
|
|
9719387bee | ||
|
|
dca110ebaa | ||
|
|
136f23c7ad | ||
|
|
0963e6d6e1 | ||
|
|
712802e682 | ||
|
|
abe99c3c73 | ||
|
|
d7a3b71028 | ||
|
|
10c434f24a | ||
|
|
fe46c53ea6 | ||
|
|
cdd123dfd3 | ||
|
|
a1a3ee44b5 | ||
|
|
4e7fbd8967 | ||
|
|
a86c419f95 | ||
|
|
e3ec0ad97e | ||
|
|
75791981ce | ||
|
|
e813fe16b9 | ||
|
|
42ac7b954d | ||
|
|
c1bbf5dab6 | ||
|
|
e16dc2a910 | ||
|
|
e236c05d79 | ||
|
|
454c1e3faf | ||
|
|
43daf814df | ||
|
|
c40b630530 | ||
|
|
7fc0698ecf | ||
|
|
4f3c8b940e | ||
|
|
1855ab60f1 | ||
|
|
af4f1a7bd6 | ||
|
|
8646a9c49c | ||
|
|
8d7c033cf5 | ||
|
|
b8900e32de | ||
|
|
d48c25d2c9 | ||
|
|
a87c5899c5 | ||
|
|
147ad69864 | ||
|
|
c146006476 | ||
|
|
a0f10d7ca1 | ||
|
|
299b91edc4 | ||
|
|
95c89ca6db | ||
|
|
7fe0d71e7f | ||
|
|
fbbb506e86 | ||
|
|
ec80b06a45 | ||
|
|
41e1619f1f | ||
|
|
ba6a9c6a93 | ||
|
|
18571c52fb | ||
|
|
5d5dfeaa83 | ||
|
|
3669d8c0f3 | ||
|
|
69d72819c6 | ||
|
|
54dcc10250 | ||
|
|
1edfce8f73 | ||
|
|
675e573a8c | ||
|
|
1080fa63a9 | ||
|
|
8047086988 | ||
|
|
449b9f7fa0 | ||
|
|
b7a15bf6ca | ||
|
|
7c3873887d | ||
|
|
247ea4cf12 | ||
|
|
0b7af5c669 | ||
|
|
2b62a4e2e5 | ||
|
|
65bfa3c0d6 | ||
|
|
84db15694d | ||
|
|
746189ba37 | ||
|
|
74e845b3ac | ||
|
|
90fe70540e | ||
|
|
f28af75191 | ||
|
|
924bb2bc70 | ||
|
|
19d60f3d51 | ||
|
|
6903476868 | ||
|
|
cf0dccc209 | ||
|
|
cfd959129d | ||
|
|
819287951c | ||
|
|
e136193925 | ||
|
|
8c631864d9 | ||
|
|
d7d0f6ae2e | ||
|
|
b83b3fb9d1 | ||
|
|
dfce5bc0af | ||
|
|
3487ddabea | ||
|
|
2dbff75e7a | ||
|
|
02465ded9f | ||
|
|
ffcd387945 | ||
|
|
4806346707 | ||
|
|
31c3f6abf7 | ||
|
|
83e47fdd60 | ||
|
|
340ce7fa4c | ||
|
|
ac86fee9b4 | ||
|
|
6dfa283d7a | ||
|
|
0cce8a4d21 | ||
|
|
1c6d9ab2ef | ||
|
|
6ca265e579 | ||
|
|
c612c4bf18 | ||
|
|
481a791a60 | ||
|
|
cb516c2943 | ||
|
|
c0abd6f0c0 | ||
|
|
47695ed685 | ||
|
|
4ca8020ef5 | ||
|
|
bfac83d5b8 | ||
|
|
4cd2e55fd3 | ||
|
|
61c7e7bc48 | ||
|
|
bef41718e2 | ||
|
|
5b4b52bb97 | ||
|
|
8901b6d774 | ||
|
|
e3a24e9215 | ||
|
|
a515c1f53e | ||
|
|
2e22874dec | ||
|
|
30f0b1c30d | ||
|
|
600aea4dbb | ||
|
|
f5d53d784d | ||
|
|
1061e1f7ae | ||
|
|
1d5fc04aa6 | ||
|
|
d1cf0c7998 | ||
|
|
84218abf2b | ||
|
|
5bebdb2511 | ||
|
|
9c8e9b4165 | ||
|
|
7b786bfde3 | ||
|
|
42a08642a4 | ||
|
|
e88f7ca7b2 | ||
|
|
c26ed1421b | ||
|
|
ed2f94a3c1 | ||
|
|
daba7fe87c | ||
|
|
afc9caf7bf | ||
|
|
67697a7aa6 | ||
|
|
1623d9e70c | ||
|
|
c304351335 | ||
|
|
c1520763c6 | ||
|
|
4853bc9414 | ||
|
|
e7c865f8e3 | ||
|
|
46cb377bc2 | ||
|
|
373a5ba3e1 | ||
|
|
3bedef67c8 | ||
|
|
17ea19ada8 | ||
|
|
1f5b2285fd | ||
|
|
17f0001966 | ||
|
|
04ba09a6af | ||
|
|
70d2744319 | ||
|
|
6b2f0929ec | ||
|
|
f2629bd3f2 | ||
|
|
9e6c29c3c0 | ||
|
|
abda973094 | ||
|
|
86b08dd5bd | ||
|
|
617e331f0f | ||
|
|
cc438a9372 | ||
|
|
b0fb218bfd | ||
|
|
fc85a607e6 | ||
|
|
fb244c45e3 | ||
|
|
c123784c54 | ||
|
|
342a5276fc | ||
|
|
51a32846ee | ||
|
|
35865429a8 | ||
|
|
aadd5b95b8 | ||
|
|
f9f2ca51ac | ||
|
|
1cb93a8c10 | ||
|
|
7e5dbb2ba5 | ||
|
|
2772e3d80e | ||
|
|
223c578734 | ||
|
|
d01315dee2 | ||
|
|
7dafb4ce4c | ||
|
|
9671db9b14 | ||
|
|
bec559f67c | ||
|
|
14053c1394 | ||
|
|
55e4b1c828 | ||
|
|
dda3421159 | ||
|
|
45e7488e60 | ||
|
|
30c7bd66b7 | ||
|
|
af4f5bdac0 | ||
|
|
3d1a8cc341 | ||
|
|
0e52fb2544 | ||
|
|
e6d6c0a17c | ||
|
|
cfd2d47e00 | ||
|
|
83301a879d | ||
|
|
d7881ba129 | ||
|
|
b9fef1edf7 | ||
|
|
2c606f7b23 | ||
|
|
03797607ed | ||
|
|
254b7f500d | ||
|
|
51edd51bf2 | ||
|
|
0d403f4a3f | ||
|
|
0fa134addd | ||
|
|
7002270084 | ||
|
|
1c5452d047 | ||
|
|
f0d62c07bf | ||
|
|
496ca55bba | ||
|
|
79cfba226b | ||
|
|
f69b60dffe | ||
|
|
513385133f | ||
|
|
6f1e2f6636 | ||
|
|
8ae94c034d | ||
|
|
cd9696f25e | ||
|
|
d62a6bab41 | ||
|
|
20df002746 | ||
|
|
fa6b01546e | ||
|
|
91b37a6e52 | ||
|
|
d8171d7c8b | ||
|
|
fa96e2daf1 | ||
|
|
87708c3b84 | ||
|
|
6319023cc9 | ||
|
|
efad9d1b60 | ||
|
|
a1dea657fa | ||
|
|
6b1b75717b | ||
|
|
efe08e0bd3 | ||
|
|
62892c4894 | ||
|
|
0c2a62da11 | ||
|
|
5bc9e9aadd | ||
|
|
112c33d35b | ||
|
|
864da3030f | ||
|
|
f2e719b361 | ||
|
|
6aab515389 | ||
|
|
819b535ab0 | ||
|
|
60e95ac2ac | ||
|
|
9b94ddff0a | ||
|
|
174f8022eb | ||
|
|
ddc3c5ba68 | ||
|
|
a7e6b766be | ||
|
|
befc35a3ac | ||
|
|
2e9bbf389e | ||
|
|
80b5fda292 | ||
|
|
c48cbd95f6 | ||
|
|
931bdc6aac | ||
|
|
7f81506c8b | ||
|
|
b4b9e76c8d | ||
|
|
e5a3dcf868 | ||
|
|
825648535c | ||
|
|
5cbc908ba3 | ||
|
|
895cf53ee1 | ||
|
|
e41f74e77c | ||
|
|
c21caad1c5 | ||
|
|
86fcd3a378 | ||
|
|
2b3687b3cb | ||
|
|
5d61c7c691 | ||
|
|
1bb266e7c7 | ||
|
|
1fca8d322c | ||
|
|
325cd03a59 | ||
|
|
2f7e6baa05 | ||
|
|
d252e066fe | ||
|
|
fe7bd9ab3c | ||
|
|
84e3f41305 | ||
|
|
3e8cccad0d | ||
|
|
a2b94d67f7 | ||
|
|
6ab61e73b0 | ||
|
|
051c6973af | ||
|
|
806a49ec3d | ||
|
|
3829fe128a | ||
|
|
649177985d | ||
|
|
c15148b23c | ||
|
|
261a3f5d91 | ||
|
|
256ba78ba5 | ||
|
|
04aff8866e | ||
|
|
1a51b98700 | ||
|
|
f64100226d | ||
|
|
b7805e48a6 | ||
|
|
0d9556620d | ||
|
|
a51828a7a2 | ||
|
|
7e2009f408 | ||
|
|
008d950a39 | ||
|
|
22d5862afb | ||
|
|
de569147a5 | ||
|
|
a82c3db750 | ||
|
|
80706d10af | ||
|
|
93f01ed4df | ||
|
|
a3a28e5557 | ||
|
|
8948a0d3a4 | ||
|
|
d849ea9b41 | ||
|
|
0144575f3f | ||
|
|
bdbe646ca7 | ||
|
|
1a1483a242 | ||
|
|
962346785b | ||
|
|
a73da3cd70 | ||
|
|
9c27d0ae3f | ||
|
|
525d5218c1 | ||
|
|
e23b13ec7f | ||
|
|
29b000e03c | ||
|
|
6a7b0df810 | ||
|
|
4142de9195 | ||
|
|
9195e1be00 | ||
|
|
75382d13fd | ||
|
|
d444280a28 | ||
|
|
52fc0fe04a | ||
|
|
216bebadf1 | ||
|
|
a5592931cb | ||
|
|
a2228417ff | ||
|
|
3e1e292c3e | ||
|
|
f2f039ae9e | ||
|
|
29dde1eda0 | ||
|
|
45d3792ce0 | ||
|
|
875d0aaebb | ||
|
|
26c9d8ff6f | ||
|
|
5e3372e932 | ||
|
|
f7069dcd18 | ||
|
|
560bb65384 | ||
|
|
50cd6a036e | ||
|
|
441ab2b5f8 | ||
|
|
ba5ed188a1 | ||
|
|
72e672f08d | ||
|
|
120474ec6a | ||
|
|
eee57c47f5 | ||
|
|
4c160869b8 | ||
|
|
3720a7fbe0 | ||
|
|
7afa541a53 | ||
|
|
6f979c8275 | ||
|
|
d399241e65 | ||
|
|
e85dec030a | ||
|
|
d0220764cc | ||
|
|
75c1df9531 | ||
|
|
bca7156d6b | ||
|
|
64277b7157 | ||
|
|
4a72543f65 | ||
|
|
5b84d29807 | ||
|
|
a11061ec2b | ||
|
|
24cfb93b2e | ||
|
|
502b42d63a | ||
|
|
612672b79c | ||
|
|
abc670e1b1 | ||
|
|
d589ccdd01 | ||
|
|
acb07d9f7d | ||
|
|
f4d2186719 | ||
|
|
d0ede5c665 | ||
|
|
554cbb5e9b | ||
|
|
dbd32a56bf | ||
|
|
7f500235c6 | ||
|
|
39a58084c8 | ||
|
|
cde0fde836 | ||
|
|
e70cca0fda | ||
|
|
919bd7eb82 | ||
|
|
312cff3d6f | ||
|
|
0d86eef3d7 | ||
|
|
13acf570e7 | ||
|
|
fa17623fa8 | ||
|
|
06fd525950 | ||
|
|
4805b5115a | ||
|
|
108dcb3e61 | ||
|
|
780d272535 | ||
|
|
02ea4b81a5 | ||
|
|
7c1bdc6d36 | ||
|
|
78c7b8b836 | ||
|
|
227da30acb | ||
|
|
610805026f | ||
|
|
c02399c3d2 | ||
|
|
e0799d4153 | ||
|
|
6df83f1aa9 | ||
|
|
efb5ad1d9b | ||
|
|
716976f016 | ||
|
|
7892f41b84 | ||
|
|
d549e03b3f | ||
|
|
c511ef21ff | ||
|
|
d64dc45899 | ||
|
|
bcb0588409 | ||
|
|
0975959eb9 | ||
|
|
e985a6d9d3 | ||
|
|
b893305974 | ||
|
|
724fdd44e4 | ||
|
|
b480ef669c | ||
|
|
4b145da046 | ||
|
|
83d168ece3 | ||
|
|
ae44fe7818 | ||
|
|
f8981b3acb | ||
|
|
050b324885 | ||
|
|
e74c0df6c6 | ||
|
|
22d0d11895 | ||
|
|
80d0c0cf74 | ||
|
|
518646b925 | ||
|
|
479d7e0087 | ||
|
|
8ea1a555f4 | ||
|
|
04024dc37c | ||
|
|
060ff9288f | ||
|
|
197116ee78 | ||
|
|
a1e0015257 | ||
|
|
7e701ef9e0 | ||
|
|
3d6fb661bb | ||
|
|
fc372496da | ||
|
|
ad7258fe9c | ||
|
|
bd707cb2a8 | ||
|
|
1839b5f205 | ||
|
|
02b47f963c | ||
|
|
f8a7f9378a | ||
|
|
65cb253be4 | ||
|
|
a12356b24b | ||
|
|
6a67ad7f93 | ||
|
|
140a7f0b1c | ||
|
|
00159bc6b5 | ||
|
|
9542260103 | ||
|
|
72074578df | ||
|
|
3b4750a988 | ||
|
|
aeec5f0163 | ||
|
|
9c94d8c8d6 | ||
|
|
581712a2c8 | ||
|
|
b25b51aaca | ||
|
|
fb97e13a61 | ||
|
|
36e154fdb2 | ||
|
|
ca273a24b4 | ||
|
|
d828bf2889 | ||
|
|
87efccef18 | ||
|
|
e0bf522e7f | ||
|
|
5b1cd3bd3c | ||
|
|
f00489196d | ||
|
|
dd53bf7e51 | ||
|
|
35a6da26d2 | ||
|
|
c8c8748a0b | ||
|
|
46d0065a90 | ||
|
|
990b0180a8 | ||
|
|
f3bfb72251 | ||
|
|
0358a7edc6 | ||
|
|
37f99fca04 | ||
|
|
50dfc8ab82 | ||
|
|
c70c739b0c | ||
|
|
5918285326 | ||
|
|
b1dead1186 | ||
|
|
3e36e132c3 | ||
|
|
fa8d1809e7 | ||
|
|
e12b668d04 | ||
|
|
e5506f7d8c | ||
|
|
b1ac7e5cb3 | ||
|
|
ffd164a5f3 | ||
|
|
cb27414026 | ||
|
|
e320912f33 | ||
|
|
d23aaae698 | ||
|
|
120c0fe848 | ||
|
|
34857b9520 | ||
|
|
a87dcece4c | ||
|
|
01e2479004 | ||
|
|
0fd63fe091 | ||
|
|
cc98801c67 | ||
|
|
2724d74108 | ||
|
|
6d0c0d3a5f | ||
|
|
15f8f63317 | ||
|
|
d970d65968 | ||
|
|
04d359691b | ||
|
|
bfc519944a | ||
|
|
9f69fd14a2 | ||
|
|
85058787b2 | ||
|
|
ec851623e0 | ||
|
|
e05429a3ec | ||
|
|
f651c41816 | ||
|
|
6b88d99ae2 | ||
|
|
814469cdca | ||
|
|
536bf8f141 | ||
|
|
6a27290815 | ||
|
|
7dde3465e2 | ||
|
|
0206a4ac83 | ||
|
|
380f5a972c | ||
|
|
407467a236 | ||
|
|
bcfa9e18bf | ||
|
|
69b730e91a | ||
|
|
6c6c003d68 | ||
|
|
fd652b70d6 | ||
|
|
804a5ab6a8 | ||
|
|
d984a1aa19 | ||
|
|
e05b5a6ab8 | ||
|
|
3ff84db421 | ||
|
|
74ca73ecb4 | ||
|
|
37032f68ae | ||
|
|
21d3605737 | ||
|
|
0a7c1caf43 | ||
|
|
24b57335fa | ||
|
|
9f981d875a | ||
|
|
6dcc3800e0 | ||
|
|
44e9be5a1c | ||
|
|
6a8c560d21 | ||
|
|
0afe8c6b34 | ||
|
|
0f5d7f52a0 | ||
|
|
aaaefa0ee2 | ||
|
|
276929bc7e | ||
|
|
32882f1397 | ||
|
|
7dc380c485 | ||
|
|
49aaa9a5d3 | ||
|
|
84462eb3f2 | ||
|
|
91709ca979 | ||
|
|
9ece71e652 | ||
|
|
4e93f6c6ff | ||
|
|
ad9f1fb7c7 | ||
|
|
abaeea6d8b | ||
|
|
8efbcc4c6b | ||
|
|
8ef31cab8c | ||
|
|
37ae53e55c | ||
|
|
d01f06bdf4 | ||
|
|
0d4a8d118a | ||
|
|
7e6ec83b1f | ||
|
|
9eb515cfae | ||
|
|
d0da019a21 | ||
|
|
57a13c9ad3 | ||
|
|
7f39100634 | ||
|
|
9ab96ef39a | ||
|
|
ed21d797a6 | ||
|
|
15960746bb | ||
|
|
e0f1e3ca71 | ||
|
|
51d0524182 | ||
|
|
16801aa5c4 | ||
|
|
cd23f66834 | ||
|
|
cc5d2b2875 | ||
|
|
94ef03db9e | ||
|
|
038bd100b2 | ||
|
|
3b5c3f086a | ||
|
|
a136715111 | ||
|
|
daa22d68fa | ||
|
|
f24d202024 | ||
|
|
d3e0b8574b | ||
|
|
f4482cc34a | ||
|
|
3ff226cd6b | ||
|
|
5c0d37d021 | ||
|
|
b958959cca | ||
|
|
762418d0fa | ||
|
|
6831f0c192 | ||
|
|
64635fff2d | ||
|
|
e7e861fb5c | ||
|
|
08523ce271 | ||
|
|
833f63c1a9 | ||
|
|
1c05825bc8 | ||
|
|
26bb088a3d | ||
|
|
5c361cef23 | ||
|
|
04bef96aee | ||
|
|
a791981da9 | ||
|
|
264c47e07a | ||
|
|
863c44d15c | ||
|
|
cdec6f202e | ||
|
|
bdf6c739a9 | ||
|
|
843dd5fb58 | ||
|
|
c05853289a | ||
|
|
11c5d257f2 | ||
|
|
cee1a27348 | ||
|
|
690dc75e45 | ||
|
|
8dc82b7a6e | ||
|
|
a396b519bb | ||
|
|
d5f9ce0893 | ||
|
|
c1d7ae99ab | ||
|
|
d8aee7c310 | ||
|
|
3e43d847ca | ||
|
|
70273931b2 | ||
|
|
cc94d2acc5 | ||
|
|
327d9702ca | ||
|
|
1cdb285fe6 | ||
|
|
e9e61e3034 | ||
|
|
b613a51035 | ||
|
|
63e62ecb02 | ||
|
|
d11122af3f | ||
|
|
e8ddb7f6ee | ||
|
|
5ad0a158bc | ||
|
|
e3ea29a8b6 | ||
|
|
ead201ac3d | ||
|
|
19af2d7a7b | ||
|
|
8ba87443ca | ||
|
|
162ace2fd6 | ||
|
|
f51fdc0dbf | ||
|
|
d3d612a89b | ||
|
|
7c7f32d9a6 | ||
|
|
c8b6b6e44f | ||
|
|
12daa80071 | ||
|
|
2f8cc36d4b | ||
|
|
1af4f94338 | ||
|
|
172a0a85aa | ||
|
|
d37c06884d | ||
|
|
80e52c57e1 | ||
|
|
213a7f137e | ||
|
|
4848b71ca0 | ||
|
|
13bad106cc | ||
|
|
3bebf82501 | ||
|
|
e9a8090d7e | ||
|
|
e2a79abbe0 | ||
|
|
d7f57a4415 | ||
|
|
9dd5ed7f1a | ||
|
|
432e18a0c0 | ||
|
|
9a2d435cb1 | ||
|
|
b02274c178 | ||
|
|
91408bceb1 | ||
|
|
e1fd7e3f0c | ||
|
|
d18498cb6b | ||
|
|
b3986b8963 | ||
|
|
75e3d6f7fb | ||
|
|
ded78aa294 | ||
|
|
58e8938364 | ||
|
|
6e8e6c7352 | ||
|
|
270de03646 | ||
|
|
b6c7ff109b | ||
|
|
9b72a5a46d | ||
|
|
626e06c5fd | ||
|
|
b09d10ac52 | ||
|
|
d1568cda19 | ||
|
|
3400b4fa0d | ||
|
|
4455f110b1 | ||
|
|
25fc37449b | ||
|
|
e5ffc7c492 | ||
|
|
5c118e6d8a | ||
|
|
b49c70e67e | ||
|
|
3760fdeed0 | ||
|
|
3aece449e4 | ||
|
|
dcd2d8be77 | ||
|
|
b90e6f9abb | ||
|
|
d984652aa1 | ||
|
|
f176de6d2e | ||
|
|
ef31efabb2 | ||
|
|
53763acb76 | ||
|
|
6f39010133 | ||
|
|
04b5fe6af4 | ||
|
|
626f43f424 | ||
|
|
bebcc72deb | ||
|
|
9f285779ec | ||
|
|
57d3e9fc32 | ||
|
|
84cf09c1d0 | ||
|
|
0848bad960 | ||
|
|
c1b13c3b5b | ||
|
|
8abc4ed65a | ||
|
|
0eebe620cb | ||
|
|
62a0d87795 | ||
|
|
8318633749 | ||
|
|
a453f8aa2e | ||
|
|
54d2b90c25 | ||
|
|
7e1865984d | ||
|
|
a2c56cc112 | ||
|
|
5c0ee8ca48 | ||
|
|
7397b2b82b | ||
|
|
ddcbe21ce6 | ||
|
|
8fc7d1377d | ||
|
|
092403f362 | ||
|
|
bb179922b9 | ||
|
|
c29f912461 | ||
|
|
83d3e1cfe6 | ||
|
|
2914f0f65d | ||
|
|
99aa588ae7 | ||
|
|
0085e1f3ab | ||
|
|
53a9eb13f8 | ||
|
|
b8c56c4dda | ||
|
|
59266b3190 | ||
|
|
0dc94547f5 | ||
|
|
29fc6de330 | ||
|
|
e24d0c40cd | ||
|
|
e95845777a | ||
|
|
167648f61c | ||
|
|
9e6d6ff0dd | ||
|
|
e659cc3d58 | ||
|
|
ff6d45571a | ||
|
|
6cc9a2c945 | ||
|
|
a873401bd7 | ||
|
|
6b19745241 | ||
|
|
982fae80aa | ||
|
|
77b15a3535 | ||
|
|
72754ede4e | ||
|
|
b8ed8336e0 | ||
|
|
13f82856f9 | ||
|
|
a62013f54d | ||
|
|
4c180869c6 | ||
|
|
7bbf022978 | ||
|
|
6b0d48423d | ||
|
|
a617b8dbed | ||
|
|
c57f472caf | ||
|
|
e1ba19fd7e | ||
|
|
1bf8cbeb29 | ||
|
|
f13faf2243 | ||
|
|
6cccd9d288 | ||
|
|
be2cde106b | ||
|
|
17263fb459 | ||
|
|
fed04ef5ae | ||
|
|
969b6dbcad | ||
|
|
aa50d0ee11 | ||
|
|
f09999ad5a | ||
|
|
35814faf8a | ||
|
|
8447a7fafa | ||
|
|
c6e6c5e3ce | ||
|
|
85cbd8dd47 | ||
|
|
bebc9003a3 | ||
|
|
3c081fbd65 | ||
|
|
fdcf874306 | ||
|
|
6cbb741fa1 | ||
|
|
24129c1cb9 | ||
|
|
f0938c36f5 | ||
|
|
484a6eda2e | ||
|
|
3f2ebffbe7 | ||
|
|
ff278a7d8f | ||
|
|
844a3c3aff | ||
|
|
0db48993e9 | ||
|
|
81e21c4314 | ||
|
|
ba0e57396d | ||
|
|
6a728d160a | ||
|
|
180e507bc8 | ||
|
|
f3b7611ded | ||
|
|
c344de5546 | ||
|
|
0bd0aa2bf7 | ||
|
|
c786cbb3a1 | ||
|
|
cd856f653d | ||
|
|
d528c09da6 | ||
|
|
76b7ad006d | ||
|
|
ff33e405a3 | ||
|
|
f74de26d63 | ||
|
|
2c823798d8 | ||
|
|
381e261bbb | ||
|
|
ba9bb5db6c | ||
|
|
cd12bb33a5 | ||
|
|
e333aee232 | ||
|
|
54571f60c3 | ||
|
|
dd743aaeac | ||
|
|
22c76dc9f8 | ||
|
|
7c7e09cf64 | ||
|
|
e5e3d69371 | ||
|
|
82a700b24e | ||
|
|
0579425a4f | ||
|
|
218e74569d | ||
|
|
448f54cf84 | ||
|
|
c139e13049 | ||
|
|
65116fef32 | ||
|
|
a0a35b7dca | ||
|
|
11fb8a24b7 | ||
|
|
512336685c | ||
|
|
484f281c19 | ||
|
|
2169bc5d3e | ||
|
|
c653c84ad2 | ||
|
|
050f75aa60 | ||
|
|
dae3f3552a | ||
|
|
8b09b170d6 | ||
|
|
ec88f2ed8a | ||
|
|
607d8502ff | ||
|
|
2f084d7c15 | ||
|
|
5bf6e7d8f9 | ||
|
|
31cb9fbfaf | ||
|
|
c7c48f3bea | ||
|
|
6732d22e6c | ||
|
|
04c6b7fe31 | ||
|
|
2687879dbd | ||
|
|
20a660fa89 | ||
|
|
ba9781e1a8 | ||
|
|
f65ac74914 | ||
|
|
6c33d9aeed | ||
|
|
68e86ad40d | ||
|
|
0aa4aa49a7 | ||
|
|
0ff3846e49 | ||
|
|
bfb81299c3 | ||
|
|
0362a8e73c | ||
|
|
9182ebfc19 | ||
|
|
25c0cf5848 | ||
|
|
a160dc0a4d | ||
|
|
28f1ca9c17 | ||
|
|
6399a0f046 | ||
|
|
639413608b | ||
|
|
c14e4c7d22 | ||
|
|
c74ac64237 | ||
|
|
4b3289ed99 | ||
|
|
0c432b39dc | ||
|
|
c4b9276713 | ||
|
|
df300c0663 | ||
|
|
518114cbbd | ||
|
|
999f0e4d58 |
143
.circleci/config.yml
Normal file
143
.circleci/config.yml
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
version: 2.1
|
||||||
|
|
||||||
|
general:
|
||||||
|
branches:
|
||||||
|
ignore:
|
||||||
|
- l10n_develop
|
||||||
|
- imgbot
|
||||||
|
|
||||||
|
executors:
|
||||||
|
default:
|
||||||
|
working_directory: /tmp/workspace
|
||||||
|
docker:
|
||||||
|
- image: misskey/ci:latest
|
||||||
|
- image: circleci/mongo:latest
|
||||||
|
- image: circleci/redis:latest
|
||||||
|
docker:
|
||||||
|
working_directory: /tmp/workspace
|
||||||
|
docker:
|
||||||
|
- image: docker:latest
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
executor: default
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- run:
|
||||||
|
name: Ensure package-lock.json
|
||||||
|
command: |
|
||||||
|
[ ! -e package-lock.json ] && echo '{}' > package-lock.json
|
||||||
|
- restore_cache:
|
||||||
|
name: Restore npm package caches
|
||||||
|
keys:
|
||||||
|
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-
|
||||||
|
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
|
||||||
|
- npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
|
||||||
|
- npm-v1-arch-{{ arch }}-
|
||||||
|
- npm-v1-
|
||||||
|
- run:
|
||||||
|
name: Install Dependencies
|
||||||
|
command: |
|
||||||
|
npm install
|
||||||
|
npm prune
|
||||||
|
- run:
|
||||||
|
name: Configure
|
||||||
|
command: |
|
||||||
|
cp .circleci/misskey/default.yml .config
|
||||||
|
cp .circleci/misskey/test.yml .config
|
||||||
|
- run:
|
||||||
|
name: Build
|
||||||
|
command: |
|
||||||
|
npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)
|
||||||
|
ls -1ARl node_modules > ls
|
||||||
|
- save_cache:
|
||||||
|
name: Cache npm packages
|
||||||
|
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
||||||
|
paths:
|
||||||
|
- node_modules
|
||||||
|
# - store_artifacts:
|
||||||
|
# path: built
|
||||||
|
- persist_to_workspace:
|
||||||
|
root: .
|
||||||
|
paths:
|
||||||
|
- .
|
||||||
|
test:
|
||||||
|
parameters:
|
||||||
|
without_redis:
|
||||||
|
type: string
|
||||||
|
default: ""
|
||||||
|
executor: default
|
||||||
|
steps:
|
||||||
|
- attach_workspace:
|
||||||
|
at: /tmp/workspace
|
||||||
|
- when:
|
||||||
|
condition: <<parameters.without_redis>>
|
||||||
|
steps:
|
||||||
|
- run:
|
||||||
|
name: Configure
|
||||||
|
command: |
|
||||||
|
mv .config/test.yml .config/test_redis.yml
|
||||||
|
touch .config/test.yml
|
||||||
|
cat .config/test_redis.yml | while IFS= read line; do if [[ "$line" = '# __REDIS__' ]]; then break; else echo "$line" >> .config/test.yml; fi; done
|
||||||
|
- run:
|
||||||
|
name: Test
|
||||||
|
command: |
|
||||||
|
npm run test || (npm rebuild && npm run test) || ((node-gyp configure && node-gyp build && npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)) && npm run test)
|
||||||
|
ls -1ARl node_modules > ls
|
||||||
|
- save_cache:
|
||||||
|
name: Cache npm packages
|
||||||
|
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
||||||
|
paths:
|
||||||
|
- node_modules
|
||||||
|
|
||||||
|
docker:
|
||||||
|
parameters:
|
||||||
|
with_deploy:
|
||||||
|
type: string
|
||||||
|
default: ""
|
||||||
|
executor: docker
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- setup_remote_docker
|
||||||
|
- run:
|
||||||
|
name: Build
|
||||||
|
command: |
|
||||||
|
docker build -t misskey/misskey .
|
||||||
|
- when:
|
||||||
|
condition: <<parameters.with_deploy>>
|
||||||
|
steps:
|
||||||
|
- run:
|
||||||
|
name: Deploy
|
||||||
|
command: |
|
||||||
|
if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ]
|
||||||
|
then
|
||||||
|
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
||||||
|
docker push misskey/misskey
|
||||||
|
else
|
||||||
|
echo -e '\033[0;33mAborted deploying to Docker Hub\033[0;39m'
|
||||||
|
fi
|
||||||
|
|
||||||
|
workflows:
|
||||||
|
version: 2
|
||||||
|
build-and-test:
|
||||||
|
jobs:
|
||||||
|
- build
|
||||||
|
- test:
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
|
- test:
|
||||||
|
without_redis: "true"
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
|
# - docker:
|
||||||
|
# filters:
|
||||||
|
# branches:
|
||||||
|
# ignore: master
|
||||||
|
- docker:
|
||||||
|
with_deploy: "true"
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
@@ -1,6 +1,3 @@
|
|||||||
maintainer:
|
|
||||||
name: syuilo
|
|
||||||
url: 'https://syuilo.com'
|
|
||||||
url: 'http://misskey.local'
|
url: 'http://misskey.local'
|
||||||
port: 80
|
port: 80
|
||||||
mongodb:
|
mongodb:
|
||||||
@@ -13,7 +10,3 @@ redis:
|
|||||||
host: localhost
|
host: localhost
|
||||||
port: 6379
|
port: 6379
|
||||||
pass: ''
|
pass: ''
|
||||||
elasticsearch:
|
|
||||||
host: localhost
|
|
||||||
port: 9200
|
|
||||||
pass: ''
|
|
||||||
@@ -1,6 +1,3 @@
|
|||||||
maintainer:
|
|
||||||
name: syuilo
|
|
||||||
url: 'https://syuilo.com'
|
|
||||||
url: 'http://misskey.local'
|
url: 'http://misskey.local'
|
||||||
port: 80
|
port: 80
|
||||||
mongodb:
|
mongodb:
|
||||||
@@ -9,11 +6,8 @@ mongodb:
|
|||||||
db: test-misskey
|
db: test-misskey
|
||||||
user: admin
|
user: admin
|
||||||
pass: ''
|
pass: ''
|
||||||
|
# __REDIS__
|
||||||
redis:
|
redis:
|
||||||
host: localhost
|
host: localhost
|
||||||
port: 6379
|
port: 6379
|
||||||
pass: ''
|
pass: ''
|
||||||
elasticsearch:
|
|
||||||
host: localhost
|
|
||||||
port: 9200
|
|
||||||
pass: ''
|
|
||||||
@@ -1,13 +1,3 @@
|
|||||||
name: example-instance-name # Name of your instance
|
|
||||||
description: example-description # Description of your instance
|
|
||||||
|
|
||||||
maintainer:
|
|
||||||
name: example-maitainer-name # Your name
|
|
||||||
url: http://example.com/ # Your contact (http or mailto)
|
|
||||||
repository_url: https://github.com/syuilo/misskey # Repository URL
|
|
||||||
feedback_url: https://github.com/syuilo/misskey/issues # Feedback URL (e.g. github issue)
|
|
||||||
|
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
# Final accessible URL seen by a user.
|
||||||
url: https://example.tld/
|
url: https://example.tld/
|
||||||
|
|
||||||
@@ -25,7 +15,7 @@ url: https://example.tld/
|
|||||||
# +------+ |+-------------+ +----------------+|
|
# +------+ |+-------------+ +----------------+|
|
||||||
# +---------------------------------------+
|
# +---------------------------------------+
|
||||||
#
|
#
|
||||||
# You need to setup reverse proxy. (eg. Nginx)
|
# You need to setup reverse proxy. (eg. nginx)
|
||||||
# You do not define 'https' section.
|
# You do not define 'https' section.
|
||||||
|
|
||||||
# Option 2: Standalone
|
# Option 2: Standalone
|
||||||
@@ -60,21 +50,6 @@ mongodb:
|
|||||||
user: example-misskey-user
|
user: example-misskey-user
|
||||||
pass: example-misskey-pass
|
pass: example-misskey-pass
|
||||||
|
|
||||||
# Drive capacity of a local user (MB)
|
|
||||||
localDriveCapacityMb: 256
|
|
||||||
|
|
||||||
# Drive capacity of a remote user (MB)
|
|
||||||
remoteDriveCapacityMb: 8
|
|
||||||
|
|
||||||
# If enabled:
|
|
||||||
# Server will not cache remote files (Using direct link instead).
|
|
||||||
# You can save your storage.
|
|
||||||
#
|
|
||||||
# NOTE:
|
|
||||||
# * Users cannot see remote images when they turn off "Show media from a remote server" setting.
|
|
||||||
# * Since thumbnails are not provided, traffic increases.
|
|
||||||
preventCacheRemoteFiles: false
|
|
||||||
|
|
||||||
drive:
|
drive:
|
||||||
storage: 'db'
|
storage: 'db'
|
||||||
|
|
||||||
@@ -113,6 +88,10 @@ drive:
|
|||||||
# accessKey: XXX
|
# accessKey: XXX
|
||||||
# secretKey: YYY
|
# secretKey: YYY
|
||||||
|
|
||||||
|
# If enabled:
|
||||||
|
# The first account created is automatically marked as Admin.
|
||||||
|
autoAdmin: true
|
||||||
|
|
||||||
#
|
#
|
||||||
# Below settings are optional
|
# Below settings are optional
|
||||||
#
|
#
|
||||||
@@ -129,11 +108,6 @@ drive:
|
|||||||
# port: 9200
|
# port: 9200
|
||||||
# pass: null
|
# pass: null
|
||||||
|
|
||||||
# reCAPTCHA
|
|
||||||
#recaptcha:
|
|
||||||
# site_key: example-site-key
|
|
||||||
# secret_key: example-secret-key
|
|
||||||
|
|
||||||
# ServiceWorker
|
# ServiceWorker
|
||||||
#sw:
|
#sw:
|
||||||
# # Public key of VAPID
|
# # Public key of VAPID
|
||||||
@@ -142,17 +116,6 @@ drive:
|
|||||||
# # Private key of VAPID
|
# # Private key of VAPID
|
||||||
# private_key: example-sw-private-key
|
# private_key: example-sw-private-key
|
||||||
|
|
||||||
# Twitter integration
|
|
||||||
# You need to set the oauth callback url as : https://<your-misskey-instance>/api/tw/cb
|
|
||||||
#twitter:
|
|
||||||
# consumer_key: example-twitter-consumer-key
|
|
||||||
# consumer_secret: example-twitter-consumer-secret-key
|
|
||||||
|
|
||||||
# Ghost
|
|
||||||
# Ghost account is an account used for the purpose of delegating
|
|
||||||
# followers when putting users in the list.
|
|
||||||
#ghost: user-id-of-your-ghost-account
|
|
||||||
|
|
||||||
# Clustering
|
# Clustering
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
|||||||
41
.travis.yml
41
.travis.yml
@@ -1,41 +0,0 @@
|
|||||||
# travis file
|
|
||||||
# https://docs.travis-ci.com/user/customizing-the-build
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
|
|
||||||
branches:
|
|
||||||
except:
|
|
||||||
- l10n_master
|
|
||||||
|
|
||||||
language: node_js
|
|
||||||
|
|
||||||
node_js:
|
|
||||||
- 10.1.0
|
|
||||||
|
|
||||||
env:
|
|
||||||
- CXX=g++-4.8 NODE_ENV=production
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- g++-4.8
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- node_modules
|
|
||||||
|
|
||||||
services:
|
|
||||||
- mongodb
|
|
||||||
- redis-server
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
# 設定ファイルを配置
|
|
||||||
- cp ./.travis/default.yml ./.config
|
|
||||||
- cp ./.travis/test.yml ./.config
|
|
||||||
|
|
||||||
- travis_wait npm run build
|
|
||||||
@@ -23,5 +23,5 @@ Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
|||||||
* Test codes are located in `/test`.
|
* Test codes are located in `/test`.
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses Travis for automated test.
|
Misskey uses CircleCI for automated test.
|
||||||
Configuration files are located in `/.travis`.
|
Configuration files are located in `/.circleci`.
|
||||||
|
|||||||
44
Dockerfile
44
Dockerfile
@@ -1,28 +1,44 @@
|
|||||||
FROM alpine:latest AS base
|
FROM alpine:3.8 AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
RUN apk add --no-cache nodejs nodejs-npm
|
RUN apk add --no-cache nodejs nodejs-npm zlib
|
||||||
RUN apk add vips fftw --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
|
RUN npm i -g npm@latest
|
||||||
|
|
||||||
WORKDIR /misskey
|
WORKDIR /misskey
|
||||||
COPY . ./
|
|
||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
|
|
||||||
RUN apk add --no-cache gcc g++ python autoconf automake file make nasm
|
RUN apk add --no-cache \
|
||||||
RUN apk add vips-dev fftw-dev --update-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
|
gcc \
|
||||||
RUN npm install \
|
g++ \
|
||||||
&& npm install -g node-gyp \
|
libc-dev \
|
||||||
&& node-gyp configure \
|
python \
|
||||||
&& node-gyp build \
|
autoconf \
|
||||||
&& npm run build
|
automake \
|
||||||
|
file \
|
||||||
|
make \
|
||||||
|
nasm \
|
||||||
|
pkgconfig \
|
||||||
|
libtool \
|
||||||
|
zlib-dev
|
||||||
|
RUN npm i -g node-gyp
|
||||||
|
|
||||||
|
COPY ./package.json ./
|
||||||
|
RUN npm i
|
||||||
|
|
||||||
|
COPY . ./
|
||||||
|
RUN node-gyp configure \
|
||||||
|
&& node-gyp build \
|
||||||
|
&& npm run build
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
|
|
||||||
COPY --from=builder /misskey/built ./built
|
|
||||||
COPY --from=builder /misskey/node_modules ./node_modules
|
|
||||||
|
|
||||||
RUN apk add --no-cache tini
|
RUN apk add --no-cache tini
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
|
||||||
|
COPY --from=builder /misskey/node_modules ./node_modules
|
||||||
|
COPY --from=builder /misskey/built ./built
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "start"]
|
||||||
|
|||||||
37
README.md
37
README.md
@@ -3,9 +3,9 @@
|
|||||||
[](https://misskey.xyz/)
|
[](https://misskey.xyz/)
|
||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
[![][travis-badge]][travis-link]
|
[](https://circleci.com/gh/syuilo/misskey)
|
||||||
[![][dependencies-badge]][dependencies-link]
|
[![][dependencies-badge]][dependencies-link]
|
||||||
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
|
[](http://makeapullrequest.com)
|
||||||
|
|
||||||
**Sophisticated microblogging platform, evolving forever.**
|
**Sophisticated microblogging platform, evolving forever.**
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ Easiest way to tell your emotions. Misskey allows you to add various type of rea
|
|||||||
|
|
||||||
<h3 align="left">Interface</h3>
|
<h3 align="left">Interface</h3>
|
||||||
<p align="left">
|
<p align="left">
|
||||||
No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home.
|
Highly customizable UI for your taste. We understand no UI fits for everyone. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -71,39 +71,46 @@ Please see [Contribution guide](./CONTRIBUTING.md).
|
|||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Xeltica"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=I8lJVM8LeW6TSo5W6uIIRZ42cw83zp1wK_FsbzY0mcQ%3D" alt="mydarkstar"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
|
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/negao">negao</a></td>
|
<td><a href="https://www.patreon.com/negao">negao</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||||
<td><a href="https://www.patreon.com/AxellaMC">Xeltica</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=qsdn0-e6yLaLI6hUX9JAkyTR6a5UdnSp7T1foniBvGQ%3D" alt="YUKIMOCHI"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/2?token-time=2145916800&token-hash=iUXOQzRyJDv3PJxwS7Mjwg1459dzh2trOq6NFtXu_OM%3D" alt="Acid Chicken"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=P4BIzCX2I1CkEP66ottfhsC8Wr6BUSamjA-vq3pLqFI%3D" alt="Naoki Hirayama"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D" alt="Gargron"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=VZUtwrjQa8Jml4twCjHYQQZ64wHEY4oIlGl7Kc-VYUQ%3D" alt="Nokotaro Takeda"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
|
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
|
||||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
</tr><tr>
|
||||||
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Tue, 02 Oct 2018 09:25:07 UTC
|
**Last updated:** Wed, 31 Oct 2018 23:21:06 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
@@ -116,8 +123,6 @@ Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
|
|||||||
|
|
||||||
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
|
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
|
||||||
[travis-link]: https://travis-ci.org/syuilo/misskey
|
|
||||||
[travis-badge]: http://img.shields.io/travis/syuilo/misskey/master.svg?style=flat-square
|
|
||||||
[dependencies-link]: https://david-dm.org/syuilo/misskey
|
[dependencies-link]: https://david-dm.org/syuilo/misskey
|
||||||
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
|
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
const deleteUser = require('../built/models/user').deleteUser;
|
|
||||||
|
|
||||||
const args = process.argv.slice(2);
|
|
||||||
|
|
||||||
const userId = args[0];
|
|
||||||
|
|
||||||
console.log(`deleting ${userId}...`);
|
|
||||||
|
|
||||||
deleteUser(userId).then(() => {
|
|
||||||
console.log('done');
|
|
||||||
}, e => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
const mongo = require('mongodb');
|
|
||||||
const User = require('../built/models/user').default;
|
|
||||||
|
|
||||||
const args = process.argv.slice(2);
|
|
||||||
|
|
||||||
const user = args[0];
|
|
||||||
|
|
||||||
const q = user.startsWith('@') ? {
|
|
||||||
username: user.split('@')[1],
|
|
||||||
host: user.split('@')[2] || null
|
|
||||||
} : { _id: new mongo.ObjectID(user) };
|
|
||||||
|
|
||||||
console.log(`Mark as verfied ${user}...`);
|
|
||||||
|
|
||||||
User.update(q, {
|
|
||||||
$set: {
|
|
||||||
isVerified: true
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
console.log(`Done ${user}`);
|
|
||||||
}, e => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
const { default: Note } = require('../built/models/note');
|
|
||||||
const { default: Meta } = require('../built/models/meta');
|
|
||||||
const { default: User } = require('../built/models/user');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const meta = await Meta.findOne({});
|
|
||||||
|
|
||||||
const notesCount = await Note.count();
|
|
||||||
|
|
||||||
const usersCount = await User.count();
|
|
||||||
|
|
||||||
const originalNotesCount = await Note.count({
|
|
||||||
'_user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const originalUsersCount = await User.count({
|
|
||||||
host: null
|
|
||||||
});
|
|
||||||
|
|
||||||
const stats = {
|
|
||||||
notesCount,
|
|
||||||
usersCount,
|
|
||||||
originalNotesCount,
|
|
||||||
originalUsersCount
|
|
||||||
};
|
|
||||||
|
|
||||||
if (meta) {
|
|
||||||
await Meta.update({}, {
|
|
||||||
$set: {
|
|
||||||
stats
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
await Meta.insert({
|
|
||||||
stats
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('done');
|
|
||||||
}).catch(console.error);
|
|
||||||
@@ -6,7 +6,7 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
links:
|
links:
|
||||||
- mongo
|
- mongo
|
||||||
- redis
|
# - redis
|
||||||
# - es
|
# - es
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:3000:3000"
|
- "127.0.0.1:3000:3000"
|
||||||
@@ -14,18 +14,18 @@ services:
|
|||||||
- internal_network
|
- internal_network
|
||||||
- external_network
|
- external_network
|
||||||
|
|
||||||
redis:
|
# redis:
|
||||||
restart: always
|
# restart: always
|
||||||
image: redis:4.0-alpine
|
# image: redis:4.0-alpine
|
||||||
networks:
|
# networks:
|
||||||
- internal_network
|
# - internal_network
|
||||||
### Uncomment to enable Redis persistance
|
### Uncomment to enable Redis persistance
|
||||||
# volumes:
|
## volumes:
|
||||||
# - ./redis:/data
|
## - ./redis:/data
|
||||||
|
|
||||||
mongo:
|
mongo:
|
||||||
restart: always
|
restart: always
|
||||||
image: mongo:4.1-bionic
|
image: mongo:4.1
|
||||||
networks:
|
networks:
|
||||||
- internal_network
|
- internal_network
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
@@ -7,23 +7,29 @@ This guide describes how to install and setup Misskey with Docker.
|
|||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
*1.* Make configuration files
|
*1.* Download Misskey
|
||||||
|
----------------------------------------------------------------
|
||||||
|
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch.
|
||||||
|
2. `cd misskey` Move to misskey directory.
|
||||||
|
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
|
||||||
|
|
||||||
|
*2.* Make configuration files
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
||||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
|
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
|
||||||
2. Edit `default.yml` and `mongo_initdb.js`.
|
2. Edit `default.yml` and `mongo_initdb.js`.
|
||||||
|
|
||||||
*2.* Configure Docker
|
*3.* Configure Docker
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Edit `docker-compose.yml`.
|
Edit `docker-compose.yml`.
|
||||||
|
|
||||||
*3.* Build Misskey
|
*4.* Build Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Build misskey with the following:
|
Build misskey with the following:
|
||||||
|
|
||||||
`docker-compose build`
|
`docker-compose build`
|
||||||
|
|
||||||
*4.* That is it.
|
*5.* That is it.
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Well done! Now, you have an environment that run to Misskey.
|
Well done! Now, you have an environment that run to Misskey.
|
||||||
|
|
||||||
|
|||||||
@@ -7,23 +7,29 @@ Dockerを使ったMisskey構築方法
|
|||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
*1.* 設定ファイルを作成する
|
*1.* Misskeyのダウンロード
|
||||||
|
----------------------------------------------------------------
|
||||||
|
1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
|
||||||
|
2. `cd misskey` misskeyディレクトリに移動
|
||||||
|
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||||
|
|
||||||
|
*2.* 設定ファイルを作成する
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする
|
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする
|
||||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする
|
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする
|
||||||
3. `default.yml`と`mongo_initdb.js`を編集する
|
3. `default.yml`と`mongo_initdb.js`を編集する
|
||||||
|
|
||||||
*2.* Dockerの設定
|
*3.* Dockerの設定
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
`docker-compose.yml`を編集してください。
|
`docker-compose.yml`を編集してください。
|
||||||
|
|
||||||
*3.* Misskeyのビルド
|
*4.* Misskeyのビルド
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
次のコマンドでMisskeyをビルドしてください:
|
次のコマンドでMisskeyをビルドしてください:
|
||||||
|
|
||||||
`docker-compose build`
|
`docker-compose build`
|
||||||
|
|
||||||
*4.* 以上です!
|
*5.* 以上です!
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Please install and setup these softwares:
|
Please install and setup these softwares:
|
||||||
|
|
||||||
#### Dependencies :package:
|
#### Dependencies :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)**
|
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
||||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
||||||
|
|
||||||
##### Optional
|
##### Optional
|
||||||
@@ -47,11 +47,6 @@ In root :
|
|||||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
|
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
|
||||||
5. `npm install` Install misskey dependencies.
|
5. `npm install` Install misskey dependencies.
|
||||||
|
|
||||||
*(optional)* reCAPTCHA tokens
|
|
||||||
----------------------------------------------------------------
|
|
||||||
If you want to enable reCAPTCHA, you need to generate reCAPTCHA tokens:
|
|
||||||
Please visit https://www.google.com/recaptcha/intro/ and generate keys.
|
|
||||||
|
|
||||||
*(optional)* Generating VAPID keys
|
*(optional)* Generating VAPID keys
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
If you want to enable ServiceWorker, you need to generate VAPID keys:
|
If you want to enable ServiceWorker, you need to generate VAPID keys:
|
||||||
@@ -62,13 +57,6 @@ npm install web-push -g
|
|||||||
web-push generate-vapid-keys
|
web-push generate-vapid-keys
|
||||||
```
|
```
|
||||||
|
|
||||||
*(optional)* Create a twitter application
|
|
||||||
----------------------------------------------------------------
|
|
||||||
If you want to enable the twitter integration, you need to create a twitter app at [https://developer.twitter.com/en/apply/user](https://developer.twitter.com/en/apply/user).
|
|
||||||
|
|
||||||
In the app you need to set the oauth callback url as : https://misskey-instance/api/tw/cb
|
|
||||||
|
|
||||||
|
|
||||||
*5.* Make configuration file
|
*5.* Make configuration file
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
これらのソフトウェアをインストール・設定してください:
|
これらのソフトウェアをインストール・設定してください:
|
||||||
|
|
||||||
#### 依存関係 :package:
|
#### 依存関係 :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)**
|
* **[Node.js](https://nodejs.org/en/)** (10.0.0以上)
|
||||||
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
||||||
|
|
||||||
##### オプション
|
##### オプション
|
||||||
@@ -53,11 +53,6 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||||
5. `npm install` Misskeyの依存パッケージをインストール
|
5. `npm install` Misskeyの依存パッケージをインストール
|
||||||
|
|
||||||
*(オプション)* reCAPTCHAトークン
|
|
||||||
----------------------------------------------------------------
|
|
||||||
reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。
|
|
||||||
https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。
|
|
||||||
|
|
||||||
*(オプション)* VAPIDキーペアの生成
|
*(オプション)* VAPIDキーペアの生成
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります:
|
ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります:
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ If you find an untranslated part on Misskey:
|
|||||||
4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes.
|
4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes.
|
||||||
- For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`.
|
- For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`.
|
||||||
|
|
||||||
5. And done!
|
5. When you add text to the ja-JP file (of syuilo/misskey), it will automatically be applied to all other local language files within 24-48 hours. Translations added in ja-JP file should contain the original Japanese strings (example see step 4).
|
||||||
|
|
||||||
|
6. The new strings will automatically appear in the localized language files in the original Japanese text. After that, please go to [CrowdIn](https://crowdin.com/project/misskey) to do the localized translations in your language.
|
||||||
|
|
||||||
|
7. And done!
|
||||||
|
|
||||||
For more details, please refer to this [commit](https://github.com/syuilo/misskey/commit/10f6d5980fa7692ccb45fbc5f843458b69b7607c).
|
For more details, please refer to this [commit](https://github.com/syuilo/misskey/commit/10f6d5980fa7692ccb45fbc5f843458b69b7607c).
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import * as htmlmin from 'gulp-htmlmin';
|
|||||||
const uglifyes = require('uglify-es');
|
const uglifyes = require('uglify-es');
|
||||||
|
|
||||||
const locales = require('./locales');
|
const locales = require('./locales');
|
||||||
import { fa } from './src/misc/fa';
|
|
||||||
|
|
||||||
const uglify = uglifyComposer(uglifyes, console);
|
const uglify = uglifyComposer(uglifyes, console);
|
||||||
|
|
||||||
@@ -164,8 +163,7 @@ gulp.task('build:client:pug', [
|
|||||||
gulp.src('./src/client/app/base.pug')
|
gulp.src('./src/client/app/base.pug')
|
||||||
.pipe(pug({
|
.pipe(pug({
|
||||||
locals: {
|
locals: {
|
||||||
themeColor: constants.themeColor,
|
themeColor: constants.themeColor
|
||||||
facss: fa.dom.css()
|
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
.pipe(htmlmin({
|
.pipe(htmlmin({
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
# **DO NOT edit locale files** except `ja-JP.yml`.
|
# **DO NOT edit locale files** except `ja-JP.yml`.
|
||||||
|
|
||||||
|
When you add text to the ja-JP file (of syuilo/misskey), it will automatically be applied to other language files.
|
||||||
|
Translations added in ja-JP file should contain the original Japanese strings.
|
||||||
|
|
||||||
Please see [Contribution guide](../CONTRIBUTING.md) for more information.
|
Please see [Contribution guide](../CONTRIBUTING.md) for more information.
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}年前"
|
years_ago: "{}年前"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -835,21 +849,33 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -20,11 +20,19 @@ common:
|
|||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Bitte deaktivieren Sie den Werbeblocker."
|
detected: "Bitte deaktiviere den Werbeblocker."
|
||||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||||
application-authorization: "Autorisierte Anwendungen"
|
application-authorization: "Autorisierte Anwendungen"
|
||||||
close: "Schließen"
|
close: "Schließen"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: "Ein schwerwiegender Fehler ist aufgetreten :("
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "Fehlercode"
|
||||||
|
browser-version: "Browserversion"
|
||||||
|
client-version: "Clientversion"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Vielen Dank dass du Misskey verwendest."
|
||||||
got-it: "Verstanden!"
|
got-it: "Verstanden!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Anpassung-Tipps"
|
title: "Anpassung-Tipps"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "vor {} Jahr{0:en}"
|
years_ago: "vor {} Jahr{0:en}"
|
||||||
month-and-day: "{day}/{month}"
|
month-and-day: "{day}/{month}"
|
||||||
trash: "Papierkorb"
|
trash: "Papierkorb"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "So"
|
sunday: "So"
|
||||||
monday: "Mo"
|
monday: "Mo"
|
||||||
@@ -115,9 +124,12 @@ common:
|
|||||||
reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
|
reduce-motion: "Animationen der Benutzeroberfläche reduzieren"
|
||||||
this-setting-is-this-device-only: "Nur auf diesem Gerät"
|
this-setting-is-this-device-only: "Nur auf diesem Gerät"
|
||||||
do-not-use-in-production: 'Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden.'
|
do-not-use-in-production: 'Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden.'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'Erneut versuchen'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Unentschieden"
|
drawn: "Unentschieden"
|
||||||
my-turn: "Du bist am Zug"
|
my-turn: "Du bist am Zug"
|
||||||
@@ -157,7 +169,7 @@ common:
|
|||||||
widgets: "Widget hinzufügen:"
|
widgets: "Widget hinzufügen:"
|
||||||
home: "Startseite"
|
home: "Startseite"
|
||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "Sozial"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Erwähnungen"
|
mentions: "Erwähnungen"
|
||||||
@@ -172,7 +184,9 @@ common:
|
|||||||
add-column: "Eine Spalte hinzufügen"
|
add-column: "Eine Spalte hinzufügen"
|
||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
stack-left: "Nach links schichten"
|
stack-left: "Nach links schichten"
|
||||||
pop-right: "右に出す"
|
pop-right: "Rechts andocken"
|
||||||
|
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -184,7 +198,7 @@ auth/views/form.vue:
|
|||||||
drive-read: "ドライブを見る。"
|
drive-read: "ドライブを見る。"
|
||||||
drive-write: "ドライブを操作する。"
|
drive-write: "ドライブを操作する。"
|
||||||
notification-read: "通知を見る。"
|
notification-read: "通知を見る。"
|
||||||
notification-write: "通知を操作する。"
|
notification-write: "Benachrichtigungen verwalten."
|
||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
accept: "Zugriff erlauben."
|
accept: "Zugriff erlauben."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@@ -194,7 +208,7 @@ auth/views/index.vue:
|
|||||||
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: "アプリケーションに戻っています"
|
callback-url: "アプリケーションに戻っています"
|
||||||
please-go-back: "Bitte gehen Sie 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/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
@@ -337,8 +351,8 @@ common/views/components/nav.vue:
|
|||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
copy-link: "リンクをコピー"
|
copy-link: "リンクをコピー"
|
||||||
favorite: "Diese Anmerkung favorisieren"
|
favorite: "Diese Notiz favorisieren"
|
||||||
unfavorite: "Entfavorisieren"
|
unfavorite: "Aus Favoriten entfernen"
|
||||||
pin: "An die Profilseite pinnen"
|
pin: "An die Profilseite pinnen"
|
||||||
unpin: "ピン留め解除"
|
unpin: "ピン留め解除"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "Netzwerk"
|
network: "Netzwerk"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "benutzt"
|
used: "benutzt"
|
||||||
drive: "Speicher"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
@@ -580,7 +596,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
open-in-app: "In der App öffnen"
|
open-in-app: "In der App öffnen"
|
||||||
add-app: "App hinzufügen"
|
add-app: "App hinzufügen"
|
||||||
rename-file: "Datei umbennen"
|
rename-file: "Datei umbennen"
|
||||||
input-new-file-name: "Geben Sie den neuen Dateinamen an"
|
input-new-file-name: "Gib den neuen Dateinamen an"
|
||||||
copied: "Kopieren erfolgreich"
|
copied: "Kopieren erfolgreich"
|
||||||
copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
|
copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
rename-folder: "Ordner umbenennen"
|
rename-folder: "Ordner umbenennen"
|
||||||
input-new-folder-name: "Namen für neuen Ordner eingeben"
|
input-new-folder-name: "Namen für neuen Ordner eingeben"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "Laufwerk"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Suchen"
|
search: "Suchen"
|
||||||
load-more: "Mehr laden"
|
load-more: "Mehr laden"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
notification: "Mitteilungen"
|
notification: "Mitteilungen"
|
||||||
apps: "In App öffnen"
|
apps: "In App öffnen"
|
||||||
mute: "Stummschalten"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "Dateien vom Drive anfügen"
|
blocking: "ブロック"
|
||||||
security: "Sicherheit"
|
security: "Sicherheit"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "Passwort"
|
password: "Passwort"
|
||||||
@@ -835,27 +849,39 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Bitte Passwort eingeben"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
reset: "Passwort ändern"
|
mute: "ミュート"
|
||||||
enter-current-password: "Derzeitiges Passwort eingeben"
|
block: "ブロック"
|
||||||
enter-new-password: "Neues Passwort eingeben"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
enter-new-password-again: "Neues Passwort erneut eingeben"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
not-match: "Passwörter stimmen nicht überein."
|
common/views/components/password-settings.vue:
|
||||||
changed: "Passwort geändert"
|
reset: "パスワードを変更する"
|
||||||
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
|
not-match: "新しいパスワードが一致しません"
|
||||||
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Dein Profil"
|
profile: "Dein Profil"
|
||||||
drive: "Speicher"
|
|
||||||
favorites: "Favoriten"
|
favorites: "Favoriten"
|
||||||
lists: "Listen"
|
lists: "Listen"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "Mehr laden"
|
more: "Mehr laden"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "Application authorizations"
|
application-authorization: "Application authorizations"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
||||||
|
BSoD:
|
||||||
|
fatal-error: "A fatal error has occurred :("
|
||||||
|
update-browser-os: "You might resolve to update the version of your browser (or OS)."
|
||||||
|
error-code: "Error code"
|
||||||
|
browser-version: "Browser version"
|
||||||
|
client-version: "Client version"
|
||||||
|
email-support: "If the problem persists, contact syuilotan@yahoo.co.jp please on the above information."
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "Got it!"
|
got-it: "Got it!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}year(s) ago"
|
years_ago: "{}year(s) ago"
|
||||||
month-and-day: "{month}/{day}"
|
month-and-day: "{month}/{day}"
|
||||||
trash: "Trash"
|
trash: "Trash"
|
||||||
|
drive: "Drive"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "S"
|
sunday: "S"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "Reduce motion in UI"
|
reduce-motion: "Reduce motion in UI"
|
||||||
this-setting-is-this-device-only: "Only for this device"
|
this-setting-is-this-device-only: "Only for this device"
|
||||||
do-not-use-in-production: 'As this is for development, do not use this in production.'
|
do-not-use-in-production: 'As this is for development, do not use this in production.'
|
||||||
|
is-remote-user: "This user information is copied."
|
||||||
|
is-remote-post: "This post information is a copy."
|
||||||
|
view-on-remote: "View it on remote"
|
||||||
error:
|
error:
|
||||||
title: 'Something happened :('
|
title: 'Something happened :('
|
||||||
retry: 'Retry'
|
retry: 'Retry'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
stack-left: "Stack to the left"
|
stack-left: "Stack to the left"
|
||||||
pop-right: "Dock on the right"
|
pop-right: "Dock on the right"
|
||||||
|
dev: "Failed to create the application. Please try again."
|
||||||
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
||||||
permission-ask: "This application requires the following permissions:"
|
permission-ask: "This application requires the following permissions:"
|
||||||
@@ -236,7 +250,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
this-game-is-started-soon: "The game will begin in seconds"
|
this-game-is-started-soon: "The game will begin in seconds"
|
||||||
waiting-for-other: "Waiting for the opponent"
|
waiting-for-other: "Waiting for the opponent"
|
||||||
waiting-for-me: "Waiting for the your preparation"
|
waiting-for-me: "Waiting for the your preparation"
|
||||||
waiting-for-both: "Prepareing"
|
waiting-for-both: "Preparing"
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
ready: "Ready"
|
ready: "Ready"
|
||||||
cancel-ready: "Cancel \"Ready\""
|
cancel-ready: "Cancel \"Ready\""
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "Charts"
|
title: "Charts"
|
||||||
per-day: "per Day"
|
per-day: "per Day"
|
||||||
per-hour: "per Hour"
|
per-hour: "per Hour"
|
||||||
|
federation: "Federation"
|
||||||
notes: "Posts"
|
notes: "Posts"
|
||||||
users: "Users"
|
users: "Users"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
network: "Network"
|
network: "Network"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "The number of instances: increase/decrease"
|
||||||
|
federation-instances-total: "Total number of instances"
|
||||||
notes: "The number of posts: increase/decrease (Combined)"
|
notes: "The number of posts: increase/decrease (Combined)"
|
||||||
local-notes: "The number of posts: increase/decrease (Local)"
|
local-notes: "The number of posts: increase/decrease (Local)"
|
||||||
remote-notes: "The number of posts: increase/decrease (Remote)"
|
remote-notes: "The number of posts: increase/decrease (Remote)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "used"
|
used: "used"
|
||||||
drive: "Media storage"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
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"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "Media storage"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Search"
|
search: "Search"
|
||||||
load-more: "Load more"
|
load-more: "Load more"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "Profile"
|
profile: "Profile"
|
||||||
notification: "Notification"
|
notification: "Notification"
|
||||||
apps: "Apps"
|
apps: "Apps"
|
||||||
mute: "Mute"
|
mute-and-block: "Mute / Block"
|
||||||
drive: "Drive"
|
blocking: "Blocking"
|
||||||
security: "Security"
|
security: "Security"
|
||||||
signin: "Sign in history"
|
signin: "Sign in history"
|
||||||
password: "Password"
|
password: "Password"
|
||||||
@@ -748,8 +762,8 @@ desktop/views/components/settings.vue:
|
|||||||
advanced: "Advanced settings"
|
advanced: "Advanced settings"
|
||||||
api-via-stream: "API request via stream"
|
api-via-stream: "API request via stream"
|
||||||
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
|
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "Transitionless deck navigation"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "You get a temporary column without page transitions during navigation when using the deck."
|
||||||
deck-default: "Use Deck as default UI"
|
deck-default: "Use Deck as default UI"
|
||||||
display: "Design and display"
|
display: "Design and display"
|
||||||
customize: "Customize home layout"
|
customize: "Customize home layout"
|
||||||
@@ -767,7 +781,7 @@ desktop/views/components/settings.vue:
|
|||||||
show-reply-target: "Display reply target"
|
show-reply-target: "Display reply target"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
show-my-renotes: "Show my renotes in the timeline"
|
show-my-renotes: "Show my renotes in the timeline"
|
||||||
show-renoted-my-notes: "Show renoted my posts in timelines"
|
show-renoted-my-notes: "Show renoted posts of mine in timelines"
|
||||||
show-local-renotes: "Show renoted local posts in timelines"
|
show-local-renotes: "Show renoted local posts in timelines"
|
||||||
show-maps: "Display a map to show the location"
|
show-maps: "Display a map to show the location"
|
||||||
deck-column-align: "Deck column alignment"
|
deck-column-align: "Deck column alignment"
|
||||||
@@ -835,27 +849,39 @@ 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."
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "To access the API, set this token as the key 'i' of request parameters."
|
intro: "To access the API, set this token as the key 'i' of request parameters."
|
||||||
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
||||||
regeneration-of-token: "If your token gets leaked, you can regenerate it."
|
regeneration-of-token: "If your token gets leaked, you can regenerate it."
|
||||||
regenerate-token: "Regenerate the token"
|
regenerate-token: "Regenerate the token"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Please enter the password"
|
enter-password: "Enter the password"
|
||||||
|
console:
|
||||||
|
title: 'API console'
|
||||||
|
endpoint: 'Endpoint'
|
||||||
|
parameter: 'Parameters'
|
||||||
|
send: 'Send'
|
||||||
|
sending: 'Sending'
|
||||||
|
response: 'Result'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "No linked applications"
|
no-apps: "No linked applications"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "Max"
|
max: "Max"
|
||||||
in-use: "In use"
|
in-use: "In use"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "Statistics"
|
||||||
no-users: "No muted users"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "Mute / Block"
|
||||||
|
mute: "Mute"
|
||||||
|
block: "Blocking"
|
||||||
|
no-muted-users: "No muted users"
|
||||||
|
no-blocked-users: "No blocked users"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "Change password"
|
reset: "Change password"
|
||||||
enter-current-password: "Enter the current password"
|
enter-current-password: "Enter the current password"
|
||||||
enter-new-password: "Enter the new password"
|
enter-new-password: "Enter the new password"
|
||||||
enter-new-password-again: "Enter new password again"
|
enter-new-password-again: "Enter the new password again"
|
||||||
not-match: "The new passwords do not match"
|
not-match: "The new passwords do not match"
|
||||||
changed: "Password updated"
|
changed: "Password changed"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "This post is private"
|
private: "This post is private"
|
||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "-san"
|
adjective: "-san"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Your profile"
|
profile: "Your profile"
|
||||||
drive: "Media storage"
|
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
lists: "Lists"
|
lists: "Lists"
|
||||||
follow-requests: "Follow requests"
|
follow-requests: "Follow requests"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
drive: "Drive"
|
instance: "Instance"
|
||||||
|
emoji: "Emoji"
|
||||||
users: "Users"
|
users: "Users"
|
||||||
update: "Updates"
|
update: "Update"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "Announcements"
|
||||||
|
hashtags: "Hashtags"
|
||||||
|
back-to-misskey: "Back to Misskey"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
all-users: "All Users"
|
accounts: "Accounts"
|
||||||
original-users: "Users on this instance"
|
notes: "Notes"
|
||||||
all-notes: "All the posts"
|
drive: "Drive"
|
||||||
original-notes: "Posts on this instance"
|
instances: "Instances"
|
||||||
|
this-instance: "This instance"
|
||||||
|
federated: "Federated"
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "Chart"
|
||||||
|
per-day: "per Day"
|
||||||
|
per-hour: "per Hour"
|
||||||
|
federation: "Federation"
|
||||||
|
notes: "Posts"
|
||||||
|
users: "Users"
|
||||||
|
drive: "Drive"
|
||||||
|
network: "Network"
|
||||||
|
charts:
|
||||||
|
federation-instances: "The number of instances: increase/decrease"
|
||||||
|
federation-instances-total: "Total number of instances"
|
||||||
|
notes: "The number of posts: increase/decrease (Combined)"
|
||||||
|
local-notes: "The number of posts: increase/decrease (Local)"
|
||||||
|
remote-notes: "The number of posts: increase/decrease (Remote)"
|
||||||
|
notes-total: "Total posts"
|
||||||
|
users: "The number of users: increase/decrease"
|
||||||
|
users-total: "Total users"
|
||||||
|
drive: "Capacity used as the storage: increase/decrease"
|
||||||
|
drive-total: "Total usage of Drive"
|
||||||
|
drive-files: "The number of files on the storage: increase/decrease"
|
||||||
|
drive-files-total: "Total number of files on Drive"
|
||||||
|
network-requests: "Requests"
|
||||||
|
network-time: "Response time"
|
||||||
|
network-usage: "Traffic"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "Suspend a user"
|
suspend-user: "Suspend a user"
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
suspended: "Successfully suspended."
|
suspended: "Successfully suspended."
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "Unsuspend users"
|
unsuspend-user: "Unsuspend users"
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "User account verification settings"
|
verify-user: "User account verification settings"
|
||||||
verify: "Verify account"
|
verify: "Verify account"
|
||||||
verified: "The account is now being verified"
|
verified: "The account is now being verified"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "User account unverification settings"
|
unverify-user: "User account unverification settings"
|
||||||
unverify: "Unverify account"
|
unverify: "Unverify account"
|
||||||
unverified: "The account is now being unverified"
|
unverified: "The account is now being unverified"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "Add emoji"
|
||||||
|
name: "Emoji name"
|
||||||
|
name-desc: "You can use the characters a~z 0~9 _"
|
||||||
|
aliases: "Aliases"
|
||||||
|
aliases-desc: "You can add more than one, separated by spaces."
|
||||||
|
url: "Image URL"
|
||||||
|
add: "Add"
|
||||||
|
emojis:
|
||||||
|
title: "Emojis"
|
||||||
|
update: "Update"
|
||||||
|
remove: "Remove"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "Announcements"
|
||||||
|
save: "Save"
|
||||||
|
remove: "Remove"
|
||||||
|
add: "Add"
|
||||||
|
title: "Title"
|
||||||
|
text: "Content"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Only media posts"
|
is-media-only: "Only media posts"
|
||||||
is-media-view: "Media view"
|
is-media-view: "Media view"
|
||||||
edit: "Options"
|
edit: "Options"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "Posts"
|
||||||
|
following: "Following"
|
||||||
|
followers: "Followers"
|
||||||
|
images: "Images"
|
||||||
|
activity: "Activity"
|
||||||
|
timeline: "Timeline"
|
||||||
pinned-notes: "Pinned posts"
|
pinned-notes: "Pinned posts"
|
||||||
|
push-to-a-list: "Add to list"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "All Users"
|
all-users: "All Users"
|
||||||
original-users: "Users on this instance"
|
original-users: "Users on this instance"
|
||||||
@@ -1008,10 +1093,7 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "No frequent mentions"
|
no-users: "No frequent mentions"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "This account has been suspended."
|
is-suspended: "This account has been suspended."
|
||||||
is-remote: "This profile belongs to a remote user. The profile that you see here may not be complete. "
|
last-used-at: "Last active"
|
||||||
view-remote: "See their complete profile"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "Last active:"
|
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "Photos"
|
title: "Photos"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "Mute"
|
mute: "Mute"
|
||||||
muted: "Muting"
|
muted: "Muting"
|
||||||
unmute: "Unmute"
|
unmute: "Unmute"
|
||||||
|
block: "Block"
|
||||||
|
unblock: "Unblock"
|
||||||
|
block-confirm: "Are you sure block this user?"
|
||||||
push-to-a-list: "Add to list"
|
push-to-a-list: "Add to list"
|
||||||
list-pushed: "Successfully added {user} to {list}."
|
list-pushed: "Successfully added {user} to {list}."
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
|
years-old: " years old"
|
||||||
|
year: "/"
|
||||||
|
month: "/"
|
||||||
|
day: "-"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "Posts"
|
default: "Posts"
|
||||||
with-replies: "Posts and replies"
|
with-replies: "Posts and replies"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "refresh"
|
refresh: "refresh"
|
||||||
no-one: "Anyone!"
|
no-one: "Anyone!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "Media storage"
|
|
||||||
used: "used"
|
used: "used"
|
||||||
folder-count: "Folder(s)"
|
folder-count: "Folder(s)"
|
||||||
count-separator: ", "
|
count-separator: ", "
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "Messages"
|
messaging: "Messages"
|
||||||
follow-requests: "Follow requests"
|
follow-requests: "Follow requests"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
drive: "Drive"
|
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
user-lists: "Lists"
|
user-lists: "Lists"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
@@ -1179,7 +1266,7 @@ mobile/views/components/user-timeline.vue:
|
|||||||
load-more: "More"
|
load-more: "More"
|
||||||
mobile/views/components/users-list.vue:
|
mobile/views/components/users-list.vue:
|
||||||
all: "All"
|
all: "All"
|
||||||
known: "You know"
|
known: "In common"
|
||||||
load-more: "More"
|
load-more: "More"
|
||||||
mobile/views/pages/favorites.vue:
|
mobile/views/pages/favorites.vue:
|
||||||
title: "Favorites"
|
title: "Favorites"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "Lists"
|
title: "Lists"
|
||||||
enter-list-name: "Enter a name of the list to make"
|
enter-list-name: "Enter a name of the list to make"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Drive"
|
|
||||||
more: "Load more"
|
more: "Load more"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "Your account is now ready! 📦"
|
lets-start: "Your account is now ready! 📦"
|
||||||
@@ -1253,7 +1339,7 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
show-reply-target: "Show reply target"
|
show-reply-target: "Show reply target"
|
||||||
show-my-renotes: "Show my reposts"
|
show-my-renotes: "Show my reposts"
|
||||||
show-renoted-my-notes: "Show renoted my posts"
|
show-renoted-my-notes: "Show renoted posts of mine"
|
||||||
show-local-renotes: "Show renoted local posts"
|
show-local-renotes: "Show renoted local posts"
|
||||||
post-style: "Post design"
|
post-style: "Post design"
|
||||||
post-style-standard: "Standard"
|
post-style-standard: "Standard"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "Sign out"
|
signout: "Sign out"
|
||||||
sound: "Sounds"
|
sound: "Sounds"
|
||||||
enable-sounds: "Enable sounds"
|
enable-sounds: "Enable sounds"
|
||||||
|
mark-as-read-all-unread-notes: "Mark all posts as read"
|
||||||
|
password: "Password"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Follows you"
|
follows-you: "Follows you"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
media: "Media"
|
media: "Media"
|
||||||
is-suspended: "This account has been suspended."
|
is-suspended: "This account has been suspended."
|
||||||
is-remote: "The user is a remote user. The profile that you see here may not complete."
|
mute: "Mute"
|
||||||
view-remote: "See his/her complete profile"
|
unmute: "Unmute"
|
||||||
|
block: "Block"
|
||||||
|
unblock: "Unblock"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Recent notes"
|
recent-notes: "Recent notes"
|
||||||
images: "Images"
|
images: "Images"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "Description"
|
description: "Description"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Manage apps"
|
manage-apps: "Manage apps"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "Manage apps"
|
||||||
|
create-app: "Create app"
|
||||||
|
app-missing: "No apps"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "Creating application"
|
||||||
|
app-name: "Application name"
|
||||||
|
app-name-desc: "The name of your app"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "Application summary"
|
||||||
|
app-desc: "A brief description or introduction of your app."
|
||||||
|
app-desc-ex: "ex) Misskey iOS client."
|
||||||
|
callback-url: "The callback URL (optional)"
|
||||||
|
callback-url-desc: "The URL to redirect to after the user is authenticated via the authentication form."
|
||||||
|
authority: "Permissions"
|
||||||
|
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."
|
||||||
|
account-read: "View account information."
|
||||||
|
account-write: "Modify account information."
|
||||||
|
note-write: "Post."
|
||||||
|
reaction-write: "Add or remove reactions."
|
||||||
|
following-write: "Follow and unfollow."
|
||||||
|
drive-read: "Read the drive."
|
||||||
|
drive-write: "Upload/delete files in the drive."
|
||||||
|
notification-read: "Read your notifications."
|
||||||
|
notification-write: "Manage your notifications."
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "Autorizaciones de la aplicación."
|
application-authorization: "Autorizaciones de la aplicación."
|
||||||
close: "Cerrar"
|
close: "Cerrar"
|
||||||
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "¡Listo!"
|
got-it: "¡Listo!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Consejos de personalización"
|
title: "Consejos de personalización"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "Hace {} año(s)"
|
years_ago: "Hace {} año(s)"
|
||||||
month-and-day: "{day} de {month}"
|
month-and-day: "{day} de {month}"
|
||||||
trash: "Papelera"
|
trash: "Papelera"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "domingo"
|
sunday: "domingo"
|
||||||
monday: "lunes"
|
monday: "lunes"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
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.'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
stack-left: "A la izqda."
|
stack-left: "A la izqda."
|
||||||
pop-right: "A la dcha."
|
pop-right: "A la dcha."
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "¿Deseas <b>permitir</b> a <i>{{ app.name }}</i> acceder a tu cuenta?"
|
share-access: "¿Deseas <b>permitir</b> a <i>{{ app.name }}</i> acceder a tu cuenta?"
|
||||||
permission-ask: "La aplicación requiere los siguientes permisos:"
|
permission-ask: "La aplicación requiere los siguientes permisos:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "Gráficos"
|
title: "Gráficos"
|
||||||
per-day: "por día"
|
per-day: "por día"
|
||||||
per-hour: "por hora"
|
per-hour: "por hora"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "Publicaciones"
|
notes: "Publicaciones"
|
||||||
users: "Usuarios"
|
users: "Usuarios"
|
||||||
drive: "Unidad"
|
drive: "Unidad"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
|
notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
|
||||||
local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
|
local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
|
||||||
remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)"
|
remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "usado"
|
used: "usado"
|
||||||
drive: "Disco"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
@@ -593,8 +609,6 @@ 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"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "Disco"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
load-more: "Cargar más"
|
load-more: "Cargar más"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "Perfil"
|
profile: "Perfil"
|
||||||
notification: "Notificación"
|
notification: "Notificación"
|
||||||
apps: "Aplicaciones"
|
apps: "Aplicaciones"
|
||||||
mute: "Silenciar"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "Disco"
|
blocking: "ブロック"
|
||||||
security: "Seguridad"
|
security: "Seguridad"
|
||||||
signin: "Historial de inicios de sesión"
|
signin: "Historial de inicios de sesión"
|
||||||
password: "Contraseña"
|
password: "Contraseña"
|
||||||
@@ -835,27 +849,39 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "¡Configuraciones guardadas!"
|
success: "¡Configuraciones guardadas!"
|
||||||
failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
|
failed: "Error al configurar. Por favor asegúrate de que el token es correcto."
|
||||||
info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
|
info: "Desde ahora, ingresa el token que se muestra en tu dispositivo adicionalmente a tu contraseña cuando inicies sesión en Misskey"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "Para acceder al API, configura este token como la letra \"i\" de los parámetros requeridos."
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "Por favor no muestres este token a otros (no lo ingreses en otro lugar que no sea aquí). De otra forma, tu cuenta puede llegar a ser comprometida."
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "En el caso no deseado de que este token lo tenga otra persona, puedes regenerarlo."
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "Regenerar el token"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Por favor ingresa tu contraseña"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "No hay aplicaciones asociadas"
|
no-apps: "No hay aplicaciones asociadas"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "Max"
|
max: "容量"
|
||||||
in-use: "en uso."
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "No hay usuarios silenciados"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
reset: "Cambiar contraseña"
|
mute: "ミュート"
|
||||||
enter-current-password: "Ingresar contraseña actual"
|
block: "ブロック"
|
||||||
enter-new-password: "Ingresar nueva contraseña"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
enter-new-password-again: "Ingresar nueva contraseña de nuevo"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
not-match: "Las nuevas contraseñas no se corresponden consigo mismas"
|
common/views/components/password-settings.vue:
|
||||||
changed: "Contraseña actualizada"
|
reset: "パスワードを変更する"
|
||||||
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
|
not-match: "新しいパスワードが一致しません"
|
||||||
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "-san"
|
adjective: "-san"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Tu perfil"
|
profile: "Tu perfil"
|
||||||
drive: "Unidad"
|
|
||||||
favorites: "Favoritos"
|
favorites: "Favoritos"
|
||||||
lists: "Listas"
|
lists: "Listas"
|
||||||
follow-requests: "Solicitudes de seguimiento"
|
follow-requests: "Solicitudes de seguimiento"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "Permissions de l'application"
|
application-authorization: "Permissions de l'application"
|
||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte peut être compromis."
|
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte peut être compromis."
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "Code d’erreur"
|
||||||
|
browser-version: "Version du navigateur"
|
||||||
|
client-version: "La version du client"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Merci d’avoir choisi d’utiliser Misskey."
|
||||||
got-it: "J'ai compris !"
|
got-it: "J'ai compris !"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "Il y a {} an·s"
|
years_ago: "Il y a {} an·s"
|
||||||
month-and-day: "{month} mois/{day} jour"
|
month-and-day: "{month} mois/{day} jour"
|
||||||
trash: "Corbeille"
|
trash: "Corbeille"
|
||||||
|
drive: "Drive"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "D"
|
sunday: "D"
|
||||||
monday: "L"
|
monday: "L"
|
||||||
@@ -115,9 +124,12 @@ common:
|
|||||||
reduce-motion: "Réduire les animations dans l’interface utilisateur"
|
reduce-motion: "Réduire les animations dans l’interface utilisateur"
|
||||||
this-setting-is-this-device-only: "Uniquement sur cet appareil"
|
this-setting-is-this-device-only: "Uniquement sur cet appareil"
|
||||||
do-not-use-in-production: 'Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production.'
|
do-not-use-in-production: 'Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production.'
|
||||||
|
is-remote-user: "Ces informations utilisateur ont été copiées."
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "Consulter le profil complet"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: 'Une erreur est survenue'
|
||||||
retry: 'やり直す'
|
retry: 'Réessayer'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Partie nulle"
|
drawn: "Partie nulle"
|
||||||
my-turn: "C’est votre tour"
|
my-turn: "C’est votre tour"
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
stack-left: "Vers la gauche"
|
stack-left: "Vers la gauche"
|
||||||
pop-right: "Vers la droite"
|
pop-right: "Vers la droite"
|
||||||
|
dev: "Échec lors de la création de l’application. Veuillez réessayer."
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?"
|
share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?"
|
||||||
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
||||||
@@ -431,7 +445,7 @@ common/views/components/profile-editor.vue:
|
|||||||
is-cat: "Ce compte est un Chat"
|
is-cat: "Ce compte est un Chat"
|
||||||
is-bot: "Ce compte est un Bot"
|
is-bot: "Ce compte est un Bot"
|
||||||
is-locked: "Demandes d’abonnements requièrent l’approbation"
|
is-locked: "Demandes d’abonnements requièrent l’approbation"
|
||||||
careful-bot: "Botからのフォローだけ承認制にする"
|
careful-bot: "Les demandes d’abonnements venant de Bots requièrent l’approbation"
|
||||||
advanced: "Avancé"
|
advanced: "Avancé"
|
||||||
privacy: "Vie privée"
|
privacy: "Vie privée"
|
||||||
save: "Mettre à jour le profil"
|
save: "Mettre à jour le profil"
|
||||||
@@ -488,7 +502,7 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||||
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
||||||
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
||||||
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
|
tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
|
||||||
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
|
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
|
||||||
tips-line23: "Mayu est mignone avec ses sourcils."
|
tips-line23: "Mayu est mignone avec ses sourcils."
|
||||||
tips-line24: "Misskey a vu le jour en 2014"
|
tips-line24: "Misskey a vu le jour en 2014"
|
||||||
@@ -529,21 +543,24 @@ desktop/views/components/charts.vue:
|
|||||||
title: "Graphiques"
|
title: "Graphiques"
|
||||||
per-day: "par jour"
|
per-day: "par jour"
|
||||||
per-hour: "par heure"
|
per-hour: "par heure"
|
||||||
|
federation: "Fédération"
|
||||||
notes: "Publications"
|
notes: "Publications"
|
||||||
users: "Utilisateurs"
|
users: "Utilisateurs"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
network: "Réseau"
|
network: "Réseau"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "Nombre d’instances : augmentation/diminution"
|
||||||
|
federation-instances-total: "Nombre total d’instances"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
notes-total: "Total des notes"
|
notes-total: "Total des notes"
|
||||||
users: "Nombre d’utilisateurs·trices : augmentation/diminution"
|
users: "Nombre d’utilisateurs·trices : augmentation/diminution"
|
||||||
users-total: "ユーザーの積算"
|
users-total: "Nombre total des utilisateurs·rices"
|
||||||
drive: "ドライブ使用量の増減"
|
drive: "ドライブ使用量の増減"
|
||||||
drive-total: "ドライブ使用量の積算"
|
drive-total: "Utilisation totale du lecteur"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の積算"
|
drive-files-total: "Nombre total de fichiers sur le lecteur"
|
||||||
network-requests: "Requêtes"
|
network-requests: "Requêtes"
|
||||||
network-time: "Temps de réponse"
|
network-time: "Temps de réponse"
|
||||||
network-usage: "Traffic"
|
network-usage: "Traffic"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "utilisé"
|
used: "utilisé"
|
||||||
drive: "Drive"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
rename-folder: "Renommer le dossier"
|
rename-folder: "Renommer le dossier"
|
||||||
input-new-folder-name: "Entrer un nouveau nom"
|
input-new-folder-name: "Entrer un nouveau nom"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "Drive"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
load-more: "Afficher plus"
|
load-more: "Afficher plus"
|
||||||
@@ -666,10 +680,10 @@ desktop/views/components/note.vue:
|
|||||||
reposted-by: "Partagé par {}"
|
reposted-by: "Partagé par {}"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
renote: "Partager"
|
renote: "Partager"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "Ajouter votre réaction"
|
||||||
detail: "詳細"
|
detail: "Détails"
|
||||||
private: "この投稿は非公開です"
|
private: "Cette publication est privée"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "Cette publication a été supprimée"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "Échec du chargement."
|
error: "Échec du chargement."
|
||||||
retry: "Réessayer"
|
retry: "Réessayer"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
notification: "Notification"
|
notification: "Notification"
|
||||||
apps: "Applications"
|
apps: "Applications"
|
||||||
mute: "Mettre en sourdine"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "Drive"
|
blocking: "ブロック"
|
||||||
security: "Sécurité"
|
security: "Sécurité"
|
||||||
signin: "Historique de connexion"
|
signin: "Historique de connexion"
|
||||||
password: "Mot de Passe"
|
password: "Mot de Passe"
|
||||||
@@ -753,7 +767,7 @@ desktop/views/components/settings.vue:
|
|||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "Affichage et design"
|
display: "Affichage et design"
|
||||||
customize: "Personnaliser l'Accueil"
|
customize: "Personnaliser l'Accueil"
|
||||||
wallpaper: "壁紙"
|
wallpaper: "Arrière plan"
|
||||||
choose-wallpaper: "Sélectionner un fond d'écran"
|
choose-wallpaper: "Sélectionner un fond d'écran"
|
||||||
delete-wallpaper: "Supprimer le fond d'écran"
|
delete-wallpaper: "Supprimer le fond d'écran"
|
||||||
dark-mode: "Mode nuit"
|
dark-mode: "Mode nuit"
|
||||||
@@ -765,14 +779,14 @@ desktop/views/components/settings.vue:
|
|||||||
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
|
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
|
||||||
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
|
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
|
||||||
show-reply-target: "Afficher les réponses"
|
show-reply-target: "Afficher les réponses"
|
||||||
timeline: "タイムライン"
|
timeline: "Chronologie"
|
||||||
show-my-renotes: "Afficher mes republications dans le fil"
|
show-my-renotes: "Afficher mes republications dans le fil"
|
||||||
show-renoted-my-notes: "Afficher mes republications dans les fils"
|
show-renoted-my-notes: "Afficher mes republications dans les fils"
|
||||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
show-local-renotes: "Afficher les partages locaux sur les fils"
|
||||||
show-maps: "Afficher la carte"
|
show-maps: "Afficher la carte"
|
||||||
deck-column-align: "デッキのカラムの位置"
|
deck-column-align: "デッキのカラムの位置"
|
||||||
deck-column-align-center: "中央"
|
deck-column-align-center: "Centrer"
|
||||||
deck-column-align-left: "左"
|
deck-column-align-left: "À gauche"
|
||||||
sound: "Son"
|
sound: "Son"
|
||||||
enable-sounds: "Activer le son"
|
enable-sounds: "Activer le son"
|
||||||
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
|
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
|
||||||
@@ -813,7 +827,7 @@ desktop/views/components/settings.vue:
|
|||||||
tools: "Outils"
|
tools: "Outils"
|
||||||
task-manager: "Gestionnaire de tâches"
|
task-manager: "Gestionnaire de tâches"
|
||||||
third-parties: "Services tiers"
|
third-parties: "Services tiers"
|
||||||
navbar-position: "ナビゲーションバーの位置"
|
navbar-position: "Position de la barre de navigation"
|
||||||
navbar-position-top: "En haut"
|
navbar-position-top: "En haut"
|
||||||
navbar-position-left: "à gauche"
|
navbar-position-left: "à gauche"
|
||||||
navbar-position-right: "à droite"
|
navbar-position-right: "à droite"
|
||||||
@@ -835,26 +849,38 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "L'operation a été complétée avec succès!"
|
success: "L'operation a été complétée avec succès!"
|
||||||
failed: "L'operation a échoué. Veuillez vous assurer que le token a été entrer correctement."
|
failed: "L'operation a échoué. Veuillez vous assurer que le token a été entrer correctement."
|
||||||
info: "À partir de maintenant, à chaque fois que vous vous connecter entrez votre mot de passe ainsi que le token généré sur votre appareil."
|
info: "À partir de maintenant, à chaque fois que vous vous connecter entrez votre mot de passe ainsi que le token généré sur votre appareil."
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer."
|
regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer."
|
||||||
regenerate-token: "Regenerer le token"
|
regenerate-token: "Régénérer le jeton"
|
||||||
token: "Jeton :"
|
token: "Jeton :"
|
||||||
enter-password: "Veuillez entrer le mot de passe"
|
enter-password: "Entrez le mot de passe"
|
||||||
|
console:
|
||||||
|
title: 'Console API'
|
||||||
|
endpoint: 'Point de terminaison'
|
||||||
|
parameter: 'Paramètres'
|
||||||
|
send: 'Envoyer'
|
||||||
|
sending: 'Envoi en cours'
|
||||||
|
response: 'Résultat'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "Aucune application autorisée"
|
no-apps: "Aucune application autorisée"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "Maximum"
|
max: "Maximale"
|
||||||
in-use: "en cours d’utilisation"
|
in-use: "utilisé"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "Statistiques"
|
||||||
no-users: "Aucun utilisateurs mis en sourdine"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "Silencer / Bloquer"
|
||||||
reset: "Changer votre mot de passe"
|
mute: "Mettre en sourdine"
|
||||||
|
block: "En cours blocage"
|
||||||
|
no-muted-users: "Aucun utilisateur·rice n’est mis·e en sourdine"
|
||||||
|
no-blocked-users: "Aucun utilisateur·rice n’est bloqué·e"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
|
reset: "Modifier le mot de passe"
|
||||||
enter-current-password: "Entrez votre mot de passe actuel"
|
enter-current-password: "Entrez votre mot de passe actuel"
|
||||||
enter-new-password: "Entrez votre nouveau mot de passe"
|
enter-new-password: "Saisissez le nouveau mot de passe"
|
||||||
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
|
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
|
||||||
not-match: "Le nouveau mot de passe ne correspond pas."
|
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
||||||
changed: "Mot de passe modifié avec succès"
|
changed: "Mot de passe modifié avec succès"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "M."
|
adjective: "M."
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Votre profil"
|
profile: "Votre profil"
|
||||||
drive: "Drive"
|
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
lists: "Listes"
|
lists: "Listes"
|
||||||
follow-requests: "Demandes de suivi"
|
follow-requests: "Demandes de suivi"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
drive: "Drive"
|
instance: "Instance"
|
||||||
|
emoji: "Emoji"
|
||||||
users: "Utilisateur·rice·s"
|
users: "Utilisateur·rice·s"
|
||||||
update: "Mises à jour"
|
update: "Mise à jour"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "Annonces"
|
||||||
|
hashtags: "Hashtags"
|
||||||
|
back-to-misskey: "Retour vers Misskey"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
all-users: "Toutes les utilisateurrices"
|
accounts: "Comptes"
|
||||||
original-users: "Utilisateur·rice·s sur cette instance"
|
notes: "Notes"
|
||||||
all-notes: "Toutes les publications"
|
drive: "Lecteur"
|
||||||
original-notes: "Publications sur cette instance"
|
instances: "Instances"
|
||||||
invite: "Invitation"
|
this-instance: "Cette instance"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
federated: "Fédérées"
|
||||||
|
invite: "Inviter"
|
||||||
|
banner-url: "URL de la bannière"
|
||||||
|
disableRegistration: "Désactiver l’enregistrement de nouveaux utilisateur·rice·s"
|
||||||
|
disableLocalTimeline: "Désactiver le fil local"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "Graph"
|
||||||
|
per-day: "par jour"
|
||||||
|
per-hour: "par heure"
|
||||||
|
federation: "Fédération"
|
||||||
|
notes: "Publications"
|
||||||
|
users: "Utilisateur·rice·s"
|
||||||
|
drive: "Lecteur"
|
||||||
|
network: "Réseau"
|
||||||
|
charts:
|
||||||
|
federation-instances: "Nombre d’instances : augmentation/diminution"
|
||||||
|
federation-instances-total: "Nombre total d’instances"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "Total des publications"
|
||||||
|
users: "Nombre d’utilisateur·rice·s : augmentation/diminution"
|
||||||
|
users-total: "Nombre total des utilisateur·rice·s"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "Utilisation totale du lecteur"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "Nombre total de fichiers sur le lecteur"
|
||||||
|
network-requests: "Requêtes"
|
||||||
|
network-time: "Temps de réponse"
|
||||||
|
network-usage: "Traffic"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "Suspendre un·e utilisateur·rice"
|
suspend-user: "Suspendre un·e utilisateur·rice"
|
||||||
suspend: "Suspendre"
|
suspend: "Suspendre"
|
||||||
suspended: "Suspendu avec succès"
|
suspended: "Suspendu·e avec succès."
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "Lever la suspension d’utilisateur·rice·s"
|
unsuspend-user: "Lever la suspension d’utilisateur·rice·s"
|
||||||
unsuspend: "Suspension levée"
|
unsuspend: "Suspension levée"
|
||||||
unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès"
|
unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "Paramètres de vérification du compte utilisateur"
|
verify-user: "Paramètres de vérification du compte utilisateur"
|
||||||
verify: "Vérification du compte"
|
verify: "公式アカウントにする"
|
||||||
verified: "Le compte a été vérifié"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "Ôter la vérification du compte"
|
unverify: "Ôter la vérification du compte"
|
||||||
unverified: "Ce compte n'est pas vérifié"
|
unverified: "Ce compte n'est plus vérifié"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "Ajouter un émoji"
|
||||||
|
name: "Nom de l’émoji"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "Aliases"
|
||||||
|
aliases-desc: "Vous pouvez définir plus d’un, séparés par des espaces."
|
||||||
|
url: "URL de l’image"
|
||||||
|
add: "Ajouter"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "Annonces"
|
||||||
|
save: "Enregistrer"
|
||||||
|
remove: "Supprimer"
|
||||||
|
add: "Ajouter"
|
||||||
|
title: "Titre"
|
||||||
|
text: "Contenu"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Tags cachés"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Les publications médias uniquement"
|
is-media-only: "Les publications médias uniquement"
|
||||||
is-media-view: "Vue média"
|
is-media-view: "Vue média"
|
||||||
edit: "Options"
|
edit: "Options"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
pinned-notes: "ピン留めされた投稿"
|
posts: "Publications"
|
||||||
|
following: "Suit"
|
||||||
|
followers: "Abonné·e·s"
|
||||||
|
images: "Images"
|
||||||
|
activity: "Activité"
|
||||||
|
timeline: "Chronologie"
|
||||||
|
pinned-notes: "Publications épinglées"
|
||||||
|
push-to-a-list: "Ajouter à la liste"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "Toutes les utilisateurrices"
|
all-users: "Toutes les utilisateurrices"
|
||||||
original-users: "Utilisateur·rice·s sur cette instance"
|
original-users: "Utilisateur·rice·s sur cette instance"
|
||||||
@@ -1008,10 +1093,7 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "Pas d'utilisateurs"
|
no-users: "Pas d'utilisateurs"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "Ce compte a été suspendu."
|
is-suspended: "Ce compte a été suspendu."
|
||||||
is-remote: "Cet utilisateur n'est pas un utilisateur Misskey. Certaines informations peuvent ne pas refléter ce profil dans sa totalité."
|
last-used-at: "Actif·ive pour la dernière fois"
|
||||||
view-remote: "Consulter le profil complet"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "Last used at"
|
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "Photos"
|
title: "Photos"
|
||||||
loading: "Chargement en cours"
|
loading: "Chargement en cours"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "Mettre en sourdine"
|
mute: "Mettre en sourdine"
|
||||||
muted: "Muting"
|
muted: "Muting"
|
||||||
unmute: "Enlever la sourdine"
|
unmute: "Enlever la sourdine"
|
||||||
|
block: "Bloquer"
|
||||||
|
unblock: "Débloquer"
|
||||||
|
block-confirm: "Bloquer cet utilisateur ?"
|
||||||
push-to-a-list: "Ajouter à la liste"
|
push-to-a-list: "Ajouter à la liste"
|
||||||
list-pushed: "Vous avez ajouté {user} à la liste {list}."
|
list-pushed: "Vous avez ajouté {user} à la liste {list}."
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "Suit"
|
following: "Suit"
|
||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
is-bot: "Ce compte est un Bot"
|
is-bot: "Ce compte est un Bot"
|
||||||
|
years-old: "ans d’âge"
|
||||||
|
year: "Année"
|
||||||
|
month: "Mois"
|
||||||
|
day: "Jour"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "Publications"
|
default: "Publications"
|
||||||
with-replies: "Publications et réponses"
|
with-replies: "Publications et réponses"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "Afficher d'autres"
|
refresh: "Afficher d'autres"
|
||||||
no-one: "Personne"
|
no-one: "Personne"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "Drive"
|
|
||||||
used: "utilisé"
|
used: "utilisé"
|
||||||
folder-count: "Dossier(s)"
|
folder-count: "Dossier(s)"
|
||||||
count-separator: ", "
|
count-separator: ", "
|
||||||
@@ -1090,8 +1178,8 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
nsfw: "CW"
|
nsfw: "CW"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "Marquer comme sensible"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "Le contenu est NSFW"
|
sensitive: "Le contenu est NSFW"
|
||||||
click-to-show: "Cliquer pour afficher"
|
click-to-show: "Cliquer pour afficher"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "Messages"
|
messaging: "Messages"
|
||||||
follow-requests: "Demandes d'abonnement"
|
follow-requests: "Demandes d'abonnement"
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
drive: "Drive"
|
|
||||||
favorites: "Favoris"
|
favorites: "Favoris"
|
||||||
user-lists: "Listes"
|
user-lists: "Listes"
|
||||||
widgets: "Modules"
|
widgets: "Modules"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "Listes"
|
title: "Listes"
|
||||||
enter-list-name: "Nom de la liste"
|
enter-list-name: "Nom de la liste"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Drive"
|
|
||||||
more: "Afficher plus ..."
|
more: "Afficher plus ..."
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "Votre compte est prêt ! 📦"
|
lets-start: "Votre compte est prêt ! 📦"
|
||||||
@@ -1253,8 +1339,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Fil d'actualité"
|
timeline: "Fil d'actualité"
|
||||||
show-reply-target: "Afficher les réponses"
|
show-reply-target: "Afficher les réponses"
|
||||||
show-my-renotes: "Afficher mes republications"
|
show-my-renotes: "Afficher mes republications"
|
||||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
show-renoted-my-notes: "Afficher mes publications partagées"
|
||||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
show-local-renotes: "Afficher les publications partagées localement"
|
||||||
post-style: "Style de la publication"
|
post-style: "Style de la publication"
|
||||||
post-style-standard: "Standard"
|
post-style-standard: "Standard"
|
||||||
post-style-smart: "Intelligent"
|
post-style-smart: "Intelligent"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "Déconnexion"
|
signout: "Déconnexion"
|
||||||
sound: "Sons"
|
sound: "Sons"
|
||||||
enable-sounds: "Activer les sons"
|
enable-sounds: "Activer les sons"
|
||||||
|
mark-as-read-all-unread-notes: "Marquer toutes les publications comme lues"
|
||||||
|
password: "Mot de Passe"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Vous suit"
|
follows-you: "Vous suit"
|
||||||
following: "Abonnements"
|
following: "Abonnements"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "Fil d'actualité"
|
timeline: "Fil d'actualité"
|
||||||
media: "Media"
|
media: "Media"
|
||||||
is-suspended: "This account has been suspended."
|
is-suspended: "This account has been suspended."
|
||||||
is-remote: "Ceci est le profil d’un utilisateur·rice distant·e. Certaines informations peuvent ne pas refléter ce profil dans sa totalité."
|
mute: "Mettre en sourdine"
|
||||||
view-remote: "Consulter son profil complet"
|
unmute: "Enlever la sourdine"
|
||||||
|
block: "Bloquer"
|
||||||
|
unblock: "Débloquer"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Notes récentes"
|
recent-notes: "Notes récentes"
|
||||||
images: "Images"
|
images: "Images"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "Description"
|
description: "Description"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Gestion des applications"
|
manage-apps: "Gestion des applications"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "Gestion des applications"
|
||||||
|
create-app: "Créer une app"
|
||||||
|
app-missing: "Aucune application"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "Création d’une application"
|
||||||
|
app-name: "Nom de l’application"
|
||||||
|
app-name-desc: "Le nom de votre application"
|
||||||
|
app-name-ex: "p. ex. Misskey pour iOS"
|
||||||
|
app-overview: "Description courte de l’application"
|
||||||
|
app-desc: "Brève description introductive à votre application."
|
||||||
|
app-desc-ex: "p. ex) Misskey pour iOS"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "Autorisations "
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "Afficher les informations du compte"
|
||||||
|
account-write: "Modifications des informations du compte"
|
||||||
|
note-write: "Publications."
|
||||||
|
reaction-write: "Ajout et suppression de réactions."
|
||||||
|
following-write: "S’abonner et se désabonner."
|
||||||
|
drive-read: "Lecture du Drive."
|
||||||
|
drive-write: "Téléversement/suppression des fichiers de votre Lecteur."
|
||||||
|
notification-read: "Lire vos notifications."
|
||||||
|
notification-write: "Gestion de vos notifications."
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}年前"
|
years_ago: "{}年前"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -835,21 +849,33 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ common:
|
|||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
|
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
|
drive: "ドライブ"
|
||||||
|
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
@@ -130,9 +131,14 @@ common:
|
|||||||
show-full-acct: "ユーザー名のホストを省略しない"
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
|
use-os-default-emojis: "OS標準の絵文字を使用"
|
||||||
|
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
|
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -195,6 +201,9 @@ common:
|
|||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -409,6 +418,7 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
signin-with-github: "GitHubでログイン"
|
||||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
|
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
@@ -452,6 +462,14 @@ common/views/components/twitter-setting.vue:
|
|||||||
connect: "Twitterと接続する"
|
connect: "Twitterと接続する"
|
||||||
disconnect: "切断する"
|
disconnect: "切断する"
|
||||||
|
|
||||||
|
common/views/components/github-setting.vue:
|
||||||
|
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
|
||||||
|
connected-to: "次のGitHubアカウントに接続されています"
|
||||||
|
detail: "詳細..."
|
||||||
|
reconnect: "再接続する"
|
||||||
|
connect: "GitHubと接続する"
|
||||||
|
disconnect: "切断する"
|
||||||
|
|
||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
waiting: "待機中"
|
waiting: "待機中"
|
||||||
|
|
||||||
@@ -591,29 +609,6 @@ desktop/views/components/calendar.vue:
|
|||||||
next: "次の月"
|
next: "次の月"
|
||||||
go: "クリックして時間遡行"
|
go: "クリックして時間遡行"
|
||||||
|
|
||||||
desktop/views/components/charts.vue:
|
|
||||||
title: "チャート"
|
|
||||||
per-day: "1日ごと"
|
|
||||||
per-hour: "1時間ごと"
|
|
||||||
notes: "投稿"
|
|
||||||
users: "ユーザー"
|
|
||||||
drive: "ドライブ"
|
|
||||||
network: "ネットワーク"
|
|
||||||
charts:
|
|
||||||
notes: "投稿の増減 (統合)"
|
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
|
||||||
notes-total: "投稿の積算"
|
|
||||||
users: "ユーザーの増減"
|
|
||||||
users-total: "ユーザーの積算"
|
|
||||||
drive: "ドライブ使用量の増減"
|
|
||||||
drive-total: "ドライブ使用量の積算"
|
|
||||||
drive-files: "ドライブのファイル数の増減"
|
|
||||||
drive-files-total: "ドライブのファイル数の積算"
|
|
||||||
network-requests: "リクエスト"
|
|
||||||
network-time: "応答時間"
|
|
||||||
network-usage: "通信量"
|
|
||||||
|
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
@@ -633,7 +628,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
|
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
drive: "ドライブ"
|
|
||||||
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
@@ -666,9 +660,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
|
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -826,8 +817,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -945,25 +936,38 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
credential-info: "「i」パラメータは自動で付与されます。"
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
|
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
|
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
|
stats: "統計"
|
||||||
|
|
||||||
desktop/views/components/settings.mute.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
|
||||||
desktop/views/components/settings.password.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -999,7 +1003,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
|
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -1052,53 +1055,157 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
invite: "招待"
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
admin/views/instance.vue:
|
||||||
|
instance: "インスタンス"
|
||||||
|
instance-name: "インスタンス名"
|
||||||
|
instance-description: "インスタンスの紹介"
|
||||||
|
banner-url: "バナー画像URL"
|
||||||
|
languages: "インスタンスの対象言語"
|
||||||
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
|
maintainer-config: "管理者情報"
|
||||||
|
maintainer-name: "管理者名"
|
||||||
|
maintainer-email: "管理者の連絡先"
|
||||||
|
drive-config: "ドライブの設定"
|
||||||
|
cache-remote-files: "リモートのファイルをキャッシュする"
|
||||||
|
cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
|
||||||
|
local-drive-capacity-mb: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
|
remote-drive-capacity-mb: "リモートユーザーひとりあたりのドライブ容量"
|
||||||
|
mb: "メガバイト単位"
|
||||||
|
recaptcha-config: "reCAPTCHAの設定"
|
||||||
|
recaptcha-info: "reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。"
|
||||||
|
enable-recaptcha: "reCAPTCHAを有効にする"
|
||||||
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
|
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
||||||
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
|
github-integration-config: "GitHub連携の設定"
|
||||||
|
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
||||||
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
|
github-integration-client-id: "Client ID"
|
||||||
|
github-integration-client-secret: "Client secret"
|
||||||
|
proxy-account-config: "プロキシアカウントの設定"
|
||||||
|
proxy-account-info: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。"
|
||||||
|
proxy-account-username: "プロキシアカウントのユーザー名"
|
||||||
|
proxy-account-username-desc: "プロキシとして使用するアカウントのユーザー名を指定してください。"
|
||||||
|
proxy-account-warn: "アカウントは自動で作られないため、そのユーザー名のアカウントを予め作成しておく必要があります。"
|
||||||
|
max-note-text-length: "投稿の最大文字数"
|
||||||
|
disable-registration: "ユーザー登録の受付を停止する"
|
||||||
|
disable-local-timeline: "ローカルタイムラインを無効にする"
|
||||||
|
invite: "招待"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存しました"
|
||||||
|
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
info: "50KB以下のPNG画像をおすすめします。"
|
||||||
|
added: "絵文字を登録しました"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
updated: "更新しました"
|
||||||
|
remove-emoji:
|
||||||
|
are-you-sure: "「$1」を削除しますか?"
|
||||||
|
removed: "削除しました"
|
||||||
|
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
saved: "保存しました"
|
||||||
|
_remove:
|
||||||
|
are-you-sure: "「$1」を削除しますか?"
|
||||||
|
removed: "削除しました"
|
||||||
|
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
|
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
|
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
|
||||||
all-users: "全てのユーザー"
|
|
||||||
original-users: "このインスタンスのユーザー"
|
|
||||||
all-notes: "全ての投稿"
|
|
||||||
original-notes: "このインスタンスの投稿"
|
|
||||||
|
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
@@ -1159,10 +1266,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
|
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
|
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
@@ -1178,6 +1281,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
|
|
||||||
@@ -1186,6 +1292,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
|
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
@@ -1224,7 +1334,6 @@ desktop/views/widgets/users.vue:
|
|||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
|
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1348,7 +1457,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1376,7 +1484,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
|
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
|
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
@@ -1481,6 +1588,10 @@ mobile/views/pages/settings.vue:
|
|||||||
twitter-connect: "Twitterアカウントに接続する"
|
twitter-connect: "Twitterアカウントに接続する"
|
||||||
twitter-reconnect: "再接続する"
|
twitter-reconnect: "再接続する"
|
||||||
twitter-disconnect: "切断する"
|
twitter-disconnect: "切断する"
|
||||||
|
github: "GitHub連携"
|
||||||
|
github-connect: "GitHubアカウントに接続する"
|
||||||
|
github-reconnect: "再接続する"
|
||||||
|
github-disconnect: "切断する"
|
||||||
update: "Misskey Update"
|
update: "Misskey Update"
|
||||||
version: "バージョン:"
|
version: "バージョン:"
|
||||||
latest-version: "最新のバージョン:"
|
latest-version: "最新のバージョン:"
|
||||||
@@ -1494,6 +1605,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
|
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
@@ -1504,8 +1617,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
@@ -1559,3 +1674,31 @@ docs:
|
|||||||
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "さいなら"
|
close: "さいなら"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: "あかん、やってもうたわ… (致命的なエラー"
|
||||||
|
update-browser-os: "ブラウザ(またはOS)のバージョン更新してくれへん?なおるかもしれんわ。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "それでもあかん?せやったら syuilotan@yahoo.co.jp に連絡してや!"
|
||||||
|
thanks: "Thank you おおきに。Misskey"
|
||||||
got-it: "ほい"
|
got-it: "ほい"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}年前"
|
years_ago: "{}年前"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -115,9 +124,12 @@ common:
|
|||||||
reduce-motion: "UI、動き過ぎや、静かにしてや"
|
reduce-motion: "UI、動き過ぎや、静かにしてや"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: '開発ビルドや。本番環境で使わんといて!知らんで!'
|
do-not-use-in-production: '開発ビルドや。本番環境で使わんといて!知らんで!'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "ちゃんとした情報見せてや!"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が起こったわ'
|
||||||
retry: 'やり直す'
|
retry: 'もっぺん'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "おあいこ"
|
drawn: "おあいこ"
|
||||||
my-turn: "あんさんのターンや"
|
my-turn: "あんさんのターンや"
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "名前を変更や!"
|
rename: "名前を変更や!"
|
||||||
stack-left: "左に重ねんで!"
|
stack-left: "左に重ねんで!"
|
||||||
pop-right: "右に出すで!"
|
pop-right: "右に出すで!"
|
||||||
|
dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
|
||||||
|
ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?"
|
share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?"
|
||||||
permission-ask: "このアプリは次の権限を要求してんで:"
|
permission-ask: "このアプリは次の権限を要求してんで:"
|
||||||
@@ -428,16 +442,16 @@ common/views/components/profile-editor.vue:
|
|||||||
birthday: "誕生日"
|
birthday: "誕生日"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
is-cat: "このアカウントはCatです"
|
is-cat: "このアカウントはCatやで"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotやで"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "他人のフォローは許可してからや!"
|
||||||
careful-bot: "Botからのフォローだけ承認制にする"
|
careful-bot: "Botからのフォローだけは許可制や"
|
||||||
advanced: "その他"
|
advanced: "その他"
|
||||||
privacy: "プライバシー"
|
privacy: "プライバシーってなんや?オカンの年齢か?"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存したで"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロードしとります"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "これアップロードでけへんわ"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "見てみるわ…"
|
fetching: "見てみるわ…"
|
||||||
no-broadcasts: "お知らせはあらへんで"
|
no-broadcasts: "お知らせはあらへんで"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減(統合)"
|
notes: "投稿の増減(統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "そうする"
|
ok: "そうする"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使うとる"
|
used: "使うとる"
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変えるで"
|
rename: "名前を変えるで"
|
||||||
rename-folder: "フォルダ名を変えるで"
|
rename-folder: "フォルダ名を変えるで"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してや"
|
input-new-folder-name: "新しいフォルダ名を入力してや"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっとあらへんのか!"
|
load-more: "もっとあらへんのか!"
|
||||||
@@ -664,12 +678,12 @@ desktop/views/components/note-detail.vue:
|
|||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返す"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
detail: "詳細"
|
detail: "もっと"
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "あかん、読み込めへんわ"
|
error: "あかん、読み込めへんわ"
|
||||||
retry: "もっぺん"
|
retry: "もっぺん"
|
||||||
@@ -728,9 +742,9 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "守護神セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "こんな感じでサインインしたらしいで"
|
signin: "こんな感じでサインインしたらしいで"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
2fa: "二段階認証"
|
2fa: "二段階認証"
|
||||||
@@ -749,7 +763,7 @@ desktop/views/components/settings.vue:
|
|||||||
api-via-stream: "ストリームを経由したAPIリクエスト"
|
api-via-stream: "ストリームを経由したAPIリクエスト"
|
||||||
api-via-stream-desc: "この設定をオンにすると、WebSocket接続を経由してAPIリクエストが行われんで(パフォーマンス向上するかも、知らんけど)。オフにすると、ネイティブの fetch API が利用されるで。この設定はこのデバイスのみ有効やで。"
|
api-via-stream-desc: "この設定をオンにすると、WebSocket接続を経由してAPIリクエストが行われんで(パフォーマンス向上するかも、知らんけど)。オフにすると、ネイティブの fetch API が利用されるで。この設定はこのデバイスのみ有効やで。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "デッキをデフォルトのUIにする"
|
||||||
display: "見た感じ"
|
display: "見た感じ"
|
||||||
customize: "ホームをカスタマイズ"
|
customize: "ホームをカスタマイズ"
|
||||||
@@ -771,7 +785,7 @@ desktop/views/components/settings.vue:
|
|||||||
show-local-renotes: "ローカル投稿のRenoteも見たいんや"
|
show-local-renotes: "ローカル投稿のRenoteも見たいんや"
|
||||||
show-maps: "地図勝手にバァーって開いてくれ"
|
show-maps: "地図勝手にバァーって開いてくれ"
|
||||||
deck-column-align: "デッキのカラムの位置"
|
deck-column-align: "デッキのカラムの位置"
|
||||||
deck-column-align-center: "中央"
|
deck-column-align-center: "真ん中"
|
||||||
deck-column-align-left: "左"
|
deck-column-align-left: "左"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンド鳴らす"
|
enable-sounds: "サウンド鳴らす"
|
||||||
@@ -835,25 +849,37 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了したで!"
|
success: "設定が完了したで!"
|
||||||
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
|
failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。"
|
||||||
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
|
info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」っちゅうキーでパラメータに付加してリクエストしてや。"
|
intro: "API使うんやったらこのトークンを「i」っちゅうパラメータにくっつけてリクエストできるで。"
|
||||||
caution: "アカウントを不正利用されるかも知れんから、このトークンは第三者に教えたらあかんで(アプリなどにも入力しんといてな)。"
|
caution: "アカウント勝手にいじられるかも知れんから、このトークンは教えたらあかんし、アプリにも書いたらあかんで(これはフリちゃうで)"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたとかその可能性があったらトークンを再生成できるで。"
|
regeneration-of-token: "トークン漏れてもうたんやったらもっかい生成できるで。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンもっかい生成"
|
||||||
token: "トークン:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してや"
|
enter-password: "パスワードを入れてや"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送る'
|
||||||
|
sending: '応答待っとる'
|
||||||
|
response: 'こんなん返ってきたわ'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはあらへんで"
|
no-apps: "連携しているアプリケーションはあらへんで"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使うとる"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはおらんで"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
reset: "パスワードを変更する"
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしとるユーザーはおらんで"
|
||||||
|
no-blocked-users: "ブロックしとるユーザーはおらんで"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
|
reset: "パスワード変える"
|
||||||
enter-current-password: "今のパスワードを入れてや"
|
enter-current-password: "今のパスワードを入れてや"
|
||||||
enter-new-password: "さらのパスワード入れてや"
|
enter-new-password: "こんどのパスワード入れてや"
|
||||||
enter-new-password-again: "もういっぺんさらのパスワードを入れてや"
|
enter-new-password-again: "もっぺん入れてや"
|
||||||
not-match: "パスワードがおうとらん"
|
not-match: "パスワードがおうとらん"
|
||||||
changed: "パスワード変えたわ"
|
changed: "パスワード変えたわ"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "はん"
|
adjective: "はん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー許してくれや!言うてみる"
|
follow-requests: "フォロー許してくれや!言うてみる"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "さいなら"
|
close: "さいなら"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "知っといてや"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "知り合い全員や"
|
accounts: "アカウント"
|
||||||
original-users: "ここの人らだけ"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "ワイのインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "来てや"
|
invite: "来てや"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減(統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結したで"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除したで"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしたで"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify-user: "ユーザーの公式アカウントにせーへん"
|
unverify: "公式アカウントを解除する"
|
||||||
unverify: "公式アカウントにはさせへんで"
|
unverified: "公式アカウントを解除しました"
|
||||||
unverified: "公式アカウントを解除したで"
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿だけや"
|
is-media-only: "メディア投稿だけや"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
pinned-notes: "ピン留めされた投稿"
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "やっとること"
|
||||||
|
timeline: "タイムライン"
|
||||||
|
pinned-notes: "ピン留めしはった投稿"
|
||||||
|
push-to-a-list: "リストに入れたる"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "ここの人らだけ"
|
original-users: "ここの人らだけ"
|
||||||
@@ -1008,10 +1093,7 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よう話すツレは居らん"
|
no-users: "よう話すツレは居らん"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーはあかんわ。凍結されとる。"
|
is-suspended: "このユーザーはあかんわ。凍結されとる。"
|
||||||
is-remote: "このユーザーはリモートユーザーや。"
|
last-used-at: "最後いつ来はった?"
|
||||||
view-remote: "ちゃんとした情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最後いつ来た?"
|
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "写真"
|
title: "写真"
|
||||||
loading: "読み込んどります"
|
loading: "読み込んどります"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしとるで"
|
muted: "ミュートしとるで"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加したで。"
|
list-pushed: "{user}を{list}に追加したで。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotや"
|
is-bot: "このアカウントはBotや"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "おらん!"
|
no-one: "おらん!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使うとる"
|
used: "使うとる"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1090,8 +1178,8 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ(md5)"
|
hash: "ハッシュ(md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
nsfw: "ちょっと見せられへんわ"
|
nsfw: "ちょっと見せられへんわ"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "見たらあかん感じにしとく"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "見たらあかんで"
|
sensitive: "見たらあかんで"
|
||||||
click-to-show: "押してみ、見せたるわ"
|
click-to-show: "押してみ、見せたるわ"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー許してくれや!言うてみる"
|
follow-requests: "フォロー許してくれや!言うてみる"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してや"
|
enter-list-name: "リスト名を入力してや"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっとあるやろ!"
|
more: "もっとあるやろ!"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めようや"
|
lets-start: "📦 始めようや"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "さいなら"
|
signout: "さいなら"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンド鳴らす"
|
enable-sounds: "サウンド鳴らす"
|
||||||
|
mark-as-read-all-unread-notes: "全部もう読んだわ"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされとるで"
|
follows-you: "フォローされとるで"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーはあかんわ。凍結されとる。"
|
is-suspended: "このユーザーはあかんわ。凍結されとる。"
|
||||||
is-remote: "このユーザーは東京とかそこらへんのリモートユーザーや。"
|
mute: "ミュート"
|
||||||
view-remote: "ちゃんとした情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロックやめたる"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近儲かりまっか?"
|
recent-notes: "最近儲かりまっか?"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作る"
|
||||||
|
app-missing: "アプリあらへん"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーション作る"
|
||||||
|
app-name: "アプリケーションの名前"
|
||||||
|
app-name-desc: "あんたのアプリの名前。"
|
||||||
|
app-name-ex: "ex) 関西ミスキー保安協会"
|
||||||
|
app-overview: "このアプリどんなん?"
|
||||||
|
app-desc: "あんたのアプリどんなんか教えて"
|
||||||
|
app-desc-ex: "ex) 関西人なら誰でも口ずさめるこのCMがついにMisskeyへ。"
|
||||||
|
callback-url: "コールバックURL (無くてもええで)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した後どこに連れてくかを設定できるで"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
||||||
|
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
||||||
|
account-read: "アカウントの情報見せて"
|
||||||
|
account-write: "アカウントの情報いじらせて"
|
||||||
|
note-write: "投稿させて"
|
||||||
|
reaction-write: "リアクションしたりそれをキャンセルさせて"
|
||||||
|
following-write: "フォローとかフォロー解除させて"
|
||||||
|
drive-read: "ドライブ見せて"
|
||||||
|
drive-write: "ドライブいじらせて"
|
||||||
|
notification-read: "通知見せて"
|
||||||
|
notification-write: "通知いじらせて"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "앱의 연계"
|
application-authorization: "앱의 연계"
|
||||||
close: "닫기"
|
close: "닫기"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "알았습니다"
|
got-it: "알았습니다"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "사용자 정의 팁"
|
title: "사용자 정의 팁"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}년전"
|
years_ago: "{}년전"
|
||||||
month-and-day: "{month}월 {day}일"
|
month-and-day: "{month}월 {day}일"
|
||||||
trash: "휴지통"
|
trash: "휴지통"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "일"
|
sunday: "일"
|
||||||
monday: "월"
|
monday: "월"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "이 장치만"
|
this-setting-is-this-device-only: "이 장치만"
|
||||||
do-not-use-in-production: '이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오.'
|
do-not-use-in-production: '이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오.'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "이름 변경"
|
rename: "이름 변경"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -835,21 +849,33 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}jaar geleden"
|
years_ago: "{}jaar geleden"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Z"
|
sunday: "Z"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "Oké"
|
ok: "Oké"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "gebruikt"
|
used: "gebruikt"
|
||||||
drive: "Drive"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Gebruikersafbeelding"
|
avatar: "Gebruikersafbeelding"
|
||||||
banner: "Omslagfoto"
|
banner: "Omslagfoto"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Naam wijzigen"
|
rename: "Naam wijzigen"
|
||||||
rename-folder: "Mapnaam wijzigen"
|
rename-folder: "Mapnaam wijzigen"
|
||||||
input-new-folder-name: "Voer een nieuwe naam in"
|
input-new-folder-name: "Voer een nieuwe naam in"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "Drive"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Zoeken"
|
search: "Zoeken"
|
||||||
load-more: "Meer laden"
|
load-more: "Meer laden"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "Profiel"
|
profile: "Profiel"
|
||||||
notification: "Melding"
|
notification: "Melding"
|
||||||
apps: "Apps"
|
apps: "Apps"
|
||||||
mute: "Dempen"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "Drive"
|
blocking: "ブロック"
|
||||||
security: "Beveiliging"
|
security: "Beveiliging"
|
||||||
signin: "Inloggeschiedenis"
|
signin: "Inloggeschiedenis"
|
||||||
password: "Wachtwoord"
|
password: "Wachtwoord"
|
||||||
@@ -835,27 +849,39 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Instellen voltooid!"
|
success: "Instellen voltooid!"
|
||||||
failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
|
failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
|
||||||
info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
|
info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "Als je toegang wilt tot de API, stel deze sleutel dan in als 'i' bij de verzoekparameters."
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "Laat deze sleutel niet zien aan derde partijen (en voer hem nergens anders in dan hier), anders kan je account gehackt worden."
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "Mocht deze sleutel tóch uitlekken, dan kun je hem opnieuw genereren."
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "Sleutel opnieuw genereren"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Sleutel:"
|
token: "Token:"
|
||||||
enter-password: "Voer je wachtwoord in"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "Geen gedempte gebruikers"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
reset: "Wachtwoord wijzigen"
|
mute: "ミュート"
|
||||||
enter-current-password: "Voer je huidige wachtwoord in"
|
block: "ブロック"
|
||||||
enter-new-password: "Voer je nieuwe wachtwoord in"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
enter-new-password-again: "Voer je nieuwe wachtwoord nogmaals in"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
not-match: "Het nieuwe wachtwoord komt niet overeen"
|
common/views/components/password-settings.vue:
|
||||||
changed: "Wachtwoord bijgewerkt"
|
reset: "パスワードを変更する"
|
||||||
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
|
not-match: "新しいパスワードが一致しません"
|
||||||
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Je profiel"
|
profile: "Je profiel"
|
||||||
drive: "Drive"
|
|
||||||
favorites: "Favorieten"
|
favorites: "Favorieten"
|
||||||
lists: "Lijsten"
|
lists: "Lijsten"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "Uitvouwen"
|
popout: "Uitvouwen"
|
||||||
close: "Sluiten"
|
close: "Sluiten"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,10 +1093,7 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "Geen gebruikers"
|
no-users: "Geen gebruikers"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
last-used-at: "最終アクセス"
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "Laatst actief: "
|
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "Foto's"
|
title: "Foto's"
|
||||||
loading: "Bezig met laden"
|
loading: "Bezig met laden"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "Dempen"
|
mute: "Dempen"
|
||||||
muted: "Dempend"
|
muted: "Dempend"
|
||||||
unmute: "Ontdempen"
|
unmute: "Ontdempen"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "Berichten"
|
default: "Berichten"
|
||||||
with-replies: "Berichten en antwoorden"
|
with-replies: "Berichten en antwoorden"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "Anderen tonen"
|
refresh: "Anderen tonen"
|
||||||
no-one: "Niemand"
|
no-one: "Niemand"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "Drive"
|
|
||||||
used: "gebruikt"
|
used: "gebruikt"
|
||||||
folder-count: "Map(pen)"
|
folder-count: "Map(pen)"
|
||||||
count-separator: ", "
|
count-separator: ", "
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "Gesprekken"
|
messaging: "Gesprekken"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "Zoeken"
|
search: "Zoeken"
|
||||||
drive: "Drive"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Drive"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "Uitloggen"
|
signout: "Uitloggen"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Volgt jou"
|
follows-you: "Volgt jou"
|
||||||
following: "Volgend"
|
following: "Volgend"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "Tijdlijn"
|
timeline: "Tijdlijn"
|
||||||
media: "Media"
|
media: "Media"
|
||||||
is-suspended: "Dit account is geschorst."
|
is-suspended: "Dit account is geschorst."
|
||||||
is-remote: "Deze gebruiker is een externe gebruiker; de informatie is daarom niet volledig. "
|
mute: "ミュート"
|
||||||
view-remote: "Volledige informatie bekijken"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Recente notities"
|
recent-notes: "Recente notities"
|
||||||
images: "Afbeeldingen"
|
images: "Afbeeldingen"
|
||||||
@@ -1306,7 +1396,7 @@ mobile/views/pages/user/home.vue:
|
|||||||
domains: "Domeinnamen"
|
domains: "Domeinnamen"
|
||||||
frequently-replied-users: "Frequent gesproken gebruikers"
|
frequently-replied-users: "Frequent gesproken gebruikers"
|
||||||
followers-you-know: "Volgers die je kent"
|
followers-you-know: "Volgers die je kent"
|
||||||
last-used-at: "Laatst actief:"
|
last-used-at: "Laatst actief"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
loading: "Bezig met laden"
|
loading: "Bezig met laden"
|
||||||
no-users: "Geen gebruikers"
|
no-users: "Geen gebruikers"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "Omschrijving"
|
description: "Omschrijving"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "Skjønner!"
|
got-it: "Skjønner!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{} år siden"
|
years_ago: "{} år siden"
|
||||||
month-and-day: "{day}/{month}"
|
month-and-day: "{day}/{month}"
|
||||||
trash: "Papirkurv"
|
trash: "Papirkurv"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "S"
|
sunday: "S"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "Endre navn"
|
rename: "Endre navn"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "Til høyre"
|
pop-right: "Til høyre"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "Diagrammer"
|
title: "Diagrammer"
|
||||||
per-day: "per dag"
|
per-day: "per dag"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "Innlegg"
|
notes: "Innlegg"
|
||||||
users: "Brukere"
|
users: "Brukere"
|
||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "Ok"
|
ok: "Ok"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "brukt"
|
used: "brukt"
|
||||||
drive: "Disk"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Endre navn"
|
rename: "Endre navn"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "Disk"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Søk"
|
search: "Søk"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "Notifikasjon"
|
notification: "Notifikasjon"
|
||||||
apps: "Apper"
|
apps: "Apper"
|
||||||
mute: "Demp"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "Disk"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "Passord"
|
password: "Passord"
|
||||||
@@ -835,21 +849,33 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "Maks"
|
max: "容量"
|
||||||
in-use: "I bruk"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "-san"
|
adjective: "-san"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "Disk"
|
|
||||||
favorites: "Favoritter"
|
favorites: "Favoritter"
|
||||||
lists: "Lister"
|
lists: "Lister"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "Disk"
|
instance: "インスタンス"
|
||||||
users: "Brukere"
|
emoji: "カスタム絵文字"
|
||||||
update: "Oppdater"
|
users: "ユーザー"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
update: "更新"
|
||||||
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
invite: "Inviter"
|
this-instance: "このインスタンス"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
federated: "連合"
|
||||||
|
invite: "招待"
|
||||||
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "Suspender"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "Bilder"
|
title: "Bilder"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "Følger"
|
following: "Følger"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "Innlegg"
|
default: "Innlegg"
|
||||||
with-replies: "Innlegg og svar"
|
with-replies: "Innlegg og svar"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "Oppdater"
|
refresh: "Oppdater"
|
||||||
no-one: "Ingen"
|
no-one: "Ingen"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "Disk"
|
|
||||||
used: "brukt"
|
used: "brukt"
|
||||||
folder-count: "Mappe(r)"
|
folder-count: "Mappe(r)"
|
||||||
count-separator: ","
|
count-separator: ","
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "Meldinger"
|
messaging: "Meldinger"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "Søk"
|
search: "Søk"
|
||||||
drive: "Disk"
|
|
||||||
favorites: "Favoritter"
|
favorites: "Favoritter"
|
||||||
user-lists: "Lister"
|
user-lists: "Lister"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "Lister"
|
title: "Lister"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Disk"
|
|
||||||
more: "Vis mer"
|
more: "Vis mer"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "Lyder"
|
sound: "Lyder"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "Følger"
|
following: "Følger"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "Media"
|
media: "Media"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Nylige innlegg"
|
recent-notes: "Nylige innlegg"
|
||||||
images: "Bilder"
|
images: "Bilder"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "Beskrivelse"
|
description: "Beskrivelse"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "Zamknij"
|
close: "Zamknij"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "Rozumiem!"
|
got-it: "Rozumiem!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Wskazówki o dostosowywaniu"
|
title: "Wskazówki o dostosowywaniu"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{} lat temu"
|
years_ago: "{} lat temu"
|
||||||
month-and-day: "{month}-{day}"
|
month-and-day: "{month}-{day}"
|
||||||
trash: "Kosz"
|
trash: "Kosz"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "N"
|
sunday: "N"
|
||||||
monday: "Pn"
|
monday: "Pn"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
stack-left: "Przypnij do lewej"
|
stack-left: "Przypnij do lewej"
|
||||||
pop-right: "Odepnij w prawo"
|
pop-right: "Odepnij w prawo"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
|
share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
|
||||||
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "wykorzystane"
|
used: "wykorzystane"
|
||||||
drive: "Dysk"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Awatar"
|
avatar: "Awatar"
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
@@ -593,8 +609,6 @@ 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ę"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "Dysk"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
load-more: "Załaduj więcej"
|
load-more: "Załaduj więcej"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
notification: "Powiadomienia"
|
notification: "Powiadomienia"
|
||||||
apps: "Aplikacje"
|
apps: "Aplikacje"
|
||||||
mute: "Wyciszanie"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "Dysk"
|
blocking: "ブロック"
|
||||||
security: "Bezpieczeństwo"
|
security: "Bezpieczeństwo"
|
||||||
signin: "Historia logowań"
|
signin: "Historia logowań"
|
||||||
password: "Hasło"
|
password: "Hasło"
|
||||||
@@ -835,27 +849,39 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Pomyślnie ukończono konfigurację!"
|
success: "Pomyślnie ukończono konfigurację!"
|
||||||
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
||||||
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "Wygeneruj nowy token"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Wprowadź hasło"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "Brak zautoryzowanych aplikacji"
|
no-apps: "Brak zautoryzowanych aplikacji"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "Maksymalnie"
|
max: "容量"
|
||||||
in-use: " w użyciu."
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "Brak wyciszonych użytkowników"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
reset: "Zmień hasło"
|
mute: "ミュート"
|
||||||
enter-current-password: "Wprowadź obecne hasło"
|
block: "ブロック"
|
||||||
enter-new-password: "Wprowadź nowe hasło"
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
enter-new-password-again: "Wprowadź ponownie nowe hasło"
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
not-match: "Nowe hasła nie pasują do siebie"
|
common/views/components/password-settings.vue:
|
||||||
changed: "Pomyślnie zmieniono hasło"
|
reset: "パスワードを変更する"
|
||||||
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
|
not-match: "新しいパスワードが一致しません"
|
||||||
|
changed: "パスワードを変更しました"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/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"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Twój profil"
|
profile: "Twój profil"
|
||||||
drive: "Dysk"
|
|
||||||
favorites: "Ulubione"
|
favorites: "Ulubione"
|
||||||
lists: "Listy"
|
lists: "Listy"
|
||||||
follow-requests: "Prośby o śledzenie"
|
follow-requests: "Prośby o śledzenie"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
close: "Zamknij"
|
close: "Zamknij"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
||||||
is-media-view: "Widok multimediów"
|
is-media-view: "Widok multimediów"
|
||||||
edit: "Opcje"
|
edit: "Opcje"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,10 +1093,7 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "Brak użytkowników"
|
no-users: "Brak użytkowników"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "To konto zostało zawieszone."
|
is-suspended: "To konto zostało zawieszone."
|
||||||
is-remote: "To jest użytkownik zdalnej instancji, informacje mogą nie być w pełni dokładne."
|
last-used-at: "最終アクセス"
|
||||||
view-remote: "Wyświetl dokładne informacje"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "Ostatnio aktywny: "
|
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "Zdjęcia"
|
title: "Zdjęcia"
|
||||||
loading: "Ładowanie"
|
loading: "Ładowanie"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "Wycisz"
|
mute: "Wycisz"
|
||||||
muted: "Wyciszyłeś"
|
muted: "Wyciszyłeś"
|
||||||
unmute: "Cofnij wyciszenie"
|
unmute: "Cofnij wyciszenie"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "Dodaj do listy"
|
push-to-a-list: "Dodaj do listy"
|
||||||
list-pushed: "Dodałeś(-aś) {user} do {list}."
|
list-pushed: "Dodałeś(-aś) {user} do {list}."
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
followers: "Śledzący"
|
followers: "Śledzący"
|
||||||
is-bot: "To konto jest botem"
|
is-bot: "To konto jest botem"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "Wpisy"
|
default: "Wpisy"
|
||||||
with-replies: "Wpisy i odpowiedzi"
|
with-replies: "Wpisy i odpowiedzi"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "Pokaż innych"
|
refresh: "Pokaż innych"
|
||||||
no-one: "Pusto"
|
no-one: "Pusto"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "Dysk"
|
|
||||||
used: "użyto"
|
used: "użyto"
|
||||||
folder-count: "Katalog(i)"
|
folder-count: "Katalog(i)"
|
||||||
count-separator: ", "
|
count-separator: ", "
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "Wiadomości"
|
messaging: "Wiadomości"
|
||||||
follow-requests: "Prośby o śledzenie"
|
follow-requests: "Prośby o śledzenie"
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
drive: "Dysk"
|
|
||||||
favorites: "Ulubione"
|
favorites: "Ulubione"
|
||||||
user-lists: "Listy"
|
user-lists: "Listy"
|
||||||
widgets: "Widżety"
|
widgets: "Widżety"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "Listy"
|
title: "Listy"
|
||||||
enter-list-name: "Wprowadź nazwę listy"
|
enter-list-name: "Wprowadź nazwę listy"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Dysk"
|
|
||||||
more: "Załaduj więcej"
|
more: "Załaduj więcej"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "Rozpocznijmy! 📦"
|
lets-start: "Rozpocznijmy! 📦"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "Wyloguj"
|
signout: "Wyloguj"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Śledzi Cię"
|
follows-you: "Śledzi Cię"
|
||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
media: "Multimedia"
|
media: "Multimedia"
|
||||||
is-suspended: "To konto zostało zablokowane"
|
is-suspended: "To konto zostało zablokowane"
|
||||||
is-remote: "To jest użytkownik zdalnej instancji, informacje mogą nie być w pełni dokładne."
|
mute: "ミュート"
|
||||||
view-remote: "Wyświetl dokładne informacje"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Ostatnie wpisy"
|
recent-notes: "Ostatnie wpisy"
|
||||||
images: "Zdjęcia"
|
images: "Zdjęcia"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "Opis"
|
description: "Opis"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Zarządzaj aplikacjami"
|
manage-apps: "Zarządzaj aplikacjami"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ 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."
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "Entendi!"
|
got-it: "Entendi!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Dicas de personalização"
|
title: "Dicas de personalização"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{} ano(s) atrás"
|
years_ago: "{} ano(s) atrás"
|
||||||
month-and-day: "{day}/{month}"
|
month-and-day: "{day}/{month}"
|
||||||
trash: "Lixo"
|
trash: "Lixo"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Dom"
|
sunday: "Dom"
|
||||||
monday: "Seg"
|
monday: "Seg"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "Renomear"
|
rename: "Renomear"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "Acoplar à direita"
|
pop-right: "Acoplar à direita"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
|
share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?"
|
||||||
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -835,21 +849,33 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
|
users: "ユーザー"
|
||||||
|
update: "更新"
|
||||||
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
|
dashboard: "ダッシュボード"
|
||||||
|
accounts: "アカウント"
|
||||||
|
notes: "投稿"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
users: "Usuários"
|
instances: "インスタンス"
|
||||||
update: "Actualizações"
|
this-instance: "このインスタンス"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
federated: "連合"
|
||||||
dashboard: "ダッシュボード"
|
|
||||||
all-users: "Todos os usuários"
|
|
||||||
original-users: "このインスタンスのユーザー"
|
|
||||||
all-notes: "全ての投稿"
|
|
||||||
original-notes: "このインスタンスの投稿"
|
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "Sair"
|
signout: "Sair"
|
||||||
sound: "Sons"
|
sound: "Sons"
|
||||||
enable-sounds: "Ativar sons"
|
enable-sounds: "Ativar sons"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Te segue"
|
follows-you: "Te segue"
|
||||||
following: "Seguindo"
|
following: "Seguindo"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "Linha do tempo"
|
timeline: "Linha do tempo"
|
||||||
media: "Mídia"
|
media: "Mídia"
|
||||||
is-suspended: "Esta conta foi suspensa"
|
is-suspended: "Esta conta foi suspensa"
|
||||||
is-remote: "Este é uma usuário remoto. O perfil que vê aqui pode não estar completo."
|
mute: "ミュート"
|
||||||
view-remote: "Ver o perfil completo."
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Notas recentes"
|
recent-notes: "Notas recentes"
|
||||||
images: "Imagens"
|
images: "Imagens"
|
||||||
@@ -1306,7 +1396,7 @@ mobile/views/pages/user/home.vue:
|
|||||||
domains: "Domínios"
|
domains: "Domínios"
|
||||||
frequently-replied-users: "Perguntas frequentes"
|
frequently-replied-users: "Perguntas frequentes"
|
||||||
followers-you-know: "Seguidores que você conhece"
|
followers-you-know: "Seguidores que você conhece"
|
||||||
last-used-at: "Ativo pela última vez:"
|
last-used-at: "Ativo pela última vez"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
loading: "Carregando"
|
loading: "Carregando"
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "Descrição"
|
description: "Descrição"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Gerenciar aplicativos"
|
manage-apps: "Gerenciar aplicativos"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}年前"
|
years_ago: "{}年前"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -835,21 +849,33 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ common:
|
|||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
|
BSoD:
|
||||||
|
fatal-error: ":( 致命的な問題が発生しました。"
|
||||||
|
update-browser-os: "お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。"
|
||||||
|
error-code: "エラーコード"
|
||||||
|
browser-version: "ブラウザ バージョン"
|
||||||
|
client-version: "クライアント バージョン"
|
||||||
|
email-support: "問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。"
|
||||||
|
thanks: "Thank you for using Misskey."
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -54,6 +62,7 @@ common:
|
|||||||
years_ago: "{}年前"
|
years_ago: "{}年前"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}月 {day}日"
|
||||||
trash: "ゴミ箱"
|
trash: "ゴミ箱"
|
||||||
|
drive: "ドライブ"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -115,6 +124,9 @@ common:
|
|||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
|
view-on-remote: "正確な情報を見る"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: '問題が発生しました'
|
||||||
retry: 'やり直す'
|
retry: 'やり直す'
|
||||||
@@ -173,6 +185,8 @@ common:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねる"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -529,11 +543,14 @@ desktop/views/components/charts.vue:
|
|||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
per-hour: "1時間ごと"
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
network: "ネットワーク"
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
remote-notes: "投稿の増減 (リモート)"
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
@@ -563,7 +580,6 @@ desktop/views/components/crop-window.vue:
|
|||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
@@ -593,8 +609,6 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
|
||||||
drive: "ドライブ"
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
@@ -728,8 +742,8 @@ desktop/views/components/settings.vue:
|
|||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
apps: "アプリ"
|
apps: "アプリ"
|
||||||
mute: "ミュート"
|
mute-and-block: "ミュート/ブロック"
|
||||||
drive: "ドライブ"
|
blocking: "ブロック"
|
||||||
security: "セキュリティ"
|
security: "セキュリティ"
|
||||||
signin: "サインイン履歴"
|
signin: "サインイン履歴"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -835,21 +849,33 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
desktop/views/components/settings.api.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
console:
|
||||||
|
title: 'APIコンソール'
|
||||||
|
endpoint: 'エンドポイント'
|
||||||
|
parameter: 'パラメータ'
|
||||||
|
send: '送信'
|
||||||
|
sending: '応答待ち'
|
||||||
|
response: '結果'
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.drive.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "中"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
desktop/views/components/settings.mute.vue:
|
stats: "統計"
|
||||||
no-users: "ミュートしているユーザーはいません"
|
common/views/components/mute-and-block.vue:
|
||||||
desktop/views/components/settings.password.vue:
|
mute-and-block: "ミュートとブロック"
|
||||||
|
mute: "ミュート"
|
||||||
|
block: "ブロック"
|
||||||
|
no-muted-users: "ミュートしているユーザーはいません"
|
||||||
|
no-blocked-users: "ブロックしているユーザーはいません"
|
||||||
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "パスワードを変更する"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
@@ -880,7 +906,6 @@ desktop/views/components/ui.header.vue:
|
|||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
@@ -922,40 +947,100 @@ desktop/views/components/users-list-item.vue:
|
|||||||
desktop/views/components/window.vue:
|
desktop/views/components/window.vue:
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/admin/admin.vue:
|
admin/views/index.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
instance: "インスタンス"
|
||||||
|
emoji: "カスタム絵文字"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
announcements: "お知らせ"
|
||||||
|
hashtags: "ハッシュタグ"
|
||||||
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
accounts: "アカウント"
|
||||||
original-users: "このインスタンスのユーザー"
|
notes: "投稿"
|
||||||
all-notes: "全ての投稿"
|
drive: "ドライブ"
|
||||||
original-notes: "このインスタンスの投稿"
|
instances: "インスタンス"
|
||||||
|
this-instance: "このインスタンス"
|
||||||
|
federated: "連合"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
banner-url: "Banner URL"
|
||||||
|
disableRegistration: "Disable new user registration"
|
||||||
|
disableLocalTimeline: "Disable the local timeline"
|
||||||
|
admin/views/charts.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1日ごと"
|
||||||
|
per-hour: "1時間ごと"
|
||||||
|
federation: "フェデレーション"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
|
charts:
|
||||||
|
federation-instances: "インスタンスの増減"
|
||||||
|
federation-instances-total: "インスタンスの積算"
|
||||||
|
notes: "投稿の増減 (統合)"
|
||||||
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
|
remote-notes: "投稿の増減 (リモート)"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
drive: "ドライブ使用量の増減"
|
||||||
|
drive-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブのファイル数の増減"
|
||||||
|
drive-files-total: "ドライブのファイル数の積算"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
desktop/views/pages/admin/admin.verify-user.vue:
|
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
desktop/views/pages/admin/admin.unverify-user.vue:
|
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
admin/views/emoji.vue:
|
||||||
|
add-emoji:
|
||||||
|
title: "絵文字の登録"
|
||||||
|
name: "絵文字名"
|
||||||
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
|
aliases: "エイリアス"
|
||||||
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
|
url: "絵文字画像URL"
|
||||||
|
add: "追加"
|
||||||
|
emojis:
|
||||||
|
title: "絵文字一覧"
|
||||||
|
update: "更新"
|
||||||
|
remove: "削除"
|
||||||
|
admin/views/announcements.vue:
|
||||||
|
announcements: "お知らせ"
|
||||||
|
save: "保存"
|
||||||
|
remove: "削除"
|
||||||
|
add: "追加"
|
||||||
|
title: "タイトル"
|
||||||
|
text: "内容"
|
||||||
|
admin/views/hashtags.vue:
|
||||||
|
hided-tags: "Hidden Tags"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
desktop/views/pages/deck/deck.user-column.vue:
|
desktop/views/pages/deck/deck.user-column.vue:
|
||||||
|
posts: "投稿"
|
||||||
|
following: "フォロー"
|
||||||
|
followers: "フォロワー"
|
||||||
|
images: "画像"
|
||||||
|
activity: "アクティビティ"
|
||||||
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
push-to-a-list: "リストに追加"
|
||||||
desktop/views/pages/stats/stats.vue:
|
desktop/views/pages/stats/stats.vue:
|
||||||
all-users: "全てのユーザー"
|
all-users: "全てのユーザー"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
@@ -1008,9 +1093,6 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "よく話すユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
|
||||||
view-remote: "正確な情報を見る"
|
|
||||||
desktop/views/pages/user/user.home.vue:
|
|
||||||
last-used-at: "最終アクセス"
|
last-used-at: "最終アクセス"
|
||||||
desktop/views/pages/user/user.photos.vue:
|
desktop/views/pages/user/user.photos.vue:
|
||||||
title: "フォト"
|
title: "フォト"
|
||||||
@@ -1024,6 +1106,9 @@ desktop/views/pages/user/user.profile.vue:
|
|||||||
mute: "ミュートする"
|
mute: "ミュートする"
|
||||||
muted: "ミュートしています"
|
muted: "ミュートしています"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロックする"
|
||||||
|
unblock: "ブロック解除"
|
||||||
|
block-confirm: "このユーザーをブロックしますか?"
|
||||||
push-to-a-list: "リストに追加"
|
push-to-a-list: "リストに追加"
|
||||||
list-pushed: "{user}を{list}に追加しました。"
|
list-pushed: "{user}を{list}に追加しました。"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
@@ -1031,6 +1116,10 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
|
years-old: "歳"
|
||||||
|
year: "年"
|
||||||
|
month: "月"
|
||||||
|
day: "日"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
@@ -1060,7 +1149,6 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "他を見る"
|
refresh: "他を見る"
|
||||||
no-one: "いません!"
|
no-one: "いません!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
folder-count: "フォルダ"
|
folder-count: "フォルダ"
|
||||||
count-separator: "、"
|
count-separator: "、"
|
||||||
@@ -1164,7 +1252,6 @@ mobile/views/components/ui.nav.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
user-lists: "リスト"
|
user-lists: "リスト"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
@@ -1187,7 +1274,6 @@ mobile/views/pages/user-lists.vue:
|
|||||||
title: "リスト"
|
title: "リスト"
|
||||||
enter-list-name: "リスト名を入力してください"
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
|
||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
mobile/views/pages/signup.vue:
|
mobile/views/pages/signup.vue:
|
||||||
lets-start: "📦 始めましょう"
|
lets-start: "📦 始めましょう"
|
||||||
@@ -1287,6 +1373,8 @@ mobile/views/pages/settings.vue:
|
|||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
mark-as-read-all-unread-notes: "すべての投稿を既読にする"
|
||||||
|
password: "パスワード"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@@ -1296,8 +1384,10 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
media: "メディア"
|
media: "メディア"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "このユーザーは凍結されています。"
|
||||||
is-remote: "このユーザーはリモートユーザーです。"
|
mute: "ミュート"
|
||||||
view-remote: "正確な情報を見る"
|
unmute: "ミュート解除"
|
||||||
|
block: "ブロック"
|
||||||
|
unblock: "ブロック解除"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "最近の投稿"
|
recent-notes: "最近の投稿"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
@@ -1343,3 +1433,29 @@ docs:
|
|||||||
description: "説明"
|
description: "説明"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "アプリを管理"
|
||||||
|
create-app: "アプリ作成"
|
||||||
|
app-missing: "アプリなし"
|
||||||
|
dev/views/new-app.vue:
|
||||||
|
create-app: "アプリケーションの作成"
|
||||||
|
app-name: "アプリケーション名"
|
||||||
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
|
app-name-ex: "ex) Misskey for iOS"
|
||||||
|
app-overview: "アプリの概要"
|
||||||
|
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
|
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||||
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
|
authority: "権限"
|
||||||
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
|
account-read: "アカウントの情報を見る。"
|
||||||
|
account-write: "アカウントの情報を操作する。"
|
||||||
|
note-write: "投稿する。"
|
||||||
|
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
||||||
|
following-write: "フォローしたりフォロー解除する。"
|
||||||
|
drive-read: "ドライブを見る。"
|
||||||
|
drive-write: "ドライブを操作する。"
|
||||||
|
notification-read: "通知を見る。"
|
||||||
|
notification-write: "通知を操作する。"
|
||||||
|
|||||||
67
package.json
67
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.29.0",
|
"version": "10.44.2",
|
||||||
"clientVersion": "1.0.10801",
|
"clientVersion": "1.0.11630",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -20,10 +20,11 @@
|
|||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.6",
|
"@fortawesome/fontawesome-svg-core": "1.2.8",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.4.1",
|
"@fortawesome/free-brands-svg-icons": "5.5.0",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.4.1",
|
"@fortawesome/free-regular-svg-icons": "5.5.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.4.1",
|
"@fortawesome/free-solid-svg-icons": "5.5.0",
|
||||||
|
"@fortawesome/vue-fontawesome": "0.1.2",
|
||||||
"@koa/cors": "2.2.2",
|
"@koa/cors": "2.2.2",
|
||||||
"@prezzemolo/rap": "0.1.2",
|
"@prezzemolo/rap": "0.1.2",
|
||||||
"@prezzemolo/zip": "0.0.3",
|
"@prezzemolo/zip": "0.0.3",
|
||||||
@@ -52,29 +53,30 @@
|
|||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "3.0.1",
|
"@types/koa-mount": "3.0.1",
|
||||||
"@types/koa-multer": "1.0.0",
|
"@types/koa-multer": "1.0.0",
|
||||||
"@types/koa-router": "7.0.32",
|
"@types/koa-router": "7.0.33",
|
||||||
"@types/koa-send": "4.1.1",
|
"@types/koa-send": "4.1.1",
|
||||||
"@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/minio": "7.0.0",
|
"@types/minio": "7.0.0",
|
||||||
"@types/mkdirp": "0.5.2",
|
"@types/mkdirp": "0.5.2",
|
||||||
"@types/mocha": "5.2.3",
|
"@types/mocha": "5.2.5",
|
||||||
"@types/mongodb": "3.1.12",
|
"@types/mongodb": "3.1.12",
|
||||||
"@types/ms": "0.7.30",
|
"@types/ms": "0.7.30",
|
||||||
"@types/node": "10.12.0",
|
"@types/node": "10.12.2",
|
||||||
|
"@types/oauth": "0.9.1",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.3.0",
|
"@types/qrcode": "1.3.0",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.7",
|
"@types/redis": "2.8.7",
|
||||||
"@types/request": "2.47.1",
|
"@types/request": "2.48.1",
|
||||||
"@types/request-promise-native": "1.0.15",
|
"@types/request-promise-native": "1.0.15",
|
||||||
"@types/rimraf": "2.0.2",
|
"@types/rimraf": "2.0.2",
|
||||||
"@types/seedrandom": "2.4.27",
|
"@types/seedrandom": "2.4.27",
|
||||||
"@types/sharp": "0.21.0",
|
"@types/sharp": "0.21.0",
|
||||||
"@types/showdown": "1.7.5",
|
"@types/showdown": "1.7.5",
|
||||||
"@types/single-line-log": "1.1.0",
|
"@types/single-line-log": "1.1.0",
|
||||||
"@types/speakeasy": "2.0.2",
|
"@types/speakeasy": "2.0.3",
|
||||||
"@types/systeminformation": "3.23.0",
|
"@types/systeminformation": "3.23.0",
|
||||||
"@types/tinycolor2": "1.4.1",
|
"@types/tinycolor2": "1.4.1",
|
||||||
"@types/tmp": "0.0.33",
|
"@types/tmp": "0.0.33",
|
||||||
@@ -84,36 +86,34 @@
|
|||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.1",
|
||||||
"animejs": "2.2.0",
|
"animejs": "2.2.0",
|
||||||
|
"apexcharts": "2.1.9",
|
||||||
"autobind-decorator": "2.1.0",
|
"autobind-decorator": "2.1.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bee-queue": "1.2.2",
|
"bee-queue": "1.2.2",
|
||||||
"bootstrap-vue": "2.0.0-rc.11",
|
"bootstrap-vue": "2.0.0-rc.11",
|
||||||
"cafy": "11.3.0",
|
"cafy": "12.0.0",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chai-http": "4.2.0",
|
"chai-http": "4.2.0",
|
||||||
"chalk": "2.4.1",
|
"chalk": "2.4.1",
|
||||||
"chart.js": "2.7.3",
|
|
||||||
"commander": "2.19.0",
|
"commander": "2.19.0",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "1.0.0",
|
"css-loader": "1.0.1",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "3.0.3",
|
||||||
"debug": "4.1.0",
|
"debug": "4.1.0",
|
||||||
"deep-equal": "1.0.1",
|
"deep-equal": "1.0.1",
|
||||||
"deepcopy": "0.6.3",
|
"deepcopy": "0.6.3",
|
||||||
"diskusage": "0.2.5",
|
"diskusage": "0.2.5",
|
||||||
"dompurify": "1.0.5",
|
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"elasticsearch": "15.1.1",
|
"elasticsearch": "15.2.0",
|
||||||
"emojilib": "2.3.0",
|
"emojilib": "2.3.0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "5.0.1",
|
"eslint": "5.8.0",
|
||||||
"eslint-plugin-vue": "4.7.1",
|
"eslint-plugin-vue": "4.7.1",
|
||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "3.1.0",
|
||||||
"exif-js": "2.3.0",
|
|
||||||
"file-loader": "2.0.0",
|
"file-loader": "2.0.0",
|
||||||
"file-type": "10.0.0",
|
"file-type": "10.4.0",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "3.9.1",
|
"gulp": "3.9.1",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
@@ -130,17 +130,16 @@
|
|||||||
"gulp-uglify": "3.0.1",
|
"gulp-uglify": "3.0.1",
|
||||||
"gulp-util": "3.0.8",
|
"gulp-util": "3.0.8",
|
||||||
"hard-source-webpack-plugin": "0.12.0",
|
"hard-source-webpack-plugin": "0.12.0",
|
||||||
"highlight.js": "9.12.0",
|
"html-minifier": "3.5.21",
|
||||||
"html-minifier": "3.5.20",
|
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.1.1",
|
"insert-text-at-cursor": "0.1.1",
|
||||||
"is-root": "2.0.0",
|
"is-root": "2.0.0",
|
||||||
"is-url": "1.2.4",
|
"is-url": "1.2.4",
|
||||||
"js-yaml": "3.12.0",
|
"js-yaml": "3.12.0",
|
||||||
"jsdom": "12.2.0",
|
"jsdom": "13.0.0",
|
||||||
"json5": "2.1.0",
|
"json5": "2.1.0",
|
||||||
"json5-loader": "1.0.1",
|
"json5-loader": "1.0.1",
|
||||||
"koa": "2.5.1",
|
"koa": "2.6.1",
|
||||||
"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",
|
||||||
@@ -153,7 +152,6 @@
|
|||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "6.1.4",
|
"koa-views": "6.1.4",
|
||||||
"loader-utils": "1.1.0",
|
"loader-utils": "1.1.0",
|
||||||
"lodash.assign": "4.2.0",
|
|
||||||
"mecab-async": "0.1.2",
|
"mecab-async": "0.1.2",
|
||||||
"merge-options": "1.0.1",
|
"merge-options": "1.0.1",
|
||||||
"minio": "7.0.1",
|
"minio": "7.0.1",
|
||||||
@@ -176,7 +174,7 @@
|
|||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
"pug": "2.0.3",
|
"pug": "2.0.3",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
"qrcode": "1.3.0",
|
"qrcode": "1.3.2",
|
||||||
"ratelimiter": "3.2.0",
|
"ratelimiter": "3.2.0",
|
||||||
"recaptcha-promise": "0.1.3",
|
"recaptcha-promise": "0.1.3",
|
||||||
"reconnecting-websocket": "4.1.10",
|
"reconnecting-websocket": "4.1.10",
|
||||||
@@ -199,27 +197,25 @@
|
|||||||
"stylus": "0.54.5",
|
"stylus": "0.54.5",
|
||||||
"stylus-loader": "3.0.2",
|
"stylus-loader": "3.0.2",
|
||||||
"summaly": "2.2.0",
|
"summaly": "2.2.0",
|
||||||
"systeminformation": "3.45.7",
|
"systeminformation": "3.45.9",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"tinycolor2": "1.4.1",
|
"tinycolor2": "1.4.1",
|
||||||
"tmp": "0.0.33",
|
"tmp": "0.0.33",
|
||||||
"ts-loader": "4.4.1",
|
"ts-loader": "5.3.0",
|
||||||
"ts-node": "7.0.1",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.10.0",
|
"tslint": "5.10.0",
|
||||||
"typescript": "2.9.2",
|
"typescript": "3.1.6",
|
||||||
"typescript-eslint-parser": "20.0.0",
|
"typescript-eslint-parser": "20.1.1",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "1.1.2",
|
||||||
"uuid": "3.3.2",
|
"uuid": "3.3.2",
|
||||||
"v-animate-css": "0.0.2",
|
"v-animate-css": "0.0.2",
|
||||||
"vue": "2.5.17",
|
"vue": "2.5.17",
|
||||||
"vue-chartjs": "3.4.0",
|
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.0",
|
||||||
"vue-content-loading": "1.5.3",
|
"vue-content-loading": "1.5.3",
|
||||||
"vue-cropperjs": "2.2.2",
|
"vue-cropperjs": "2.2.2",
|
||||||
"vue-js-modal": "1.3.26",
|
"vue-js-modal": "1.3.26",
|
||||||
"vue-json-tree-view": "2.1.4",
|
|
||||||
"vue-loader": "15.4.2",
|
"vue-loader": "15.4.2",
|
||||||
"vue-router": "3.0.1",
|
"vue-router": "3.0.1",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
@@ -232,17 +228,10 @@
|
|||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.3",
|
"web-push": "3.3.3",
|
||||||
"webfinger.js": "2.6.6",
|
"webfinger.js": "2.6.6",
|
||||||
"webpack": "4.21.0",
|
"webpack": "4.25.1",
|
||||||
"webpack-cli": "3.1.2",
|
"webpack-cli": "3.1.2",
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.28",
|
||||||
"ws": "6.1.0",
|
"ws": "6.1.0",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
|
||||||
"greenkeeper": {
|
|
||||||
"ignore": [
|
|
||||||
"deepcopy",
|
|
||||||
"cafy",
|
|
||||||
"@types/gulp"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
122
src/chart/drive.ts
Normal file
122
src/chart/drive.ts
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from './';
|
||||||
|
import DriveFile, { IDriveFile } from '../models/drive-file';
|
||||||
|
import { isLocalUser } from '../models/user';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ドライブに関するチャート
|
||||||
|
*/
|
||||||
|
type DriveLog = {
|
||||||
|
local: {
|
||||||
|
/**
|
||||||
|
* 集計期間時点での、全ドライブファイル数
|
||||||
|
*/
|
||||||
|
totalCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 集計期間時点での、全ドライブファイルの合計サイズ
|
||||||
|
*/
|
||||||
|
totalSize: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加したドライブファイル数
|
||||||
|
*/
|
||||||
|
incCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加したドライブ使用量
|
||||||
|
*/
|
||||||
|
incSize: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少したドライブファイル数
|
||||||
|
*/
|
||||||
|
decCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少したドライブ使用量
|
||||||
|
*/
|
||||||
|
decSize: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
remote: DriveLog['local'];
|
||||||
|
};
|
||||||
|
|
||||||
|
class DriveChart extends Chart<DriveLog> {
|
||||||
|
constructor() {
|
||||||
|
super('drive');
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: DriveLog): Promise<DriveLog> {
|
||||||
|
const calcSize = (local: boolean) => DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata._user.host': local ? null : { $ne: null },
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(res => res.length > 0 ? res[0].usage : 0);
|
||||||
|
|
||||||
|
const [localCount, remoteCount, localSize, remoteSize] = init ? await Promise.all([
|
||||||
|
DriveFile.count({ 'metadata._user.host': null }),
|
||||||
|
DriveFile.count({ 'metadata._user.host': { $ne: null } }),
|
||||||
|
calcSize(true),
|
||||||
|
calcSize(false)
|
||||||
|
]) : [
|
||||||
|
latest ? latest.local.totalCount : 0,
|
||||||
|
latest ? latest.remote.totalCount : 0,
|
||||||
|
latest ? latest.local.totalSize : 0,
|
||||||
|
latest ? latest.remote.totalSize : 0
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
local: {
|
||||||
|
totalCount: localCount,
|
||||||
|
totalSize: localSize,
|
||||||
|
incCount: 0,
|
||||||
|
incSize: 0,
|
||||||
|
decCount: 0,
|
||||||
|
decSize: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
totalCount: remoteCount,
|
||||||
|
totalSize: remoteSize,
|
||||||
|
incCount: 0,
|
||||||
|
incSize: 0,
|
||||||
|
decCount: 0,
|
||||||
|
decSize: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(file: IDriveFile, isAdditional: boolean) {
|
||||||
|
const update: Obj = {};
|
||||||
|
|
||||||
|
update.totalCount = isAdditional ? 1 : -1;
|
||||||
|
update.totalSize = isAdditional ? file.length : -file.length;
|
||||||
|
if (isAdditional) {
|
||||||
|
update.incCount = 1;
|
||||||
|
update.incSize = file.length;
|
||||||
|
} else {
|
||||||
|
update.decCount = 1;
|
||||||
|
update.decSize = file.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.inc({
|
||||||
|
[isLocalUser(file.metadata._user) ? 'local' : 'remote']: update
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new DriveChart();
|
||||||
66
src/chart/federation.ts
Normal file
66
src/chart/federation.ts
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from '.';
|
||||||
|
import Instance from '../models/instance';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* フェデレーションに関するチャート
|
||||||
|
*/
|
||||||
|
type FederationLog = {
|
||||||
|
instance: {
|
||||||
|
/**
|
||||||
|
* インスタンス数の合計
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加インスタンス数
|
||||||
|
*/
|
||||||
|
inc: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少インスタンス数
|
||||||
|
*/
|
||||||
|
dec: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class FederationChart extends Chart<FederationLog> {
|
||||||
|
constructor() {
|
||||||
|
super('federation');
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: FederationLog): Promise<FederationLog> {
|
||||||
|
const [total] = init ? await Promise.all([
|
||||||
|
Instance.count({})
|
||||||
|
]) : [
|
||||||
|
latest ? latest.instance.total : 0
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
instance: {
|
||||||
|
total: total,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(isAdditional: boolean) {
|
||||||
|
const update: Obj = {};
|
||||||
|
|
||||||
|
update.total = isAdditional ? 1 : -1;
|
||||||
|
if (isAdditional) {
|
||||||
|
update.inc = 1;
|
||||||
|
} else {
|
||||||
|
update.dec = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.inc({
|
||||||
|
instance: update
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new FederationChart();
|
||||||
56
src/chart/hashtag.ts
Normal file
56
src/chart/hashtag.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from './';
|
||||||
|
import { IUser, isLocalUser } from '../models/user';
|
||||||
|
import db from '../db/mongodb';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ハッシュタグに関するチャート
|
||||||
|
*/
|
||||||
|
type HashtagLog = {
|
||||||
|
local: {
|
||||||
|
/**
|
||||||
|
* 投稿された数
|
||||||
|
*/
|
||||||
|
count: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
remote: HashtagLog['local'];
|
||||||
|
};
|
||||||
|
|
||||||
|
class HashtagChart extends Chart<HashtagLog> {
|
||||||
|
constructor() {
|
||||||
|
super('hashtag', true);
|
||||||
|
|
||||||
|
// 後方互換性のため
|
||||||
|
db.get('chart.hashtag').findOne().then(doc => {
|
||||||
|
if (doc != null && doc.data.local == null) {
|
||||||
|
db.get('chart.hashtag').drop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: HashtagLog): Promise<HashtagLog> {
|
||||||
|
return {
|
||||||
|
local: {
|
||||||
|
count: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
count: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(hashtag: string, user: IUser) {
|
||||||
|
const update: Obj = {
|
||||||
|
count: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
await this.incIfUnique({
|
||||||
|
[isLocalUser(user) ? 'local' : 'remote']: update
|
||||||
|
}, 'users', user._id.toHexString(), hashtag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new HashtagChart();
|
||||||
324
src/chart/index.ts
Normal file
324
src/chart/index.ts
Normal file
@@ -0,0 +1,324 @@
|
|||||||
|
/**
|
||||||
|
* チャートエンジン
|
||||||
|
*/
|
||||||
|
|
||||||
|
const nestedProperty = require('nested-property');
|
||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import * as mongo from 'mongodb';
|
||||||
|
import db from '../db/mongodb';
|
||||||
|
import { ICollection } from 'monk';
|
||||||
|
|
||||||
|
export type Obj = { [key: string]: any };
|
||||||
|
|
||||||
|
export type Partial<T> = {
|
||||||
|
[P in keyof T]?: Partial<T[P]>;
|
||||||
|
};
|
||||||
|
|
||||||
|
type ArrayValue<T> = {
|
||||||
|
[P in keyof T]: T[P] extends number ? Array<T[P]> : ArrayValue<T[P]>;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Span = 'day' | 'hour';
|
||||||
|
|
||||||
|
type Log<T extends Obj> = {
|
||||||
|
_id: mongo.ObjectID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 集計のグループ
|
||||||
|
*/
|
||||||
|
group?: any;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 集計日時
|
||||||
|
*/
|
||||||
|
date: Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 集計期間
|
||||||
|
*/
|
||||||
|
span: Span;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* データ
|
||||||
|
*/
|
||||||
|
data: T;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ユニークインクリメント用
|
||||||
|
*/
|
||||||
|
unique?: Obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 様々なチャートの管理を司るクラス
|
||||||
|
*/
|
||||||
|
export default abstract class Chart<T> {
|
||||||
|
protected collection: ICollection<Log<T>>;
|
||||||
|
protected abstract async getTemplate(init: boolean, latest?: T, group?: any): Promise<T>;
|
||||||
|
|
||||||
|
constructor(name: string, grouped = false) {
|
||||||
|
this.collection = db.get<Log<T>>(`chart.${name}`);
|
||||||
|
if (grouped) {
|
||||||
|
this.collection.createIndex({ span: -1, date: -1, group: -1 }, { unique: true });
|
||||||
|
} else {
|
||||||
|
this.collection.createIndex({ span: -1, date: -1 }, { unique: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private convertQuery(x: Obj, path: string): Obj {
|
||||||
|
const query: Obj = {};
|
||||||
|
|
||||||
|
const dive = (x: Obj, path: string) => {
|
||||||
|
Object.entries(x).forEach(([k, v]) => {
|
||||||
|
const p = path ? `${path}.${k}` : k;
|
||||||
|
if (typeof v === 'number') {
|
||||||
|
query[p] = v;
|
||||||
|
} else {
|
||||||
|
dive(v, p);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
dive(x, path);
|
||||||
|
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private getCurrentDate(): [number, number, number, number] {
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
const y = now.getFullYear();
|
||||||
|
const m = now.getMonth();
|
||||||
|
const d = now.getDate();
|
||||||
|
const h = now.getHours();
|
||||||
|
|
||||||
|
return [y, m, d, h];
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private getLatestLog(span: Span, group?: any): Promise<Log<T>> {
|
||||||
|
return this.collection.findOne({
|
||||||
|
group: group,
|
||||||
|
span: span
|
||||||
|
}, {
|
||||||
|
sort: {
|
||||||
|
date: -1
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private async getCurrentLog(span: Span, group?: any): Promise<Log<T>> {
|
||||||
|
const [y, m, d, h] = this.getCurrentDate();
|
||||||
|
|
||||||
|
const current =
|
||||||
|
span == 'day' ? new Date(y, m, d) :
|
||||||
|
span == 'hour' ? new Date(y, m, d, h) :
|
||||||
|
null;
|
||||||
|
|
||||||
|
// 現在(今日または今のHour)のログ
|
||||||
|
const currentLog = await this.collection.findOne({
|
||||||
|
group: group,
|
||||||
|
span: span,
|
||||||
|
date: current
|
||||||
|
});
|
||||||
|
|
||||||
|
// ログがあればそれを返して終了
|
||||||
|
if (currentLog != null) {
|
||||||
|
return currentLog;
|
||||||
|
}
|
||||||
|
|
||||||
|
let log: Log<T>;
|
||||||
|
let data: T;
|
||||||
|
|
||||||
|
// 集計期間が変わってから、初めてのチャート更新なら
|
||||||
|
// 最も最近のログを持ってくる
|
||||||
|
// * 例えば集計期間が「日」である場合で考えると、
|
||||||
|
// * 昨日何もチャートを更新するような出来事がなかった場合は、
|
||||||
|
// * ログがそもそも作られずドキュメントが存在しないということがあり得るため、
|
||||||
|
// * 「昨日の」と決め打ちせずに「もっとも最近の」とします
|
||||||
|
const latest = await this.getLatestLog(span, group);
|
||||||
|
|
||||||
|
if (latest != null) {
|
||||||
|
// 空ログデータを作成
|
||||||
|
data = await this.getTemplate(false, latest.data);
|
||||||
|
} else {
|
||||||
|
// ログが存在しなかったら
|
||||||
|
// (Misskeyインスタンスを建てて初めてのチャート更新時など
|
||||||
|
// または何らかの理由でチャートコレクションを抹消した場合)
|
||||||
|
|
||||||
|
// 初期ログデータを作成
|
||||||
|
data = await this.getTemplate(true, null, group);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 新規ログ挿入
|
||||||
|
log = await this.collection.insert({
|
||||||
|
group: group,
|
||||||
|
span: span,
|
||||||
|
date: current,
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// 11000 is duplicate key error
|
||||||
|
// 並列動作している他のチャートエンジンプロセスと処理が重なる場合がある
|
||||||
|
// その場合は再度最も新しいログを持ってくる
|
||||||
|
if (e.code === 11000) {
|
||||||
|
log = await this.getLatestLog(span, group);
|
||||||
|
} else {
|
||||||
|
console.error(e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected commit(query: Obj, group?: any, uniqueKey?: string, uniqueValue?: string): void {
|
||||||
|
const update = (log: Log<T>) => {
|
||||||
|
// ユニークインクリメントの場合、指定のキーに指定の値が既に存在していたら弾く
|
||||||
|
if (
|
||||||
|
uniqueKey &&
|
||||||
|
log.unique &&
|
||||||
|
log.unique[uniqueKey] &&
|
||||||
|
log.unique[uniqueKey].includes(uniqueValue)
|
||||||
|
) return;
|
||||||
|
|
||||||
|
// ユニークインクリメントの指定のキーに値を追加
|
||||||
|
if (uniqueKey) {
|
||||||
|
query['$push'] = {
|
||||||
|
[`unique.${uniqueKey}`]: uniqueValue
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// ログ更新
|
||||||
|
this.collection.update({
|
||||||
|
_id: log._id
|
||||||
|
}, query);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getCurrentLog('day', group).then(log => update(log));
|
||||||
|
this.getCurrentLog('hour', group).then(log => update(log));
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected inc(inc: Partial<T>, group?: any): void {
|
||||||
|
this.commit({
|
||||||
|
$inc: this.convertQuery(inc, 'data')
|
||||||
|
}, group);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected incIfUnique(inc: Partial<T>, key: string, value: string, group?: any): void {
|
||||||
|
this.commit({
|
||||||
|
$inc: this.convertQuery(inc, 'data')
|
||||||
|
}, group, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async getChart(span: Span, range: number, group?: any): Promise<ArrayValue<T>> {
|
||||||
|
const promisedChart: Promise<T>[] = [];
|
||||||
|
|
||||||
|
const [y, m, d, h] = this.getCurrentDate();
|
||||||
|
|
||||||
|
const gt =
|
||||||
|
span == 'day' ? new Date(y, m, d - range) :
|
||||||
|
span == 'hour' ? new Date(y, m, d, h - range) :
|
||||||
|
null;
|
||||||
|
|
||||||
|
// ログ取得
|
||||||
|
let logs = await this.collection.find({
|
||||||
|
group: group,
|
||||||
|
span: span,
|
||||||
|
date: {
|
||||||
|
$gt: gt
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
sort: {
|
||||||
|
date: -1
|
||||||
|
},
|
||||||
|
fields: {
|
||||||
|
_id: 0
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 要求された範囲にログがひとつもなかったら
|
||||||
|
if (logs.length == 0) {
|
||||||
|
// もっとも新しいログを持ってくる
|
||||||
|
// (すくなくともひとつログが無いと隙間埋めできないため)
|
||||||
|
const recentLog = await this.collection.findOne({
|
||||||
|
group: group,
|
||||||
|
span: span
|
||||||
|
}, {
|
||||||
|
sort: {
|
||||||
|
date: -1
|
||||||
|
},
|
||||||
|
fields: {
|
||||||
|
_id: 0
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (recentLog) {
|
||||||
|
logs = [recentLog];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 整形
|
||||||
|
for (let i = (range - 1); i >= 0; i--) {
|
||||||
|
const current =
|
||||||
|
span == 'day' ? new Date(y, m, d - i) :
|
||||||
|
span == 'hour' ? new Date(y, m, d, h - i) :
|
||||||
|
null;
|
||||||
|
|
||||||
|
const log = logs.find(l => l.date.getTime() == current.getTime());
|
||||||
|
|
||||||
|
if (log) {
|
||||||
|
promisedChart.unshift(Promise.resolve(log.data));
|
||||||
|
} else {
|
||||||
|
// 隙間埋め
|
||||||
|
const latest = logs.find(l => l.date.getTime() < current.getTime());
|
||||||
|
promisedChart.unshift(this.getTemplate(false, latest ? latest.data : null));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const chart = await Promise.all(promisedChart);
|
||||||
|
|
||||||
|
const res: ArrayValue<T> = {} as any;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [{
|
||||||
|
* xxxxx: 1, yyyyy: 5
|
||||||
|
* }, {
|
||||||
|
* xxxxx: 2, yyyyy: 6
|
||||||
|
* }, {
|
||||||
|
* xxxxx: 3, yyyyy: 7
|
||||||
|
* }]
|
||||||
|
*
|
||||||
|
* を
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* xxxxx: [1, 2, 3],
|
||||||
|
* yyyyy: [5, 6, 7]
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* にする
|
||||||
|
*/
|
||||||
|
const dive = (x: Obj, path?: string) => {
|
||||||
|
Object.entries(x).forEach(([k, v]) => {
|
||||||
|
const p = path ? `${path}.${k}` : k;
|
||||||
|
if (typeof v == 'object') {
|
||||||
|
dive(v, p);
|
||||||
|
} else {
|
||||||
|
nestedProperty.set(res, p, chart.map(s => nestedProperty.get(s, p)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
dive(chart[0]);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
64
src/chart/network.ts
Normal file
64
src/chart/network.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Partial } from './';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ネットワークに関するチャート
|
||||||
|
*/
|
||||||
|
type NetworkLog = {
|
||||||
|
/**
|
||||||
|
* 受信したリクエスト数
|
||||||
|
*/
|
||||||
|
incomingRequests: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 送信したリクエスト数
|
||||||
|
*/
|
||||||
|
outgoingRequests: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 応答時間の合計
|
||||||
|
* TIP: (totalTime / incomingRequests) でひとつのリクエストに平均でどれくらいの時間がかかったか知れる
|
||||||
|
*/
|
||||||
|
totalTime: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合計受信データ量
|
||||||
|
*/
|
||||||
|
incomingBytes: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合計送信データ量
|
||||||
|
*/
|
||||||
|
outgoingBytes: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NetworkChart extends Chart<NetworkLog> {
|
||||||
|
constructor() {
|
||||||
|
super('network');
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: NetworkLog): Promise<NetworkLog> {
|
||||||
|
return {
|
||||||
|
incomingRequests: 0,
|
||||||
|
outgoingRequests: 0,
|
||||||
|
totalTime: 0,
|
||||||
|
incomingBytes: 0,
|
||||||
|
outgoingBytes: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(incomingRequests: number, time: number, incomingBytes: number, outgoingBytes: number) {
|
||||||
|
const inc: Partial<NetworkLog> = {
|
||||||
|
incomingRequests: incomingRequests,
|
||||||
|
totalTime: time,
|
||||||
|
incomingBytes: incomingBytes,
|
||||||
|
outgoingBytes: outgoingBytes
|
||||||
|
};
|
||||||
|
|
||||||
|
await this.inc(inc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new NetworkChart();
|
||||||
114
src/chart/notes.ts
Normal file
114
src/chart/notes.ts
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from '.';
|
||||||
|
import Note, { INote } from '../models/note';
|
||||||
|
import { isLocalUser } from '../models/user';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 投稿に関するチャート
|
||||||
|
*/
|
||||||
|
type NotesLog = {
|
||||||
|
local: {
|
||||||
|
/**
|
||||||
|
* 集計期間時点での、全投稿数
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加した投稿数
|
||||||
|
*/
|
||||||
|
inc: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少した投稿数
|
||||||
|
*/
|
||||||
|
dec: number;
|
||||||
|
|
||||||
|
diffs: {
|
||||||
|
/**
|
||||||
|
* 通常の投稿数の差分
|
||||||
|
*/
|
||||||
|
normal: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* リプライの投稿数の差分
|
||||||
|
*/
|
||||||
|
reply: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renoteの投稿数の差分
|
||||||
|
*/
|
||||||
|
renote: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
remote: NotesLog['local'];
|
||||||
|
};
|
||||||
|
|
||||||
|
class NotesChart extends Chart<NotesLog> {
|
||||||
|
constructor() {
|
||||||
|
super('notes');
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: NotesLog): Promise<NotesLog> {
|
||||||
|
const [localCount, remoteCount] = init ? await Promise.all([
|
||||||
|
Note.count({ '_user.host': null }),
|
||||||
|
Note.count({ '_user.host': { $ne: null } })
|
||||||
|
]) : [
|
||||||
|
latest ? latest.local.total : 0,
|
||||||
|
latest ? latest.remote.total : 0
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
local: {
|
||||||
|
total: localCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(note: INote, isAdditional: boolean) {
|
||||||
|
const update: Obj = {
|
||||||
|
diffs: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
update.total = isAdditional ? 1 : -1;
|
||||||
|
|
||||||
|
if (isAdditional) {
|
||||||
|
update.inc = 1;
|
||||||
|
} else {
|
||||||
|
update.dec = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (note.replyId != null) {
|
||||||
|
update.diffs.reply = isAdditional ? 1 : -1;
|
||||||
|
} else if (note.renoteId != null) {
|
||||||
|
update.diffs.renote = isAdditional ? 1 : -1;
|
||||||
|
} else {
|
||||||
|
update.diffs.normal = isAdditional ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.inc({
|
||||||
|
[isLocalUser(note._user) ? 'local' : 'remote']: update
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new NotesChart();
|
||||||
101
src/chart/per-user-drive.ts
Normal file
101
src/chart/per-user-drive.ts
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from './';
|
||||||
|
import DriveFile, { IDriveFile } from '../models/drive-file';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ユーザーごとのドライブに関するチャート
|
||||||
|
*/
|
||||||
|
type PerUserDriveLog = {
|
||||||
|
/**
|
||||||
|
* 集計期間時点での、全ドライブファイル数
|
||||||
|
*/
|
||||||
|
totalCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 集計期間時点での、全ドライブファイルの合計サイズ
|
||||||
|
*/
|
||||||
|
totalSize: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加したドライブファイル数
|
||||||
|
*/
|
||||||
|
incCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加したドライブ使用量
|
||||||
|
*/
|
||||||
|
incSize: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少したドライブファイル数
|
||||||
|
*/
|
||||||
|
decCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少したドライブ使用量
|
||||||
|
*/
|
||||||
|
decSize: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PerUserDriveChart extends Chart<PerUserDriveLog> {
|
||||||
|
constructor() {
|
||||||
|
super('perUserDrive', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: PerUserDriveLog, group?: any): Promise<PerUserDriveLog> {
|
||||||
|
const calcSize = () => DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata.userId': group,
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(res => res.length > 0 ? res[0].usage : 0);
|
||||||
|
|
||||||
|
const [count, size] = init ? await Promise.all([
|
||||||
|
DriveFile.count({ 'metadata.userId': group }),
|
||||||
|
calcSize()
|
||||||
|
]) : [
|
||||||
|
latest ? latest.totalCount : 0,
|
||||||
|
latest ? latest.totalSize : 0
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
totalCount: count,
|
||||||
|
totalSize: size,
|
||||||
|
incCount: 0,
|
||||||
|
incSize: 0,
|
||||||
|
decCount: 0,
|
||||||
|
decSize: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(file: IDriveFile, isAdditional: boolean) {
|
||||||
|
const update: Obj = {};
|
||||||
|
|
||||||
|
update.totalCount = isAdditional ? 1 : -1;
|
||||||
|
update.totalSize = isAdditional ? file.length : -file.length;
|
||||||
|
if (isAdditional) {
|
||||||
|
update.incCount = 1;
|
||||||
|
update.incSize = file.length;
|
||||||
|
} else {
|
||||||
|
update.decCount = 1;
|
||||||
|
update.decSize = file.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.inc(update, file.metadata.userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new PerUserDriveChart();
|
||||||
128
src/chart/per-user-following.ts
Normal file
128
src/chart/per-user-following.ts
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from './';
|
||||||
|
import Following from '../models/following';
|
||||||
|
import { IUser, isLocalUser } from '../models/user';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ユーザーごとのフォローに関するチャート
|
||||||
|
*/
|
||||||
|
type PerUserFollowingLog = {
|
||||||
|
local: {
|
||||||
|
/**
|
||||||
|
* フォローしている
|
||||||
|
*/
|
||||||
|
followings: {
|
||||||
|
/**
|
||||||
|
* 合計
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* フォローした数
|
||||||
|
*/
|
||||||
|
inc: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* フォロー解除した数
|
||||||
|
*/
|
||||||
|
dec: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* フォローされている
|
||||||
|
*/
|
||||||
|
followers: {
|
||||||
|
/**
|
||||||
|
* 合計
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* フォローされた数
|
||||||
|
*/
|
||||||
|
inc: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* フォロー解除された数
|
||||||
|
*/
|
||||||
|
dec: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
remote: PerUserFollowingLog['local'];
|
||||||
|
};
|
||||||
|
|
||||||
|
class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
|
||||||
|
constructor() {
|
||||||
|
super('perUserFollowing', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: PerUserFollowingLog, group?: any): Promise<PerUserFollowingLog> {
|
||||||
|
const [
|
||||||
|
localFollowingsCount,
|
||||||
|
localFollowersCount,
|
||||||
|
remoteFollowingsCount,
|
||||||
|
remoteFollowersCount
|
||||||
|
] = init ? await Promise.all([
|
||||||
|
Following.count({ followerId: group, '_followee.host': null }),
|
||||||
|
Following.count({ followeeId: group, '_follower.host': null }),
|
||||||
|
Following.count({ followerId: group, '_followee.host': { $ne: null } }),
|
||||||
|
Following.count({ followeeId: group, '_follower.host': { $ne: null } })
|
||||||
|
]) : [
|
||||||
|
latest ? latest.local.followings.total : 0,
|
||||||
|
latest ? latest.local.followers.total : 0,
|
||||||
|
latest ? latest.remote.followings.total : 0,
|
||||||
|
latest ? latest.remote.followers.total : 0
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
local: {
|
||||||
|
followings: {
|
||||||
|
total: localFollowingsCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0
|
||||||
|
},
|
||||||
|
followers: {
|
||||||
|
total: localFollowersCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
followings: {
|
||||||
|
total: remoteFollowingsCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0
|
||||||
|
},
|
||||||
|
followers: {
|
||||||
|
total: remoteFollowersCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(follower: IUser, followee: IUser, isFollow: boolean) {
|
||||||
|
const update: Obj = {};
|
||||||
|
|
||||||
|
update.total = isFollow ? 1 : -1;
|
||||||
|
|
||||||
|
if (isFollow) {
|
||||||
|
update.inc = 1;
|
||||||
|
} else {
|
||||||
|
update.dec = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inc({
|
||||||
|
[isLocalUser(follower) ? 'local' : 'remote']: { followings: update }
|
||||||
|
}, follower._id);
|
||||||
|
this.inc({
|
||||||
|
[isLocalUser(followee) ? 'local' : 'remote']: { followers: update }
|
||||||
|
}, followee._id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new PerUserFollowingChart();
|
||||||
94
src/chart/per-user-notes.ts
Normal file
94
src/chart/per-user-notes.ts
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from './';
|
||||||
|
import Note, { INote } from '../models/note';
|
||||||
|
import { IUser } from '../models/user';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ユーザーごとの投稿に関するチャート
|
||||||
|
*/
|
||||||
|
type PerUserNotesLog = {
|
||||||
|
/**
|
||||||
|
* 集計期間時点での、全投稿数
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加した投稿数
|
||||||
|
*/
|
||||||
|
inc: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少した投稿数
|
||||||
|
*/
|
||||||
|
dec: number;
|
||||||
|
|
||||||
|
diffs: {
|
||||||
|
/**
|
||||||
|
* 通常の投稿数の差分
|
||||||
|
*/
|
||||||
|
normal: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* リプライの投稿数の差分
|
||||||
|
*/
|
||||||
|
reply: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renoteの投稿数の差分
|
||||||
|
*/
|
||||||
|
renote: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class PerUserNotesChart extends Chart<PerUserNotesLog> {
|
||||||
|
constructor() {
|
||||||
|
super('perUserNotes', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: PerUserNotesLog, group?: any): Promise<PerUserNotesLog> {
|
||||||
|
const [count] = init ? await Promise.all([
|
||||||
|
Note.count({ userId: group, deletedAt: null }),
|
||||||
|
]) : [
|
||||||
|
latest ? latest.total : 0
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
total: count,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(user: IUser, note: INote, isAdditional: boolean) {
|
||||||
|
const update: Obj = {
|
||||||
|
diffs: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
update.total = isAdditional ? 1 : -1;
|
||||||
|
|
||||||
|
if (isAdditional) {
|
||||||
|
update.inc = 1;
|
||||||
|
} else {
|
||||||
|
update.dec = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (note.replyId != null) {
|
||||||
|
update.diffs.reply = isAdditional ? 1 : -1;
|
||||||
|
} else if (note.renoteId != null) {
|
||||||
|
update.diffs.renote = isAdditional ? 1 : -1;
|
||||||
|
} else {
|
||||||
|
update.diffs.normal = isAdditional ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.inc(update, user._id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new PerUserNotesChart();
|
||||||
45
src/chart/per-user-reactions.ts
Normal file
45
src/chart/per-user-reactions.ts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart from './';
|
||||||
|
import { IUser, isLocalUser } from '../models/user';
|
||||||
|
import { INote } from '../models/note';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ユーザーごとのリアクションに関するチャート
|
||||||
|
*/
|
||||||
|
type PerUserReactionsLog = {
|
||||||
|
local: {
|
||||||
|
/**
|
||||||
|
* リアクションされた数
|
||||||
|
*/
|
||||||
|
count: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
remote: PerUserReactionsLog['local'];
|
||||||
|
};
|
||||||
|
|
||||||
|
class PerUserReactionsChart extends Chart<PerUserReactionsLog> {
|
||||||
|
constructor() {
|
||||||
|
super('perUserReaction', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: PerUserReactionsLog, group?: any): Promise<PerUserReactionsLog> {
|
||||||
|
return {
|
||||||
|
local: {
|
||||||
|
count: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
count: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(user: IUser, note: INote) {
|
||||||
|
this.inc({
|
||||||
|
[isLocalUser(user) ? 'local' : 'remote']: { count: 1 }
|
||||||
|
}, note.userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new PerUserReactionsChart();
|
||||||
75
src/chart/users.ts
Normal file
75
src/chart/users.ts
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Chart, { Obj } from './';
|
||||||
|
import User, { IUser, isLocalUser } from '../models/user';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ユーザーに関するチャート
|
||||||
|
*/
|
||||||
|
type UsersLog = {
|
||||||
|
local: {
|
||||||
|
/**
|
||||||
|
* 集計期間時点での、全ユーザー数
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 増加したユーザー数
|
||||||
|
*/
|
||||||
|
inc: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 減少したユーザー数
|
||||||
|
*/
|
||||||
|
dec: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
remote: UsersLog['local'];
|
||||||
|
};
|
||||||
|
|
||||||
|
class UsersChart extends Chart<UsersLog> {
|
||||||
|
constructor() {
|
||||||
|
super('users');
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
protected async getTemplate(init: boolean, latest?: UsersLog): Promise<UsersLog> {
|
||||||
|
const [localCount, remoteCount] = init ? await Promise.all([
|
||||||
|
User.count({ host: null }),
|
||||||
|
User.count({ host: { $ne: null } })
|
||||||
|
]) : [
|
||||||
|
latest ? latest.local.total : 0,
|
||||||
|
latest ? latest.remote.total : 0
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
local: {
|
||||||
|
total: localCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteCount,
|
||||||
|
inc: 0,
|
||||||
|
dec: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public async update(user: IUser, isAdditional: boolean) {
|
||||||
|
const update: Obj = {};
|
||||||
|
|
||||||
|
update.total = isAdditional ? 1 : -1;
|
||||||
|
if (isAdditional) {
|
||||||
|
update.inc = 1;
|
||||||
|
} else {
|
||||||
|
update.dec = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.inc({
|
||||||
|
[isLocalUser(user) ? 'local' : 'remote']: update
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new UsersChart();
|
||||||
150
src/client/app/admin/assets/header-icon.svg
Normal file
150
src/client/app/admin/assets/header-icon.svg
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="512"
|
||||||
|
height="512"
|
||||||
|
viewBox="0 0 135.46667 135.46667"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
sodipodi:docname="header-icon.dark.svg"
|
||||||
|
inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
|
||||||
|
inkscape:export-xdpi="6"
|
||||||
|
inkscape:export-ydpi="6">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="simplify"
|
||||||
|
id="path-effect5115"
|
||||||
|
is_visible="true"
|
||||||
|
steps="1"
|
||||||
|
threshold="0.000408163"
|
||||||
|
smooth_angles="360"
|
||||||
|
helper_size="0"
|
||||||
|
simplify_individual_paths="false"
|
||||||
|
simplify_just_coalesce="false"
|
||||||
|
simplifyindividualpaths="false"
|
||||||
|
simplifyJustCoalesce="false" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="simplify"
|
||||||
|
id="path-effect5111"
|
||||||
|
is_visible="true"
|
||||||
|
steps="1"
|
||||||
|
threshold="0.000408163"
|
||||||
|
smooth_angles="360"
|
||||||
|
helper_size="0"
|
||||||
|
simplify_individual_paths="false"
|
||||||
|
simplify_just_coalesce="false"
|
||||||
|
simplifyindividualpaths="false"
|
||||||
|
simplifyJustCoalesce="false" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="simplify"
|
||||||
|
id="path-effect5104"
|
||||||
|
is_visible="true"
|
||||||
|
steps="1"
|
||||||
|
threshold="0.000408163"
|
||||||
|
smooth_angles="360"
|
||||||
|
helper_size="0"
|
||||||
|
simplify_individual_paths="false"
|
||||||
|
simplify_just_coalesce="false"
|
||||||
|
simplifyindividualpaths="false"
|
||||||
|
simplifyJustCoalesce="false" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1.4142136"
|
||||||
|
inkscape:cx="114.309"
|
||||||
|
inkscape:cy="251.50613"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g4502"
|
||||||
|
showgrid="true"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="false"
|
||||||
|
inkscape:snap-smooth-nodes="true"
|
||||||
|
inkscape:snap-center="true"
|
||||||
|
inkscape:snap-page="true"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1027"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="1072"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:snap-object-midpoints="true"
|
||||||
|
inkscape:snap-midpoints="true"
|
||||||
|
inkscape:object-paths="true"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
objecttolerance="1"
|
||||||
|
guidetolerance="1"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-others="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4504"
|
||||||
|
spacingx="4.2333334"
|
||||||
|
spacingy="4.2333334"
|
||||||
|
empcolor="#ff3fff"
|
||||||
|
empopacity="0.25098039"
|
||||||
|
empspacing="4" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="レイヤー 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-30.809093,-111.78601)">
|
||||||
|
<g
|
||||||
|
id="g4502"
|
||||||
|
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
|
||||||
|
<g
|
||||||
|
style="fill-opacity:1"
|
||||||
|
transform="translate(-1.3333333e-6,-1.3439941e-6)"
|
||||||
|
id="g5125">
|
||||||
|
<g
|
||||||
|
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
|
||||||
|
id="text4489"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
aria-label="Mi">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5210"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
|
||||||
|
d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5212"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
|
||||||
|
d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.0 KiB |
27
src/client/app/admin/script.ts
Normal file
27
src/client/app/admin/script.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Admin
|
||||||
|
*/
|
||||||
|
|
||||||
|
import VueRouter from 'vue-router';
|
||||||
|
|
||||||
|
// Style
|
||||||
|
import './style.styl';
|
||||||
|
|
||||||
|
import init from '../init';
|
||||||
|
import Index from './views/index.vue';
|
||||||
|
|
||||||
|
init(launch => {
|
||||||
|
document.title = 'Admin';
|
||||||
|
|
||||||
|
// Init router
|
||||||
|
const router = new VueRouter({
|
||||||
|
mode: 'history',
|
||||||
|
base: '/admin/',
|
||||||
|
routes: [
|
||||||
|
{ path: '/', component: Index },
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
// Launch the app
|
||||||
|
launch(router);
|
||||||
|
});
|
||||||
6
src/client/app/admin/style.styl
Normal file
6
src/client/app/admin/style.styl
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
@import "../app"
|
||||||
|
@import "../reset"
|
||||||
|
|
||||||
|
html
|
||||||
|
height 100%
|
||||||
|
background var(--bg)
|
||||||
90
src/client/app/admin/views/announcements.vue
Normal file
90
src/client/app/admin/views/announcements.vue
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<template>
|
||||||
|
<div class="cdeuzmsthagexbkpofbmatmugjuvogfb">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="broadcast-tower"/> %i18n:@announcements%</div>
|
||||||
|
<section v-for="(announcement, i) in announcements" class="fit-top">
|
||||||
|
<ui-input v-model="announcement.title" @change="save">
|
||||||
|
<span>%i18n:@title%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-textarea v-model="announcement.text">
|
||||||
|
<span>%i18n:@text%</span>
|
||||||
|
</ui-textarea>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-button @click="save()"><fa :icon="['far', 'save']"/> %i18n:@save%</ui-button>
|
||||||
|
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> %i18n:@remove%</ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="add"><fa icon="plus"/> %i18n:@add%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
announcements: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.announcements = meta.broadcasts;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
add() {
|
||||||
|
this.announcements.push({
|
||||||
|
title: '',
|
||||||
|
text: ''
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(i) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'warning',
|
||||||
|
text: '%i18n:@_remove.are-you-sure%'.replace('$1', this.announcements.find((_, j) => j == i).title),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(res => {
|
||||||
|
if (!res.value) return;
|
||||||
|
this.announcements = this.announcements.filter((_, j) => j !== i);
|
||||||
|
this.save(true);
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@_remove.removed%'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
save(silent) {
|
||||||
|
(this as any).api('admin/update-meta', {
|
||||||
|
broadcasts: this.announcements
|
||||||
|
}).then(() => {
|
||||||
|
if (!silent) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@saved%'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.cdeuzmsthagexbkpofbmatmugjuvogfb
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
||||||
105
src/client/app/admin/views/ap-log.vue
Normal file
105
src/client/app/admin/views/ap-log.vue
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<template>
|
||||||
|
<div class="hyhctythnmwihguaaapnbrbszsjqxpio">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><fa icon="exchange-alt"/> In/Out</th>
|
||||||
|
<th><fa icon="server"/> Host</th>
|
||||||
|
<th><fa icon="bolt"/> Activity</th>
|
||||||
|
<th><fa icon="user"/> Actor</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="log in logs" :key="log.id">
|
||||||
|
<td :class="log.direction">{{ log.direction == 'in' ? '<' : '>' }} {{ log.direction }}</td>
|
||||||
|
<td>{{ log.host }}</td>
|
||||||
|
<td>{{ log.activity }}</td>
|
||||||
|
<td>@{{ log.actor }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
logs: [],
|
||||||
|
connection: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.connection = (this as any).os.stream.useSharedConnection('apLog');
|
||||||
|
this.connection.on('log', this.onLog);
|
||||||
|
this.connection.on('logs', this.onLogs);
|
||||||
|
this.connection.send('requestLog', {
|
||||||
|
id: Math.random().toString().substr(2, 8),
|
||||||
|
length: 50
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.dispose();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onLog(log) {
|
||||||
|
log.id = Math.random();
|
||||||
|
this.logs.unshift(log);
|
||||||
|
if (this.logs.length > 50) this.logs.pop();
|
||||||
|
},
|
||||||
|
|
||||||
|
onLogs(logs) {
|
||||||
|
logs.reverse().forEach(log => this.onLog(log));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.hyhctythnmwihguaaapnbrbszsjqxpio
|
||||||
|
display block
|
||||||
|
padding 12px 16px 16px 16px
|
||||||
|
height 250px
|
||||||
|
overflow hidden
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--adminDashboardCardBg)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
> table
|
||||||
|
width 100%
|
||||||
|
max-width 100%
|
||||||
|
overflow auto
|
||||||
|
border-spacing 0
|
||||||
|
border-collapse collapse
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
|
thead
|
||||||
|
border-bottom solid 1px var(--adminDashboardCardDivider)
|
||||||
|
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
font-weight normal
|
||||||
|
text-align left
|
||||||
|
|
||||||
|
tbody
|
||||||
|
tr
|
||||||
|
&:nth-child(odd)
|
||||||
|
background rgba(0, 0, 0, 0.025)
|
||||||
|
|
||||||
|
th, td
|
||||||
|
padding 8px 16px
|
||||||
|
min-width 128px
|
||||||
|
|
||||||
|
td.in
|
||||||
|
color #d26755
|
||||||
|
|
||||||
|
td.out
|
||||||
|
color #55bb83
|
||||||
|
|
||||||
|
</style>
|
||||||
491
src/client/app/admin/views/charts.vue
Normal file
491
src/client/app/admin/views/charts.vue
Normal file
@@ -0,0 +1,491 @@
|
|||||||
|
<template>
|
||||||
|
<div class="qvgidhudpqhjttdhxubzuyrhyzgslujw">
|
||||||
|
<header>
|
||||||
|
<b><fa :icon="['far', 'chart-bar']"/> %i18n:@title%:</b>
|
||||||
|
<select v-model="src">
|
||||||
|
<optgroup label="%i18n:@federation%">
|
||||||
|
<option value="federation-instances">%i18n:@charts.federation-instances%</option>
|
||||||
|
<option value="federation-instances-total">%i18n:@charts.federation-instances-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@users%">
|
||||||
|
<option value="users">%i18n:@charts.users%</option>
|
||||||
|
<option value="users-total">%i18n:@charts.users-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@notes%">
|
||||||
|
<option value="notes">%i18n:@charts.notes%</option>
|
||||||
|
<option value="local-notes">%i18n:@charts.local-notes%</option>
|
||||||
|
<option value="remote-notes">%i18n:@charts.remote-notes%</option>
|
||||||
|
<option value="notes-total">%i18n:@charts.notes-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@drive%">
|
||||||
|
<option value="drive-files">%i18n:@charts.drive-files%</option>
|
||||||
|
<option value="drive-files-total">%i18n:@charts.drive-files-total%</option>
|
||||||
|
<option value="drive">%i18n:@charts.drive%</option>
|
||||||
|
<option value="drive-total">%i18n:@charts.drive-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@network%">
|
||||||
|
<option value="network-requests">%i18n:@charts.network-requests%</option>
|
||||||
|
<option value="network-time">%i18n:@charts.network-time%</option>
|
||||||
|
<option value="network-usage">%i18n:@charts.network-usage%</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
<div>
|
||||||
|
<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div ref="chart"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
import * as ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
|
const limit = 90;
|
||||||
|
|
||||||
|
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
|
||||||
|
const negate = arr => arr.map(x => -x);
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chart: null,
|
||||||
|
src: 'notes',
|
||||||
|
span: 'hour',
|
||||||
|
chartInstance: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
data(): any {
|
||||||
|
if (this.chart == null) return null;
|
||||||
|
switch (this.src) {
|
||||||
|
case 'federation-instances': return this.federationInstancesChart(false);
|
||||||
|
case 'federation-instances-total': return this.federationInstancesChart(true);
|
||||||
|
case 'users': return this.usersChart(false);
|
||||||
|
case 'users-total': return this.usersChart(true);
|
||||||
|
case 'notes': return this.notesChart('combined');
|
||||||
|
case 'local-notes': return this.notesChart('local');
|
||||||
|
case 'remote-notes': return this.notesChart('remote');
|
||||||
|
case 'notes-total': return this.notesTotalChart();
|
||||||
|
case 'drive': return this.driveChart();
|
||||||
|
case 'drive-total': return this.driveTotalChart();
|
||||||
|
case 'drive-files': return this.driveFilesChart();
|
||||||
|
case 'drive-files-total': return this.driveFilesTotalChart();
|
||||||
|
case 'network-requests': return this.networkRequestsChart();
|
||||||
|
case 'network-time': return this.networkTimeChart();
|
||||||
|
case 'network-usage': return this.networkUsageChart();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
stats(): any[] {
|
||||||
|
const stats =
|
||||||
|
this.span == 'day' ? this.chart.perDay :
|
||||||
|
this.span == 'hour' ? this.chart.perHour :
|
||||||
|
null;
|
||||||
|
|
||||||
|
return stats;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
src() {
|
||||||
|
this.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
span() {
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async mounted() {
|
||||||
|
this.now = new Date();
|
||||||
|
|
||||||
|
const [perHour, perDay] = await Promise.all([Promise.all([
|
||||||
|
(this as any).api('charts/federation', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/users', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/notes', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/drive', { limit: limit, span: 'hour' }),
|
||||||
|
(this as any).api('charts/network', { limit: limit, span: 'hour' })
|
||||||
|
]), Promise.all([
|
||||||
|
(this as any).api('charts/federation', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/users', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/notes', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/drive', { limit: limit, span: 'day' }),
|
||||||
|
(this as any).api('charts/network', { limit: limit, span: 'day' })
|
||||||
|
])]);
|
||||||
|
|
||||||
|
const chart = {
|
||||||
|
perHour: {
|
||||||
|
federation: perHour[0],
|
||||||
|
users: perHour[1],
|
||||||
|
notes: perHour[2],
|
||||||
|
drive: perHour[3],
|
||||||
|
network: perHour[4]
|
||||||
|
},
|
||||||
|
perDay: {
|
||||||
|
federation: perDay[0],
|
||||||
|
users: perDay[1],
|
||||||
|
notes: perDay[2],
|
||||||
|
drive: perDay[3],
|
||||||
|
network: perDay[4]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.chart = chart;
|
||||||
|
|
||||||
|
this.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
setSrc(src) {
|
||||||
|
this.src = src;
|
||||||
|
},
|
||||||
|
|
||||||
|
render() {
|
||||||
|
if (this.chartInstance) {
|
||||||
|
this.chartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.chartInstance = new ApexCharts(this.$refs.chart, {
|
||||||
|
chart: {
|
||||||
|
type: 'area',
|
||||||
|
height: 300,
|
||||||
|
animations: {
|
||||||
|
dynamicAnimation: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
zoom: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
curve: 'straight',
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
labels: {
|
||||||
|
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
type: 'datetime',
|
||||||
|
labels: {
|
||||||
|
style: {
|
||||||
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisBorder: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
axisTicks: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
labels: {
|
||||||
|
formatter: this.data.bytes ? v => Vue.filter('bytes')(v, 0) : v => Vue.filter('number')(v),
|
||||||
|
style: {
|
||||||
|
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: this.data.series
|
||||||
|
});
|
||||||
|
|
||||||
|
this.chartInstance.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
getDate(i: number) {
|
||||||
|
const y = this.now.getFullYear();
|
||||||
|
const m = this.now.getMonth();
|
||||||
|
const d = this.now.getDate();
|
||||||
|
const h = this.now.getHours();
|
||||||
|
|
||||||
|
return (
|
||||||
|
this.span == 'day' ? new Date(y, m, d - i) :
|
||||||
|
this.span == 'hour' ? new Date(y, m, d, h - i) :
|
||||||
|
null
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
format(arr) {
|
||||||
|
return arr.map((v, i) => ({ x: this.getDate(i).getTime(), y: v }));
|
||||||
|
},
|
||||||
|
|
||||||
|
federationInstancesChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.federation.instance.total
|
||||||
|
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
notesChart(type: string): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'All',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.inc, negate(this.stats.notes.local.dec), this.stats.notes.remote.inc, negate(this.stats.notes.remote.dec))
|
||||||
|
: sum(this.stats.notes[type].inc, negate(this.stats.notes[type].dec))
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Renotes',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.diffs.renote, this.stats.notes.remote.diffs.renote)
|
||||||
|
: this.stats.notes[type].diffs.renote
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Replies',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.diffs.reply, this.stats.notes.remote.diffs.reply)
|
||||||
|
: this.stats.notes[type].diffs.reply
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Normal',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(type == 'combined'
|
||||||
|
? sum(this.stats.notes.local.diffs.normal, this.stats.notes.remote.diffs.normal)
|
||||||
|
: this.stats.notes[type].diffs.normal
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
notesTotalChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(sum(this.stats.notes.local.total, this.stats.notes.remote.total))
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.notes.local.total)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.notes.remote.total)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
usersChart(total: boolean): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(total
|
||||||
|
? sum(this.stats.users.local.total, this.stats.users.remote.total)
|
||||||
|
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec), this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.users.local.total
|
||||||
|
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec))
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(total
|
||||||
|
? this.stats.users.remote.total
|
||||||
|
: sum(this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
|
||||||
|
)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveChart(): any {
|
||||||
|
return {
|
||||||
|
bytes: true,
|
||||||
|
series: [{
|
||||||
|
name: 'All',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(
|
||||||
|
sum(
|
||||||
|
this.stats.drive.local.incSize,
|
||||||
|
negate(this.stats.drive.local.decSize),
|
||||||
|
this.stats.drive.remote.incSize,
|
||||||
|
negate(this.stats.drive.remote.decSize)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Local +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.incSize)
|
||||||
|
}, {
|
||||||
|
name: 'Local -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.local.decSize))
|
||||||
|
}, {
|
||||||
|
name: 'Remote +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.incSize)
|
||||||
|
}, {
|
||||||
|
name: 'Remote -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.remote.decSize))
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveTotalChart(): any {
|
||||||
|
return {
|
||||||
|
bytes: true,
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(sum(this.stats.drive.local.totalSize, this.stats.drive.remote.totalSize))
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.totalSize)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.totalSize)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveFilesChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'All',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(
|
||||||
|
sum(
|
||||||
|
this.stats.drive.local.incCount,
|
||||||
|
negate(this.stats.drive.local.decCount),
|
||||||
|
this.stats.drive.remote.incCount,
|
||||||
|
negate(this.stats.drive.remote.decCount)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}, {
|
||||||
|
name: 'Local +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.incCount)
|
||||||
|
}, {
|
||||||
|
name: 'Local -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.local.decCount))
|
||||||
|
}, {
|
||||||
|
name: 'Remote +',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.incCount)
|
||||||
|
}, {
|
||||||
|
name: 'Remote -',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(negate(this.stats.drive.remote.decCount))
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
driveFilesTotalChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Combined',
|
||||||
|
type: 'line',
|
||||||
|
data: this.format(sum(this.stats.drive.local.totalCount, this.stats.drive.remote.totalCount))
|
||||||
|
}, {
|
||||||
|
name: 'Local',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.local.totalCount)
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
type: 'area',
|
||||||
|
data: this.format(this.stats.drive.remote.totalCount)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
networkRequestsChart(): any {
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Incoming',
|
||||||
|
data: this.format(this.stats.network.incomingRequests)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
networkTimeChart(): any {
|
||||||
|
const data = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < limit; i++) {
|
||||||
|
data.push(this.stats.network.incomingRequests[i] != 0 ? (this.stats.network.totalTime[i] / this.stats.network.incomingRequests[i]) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
series: [{
|
||||||
|
name: 'Avg time',
|
||||||
|
data: this.format(data)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
networkUsageChart(): any {
|
||||||
|
return {
|
||||||
|
bytes: true,
|
||||||
|
series: [{
|
||||||
|
name: 'Incoming',
|
||||||
|
data: this.format(this.stats.network.incomingBytes)
|
||||||
|
}, {
|
||||||
|
name: 'Outgoing',
|
||||||
|
data: this.format(this.stats.network.outgoingBytes)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.qvgidhudpqhjttdhxubzuyrhyzgslujw
|
||||||
|
display block
|
||||||
|
flex 1
|
||||||
|
padding 32px 24px
|
||||||
|
padding-bottom 0
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--face)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
margin 0 8px
|
||||||
|
padding 0 0 8px 0
|
||||||
|
font-size 1em
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
border-bottom solid 1px var(--adminDashboardCardDivider)
|
||||||
|
|
||||||
|
> b
|
||||||
|
margin-right 8px
|
||||||
|
|
||||||
|
> *:last-child
|
||||||
|
margin-left auto
|
||||||
|
|
||||||
|
*
|
||||||
|
&:not(.active)
|
||||||
|
color var(--primary)
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
|
</style>
|
||||||
180
src/client/app/admin/views/cpu-memory.vue
Normal file
180
src/client/app/admin/views/cpu-memory.vue
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
<template>
|
||||||
|
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
<span><fa icon="microchip"/> CPU <span>{{ cpuP }}%</span></span>
|
||||||
|
<span v-if="meta">{{ meta.cpu.model }}</span>
|
||||||
|
</header>
|
||||||
|
<div ref="cpu"></div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
<span><fa icon="memory"/> MEM <span>{{ memP }}%</span></span>
|
||||||
|
<span v-if="meta"></span>
|
||||||
|
</header>
|
||||||
|
<div ref="mem"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: ['connection'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
stats: [],
|
||||||
|
cpuChart: null,
|
||||||
|
memChart: null,
|
||||||
|
cpuP: '',
|
||||||
|
memP: '',
|
||||||
|
meta: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
stats(stats) {
|
||||||
|
this.cpuChart.updateSeries([{
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x.cpu_usage }))
|
||||||
|
}]);
|
||||||
|
this.memChart.updateSeries([{
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: (x.mem.used / x.mem.total) }))
|
||||||
|
}]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.connection.on('stats', this.onStats);
|
||||||
|
this.connection.on('statsLog', this.onStatsLog);
|
||||||
|
this.connection.send('requestLog', {
|
||||||
|
id: Math.random().toString().substr(2, 8),
|
||||||
|
length: 200
|
||||||
|
});
|
||||||
|
|
||||||
|
const chartOpts = {
|
||||||
|
chart: {
|
||||||
|
type: 'area',
|
||||||
|
height: 200,
|
||||||
|
animations: {
|
||||||
|
dynamicAnimation: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
zoom: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
curve: 'straight',
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
data: []
|
||||||
|
}],
|
||||||
|
xaxis: {
|
||||||
|
type: 'numeric',
|
||||||
|
labels: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: false,
|
||||||
|
min: 0,
|
||||||
|
max: 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.cpuChart = new ApexCharts(this.$refs.cpu, chartOpts);
|
||||||
|
this.memChart = new ApexCharts(this.$refs.mem, chartOpts);
|
||||||
|
|
||||||
|
this.cpuChart.render();
|
||||||
|
this.memChart.render();
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.off('stats', this.onStats);
|
||||||
|
this.connection.off('statsLog', this.onStatsLog);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onStats(stats) {
|
||||||
|
this.stats.push(stats);
|
||||||
|
if (this.stats.length > 200) this.stats.shift();
|
||||||
|
|
||||||
|
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
|
||||||
|
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||||
|
},
|
||||||
|
|
||||||
|
onStatsLog(statsLog) {
|
||||||
|
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.zyknedwtlthezamcjlolyusmipqmjgxz
|
||||||
|
display flex
|
||||||
|
|
||||||
|
> div
|
||||||
|
display block
|
||||||
|
flex 1
|
||||||
|
padding 20px 12px 0 12px
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--face)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
&:first-child
|
||||||
|
margin-right 16px
|
||||||
|
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
padding 0 8px
|
||||||
|
margin-bottom -16px
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
|
> span
|
||||||
|
&:last-child
|
||||||
|
margin-left auto
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> span
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> div
|
||||||
|
margin-bottom -10px
|
||||||
|
|
||||||
|
@media (max-width 1000px)
|
||||||
|
display block
|
||||||
|
margin-bottom 26px
|
||||||
|
|
||||||
|
> div
|
||||||
|
&:first-child
|
||||||
|
margin-right 0
|
||||||
|
margin-bottom 26px
|
||||||
|
|
||||||
|
</style>
|
||||||
236
src/client/app/admin/views/dashboard.vue
Normal file
236
src/client/app/admin/views/dashboard.vue
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
<template>
|
||||||
|
<div class="obdskegsannmntldydackcpzezagxqfy">
|
||||||
|
<header v-if="meta">
|
||||||
|
<p><b>Misskey</b><span>{{ meta.version }}</span></p>
|
||||||
|
<p><b>Machine</b><span>{{ meta.machine }}</span></p>
|
||||||
|
<p><b>OS</b><span>{{ meta.os }}</span></p>
|
||||||
|
<p><b>Node</b><span>{{ meta.node }}</span></p>
|
||||||
|
<p>%i18n:common.ai-chan-kawaii%</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div v-if="stats" class="stats">
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa icon="user"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@accounts%</span>
|
||||||
|
<b class="primary">{{ stats.originalUsersCount | number }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
|
<span @click="setChartSrc('users')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa icon="pencil-alt"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@notes%</span>
|
||||||
|
<b class="primary">{{ stats.originalNotesCount | number }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
|
<span @click="setChartSrc('notes')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa icon="database"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@drive%</span>
|
||||||
|
<b>{{ stats.driveUsageLocal | bytes }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
|
<span @click="setChartSrc('drive')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div><fa :icon="['far', 'hdd']"/></div>
|
||||||
|
<div>
|
||||||
|
<span>%i18n:@instances%</span>
|
||||||
|
<b>{{ stats.instances | number }}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span><fa icon="globe"/> %i18n:@federated%</span>
|
||||||
|
<span @click="setChartSrc('federation-instances-total')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="charts">
|
||||||
|
<x-charts ref="charts"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cpu-memory">
|
||||||
|
<x-cpu-memory :connection="connection"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ap">
|
||||||
|
<x-ap-log/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import XCpuMemory from "./cpu-memory.vue";
|
||||||
|
import XCharts from "./charts.vue";
|
||||||
|
import XApLog from "./ap-log.vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XCpuMemory,
|
||||||
|
XCharts,
|
||||||
|
XApLog
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
stats: null,
|
||||||
|
connection: null,
|
||||||
|
meta: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.connection = (this as any).os.stream.useSharedConnection('serverStats');
|
||||||
|
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
|
});
|
||||||
|
|
||||||
|
(this as any).api('stats').then(stats => {
|
||||||
|
this.stats = stats;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.dispose();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
setChartSrc(src) {
|
||||||
|
this.$refs.charts.setSrc(src);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.obdskegsannmntldydackcpzezagxqfy
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 32px
|
||||||
|
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
margin-bottom 16px
|
||||||
|
padding-bottom 16px
|
||||||
|
border-bottom solid 1px var(--adminDashboardHeaderBorder)
|
||||||
|
color var(--adminDashboardHeaderFg)
|
||||||
|
font-size 14px
|
||||||
|
white-space nowrap
|
||||||
|
|
||||||
|
@media (max-width 1000px)
|
||||||
|
display none
|
||||||
|
|
||||||
|
> p
|
||||||
|
display block
|
||||||
|
margin 0 32px 0 0
|
||||||
|
overflow hidden
|
||||||
|
text-overflow ellipsis
|
||||||
|
|
||||||
|
> b
|
||||||
|
&:after
|
||||||
|
content ':'
|
||||||
|
margin-right 8px
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-left auto
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
> .stats
|
||||||
|
display flex
|
||||||
|
justify-content space-between
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> div
|
||||||
|
flex 1
|
||||||
|
margin-right 16px
|
||||||
|
color var(--adminDashboardCardFg)
|
||||||
|
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||||
|
background var(--adminDashboardCardBg)
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
display flex
|
||||||
|
align-items center
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
padding 16px 24px
|
||||||
|
font-size 28px
|
||||||
|
|
||||||
|
> div:last-child
|
||||||
|
flex 1
|
||||||
|
padding 16px 32px 16px 0
|
||||||
|
text-align right
|
||||||
|
|
||||||
|
> span
|
||||||
|
font-size 70%
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> b
|
||||||
|
display block
|
||||||
|
|
||||||
|
&.primary
|
||||||
|
color var(--primary)
|
||||||
|
|
||||||
|
> div:last-child
|
||||||
|
display flex
|
||||||
|
padding 6px 16px
|
||||||
|
border-top solid 1px var(--adminDashboardCardDivider)
|
||||||
|
|
||||||
|
> span
|
||||||
|
font-size 70%
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
margin-left auto
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
|
@media (max-width 900px)
|
||||||
|
display grid
|
||||||
|
grid-template-columns 1fr 1fr
|
||||||
|
grid-template-rows 1fr 1fr
|
||||||
|
gap 16px
|
||||||
|
|
||||||
|
> div
|
||||||
|
margin-right 0
|
||||||
|
|
||||||
|
@media (max-width 500px)
|
||||||
|
display block
|
||||||
|
|
||||||
|
> div:not(:last-child)
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .charts
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .cpu-memory
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
</style>
|
||||||
147
src/client/app/admin/views/emoji.vue
Normal file
147
src/client/app/admin/views/emoji.vue
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<template>
|
||||||
|
<div class="tumhkfkmgtvzljezfvmgkeurkfncshbe">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="plus"/> %i18n:@add-emoji.title%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="name">
|
||||||
|
<span>%i18n:@add-emoji.name%</span>
|
||||||
|
<span slot="desc">%i18n:@add-emoji.name-desc%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input v-model="aliases">
|
||||||
|
<span>%i18n:@add-emoji.aliases%</span>
|
||||||
|
<span slot="desc">%i18n:@add-emoji.aliases-desc%</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-input v-model="url">
|
||||||
|
<i slot="icon"><fa icon="link"/></i>
|
||||||
|
<span>%i18n:@add-emoji.url%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-info>%i18n:@add-emoji.info%</ui-info>
|
||||||
|
<ui-button @click="add">%i18n:@add-emoji.add%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa :icon="['far', 'grin']"/> %i18n:@emojis.title%</div>
|
||||||
|
<section v-for="emoji in emojis">
|
||||||
|
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="emoji.name">
|
||||||
|
<span>%i18n:@add-emoji.name%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input v-model="emoji.aliases">
|
||||||
|
<span>%i18n:@add-emoji.aliases%</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-input v-model="emoji.url">
|
||||||
|
<i slot="icon"><fa icon="link"/></i>
|
||||||
|
<span>%i18n:@add-emoji.url%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> %i18n:@emojis.update%</ui-button>
|
||||||
|
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> %i18n:@emojis.remove%</ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
name: '',
|
||||||
|
url: '',
|
||||||
|
aliases: '',
|
||||||
|
emojis: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetchEmojis();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
add() {
|
||||||
|
(this as any).api('admin/emoji/add', {
|
||||||
|
name: this.name,
|
||||||
|
url: this.url,
|
||||||
|
aliases: this.aliases.split(' ').filter(x => x.length > 0)
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@add-emoji.added%'
|
||||||
|
});
|
||||||
|
this.fetchEmojis();
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchEmojis() {
|
||||||
|
(this as any).api('admin/emoji/list').then(emojis => {
|
||||||
|
emojis.reverse();
|
||||||
|
emojis.forEach(e => e.aliases = (e.aliases || []).join(' '));
|
||||||
|
this.emojis = emojis;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateEmoji(emoji) {
|
||||||
|
(this as any).api('admin/emoji/update', {
|
||||||
|
id: emoji.id,
|
||||||
|
name: emoji.name,
|
||||||
|
url: emoji.url,
|
||||||
|
aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@updated%'
|
||||||
|
});
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeEmoji(emoji) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'warning',
|
||||||
|
text: '%i18n:@remove-emoji.are-you-sure%'.replace('$1', emoji.name),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(res => {
|
||||||
|
if (!res.value) return;
|
||||||
|
|
||||||
|
(this as any).api('admin/emoji/remove', {
|
||||||
|
id: emoji.id
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@remove-emoji.removed%'
|
||||||
|
});
|
||||||
|
this.fetchEmojis();
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.tumhkfkmgtvzljezfvmgkeurkfncshbe
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="jdnqwkzlnxcfftthoybjxrebyolvoucw mk-admin-card">
|
<div>
|
||||||
<header>%i18n:@hided-tags%</header>
|
<ui-card>
|
||||||
<textarea v-model="hidedTags"></textarea>
|
<div slot="title">%i18n:@hided-tags%</div>
|
||||||
<button class="ui" @click="save">%i18n:@save%</button>
|
<section>
|
||||||
|
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
|
||||||
|
<ui-button @click="save">%i18n:@save%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -25,9 +29,9 @@ export default Vue.extend({
|
|||||||
(this as any).api('admin/update-meta', {
|
(this as any).api('admin/update-meta', {
|
||||||
hidedTags: this.hidedTags.split('\n')
|
hidedTags: this.hidedTags.split('\n')
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
(this as any).os.apis.dialog({ text: `Saved` });
|
//(this as any).os.apis.dialog({ text: `Saved` });
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -35,11 +39,8 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
|
|
||||||
|
|
||||||
.jdnqwkzlnxcfftthoybjxrebyolvoucw
|
.jdnqwkzlnxcfftthoybjxrebyolvoucw
|
||||||
textarea
|
width 100%
|
||||||
width 100%
|
min-height 300px
|
||||||
min-height 300px
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
260
src/client/app/admin/views/index.vue
Normal file
260
src/client/app/admin/views/index.vue
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mk-admin" :class="{ isMobile }">
|
||||||
|
<header v-show="isMobile">
|
||||||
|
<button class="nav" @click="navOpend = true"><fa icon="bars"/></button>
|
||||||
|
<span>MisskeyMyAdmin</span>
|
||||||
|
</header>
|
||||||
|
<div class="nav-backdrop"
|
||||||
|
v-if="navOpend && isMobile"
|
||||||
|
@click="navOpend = false"
|
||||||
|
@touchstart="navOpend = false"
|
||||||
|
></div>
|
||||||
|
<nav v-show="navOpend">
|
||||||
|
<div class="mi">
|
||||||
|
<img svg-inline src="../assets/header-icon.svg"/>
|
||||||
|
</div>
|
||||||
|
<div class="me">
|
||||||
|
<img class="avatar" :src="$store.state.i.avatarUrl" alt="avatar"/>
|
||||||
|
<p class="name">{{ $store.state.i | userName }}</p>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>%i18n:@dashboard%</li>
|
||||||
|
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>%i18n:@instance%</li>
|
||||||
|
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>%i18n:@users%</li>
|
||||||
|
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="['far', 'grin']" fixed-width/>%i18n:@emoji%</li>
|
||||||
|
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>%i18n:@announcements%</li>
|
||||||
|
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>%i18n:@hashtags%</li>
|
||||||
|
|
||||||
|
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>%i18n:common.drive%</li> -->
|
||||||
|
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
||||||
|
</ul>
|
||||||
|
<div class="back-to-misskey">
|
||||||
|
<a href="/"><fa icon="arrow-left"/> %i18n:@back-to-misskey%</a>
|
||||||
|
</div>
|
||||||
|
<div class="version">
|
||||||
|
<small>Misskey {{ version }}</small>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<main>
|
||||||
|
<div v-if="page == 'dashboard'"><x-dashboard/></div>
|
||||||
|
<div v-if="page == 'instance'"><x-instance/></div>
|
||||||
|
<div v-if="page == 'users'"><x-users/></div>
|
||||||
|
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||||
|
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||||
|
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
||||||
|
<div v-if="page == 'drive'"></div>
|
||||||
|
<div v-if="page == 'update'"></div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import { version } from '../../config';
|
||||||
|
import XDashboard from "./dashboard.vue";
|
||||||
|
import XInstance from "./instance.vue";
|
||||||
|
import XEmoji from "./emoji.vue";
|
||||||
|
import XAnnouncements from "./announcements.vue";
|
||||||
|
import XHashtags from "./hashtags.vue";
|
||||||
|
import XUsers from "./users.vue";
|
||||||
|
|
||||||
|
// Detect the user agent
|
||||||
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
|
const isMobile = /mobile|iphone|ipad|android/.test(ua);
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XDashboard,
|
||||||
|
XInstance,
|
||||||
|
XEmoji,
|
||||||
|
XAnnouncements,
|
||||||
|
XHashtags,
|
||||||
|
XUsers
|
||||||
|
},
|
||||||
|
provide: {
|
||||||
|
isMobile
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
page: 'dashboard',
|
||||||
|
version,
|
||||||
|
isMobile,
|
||||||
|
navOpend: !isMobile
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
nav(page: string) {
|
||||||
|
this.page = page;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus">
|
||||||
|
.mk-admin
|
||||||
|
$headerHeight = 48px
|
||||||
|
|
||||||
|
display flex
|
||||||
|
height 100%
|
||||||
|
|
||||||
|
> header
|
||||||
|
position fixed
|
||||||
|
top 0
|
||||||
|
z-index 10000
|
||||||
|
width 100%
|
||||||
|
color var(--mobileHeaderFg)
|
||||||
|
background-color var(--mobileHeaderBg)
|
||||||
|
box-shadow 0 1px 0 rgba(#000, 0.075)
|
||||||
|
|
||||||
|
&, *
|
||||||
|
user-select none
|
||||||
|
|
||||||
|
> span
|
||||||
|
display block
|
||||||
|
line-height $headerHeight
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> .nav
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
z-index 10001
|
||||||
|
padding 0
|
||||||
|
width $headerHeight
|
||||||
|
font-size 1.4em
|
||||||
|
line-height $headerHeight
|
||||||
|
border-right solid 1px rgba(#000, 0.1)
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
transition all 0.2s ease
|
||||||
|
|
||||||
|
> nav
|
||||||
|
position fixed
|
||||||
|
z-index 20001
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
width 250px
|
||||||
|
height 100vh
|
||||||
|
overflow auto
|
||||||
|
background #333
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> .mi
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> svg
|
||||||
|
width 24px
|
||||||
|
height 82px
|
||||||
|
vertical-align top
|
||||||
|
fill #fff
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> .me
|
||||||
|
display flex
|
||||||
|
margin 0 16px 16px 16px
|
||||||
|
padding 16px 0
|
||||||
|
align-items center
|
||||||
|
border-top solid 1px #555
|
||||||
|
border-bottom solid 1px #555
|
||||||
|
|
||||||
|
> .avatar
|
||||||
|
height 48px
|
||||||
|
border-radius 100%
|
||||||
|
vertical-align middle
|
||||||
|
|
||||||
|
> .name
|
||||||
|
margin 0 16px
|
||||||
|
padding 0
|
||||||
|
color #fff
|
||||||
|
overflow hidden
|
||||||
|
text-overflow ellipsis
|
||||||
|
white-space nowrap
|
||||||
|
font-size 15px
|
||||||
|
|
||||||
|
> .back-to-misskey
|
||||||
|
margin 16px 16px 0 16px
|
||||||
|
padding 0
|
||||||
|
border-top solid 1px #555
|
||||||
|
|
||||||
|
> a
|
||||||
|
display block
|
||||||
|
padding 16px 4px
|
||||||
|
color inherit
|
||||||
|
text-decoration none
|
||||||
|
color #eee
|
||||||
|
font-size 15px
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 6px
|
||||||
|
|
||||||
|
> .version
|
||||||
|
margin 0 16px 16px 16px
|
||||||
|
padding-top 16px
|
||||||
|
border-top solid 1px #555
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> small
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
> ul
|
||||||
|
margin 0
|
||||||
|
padding 0
|
||||||
|
list-style none
|
||||||
|
font-size 15px
|
||||||
|
|
||||||
|
> li
|
||||||
|
display block
|
||||||
|
padding 10px 16px
|
||||||
|
margin 0
|
||||||
|
cursor pointer
|
||||||
|
user-select none
|
||||||
|
color #eee
|
||||||
|
transition margin-left 0.2s ease
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 6px
|
||||||
|
|
||||||
|
&.active
|
||||||
|
margin-left 8px
|
||||||
|
color var(--primary) !important
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
right 0
|
||||||
|
bottom 0
|
||||||
|
margin auto 0
|
||||||
|
height 0
|
||||||
|
border-top solid 16px transparent
|
||||||
|
border-right solid 16px var(--bg)
|
||||||
|
border-bottom solid 16px transparent
|
||||||
|
border-left solid 16px transparent
|
||||||
|
|
||||||
|
> .nav-backdrop
|
||||||
|
position fixed
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
z-index 20000
|
||||||
|
width 100%
|
||||||
|
height 100%
|
||||||
|
background var(--mobileNavBackdrop)
|
||||||
|
|
||||||
|
> main
|
||||||
|
width 100%
|
||||||
|
padding 0 0 0 250px
|
||||||
|
max-width 1300px
|
||||||
|
|
||||||
|
&.isMobile
|
||||||
|
> main
|
||||||
|
padding $headerHeight 0 0 0
|
||||||
|
|
||||||
|
</style>
|
||||||
195
src/client/app/admin/views/instance.vue
Normal file
195
src/client/app/admin/views/instance.vue
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
<template>
|
||||||
|
<div class="axbwjelsbymowqjyywpirzhdlszoncqs">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="cog"/> %i18n:@instance%</div>
|
||||||
|
<section class="fit-top fit-bottom">
|
||||||
|
<ui-input v-model="name">%i18n:@instance-name%</ui-input>
|
||||||
|
<ui-textarea v-model="description">%i18n:@instance-description%</ui-textarea>
|
||||||
|
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>%i18n:@banner-url%</ui-input>
|
||||||
|
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>%i18n:@languages%<span slot="desc">%i18n:@languages-desc%</span></ui-input>
|
||||||
|
</section>
|
||||||
|
<section class="fit-bottom">
|
||||||
|
<header><fa icon="headset"/> %i18n:@maintainer-config%</header>
|
||||||
|
<ui-input v-model="maintainerName">%i18n:@maintainer-name%</ui-input>
|
||||||
|
<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="['far', 'envelope']"/></i>%i18n:@maintainer-email%</ui-input>
|
||||||
|
</section>
|
||||||
|
<section class="fit-top fit-bottom">
|
||||||
|
<ui-input v-model="maxNoteTextLength">%i18n:@max-note-text-length%</ui-input>
|
||||||
|
</section>
|
||||||
|
<section class="fit-bottom">
|
||||||
|
<header><fa icon="cloud"/> %i18n:@drive-config%</header>
|
||||||
|
<ui-switch v-model="cacheRemoteFiles">%i18n:@cache-remote-files%<span slot="desc">%i18n:@cache-remote-files-desc%</span></ui-switch>
|
||||||
|
<ui-input v-model="localDriveCapacityMb">%i18n:@local-drive-capacity-mb%<span slot="suffix">MB</span><span slot="desc">%i18n:@mb%</span></ui-input>
|
||||||
|
<ui-input v-model="remoteDriveCapacityMb" :disabled="!cacheRemoteFiles">%i18n:@remote-drive-capacity-mb%<span slot="suffix">MB</span><span slot="desc">%i18n:@mb%</span></ui-input>
|
||||||
|
</section>
|
||||||
|
<section class="fit-bottom">
|
||||||
|
<header><fa icon="shield-alt"/> %i18n:@recaptcha-config%</header>
|
||||||
|
<ui-switch v-model="enableRecaptcha">%i18n:@enable-recaptcha%</ui-switch>
|
||||||
|
<ui-info>%i18n:@recaptcha-info%</ui-info>
|
||||||
|
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-site-key%</ui-input>
|
||||||
|
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>%i18n:@recaptcha-secret-key%</ui-input>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<header><fa icon="ghost"/> %i18n:@proxy-account-config%</header>
|
||||||
|
<ui-info>%i18n:@proxy-account-info%</ui-info>
|
||||||
|
<ui-input v-model="proxyAccount"><span slot="prefix">@</span>%i18n:@proxy-account-username%<span slot="desc">%i18n:@proxy-account-username-desc%</span></ui-input>
|
||||||
|
<ui-info warn>%i18n:@proxy-account-warn%</ui-info>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-switch v-model="disableRegistration">%i18n:@disable-registration%</ui-switch>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-switch v-model="disableLocalTimeline">%i18n:@disable-local-timeline%</ui-switch>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@invite%</div>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="invite">%i18n:@invite%</ui-button>
|
||||||
|
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa :icon="['fab', 'twitter']"/> %i18n:@twitter-integration-config%</div>
|
||||||
|
<section>
|
||||||
|
<ui-switch v-model="enableTwitterIntegration">%i18n:@enable-twitter-integration%</ui-switch>
|
||||||
|
<ui-info>%i18n:@twitter-integration-info%</ui-info>
|
||||||
|
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@twitter-integration-consumer-key%</ui-input>
|
||||||
|
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@twitter-integration-consumer-secret%</ui-input>
|
||||||
|
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa :icon="['fab', 'github']"/> %i18n:@github-integration-config%</div>
|
||||||
|
<section>
|
||||||
|
<ui-switch v-model="enableGithubIntegration">%i18n:@enable-github-integration%</ui-switch>
|
||||||
|
<ui-info>%i18n:@github-integration-info%</ui-info>
|
||||||
|
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@github-integration-client-id%</ui-input>
|
||||||
|
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>%i18n:@github-integration-client-secret%</ui-input>
|
||||||
|
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
maintainerName: null,
|
||||||
|
maintainerEmail: null,
|
||||||
|
disableRegistration: false,
|
||||||
|
disableLocalTimeline: false,
|
||||||
|
bannerUrl: null,
|
||||||
|
name: null,
|
||||||
|
description: null,
|
||||||
|
languages: null,
|
||||||
|
cacheRemoteFiles: false,
|
||||||
|
localDriveCapacityMb: null,
|
||||||
|
remoteDriveCapacityMb: null,
|
||||||
|
maxNoteTextLength: null,
|
||||||
|
enableRecaptcha: false,
|
||||||
|
recaptchaSiteKey: null,
|
||||||
|
recaptchaSecretKey: null,
|
||||||
|
enableTwitterIntegration: false,
|
||||||
|
twitterConsumerKey: null,
|
||||||
|
twitterConsumerSecret: null,
|
||||||
|
enableGithubIntegration: false,
|
||||||
|
githubClientId: null,
|
||||||
|
githubClientSecret: null,
|
||||||
|
proxyAccount: null,
|
||||||
|
inviteCode: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.maintainerName = meta.maintainer.name;
|
||||||
|
this.maintainerEmail = meta.maintainer.email;
|
||||||
|
this.bannerUrl = meta.bannerUrl;
|
||||||
|
this.name = meta.name;
|
||||||
|
this.description = meta.description;
|
||||||
|
this.languages = meta.langs.join(' ');
|
||||||
|
this.cacheRemoteFiles = meta.cacheRemoteFiles;
|
||||||
|
this.localDriveCapacityMb = meta.driveCapacityPerLocalUserMb;
|
||||||
|
this.remoteDriveCapacityMb = meta.driveCapacityPerRemoteUserMb;
|
||||||
|
this.maxNoteTextLength = meta.maxNoteTextLength;
|
||||||
|
this.enableRecaptcha = meta.enableRecaptcha;
|
||||||
|
this.recaptchaSiteKey = meta.recaptchaSiteKey;
|
||||||
|
this.recaptchaSecretKey = meta.recaptchaSecretKey;
|
||||||
|
this.proxyAccount = meta.proxyAccount;
|
||||||
|
this.enableTwitterIntegration = meta.enableTwitterIntegration;
|
||||||
|
this.twitterConsumerKey = meta.twitterConsumerKey;
|
||||||
|
this.twitterConsumerSecret = meta.twitterConsumerSecret;
|
||||||
|
this.enableGithubIntegration = meta.enableGithubIntegration;
|
||||||
|
this.githubClientId = meta.githubClientId;
|
||||||
|
this.githubClientSecret = meta.githubClientSecret;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
invite() {
|
||||||
|
(this as any).api('admin/invite').then(x => {
|
||||||
|
this.inviteCode = x.code;
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateMeta() {
|
||||||
|
(this as any).api('admin/update-meta', {
|
||||||
|
maintainerName: this.maintainerName,
|
||||||
|
maintainerEmail: this.maintainerEmail,
|
||||||
|
disableRegistration: this.disableRegistration,
|
||||||
|
disableLocalTimeline: this.disableLocalTimeline,
|
||||||
|
bannerUrl: this.bannerUrl,
|
||||||
|
name: this.name,
|
||||||
|
description: this.description,
|
||||||
|
langs: this.languages.split(' '),
|
||||||
|
cacheRemoteFiles: this.cacheRemoteFiles,
|
||||||
|
localDriveCapacityMb: parseInt(this.localDriveCapacityMb, 10),
|
||||||
|
remoteDriveCapacityMb: parseInt(this.remoteDriveCapacityMb, 10),
|
||||||
|
maxNoteTextLength: parseInt(this.maxNoteTextLength, 10),
|
||||||
|
enableRecaptcha: this.enableRecaptcha,
|
||||||
|
recaptchaSiteKey: this.recaptchaSiteKey,
|
||||||
|
recaptchaSecretKey: this.recaptchaSecretKey,
|
||||||
|
proxyAccount: this.proxyAccount,
|
||||||
|
enableTwitterIntegration: this.enableTwitterIntegration,
|
||||||
|
twitterConsumerKey: this.twitterConsumerKey,
|
||||||
|
twitterConsumerSecret: this.twitterConsumerSecret,
|
||||||
|
enableGithubIntegration: this.enableGithubIntegration,
|
||||||
|
githubClientId: this.githubClientId,
|
||||||
|
githubClientSecret: this.githubClientSecret,
|
||||||
|
}).then(() => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@saved%'
|
||||||
|
});
|
||||||
|
}).catch(e => {
|
||||||
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.axbwjelsbymowqjyywpirzhdlszoncqs
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
||||||
136
src/client/app/admin/views/users.vue
Normal file
136
src/client/app/admin/views/users.vue
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
<template>
|
||||||
|
<div class="ucnffhbtogqgscfmqcymwmmupoknpfsw">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@verify-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="verifyUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="verifyUser" :disabled="verifying">%i18n:@verify%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@unverify-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="unverifyUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@suspend-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="suspendUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="suspendUser" :disabled="suspending">%i18n:@suspend%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title">%i18n:@unsuspend-user%</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input v-model="unsuspendUsername" type="text">
|
||||||
|
<span slot="prefix">@</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-button @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import parseAcct from "../../../../misc/acct/parse";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
verifyUsername: null,
|
||||||
|
verifying: false,
|
||||||
|
unverifyUsername: null,
|
||||||
|
unverifying: false,
|
||||||
|
suspendUsername: null,
|
||||||
|
suspending: false,
|
||||||
|
unsuspendUsername: null,
|
||||||
|
unsuspending: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
async verifyUser() {
|
||||||
|
this.verifying = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.verifyUsername));
|
||||||
|
await (this as any).os.api('admin/verify-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@verified%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.verifying = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
async unverifyUser() {
|
||||||
|
this.unverifying = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.unverifyUsername));
|
||||||
|
await (this as any).os.api('admin/unverify-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@unverified%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.unverifying = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
async suspendUser() {
|
||||||
|
this.suspending = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.suspendUsername));
|
||||||
|
await (this as any).os.api('admin/suspend-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@suspended%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.suspending = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
async unsuspendUser() {
|
||||||
|
this.unsuspending = true;
|
||||||
|
|
||||||
|
const process = async () => {
|
||||||
|
const user = await (this as any).os.api('users/show', parseAcct(this.unsuspendUsername));
|
||||||
|
await (this as any).os.api('admin/unsuspend-user', { userId: user.id });
|
||||||
|
//(this as any).os.apis.dialog({ text: '%i18n:@unsuspended%' });
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
//(this as any).os.apis.dialog({ text: `Failed: ${e}` });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.unsuspending = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.ucnffhbtogqgscfmqcymwmmupoknpfsw
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -128,7 +128,7 @@ pre
|
|||||||
overflow auto
|
overflow auto
|
||||||
tab-size 2
|
tab-size 2
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
display inline-block
|
display inline-block
|
||||||
|
|
||||||
.swal2-container
|
.swal2-container
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs';
|
if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs';
|
||||||
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';
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
//#region Detect the user language
|
//#region Detect the user language
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import MiOS from '../../mios';
|
import MiOS from '../../mios';
|
||||||
import { version as current } from '../../config';
|
import { clientVersion as current } from '../../config';
|
||||||
|
|
||||||
export default async function(mios: MiOS, force = false, silent = false) {
|
export default async function(mios: MiOS, force = false, silent = false) {
|
||||||
const meta = await mios.getMeta(force);
|
const meta = await mios.getMeta(force);
|
||||||
|
|||||||
@@ -37,10 +37,6 @@ export default (opts: Opts = {}) => ({
|
|||||||
'ctrl+q': this.renoteDirectly,
|
'ctrl+q': this.renoteDirectly,
|
||||||
'up|k|shift+tab': this.focusBefore,
|
'up|k|shift+tab': this.focusBefore,
|
||||||
'down|j|tab': this.focusAfter,
|
'down|j|tab': this.focusAfter,
|
||||||
'shift+up': () => this.$emit('parentFocus', 'up'),
|
|
||||||
'shift+down': () => this.$emit('parentFocus', 'down'),
|
|
||||||
'shift+left': () => this.$emit('parentFocus', 'left'),
|
|
||||||
'shift+right': () => this.$emit('parentFocus', 'right'),
|
|
||||||
'esc': this.blur,
|
'esc': this.blur,
|
||||||
'm|o': () => this.menu(true),
|
'm|o': () => this.menu(true),
|
||||||
's': this.toggleShowContent,
|
's': this.toggleShowContent,
|
||||||
|
|||||||
73
src/client/app/common/views/components/api-settings.vue
Normal file
73
src/client/app/common/views/components/api-settings.vue
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<template>
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="key"/> API</div>
|
||||||
|
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-input :value="$store.state.i.token" readonly>
|
||||||
|
<span>%i18n:@token%</span>
|
||||||
|
</ui-input>
|
||||||
|
<p>%i18n:@intro%</p>
|
||||||
|
<ui-info warn>%i18n:@caution%</ui-info>
|
||||||
|
<p>%i18n:@regeneration-of-token%</p>
|
||||||
|
<ui-button @click="regenerateToken"><fa icon="sync-alt"/> %i18n:@regenerate-token%</ui-button>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<header><fa icon="terminal"/> %i18n:@console.title%</header>
|
||||||
|
<ui-input v-model="endpoint">
|
||||||
|
<span>%i18n:@console.endpoint%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-textarea v-model="body">
|
||||||
|
<span>%i18n:@console.parameter% (JSON or JSON5)</span>
|
||||||
|
<span slot="desc">%i18n:@console.credential-info%</span>
|
||||||
|
</ui-textarea>
|
||||||
|
<ui-button @click="send" :disabled="sending">
|
||||||
|
<template v-if="sending">%i18n:@console.sending%</template>
|
||||||
|
<template v-else><fa icon="paper-plane"/> %i18n:@console.send%</template>
|
||||||
|
</ui-button>
|
||||||
|
<ui-textarea v-if="res" v-model="res" readonly tall>
|
||||||
|
<span>%i18n:@console.response%</span>
|
||||||
|
</ui-textarea>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as JSON5 from 'json5';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
endpoint: '',
|
||||||
|
body: '{}',
|
||||||
|
res: null,
|
||||||
|
sending: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
regenerateToken() {
|
||||||
|
(this as any).apis.input({
|
||||||
|
title: '%i18n:@enter-password%',
|
||||||
|
type: 'password'
|
||||||
|
}).then(password => {
|
||||||
|
(this as any).api('i/regenerate_token', {
|
||||||
|
password: password
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
send() {
|
||||||
|
this.sending = true;
|
||||||
|
(this as any).api(this.endpoint, JSON5.parse(this.body)).then(res => {
|
||||||
|
this.sending = false;
|
||||||
|
this.res = JSON5.stringify(res, null, 2);
|
||||||
|
}, err => {
|
||||||
|
this.sending = false;
|
||||||
|
this.res = JSON5.stringify(err, null, 2);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -14,9 +14,11 @@
|
|||||||
</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">{{ emoji.emoji }}</span>
|
<span class="emoji" v-if="emoji.isCustomEmoji"><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="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
||||||
<span class="alias" v-if="emoji.alias">({{ emoji.alias }})</span>
|
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
@@ -27,14 +29,29 @@ 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';
|
||||||
|
|
||||||
|
type EmojiDef = {
|
||||||
|
emoji: string;
|
||||||
|
name: string;
|
||||||
|
aliasOf?: string;
|
||||||
|
url?: string;
|
||||||
|
isCustomEmoji?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
||||||
return x[1].category != 'flags';
|
return x[1].category != 'flags';
|
||||||
});
|
});
|
||||||
|
|
||||||
const emjdb = lib.map((x: any) => ({
|
const char2file = (char: string) => {
|
||||||
|
let codes = [...char].map(x => x.codePointAt(0).toString(16));
|
||||||
|
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
|
||||||
|
return codes.join('-');
|
||||||
|
};
|
||||||
|
|
||||||
|
const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: x[0],
|
name: x[0],
|
||||||
alias: null
|
aliasOf: null,
|
||||||
|
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
||||||
}));
|
}));
|
||||||
|
|
||||||
lib.forEach((x: any) => {
|
lib.forEach((x: any) => {
|
||||||
@@ -43,7 +60,8 @@ lib.forEach((x: any) => {
|
|||||||
emjdb.push({
|
emjdb.push({
|
||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: k,
|
name: k,
|
||||||
alias: x[0]
|
aliasOf: x[0],
|
||||||
|
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -61,13 +79,18 @@ export default Vue.extend({
|
|||||||
hashtags: [],
|
hashtags: [],
|
||||||
emojis: [],
|
emojis: [],
|
||||||
select: -1,
|
select: -1,
|
||||||
emojilib
|
emojilib,
|
||||||
|
emojiDb: [] as EmojiDef[]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
items(): HTMLCollection {
|
items(): HTMLCollection {
|
||||||
return (this.$refs.suggests as Element).children;
|
return (this.$refs.suggests as Element).children;
|
||||||
|
},
|
||||||
|
|
||||||
|
useOsDefaultEmojis(): boolean {
|
||||||
|
return this.$store.state.device.useOsDefaultEmojis;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -90,6 +113,36 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
//#region Construct Emoji DB
|
||||||
|
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis || [];
|
||||||
|
const emojiDefinitions: EmojiDef[] = [];
|
||||||
|
|
||||||
|
customEmojis.forEach(x => {
|
||||||
|
emojiDefinitions.push({
|
||||||
|
name: x.name,
|
||||||
|
emoji: `:${x.name}:`,
|
||||||
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (x.aliases) {
|
||||||
|
x.aliases.forEach(alias => {
|
||||||
|
emojiDefinitions.push({
|
||||||
|
name: alias,
|
||||||
|
aliasOf: x.name,
|
||||||
|
emoji: `:${x.name}:`,
|
||||||
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
||||||
|
|
||||||
|
this.emojiDb = emojiDefinitions.concat(emjdb);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
this.textarea.addEventListener('keydown', this.onKeydown);
|
this.textarea.addEventListener('keydown', this.onKeydown);
|
||||||
|
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||||
@@ -168,23 +221,35 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (this.type == 'emoji') {
|
} else if (this.type == 'emoji') {
|
||||||
|
if (this.q == null || this.q == '') {
|
||||||
|
this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => {
|
||||||
|
var textA = a.name.toUpperCase();
|
||||||
|
var textB = b.name.toUpperCase();
|
||||||
|
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const matched = [];
|
const matched = [];
|
||||||
emjdb.some(x => {
|
const max = 30;
|
||||||
if (x.name.indexOf(this.q) == 0 && !x.alias && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
|
||||||
return matched.length == 30;
|
this.emojiDb.some(x => {
|
||||||
|
if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
if (matched.length < 30) {
|
if (matched.length < max) {
|
||||||
emjdb.some(x => {
|
this.emojiDb.some(x => {
|
||||||
if (x.name.indexOf(this.q) == 0 && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
return matched.length == 30;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (matched.length < 30) {
|
if (matched.length < max) {
|
||||||
emjdb.some(x => {
|
this.emojiDb.some(x => {
|
||||||
if (x.name.indexOf(this.q) > -1 && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
|
||||||
return matched.length == 30;
|
return matched.length == max;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emojis = matched;
|
this.emojis = matched;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -340,6 +405,10 @@ export default Vue.extend({
|
|||||||
margin 0 4px 0 0
|
margin 0 4px 0 0
|
||||||
width 24px
|
width 24px
|
||||||
|
|
||||||
|
> img
|
||||||
|
width 24px
|
||||||
|
vertical-align bottom
|
||||||
|
|
||||||
.name
|
.name
|
||||||
color var(--autocompleteItemText)
|
color var(--autocompleteItemText)
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +1,35 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="troubleshooter">
|
<div class="troubleshooter">
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<h1>%fa:wrench%%i18n:@title%</h1>
|
<h1><fa icon="wrench"/>%i18n:@title%</h1>
|
||||||
<div>
|
<div>
|
||||||
<p :data-wip="network == null">
|
<p :data-wip="network == null">
|
||||||
<template v-if="network != null">
|
<template v-if="network != null">
|
||||||
<template v-if="network">%fa:check%</template>
|
<template v-if="network"><fa icon="check"/></template>
|
||||||
<template v-if="!network">%fa:times%</template>
|
<template v-if="!network"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
|
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="network == true" :data-wip="internet == null">
|
<p v-if="network == true" :data-wip="internet == null">
|
||||||
<template v-if="internet != null">
|
<template v-if="internet != null">
|
||||||
<template v-if="internet">%fa:check%</template>
|
<template v-if="internet"><fa icon="check"/></template>
|
||||||
<template v-if="!internet">%fa:times%</template>
|
<template v-if="!internet"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
|
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="internet == true" :data-wip="server == null">
|
<p v-if="internet == true" :data-wip="server == null">
|
||||||
<template v-if="server != null">
|
<template v-if="server != null">
|
||||||
<template v-if="server">%fa:check%</template>
|
<template v-if="server"><fa icon="check"/></template>
|
||||||
<template v-if="!server">%fa:times%</template>
|
<template v-if="!server"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
|
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
|
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
|
||||||
<p v-if="network === false"><b>%fa:exclamation-triangle%%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
|
<p v-if="network === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
|
||||||
<p v-if="internet === false"><b>%fa:exclamation-triangle%%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
|
<p v-if="internet === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
|
||||||
<p v-if="server === false"><b>%fa:exclamation-triangle%%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
|
<p v-if="server === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
|
||||||
<p v-if="server === true" class="success"><b>%fa:info-circle%%i18n:@success%</b><br>%i18n:@success-desc%</p>
|
<p v-if="server === true" class="success"><b><fa icon="info-circle"/>%i18n:@success%</b><br>%i18n:@success-desc%</p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
|
<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
|
||||||
@@ -100,7 +100,7 @@ export default Vue.extend({
|
|||||||
color #444
|
color #444
|
||||||
border-bottom solid 1px #eee
|
border-bottom solid 1px #eee
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
> div
|
> div
|
||||||
@@ -115,7 +115,7 @@ export default Vue.extend({
|
|||||||
&[data-wip]
|
&[data-wip]
|
||||||
color #888
|
color #888
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
&.times
|
&.times
|
||||||
@@ -132,7 +132,7 @@ export default Vue.extend({
|
|||||||
border-top solid 1px #eee
|
border-top solid 1px #eee
|
||||||
|
|
||||||
> b
|
> b
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
&.success
|
&.success
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-connect-failed">
|
<div class="mk-connect-failed">
|
||||||
<img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/>
|
<img src="https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg" alt=""/>
|
||||||
<h1>%i18n:@title%</h1>
|
<h1>%i18n:@title%</h1>
|
||||||
<p class="text">
|
<p class="text">
|
||||||
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
|
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
|
||||||
|
|||||||
171
src/client/app/common/views/components/drive-settings.vue
Normal file
171
src/client/app/common/views/components/drive-settings.vue
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
<template>
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="cloud"/> %i18n:common.drive%</div>
|
||||||
|
|
||||||
|
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
|
||||||
|
<div class="meter"><div :style="meterStyle"></div></div>
|
||||||
|
<p>%i18n:@max%: <b>{{ capacity | bytes }}</b> %i18n:@in-use%: <b>{{ usage | bytes }}</b></p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<header>%i18n:@stats%</header>
|
||||||
|
<div ref="chart" style="margin-bottom: -16px; color: #000;"></div>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
import * as ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
usage: null,
|
||||||
|
capacity: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
meterStyle(): any {
|
||||||
|
return {
|
||||||
|
width: `${this.usage / this.capacity * 100}%`,
|
||||||
|
background: tinycolor({
|
||||||
|
h: 180 - (this.usage / this.capacity * 180),
|
||||||
|
s: 0.7,
|
||||||
|
l: 0.5
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
(this as any).api('drive').then(info => {
|
||||||
|
this.capacity = info.capacity;
|
||||||
|
this.usage = info.usage;
|
||||||
|
this.fetching = false;
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.renderChart();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
renderChart() {
|
||||||
|
(this as any).api('charts/user/drive', {
|
||||||
|
userId: this.$store.state.i.id,
|
||||||
|
span: 'day',
|
||||||
|
limit: 21
|
||||||
|
}).then(stats => {
|
||||||
|
const addition = [];
|
||||||
|
const deletion = [];
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const y = now.getFullYear();
|
||||||
|
const m = now.getMonth();
|
||||||
|
const d = now.getDate();
|
||||||
|
|
||||||
|
for (let i = 0; i < 21; i++) {
|
||||||
|
const x = new Date(y, m, d - i);
|
||||||
|
addition.push([
|
||||||
|
x,
|
||||||
|
stats.incSize[i]
|
||||||
|
]);
|
||||||
|
deletion.push([
|
||||||
|
x,
|
||||||
|
-stats.decSize[i]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const chart = new ApexCharts(this.$refs.chart, {
|
||||||
|
chart: {
|
||||||
|
type: 'bar',
|
||||||
|
stacked: true,
|
||||||
|
height: 150,
|
||||||
|
zoom: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plotOptions: {
|
||||||
|
bar: {
|
||||||
|
columnWidth: '90%',
|
||||||
|
endingShape: 'rounded'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
shared: true,
|
||||||
|
intersect: false
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
name: 'Additions',
|
||||||
|
data: addition
|
||||||
|
}, {
|
||||||
|
name: 'Deletions',
|
||||||
|
data: deletion
|
||||||
|
}],
|
||||||
|
xaxis: {
|
||||||
|
type: 'datetime',
|
||||||
|
labels: {
|
||||||
|
style: {
|
||||||
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisBorder: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
axisTicks: {
|
||||||
|
color: 'rgba(0, 0, 0, 0.1)'
|
||||||
|
},
|
||||||
|
crosshairs: {
|
||||||
|
width: 1,
|
||||||
|
opacity: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
labels: {
|
||||||
|
formatter: v => Vue.filter('bytes')(v, 0),
|
||||||
|
style: {
|
||||||
|
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
chart.render();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.juakhbxthdewydyreaphkepoxgxvfogn
|
||||||
|
> .meter
|
||||||
|
$size = 12px
|
||||||
|
|
||||||
|
margin-bottom 16px
|
||||||
|
background rgba(0, 0, 0, 0.1)
|
||||||
|
border-radius ($size / 2)
|
||||||
|
overflow hidden
|
||||||
|
|
||||||
|
> div
|
||||||
|
height $size
|
||||||
|
border-radius ($size / 2)
|
||||||
|
|
||||||
|
> p
|
||||||
|
margin 0
|
||||||
|
|
||||||
|
</style>
|
||||||
85
src/client/app/common/views/components/emoji.vue
Normal file
85
src/client/app/common/views/components/emoji.vue
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<template>
|
||||||
|
<img v-if="customEmoji" class="fvgwvorwhxigeolkkrcderjzcawqrscl custom" :src="url" :alt="alt" :title="alt"/>
|
||||||
|
<img v-else-if="char && !useOsDefaultEmojis" class="fvgwvorwhxigeolkkrcderjzcawqrscl" :src="url" :alt="alt" :title="alt"/>
|
||||||
|
<span v-else-if="char && useOsDefaultEmojis">{{ char }}</span>
|
||||||
|
<span v-else>:{{ name }}:</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { lib } from 'emojilib';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
emoji: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
customEmojis: {
|
||||||
|
required: false,
|
||||||
|
default: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
url: null,
|
||||||
|
char: null,
|
||||||
|
customEmoji: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
alt(): string {
|
||||||
|
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
|
||||||
|
},
|
||||||
|
|
||||||
|
useOsDefaultEmojis(): boolean {
|
||||||
|
return this.$store.state.device.useOsDefaultEmojis;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
if (this.name) {
|
||||||
|
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
||||||
|
if (customEmoji) {
|
||||||
|
this.customEmoji = customEmoji;
|
||||||
|
this.url = customEmoji.url;
|
||||||
|
} else {
|
||||||
|
const emoji = lib[this.name];
|
||||||
|
if (emoji) {
|
||||||
|
this.char = emoji.char;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.char = this.emoji;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.char) {
|
||||||
|
let codes = [...this.char].map(x => x.codePointAt(0).toString(16));
|
||||||
|
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
|
||||||
|
|
||||||
|
this.url = `https://twemoji.maxcdn.com/2/svg/${codes.join('-')}.svg`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.fvgwvorwhxigeolkkrcderjzcawqrscl
|
||||||
|
height 1.25em
|
||||||
|
vertical-align -0.25em
|
||||||
|
|
||||||
|
&.custom
|
||||||
|
height 2.5em
|
||||||
|
vertical-align middle
|
||||||
|
transition transform 0.2s ease
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
transform scale(1.2)
|
||||||
|
|
||||||
|
</style>
|
||||||
19
src/client/app/common/views/components/error.vue
Normal file
19
src/client/app/common/views/components/error.vue
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<template>
|
||||||
|
<div class="wjqjnyhzogztorhrdgcpqlkxhkmuetgj">
|
||||||
|
<p><fa icon="exclamation-triangle"/> %i18n:common.error.title%</p>
|
||||||
|
<ui-button @click="() => $emit('retry')">%i18n:common.error.retry%</ui-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.wjqjnyhzogztorhrdgcpqlkxhkmuetgj
|
||||||
|
max-width 350px
|
||||||
|
margin 0 auto
|
||||||
|
padding 32px
|
||||||
|
text-align center
|
||||||
|
color var(--text)
|
||||||
|
|
||||||
|
> p
|
||||||
|
margin 0 0 8px 0
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="mk-file-type-icon">
|
<span class="mk-file-type-icon">
|
||||||
<template v-if="kind == 'image'">%fa:file-image%</template>
|
<template v-if="kind == 'image'"><fa icon="file-image"/></template>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a class="a" href="https://github.com/syuilo/misskey" target="_blank" title="View source on Github">
|
<a class="a" href="https://github.com/syuilo/misskey" target="_blank" title="View source on GitHub">
|
||||||
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
|
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
|
||||||
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
||||||
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>
|
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
||||||
<button class="go-index" v-if="selfNav" @click="goIndex">%fa:arrow-left%</button>
|
<button class="go-index" v-if="selfNav" @click="goIndex"><fa icon="arrow-left"/></button>
|
||||||
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
||||||
|
|
||||||
<div style="overflow: hidden; line-height: 28px;">
|
<div style="overflow: hidden; line-height: 28px;">
|
||||||
@@ -51,13 +51,13 @@
|
|||||||
|
|
||||||
<div class="player" v-if="game.isEnded">
|
<div class="player" v-if="game.isEnded">
|
||||||
<div>
|
<div>
|
||||||
<button @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</button>
|
<button @click="logPos = 0" :disabled="logPos == 0"><fa icon="angle-double-left"/></button>
|
||||||
<button @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</button>
|
<button @click="logPos--" :disabled="logPos == 0"><fa icon="angle-left"/></button>
|
||||||
</div>
|
</div>
|
||||||
<span>{{ logPos }} / {{ logs.length }}</span>
|
<span>{{ logPos }} / {{ logs.length }}</span>
|
||||||
<div>
|
<div>
|
||||||
<button @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</button>
|
<button @click="logPos++" :disabled="logPos == logs.length"><fa icon="angle-right"/></button>
|
||||||
<button @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</button>
|
<button @click="logPos = logs.length" :disabled="logPos == logs.length"><fa icon="angle-double-right"/></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="random" v-if="game.settings.map == null">%fa:dice%</div>
|
<div class="random" v-if="game.settings.map == null"><fa icon="dice"/></div>
|
||||||
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
|
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
|
||||||
<div v-for="(x, i) in game.settings.map.join('')"
|
<div v-for="(x, i) in game.settings.map.join('')"
|
||||||
:data-none="x == ' '"
|
:data-none="x == ' '"
|
||||||
@click="onPixelClick(i, x)">
|
@click="onPixelClick(i, x)">
|
||||||
<template v-if="x == 'b'"><template v-if="$store.state.device.darkmode">%fa:circle R%</template><template v-else>%fa:circle%</template></template>
|
<template v-if="x == 'b'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
|
||||||
<template v-if="x == 'w'"><template v-if="$store.state.device.darkmode">%fa:circle%</template><template v-else>%fa:circle R%</template></template>
|
<template v-if="x == 'w'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
63
src/client/app/common/views/components/github-setting.vue
Normal file
63
src/client/app/common/views/components/github-setting.vue
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mk-github-setting">
|
||||||
|
<p>%i18n:@description%<a :href="`${docsUrl}/link-to-github`" target="_blank">%i18n:@detail%</a></p>
|
||||||
|
<p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">%i18n:@connected-to%: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
|
||||||
|
<p>
|
||||||
|
<a :href="`${apiUrl}/connect/github`" target="_blank" @click.prevent="connect">{{ $store.state.i.github ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a>
|
||||||
|
<span v-if="$store.state.i.github"> or </span>
|
||||||
|
<a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github" @click.prevent="disconnect">%i18n:@disconnect%</a>
|
||||||
|
</p>
|
||||||
|
<p class="id" v-if="$store.state.i.github">GitHub ID: {{ $store.state.i.github.id }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { apiUrl, docsUrl } from '../../../config';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form: null,
|
||||||
|
apiUrl,
|
||||||
|
docsUrl
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.$watch('$store.state.i', () => {
|
||||||
|
if (this.$store.state.i.github && this.form)
|
||||||
|
this.form.close();
|
||||||
|
}, {
|
||||||
|
deep: true
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
connect() {
|
||||||
|
this.form = window.open(apiUrl + '/connect/github',
|
||||||
|
'github_connect_window',
|
||||||
|
'height=570, width=520');
|
||||||
|
},
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
window.open(apiUrl + '/disconnect/github',
|
||||||
|
'github_disconnect_window',
|
||||||
|
'height=570, width=520');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.mk-github-setting
|
||||||
|
.account
|
||||||
|
border solid 1px #e1e8ed
|
||||||
|
border-radius 4px
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
a
|
||||||
|
font-weight bold
|
||||||
|
color inherit
|
||||||
|
|
||||||
|
.id
|
||||||
|
color #8899a6
|
||||||
|
</style>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-google">
|
<div class="mk-google">
|
||||||
<input type="search" v-model="query" :placeholder="q">
|
<input type="search" v-model="query" :placeholder="q">
|
||||||
<button @click="search">%fa:search% %i18n:common.search%</button>
|
<button @click="search"><fa icon="search"/> %i18n:common.search%</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
import muteAndBlock from './mute-and-block.vue';
|
||||||
|
import error from './error.vue';
|
||||||
|
import apiSettings from './api-settings.vue';
|
||||||
|
import passwordSettings from './password-settings.vue';
|
||||||
|
import driveSettings from './drive-settings.vue';
|
||||||
import profileEditor from './profile-editor.vue';
|
import profileEditor from './profile-editor.vue';
|
||||||
import noteSkeleton from './note-skeleton.vue';
|
import noteSkeleton from './note-skeleton.vue';
|
||||||
import theme from './theme.vue';
|
import theme from './theme.vue';
|
||||||
@@ -32,20 +37,28 @@ import messaging from './messaging.vue';
|
|||||||
import messagingRoom from './messaging-room.vue';
|
import messagingRoom from './messaging-room.vue';
|
||||||
import urlPreview from './url-preview.vue';
|
import urlPreview from './url-preview.vue';
|
||||||
import twitterSetting from './twitter-setting.vue';
|
import twitterSetting from './twitter-setting.vue';
|
||||||
|
import githubSetting from './github-setting.vue';
|
||||||
import fileTypeIcon from './file-type-icon.vue';
|
import fileTypeIcon from './file-type-icon.vue';
|
||||||
import Reversi from './games/reversi/reversi.vue';
|
import emoji from './emoji.vue';
|
||||||
import welcomeTimeline from './welcome-timeline.vue';
|
import welcomeTimeline from './welcome-timeline.vue';
|
||||||
import uiInput from './ui/input.vue';
|
import uiInput from './ui/input.vue';
|
||||||
import uiButton from './ui/button.vue';
|
import uiButton from './ui/button.vue';
|
||||||
|
import uiHorizonGroup from './ui/horizon-group.vue';
|
||||||
import uiCard from './ui/card.vue';
|
import uiCard from './ui/card.vue';
|
||||||
import uiForm from './ui/form.vue';
|
import uiForm from './ui/form.vue';
|
||||||
import uiTextarea from './ui/textarea.vue';
|
import uiTextarea from './ui/textarea.vue';
|
||||||
import uiSwitch from './ui/switch.vue';
|
import uiSwitch from './ui/switch.vue';
|
||||||
import uiRadio from './ui/radio.vue';
|
import uiRadio from './ui/radio.vue';
|
||||||
import uiSelect from './ui/select.vue';
|
import uiSelect from './ui/select.vue';
|
||||||
|
import uiInfo from './ui/info.vue';
|
||||||
import formButton from './ui/form/button.vue';
|
import formButton from './ui/form/button.vue';
|
||||||
import formRadio from './ui/form/radio.vue';
|
import formRadio from './ui/form/radio.vue';
|
||||||
|
|
||||||
|
Vue.component('mk-mute-and-block', muteAndBlock);
|
||||||
|
Vue.component('mk-error', error);
|
||||||
|
Vue.component('mk-api-settings', apiSettings);
|
||||||
|
Vue.component('mk-password-settings', passwordSettings);
|
||||||
|
Vue.component('mk-drive-settings', driveSettings);
|
||||||
Vue.component('mk-profile-editor', profileEditor);
|
Vue.component('mk-profile-editor', profileEditor);
|
||||||
Vue.component('mk-note-skeleton', noteSkeleton);
|
Vue.component('mk-note-skeleton', noteSkeleton);
|
||||||
Vue.component('mk-theme', theme);
|
Vue.component('mk-theme', theme);
|
||||||
@@ -78,16 +91,19 @@ Vue.component('mk-messaging', messaging);
|
|||||||
Vue.component('mk-messaging-room', messagingRoom);
|
Vue.component('mk-messaging-room', messagingRoom);
|
||||||
Vue.component('mk-url-preview', urlPreview);
|
Vue.component('mk-url-preview', urlPreview);
|
||||||
Vue.component('mk-twitter-setting', twitterSetting);
|
Vue.component('mk-twitter-setting', twitterSetting);
|
||||||
|
Vue.component('mk-github-setting', githubSetting);
|
||||||
Vue.component('mk-file-type-icon', fileTypeIcon);
|
Vue.component('mk-file-type-icon', fileTypeIcon);
|
||||||
Vue.component('mk-reversi', Reversi);
|
Vue.component('mk-emoji', emoji);
|
||||||
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
||||||
Vue.component('ui-input', uiInput);
|
Vue.component('ui-input', uiInput);
|
||||||
Vue.component('ui-button', uiButton);
|
Vue.component('ui-button', uiButton);
|
||||||
|
Vue.component('ui-horizon-group', uiHorizonGroup);
|
||||||
Vue.component('ui-card', uiCard);
|
Vue.component('ui-card', uiCard);
|
||||||
Vue.component('ui-form', uiForm);
|
Vue.component('ui-form', uiForm);
|
||||||
Vue.component('ui-textarea', uiTextarea);
|
Vue.component('ui-textarea', uiTextarea);
|
||||||
Vue.component('ui-switch', uiSwitch);
|
Vue.component('ui-switch', uiSwitch);
|
||||||
Vue.component('ui-radio', uiRadio);
|
Vue.component('ui-radio', uiRadio);
|
||||||
Vue.component('ui-select', uiSelect);
|
Vue.component('ui-select', uiSelect);
|
||||||
|
Vue.component('ui-info', uiInfo);
|
||||||
Vue.component('form-button', formButton);
|
Vue.component('form-button', formButton);
|
||||||
Vue.component('form-radio', formRadio);
|
Vue.component('form-radio', formRadio);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-media-banner">
|
<div class="mk-media-banner">
|
||||||
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
||||||
<span class="icon">%fa:exclamation-triangle%</span>
|
<span class="icon"><fa icon="exclamation-triangle"/></span>
|
||||||
<b>%i18n:@sensitive%</b>
|
<b>%i18n:@sensitive%</b>
|
||||||
<span>%i18n:@click-to-show%</span>
|
<span>%i18n:@click-to-show%</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
:title="media.name"
|
:title="media.name"
|
||||||
:download="media.name"
|
:download="media.name"
|
||||||
>
|
>
|
||||||
<span class="icon">%fa:download%</span>
|
<span class="icon"><fa icon="download"/></span>
|
||||||
<b>{{ media.name }}</b>
|
<b>{{ media.name }}</b>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,7 +4,9 @@
|
|||||||
<div class="popover" :class="{ hukidasi }" ref="popover">
|
<div class="popover" :class="{ hukidasi }" ref="popover">
|
||||||
<template v-for="item, i in items">
|
<template v-for="item, i in items">
|
||||||
<div v-if="item === null"></div>
|
<div v-if="item === null"></div>
|
||||||
<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text" :tabindex="i"></button>
|
<button v-if="item" @click="clicked(item.action)" :tabindex="i">
|
||||||
|
<fa v-if="item.icon" :icon="item.icon"/>{{ item.text }}
|
||||||
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -188,6 +190,9 @@ export default Vue.extend({
|
|||||||
color var(--primaryForeground)
|
color var(--primaryForeground)
|
||||||
background var(--primaryDarken10)
|
background var(--primaryDarken10)
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
margin 8px 0
|
margin 8px 0
|
||||||
height 1px
|
height 1px
|
||||||
|
|||||||
@@ -14,13 +14,13 @@
|
|||||||
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
||||||
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
||||||
<button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%">
|
<button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%">
|
||||||
<template v-if="!sending">%fa:paper-plane%</template><template v-if="sending">%fa:spinner .spin%</template>
|
<template v-if="!sending"><fa icon="paper-plane"/></template><template v-if="sending"><fa icon="spinner .spin"/></template>
|
||||||
</button>
|
</button>
|
||||||
<button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%">
|
<button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%">
|
||||||
%fa:upload%
|
<fa icon="upload"/>
|
||||||
</button>
|
</button>
|
||||||
<button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%">
|
<button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%">
|
||||||
%fa:R folder-open%
|
<fa :icon="['far', 'folder-open']"/>
|
||||||
</button>
|
</button>
|
||||||
<input ref="file" type="file" @change="onChangeFile"/>
|
<input ref="file" type="file" @change="onChangeFile"/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span>
|
<span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span>
|
||||||
<mk-time :time="message.createdAt"/>
|
<mk-time :time="message.createdAt"/>
|
||||||
<template v-if="message.is_edited">%fa:pencil-alt%</template>
|
<template v-if="message.is_edited"><fa icon="pencil-alt"/></template>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -179,7 +179,10 @@ export default Vue.extend({
|
|||||||
font-size 10px
|
font-size 10px
|
||||||
color var(--messagingRoomMessageInfo)
|
color var(--messagingRoomMessageInfo)
|
||||||
|
|
||||||
> [data-fa]
|
> .read
|
||||||
|
margin 0 8px
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
margin-left 4px
|
margin-left 4px
|
||||||
|
|
||||||
&:not([data-is-me])
|
&:not([data-is-me])
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
@drop.prevent.stop="onDrop"
|
@drop.prevent.stop="onDrop"
|
||||||
>
|
>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p>
|
<p class="init" v-if="init"><fa icon="spinner .spin"/>%i18n:common.loading%</p>
|
||||||
<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p>
|
<p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>%i18n:@empty%</p>
|
||||||
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p>
|
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>%i18n:@no-history%</p>
|
||||||
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
||||||
<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
<template v-if="fetchingMoreMessages"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
||||||
</button>
|
</button>
|
||||||
<template v-for="(message, i) in _messages">
|
<template v-for="(message, i) in _messages">
|
||||||
<x-message :message="message" :key="message.id"/>
|
<x-message :message="message" :key="message.id"/>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<transition name="fade">
|
<transition name="fade">
|
||||||
<div class="new-message" v-show="showIndicator">
|
<div class="new-message" v-show="showIndicator">
|
||||||
<button @click="onIndicatorClick">%fa:arrow-circle-down%%i18n:@new-message%</button>
|
<button @click="onIndicatorClick"><i><fa icon="arrow-circle-down"/></i>%i18n:@new-message%</button>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
<x-form :user="user" ref="form"/>
|
<x-form :user="user" ref="form"/>
|
||||||
@@ -280,7 +280,7 @@ export default Vue.extend({
|
|||||||
color var(--messagingRoomInfo)
|
color var(--messagingRoomInfo)
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .no-history
|
> .no-history
|
||||||
@@ -292,7 +292,7 @@ export default Vue.extend({
|
|||||||
color var(--messagingRoomInfo)
|
color var(--messagingRoomInfo)
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .more
|
> .more
|
||||||
@@ -313,7 +313,7 @@ export default Vue.extend({
|
|||||||
&.fetching
|
&.fetching
|
||||||
cursor wait
|
cursor wait
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .message
|
> .message
|
||||||
@@ -381,7 +381,7 @@ export default Vue.extend({
|
|||||||
&:active
|
&:active
|
||||||
background var(--primaryDarken10)
|
background var(--primaryDarken10)
|
||||||
|
|
||||||
> [data-fa]
|
> i
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
left 10px
|
left 10px
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="mk-messaging" :data-compact="compact">
|
<div class="mk-messaging" :data-compact="compact">
|
||||||
<div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }">
|
<div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }">
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<label for="search-input">%fa:search%</label>
|
<label for="search-input"><i><fa icon="search"/></i></label>
|
||||||
<input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/>
|
<input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="result">
|
<div class="result">
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p>
|
<p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p>
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ export default Vue.extend({
|
|||||||
width 38px
|
width 38px
|
||||||
pointer-events none
|
pointer-events none
|
||||||
|
|
||||||
> [data-fa]
|
> i
|
||||||
display block
|
display block
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
@@ -418,7 +418,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
// TODO: element base media query
|
// TODO: element base media query
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import Vue, { VNode } from 'vue';
|
import Vue, { VNode } from 'vue';
|
||||||
import * as emojilib from 'emojilib';
|
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import getAcct from '../../../../../misc/acct/render';
|
import getAcct from '../../../../../misc/acct/render';
|
||||||
import { url } from '../../../config';
|
|
||||||
import MkUrl from './url.vue';
|
import MkUrl from './url.vue';
|
||||||
import MkGoogle from './google.vue';
|
import MkGoogle from './google.vue';
|
||||||
import { concat } from '../../../../../prelude/array';
|
import { concat } from '../../../../../prelude/array';
|
||||||
@@ -25,6 +23,9 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
i: {
|
i: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: null
|
default: null
|
||||||
|
},
|
||||||
|
customEmojis: {
|
||||||
|
required: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -186,8 +187,16 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'emoji': {
|
case 'emoji': {
|
||||||
const emoji = emojilib.lib[token.emoji];
|
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis || [];
|
||||||
return [createElement('span', emoji ? emoji.char : token.content)];
|
return [createElement('mk-emoji', {
|
||||||
|
attrs: {
|
||||||
|
emoji: token.emoji,
|
||||||
|
name: token.name
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
customEmojis: this.customEmojis || customEmojis
|
||||||
|
}
|
||||||
|
})];
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'search': {
|
case 'search': {
|
||||||
|
|||||||
52
src/client/app/common/views/components/mute-and-block.vue
Normal file
52
src/client/app/common/views/components/mute-and-block.vue
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<template>
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa icon="ban"/> %i18n:@mute-and-block%</div>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<header>%i18n:@mute%</header>
|
||||||
|
<ui-info v-if="!muteFetching && mute.length == 0">%i18n:@no-muted-users%</ui-info>
|
||||||
|
<div class="users" v-if="mute.length != 0">
|
||||||
|
<div v-for="user in mute" :key="user.id">
|
||||||
|
<p><b>{{ user | userName }}</b> @{{ user | acct }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<header>%i18n:@block%</header>
|
||||||
|
<ui-info v-if="!blockFetching && block.length == 0">%i18n:@no-blocked-users%</ui-info>
|
||||||
|
<div class="users" v-if="block.length != 0">
|
||||||
|
<div v-for="user in block" :key="user.id">
|
||||||
|
<p><b>{{ user | userName }}</b> @{{ user | acct }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
muteFetching: true,
|
||||||
|
blockFetching: true,
|
||||||
|
mute: [],
|
||||||
|
block: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
(this as any).api('mute/list').then(mute => {
|
||||||
|
this.mute = mute.map(x => x.mutee);
|
||||||
|
this.muteFetching = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
(this as any).api('blocking/list').then(blocking => {
|
||||||
|
this.block = blocking.map(x => x.blockee);
|
||||||
|
this.blockFetching = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -2,15 +2,11 @@
|
|||||||
<span class="mk-nav">
|
<span class="mk-nav">
|
||||||
<a :href="aboutUrl">%i18n:@about%</a>
|
<a :href="aboutUrl">%i18n:@about%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a href="/stats">%i18n:@stats%</a>
|
|
||||||
<i>・</i>
|
|
||||||
<a :href="repositoryUrl">%i18n:@repository%</a>
|
<a :href="repositoryUrl">%i18n:@repository%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a href="/dev">%i18n:@develop%</a>
|
<a href="/dev">%i18n:@develop%</a>
|
||||||
<i>・</i>
|
|
||||||
<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a>
|
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -2,22 +2,22 @@
|
|||||||
<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
|
<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
|
||||||
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
|
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
|
||||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
|
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
|
||||||
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:star%</span>
|
|
||||||
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
|
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
|
||||||
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
||||||
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
<span class="username"><mk-acct :user="note.user"/></span>
|
||||||
|
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%"><fa icon="star"/></span>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
|
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
|
||||||
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
|
<span class="mobile" v-if="note.viaMobile"><fa icon="mobile-alt"/></span>
|
||||||
<router-link class="created-at" :to="note | notePage">
|
<router-link class="created-at" :to="note | notePage">
|
||||||
<mk-time :time="note.createdAt"/>
|
<mk-time :time="note.createdAt"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
<span class="visibility" v-if="note.visibility != 'public'">
|
<span class="visibility" v-if="note.visibility != 'public'">
|
||||||
<template v-if="note.visibility == 'home'">%fa:home%</template>
|
<template v-if="note.visibility == 'home'"><fa icon="home"/></template>
|
||||||
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
|
<template v-if="note.visibility == 'followers'"><fa icon="unlock"/></template>
|
||||||
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
|
<template v-if="note.visibility == 'specified'"><fa icon="envelope"/></template>
|
||||||
<template v-if="note.visibility == 'private'">%fa:lock%</template>
|
<template v-if="note.visibility == 'private'"><fa icon="lock"/></template>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
@@ -68,10 +68,6 @@ export default Vue.extend({
|
|||||||
&:hover
|
&:hover
|
||||||
text-decoration underline
|
text-decoration underline
|
||||||
|
|
||||||
> .is-verified
|
|
||||||
margin-right 8px
|
|
||||||
color #4dabf7
|
|
||||||
|
|
||||||
> .is-admin
|
> .is-admin
|
||||||
> .is-bot
|
> .is-bot
|
||||||
> .is-cat
|
> .is-cat
|
||||||
@@ -95,6 +91,10 @@ export default Vue.extend({
|
|||||||
color var(--noteHeaderAcct)
|
color var(--noteHeaderAcct)
|
||||||
flex-shrink 2147483647
|
flex-shrink 2147483647
|
||||||
|
|
||||||
|
> .is-verified
|
||||||
|
margin 0 .5em 0 0
|
||||||
|
color #4dabf7
|
||||||
|
|
||||||
> .info
|
> .info
|
||||||
margin-left auto
|
margin-left auto
|
||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
|
|||||||
@@ -15,18 +15,18 @@ export default Vue.extend({
|
|||||||
computed: {
|
computed: {
|
||||||
items() {
|
items() {
|
||||||
const items = [{
|
const items = [{
|
||||||
icon: '%fa:info-circle%',
|
icon: 'info-circle',
|
||||||
text: '%i18n:@detail%',
|
text: '%i18n:@detail%',
|
||||||
action: this.detail
|
action: this.detail
|
||||||
}, {
|
}, {
|
||||||
icon: '%fa:link%',
|
icon: 'link',
|
||||||
text: '%i18n:@copy-link%',
|
text: '%i18n:@copy-link%',
|
||||||
action: this.copyLink
|
action: this.copyLink
|
||||||
}];
|
}];
|
||||||
|
|
||||||
if (this.note.uri) {
|
if (this.note.uri) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:external-link-square-alt%',
|
icon: 'external-link-square-alt',
|
||||||
text: '%i18n:@remote%',
|
text: '%i18n:@remote%',
|
||||||
action: () => {
|
action: () => {
|
||||||
window.open(this.note.uri, '_blank');
|
window.open(this.note.uri, '_blank');
|
||||||
@@ -38,13 +38,13 @@ export default Vue.extend({
|
|||||||
|
|
||||||
if (this.note.isFavorited) {
|
if (this.note.isFavorited) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:star%',
|
icon: 'star',
|
||||||
text: '%i18n:@unfavorite%',
|
text: '%i18n:@unfavorite%',
|
||||||
action: this.unfavorite
|
action: this.unfavorite
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:star%',
|
icon: 'star',
|
||||||
text: '%i18n:@favorite%',
|
text: '%i18n:@favorite%',
|
||||||
action: this.favorite
|
action: this.favorite
|
||||||
});
|
});
|
||||||
@@ -53,13 +53,13 @@ export default Vue.extend({
|
|||||||
if (this.note.userId == this.$store.state.i.id) {
|
if (this.note.userId == this.$store.state.i.id) {
|
||||||
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
|
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:thumbtack%',
|
icon: 'thumbtack',
|
||||||
text: '%i18n:@unpin%',
|
text: '%i18n:@unpin%',
|
||||||
action: this.unpin
|
action: this.unpin
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:thumbtack%',
|
icon: 'thumbtack',
|
||||||
text: '%i18n:@pin%',
|
text: '%i18n:@pin%',
|
||||||
action: this.pin
|
action: this.pin
|
||||||
});
|
});
|
||||||
@@ -69,7 +69,7 @@ export default Vue.extend({
|
|||||||
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
|
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
|
||||||
items.push(null);
|
items.push(null);
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:trash-alt R%',
|
icon: ['far', 'trash-alt'],
|
||||||
text: '%i18n:@delete%',
|
text: '%i18n:@delete%',
|
||||||
action: this.del
|
action: this.del
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-poll-editor">
|
<div class="mk-poll-editor">
|
||||||
<p class="caution" v-if="choices.length < 2">
|
<p class="caution" v-if="choices.length < 2">
|
||||||
%fa:exclamation-triangle%%i18n:@no-only-one-choice%
|
<fa icon="exclamation-triangle"/>%i18n:@no-only-one-choice%
|
||||||
</p>
|
</p>
|
||||||
<ul ref="choices">
|
<ul ref="choices">
|
||||||
<li v-for="(choice, i) in choices">
|
<li v-for="(choice, i) in choices">
|
||||||
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
|
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
|
||||||
<button @click="remove(i)" title="%i18n:@remove%">
|
<button @click="remove(i)" title="%i18n:@remove%">
|
||||||
%fa:times%
|
<fa icon="times"/>
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
|
<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
|
||||||
<button class="destroy" @click="destroy" title="%i18n:@destroy%">
|
<button class="destroy" @click="destroy" title="%i18n:@destroy%">
|
||||||
%fa:times%
|
<fa icon="times"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -76,7 +76,7 @@ export default Vue.extend({
|
|||||||
font-size 0.8em
|
font-size 0.8em
|
||||||
color #f00
|
color #f00
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> ul
|
> ul
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
|
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
|
||||||
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
|
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
|
||||||
<span>
|
<span>
|
||||||
<template v-if="choice.isVoted">%fa:check%</template>
|
<template v-if="choice.isVoted"><fa icon="check"/></template>
|
||||||
<span>{{ choice.text }}</span>
|
<span>{{ choice.text }}</span>
|
||||||
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
|
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
|
||||||
</span>
|
</span>
|
||||||
@@ -100,7 +100,7 @@ export default Vue.extend({
|
|||||||
transition width 1s ease
|
transition width 1s ease
|
||||||
|
|
||||||
> span
|
> span
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .votes
|
> .votes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:user% %i18n:@title%</div>
|
<div slot="title"><fa icon="user"/> %i18n:@title%</div>
|
||||||
|
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-form :disabled="saving">
|
<ui-form :disabled="saving">
|
||||||
@@ -16,12 +16,12 @@
|
|||||||
|
|
||||||
<ui-input v-model="location">
|
<ui-input v-model="location">
|
||||||
<span>%i18n:@location%</span>
|
<span>%i18n:@location%</span>
|
||||||
<span slot="prefix">%fa:map-marker-alt%</span>
|
<span slot="prefix"><fa icon="map-marker-alt"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-input v-model="birthday" type="date">
|
<ui-input v-model="birthday" type="date">
|
||||||
<span>%i18n:@birthday%</span>
|
<span>%i18n:@birthday%</span>
|
||||||
<span slot="prefix">%fa:birthday-cake%</span>
|
<span slot="prefix"><fa icon="birthday-cake"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-textarea v-model="description" :max="500">
|
<ui-textarea v-model="description" :max="500">
|
||||||
@@ -30,14 +30,14 @@
|
|||||||
|
|
||||||
<ui-input type="file" @change="onAvatarChange">
|
<ui-input type="file" @change="onAvatarChange">
|
||||||
<span>%i18n:@avatar%</span>
|
<span>%i18n:@avatar%</span>
|
||||||
<span slot="icon">%fa:image%</span>
|
<span slot="icon"><fa icon="image"/></span>
|
||||||
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
<span slot="desc" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-input type="file" @change="onBannerChange">
|
<ui-input type="file" @change="onBannerChange">
|
||||||
<span>%i18n:@banner%</span>
|
<span>%i18n:@banner%</span>
|
||||||
<span slot="icon">%fa:image%</span>
|
<span slot="icon"><fa icon="image"/></span>
|
||||||
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
<span slot="desc" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-button @click="save(true)">%i18n:@save%</ui-button>
|
<ui-button @click="save(true)">%i18n:@save%</ui-button>
|
||||||
|
|||||||
@@ -8,11 +8,12 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="password" type="password" required styl="fill">
|
<ui-input v-model="password" type="password" required styl="fill">
|
||||||
<span>%i18n:@password%</span>
|
<span>%i18n:@password%</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
|
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
|
||||||
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
||||||
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||||
|
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/github`">%i18n:@signin-with-github%</a></p>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -3,39 +3,39 @@
|
|||||||
<template v-if="meta">
|
<template v-if="meta">
|
||||||
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
||||||
<span>%i18n:@invitation-code%</span>
|
<span>%i18n:@invitation-code%</span>
|
||||||
<span slot="prefix">%fa:id-card-alt%</span>
|
<span slot="prefix"><fa icon="id-card-alt"/></span>
|
||||||
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
|
<p slot="desc" v-html="'%i18n:@invitation-info%'.replace('{}', 'mailto:' + meta.maintainer.email)"></p>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
||||||
<span>%i18n:@username%</span>
|
<span>%i18n:@username%</span>
|
||||||
<span slot="prefix">@</span>
|
<span slot="prefix">@</span>
|
||||||
<span slot="suffix">@{{ host }}</span>
|
<span slot="suffix">@{{ host }}</span>
|
||||||
<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p>
|
<p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner .pulse" fixed-width/> %i18n:@checking%</p>
|
||||||
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p>
|
<p slot="desc" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@available%</p>
|
||||||
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p>
|
<p slot="desc" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@unavailable%</p>
|
||||||
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p>
|
<p slot="desc" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@error%</p>
|
||||||
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p>
|
<p slot="desc" v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@invalid-format%</p>
|
||||||
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p>
|
<p slot="desc" v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-short%</p>
|
||||||
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p>
|
<p slot="desc" v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-long%</p>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
|
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
|
||||||
<span>%i18n:@password%</span>
|
<span>%i18n:@password%</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
<div slot="text">
|
<div slot="desc">
|
||||||
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p>
|
<p v-if="passwordStrength == 'low'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@weak-password%</p>
|
||||||
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p>
|
<p v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@normal-password%</p>
|
||||||
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p>
|
<p v-if="passwordStrength == 'high'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@strong-password%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
|
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
|
||||||
<span>%i18n:@password% (%i18n:@retype%)</span>
|
<span>%i18n:@password% (%i18n:@retype%)</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
<div slot="text">
|
<div slot="desc">
|
||||||
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p>
|
<p v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@password-matched%</p>
|
||||||
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
|
<p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@password-not-matched%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
|
<div v-if="meta.enableRecaptcha" class="g-recaptcha" :data-sitekey="meta.recaptchaSiteKey" style="margin: 16px 0;"></div>
|
||||||
<ui-button type="submit">%i18n:@create%</ui-button>
|
<ui-button type="submit">%i18n:@create%</ui-button>
|
||||||
</template>
|
</template>
|
||||||
</form>
|
</form>
|
||||||
@@ -130,7 +130,7 @@ export default Vue.extend({
|
|||||||
username: this.username,
|
username: this.username,
|
||||||
password: this.password,
|
password: this.password,
|
||||||
invitationCode: this.invitationCode,
|
invitationCode: this.invitationCode,
|
||||||
'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
|
'g-recaptcha-response': this.meta.enableRecaptcha ? (window as any).grecaptcha.getResponse() : null
|
||||||
}, true).then(() => {
|
}, true).then(() => {
|
||||||
(this as any).api('signin', {
|
(this as any).api('signin', {
|
||||||
username: this.username,
|
username: this.username,
|
||||||
@@ -141,7 +141,7 @@ export default Vue.extend({
|
|||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert('%i18n:@some-error%');
|
alert('%i18n:@some-error%');
|
||||||
|
|
||||||
if (this.meta.recaptchaSitekey != null) {
|
if (this.meta.enableRecaptcha) {
|
||||||
(window as any).grecaptcha.reset();
|
(window as any).grecaptcha.reset();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-stream-indicator">
|
<div class="mk-stream-indicator">
|
||||||
<p v-if="stream.state == 'initializing'">
|
<p v-if="stream.state == 'initializing'">
|
||||||
%fa:spinner .pulse%
|
<fa icon="spinner .pulse"/>
|
||||||
<span>%i18n:@connecting%<mk-ellipsis/></span>
|
<span>%i18n:@connecting%<mk-ellipsis/></span>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="stream.state == 'reconnecting'">
|
<p v-if="stream.state == 'reconnecting'">
|
||||||
%fa:spinner .pulse%
|
<fa icon="spinner .pulse"/>
|
||||||
<span>%i18n:@reconnecting%<mk-ellipsis/></span>
|
<span>%i18n:@reconnecting%<mk-ellipsis/></span>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="stream.state == 'connected'">
|
<p v-if="stream.state == 'connected'">
|
||||||
%fa:check%
|
<fa icon="check"/>
|
||||||
<span>%i18n:@connected%</span>
|
<span>%i18n:@connected%</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -80,7 +80,7 @@ export default Vue.extend({
|
|||||||
display block
|
display block
|
||||||
margin 0
|
margin 0
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
<p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<vue-word-cloud
|
<vue-word-cloud
|
||||||
:words="tags.slice(0, 20).map(x => [x.name, x.count])"
|
:words="tags.slice(0, 20).map(x => [x.name, x.count])"
|
||||||
@@ -74,7 +74,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
</label>
|
</label>
|
||||||
|
|
||||||
<details class="creator">
|
<details class="creator">
|
||||||
<summary>%fa:palette% %i18n:@create-a-theme%</summary>
|
<summary><fa icon="palette"/> %i18n:@create-a-theme%</summary>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@base-theme%:</span>
|
<span>%i18n:@base-theme%:</span>
|
||||||
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
|
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
|
||||||
@@ -51,23 +51,23 @@
|
|||||||
<div style="padding-bottom:8px;">%i18n:@text-color%:</div>
|
<div style="padding-bottom:8px;">%i18n:@text-color%:</div>
|
||||||
<color-picker v-model="myThemeText"/>
|
<color-picker v-model="myThemeText"/>
|
||||||
</div>
|
</div>
|
||||||
<ui-button @click="preview()">%fa:eye% %i18n:@preview-created-theme%</ui-button>
|
<ui-button @click="preview()"><fa icon="eye"/> %i18n:@preview-created-theme%</ui-button>
|
||||||
<ui-button primary @click="gen()">%fa:save R% %i18n:@save-created-theme%</ui-button>
|
<ui-button primary @click="gen()"><fa :icon="['far', 'save']"/> %i18n:@save-created-theme%</ui-button>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>%fa:download% %i18n:@install-a-theme%</summary>
|
<summary><fa icon="download"/> %i18n:@install-a-theme%</summary>
|
||||||
<ui-button @click="import_()">%fa:file-import% %i18n:@import%</ui-button>
|
<ui-button @click="import_()"><fa icon="file-import"/> %i18n:@import%</ui-button>
|
||||||
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
|
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
|
||||||
<p>%i18n:@import-by-code%:</p>
|
<p>%i18n:@import-by-code%:</p>
|
||||||
<ui-textarea v-model="installThemeCode">
|
<ui-textarea v-model="installThemeCode">
|
||||||
<span>%i18n:@theme-code%</span>
|
<span>%i18n:@theme-code%</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="() => install(this.installThemeCode)">%fa:check% %i18n:@install%</ui-button>
|
<ui-button @click="() => install(this.installThemeCode)"><fa icon="check"/> %i18n:@install%</ui-button>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>%fa:folder-open% %i18n:@manage-themes%</summary>
|
<summary><fa icon="folder-open"/> %i18n:@manage-themes%</summary>
|
||||||
<ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
|
<ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
|
||||||
<optgroup label="%i18n:@builtin-themes%">
|
<optgroup label="%i18n:@builtin-themes%">
|
||||||
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
||||||
@@ -89,8 +89,8 @@
|
|||||||
<ui-textarea readonly :value="selectedThemeCode">
|
<ui-textarea readonly :value="selectedThemeCode">
|
||||||
<span>%i18n:@theme-code%</span>
|
<span>%i18n:@theme-code%</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export">%fa:box% %i18n:@export%</ui-button>
|
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export"><fa icon="box"/> %i18n:@export%</ui-button>
|
||||||
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)">%fa:trash-alt R% %i18n:@uninstall%</ui-button>
|
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)"><fa :icon="['far', 'trash-alt']"/> %i18n:@uninstall%</ui-button>
|
||||||
</template>
|
</template>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
<p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group v-else tag="div" name="chart">
|
<transition-group v-else tag="div" name="chart">
|
||||||
<div v-for="stat in stats" :key="stat.tag">
|
<div v-for="stat in stats" :key="stat.tag">
|
||||||
@@ -58,7 +58,7 @@ export default Vue.extend({
|
|||||||
color var(--text)
|
color var(--text)
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :is="link ? 'a' : 'button'" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')">
|
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr"
|
||||||
|
:is="link ? 'a' : 'button'"
|
||||||
|
:class="[styl, { inline, primary }]"
|
||||||
|
:type="type"
|
||||||
|
@click="$emit('click')"
|
||||||
|
>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</component>
|
</component>
|
||||||
</template>
|
</template>
|
||||||
@@ -7,6 +12,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
inject: {
|
||||||
|
horizonGrouped: {
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
type: {
|
type: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -20,7 +30,9 @@ export default Vue.extend({
|
|||||||
inline: {
|
inline: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default(): boolean {
|
||||||
|
return this.horizonGrouped;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
link: {
|
link: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ export default Vue.extend({
|
|||||||
&.fit-top
|
&.fit-top
|
||||||
padding-top 0
|
padding-top 0
|
||||||
|
|
||||||
|
&.fit-bottom
|
||||||
|
padding-bottom 0
|
||||||
|
|
||||||
> header
|
> header
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user