Compare commits
316 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
72d9a46156 | ||
![]() |
683a85ecc0 | ||
![]() |
89047fd66d | ||
![]() |
8ca27a4480 | ||
![]() |
77d2d84e05 | ||
![]() |
3bde4285eb | ||
![]() |
15efbfb244 | ||
![]() |
55a57db958 | ||
![]() |
91f624c900 | ||
![]() |
d753489e49 | ||
![]() |
36dd7c82db | ||
![]() |
b00db74216 | ||
![]() |
cf9f85eb2a | ||
![]() |
bfa8414289 | ||
![]() |
58dc9c9544 | ||
![]() |
ba95ce18a8 | ||
![]() |
ac10c40f31 | ||
![]() |
de8b40c80f | ||
![]() |
60fe69728d | ||
![]() |
557607e842 | ||
![]() |
40ac9de728 | ||
![]() |
a725cd1946 | ||
![]() |
b648706756 | ||
![]() |
20f2e9fc6d | ||
![]() |
858ced0a53 | ||
![]() |
c9ca8f777f | ||
![]() |
0d0be31527 | ||
![]() |
96305a088c | ||
![]() |
22e30b44b9 | ||
![]() |
48d0e2fa5f | ||
![]() |
0489291815 | ||
![]() |
7a412500e1 | ||
![]() |
dffaa72a88 | ||
![]() |
152d61f906 | ||
![]() |
b44ded5fc9 | ||
![]() |
99d77cc843 | ||
![]() |
bc385eec2d | ||
![]() |
2c6b9403b3 | ||
![]() |
89cdc59fe5 | ||
![]() |
3e04e1ccea | ||
![]() |
25f491a65f | ||
![]() |
7fdde157e0 | ||
![]() |
27f30a449a | ||
![]() |
dc66a0cd66 | ||
![]() |
f302ecd1e2 | ||
![]() |
1afc2a227a | ||
![]() |
ab594d1dfe | ||
![]() |
647d32f506 | ||
![]() |
1bc109b42c | ||
![]() |
6e02e2a6b3 | ||
![]() |
3372baad6c | ||
![]() |
e9b3e3877a | ||
![]() |
c84c5fbae7 | ||
![]() |
2e7ab91f48 | ||
![]() |
92c41c003a | ||
![]() |
53688cdcdc | ||
![]() |
70f864ea8b | ||
![]() |
5dd94e551a | ||
![]() |
afc1ed9897 | ||
![]() |
df7562f98d | ||
![]() |
1c7e799164 | ||
![]() |
107a3f99f4 | ||
![]() |
7e3cf4b4ad | ||
![]() |
afdb23ff57 | ||
![]() |
0ce64f8c33 | ||
![]() |
2cd6ccb85c | ||
![]() |
3dcf5374c2 | ||
![]() |
1c7d5f3f64 | ||
![]() |
bb0cb0a866 | ||
![]() |
362dc29057 | ||
![]() |
8af0218e4c | ||
![]() |
09af9968b5 | ||
![]() |
7d0b819c5a | ||
![]() |
4bbb7eded3 | ||
![]() |
72ea9e5522 | ||
![]() |
743e5d947d | ||
![]() |
f257853906 | ||
![]() |
32983d3829 | ||
![]() |
bdef33e88d | ||
![]() |
a4a4194586 | ||
![]() |
e36c538dc0 | ||
![]() |
982a218bf2 | ||
![]() |
f7aeca4c7c | ||
![]() |
4b81bc864f | ||
![]() |
a52cc62c04 | ||
![]() |
81f69bff9e | ||
![]() |
d9b2aa1880 | ||
![]() |
3bddd986a0 | ||
![]() |
d00712d817 | ||
![]() |
d756fdbebf | ||
![]() |
b2f2c74605 | ||
![]() |
1407cd71b5 | ||
![]() |
3dd3a7238d | ||
![]() |
afc834ae4b | ||
![]() |
357f190ce3 | ||
![]() |
ab92762320 | ||
![]() |
04942c8477 | ||
![]() |
9c60f51e0d | ||
![]() |
956ae2ac46 | ||
![]() |
f2ed813337 | ||
![]() |
7d9a7d1a3c | ||
![]() |
2f67b6fb47 | ||
![]() |
7444dde93e | ||
![]() |
e62fad7bc6 | ||
![]() |
2c6bad2501 | ||
![]() |
6952bb2eca | ||
![]() |
610972dbde | ||
![]() |
926049055a | ||
![]() |
db5f6b60df | ||
![]() |
7be7b9d9fd | ||
![]() |
366855c4cc | ||
![]() |
e950beeeab | ||
![]() |
5515b39f6c | ||
![]() |
f5d0599e4d | ||
![]() |
8fd7914f0f | ||
![]() |
24ef98eb01 | ||
![]() |
b3dd6cf001 | ||
![]() |
6d4b474cb1 | ||
![]() |
0a8876a3ae | ||
![]() |
9a83a48331 | ||
![]() |
7ed50b90bd | ||
![]() |
b6fd5d7282 | ||
![]() |
33243e7176 | ||
![]() |
e8439679a5 | ||
![]() |
06124dbbd5 | ||
![]() |
857940f402 | ||
![]() |
bcb04924ff | ||
![]() |
2b6aeb9ebc | ||
![]() |
648e4538fb | ||
![]() |
cd4b3777da | ||
![]() |
4acf506b7e | ||
![]() |
543ca348bc | ||
![]() |
03375412f1 | ||
![]() |
0c7a9b6827 | ||
![]() |
c54bc3c176 | ||
![]() |
90973bedf4 | ||
![]() |
757f70162e | ||
![]() |
3047410b35 | ||
![]() |
9d0d4c5eae | ||
![]() |
cab5b4d601 | ||
![]() |
517b6e25d9 | ||
![]() |
94d394c29e | ||
![]() |
a52099d175 | ||
![]() |
f1cb7b862d | ||
![]() |
0863e5d379 | ||
![]() |
55dcd25df1 | ||
![]() |
f3155ea180 | ||
![]() |
2c5162671c | ||
![]() |
fc8aeb5a66 | ||
![]() |
995cf503eb | ||
![]() |
0e49c11a4c | ||
![]() |
0367c37b0a | ||
![]() |
e0b9fe5e5d | ||
![]() |
a4726e683b | ||
![]() |
3b10e93efe | ||
![]() |
02b07c1b5b | ||
![]() |
5e54751bd4 | ||
![]() |
34f1dc238d | ||
![]() |
3c0f4bdf35 | ||
![]() |
a68d370ad0 | ||
![]() |
debb27ed30 | ||
![]() |
97fbb857fb | ||
![]() |
93f13ffc8e | ||
![]() |
4d9dc93d46 | ||
![]() |
22cd4c5d16 | ||
![]() |
6883994b22 | ||
![]() |
852a312753 | ||
![]() |
afea0baaa8 | ||
![]() |
2c477660a0 | ||
![]() |
16a1cd3c9d | ||
![]() |
db23dd2e01 | ||
![]() |
eaa1ded5ba | ||
![]() |
393e14196a | ||
![]() |
8b005307ea | ||
![]() |
c915ac0e72 | ||
![]() |
1752bb896e | ||
![]() |
9c8fa026f3 | ||
![]() |
e93db6324a | ||
![]() |
a10708bffa | ||
![]() |
e65a7a142f | ||
![]() |
72e0b2d470 | ||
![]() |
43fb0f36a7 | ||
![]() |
cf3533221b | ||
![]() |
de522ebe14 | ||
![]() |
2ace891dde | ||
![]() |
e212d9f991 | ||
![]() |
739f3f84d0 | ||
![]() |
5e206c86be | ||
![]() |
1ab37011ea | ||
![]() |
b6e02f63cd | ||
![]() |
60e10d4efa | ||
![]() |
95ba7e43b1 | ||
![]() |
9e5a2e5b17 | ||
![]() |
dbbc416095 | ||
![]() |
a479ad357c | ||
![]() |
b1c12abb7c | ||
![]() |
17d1a1d7bd | ||
![]() |
ba50156a83 | ||
![]() |
eb83ab41c0 | ||
![]() |
4e6a917dab | ||
![]() |
8c4f0d4589 | ||
![]() |
3f7738204e | ||
![]() |
e251a9b9fe | ||
![]() |
01d43b9683 | ||
![]() |
4d4a0c89a8 | ||
![]() |
0a5524e9c8 | ||
![]() |
c8fb5746b3 | ||
![]() |
bbcc132978 | ||
![]() |
d3e4f84285 | ||
![]() |
62c470cf75 | ||
![]() |
8ab31d3765 | ||
![]() |
55fe1cf0a8 | ||
![]() |
00cff51ff7 | ||
![]() |
d6bc4a7aa1 | ||
![]() |
4e57d12aea | ||
![]() |
4a2d99c43f | ||
![]() |
217c27df86 | ||
![]() |
e6dcd438b4 | ||
![]() |
de2b0224d6 | ||
![]() |
3f8a72eb88 | ||
![]() |
0387176e8c | ||
![]() |
aa34e332f4 | ||
![]() |
d13999d689 | ||
![]() |
22c4e92728 | ||
![]() |
df8128c0b1 | ||
![]() |
ec534a3704 | ||
![]() |
366d4cd3e2 | ||
![]() |
4841926df1 | ||
![]() |
f2f7bdc5a9 | ||
![]() |
fd811eb325 | ||
![]() |
915d352505 | ||
![]() |
1d1024c57a | ||
![]() |
73df6e0347 | ||
![]() |
e6d62c5a7b | ||
![]() |
470e48c0a5 | ||
![]() |
9235f72a2e | ||
![]() |
9fe6da79b2 | ||
![]() |
1858437eb1 | ||
![]() |
c3ba0dcd32 | ||
![]() |
70f4b13089 | ||
![]() |
cc57a4b671 | ||
![]() |
6902700458 | ||
![]() |
b772041547 | ||
![]() |
79174c1a19 | ||
![]() |
898850027a | ||
![]() |
0d272b1fb0 | ||
![]() |
7993a9eb90 | ||
![]() |
42d419970d | ||
![]() |
ad49268d8b | ||
![]() |
76c345396a | ||
![]() |
5690ef1ebc | ||
![]() |
5616404b4d | ||
![]() |
f92137f6c2 | ||
![]() |
ca3373ba4e | ||
![]() |
4e6115b414 | ||
![]() |
ddf47051c9 | ||
![]() |
d45478510c | ||
![]() |
2641f89349 | ||
![]() |
9d46d03c37 | ||
![]() |
25b6de88a9 | ||
![]() |
a24046e46a | ||
![]() |
7e803ff9a9 | ||
![]() |
246cead2b1 | ||
![]() |
214f7f06bb | ||
![]() |
6878f73a9f | ||
![]() |
336b45b6f7 | ||
![]() |
2a0b62d26d | ||
![]() |
653ec0cbb0 | ||
![]() |
120ab3f0a3 | ||
![]() |
8bcbbbc1a3 | ||
![]() |
13a75abc91 | ||
![]() |
eace740c63 | ||
![]() |
cb3a54de00 | ||
![]() |
5fbc77795d | ||
![]() |
ce4feae731 | ||
![]() |
08f00d4990 | ||
![]() |
6951f7e74a | ||
![]() |
2b4d63b1bb | ||
![]() |
8cbb961493 | ||
![]() |
64c795938d | ||
![]() |
67df681a48 | ||
![]() |
9285bcf8bb | ||
![]() |
b9b23a4b54 | ||
![]() |
2f6371b085 | ||
![]() |
2a5c3475a7 | ||
![]() |
8a2698a5db | ||
![]() |
f6919a171a | ||
![]() |
82ebf67456 | ||
![]() |
a60c8b2ee8 | ||
![]() |
0a2b8ccfb6 | ||
![]() |
698094b787 | ||
![]() |
b57e111ea8 | ||
![]() |
aa6bf2b54e | ||
![]() |
454910d295 | ||
![]() |
d44e620769 | ||
![]() |
ac14adfd3e | ||
![]() |
928d30ee1e | ||
![]() |
3dd9b0f347 | ||
![]() |
c57dd083c5 | ||
![]() |
2a1d6c5406 | ||
![]() |
112e9f69bd | ||
![]() |
d50e537888 | ||
![]() |
86d14d30fa | ||
![]() |
710d3689d3 | ||
![]() |
3fee011369 | ||
![]() |
7cd4b8ba4f | ||
![]() |
31132de18b | ||
![]() |
c6cb271f6f | ||
![]() |
b7c4afd20c | ||
![]() |
70395d200a | ||
![]() |
562a5f66fc | ||
![]() |
b2f8003602 | ||
![]() |
b7b36973f7 | ||
![]() |
af00464f5b | ||
![]() |
f522b3df91 | ||
![]() |
e9ec4a3b84 |
@@ -118,12 +118,3 @@ autoAdmin: true
|
|||||||
|
|
||||||
# Clustering
|
# Clustering
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
# Summaly proxy
|
|
||||||
#summalyProxy: "http://example.com"
|
|
||||||
|
|
||||||
# User recommendation
|
|
||||||
#user_recommendation:
|
|
||||||
# external: true
|
|
||||||
# engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
|
|
||||||
# timeout: 300000
|
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -17,3 +17,4 @@ api-docs.json
|
|||||||
/mongo
|
/mongo
|
||||||
/elasticsearch
|
/elasticsearch
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
|
yarn.lock
|
||||||
|
12
Dockerfile
12
Dockerfile
@@ -8,18 +8,20 @@ WORKDIR /misskey
|
|||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
|
|
||||||
|
RUN unlink /usr/bin/free
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
gcc \
|
|
||||||
g++ \
|
|
||||||
libc-dev \
|
|
||||||
python \
|
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
file \
|
file \
|
||||||
|
g++ \
|
||||||
|
gcc \
|
||||||
|
libc-dev \
|
||||||
|
libtool \
|
||||||
make \
|
make \
|
||||||
nasm \
|
nasm \
|
||||||
pkgconfig \
|
pkgconfig \
|
||||||
libtool \
|
procps \
|
||||||
|
python \
|
||||||
zlib-dev
|
zlib-dev
|
||||||
RUN npm i -g node-gyp
|
RUN npm i -g node-gyp
|
||||||
|
|
||||||
|
22
README.md
22
README.md
@@ -73,46 +73,50 @@ Please see [Contribution guide](./CONTRIBUTING.md).
|
|||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=Zeh1u6l_Vmgoy8A1eT1Sltea-_SZSq8t8uOWDRZRh94%3D" alt="weep"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13376668/71f3cf87ec6c4393a44b1b9df5ee3d12/1?token-time=2145916800&token-hash=7pSmWqgMfMSJHVIEcNsuuQoKeU3TRluew5p0EGTzWA4%3D" alt="Arctic"></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/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/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://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>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=13376668">Arctic</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=12913507">Melilot</a></td>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</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/mydarkstar">mydarkstar</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<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>
|
<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/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/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/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>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
||||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||||
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
|
<td><a href="https://www.patreon.com/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/spinlock">Naoki Hirayama</a></td>
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/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>
|
||||||
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
||||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
|
||||||
</tr><tr>
|
|
||||||
</tr></table>
|
|
||||||
|
|
||||||
**Last updated:** Wed, 31 Oct 2018 23:21:06 UTC
|
**Last updated:** Tue, 27 Nov 2018 06:24:05 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
@@ -1,29 +0,0 @@
|
|||||||
const mongo = require('mongodb');
|
|
||||||
const bcrypt = require('bcryptjs');
|
|
||||||
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(`Resetting password for ${user}...`);
|
|
||||||
|
|
||||||
const passwd = 'yo';
|
|
||||||
|
|
||||||
// Generate hash of password
|
|
||||||
const hash = bcrypt.hashSync(passwd);
|
|
||||||
|
|
||||||
User.update(q, {
|
|
||||||
$set: {
|
|
||||||
password: hash
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
console.log(`Password of ${user} is now '${passwd}'`);
|
|
||||||
}, 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(`Suspending ${user}...`);
|
|
||||||
|
|
||||||
User.update(q, {
|
|
||||||
$set: {
|
|
||||||
isSuspended: true
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
console.log(`Suspended ${user}`);
|
|
||||||
}, e => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
@@ -8,28 +8,11 @@ coming soon
|
|||||||
node cli/mark-admin (User-ID or Username)
|
node cli/mark-admin (User-ID or Username)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Mark as 'verified' user
|
|
||||||
``` shell
|
|
||||||
node cli/mark-verified (User-ID or Username)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Suspend users
|
|
||||||
``` shell
|
|
||||||
node cli/suspend (User-ID or Username)
|
|
||||||
```
|
|
||||||
e.g.
|
e.g.
|
||||||
``` shell
|
``` shell
|
||||||
# Use id
|
# By id
|
||||||
node cli/suspend 57d01a501fdf2d07be417afe
|
node cli/mark-admin 57d01a501fdf2d07be417afe
|
||||||
|
|
||||||
# Use username
|
# By username
|
||||||
node cli/suspend @syuilo
|
node cli/suspend @syuilo
|
||||||
|
|
||||||
# Use username (remote)
|
|
||||||
node cli/suspend @syuilo@misskey.xyz
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reset password
|
|
||||||
``` shell
|
|
||||||
node cli/reset-password (User-ID or Username)
|
|
||||||
```
|
```
|
||||||
|
@@ -8,28 +8,11 @@ coming soon
|
|||||||
node cli/mark-admin (ユーザーID または ユーザー名)
|
node cli/mark-admin (ユーザーID または ユーザー名)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 'verified'ユーザーを設定する
|
|
||||||
``` shell
|
|
||||||
node cli/mark-verified (ユーザーID または ユーザー名)
|
|
||||||
```
|
|
||||||
|
|
||||||
## ユーザーを凍結する
|
|
||||||
``` shell
|
|
||||||
node cli/suspend (ユーザーID または ユーザー名)
|
|
||||||
```
|
|
||||||
例:
|
例:
|
||||||
``` shell
|
``` shell
|
||||||
# ユーザーID
|
# ユーザーID
|
||||||
node cli/suspend 57d01a501fdf2d07be417afe
|
node cli/mark-admin 57d01a501fdf2d07be417afe
|
||||||
|
|
||||||
# ユーザー名
|
# ユーザー名
|
||||||
node cli/suspend @syuilo
|
node cli/mark-admin @syuilo
|
||||||
|
|
||||||
# ユーザー名 (リモート)
|
|
||||||
node cli/suspend @syuilo@misskey.xyz
|
|
||||||
```
|
|
||||||
|
|
||||||
## ユーザーのパスワードをリセットする
|
|
||||||
``` shell
|
|
||||||
node cli/reset-password (ユーザーID または ユーザー名)
|
|
||||||
```
|
```
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "確認中"
|
fetching: "確認中"
|
||||||
no-broadcasts: "お知らせはありません"
|
no-broadcasts: "お知らせはありません"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "詳細設定"
|
advanced: "詳細設定"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "Schließen"
|
close: "Schließen"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "Verstanden!"
|
got-it: "Verstanden!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Anpassung-Tipps"
|
title: "Anpassung-Tipps"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Laden"
|
fetching: "Laden"
|
||||||
no-broadcasts: "Keine Broadcasts"
|
no-broadcasts: "Keine Broadcasts"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "Automatische Pop-out Fenster"
|
auto-popout: "Automatische Pop-out Fenster"
|
||||||
auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
|
auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
|
||||||
advanced: "Erweiterte Einstellungen"
|
advanced: "Erweiterte Einstellungen"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "Close"
|
close: "Close"
|
||||||
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
||||||
load-more: "Load more"
|
load-more: "Load more"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "Got it!"
|
got-it: "Got it!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
@@ -90,9 +91,9 @@ common:
|
|||||||
specified: "Direct"
|
specified: "Direct"
|
||||||
specified-desc: "Post to specified users only"
|
specified-desc: "Post to specified users only"
|
||||||
private: "Private"
|
private: "Private"
|
||||||
local-public: "Local (Public)"
|
local-public: "Public (Only local)"
|
||||||
local-home: "Local (Home)"
|
local-home: "Home (Only local)"
|
||||||
local-followers: "Local (Followers)"
|
local-followers: "Followers (Only local)"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "What are you doing?"
|
a: "What are you doing?"
|
||||||
b: "What's happening?"
|
b: "What's happening?"
|
||||||
@@ -119,7 +120,7 @@ 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"
|
||||||
use-os-default-emojis: "Use the OS default Emojis"
|
use-os-default-emojis: "Use the OS default Emojis"
|
||||||
do-not-use-in-production: 'As this is for development, do not use this in production.'
|
do-not-use-in-production: 'This is a development build. Do not use in production.'
|
||||||
is-remote-user: "This user information is copied."
|
is-remote-user: "This user information is copied."
|
||||||
is-remote-post: "This post information is a copy."
|
is-remote-post: "This post information is a copy."
|
||||||
view-on-remote: "View it on remote"
|
view-on-remote: "View it on remote"
|
||||||
@@ -208,7 +209,7 @@ common/views/components/games/reversi/reversi.index.vue:
|
|||||||
invitations: "You’ve got an invitation!"
|
invitations: "You’ve got an invitation!"
|
||||||
my-games: "My game"
|
my-games: "My game"
|
||||||
all-games: "All games"
|
all-games: "All games"
|
||||||
enter-username: "Enter a username"
|
enter-username: "Please enter username"
|
||||||
game-state:
|
game-state:
|
||||||
ended: "Finished"
|
ended: "Finished"
|
||||||
playing: "In Progress"
|
playing: "In Progress"
|
||||||
@@ -219,7 +220,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
black-or-white: "Black/White"
|
black-or-white: "Black/White"
|
||||||
black-is: "Black is {}"
|
black-is: "Black is {}"
|
||||||
rules: "Rules"
|
rules: "Rules"
|
||||||
is-llotheo: "The lesser side wins"
|
is-llotheo: "The lesser one wins(Llotheo)"
|
||||||
looped-map: "Looped map"
|
looped-map: "Looped map"
|
||||||
can-put-everywhere: "Can put everywhere"
|
can-put-everywhere: "Can put everywhere"
|
||||||
settings-of-the-bot: "Bot settings"
|
settings-of-the-bot: "Bot settings"
|
||||||
@@ -366,8 +367,8 @@ common/views/components/signin.vue:
|
|||||||
signin: "Sign in"
|
signin: "Sign in"
|
||||||
or: "Or"
|
or: "Or"
|
||||||
signin-with-twitter: "Log in with Twitter"
|
signin-with-twitter: "Log in with Twitter"
|
||||||
signin-with-github: "Log in with GitHub"
|
signin-with-github: "Sign in with GitHub"
|
||||||
signin-with-discord: "Login with Discord"
|
signin-with-discord: "Sign in with Discord"
|
||||||
login-failed: "Log in failed. Make sure you have entered your correct username and password."
|
login-failed: "Log in failed. Make sure you have entered your correct username and password."
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "Invitation code"
|
invitation-code: "Invitation code"
|
||||||
@@ -433,8 +434,8 @@ common/views/components/visibility-chooser.vue:
|
|||||||
private: "Private"
|
private: "Private"
|
||||||
local-public: "Local (Public)"
|
local-public: "Local (Public)"
|
||||||
local-public-desc: "Do not publish to remote"
|
local-public-desc: "Do not publish to remote"
|
||||||
local-home: "Local (Home)"
|
local-home: "Home (Only local)"
|
||||||
local-followers: "Local (Followers)"
|
local-followers: "Followers (Only local)"
|
||||||
common/views/components/trends.vue:
|
common/views/components/trends.vue:
|
||||||
count: "{} users mentioned"
|
count: "{} users mentioned"
|
||||||
empty: "No popular hashtag trends"
|
empty: "No popular hashtag trends"
|
||||||
@@ -445,20 +446,24 @@ common/views/components/profile-editor.vue:
|
|||||||
location: "Location"
|
location: "Location"
|
||||||
description: "About me"
|
description: "About me"
|
||||||
birthday: "Birthday"
|
birthday: "Birthday"
|
||||||
avatar: "Avatar"
|
avatar: "Icon"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
is-cat: "This account is a Cat"
|
is-cat: "This account is a Cat"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
is-locked: "Follower requests require approval"
|
is-locked: "Follower requests require approval"
|
||||||
careful-bot: "Follower requests from bots require approval"
|
careful-bot: "Follower requests from bots require approval"
|
||||||
advanced: "Advanced"
|
advanced: "Other"
|
||||||
privacy: "Privacy"
|
privacy: "Privacy"
|
||||||
save: "Update profile"
|
save: "Save"
|
||||||
saved: "Profile updated successfully"
|
saved: "Profile updated successfully"
|
||||||
uploading: "Uploading"
|
uploading: "Uploading"
|
||||||
upload-failed: "Failed to upload"
|
upload-failed: "Failed to upload"
|
||||||
|
email: "Email settings"
|
||||||
|
email-address: "Email Address"
|
||||||
|
email-verified: "Your email has been verified."
|
||||||
|
email-not-verified: "Email address is not confirmed. Please check your inbox."
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Fetching"
|
fetching: "Checking"
|
||||||
no-broadcasts: "No announcements"
|
no-broadcasts: "No announcements"
|
||||||
have-a-nice-day: "Have a nice day!"
|
have-a-nice-day: "Have a nice day!"
|
||||||
next: "Next"
|
next: "Next"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "Post visibility"
|
note-visibility: "Post visibility"
|
||||||
default-note-visibility: "Default visibility"
|
default-note-visibility: "Default visibility"
|
||||||
remember-note-visibility: "Remember post visibility"
|
remember-note-visibility: "Remember post visibility"
|
||||||
|
web-search-engine: "Web search engine"
|
||||||
|
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "Auto pop-out window"
|
auto-popout: "Auto pop-out window"
|
||||||
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
|
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
|
||||||
advanced: "Advanced settings"
|
advanced: "Advanced settings"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Settings of connecting to Twitter"
|
twitter-integration-config: "Settings of connecting to Twitter"
|
||||||
twitter-integration-info: "The callback URL is set on /api/tw/cb."
|
twitter-integration-info: "The callback URL is set on {url}."
|
||||||
enable-twitter-integration: "Enable connection to Twitter"
|
enable-twitter-integration: "Enable connection to Twitter"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer Secret"
|
twitter-integration-consumer-secret: "Consumer Secret"
|
||||||
github-integration-config: "Setting of connecting to GitHub"
|
github-integration-config: "Setting of connecting to GitHub"
|
||||||
github-integration-info: "The callback URL is set on /api/gh/cb."
|
github-integration-info: "The callback URL is set on {url}."
|
||||||
enable-github-integration: "Enable connection to GitHub"
|
enable-github-integration: "Enable connection to GitHub"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Setting of Discord Integration"
|
discord-integration-config: "Setting of Discord Integration"
|
||||||
discord-integration-info: "The callback URL is set on /api/dc/cb."
|
discord-integration-info: "The callback URL is set on {url}."
|
||||||
enable-discord-integration: "Enable Discord connection"
|
enable-discord-integration: "Enable Discord connection"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
|
user-recommendation-config: "Recommended users"
|
||||||
|
enable-external-user-recommendation: "Enable to external user recommendation"
|
||||||
|
external-user-recommendation-engine: "Engine"
|
||||||
|
external-user-recommendation-engine-desc: "Example : https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "Timeout"
|
||||||
|
external-user-recommendation-timeout-desc: "Number of milliseconds (ex. 300,000)"
|
||||||
|
email-config: "Email server settings"
|
||||||
|
email-config-info: "Used to confirm email and password reset etc."
|
||||||
|
enable-email: "Enable email delivery"
|
||||||
|
email: "Email Address"
|
||||||
|
smtp-use-ssl: "Use SSL for SMTP server"
|
||||||
|
smtp-host: "SMTP Host"
|
||||||
|
smtp-port: "SMTP Port"
|
||||||
|
smtp-user: "SMTP User"
|
||||||
|
smtp-pass: "SMTP Password"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "Chart"
|
title: "Chart"
|
||||||
per-day: "per Day"
|
per-day: "per Day"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "Response time"
|
network-time: "Response time"
|
||||||
network-usage: "Traffic"
|
network-usage: "Traffic"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "Suspend a user"
|
operation: "Operations"
|
||||||
|
username-or-userid: "Username or user ID"
|
||||||
|
user-not-found: "User not found"
|
||||||
|
lookup: "Look up"
|
||||||
|
reset-password: "Reset password"
|
||||||
|
password-updated: "The password is now \"{password}\""
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
suspended: "Successfully suspended."
|
suspended: "Successfully suspended."
|
||||||
unsuspend-user: "Unsuspend users"
|
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
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"
|
||||||
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"
|
||||||
|
users:
|
||||||
|
title: "Users"
|
||||||
|
sort:
|
||||||
|
title: "Sort"
|
||||||
|
createdAtAsc: "Date Registered (Ascending)"
|
||||||
|
createdAtDesc: "Date Registered (Descending)"
|
||||||
|
updatedAtAsc: "Last Updated (Ascending)"
|
||||||
|
updatedAtDesc: "Last Updated (Descending)"
|
||||||
|
origin:
|
||||||
|
title: "Origin"
|
||||||
|
combined: "Local + Remote"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
|
createdAt: "Created at"
|
||||||
|
updatedAt: "Updated at"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "Register Moderator"
|
title: "Register Moderator"
|
||||||
@@ -1051,7 +1090,7 @@ admin/views/emoji.vue:
|
|||||||
remove: "Remove"
|
remove: "Remove"
|
||||||
updated: "Updated"
|
updated: "Updated"
|
||||||
remove-emoji:
|
remove-emoji:
|
||||||
are-you-sure: "Delete \"%1$s\"?"
|
are-you-sure: "Delete \"$1\"?"
|
||||||
removed: "Deleted"
|
removed: "Deleted"
|
||||||
admin/views/announcements.vue:
|
admin/views/announcements.vue:
|
||||||
announcements: "Announcements"
|
announcements: "Announcements"
|
||||||
@@ -1062,7 +1101,7 @@ admin/views/announcements.vue:
|
|||||||
text: "Content"
|
text: "Content"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
_remove:
|
_remove:
|
||||||
are-you-sure: "Delete \"%1$s\"?"
|
are-you-sure: "Delete \"$1\"?"
|
||||||
removed: "Deleted"
|
removed: "Deleted"
|
||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "Post visibility"
|
note-visibility: "Post visibility"
|
||||||
default-note-visibility: "Default visibility"
|
default-note-visibility: "Default visibility"
|
||||||
remember-note-visibility: "Remember post visibility"
|
remember-note-visibility: "Remember post visibility"
|
||||||
|
web-search-engine: "Web search engine"
|
||||||
|
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
||||||
load-raw-images: "Show attached images in original quality"
|
load-raw-images: "Show attached images in original quality"
|
||||||
load-remote-media: "Show media from a remote server"
|
load-remote-media: "Show media from a remote server"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
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."
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "¡Listo!"
|
got-it: "¡Listo!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Consejos de personalización"
|
title: "Consejos de personalización"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Recuperando"
|
fetching: "Recuperando"
|
||||||
no-broadcasts: "Sin emisión"
|
no-broadcasts: "Sin emisión"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "Ventana emergente automática"
|
auto-popout: "Ventana emergente automática"
|
||||||
auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador."
|
auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador."
|
||||||
advanced: "Configuración avanzada"
|
advanced: "Configuración avanzada"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -18,7 +18,7 @@ common:
|
|||||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseaux social fédéré, vous pouvez essayer d’autres instances afin de trouver vos ami·e·s si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien !"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Veuillez désactiver votre bloqueur de publicités"
|
detected: "Veuillez désactiver votre bloqueur de publicités"
|
||||||
warning: "<strong>Misskey n’utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
warning: "<strong>Misskey n’utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
||||||
@@ -26,6 +26,7 @@ common:
|
|||||||
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."
|
||||||
load-more: "Charger plus"
|
load-more: "Charger plus"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "J’ai compris !"
|
got-it: "J’ai compris !"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
@@ -123,7 +124,7 @@ common:
|
|||||||
is-remote-user: "Ces informations appartiennent à un·e utilisateur·rice distant·e."
|
is-remote-user: "Ces informations appartiennent à un·e utilisateur·rice distant·e."
|
||||||
is-remote-post: "Ceci est une publication distante."
|
is-remote-post: "Ceci est une publication distante."
|
||||||
view-on-remote: " Consulter le profil complet"
|
view-on-remote: " Consulter le profil complet"
|
||||||
renoted-by: "{user}がRenote"
|
renoted-by: "Renoté par {user}"
|
||||||
error:
|
error:
|
||||||
title: 'Une erreur est survenue'
|
title: 'Une erreur est survenue'
|
||||||
retry: 'Réessayer'
|
retry: 'Réessayer'
|
||||||
@@ -432,7 +433,7 @@ common/views/components/visibility-chooser.vue:
|
|||||||
specified-desc: "Publier uniquement aux utilisateurs·rices mentionné·e·s"
|
specified-desc: "Publier uniquement aux utilisateurs·rices mentionné·e·s"
|
||||||
private: "Privé"
|
private: "Privé"
|
||||||
local-public: "Local (Public)"
|
local-public: "Local (Public)"
|
||||||
local-public-desc: "リモートへは公開しない"
|
local-public-desc: "Ne pas publier pour les distants"
|
||||||
local-home: "Accueil (local uniquement)"
|
local-home: "Accueil (local uniquement)"
|
||||||
local-followers: "Local (Abonnés)"
|
local-followers: "Local (Abonnés)"
|
||||||
common/views/components/trends.vue:
|
common/views/components/trends.vue:
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Profil mis à jour avec succès"
|
saved: "Profil mis à jour avec succès"
|
||||||
uploading: "En cours d'envoi …"
|
uploading: "En cours d'envoi …"
|
||||||
upload-failed: "Échec de l'envoi"
|
upload-failed: "Échec de l'envoi"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Récupération"
|
fetching: "Récupération"
|
||||||
no-broadcasts: "Aucune annonce"
|
no-broadcasts: "Aucune annonce"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "Visibilité de la publication"
|
note-visibility: "Visibilité de la publication"
|
||||||
default-note-visibility: "Visibilité par défaut"
|
default-note-visibility: "Visibilité par défaut"
|
||||||
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "Fenêtre contextuelle automatique"
|
auto-popout: "Fenêtre contextuelle automatique"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "Paramètres avancés"
|
advanced: "Paramètres avancés"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "Clé reCAPTCHA du site"
|
recaptcha-site-key: "Clé reCAPTCHA du site"
|
||||||
recaptcha-secret-key: "Clé secrète reCAPTCHA"
|
recaptcha-secret-key: "Clé secrète reCAPTCHA"
|
||||||
twitter-integration-config: "Paramètres de connexion à Twitter"
|
twitter-integration-config: "Paramètres de connexion à Twitter"
|
||||||
twitter-integration-info: "L’URL callback est définit sur /api/tw/cb"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Activer la connection à Twitter"
|
enable-twitter-integration: "Activer la connection à Twitter"
|
||||||
twitter-integration-consumer-key: "Clé du consommateur"
|
twitter-integration-consumer-key: "Clé du consommateur"
|
||||||
twitter-integration-consumer-secret: "Secret du consommateur"
|
twitter-integration-consumer-secret: "Secret du consommateur"
|
||||||
github-integration-config: "Paramètres d’authentification GitHub"
|
github-integration-config: "Paramètres d’authentification GitHub"
|
||||||
github-integration-info: "L’URL callback est définit sur /api/gh/cb"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "Activer l’authentification avec Github"
|
enable-github-integration: "Activer l’authentification avec Github"
|
||||||
github-integration-client-id: "ID client"
|
github-integration-client-id: "ID client"
|
||||||
github-integration-client-secret: "Secret client"
|
github-integration-client-secret: "Secret client"
|
||||||
discord-integration-config: "Paramètres d’authentification Discord"
|
discord-integration-config: "Paramètres d’authentification Discord"
|
||||||
discord-integration-info: "L’URL callback est définit sur /api/dc/cb"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Activer l’authentification avec Discord"
|
enable-discord-integration: "Activer l’authentification avec Discord"
|
||||||
discord-integration-client-id: "ID client"
|
discord-integration-client-id: "ID client"
|
||||||
discord-integration-client-secret: "Secret client"
|
discord-integration-client-secret: "Secret client"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "Inviter"
|
invite: "Inviter"
|
||||||
save: "Sauvegarder"
|
save: "Sauvegarder"
|
||||||
saved: "Enregistré"
|
saved: "Enregistré"
|
||||||
|
user-recommendation-config: "Utilisateur·rice·s"
|
||||||
|
enable-external-user-recommendation: "Activer la recommandation des utilisateur·trice·s distant·e·s"
|
||||||
|
external-user-recommendation-engine: "Moteur"
|
||||||
|
external-user-recommendation-engine-desc: "Exemple : https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "Délai d’expiration"
|
||||||
|
external-user-recommendation-timeout-desc: "En millisecondes (par exemple : 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "Graph"
|
title: "Graph"
|
||||||
per-day: "par jour"
|
per-day: "par jour"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "Temps de réponse"
|
network-time: "Temps de réponse"
|
||||||
network-usage: "Traffic"
|
network-usage: "Traffic"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "Suspendre un·e utilisateur·rice"
|
operation: "Actions"
|
||||||
|
username-or-userid: "Nom d’utilisateur·rice ou ID utilisateur"
|
||||||
|
user-not-found: "Utilisateur·rice non trouvé·e"
|
||||||
|
lookup: "Recherche"
|
||||||
|
reset-password: "Réinitialiser mot de passe"
|
||||||
|
password-updated: "Le mot de passe est « {password} »"
|
||||||
suspend: "Suspendre"
|
suspend: "Suspendre"
|
||||||
suspended: "Suspendu·e avec succès."
|
suspended: "Suspendu·e avec succè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"
|
||||||
verify-user: "Paramètres de vérification du compte utilisateur"
|
|
||||||
verify: "Vérification du compte"
|
verify: "Vérification du compte"
|
||||||
verified: "Le compte a été vérifié"
|
verified: "Le compte a été vérifié"
|
||||||
unverify-user: "Paramètres de non-vérification du compte utilisateur"
|
|
||||||
unverify: "Ôter la vérification du compte"
|
unverify: "Ôter la vérification du compte"
|
||||||
unverified: "Ce compte n'est plus vérifié"
|
unverified: "Ce compte n'est plus vérifié"
|
||||||
|
users:
|
||||||
|
title: "Utilisateur·rice·s"
|
||||||
|
sort:
|
||||||
|
title: "Trier par"
|
||||||
|
createdAtAsc: "Date d’inscription (Ascendant)"
|
||||||
|
createdAtDesc: "Date d’inscription (Descendant)"
|
||||||
|
updatedAtAsc: "Mis à jour récemment (Ascendant)"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "Origine"
|
||||||
|
combined: "Locaux + distants"
|
||||||
|
local: "Locaux"
|
||||||
|
remote: "Distants"
|
||||||
|
createdAt: "Créé le"
|
||||||
|
updatedAt: "Mis à jour le"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "Ajout d’un modérateur"
|
title: "Ajout d’un modérateur"
|
||||||
@@ -1265,7 +1304,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
about: "À propos de Misskey"
|
about: "À propos de Misskey"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment"
|
no-notes: "Il semble que cet·te utilisateur·rice n’a rien publié pour le moment."
|
||||||
no-notes-with-media: "Aucune notes avec des médias"
|
no-notes-with-media: "Aucune notes avec des médias"
|
||||||
mobile/views/components/users-list.vue:
|
mobile/views/components/users-list.vue:
|
||||||
all: "Tout"
|
all: "Tout"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "Visibilité de la publication"
|
note-visibility: "Visibilité de la publication"
|
||||||
default-note-visibility: "Visibilité par défaut"
|
default-note-visibility: "Visibilité par défaut"
|
||||||
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "Ne pas mentionner que ma publication provient d'un 'périphérique mobile'"
|
disable-via-mobile: "Ne pas mentionner que ma publication provient d'un 'périphérique mobile'"
|
||||||
load-raw-images: "Afficher les photos jointes en haute qualité"
|
load-raw-images: "Afficher les photos jointes en haute qualité"
|
||||||
load-remote-media: "Afficher les médias sur le serveur distant"
|
load-remote-media: "Afficher les médias sur le serveur distant"
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const yaml = require('js-yaml');
|
const yaml = require('js-yaml');
|
||||||
|
|
||||||
const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL', 'zh-CN'];
|
const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL', 'zh-CN', 'ko-KR'];
|
||||||
|
|
||||||
const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
|
const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
|
||||||
const locales = langs.map(lang => ({ [lang]: loadLocale(lang) }));
|
const locales = langs.map(lang => ({ [lang]: loadLocale(lang) }));
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "確認中"
|
fetching: "確認中"
|
||||||
no-broadcasts: "お知らせはありません"
|
no-broadcasts: "お知らせはありません"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "詳細設定"
|
advanced: "詳細設定"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
|
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
@@ -503,6 +504,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
|
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "確認中"
|
fetching: "確認中"
|
||||||
@@ -824,6 +829,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "詳細設定"
|
advanced: "詳細設定"
|
||||||
@@ -1092,17 +1099,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -1117,6 +1124,22 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-secure: "SMTP接続に暗黙的なSSL/TLSを使用する"
|
||||||
|
smtp-secure-info: "STARTTLS使用時はオフにします。"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
|
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
@@ -1145,18 +1168,35 @@ admin/views/charts.vue:
|
|||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
|
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
@@ -1541,6 +1581,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "さいなら"
|
close: "さいなら"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "ほい"
|
got-it: "ほい"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存したで"
|
saved: "プロフィールを保存したで"
|
||||||
uploading: "アップロードしとります"
|
uploading: "アップロードしとります"
|
||||||
upload-failed: "これアップロードでけへんわ"
|
upload-failed: "これアップロードでけへんわ"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "見てみるわ…"
|
fetching: "見てみるわ…"
|
||||||
no-broadcasts: "お知らせはあらへんで"
|
no-broadcasts: "お知らせはあらへんで"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "もとからの公開範囲"
|
default-note-visibility: "もとからの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。"
|
||||||
advanced: "もっと設定"
|
advanced: "もっと設定"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "もとからの公開範囲"
|
default-note-visibility: "もとからの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
remember-note-visibility: "投稿の公開範囲おぼえといて"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグなんて要らんわ"
|
disable-via-mobile: "「モバイルからの投稿」フラグなんて要らんわ"
|
||||||
load-raw-images: "添付された画像もべっぴんさんのままにしといてな"
|
load-raw-images: "添付された画像もべっぴんさんのままにしといてな"
|
||||||
load-remote-media: "東京とか、リモートサーバーのメディアも見せてや"
|
load-remote-media: "東京とか、リモートサーバーのメディアも見せてや"
|
||||||
|
2315
locales/ko-KR.yml
2315
locales/ko-KR.yml
File diff suppressed because it is too large
Load Diff
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Bezig met ophalen"
|
fetching: "Bezig met ophalen"
|
||||||
no-broadcasts: "Geen uitzendingen"
|
no-broadcasts: "Geen uitzendingen"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "Venster automatisch uitvouwen"
|
auto-popout: "Venster automatisch uitvouwen"
|
||||||
auto-popout-desc: "Venster uitvouwen, indien mogelijk. Deze instelling wordt opgeslagen in je browser."
|
auto-popout-desc: "Venster uitvouwen, indien mogelijk. Deze instelling wordt opgeslagen in je browser."
|
||||||
advanced: "Geavanceerde instellingen"
|
advanced: "Geavanceerde instellingen"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "Zonder 'mobiele berichten'"
|
disable-via-mobile: "Zonder 'mobiele berichten'"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "Skjønner!"
|
got-it: "Skjønner!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Henter"
|
fetching: "Henter"
|
||||||
no-broadcasts: "お知らせはありません"
|
no-broadcasts: "お知らせはありません"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "Avanserte innstillinger"
|
advanced: "Avanserte innstillinger"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -7,14 +7,14 @@ common:
|
|||||||
about-title: "⭐ Fediwersum"
|
about-title: "⭐ Fediwersum"
|
||||||
about: "Dziękujemy za znalezienie Misskey. Misskey jest <b>zdecentralizowaną platformą mikroblogową</b> powstałą na Ziemi. Ponieważ działa ona w Fediwersum (uniwersum, w którego skład wchodzi wiele sieci społecznościowych), jest ona połączona z innymi platformami społecznościowymi. Spróbujesz odpocząć od zatłoczoneo miasta i zanurzyć się w nowym Internecie?"
|
about: "Dziękujemy za znalezienie Misskey. Misskey jest <b>zdecentralizowaną platformą mikroblogową</b> powstałą na Ziemi. Ponieważ działa ona w Fediwersum (uniwersum, w którego skład wchodzi wiele sieci społecznościowych), jest ona połączona z innymi platformami społecznościowymi. Spróbujesz odpocząć od zatłoczoneo miasta i zanurzyć się w nowym Internecie?"
|
||||||
intro:
|
intro:
|
||||||
title: "Misskeyって?"
|
title: "Czym jest Misskey?"
|
||||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||||
features: "特徴"
|
features: "特徴"
|
||||||
rich-contents: "投稿"
|
rich-contents: "投稿"
|
||||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||||
reaction: "リアクション"
|
reaction: "Reakcje"
|
||||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||||
ui: "インターフェース"
|
ui: "Interfejs"
|
||||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||||
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "Zamknij"
|
close: "Zamknij"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "Rozumiem!"
|
got-it: "Rozumiem!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Wskazówki o dostosowywaniu"
|
title: "Wskazówki o dostosowywaniu"
|
||||||
@@ -192,8 +193,8 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
waiting-for: "Oczekiwanie na {}"
|
waiting-for: "Oczekiwanie na {}"
|
||||||
cancel: "Anuluj"
|
cancel: "Anuluj"
|
||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "Poddaj się"
|
||||||
surrendered: "投了により"
|
surrendered: "Przez poddanie się"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
looped-map: "ループマップ"
|
looped-map: "ループマップ"
|
||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
@@ -293,8 +294,8 @@ common/views/components/theme.vue:
|
|||||||
import-by-code: "またはコードをペースト"
|
import-by-code: "またはコードをペースト"
|
||||||
theme-name-required: "テーマ名は必須です。"
|
theme-name-required: "テーマ名は必須です。"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "Ukryj"
|
||||||
show: "もっと見る"
|
show: "Pokaż więcej"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Znajdź użytkownika"
|
search-user: "Znajdź użytkownika"
|
||||||
you: "Ty"
|
you: "Ty"
|
||||||
@@ -350,7 +351,7 @@ common/views/components/reaction-picker.vue:
|
|||||||
choose-reaction: "Wybierz reakcję"
|
choose-reaction: "Wybierz reakcję"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "カスタム絵文字"
|
custom-emoji: "カスタム絵文字"
|
||||||
people: "人"
|
people: "Ludzie"
|
||||||
animals-and-nature: "動物&自然"
|
animals-and-nature: "動物&自然"
|
||||||
food-and-drink: "食べ物&飲み物"
|
food-and-drink: "食べ物&飲み物"
|
||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
@@ -366,8 +367,8 @@ common/views/components/signin.vue:
|
|||||||
signin: "Zaloguj"
|
signin: "Zaloguj"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
||||||
signin-with-github: "GitHubでログイン"
|
signin-with-github: "Zaloguj się za pomocą GitHuba"
|
||||||
signin-with-discord: "Discordでログイン"
|
signin-with-discord: "Zaloguj się za pomocą Discorda"
|
||||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "招待コード"
|
invitation-code: "招待コード"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Sprawdzanie"
|
fetching: "Sprawdzanie"
|
||||||
no-broadcasts: "Brak transmisji"
|
no-broadcasts: "Brak transmisji"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "Automatycznie pojawiające się okna"
|
auto-popout: "Automatycznie pojawiające się okna"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "Ustawienia zaawansowane"
|
advanced: "Ustawienia zaawansowane"
|
||||||
@@ -932,7 +939,7 @@ admin/views/index.vue:
|
|||||||
moderators: "モデレーター"
|
moderators: "モデレーター"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
announcements: "お知らせ"
|
announcements: "Ogłoszenia"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Misskeyに戻る"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1054,7 +1093,7 @@ admin/views/emoji.vue:
|
|||||||
are-you-sure: "「$1」を削除しますか?"
|
are-you-sure: "「$1」を削除しますか?"
|
||||||
removed: "削除しました"
|
removed: "削除しました"
|
||||||
admin/views/announcements.vue:
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "Ogłoszenia"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
remove: "削除"
|
remove: "削除"
|
||||||
add: "追加"
|
add: "追加"
|
||||||
@@ -1074,10 +1113,10 @@ desktop/views/pages/welcome.vue:
|
|||||||
signin-button: "Zaloguj się"
|
signin-button: "Zaloguj się"
|
||||||
signup-button: "Zarejestruj się"
|
signup-button: "Zarejestruj się"
|
||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
announcements: "お知らせ"
|
announcements: "Ogłoszenia"
|
||||||
photos: "最近の画像"
|
photos: "Ostatnie obrazy"
|
||||||
powered-by-misskey: "Oparto o <b>Misskey</b>."
|
powered-by-misskey: "Oparto o <b>Misskey</b>."
|
||||||
info: "情報"
|
info: "Informacje"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Dysk Misskey"
|
title: "Dysk Misskey"
|
||||||
desktop/views/pages/home-customize.vue:
|
desktop/views/pages/home-customize.vue:
|
||||||
@@ -1131,7 +1170,7 @@ 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: "{age}歳"
|
years-old: "{age} lat"
|
||||||
year: "年"
|
year: "年"
|
||||||
month: "月"
|
month: "月"
|
||||||
day: "日"
|
day: "日"
|
||||||
@@ -1200,10 +1239,10 @@ mobile/views/components/media-video.vue:
|
|||||||
click-to-show: "Naciśnij aby wyświetlić"
|
click-to-show: "Naciśnij aby wyświetlić"
|
||||||
common/views/components/follow-button.vue:
|
common/views/components/follow-button.vue:
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "Śledź"
|
||||||
request-pending: "フォロー許可待ち"
|
request-pending: "フォロー許可待ち"
|
||||||
follow-processing: "フォロー処理中"
|
follow-processing: "フォロー処理中"
|
||||||
follow-request: "フォロー申請"
|
follow-request: "Poproś o śledzenie"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "Zacznij śledzić ludzi takich jak Ty"
|
title: "Zacznij śledzić ludzi takich jak Ty"
|
||||||
empty: "Nie znaleziono podobnych użytkowników."
|
empty: "Nie znaleziono podobnych użytkowników."
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
||||||
load-raw-images: "Wyświetlaj załączone zdjęcia w wysokiej jakości"
|
load-raw-images: "Wyświetlaj załączone zdjęcia w wysokiej jakości"
|
||||||
load-remote-media: "Wyświetlaj zawartość multimedialną ze zdalnych serwerów"
|
load-remote-media: "Wyświetlaj zawartość multimedialną ze zdalnych serwerów"
|
||||||
@@ -1391,7 +1432,7 @@ mobile/views/pages/user.vue:
|
|||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
unblock: "ブロック解除"
|
unblock: "ブロック解除"
|
||||||
years-old: "{age}歳"
|
years-old: "{age} lat"
|
||||||
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"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
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."
|
||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "Entendi!"
|
got-it: "Entendi!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Dicas de personalização"
|
title: "Dicas de personalização"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "確認中"
|
fetching: "確認中"
|
||||||
no-broadcasts: "お知らせはありません"
|
no-broadcasts: "お知らせはありません"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "詳細設定"
|
advanced: "詳細設定"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -7,61 +7,62 @@ common:
|
|||||||
about-title: "Мы — ⭐ fediverse"
|
about-title: "Мы — ⭐ fediverse"
|
||||||
about: "Спасибо, что нашли Misskey. Misskey — это <b>децентрализованная платформа для микроблоггинга</b> родом с планеты Земля. Поскольку она существует внутри Fediverse (вселенной различных социальных платформ), она связана с другими платформами. Отдохните от шума большого города — и познакомьтесь с новым интернетом."
|
about: "Спасибо, что нашли Misskey. Misskey — это <b>децентрализованная платформа для микроблоггинга</b> родом с планеты Земля. Поскольку она существует внутри Fediverse (вселенной различных социальных платформ), она связана с другими платформами. Отдохните от шума большого города — и познакомьтесь с новым интернетом."
|
||||||
intro:
|
intro:
|
||||||
title: "Misskeyって?"
|
title: "Что такое Misskey?"
|
||||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
about: "Misskey - это <b>децентрализованный сервис микроблогинга</b> с открытым исходным кодом. Он имеет такие функции, как: навороченный, полностью настраиваемый пользовательский интерфейс, множество реакций на посты, бесплатное хранилище файлов с интегрированной системой управления и ещё куча передовых фишек. А ещё сетевая система под названием “Fediverse” позволяет нам общаться с пользователями других социальных сетей. Например, если ты что-нибудь запостишь, то твой пост будет отослан не только в Misskey, но ещё и mastodon. Просто представь, что планета посылает микроволны на другую планету для коммуникации."
|
||||||
features: "特徴"
|
features: "Особенности"
|
||||||
rich-contents: "投稿"
|
rich-contents: "Посты"
|
||||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
rich-contents-desc: "Просто выложи свою идею, актуальные темы и всё, что тебе хочется показать миру. Ты можешь декорировать свои слова, прикреплять свои любимые картинки, отправлять файлы с фильмами и создать голосование - это те вещи, которые ты можешь сделать с помощью Misskey!"
|
||||||
reaction: "リアクション"
|
reaction: "Реакции"
|
||||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
reaction-desc: "Самый лёгкий способ выразить свои эмоции. Misskey позволяет добавлять различные виды реакций к постам других людей. Эмоциональный опыт из Misskey никогда не появится в других социальных сетях, позволяющих только жать “лайки”."
|
||||||
ui: "インターフェース"
|
ui: "Интерфейс"
|
||||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
ui-desc: "Нет такого интерфейса, понравившегося всем. Поэтому у Misskey имеется пользовательский интерфейс, широко настраиваемый под ваши вкусы. Создай себе уникальную домашнюю страницу редактируя, подстраивая оформление ленты и размещая виджеты, которые тоже можно кастомизировать."
|
||||||
drive: "ドライブ"
|
drive: "Хранилище файлов"
|
||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "Хотите запостить картинку, которую уже отправляли ранее? Хочется сортировать, переименовать и создать папку для ваших выложенных файлов? Тогда Misskey Drive - это лучшее решение для вас. Очень лёгкий способ делиться своими файлами онлайн."
|
||||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
outro: "Попробуйте будущие, уникальные для Misskey функции своими глазами! Если чувствуете, что это не в вашем вкусе, то попробуйте другие инстанции, ведь Misskey - это децентрализованная социальная сеть, так что ты можешь с лёгкостью найти себе товарищей. И наконец, GLHF!"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "広告ブロッカーを無効にしてください"
|
detected: "Пожалуйста, отключите блокировщик рекламы."
|
||||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
warning: "Некоторые функции перестанут быть доступными или будут работать неправильно, если включена блокировка рекламы. <strong>В Misskey нет рекламы</strong>."
|
||||||
application-authorization: "アプリの連携"
|
application-authorization: "Авторизация приложений"
|
||||||
close: "閉じる"
|
close: "Закрыть"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
|
||||||
load-more: "もっと読み込む"
|
load-more: "Загрузить больше"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
paragraph: "<p>ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。</p><p>一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。</p><p>ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。</p><p>カスタマイズを終了するには、右上の「完了」をクリックします。</p>"
|
paragraph: "<p>ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。</p><p>一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。</p><p>ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。</p><p>カスタマイズを終了するには、右上の「完了」をクリックします。</p>"
|
||||||
gotit: "Got it!"
|
gotit: "Got it!"
|
||||||
notification:
|
notification:
|
||||||
file-uploaded: "ファイルがアップロードされました"
|
file-uploaded: "Файл отправлен!"
|
||||||
message-from: "{}さんからメッセージ:"
|
message-from: "Сообщение от {}:"
|
||||||
reversi-invited: "対局への招待があります"
|
reversi-invited: "Приглашён в игру"
|
||||||
reversi-invited-by: "{}さんから"
|
reversi-invited-by: "Был приглашён {}:"
|
||||||
notified-by: "{}さんから"
|
notified-by: "{}さんから"
|
||||||
reply-from: "{}さんから返信:"
|
reply-from: "Ответ от {}:"
|
||||||
quoted-by: "{}さんが引用:"
|
quoted-by: "Цитировано {}:"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "неизвестно"
|
||||||
future: "未来"
|
future: "сейчас"
|
||||||
just_now: "たった今"
|
just_now: "сейчас"
|
||||||
seconds_ago: "{}秒前"
|
seconds_ago: "{} секунд назад"
|
||||||
minutes_ago: "{}分前"
|
minutes_ago: "{} минут назад"
|
||||||
hours_ago: "{}時間前"
|
hours_ago: "{} часов назад"
|
||||||
days_ago: "{}日前"
|
days_ago: "{} дней назад"
|
||||||
weeks_ago: "{}週間前"
|
weeks_ago: "{} недель назад"
|
||||||
months_ago: "{}ヶ月前"
|
months_ago: "{} месяцев назад"
|
||||||
years_ago: "{}年前"
|
years_ago: "{} лет назад"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{day}.{month}"
|
||||||
trash: "ゴミ箱"
|
trash: "Мусорное ведро"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
messaging: "トーク"
|
messaging: "Чат"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "Вс"
|
||||||
monday: "月"
|
monday: "Пн"
|
||||||
tuesday: "火"
|
tuesday: "Вт"
|
||||||
wednesday: "水"
|
wednesday: "Ср"
|
||||||
thursday: "木"
|
thursday: "Чт"
|
||||||
friday: "金"
|
friday: "Пт"
|
||||||
saturday: "土"
|
saturday: "Сб"
|
||||||
weekday:
|
weekday:
|
||||||
sunday: "日曜日"
|
sunday: "日曜日"
|
||||||
monday: "月曜日"
|
monday: "月曜日"
|
||||||
@@ -111,60 +112,60 @@ common:
|
|||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "Отключить анимированный текст в постах"
|
||||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
always-show-nsfw: "Всегда показывать NSFW контент"
|
||||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
always-mark-nsfw: "Всегда помечать посты с медиафайлами как NSFW"
|
||||||
show-full-acct: "ユーザー名のホストを省略しない"
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
show-via: "viaを表示する"
|
show-via: "показать через"
|
||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "Уменьшить движение в интерфейсе"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "Только для этого устройства"
|
||||||
use-os-default-emojis: "OS標準の絵文字を使用"
|
use-os-default-emojis: "Использовать стандартные Emoji из ОС"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'Эта сборка для разработчиков. Не используйте в продакшне.'
|
||||||
is-remote-user: "このユーザー情報はコピーです。"
|
is-remote-user: "このユーザー情報はコピーです。"
|
||||||
is-remote-post: "この投稿情報はコピーです。"
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
view-on-remote: "正確な情報を見る"
|
view-on-remote: "正確な情報を見る"
|
||||||
renoted-by: "{user}がRenote"
|
renoted-by: "{user}がRenote"
|
||||||
error:
|
error:
|
||||||
title: '問題が発生しました'
|
title: 'Что-то пошло не так :('
|
||||||
retry: 'やり直す'
|
retry: 'Повторить'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "Ничья"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "Ваш ход"
|
||||||
opponent-turn: "相手のターンです"
|
opponent-turn: "Ход оппонента"
|
||||||
turn-of: "{name}のターンです"
|
turn-of: "Ход {name}"
|
||||||
past-turn-of: "{name}のターン"
|
past-turn-of: "Ход {name}"
|
||||||
won: "{name}の勝ち"
|
won: "{name} победил"
|
||||||
black: "黒"
|
black: "Чёрный"
|
||||||
white: "白"
|
white: "Белый"
|
||||||
total: "合計"
|
total: "Всего"
|
||||||
this-turn: "{count}ターン目"
|
this-turn: "Ход {count}"
|
||||||
widgets:
|
widgets:
|
||||||
analog-clock: "アナログ時計"
|
analog-clock: "Аналоговые часы"
|
||||||
profile: "プロフィール"
|
profile: "Профиль"
|
||||||
calendar: "カレンダー"
|
calendar: "Календарь"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "Календарь (машина времени)"
|
||||||
activity: "アクティビティ"
|
activity: "Активность"
|
||||||
rss: "RSSリーダー"
|
rss: "Ридер RSS"
|
||||||
memo: "付箋"
|
memo: "Заметка"
|
||||||
trends: "トレンド"
|
trends: "Популярное"
|
||||||
photo-stream: "フォトストリーム"
|
photo-stream: "Фотопоток"
|
||||||
posts-monitor: "投稿チャート"
|
posts-monitor: "投稿チャート"
|
||||||
slideshow: "スライドショー"
|
slideshow: "Слайдшоу"
|
||||||
version: "バージョン"
|
version: "Версия"
|
||||||
broadcast: "ブロードキャスト"
|
broadcast: "ブロードキャスト"
|
||||||
notifications: "通知"
|
notifications: "Уведомления"
|
||||||
users: "おすすめユーザー"
|
users: "Рекомендованные пользователи"
|
||||||
polls: "アンケート"
|
polls: "Голосования"
|
||||||
post-form: "投稿フォーム"
|
post-form: "投稿フォーム"
|
||||||
server: "サーバー情報"
|
server: "Информация о сервере"
|
||||||
donation: "寄付のお願い"
|
donation: "寄付のお願い"
|
||||||
nav: "ナビゲーション"
|
nav: "ナビゲーション"
|
||||||
tips: "ヒント"
|
tips: "ヒント"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "Хэштеги"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "Не удалось создать приложение. Пожалуйста, попробуйте ещё раз."
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "Вы разрешаете <i>{name}</i> получить доступ к вашему аккаунту?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
account-read: "アカウントの情報を見る。"
|
account-read: "アカウントの情報を見る。"
|
||||||
account-write: "アカウントの情報を操作する。"
|
account-write: "アカウントの情報を操作する。"
|
||||||
@@ -210,28 +211,28 @@ common/views/components/games/reversi/reversi.index.vue:
|
|||||||
all-games: "みんなの対局"
|
all-games: "みんなの対局"
|
||||||
enter-username: "ユーザー名を入力してください"
|
enter-username: "ユーザー名を入力してください"
|
||||||
game-state:
|
game-state:
|
||||||
ended: "終了"
|
ended: "Завершено"
|
||||||
playing: "進行中"
|
playing: "В процессе"
|
||||||
common/views/components/games/reversi/reversi.room.vue:
|
common/views/components/games/reversi/reversi.room.vue:
|
||||||
settings-of-the-game: "ゲームの設定"
|
settings-of-the-game: "Настройки игры"
|
||||||
choose-map: "マップを選択"
|
choose-map: "マップを選択"
|
||||||
random: "ランダム"
|
random: "Случайно"
|
||||||
black-or-white: "先手/後手"
|
black-or-white: "Чёрные/Белые"
|
||||||
black-is: "{}が黒"
|
black-is: "{} ходит чёрными"
|
||||||
rules: "ルール"
|
rules: "Правила"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
looped-map: "ループマップ"
|
looped-map: "ループマップ"
|
||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
settings-of-the-bot: "Botの設定"
|
settings-of-the-bot: "Настройки бота"
|
||||||
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
this-game-is-started-soon: "Игра вот-вот начнётся"
|
||||||
waiting-for-other: "相手の準備が完了するのを待っています"
|
waiting-for-other: "Ожидание оппонента"
|
||||||
waiting-for-me: "あなたの準備が完了するのを待っています"
|
waiting-for-me: "あなたの準備が完了するのを待っています"
|
||||||
waiting-for-both: "準備中"
|
waiting-for-both: "準備中"
|
||||||
cancel: "キャンセル"
|
cancel: "Отмена"
|
||||||
ready: "準備完了"
|
ready: "Готов"
|
||||||
cancel-ready: "準備続行"
|
cancel-ready: "準備続行"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "サーバーに接続できません"
|
title: "Невозможно подключиться к серверу"
|
||||||
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
||||||
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
|
thanks: "いつもMisskeyをご利用いただきありがとうございます。"
|
||||||
troubleshoot: "トラブルシュート"
|
troubleshoot: "トラブルシュート"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "確認中"
|
fetching: "確認中"
|
||||||
no-broadcasts: "お知らせはありません"
|
no-broadcasts: "お知らせはありません"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "詳細設定"
|
advanced: "詳細設定"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "Twitter連携の設定"
|
twitter-integration-config: "Twitter連携の設定"
|
||||||
twitter-integration-info: "コールバックURLは /api/tw/cb に設定します。"
|
twitter-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-twitter-integration: "Twitter連携を有効にする"
|
enable-twitter-integration: "Twitter連携を有効にする"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer secret"
|
twitter-integration-consumer-secret: "Consumer secret"
|
||||||
github-integration-config: "GitHub連携の設定"
|
github-integration-config: "GitHub連携の設定"
|
||||||
github-integration-info: "コールバックURLは /api/gh/cb に設定します。"
|
github-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-github-integration: "GitHub連携を有効にする"
|
enable-github-integration: "GitHub連携を有効にする"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "Discord連携の設定"
|
discord-integration-config: "Discord連携の設定"
|
||||||
discord-integration-info: "コールバックURLは /api/dc/cb に設定します。"
|
discord-integration-info: "コールバックURLは {url} に設定します。"
|
||||||
enable-discord-integration: "Discord連携を有効にする"
|
enable-discord-integration: "Discord連携を有効にする"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
|
user-recommendation-config: "おすすめユーザー"
|
||||||
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
|
external-user-recommendation-engine: "エンジン"
|
||||||
|
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
per-day: "1日ごと"
|
per-day: "1日ごと"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
operation: "操作"
|
||||||
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
user-not-found: "ユーザーが見つかりません"
|
||||||
|
lookup: "照会"
|
||||||
|
reset-password: "パスワードをリセット"
|
||||||
|
password-updated: "パスワードは現在「{password}」です"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
suspended: "凍結しました"
|
suspended: "凍結しました"
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
verify-user: "ユーザーの公式アカウント設定"
|
|
||||||
verify: "公式アカウントにする"
|
verify: "公式アカウントにする"
|
||||||
verified: "公式アカウントにしました"
|
verified: "公式アカウントにしました"
|
||||||
unverify-user: "ユーザーの公式アカウント解除"
|
|
||||||
unverify: "公式アカウントを解除する"
|
unverify: "公式アカウントを解除する"
|
||||||
unverified: "公式アカウントを解除しました"
|
unverified: "公式アカウントを解除しました"
|
||||||
|
users:
|
||||||
|
title: "ユーザー"
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "登録日時が古い順"
|
||||||
|
createdAtDesc: "登録日時が新しい順"
|
||||||
|
updatedAtAsc: "更新日時が古い順"
|
||||||
|
updatedAtDesc: "更新日時が新しい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
createdAt: "登録日時"
|
||||||
|
updatedAt: "更新日時"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
default-note-visibility: "デフォルトの公開範囲"
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
@@ -26,6 +26,7 @@ common:
|
|||||||
close: "关闭"
|
close: "关闭"
|
||||||
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
|
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
|
||||||
load-more: "加载更多"
|
load-more: "加载更多"
|
||||||
|
enter-password: "パスワードを入力してください"
|
||||||
got-it: "没问题"
|
got-it: "没问题"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "客制化提示"
|
title: "客制化提示"
|
||||||
@@ -457,6 +458,10 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "更新配置文件成功"
|
saved: "更新配置文件成功"
|
||||||
uploading: "正在上传"
|
uploading: "正在上传"
|
||||||
upload-failed: "上传失败"
|
upload-failed: "上传失败"
|
||||||
|
email: "メール設定"
|
||||||
|
email-address: "メールアドレス"
|
||||||
|
email-verified: "メールアドレスが確認されました"
|
||||||
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "确认中"
|
fetching: "确认中"
|
||||||
no-broadcasts: "没有公告"
|
no-broadcasts: "没有公告"
|
||||||
@@ -731,6 +736,8 @@ desktop/views/components/settings.vue:
|
|||||||
note-visibility: "帖子可见性"
|
note-visibility: "帖子可见性"
|
||||||
default-note-visibility: "默认可见性"
|
default-note-visibility: "默认可见性"
|
||||||
remember-note-visibility: "记住帖子可见性"
|
remember-note-visibility: "记住帖子可见性"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "自动弹出窗口"
|
auto-popout: "自动弹出窗口"
|
||||||
auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。"
|
auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。"
|
||||||
advanced: "更多设置"
|
advanced: "更多设置"
|
||||||
@@ -966,17 +973,17 @@ admin/views/instance.vue:
|
|||||||
recaptcha-site-key: "reCAPTCHA site key"
|
recaptcha-site-key: "reCAPTCHA site key"
|
||||||
recaptcha-secret-key: "reCAPTCHA secret key"
|
recaptcha-secret-key: "reCAPTCHA secret key"
|
||||||
twitter-integration-config: "连接到Twitter的设置"
|
twitter-integration-config: "连接到Twitter的设置"
|
||||||
twitter-integration-info: "回调 URL 设置为 /api/tw/cb"
|
twitter-integration-info: "设置返回的URL{url}。"
|
||||||
enable-twitter-integration: "启用连接到Twitter"
|
enable-twitter-integration: "启用连接到Twitter"
|
||||||
twitter-integration-consumer-key: "Consumer key"
|
twitter-integration-consumer-key: "Consumer key"
|
||||||
twitter-integration-consumer-secret: "Consumer Secret"
|
twitter-integration-consumer-secret: "Consumer Secret"
|
||||||
github-integration-config: "连接到GitHub设置"
|
github-integration-config: "连接到GitHub设置"
|
||||||
github-integration-info: "回调 URL 设置为 /api/gh/cb"
|
github-integration-info: "设置返回的URL{url}。"
|
||||||
enable-github-integration: "启用连接到GitHub"
|
enable-github-integration: "启用连接到GitHub"
|
||||||
github-integration-client-id: "Client ID"
|
github-integration-client-id: "Client ID"
|
||||||
github-integration-client-secret: "Client Secret"
|
github-integration-client-secret: "Client Secret"
|
||||||
discord-integration-config: "设置 Discord Integration"
|
discord-integration-config: "设置 Discord Integration"
|
||||||
discord-integration-info: "回调 URL 设置为 /api/dc/cb"
|
discord-integration-info: "设置返回的URL{url}。"
|
||||||
enable-discord-integration: "启用 Discord 连接"
|
enable-discord-integration: "启用 Discord 连接"
|
||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
@@ -991,6 +998,21 @@ admin/views/instance.vue:
|
|||||||
invite: "邀请"
|
invite: "邀请"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存完毕"
|
saved: "保存完毕"
|
||||||
|
user-recommendation-config: "推荐用户"
|
||||||
|
enable-external-user-recommendation: "启用外部用户推荐"
|
||||||
|
external-user-recommendation-engine: "引擎"
|
||||||
|
external-user-recommendation-engine-desc: "例如: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
|
external-user-recommendation-timeout: "超时"
|
||||||
|
external-user-recommendation-timeout-desc: "单位为毫秒 (例如:300000)"
|
||||||
|
email-config: "メールサーバーの設定"
|
||||||
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
|
enable-email: "メール配信を有効にする"
|
||||||
|
email: "メールアドレス"
|
||||||
|
smtp-use-ssl: "SMTPサーバーはSSLを使用"
|
||||||
|
smtp-host: "SMTPホスト"
|
||||||
|
smtp-port: "SMTPポート"
|
||||||
|
smtp-user: "SMTPユーザー"
|
||||||
|
smtp-pass: "SMTPパスワード"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "历史记录"
|
title: "历史记录"
|
||||||
per-day: "每天"
|
per-day: "每天"
|
||||||
@@ -1017,18 +1039,35 @@ admin/views/charts.vue:
|
|||||||
network-time: "响应时间"
|
network-time: "响应时间"
|
||||||
network-usage: "网络流量"
|
network-usage: "网络流量"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
suspend-user: "冻结用户"
|
operation: "操作"
|
||||||
|
username-or-userid: "用户名或用户ID"
|
||||||
|
user-not-found: "用户不存在"
|
||||||
|
lookup: "订阅"
|
||||||
|
reset-password: "密码重置"
|
||||||
|
password-updated: "密码为「{password}」"
|
||||||
suspend: "被冻结"
|
suspend: "被冻结"
|
||||||
suspended: "成功冻结用户"
|
suspended: "成功冻结用户"
|
||||||
unsuspend-user: "解除用户冻结"
|
|
||||||
unsuspend: "已解除冻结"
|
unsuspend: "已解除冻结"
|
||||||
unsuspended: "已成功解除用户冻结"
|
unsuspended: "已成功解除用户冻结"
|
||||||
verify-user: "用户账户认证设置"
|
|
||||||
verify: "认证用户"
|
verify: "认证用户"
|
||||||
verified: "此账户已被认证"
|
verified: "此账户已被认证"
|
||||||
unverify-user: "用户账号解除认证设置"
|
|
||||||
unverify: "解除账户认证"
|
unverify: "解除账户认证"
|
||||||
unverified: "该帐户未经认证"
|
unverified: "该帐户未经认证"
|
||||||
|
users:
|
||||||
|
title: "用户"
|
||||||
|
sort:
|
||||||
|
title: "排序"
|
||||||
|
createdAtAsc: "注册时间从旧到新"
|
||||||
|
createdAtDesc: "注册时间从新到旧"
|
||||||
|
updatedAtAsc: "更新时间从旧到新"
|
||||||
|
updatedAtDesc: "更新时间从新到旧"
|
||||||
|
origin:
|
||||||
|
title: "源自"
|
||||||
|
combined: "本地+远程"
|
||||||
|
local: "本地"
|
||||||
|
remote: "远程"
|
||||||
|
createdAt: "注册日期"
|
||||||
|
updatedAt: "最后更新"
|
||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "注册版主"
|
title: "注册版主"
|
||||||
@@ -1348,6 +1387,8 @@ mobile/views/pages/settings.vue:
|
|||||||
note-visibility: "帖子可见性"
|
note-visibility: "帖子可见性"
|
||||||
default-note-visibility: "默认可见性"
|
default-note-visibility: "默认可见性"
|
||||||
remember-note-visibility: "记住帖子可见性"
|
remember-note-visibility: "记住帖子可见性"
|
||||||
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "不要将帖子标记为“来自手机”"
|
disable-via-mobile: "不要将帖子标记为“来自手机”"
|
||||||
load-raw-images: "以原始质量显示附加图像"
|
load-raw-images: "以原始质量显示附加图像"
|
||||||
load-remote-media: "显示来自远程服务器的媒体"
|
load-remote-media: "显示来自远程服务器的媒体"
|
||||||
|
38
package.json
38
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.56.2",
|
"version": "10.59.2",
|
||||||
"clientVersion": "2.0.11963",
|
"clientVersion": "2.0.12277",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -47,14 +47,14 @@
|
|||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.11.2",
|
"@types/js-yaml": "3.11.2",
|
||||||
"@types/katex": "0.5.0",
|
"@types/katex": "0.5.0",
|
||||||
"@types/koa": "2.0.46",
|
"@types/koa": "2.0.47",
|
||||||
"@types/koa-bodyparser": "5.0.1",
|
"@types/koa-bodyparser": "5.0.1",
|
||||||
"@types/koa-compress": "2.0.8",
|
"@types/koa-compress": "2.0.8",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.19",
|
||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "3.0.1",
|
"@types/koa-mount": "3.0.1",
|
||||||
"@types/koa-multer": "1.0.0",
|
"@types/koa-multer": "1.0.0",
|
||||||
"@types/koa-router": "7.0.33",
|
"@types/koa-router": "7.0.35",
|
||||||
"@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",
|
||||||
@@ -63,14 +63,15 @@
|
|||||||
"@types/mocha": "5.2.5",
|
"@types/mocha": "5.2.5",
|
||||||
"@types/mongodb": "3.1.14",
|
"@types/mongodb": "3.1.14",
|
||||||
"@types/ms": "0.7.30",
|
"@types/ms": "0.7.30",
|
||||||
"@types/node": "10.12.2",
|
"@types/node": "10.12.10",
|
||||||
|
"@types/nodemailer": "4.6.5",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parsimmon": "1.10.0",
|
"@types/parsimmon": "1.10.0",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.3.0",
|
"@types/qrcode": "1.3.0",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.7",
|
"@types/redis": "2.8.8",
|
||||||
"@types/request": "2.48.1",
|
"@types/request": "2.48.1",
|
||||||
"@types/request-promise-native": "1.0.15",
|
"@types/request-promise-native": "1.0.15",
|
||||||
"@types/rimraf": "2.0.2",
|
"@types/rimraf": "2.0.2",
|
||||||
@@ -78,7 +79,7 @@
|
|||||||
"@types/sharp": "0.21.0",
|
"@types/sharp": "0.21.0",
|
||||||
"@types/showdown": "1.7.5",
|
"@types/showdown": "1.7.5",
|
||||||
"@types/speakeasy": "2.0.3",
|
"@types/speakeasy": "2.0.3",
|
||||||
"@types/systeminformation": "3.23.0",
|
"@types/systeminformation": "3.23.1",
|
||||||
"@types/tinycolor2": "1.4.1",
|
"@types/tinycolor2": "1.4.1",
|
||||||
"@types/tmp": "0.0.33",
|
"@types/tmp": "0.0.33",
|
||||||
"@types/uuid": "3.4.4",
|
"@types/uuid": "3.4.4",
|
||||||
@@ -87,8 +88,8 @@
|
|||||||
"@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.2.2",
|
"apexcharts": "2.2.3",
|
||||||
"autobind-decorator": "2.2.1",
|
"autobind-decorator": "2.3.1",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
@@ -109,7 +110,7 @@
|
|||||||
"diskusage": "0.2.5",
|
"diskusage": "0.2.5",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"elasticsearch": "15.2.0",
|
"elasticsearch": "15.2.0",
|
||||||
"emojilib": "2.3.0",
|
"emojilib": "2.4.0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "5.8.0",
|
"eslint": "5.8.0",
|
||||||
"eslint-plugin-vue": "4.7.1",
|
"eslint-plugin-vue": "4.7.1",
|
||||||
@@ -143,7 +144,7 @@
|
|||||||
"json5": "2.1.0",
|
"json5": "2.1.0",
|
||||||
"json5-loader": "1.0.1",
|
"json5-loader": "1.0.1",
|
||||||
"katex": "0.10.0",
|
"katex": "0.10.0",
|
||||||
"koa": "2.6.1",
|
"koa": "2.6.2",
|
||||||
"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",
|
||||||
@@ -166,6 +167,7 @@
|
|||||||
"ms": "2.1.1",
|
"ms": "2.1.1",
|
||||||
"nan": "2.11.1",
|
"nan": "2.11.1",
|
||||||
"nested-property": "0.0.7",
|
"nested-property": "0.0.7",
|
||||||
|
"nodemailer": "4.7.0",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"on-build-webpack": "0.1.0",
|
"on-build-webpack": "0.1.0",
|
||||||
@@ -201,13 +203,13 @@
|
|||||||
"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.47.0",
|
"systeminformation": "3.51.3",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"terser-webpack-plugin": "1.1.0",
|
"terser-webpack-plugin": "1.1.0",
|
||||||
"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": "5.3.0",
|
"ts-loader": "5.3.1",
|
||||||
"ts-node": "7.0.1",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.10.0",
|
"tslint": "5.10.0",
|
||||||
"typescript": "3.1.6",
|
"typescript": "3.1.6",
|
||||||
@@ -220,11 +222,11 @@
|
|||||||
"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-i18n": "8.3.1",
|
"vue-i18n": "8.3.2",
|
||||||
"vue-js-modal": "1.3.26",
|
"vue-js-modal": "1.3.26",
|
||||||
"vue-loader": "15.4.2",
|
"vue-loader": "15.4.2",
|
||||||
"vue-marquee-text-component": "1.1.0",
|
"vue-marquee-text-component": "1.1.0",
|
||||||
"vue-router": "3.0.1",
|
"vue-router": "3.0.2",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-svg-inline-loader": "1.2.2",
|
"vue-svg-inline-loader": "1.2.2",
|
||||||
"vue-template-compiler": "2.5.17",
|
"vue-template-compiler": "2.5.17",
|
||||||
@@ -233,11 +235,11 @@
|
|||||||
"vuex": "3.0.1",
|
"vuex": "3.0.1",
|
||||||
"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.7.0",
|
||||||
"webpack": "4.25.1",
|
"webpack": "4.26.0",
|
||||||
"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.2",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
<ui-textarea v-model="announcement.text">
|
<ui-textarea v-model="announcement.text">
|
||||||
<span>{{ $t('text') }}</span>
|
<span>{{ $t('text') }}</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group class="fit-bottom">
|
||||||
<ui-button @click="save()"><fa :icon="['far', 'save']"/> {{ $t('save') }}</ui-button>
|
<ui-button @click="save()"><fa :icon="['far', 'save']"/> {{ $t('save') }}</ui-button>
|
||||||
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> {{ $t('remove') }}</ui-button>
|
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> {{ $t('remove') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
<i slot="icon"><fa icon="link"/></i>
|
<i slot="icon"><fa icon="link"/></i>
|
||||||
<span>{{ $t('add-emoji.url') }}</span>
|
<span>{{ $t('add-emoji.url') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group class="fit-bottom">
|
||||||
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> {{ $t('emojis.update') }}</ui-button>
|
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> {{ $t('emojis.update') }}</ui-button>
|
||||||
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> {{ $t('emojis.remove') }}</ui-button>
|
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> {{ $t('emojis.remove') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
@@ -12,11 +12,15 @@
|
|||||||
<section class="fit-bottom">
|
<section class="fit-bottom">
|
||||||
<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
|
<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
|
||||||
<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
|
<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
|
||||||
<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="['far', 'envelope']"/></i>{{ $t('maintainer-email') }}</ui-input>
|
<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="farEnvelope"/></i>{{ $t('maintainer-email') }}</ui-input>
|
||||||
</section>
|
</section>
|
||||||
<section class="fit-top fit-bottom">
|
<section class="fit-top fit-bottom">
|
||||||
<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input>
|
<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input>
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
|
||||||
|
<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
|
||||||
|
</section>
|
||||||
<section class="fit-bottom">
|
<section class="fit-bottom">
|
||||||
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
||||||
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<span slot="desc">{{ $t('cache-remote-files-desc') }}</span></ui-switch>
|
<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<span slot="desc">{{ $t('cache-remote-files-desc') }}</span></ui-switch>
|
||||||
@@ -37,10 +41,28 @@
|
|||||||
<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
|
<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
|
<header><fa :icon="farEnvelope"/> {{ $t('email-config') }}</header>
|
||||||
|
<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<span slot="desc">{{ $t('email-config-info') }}</span></ui-switch>
|
||||||
|
<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input>
|
||||||
|
<ui-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input v-model="smtpUser" :disabled="!enableEmail">{{ $t('smtp-user') }}</ui-input>
|
||||||
|
<ui-input v-model="smtpPass" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<span slot="desc">{{ $t('smtp-secure-info') }}</span></ui-switch>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
|
<header>summaly Proxy</header>
|
||||||
|
<ui-input v-model="summalyProxy">URL</ui-input>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="faUserPlus"/> {{ $t('user-recommendation-config') }}</header>
|
||||||
|
<ui-switch v-model="enableExternalUserRecommendation">{{ $t('enable-external-user-recommendation') }}</ui-switch>
|
||||||
|
<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<span slot="desc">{{ $t('external-user-recommendation-engine-desc') }}</span></ui-input>
|
||||||
|
<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<span slot="suffix">ms</span><span slot="desc">{{ $t('external-user-recommendation-timeout-desc') }}</span></ui-input>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
@@ -59,7 +81,7 @@
|
|||||||
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</div>
|
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</div>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
|
<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
|
||||||
<ui-info>{{ $t('twitter-integration-info') }}</ui-info>
|
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
||||||
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
||||||
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
@@ -70,7 +92,7 @@
|
|||||||
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</div>
|
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</div>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
|
<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
|
||||||
<ui-info>{{ $t('github-integration-info') }}</ui-info>
|
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
||||||
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input>
|
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input>
|
||||||
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</ui-input>
|
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</ui-input>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
@@ -81,7 +103,7 @@
|
|||||||
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
|
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||||
<ui-info>{{ $t('discord-integration-info') }}</ui-info>
|
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
||||||
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
|
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
|
||||||
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
|
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
@@ -93,15 +115,17 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { host } from '../../config';
|
import { url, host } from '../../config';
|
||||||
import { toUnicode } from 'punycode';
|
import { toUnicode } from 'punycode';
|
||||||
import { faHeadset, faShieldAlt, faGhost } from '@fortawesome/free-solid-svg-icons';
|
import { faHeadset, faShieldAlt, faGhost, faUserPlus } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/instance.vue'),
|
i18n: i18n('admin/views/instance.vue'),
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
url,
|
||||||
host: toUnicode(host),
|
host: toUnicode(host),
|
||||||
maintainerName: null,
|
maintainerName: null,
|
||||||
maintainerEmail: null,
|
maintainerEmail: null,
|
||||||
@@ -129,7 +153,18 @@ export default Vue.extend({
|
|||||||
discordClientSecret: null,
|
discordClientSecret: null,
|
||||||
proxyAccount: null,
|
proxyAccount: null,
|
||||||
inviteCode: null,
|
inviteCode: null,
|
||||||
faHeadset, faShieldAlt, faGhost
|
enableExternalUserRecommendation: false,
|
||||||
|
externalUserRecommendationEngine: null,
|
||||||
|
externalUserRecommendationTimeout: null,
|
||||||
|
summalyProxy: null,
|
||||||
|
enableEmail: false,
|
||||||
|
email: null,
|
||||||
|
smtpSecure: false,
|
||||||
|
smtpHost: null,
|
||||||
|
smtpPort: null,
|
||||||
|
smtpUser: null,
|
||||||
|
smtpPass: null,
|
||||||
|
faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -158,6 +193,17 @@ export default Vue.extend({
|
|||||||
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
||||||
this.discordClientId = meta.discordClientId;
|
this.discordClientId = meta.discordClientId;
|
||||||
this.discordClientSecret = meta.discordClientSecret;
|
this.discordClientSecret = meta.discordClientSecret;
|
||||||
|
this.enableExternalUserRecommendation = meta.enableExternalUserRecommendation;
|
||||||
|
this.externalUserRecommendationEngine = meta.externalUserRecommendationEngine;
|
||||||
|
this.externalUserRecommendationTimeout = meta.externalUserRecommendationTimeout;
|
||||||
|
this.summalyProxy = meta.summalyProxy;
|
||||||
|
this.enableEmail = meta.enableEmail;
|
||||||
|
this.email = meta.email;
|
||||||
|
this.smtpSecure = meta.smtpSecure;
|
||||||
|
this.smtpHost = meta.smtpHost;
|
||||||
|
this.smtpPort = meta.smtpPort;
|
||||||
|
this.smtpUser = meta.smtpUser;
|
||||||
|
this.smtpPass = meta.smtpPass;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -199,7 +245,18 @@ export default Vue.extend({
|
|||||||
githubClientSecret: this.githubClientSecret,
|
githubClientSecret: this.githubClientSecret,
|
||||||
enableDiscordIntegration: this.enableDiscordIntegration,
|
enableDiscordIntegration: this.enableDiscordIntegration,
|
||||||
discordClientId: this.discordClientId,
|
discordClientId: this.discordClientId,
|
||||||
discordClientSecret: this.discordClientSecret
|
discordClientSecret: this.discordClientSecret,
|
||||||
|
enableExternalUserRecommendation: this.enableExternalUserRecommendation,
|
||||||
|
externalUserRecommendationEngine: this.externalUserRecommendationEngine,
|
||||||
|
externalUserRecommendationTimeout: parseInt(this.externalUserRecommendationTimeout, 10),
|
||||||
|
summalyProxy: this.summalyProxy,
|
||||||
|
enableEmail: this.enableEmail,
|
||||||
|
email: this.email,
|
||||||
|
smtpSecure: this.smtpSecure,
|
||||||
|
smtpHost: this.smtpHost,
|
||||||
|
smtpPort: parseInt(this.smtpPort, 10),
|
||||||
|
smtpUser: this.smtpUser,
|
||||||
|
smtpPass: this.smtpPass
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$root.alert({
|
this.$root.alert({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
|
@@ -1,42 +1,63 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ucnffhbtogqgscfmqcymwmmupoknpfsw">
|
<div class="ucnffhbtogqgscfmqcymwmmupoknpfsw">
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">{{ $t('verify-user') }}</div>
|
<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input v-model="verifyUsername" type="text">
|
<ui-input v-model="target" type="text">
|
||||||
<span slot="prefix">@</span>
|
<span>{{ $t('username-or-userid') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-button @click="verifyUser" :disabled="verifying">{{ $t('verify') }}</ui-button>
|
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
|
||||||
|
<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-button @click="suspendUser" :disabled="suspending"><fa :icon="faSnowflake"/> {{ $t('suspend') }}</ui-button>
|
||||||
|
<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
|
<ui-textarea v-if="user" :value="user | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">{{ $t('unverify-user') }}</div>
|
<div slot="title"><fa :icon="faUsers"/> {{ $t('users.title') }}</div>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input v-model="unverifyUsername" type="text">
|
<ui-horizon-group inputs>
|
||||||
<span slot="prefix">@</span>
|
<ui-select v-model="sort">
|
||||||
</ui-input>
|
<span slot="label">{{ $t('users.sort.title') }}</span>
|
||||||
<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
|
<option value="-createdAt">{{ $t('users.sort.createdAtAsc') }}</option>
|
||||||
</section>
|
<option value="+createdAt">{{ $t('users.sort.createdAtDesc') }}</option>
|
||||||
</ui-card>
|
<option value="-updatedAt">{{ $t('users.sort.updatedAtAsc') }}</option>
|
||||||
|
<option value="+updatedAt">{{ $t('users.sort.updatedAtDesc') }}</option>
|
||||||
<ui-card>
|
</ui-select>
|
||||||
<div slot="title">{{ $t('suspend-user') }}</div>
|
<ui-select v-model="origin">
|
||||||
<section class="fit-top">
|
<span slot="label">{{ $t('users.origin.title') }}</span>
|
||||||
<ui-input v-model="suspendUsername" type="text">
|
<option value="combined">{{ $t('users.origin.combined') }}</option>
|
||||||
<span slot="prefix">@</span>
|
<option value="local">{{ $t('users.origin.local') }}</option>
|
||||||
</ui-input>
|
<option value="remote">{{ $t('users.origin.remote') }}</option>
|
||||||
<ui-button @click="suspendUser" :disabled="suspending">{{ $t('suspend') }}</ui-button>
|
</ui-select>
|
||||||
</section>
|
</ui-horizon-group>
|
||||||
</ui-card>
|
<div class="kofvwchc" v-for="user in users">
|
||||||
|
<div>
|
||||||
<ui-card>
|
<a :href="user | userPage(null, true)">
|
||||||
<div slot="title">{{ $t('unsuspend-user') }}</div>
|
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
||||||
<section class="fit-top">
|
</a>
|
||||||
<ui-input v-model="unsuspendUsername" type="text">
|
</div>
|
||||||
<span slot="prefix">@</span>
|
<div>
|
||||||
</ui-input>
|
<header>
|
||||||
<ui-button @click="unsuspendUser" :disabled="unsuspending">{{ $t('unsuspend') }}</ui-button>
|
<b>{{ user | userName }}</b>
|
||||||
|
<span class="username">@{{ user | acct }}</span>
|
||||||
|
</header>
|
||||||
|
<div>
|
||||||
|
<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span>{{ $t('users.createdAt') }}: <mk-time :time="user.createdAt" mode="detail"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -46,29 +67,89 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import parseAcct from "../../../../misc/acct/parse";
|
import parseAcct from "../../../../misc/acct/parse";
|
||||||
|
import { faCertificate, faUsers, faTerminal, faSearch, faKey } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/users.vue'),
|
i18n: i18n('admin/views/users.vue'),
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
verifyUsername: null,
|
user: null,
|
||||||
|
target: null,
|
||||||
verifying: false,
|
verifying: false,
|
||||||
unverifyUsername: null,
|
|
||||||
unverifying: false,
|
unverifying: false,
|
||||||
suspendUsername: null,
|
|
||||||
suspending: false,
|
suspending: false,
|
||||||
unsuspendUsername: null,
|
unsuspending: false,
|
||||||
unsuspending: false
|
sort: '+createdAt',
|
||||||
|
origin: 'combined',
|
||||||
|
limit: 10,
|
||||||
|
offset: 0,
|
||||||
|
users: [],
|
||||||
|
existMore: false,
|
||||||
|
faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
sort() {
|
||||||
|
this.users = [];
|
||||||
|
this.offset = 0;
|
||||||
|
this.fetchUsers();
|
||||||
|
},
|
||||||
|
|
||||||
|
origin() {
|
||||||
|
this.users = [];
|
||||||
|
this.offset = 0;
|
||||||
|
this.fetchUsers();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetchUsers();
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
async fetchUser() {
|
||||||
|
try {
|
||||||
|
return await this.$root.api('users/show', this.target.startsWith('@') ? parseAcct(this.target) : { userId: this.target });
|
||||||
|
} catch (e) {
|
||||||
|
if (e == 'user not found') {
|
||||||
|
this.$root.alert({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('user-not-found')
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.$root.alert({
|
||||||
|
type: 'error',
|
||||||
|
text: e.toString()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async showUser() {
|
||||||
|
const user = await this.fetchUser();
|
||||||
|
this.$root.api('admin/show-user', { userId: user.id }).then(info => {
|
||||||
|
this.user = info;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async resetPassword() {
|
||||||
|
const user = await this.fetchUser();
|
||||||
|
this.$root.api('admin/reset-password', { userId: user.id }).then(res => {
|
||||||
|
this.$root.alert({
|
||||||
|
type: 'success',
|
||||||
|
text: this.$t('password-updated', { password: res.password })
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
async verifyUser() {
|
async verifyUser() {
|
||||||
this.verifying = true;
|
this.verifying = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.$root.api('users/show', parseAcct(this.verifyUsername));
|
const user = await this.fetchUser();
|
||||||
await this.$root.api('admin/verify-user', { userId: user.id });
|
await this.$root.api('admin/verify-user', { userId: user.id });
|
||||||
this.$root.alert({
|
this.$root.alert({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
@@ -90,7 +171,7 @@ export default Vue.extend({
|
|||||||
this.unverifying = true;
|
this.unverifying = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.$root.api('users/show', parseAcct(this.unverifyUsername));
|
const user = await this.fetchUser();
|
||||||
await this.$root.api('admin/unverify-user', { userId: user.id });
|
await this.$root.api('admin/unverify-user', { userId: user.id });
|
||||||
this.$root.alert({
|
this.$root.alert({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
@@ -112,7 +193,7 @@ export default Vue.extend({
|
|||||||
this.suspending = true;
|
this.suspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.$root.api('users/show', parseAcct(this.suspendUsername));
|
const user = await this.fetchUser();
|
||||||
await this.$root.api('admin/suspend-user', { userId: user.id });
|
await this.$root.api('admin/suspend-user', { userId: user.id });
|
||||||
this.$root.alert({
|
this.$root.alert({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
@@ -134,7 +215,7 @@ export default Vue.extend({
|
|||||||
this.unsuspending = true;
|
this.unsuspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
const user = await this.$root.api('users/show', parseAcct(this.unsuspendUsername));
|
const user = await this.fetchUser();
|
||||||
await this.$root.api('admin/unsuspend-user', { userId: user.id });
|
await this.$root.api('admin/unsuspend-user', { userId: user.id });
|
||||||
this.$root.alert({
|
this.$root.alert({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
@@ -150,6 +231,24 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.unsuspending = false;
|
this.unsuspending = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchUsers() {
|
||||||
|
this.$root.api('users', {
|
||||||
|
origin: this.origin,
|
||||||
|
sort: this.sort,
|
||||||
|
offset: this.offset,
|
||||||
|
limit: this.limit + 1
|
||||||
|
}).then(users => {
|
||||||
|
if (users.length == this.limit + 1) {
|
||||||
|
users.pop();
|
||||||
|
this.existMore = true;
|
||||||
|
} else {
|
||||||
|
this.existMore = false;
|
||||||
|
}
|
||||||
|
this.users = this.users.concat(users);
|
||||||
|
this.offset += this.limit;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -160,4 +259,24 @@ export default Vue.extend({
|
|||||||
@media (min-width 500px)
|
@media (min-width 500px)
|
||||||
padding 16px
|
padding 16px
|
||||||
|
|
||||||
|
.kofvwchc
|
||||||
|
display flex
|
||||||
|
padding 16px 0
|
||||||
|
border-top solid 1px var(--faceDivider)
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
> a
|
||||||
|
> .avatar
|
||||||
|
width 64px
|
||||||
|
height 64px
|
||||||
|
|
||||||
|
> div:last-child
|
||||||
|
flex 1
|
||||||
|
padding-left 16px
|
||||||
|
|
||||||
|
> header
|
||||||
|
> .username
|
||||||
|
margin-left 8px
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@@ -2,7 +2,7 @@ const faces = [
|
|||||||
'(=^・・^=)',
|
'(=^・・^=)',
|
||||||
'v(\'ω\')v',
|
'v(\'ω\')v',
|
||||||
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
||||||
'🖕(´・_・`)🖕',
|
'✌️(´・_・`)✌️',
|
||||||
'(。>﹏<。)',
|
'(。>﹏<。)',
|
||||||
'(Δ・x・Δ)'
|
'(Δ・x・Δ)'
|
||||||
];
|
];
|
||||||
|
@@ -78,9 +78,10 @@ export default (opts: Opts = {}) => ({
|
|||||||
urls(): string[] {
|
urls(): string[] {
|
||||||
if (this.appearNote.text) {
|
if (this.appearNote.text) {
|
||||||
const ast = parse(this.appearNote.text);
|
const ast = parse(this.appearNote.text);
|
||||||
|
// TODO: 再帰的にURL要素がないか調べる
|
||||||
return unique(ast
|
return unique(ast
|
||||||
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
|
.filter(t => ((t.name == 'url' || t.name == 'link') && t.props.url && !t.props.silent))
|
||||||
.map(t => t.url));
|
.map(t => t.props.url));
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,7 @@ export default function(me, settings, note) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isMyNote && note.text && settings.mutedWords.some(q => !q.some(word => !note.text.includes(word)))) {
|
if (!isMyNote && note.text && settings.mutedWords.some(q => q.length > 0 && !q.some(word => !note.text.includes(word)))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
<div class="icon" :class="type"><fa :icon="icon"/></div>
|
<div class="icon" :class="type"><fa :icon="icon"/></div>
|
||||||
<header v-if="title" v-html="title"></header>
|
<header v-if="title" v-html="title"></header>
|
||||||
<div class="body" v-if="text" v-html="text"></div>
|
<div class="body" v-if="text" v-html="text"></div>
|
||||||
<ui-horizon-group no-grow class="buttons" v-if="!splash">
|
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash">
|
||||||
<ui-button @click="ok" primary autofocus>OK</ui-button>
|
<ui-button @click="ok" primary autofocus>OK</ui-button>
|
||||||
<ui-button @click="cancel" v-if="showCancelButton">Cancel</ui-button>
|
<ui-button @click="cancel" v-if="showCancelButton">Cancel</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
@@ -50,15 +50,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="player" v-if="game.isEnded">
|
<div class="player" v-if="game.isEnded">
|
||||||
<div>
|
|
||||||
<button @click="logPos = 0" :disabled="logPos == 0"><fa icon="angle-double-left"/></button>
|
|
||||||
<button @click="logPos--" :disabled="logPos == 0"><fa icon="angle-left"/></button>
|
|
||||||
</div>
|
|
||||||
<span>{{ logPos }} / {{ logs.length }}</span>
|
<span>{{ logPos }} / {{ logs.length }}</span>
|
||||||
<div>
|
<ui-horizon-group>
|
||||||
<button @click="logPos++" :disabled="logPos == logs.length"><fa icon="angle-right"/></button>
|
<ui-button @click="logPos = 0" :disabled="logPos == 0"><fa :icon="faAngleDoubleLeft"/></ui-button>
|
||||||
<button @click="logPos = logs.length" :disabled="logPos == logs.length"><fa icon="angle-double-right"/></button>
|
<ui-button @click="logPos--" :disabled="logPos == 0"><fa :icon="faAngleLeft"/></ui-button>
|
||||||
</div>
|
<ui-button @click="logPos++" :disabled="logPos == logs.length"><fa :icon="faAngleRight"/></ui-button>
|
||||||
|
<ui-button @click="logPos = logs.length" :disabled="logPos == logs.length"><fa :icon="faAngleDoubleRight"/></ui-button>
|
||||||
|
</ui-horizon-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
@@ -75,6 +73,7 @@ import i18n from '../../../../../i18n';
|
|||||||
import * as CRC32 from 'crc-32';
|
import * as CRC32 from 'crc-32';
|
||||||
import Reversi, { Color } from '../../../../../../../games/reversi/core';
|
import Reversi, { Color } from '../../../../../../../games/reversi/core';
|
||||||
import { url } from '../../../../../config';
|
import { url } from '../../../../../config';
|
||||||
|
import { faAngleDoubleLeft, faAngleLeft, faAngleRight, faAngleDoubleRight } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('common/views/components/games/reversi/reversi.game.vue'),
|
i18n: i18n('common/views/components/games/reversi/reversi.game.vue'),
|
||||||
@@ -99,7 +98,8 @@ export default Vue.extend({
|
|||||||
o: null as Reversi,
|
o: null as Reversi,
|
||||||
logs: [],
|
logs: [],
|
||||||
logPos: 0,
|
logPos: 0,
|
||||||
pollingClock: null
|
pollingClock: null,
|
||||||
|
faAngleDoubleLeft, faAngleLeft, faAngleRight, faAngleDoubleRight
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -449,7 +449,9 @@ export default Vue.extend({
|
|||||||
padding-bottom 16px
|
padding-bottom 16px
|
||||||
|
|
||||||
> .player
|
> .player
|
||||||
padding-bottom 32px
|
padding 0 16px 32px 16px
|
||||||
|
margin 0 auto
|
||||||
|
max-width 500px
|
||||||
|
|
||||||
> span
|
> span
|
||||||
display inline-block
|
display inline-block
|
||||||
|
@@ -22,8 +22,8 @@
|
|||||||
<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 :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
|
<fa v-if="x == 'b'" :icon="fasCircle"/>
|
||||||
<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>
|
<fa v-if="x == 'w'" :icon="farCircle"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -117,6 +117,8 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../../i18n';
|
import i18n from '../../../../../i18n';
|
||||||
import * as maps from '../../../../../../../games/reversi/maps';
|
import * as maps from '../../../../../../../games/reversi/maps';
|
||||||
|
import { faCircle as fasCircle } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faCircle as farCircle } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('common/views/components/games/reversi/reversi.room.vue'),
|
i18n: i18n('common/views/components/games/reversi/reversi.room.vue'),
|
||||||
@@ -129,7 +131,8 @@ export default Vue.extend({
|
|||||||
mapName: maps.eighteight.name,
|
mapName: maps.eighteight.name,
|
||||||
maps: maps,
|
maps: maps,
|
||||||
form: null,
|
form: null,
|
||||||
messages: []
|
messages: [],
|
||||||
|
fasCircle, farCircle
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -22,7 +22,10 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
search() {
|
search() {
|
||||||
window.open(`https://www.google.com/?#q=${this.query}`, '_blank');
|
const engine = this.$store.state.settings.webSearchEngine ||
|
||||||
|
'https://www.google.com/?#q={{query}}';
|
||||||
|
const url = engine.replace('{{query}}', this.query)
|
||||||
|
window.open(url, '_blank');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -180,6 +180,7 @@ export default Vue.extend({
|
|||||||
padding 8px 16px
|
padding 8px 16px
|
||||||
width 100%
|
width 100%
|
||||||
color var(--popupFg)
|
color var(--popupFg)
|
||||||
|
white-space nowrap
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color var(--primaryForeground)
|
color var(--primaryForeground)
|
||||||
|
@@ -51,8 +51,8 @@ export default Vue.extend({
|
|||||||
if (this.message.text) {
|
if (this.message.text) {
|
||||||
const ast = parse(this.message.text);
|
const ast = parse(this.message.text);
|
||||||
return unique(ast
|
return unique(ast
|
||||||
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
|
.filter(t => ((t.name == 'url' || t.name == 'link') && t.props.url && !t.silent))
|
||||||
.map(t => t.url));
|
.map(t => t.props.url));
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@@ -9,18 +9,18 @@ import MkGoogle from './google.vue';
|
|||||||
import { toUnicode } from 'punycode';
|
import { toUnicode } from 'punycode';
|
||||||
import syntaxHighlight from '../../../../../mfm/syntax-highlight';
|
import syntaxHighlight from '../../../../../mfm/syntax-highlight';
|
||||||
|
|
||||||
function getText(tokens: Node[]): string {
|
function getTextCount(tokens: Node[]): number {
|
||||||
let text = '';
|
let count = 0;
|
||||||
const extract = (tokens: Node[]) => {
|
const extract = (tokens: Node[]) => {
|
||||||
tokens.filter(x => x.name === 'text').forEach(x => {
|
tokens.filter(x => x.name === 'text').forEach(x => {
|
||||||
text += x.props.text;
|
count += length(x.props.text);
|
||||||
});
|
});
|
||||||
tokens.filter(x => x.children).forEach(x => {
|
tokens.filter(x => x.children).forEach(x => {
|
||||||
extract(x.children);
|
extract(x.children);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
extract(tokens);
|
extract(tokens);
|
||||||
return text;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getChildrenCount(tokens: Node[]): number {
|
function getChildrenCount(tokens: Node[]): number {
|
||||||
@@ -98,7 +98,7 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
|
|
||||||
case 'big': {
|
case 'big': {
|
||||||
bigCount++;
|
bigCount++;
|
||||||
const isLong = length(getText(token.children)) > 10 || getChildrenCount(token.children) > 5;
|
const isLong = getTextCount(token.children) > 10 || getChildrenCount(token.children) > 5;
|
||||||
const isMany = bigCount > 3;
|
const isMany = bigCount > 3;
|
||||||
return (createElement as any)('strong', {
|
return (createElement as any)('strong', {
|
||||||
attrs: {
|
attrs: {
|
||||||
@@ -111,9 +111,17 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}, genEl(token.children));
|
}, genEl(token.children));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'center': {
|
||||||
|
return [createElement('div', {
|
||||||
|
attrs: {
|
||||||
|
style: 'text-align:center;'
|
||||||
|
}
|
||||||
|
}, genEl(token.children))];
|
||||||
|
}
|
||||||
|
|
||||||
case 'motion': {
|
case 'motion': {
|
||||||
motionCount++;
|
motionCount++;
|
||||||
const isLong = length(getText(token.children)) > 10 || getChildrenCount(token.children) > 5;
|
const isLong = getTextCount(token.children) > 10 || getChildrenCount(token.children) > 5;
|
||||||
const isMany = motionCount > 3;
|
const isMany = motionCount > 3;
|
||||||
return (createElement as any)('span', {
|
return (createElement as any)('span', {
|
||||||
attrs: {
|
attrs: {
|
||||||
|
@@ -29,7 +29,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
>>> .quote
|
>>> .quote
|
||||||
margin 8px
|
margin 8px
|
||||||
padding 6px 12px
|
padding 6px 0 6px 12px
|
||||||
color var(--mfmQuote)
|
color var(--mfmQuote)
|
||||||
border-left solid 3px var(--mfmQuoteLine)
|
border-left solid 3px var(--mfmQuoteLine)
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ export default Vue.extend({
|
|||||||
margin 0 0.5em
|
margin 0 0.5em
|
||||||
font-size 80%
|
font-size 80%
|
||||||
color #525252
|
color #525252
|
||||||
background #f8f8f8
|
background rgba(0, 0, 0, 0.05)
|
||||||
border-radius 2px
|
border-radius 2px
|
||||||
|
|
||||||
>>> pre > code
|
>>> pre > code
|
||||||
|
@@ -72,7 +72,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
save() {
|
save() {
|
||||||
this._mutedWords = this.mutedWords.split('\n').map(line => line.split(' '));
|
this._mutedWords = this.mutedWords.split('\n').map(line => line.split(' ').filter(x => x != ''));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -66,6 +66,19 @@
|
|||||||
<ui-switch v-model="carefulBot" @change="save(false)">{{ $t('careful-bot') }}</ui-switch>
|
<ui-switch v-model="carefulBot" @change="save(false)">{{ $t('careful-bot') }}</ui-switch>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section v-if="enableEmail">
|
||||||
|
<header>{{ $t('email') }}</header>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<template v-if="$store.state.i.email != null">
|
||||||
|
<ui-info v-if="$store.state.i.emailVerified">{{ $t('email-verified') }}</ui-info>
|
||||||
|
<ui-info v-else warn>{{ $t('email-not-verified') }}</ui-info>
|
||||||
|
</template>
|
||||||
|
<ui-input v-model="email" type="email"><span>{{ $t('email-address') }}</span></ui-input>
|
||||||
|
<ui-button @click="updateEmail()">{{ $t('save') }}</ui-button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -77,9 +90,12 @@ import { toUnicode } from 'punycode';
|
|||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('common/views/components/profile-editor.vue'),
|
i18n: i18n('common/views/components/profile-editor.vue'),
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
host: toUnicode(host),
|
host: toUnicode(host),
|
||||||
|
enableEmail: false,
|
||||||
|
email: null,
|
||||||
name: null,
|
name: null,
|
||||||
username: null,
|
username: null,
|
||||||
location: null,
|
location: null,
|
||||||
@@ -113,7 +129,11 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.name = this.$store.state.i.name || '';
|
this.$root.getMeta().then(meta => {
|
||||||
|
this.enableEmail = meta.enableEmail;
|
||||||
|
});
|
||||||
|
this.email = this.$store.state.i.email;
|
||||||
|
this.name = this.$store.state.i.name;
|
||||||
this.username = this.$store.state.i.username;
|
this.username = this.$store.state.i.username;
|
||||||
this.location = this.$store.state.i.profile.location;
|
this.location = this.$store.state.i.profile.location;
|
||||||
this.description = this.$store.state.i.description;
|
this.description = this.$store.state.i.description;
|
||||||
@@ -179,8 +199,8 @@ export default Vue.extend({
|
|||||||
location: this.location || null,
|
location: this.location || null,
|
||||||
description: this.description || null,
|
description: this.description || null,
|
||||||
birthday: this.birthday || null,
|
birthday: this.birthday || null,
|
||||||
avatarId: this.avatarId,
|
avatarId: this.avatarId || undefined,
|
||||||
bannerId: this.bannerId,
|
bannerId: this.bannerId || undefined,
|
||||||
isCat: !!this.isCat,
|
isCat: !!this.isCat,
|
||||||
isBot: !!this.isBot,
|
isBot: !!this.isBot,
|
||||||
isLocked: !!this.isLocked,
|
isLocked: !!this.isLocked,
|
||||||
@@ -199,6 +219,18 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateEmail() {
|
||||||
|
this.$input({
|
||||||
|
title: this.$t('@.enter-password'),
|
||||||
|
type: 'password'
|
||||||
|
}).then(password => {
|
||||||
|
this.$root.api('i/update_email', {
|
||||||
|
password: password,
|
||||||
|
email: this.email == '' ? null : this.email
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -67,7 +67,8 @@ export default Vue.extend({
|
|||||||
username: this.username,
|
username: this.username,
|
||||||
password: this.password,
|
password: this.password,
|
||||||
token: this.user && this.user.twoFactorEnabled ? this.token : undefined
|
token: this.user && this.user.twoFactorEnabled ? this.token : undefined
|
||||||
}, true).then(() => {
|
}, true).then(res => {
|
||||||
|
localStorage.setItem('i', res.i);
|
||||||
location.reload();
|
location.reload();
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert(this.$t('login-failed'));
|
alert(this.$t('login-failed'));
|
||||||
|
@@ -79,6 +79,10 @@ export default Vue.extend({
|
|||||||
|
|
||||||
*
|
*
|
||||||
pointer-events none
|
pointer-events none
|
||||||
|
user-select none
|
||||||
|
|
||||||
|
&:disabled
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
&:focus
|
&:focus
|
||||||
&:after
|
&:after
|
||||||
@@ -107,30 +111,30 @@ export default Vue.extend({
|
|||||||
color var(--text)
|
color var(--text)
|
||||||
background var(--buttonBg)
|
background var(--buttonBg)
|
||||||
|
|
||||||
&:hover
|
&:not(:disabled):hover
|
||||||
background var(--buttonHoverBg)
|
background var(--buttonHoverBg)
|
||||||
|
|
||||||
&:active
|
&:not(:disabled):active
|
||||||
background var(--buttonActiveBg)
|
background var(--buttonActiveBg)
|
||||||
|
|
||||||
&.primary
|
&.primary
|
||||||
color var(--primaryForeground)
|
color var(--primaryForeground)
|
||||||
background var(--primary)
|
background var(--primary)
|
||||||
|
|
||||||
&:hover
|
&:not(:disabled):hover
|
||||||
background var(--primaryLighten5)
|
background var(--primaryLighten5)
|
||||||
|
|
||||||
&:active
|
&:not(:disabled):active
|
||||||
background var(--primaryDarken5)
|
background var(--primaryDarken5)
|
||||||
|
|
||||||
&:not(.fill)
|
&:not(.fill)
|
||||||
color var(--primary)
|
color var(--primary)
|
||||||
background none
|
background none
|
||||||
|
|
||||||
&:hover
|
&:not(:disabled):hover
|
||||||
color var(--primaryDarken5)
|
color var(--primaryDarken5)
|
||||||
|
|
||||||
&:active
|
&:not(:disabled):active
|
||||||
background var(--primaryAlpha03)
|
background var(--primaryAlpha03)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@@ -22,6 +22,7 @@ export default Vue.extend({
|
|||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.ui-card
|
.ui-card
|
||||||
margin 16px
|
margin 16px
|
||||||
|
max-width 850px
|
||||||
color var(--faceText)
|
color var(--faceText)
|
||||||
background var(--face)
|
background var(--face)
|
||||||
border-radius var(--round)
|
border-radius var(--round)
|
||||||
|
@@ -27,9 +27,17 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.vnxwkwuf
|
.vnxwkwuf
|
||||||
|
margin 16px 0
|
||||||
|
|
||||||
&.inputs
|
&.inputs
|
||||||
margin 32px 0
|
margin 32px 0
|
||||||
|
|
||||||
|
&.fit-top
|
||||||
|
margin-top 0
|
||||||
|
|
||||||
|
&.fit-bottom
|
||||||
|
margin-bottom 0
|
||||||
|
|
||||||
&:not(.noGrow)
|
&:not(.noGrow)
|
||||||
display flex
|
display flex
|
||||||
|
|
||||||
@@ -37,5 +45,6 @@ export default Vue.extend({
|
|||||||
flex 1
|
flex 1
|
||||||
|
|
||||||
> *:not(:last-child)
|
> *:not(:last-child)
|
||||||
margin-right 16px
|
margin-right 16px !important
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@@ -9,27 +9,30 @@
|
|||||||
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
|
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
|
||||||
<template v-if="type != 'file'">
|
<template v-if="type != 'file'">
|
||||||
<input ref="input"
|
<input ref="input"
|
||||||
:type="type"
|
:type="type"
|
||||||
v-model="v"
|
v-model="v"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:required="required"
|
:required="required"
|
||||||
:readonly="readonly"
|
:readonly="readonly"
|
||||||
:pattern="pattern"
|
:pattern="pattern"
|
||||||
:autocomplete="autocomplete"
|
:autocomplete="autocomplete"
|
||||||
:spellcheck="spellcheck"
|
:spellcheck="spellcheck"
|
||||||
@focus="focused = true"
|
@focus="focused = true"
|
||||||
@blur="focused = false">
|
@blur="focused = false"
|
||||||
|
>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<input ref="input"
|
<input ref="input"
|
||||||
type="text"
|
type="text"
|
||||||
:value="placeholder"
|
:value="placeholder"
|
||||||
readonly
|
readonly
|
||||||
@click="chooseFile">
|
@click="chooseFile"
|
||||||
|
>
|
||||||
<input ref="file"
|
<input ref="file"
|
||||||
type="file"
|
type="file"
|
||||||
:value="value"
|
:value="value"
|
||||||
@change="onChangeFile">
|
@change="onChangeFile"
|
||||||
|
>
|
||||||
</template>
|
</template>
|
||||||
<div class="suffix" ref="suffix"><slot name="suffix"></slot></div>
|
<div class="suffix" ref="suffix"><slot name="suffix"></slot></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -325,6 +328,9 @@ root(fill)
|
|||||||
margin 6px 0
|
margin 6px 0
|
||||||
font-size 13px
|
font-size 13px
|
||||||
|
|
||||||
|
&:empty
|
||||||
|
display none
|
||||||
|
|
||||||
*
|
*
|
||||||
margin 0
|
margin 0
|
||||||
|
|
||||||
|
@@ -1,15 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ui-select" :class="[{ focused, filled }, styl]">
|
<div class="ui-select" :class="[{ focused, disabled, filled, inline }, styl]">
|
||||||
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
||||||
<div class="input" @click="focus">
|
<div class="input" @click="focus">
|
||||||
<span class="label" ref="label"><slot name="label"></slot></span>
|
<span class="label" ref="label"><slot name="label"></slot></span>
|
||||||
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
|
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
|
||||||
<select ref="input"
|
<select ref="input"
|
||||||
:value="v"
|
:value="v"
|
||||||
:required="required"
|
:required="required"
|
||||||
@input="$emit('input', $event.target.value)"
|
:disabled="disabled"
|
||||||
@focus="focused = true"
|
@input="$emit('input', $event.target.value)"
|
||||||
@blur="focused = false">
|
@focus="focused = true"
|
||||||
|
@blur="focused = false"
|
||||||
|
>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</select>
|
</select>
|
||||||
<div class="suffix"><slot name="suffix"></slot></div>
|
<div class="suffix"><slot name="suffix"></slot></div>
|
||||||
@@ -22,6 +24,11 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
inject: {
|
||||||
|
horizonGrouped: {
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
required: false
|
required: false
|
||||||
@@ -30,11 +37,22 @@ export default Vue.extend({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
styl: {
|
styl: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
default: 'line'
|
default: 'line'
|
||||||
}
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default(): boolean {
|
||||||
|
return this.horizonGrouped;
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -122,7 +140,7 @@ root(fill)
|
|||||||
transition-duration 0.3s
|
transition-duration 0.3s
|
||||||
font-size 16px
|
font-size 16px
|
||||||
line-height 32px
|
line-height 32px
|
||||||
color rgba(#000, 0.54)
|
color var(--inputLabel)
|
||||||
pointer-events none
|
pointer-events none
|
||||||
//will-change transform
|
//will-change transform
|
||||||
transform-origin top left
|
transform-origin top left
|
||||||
@@ -171,6 +189,9 @@ root(fill)
|
|||||||
margin 6px 0
|
margin 6px 0
|
||||||
font-size 13px
|
font-size 13px
|
||||||
|
|
||||||
|
&:empty
|
||||||
|
display none
|
||||||
|
|
||||||
*
|
*
|
||||||
margin 0
|
margin 0
|
||||||
|
|
||||||
@@ -200,4 +221,14 @@ root(fill)
|
|||||||
&:not(.fill)
|
&:not(.fill)
|
||||||
root(false)
|
root(false)
|
||||||
|
|
||||||
|
&.inline
|
||||||
|
display inline-block
|
||||||
|
margin 0
|
||||||
|
|
||||||
|
&.disabled
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
&, *
|
||||||
|
cursor not-allowed !important
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@@ -123,7 +123,7 @@ export default Vue.extend({
|
|||||||
> span
|
> span
|
||||||
display block
|
display block
|
||||||
line-height 20px
|
line-height 20px
|
||||||
color currentColor
|
color var(--text)
|
||||||
transition inherit
|
transition inherit
|
||||||
|
|
||||||
> p
|
> p
|
||||||
|
@@ -1,3 +1,10 @@
|
|||||||
|
import Vue from 'vue';
|
||||||
|
import * as JSON5 from 'json5';
|
||||||
|
|
||||||
|
Vue.filter('json5', x => {
|
||||||
|
return JSON5.stringify(x, null, 2);
|
||||||
|
});
|
||||||
|
|
||||||
require('./bytes');
|
require('./bytes');
|
||||||
require('./number');
|
require('./number');
|
||||||
require('./user');
|
require('./user');
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import getAcct from '../../../../../misc/acct/render';
|
import getAcct from '../../../../../misc/acct/render';
|
||||||
import getUserName from '../../../../../misc/get-user-name';
|
import getUserName from '../../../../../misc/get-user-name';
|
||||||
|
import { url } from '../../../config';
|
||||||
|
|
||||||
Vue.filter('acct', user => {
|
Vue.filter('acct', user => {
|
||||||
return getAcct(user);
|
return getAcct(user);
|
||||||
@@ -10,6 +11,6 @@ Vue.filter('userName', user => {
|
|||||||
return getUserName(user);
|
return getUserName(user);
|
||||||
});
|
});
|
||||||
|
|
||||||
Vue.filter('userPage', (user, path?) => {
|
Vue.filter('userPage', (user, path?, absolute = false) => {
|
||||||
return `/@${Vue.filter('acct')(user)}${(path ? `/${path}` : '')}`;
|
return `${absolute ? url : ''}/@${Vue.filter('acct')(user)}${(path ? `/${path}` : '')}`;
|
||||||
});
|
});
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-note-detail" :title="title">
|
<div class="mk-note-detail" :title="title" tabindex="-1">
|
||||||
<button
|
<button
|
||||||
class="read-more"
|
class="read-more"
|
||||||
v-if="appearNote.reply && appearNote.reply.replyId && conversation.length == 0"
|
v-if="appearNote.reply && appearNote.reply.replyId && conversation.length == 0"
|
||||||
@@ -63,18 +63,18 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<span class="app" v-if="note.app && $store.state.settings.showVia">via <b>{{ note.app.name }}</b></span>
|
<span class="app" v-if="note.app && $store.state.settings.showVia">via <b>{{ note.app.name }}</b></span>
|
||||||
<mk-reactions-viewer :note="appearNote"/>
|
<mk-reactions-viewer :note="appearNote"/>
|
||||||
<button class="replyButton" @click="reply" :title="$t('reply')">
|
<button class="replyButton" @click="reply()" :title="$t('reply')">
|
||||||
<template v-if="appearNote.reply"><fa icon="reply-all"/></template>
|
<template v-if="appearNote.reply"><fa icon="reply-all"/></template>
|
||||||
<template v-else><fa icon="reply"/></template>
|
<template v-else><fa icon="reply"/></template>
|
||||||
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
|
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="renoteButton" @click="renote" :title="$t('renote')">
|
<button class="renoteButton" @click="renote()" :title="$t('renote')">
|
||||||
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
|
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="reactionButton" :class="{ reacted: appearNote.myReaction != null }" @click="react" ref="reactButton" :title="$t('add-reaction')">
|
<button class="reactionButton" :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" :title="$t('add-reaction')">
|
||||||
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
|
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu()" ref="menuButton">
|
||||||
<fa icon="ellipsis-h"/>
|
<fa icon="ellipsis-h"/>
|
||||||
</button>
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
@@ -88,23 +88,18 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import parse from '../../../../../mfm/parse';
|
|
||||||
|
|
||||||
import MkPostFormWindow from './post-form-window.vue';
|
|
||||||
import MkRenoteFormWindow from './renote-form-window.vue';
|
|
||||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
|
||||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
|
||||||
import XSub from './note.sub.vue';
|
import XSub from './note.sub.vue';
|
||||||
import { sum, unique } from '../../../../../prelude/array';
|
|
||||||
import noteSubscriber from '../../../common/scripts/note-subscriber';
|
import noteSubscriber from '../../../common/scripts/note-subscriber';
|
||||||
|
import noteMixin from '../../../common/scripts/note-mixin';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('desktop/views/components/note-detail.vue'),
|
i18n: i18n('desktop/views/components/note-detail.vue'),
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
XSub
|
XSub
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [noteSubscriber('note')],
|
mixins: [noteMixin(), noteSubscriber('note')],
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
note: {
|
note: {
|
||||||
@@ -118,47 +113,12 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
showContent: false,
|
|
||||||
conversation: [],
|
conversation: [],
|
||||||
conversationFetching: false,
|
conversationFetching: false,
|
||||||
replies: []
|
replies: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
|
||||||
isRenote(): boolean {
|
|
||||||
return (this.note.renote &&
|
|
||||||
this.note.text == null &&
|
|
||||||
this.note.fileIds.length == 0 &&
|
|
||||||
this.note.poll == null);
|
|
||||||
},
|
|
||||||
|
|
||||||
appearNote(): any {
|
|
||||||
return this.isRenote ? this.note.renote : this.note;
|
|
||||||
},
|
|
||||||
|
|
||||||
reactionsCount(): number {
|
|
||||||
return this.appearNote.reactionCounts
|
|
||||||
? sum(Object.values(this.appearNote.reactionCounts))
|
|
||||||
: 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
title(): string {
|
|
||||||
return new Date(this.appearNote.createdAt).toLocaleString();
|
|
||||||
},
|
|
||||||
|
|
||||||
urls(): string[] {
|
|
||||||
if (this.appearNote.text) {
|
|
||||||
const ast = parse(this.appearNote.text);
|
|
||||||
return unique(ast
|
|
||||||
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
|
|
||||||
.map(t => t.url));
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
// Get replies
|
// Get replies
|
||||||
if (!this.compact) {
|
if (!this.compact) {
|
||||||
@@ -169,24 +129,6 @@ export default Vue.extend({
|
|||||||
this.replies = replies;
|
this.replies = replies;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw map
|
|
||||||
if (this.appearNote.geo) {
|
|
||||||
const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
|
|
||||||
if (shouldShowMap) {
|
|
||||||
this.$root.os.getGoogleMaps().then(maps => {
|
|
||||||
const uluru = new maps.LatLng(this.appearNote.geo.coordinates[1], this.appearNote.geo.coordinates[0]);
|
|
||||||
const map = new maps.Map(this.$refs.map, {
|
|
||||||
center: uluru,
|
|
||||||
zoom: 15
|
|
||||||
});
|
|
||||||
new maps.Marker({
|
|
||||||
position: uluru,
|
|
||||||
map: map
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -200,32 +142,6 @@ export default Vue.extend({
|
|||||||
this.conversationFetching = false;
|
this.conversationFetching = false;
|
||||||
this.conversation = conversation.reverse();
|
this.conversation = conversation.reverse();
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
reply() {
|
|
||||||
this.$root.new(MkPostFormWindow, {
|
|
||||||
reply: this.appearNote
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
renote() {
|
|
||||||
this.$root.new(MkRenoteFormWindow, {
|
|
||||||
note: this.appearNote
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
react() {
|
|
||||||
this.$root.new(MkReactionPicker, {
|
|
||||||
source: this.$refs.reactButton,
|
|
||||||
note: this.appearNote
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
menu() {
|
|
||||||
this.$root.new(MkNoteMenu, {
|
|
||||||
source: this.$refs.menuButton,
|
|
||||||
note: this.appearNote
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -91,6 +91,11 @@
|
|||||||
</ui-select>
|
</ui-select>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<header>{{ $t('web-search-engine') }}</header>
|
||||||
|
<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<span slot="desc">{{ $t('web-search-engine-desc') }}</span></ui-input>
|
||||||
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card class="web" v-show="page == 'web'">
|
<ui-card class="web" v-show="page == 'web'">
|
||||||
@@ -177,6 +182,7 @@
|
|||||||
</optgroup>
|
</optgroup>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
<div class="none ui info">
|
<div class="none ui info">
|
||||||
|
<div>Current: <i>{{ this.currentLanguage }}</i></div>
|
||||||
<p><fa icon="info-circle"/>{{ $t('language-desc') }}</p>
|
<p><fa icon="info-circle"/>{{ $t('language-desc') }}</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -345,6 +351,7 @@ export default Vue.extend({
|
|||||||
meta: null,
|
meta: null,
|
||||||
version,
|
version,
|
||||||
langs,
|
langs,
|
||||||
|
currentLanguage: 'Unknown',
|
||||||
latestVersion: undefined,
|
latestVersion: undefined,
|
||||||
checkingForUpdate: false
|
checkingForUpdate: false
|
||||||
};
|
};
|
||||||
@@ -455,6 +462,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
webSearchEngine: {
|
||||||
|
get() { return this.$store.state.settings.webSearchEngine; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'webSearchEngine', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
showReplyTarget: {
|
showReplyTarget: {
|
||||||
get() { return this.$store.state.settings.showReplyTarget; },
|
get() { return this.$store.state.settings.showReplyTarget; },
|
||||||
set(value) { this.$store.dispatch('settings/set', { key: 'showReplyTarget', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'showReplyTarget', value }); }
|
||||||
@@ -544,6 +556,12 @@ export default Vue.extend({
|
|||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta().then(meta => {
|
||||||
this.meta = meta;
|
this.meta = meta;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const locale = JSON.parse(localStorage.getItem('locale') || "{}");
|
||||||
|
const localeKey = localStorage.getItem('localeKey');
|
||||||
|
this.currentLanguage = `${locale.meta.lang} (${localeKey})`;
|
||||||
|
} catch { }
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
readAllUnreadNotes() {
|
readAllUnreadNotes() {
|
||||||
|
@@ -54,7 +54,25 @@ export default Vue.extend({
|
|||||||
padding 16px
|
padding 16px
|
||||||
|
|
||||||
> button
|
> button
|
||||||
|
display block
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
||||||
|
color var(--primaryForeground)
|
||||||
|
background var(--primary)
|
||||||
|
width 100%
|
||||||
|
border-radius 38px
|
||||||
|
user-select none
|
||||||
|
cursor pointer
|
||||||
|
padding 0 16px
|
||||||
|
min-width 100px
|
||||||
|
line-height 38px
|
||||||
|
font-size 14px
|
||||||
|
font-weight 700
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
background var(--primaryLighten10)
|
||||||
|
|
||||||
|
&:active
|
||||||
|
background var(--primaryDarken10)
|
||||||
|
|
||||||
> a
|
> a
|
||||||
display block
|
display block
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
<span>{{ name }}</span>
|
<span>{{ name }}</span>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<div class="editor" style="padding:0 12px" v-if="edit">
|
<div class="editor" style="padding:12px" v-if="edit">
|
||||||
<ui-switch v-model="column.isMediaOnly" @change="onChangeSettings">{{ $t('is-media-only') }}</ui-switch>
|
<ui-switch v-model="column.isMediaOnly" @change="onChangeSettings">{{ $t('is-media-only') }}</ui-switch>
|
||||||
<ui-switch v-model="column.isMediaView" @change="onChangeSettings">{{ $t('is-media-view') }}</ui-switch>
|
<ui-switch v-model="column.isMediaView" @change="onChangeSettings">{{ $t('is-media-view') }}</ui-switch>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -151,18 +151,20 @@ export default Vue.extend({
|
|||||||
&:hover
|
&:hover
|
||||||
color var(--desktopTimelineSrcHover)
|
color var(--desktopTimelineSrcHover)
|
||||||
|
|
||||||
> .empty
|
> .mk-notes
|
||||||
display block
|
|
||||||
margin 0 auto
|
|
||||||
padding 32px
|
|
||||||
max-width 400px
|
|
||||||
text-align center
|
|
||||||
color #999
|
|
||||||
|
|
||||||
> [data-icon]
|
> .empty
|
||||||
display block
|
display block
|
||||||
margin-bottom 16px
|
margin 0 auto
|
||||||
font-size 3em
|
padding 32px
|
||||||
color #ccc
|
max-width 400px
|
||||||
|
text-align center
|
||||||
|
color var(--text)
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
display block
|
||||||
|
margin-bottom 16px
|
||||||
|
font-size 3em
|
||||||
|
color var(--faceHeaderText);
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@@ -371,7 +371,6 @@ export default Vue.extend({
|
|||||||
> .main
|
> .main
|
||||||
grid-row 1
|
grid-row 1
|
||||||
grid-column 1 / 3
|
grid-column 1 / 3
|
||||||
border-top solid 5px var(--primary)
|
|
||||||
|
|
||||||
> div
|
> div
|
||||||
padding 32px
|
padding 32px
|
||||||
|
@@ -190,8 +190,8 @@ export default class MiOS extends EventEmitter {
|
|||||||
this.store.dispatch('mergeMe', freshData);
|
this.store.dispatch('mergeMe', freshData);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Get token from cookie
|
// Get token from cookie or localStorage
|
||||||
const i = (document.cookie.match(/i=(!\w+)/) || [null, null])[1];
|
const i = (document.cookie.match(/i=(!\w+)/) || [null, null])[1] || localStorage.getItem('i');
|
||||||
|
|
||||||
fetchme(i, me => {
|
fetchme(i, me => {
|
||||||
if (me) {
|
if (me) {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-note-detail">
|
<div class="mk-note-detail" tabindex="-1">
|
||||||
<button
|
<button
|
||||||
class="more"
|
class="more"
|
||||||
v-if="appearNote.reply && appearNote.reply.replyId && conversation.length == 0"
|
v-if="appearNote.reply && appearNote.reply.replyId && conversation.length == 0"
|
||||||
@@ -61,18 +61,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="appearNote"/>
|
<mk-reactions-viewer :note="appearNote"/>
|
||||||
<button @click="reply" :title="$t('title')">
|
<button @click="reply()" :title="$t('title')">
|
||||||
<template v-if="appearNote.reply"><fa icon="reply-all"/></template>
|
<template v-if="appearNote.reply"><fa icon="reply-all"/></template>
|
||||||
<template v-else><fa icon="reply"/></template>
|
<template v-else><fa icon="reply"/></template>
|
||||||
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
|
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="renote" title="Renote">
|
<button @click="renote()" title="Renote">
|
||||||
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
|
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button :class="{ reacted: appearNote.myReaction != null }" @click="react" ref="reactButton" :title="$t('title')">
|
<button :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" :title="$t('title')">
|
||||||
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
|
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu()" ref="menuButton">
|
||||||
<fa icon="ellipsis-h"/>
|
<fa icon="ellipsis-h"/>
|
||||||
</button>
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
@@ -86,21 +86,18 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import parse from '../../../../../mfm/parse';
|
|
||||||
|
|
||||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
|
||||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
|
||||||
import XSub from './note.sub.vue';
|
import XSub from './note.sub.vue';
|
||||||
import { sum, unique } from '../../../../../prelude/array';
|
|
||||||
import noteSubscriber from '../../../common/scripts/note-subscriber';
|
import noteSubscriber from '../../../common/scripts/note-subscriber';
|
||||||
|
import noteMixin from '../../../common/scripts/note-mixin';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('mobile/views/components/note-detail.vue'),
|
i18n: i18n('mobile/views/components/note-detail.vue'),
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
XSub
|
XSub
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [noteSubscriber('note')],
|
mixins: [noteMixin(), noteSubscriber('note')],
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
note: {
|
note: {
|
||||||
@@ -114,43 +111,12 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
showContent: false,
|
|
||||||
conversation: [],
|
conversation: [],
|
||||||
conversationFetching: false,
|
conversationFetching: false,
|
||||||
replies: []
|
replies: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
|
||||||
isRenote(): boolean {
|
|
||||||
return (this.note.renote &&
|
|
||||||
this.note.text == null &&
|
|
||||||
this.note.fileIds.length == 0 &&
|
|
||||||
this.note.poll == null);
|
|
||||||
},
|
|
||||||
|
|
||||||
appearNote(): any {
|
|
||||||
return this.isRenote ? this.note.renote : this.note;
|
|
||||||
},
|
|
||||||
|
|
||||||
reactionsCount(): number {
|
|
||||||
return this.appearNote.reactionCounts
|
|
||||||
? sum(Object.values(this.appearNote.reactionCounts))
|
|
||||||
: 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
urls(): string[] {
|
|
||||||
if (this.appearNote.text) {
|
|
||||||
const ast = parse(this.appearNote.text);
|
|
||||||
return unique(ast
|
|
||||||
.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
|
|
||||||
.map(t => t.url));
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
// Get replies
|
// Get replies
|
||||||
if (!this.compact) {
|
if (!this.compact) {
|
||||||
@@ -161,24 +127,6 @@ export default Vue.extend({
|
|||||||
this.replies = replies;
|
this.replies = replies;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw map
|
|
||||||
if (this.appearNote.geo) {
|
|
||||||
const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true;
|
|
||||||
if (shouldShowMap) {
|
|
||||||
this.$root.os.getGoogleMaps().then(maps => {
|
|
||||||
const uluru = new maps.LatLng(this.appearNote.geo.coordinates[1], this.appearNote.geo.coordinates[0]);
|
|
||||||
const map = new maps.Map(this.$refs.map, {
|
|
||||||
center: uluru,
|
|
||||||
zoom: 15
|
|
||||||
});
|
|
||||||
new maps.Marker({
|
|
||||||
position: uluru,
|
|
||||||
map: map
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -192,35 +140,6 @@ export default Vue.extend({
|
|||||||
this.conversationFetching = false;
|
this.conversationFetching = false;
|
||||||
this.conversation = conversation.reverse();
|
this.conversation = conversation.reverse();
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
reply() {
|
|
||||||
this.$post({
|
|
||||||
reply: this.appearNote
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
renote() {
|
|
||||||
this.$post({
|
|
||||||
renote: this.appearNote
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
react() {
|
|
||||||
this.$root.new(MkReactionPicker, {
|
|
||||||
source: this.$refs.reactButton,
|
|
||||||
note: this.appearNote,
|
|
||||||
compact: true,
|
|
||||||
big: true
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
menu() {
|
|
||||||
this.$root.new(MkNoteMenu, {
|
|
||||||
source: this.$refs.menuButton,
|
|
||||||
note: this.appearNote,
|
|
||||||
compact: true
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -15,23 +15,23 @@
|
|||||||
</router-link>
|
</router-link>
|
||||||
<div class="links">
|
<div class="links">
|
||||||
<ul>
|
<ul>
|
||||||
<li><router-link to="/" :data-active="$route.name == 'index'"><i><fa icon="home"/></i>{{ $t('timeline') }}<i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/" :data-active="$route.name == 'index'"><i><fa icon="home" fixed-width/></i>{{ $t('timeline') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']"/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']" fixed-width/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']"/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']" fixed-width/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']"/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']" fixed-width/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad"/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad" fixed-width/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'"><i><fa :icon="['far', 'calendar-alt']"/></i>{{ $t('widgets') }}<i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'"><i><fa :icon="['far', 'calendar-alt']" fixed-width/></i>{{ $t('widgets') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'"><i><fa icon="star"/></i>{{ $t('favorites') }}<i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'"><i><fa icon="star" fixed-width/></i>{{ $t('favorites') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'"><i><fa icon="list"/></i>{{ $t('user-lists') }}<i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'"><i><fa icon="list" fixed-width/></i>{{ $t('user-lists') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'"><i><fa icon="cloud"/></i>{{ $t('@.drive') }}<i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'"><i><fa icon="cloud" fixed-width/></i>{{ $t('@.drive') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a @click="search"><i><fa icon="search"/></i>{{ $t('search') }}<i><fa icon="angle-right"/></i></a></li>
|
<li><a @click="search"><i><fa icon="search" fixed-width/></i>{{ $t('search') }}<i><fa icon="angle-right"/></i></a></li>
|
||||||
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'"><i><fa icon="cog"/></i>{{ $t('settings') }}<i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'"><i><fa icon="cog" fixed-width/></i>{{ $t('settings') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li v-if="$store.getters.isSignedIn && ($store.state.i.isAdmin || $store.state.i.isModerator)"><a href="/admin"><i><fa icon="terminal"/></i><span>{{ $t('admin') }}</span><i><fa icon="angle-right"/></i></a></li>
|
<li v-if="$store.getters.isSignedIn && ($store.state.i.isAdmin || $store.state.i.isModerator)"><a href="/admin"><i><fa icon="terminal" fixed-width/></i><span>{{ $t('admin') }}</span><i><fa icon="angle-right"/></i></a></li>
|
||||||
<li @click="dark"><p><template v-if="$store.state.device.darkmode"><i><fa icon="moon"/></i></template><template v-else><i><fa :icon="['far', 'moon']"/></i></template><span>{{ $t('darkmode') }}</span></p></li>
|
<li @click="dark"><p><template v-if="$store.state.device.darkmode"><i><fa icon="moon" fixed-width/></i></template><template v-else><i><fa :icon="['far', 'moon']"/></i></template><span>{{ $t('darkmode') }}</span></p></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="announcements" v-if="announcements && announcements.length > 0">
|
<div class="announcements" v-if="announcements && announcements.length > 0">
|
||||||
|
@@ -86,6 +86,11 @@
|
|||||||
</ui-select>
|
</ui-select>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<header>{{ $t('web-search-engine') }}</header>
|
||||||
|
<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<span slot="desc">{{ $t('web-search-engine-desc') }}</span></ui-input>
|
||||||
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<x-drive-settings/>
|
<x-drive-settings/>
|
||||||
@@ -113,7 +118,8 @@
|
|||||||
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
|
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
<span><fa icon="info-circle"/> {{ $t('lang-tip') }}</span>
|
<div>Current: <i>{{ this.currentLanguage }}</i></div>
|
||||||
|
<p><fa icon="info-circle"/> {{ $t('lang-tip') }}</p>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
@@ -220,6 +226,7 @@ export default Vue.extend({
|
|||||||
version,
|
version,
|
||||||
codename,
|
codename,
|
||||||
langs,
|
langs,
|
||||||
|
currentLanguage: 'Unknown',
|
||||||
latestVersion: undefined,
|
latestVersion: undefined,
|
||||||
checkingForUpdate: false
|
checkingForUpdate: false
|
||||||
};
|
};
|
||||||
@@ -365,6 +372,19 @@ export default Vue.extend({
|
|||||||
get() { return this.$store.state.settings.defaultNoteVisibility; },
|
get() { return this.$store.state.settings.defaultNoteVisibility; },
|
||||||
set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
webSearchEngine: {
|
||||||
|
get() { return this.$store.state.settings.webSearchEngine; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'webSearchEngine', value }); }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
try {
|
||||||
|
const locale = JSON.parse(localStorage.getItem('locale') || "{}");
|
||||||
|
const localeKey = localStorage.getItem('localeKey');
|
||||||
|
this.currentLanguage = `${locale.meta.lang} (${localeKey})`;
|
||||||
|
} catch { }
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@@ -334,6 +334,7 @@ main
|
|||||||
max-width 680px
|
max-width 680px
|
||||||
margin 0 auto
|
margin 0 auto
|
||||||
padding 8px
|
padding 8px
|
||||||
|
color var(--text)
|
||||||
|
|
||||||
@media (min-width 500px)
|
@media (min-width 500px)
|
||||||
padding 16px
|
padding 16px
|
||||||
|
@@ -31,7 +31,6 @@
|
|||||||
<x-followers-you-know :user="user"/>
|
<x-followers-you-know :user="user"/>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<p v-if="user.host === null">{{ $t('last-used-at') }}: <b><mk-time :time="user.lastUsedAt"/></b></p>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -90,7 +89,7 @@ export default Vue.extend({
|
|||||||
@media (min-width 500px)
|
@media (min-width 500px)
|
||||||
padding 10px 16px
|
padding 10px 16px
|
||||||
|
|
||||||
> i
|
> [data-icon]
|
||||||
margin-right 6px
|
margin-right 6px
|
||||||
|
|
||||||
> .activity
|
> .activity
|
||||||
|
@@ -306,6 +306,7 @@ export default Vue.extend({
|
|||||||
padding 16px 0
|
padding 16px 0
|
||||||
border solid 2px rgba(0, 0, 0, 0.1)
|
border solid 2px rgba(0, 0, 0, 0.1)
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
color var(--text)
|
||||||
|
|
||||||
> *
|
> *
|
||||||
margin 0 16px
|
margin 0 16px
|
||||||
|
@@ -11,11 +11,3 @@ if (!('fetch' in window)) {
|
|||||||
'Your browser (or your OS) seems outdated. ' +
|
'Your browser (or your OS) seems outdated. ' +
|
||||||
'To run Misskey, please update your browser to latest version or try other browsers.');
|
'To run Misskey, please update your browser to latest version or try other browsers.');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check whether cookie enabled
|
|
||||||
if (!navigator.cookieEnabled) {
|
|
||||||
alert(
|
|
||||||
'Misskeyを利用するにはCookieを有効にしてください。' +
|
|
||||||
'\n\n' +
|
|
||||||
'To use Misskey, please enable Cookie.');
|
|
||||||
}
|
|
||||||
|
@@ -35,6 +35,7 @@ const defaultSettings = {
|
|||||||
iLikeSushi: false,
|
iLikeSushi: false,
|
||||||
rememberNoteVisibility: false,
|
rememberNoteVisibility: false,
|
||||||
defaultNoteVisibility: 'public',
|
defaultNoteVisibility: 'public',
|
||||||
|
webSearchEngine: 'https://www.google.com/?#q={{query}}',
|
||||||
mutedWords: [],
|
mutedWords: [],
|
||||||
games: {
|
games: {
|
||||||
reversi: {
|
reversi: {
|
||||||
@@ -129,6 +130,7 @@ export default (os: MiOS) => new Vuex.Store({
|
|||||||
logout(ctx) {
|
logout(ctx) {
|
||||||
ctx.commit('updateI', null);
|
ctx.commit('updateI', null);
|
||||||
document.cookie = `i=; domain=${hostname}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
|
document.cookie = `i=; domain=${hostname}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
|
||||||
|
localStorage.removeItem('i');
|
||||||
},
|
},
|
||||||
|
|
||||||
mergeMe(ctx, me) {
|
mergeMe(ctx, me) {
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#313a42",
|
"background_color": "#313a42",
|
||||||
|
"theme_color": "#fb4e4e",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/assets/icons/16.png",
|
"src": "/assets/icons/16.png",
|
||||||
@@ -34,6 +35,11 @@
|
|||||||
"src": "/assets/icons/256.png",
|
"src": "/assets/icons/256.png",
|
||||||
"sizes": "256x256",
|
"sizes": "256x256",
|
||||||
"type": "image/png"
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/assets/icons/512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"share_target": {
|
"share_target": {
|
||||||
|
@@ -37,15 +37,8 @@ export type Source = {
|
|||||||
|
|
||||||
proxy?: string;
|
proxy?: string;
|
||||||
|
|
||||||
summalyProxy?: string;
|
|
||||||
|
|
||||||
accesslog?: string;
|
accesslog?: string;
|
||||||
|
|
||||||
github_bot?: {
|
|
||||||
hook_secret: string;
|
|
||||||
username: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Service Worker
|
* Service Worker
|
||||||
*/
|
*/
|
||||||
|
24
src/index.ts
24
src/index.ts
@@ -23,7 +23,6 @@ import notesStats from './daemons/notes-stats';
|
|||||||
import loadConfig from './config/load';
|
import loadConfig from './config/load';
|
||||||
import { Config } from './config/types';
|
import { Config } from './config/types';
|
||||||
import { lessThan } from './prelude/array';
|
import { lessThan } from './prelude/array';
|
||||||
import { Db } from 'mongodb';
|
|
||||||
|
|
||||||
const clusterLog = debug('misskey:cluster');
|
const clusterLog = debug('misskey:cluster');
|
||||||
const ev = new Xev();
|
const ev = new Xev();
|
||||||
@@ -192,38 +191,35 @@ async function init(): Promise<Config> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try to connect to MongoDB
|
// Try to connect to MongoDB
|
||||||
//await checkMongoDB(config);
|
await checkMongoDB(config);
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
const requiredMongoDBVersion = [3, 6];
|
const requiredMongoDBVersion = [3, 6];
|
||||||
|
|
||||||
function checkMongoDB(config: Config): Promise<void> {
|
function checkMongoDB(config: Config) {
|
||||||
const mongoDBLogger = new Logger('MongoDB');
|
const mongoDBLogger = new Logger('MongoDB');
|
||||||
const u = config.mongodb.user ? encodeURIComponent(config.mongodb.user) : null;
|
const u = config.mongodb.user ? encodeURIComponent(config.mongodb.user) : null;
|
||||||
const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null;
|
const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null;
|
||||||
const uri = `mongodb://${u && p ? `${u}:****@` : ''}${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
|
const uri = `mongodb://${u && p ? `${u}:****@` : ''}${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
|
||||||
mongoDBLogger.info(`Connecting to ${uri}`);
|
mongoDBLogger.info(`Connecting to ${uri}`);
|
||||||
|
|
||||||
return mongo.then(async () => {
|
mongo.then(() => {
|
||||||
mongoDBLogger.succ('Connectivity confirmed');
|
mongoDBLogger.succ('Connectivity confirmed');
|
||||||
|
|
||||||
const runningMongoDBVersion = (await nativeDbConn().then(getMongoDBVersion)).split('.').map(x => parseInt(x, 10));
|
nativeDbConn().then(db => db.admin().serverInfo()).then(x => x.version).then((version: string) => {
|
||||||
mongoDBLogger.info(`Version: ${runningMongoDBVersion.join('.')}`);
|
mongoDBLogger.info(`Version: ${version}`);
|
||||||
if (lessThan(runningMongoDBVersion, requiredMongoDBVersion)) {
|
if (lessThan(version.split('.').map(x => parseInt(x, 10)), requiredMongoDBVersion)) {
|
||||||
mongoDBLogger.error(`MongoDB version is less than ${requiredMongoDBVersion.join('.')}. Please upgrade it.`);
|
mongoDBLogger.error(`MongoDB version is less than ${requiredMongoDBVersion.join('.')}. Please upgrade it.`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
mongoDBLogger.error(err.message);
|
mongoDBLogger.error(err.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getMongoDBVersion(db: Db): Promise<string> {
|
|
||||||
return (await db.admin().serverInfo()).version;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function spawnWorkers(limit: number = Infinity) {
|
async function spawnWorkers(limit: number = Infinity) {
|
||||||
const workers = Math.min(limit, os.cpus().length);
|
const workers = Math.min(limit, os.cpus().length);
|
||||||
Logger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
|
Logger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
|
||||||
|
@@ -45,6 +45,12 @@ export default (tokens: Node[], mentionedRemoteUsers: INote['mentionedRemoteUser
|
|||||||
return pre;
|
return pre;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
center(token) {
|
||||||
|
const el = doc.createElement('div');
|
||||||
|
dive(token.children).forEach(child => el.appendChild(child));
|
||||||
|
return el;
|
||||||
|
},
|
||||||
|
|
||||||
emoji(token) {
|
emoji(token) {
|
||||||
return doc.createTextNode(token.props.emoji ? token.props.emoji : `:${token.props.name}:`);
|
return doc.createTextNode(token.props.emoji ? token.props.emoji : `:${token.props.name}:`);
|
||||||
},
|
},
|
||||||
|
@@ -41,11 +41,12 @@ export default (source: string): Node[] => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function isBlockNode(node: Node): boolean {
|
function isBlockNode(node: Node): boolean {
|
||||||
return ['blockCode', 'quote', 'title'].includes(node.name);
|
return ['blockCode', 'center', 'quote', 'title'].includes(node.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ブロック要素の前後にある改行を削除します(ブロック要素自体が改行の役割も果たすため、余計に改行されてしまうため)
|
* ブロック要素の前後にある改行を削除します
|
||||||
|
* (ブロック要素自体が改行の役割を果たすため、余計に改行されてしまう)
|
||||||
* @param nodes
|
* @param nodes
|
||||||
*/
|
*/
|
||||||
const removeNeedlessLineBreaks = (nodes: Node[]) => {
|
const removeNeedlessLineBreaks = (nodes: Node[]) => {
|
||||||
|
@@ -29,6 +29,32 @@ function makeNodeWithChildren(name: string, children: Node[], props?: any): Node
|
|||||||
return _makeNode(name, children, props);
|
return _makeNode(name, children, props);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getTrailingPosition(x: string): number {
|
||||||
|
const brackets = [
|
||||||
|
['(', ')'],
|
||||||
|
['「', '」'],
|
||||||
|
];
|
||||||
|
const pendingBrackets = [] as any;
|
||||||
|
const end = x.split('').findIndex(char => {
|
||||||
|
const closeMatch = brackets.map(x => x[1]).indexOf(char);
|
||||||
|
const openMatch = brackets.map(x => x[0]).indexOf(char);
|
||||||
|
if (closeMatch != -1) {
|
||||||
|
if (pendingBrackets[closeMatch] > 0) {
|
||||||
|
pendingBrackets[closeMatch]--;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (openMatch != -1) {
|
||||||
|
pendingBrackets[openMatch] = (pendingBrackets[openMatch] || 0) + 1;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return end > 0 ? end : x.length;
|
||||||
|
}
|
||||||
|
|
||||||
const newline = P((input, i) => {
|
const newline = P((input, i) => {
|
||||||
if (i == 0 || input[i] == '\n' || input[i - 1] == '\n') {
|
if (i == 0 || input[i] == '\n' || input[i - 1] == '\n') {
|
||||||
return P.makeSuccess(i, null);
|
return P.makeSuccess(i, null);
|
||||||
@@ -53,6 +79,7 @@ const mfm = P.createLanguage({
|
|||||||
r.math,
|
r.math,
|
||||||
r.search,
|
r.search,
|
||||||
r.title,
|
r.title,
|
||||||
|
r.center,
|
||||||
r.text
|
r.text
|
||||||
).atLeast(1),
|
).atLeast(1),
|
||||||
|
|
||||||
@@ -65,6 +92,7 @@ const mfm = P.createLanguage({
|
|||||||
r.mention,
|
r.mention,
|
||||||
r.hashtag,
|
r.hashtag,
|
||||||
r.emoji,
|
r.emoji,
|
||||||
|
r.math,
|
||||||
r.text
|
r.text
|
||||||
).atLeast(1).tryParse(x))),
|
).atLeast(1).tryParse(x))),
|
||||||
//#endregion
|
//#endregion
|
||||||
@@ -87,11 +115,30 @@ const mfm = P.createLanguage({
|
|||||||
.map(x => makeNodeWithChildren('bold', P.alt(
|
.map(x => makeNodeWithChildren('bold', P.alt(
|
||||||
r.mention,
|
r.mention,
|
||||||
r.hashtag,
|
r.hashtag,
|
||||||
|
r.url,
|
||||||
|
r.link,
|
||||||
r.emoji,
|
r.emoji,
|
||||||
r.text
|
r.text
|
||||||
).atLeast(1).tryParse(x))),
|
).atLeast(1).tryParse(x))),
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
//#region Center
|
||||||
|
center: r =>
|
||||||
|
P.regexp(/<center>([\s\S]+?)<\/center>/, 1)
|
||||||
|
.map(x => makeNodeWithChildren('center', P.alt(
|
||||||
|
r.big,
|
||||||
|
r.bold,
|
||||||
|
r.motion,
|
||||||
|
r.mention,
|
||||||
|
r.hashtag,
|
||||||
|
r.emoji,
|
||||||
|
r.math,
|
||||||
|
r.url,
|
||||||
|
r.link,
|
||||||
|
r.text
|
||||||
|
).atLeast(1).tryParse(x))),
|
||||||
|
//#endregion
|
||||||
|
|
||||||
//#region Emoji
|
//#region Emoji
|
||||||
emoji: r =>
|
emoji: r =>
|
||||||
P.alt(
|
P.alt(
|
||||||
@@ -112,14 +159,17 @@ const mfm = P.createLanguage({
|
|||||||
const text = input.substr(i);
|
const text = input.substr(i);
|
||||||
const match = text.match(/^#([^\s\.,!\?#]+)/i);
|
const match = text.match(/^#([^\s\.,!\?#]+)/i);
|
||||||
if (!match) return P.makeFailure(i, 'not a hashtag');
|
if (!match) return P.makeFailure(i, 'not a hashtag');
|
||||||
if (input[i - 1] != '\n' && input[i - 1] != ' ' && input[i - 1] != null) return P.makeFailure(i, 'require space before "#"');
|
let hashtag = match[1];
|
||||||
return P.makeSuccess(i + match[0].length, makeNode('hashtag', { hashtag: match[1] }));
|
hashtag = hashtag.substr(0, getTrailingPosition(hashtag));
|
||||||
|
if (hashtag.match(/^[0-9]+$/)) return P.makeFailure(i, 'not a hashtag');
|
||||||
|
if (!['\n', ' ', ' ', '(', '「', null, undefined].includes(input[i - 1])) return P.makeFailure(i, 'require space before "#"');
|
||||||
|
return P.makeSuccess(i + ('#' + hashtag).length, makeNode('hashtag', { hashtag: hashtag }));
|
||||||
}),
|
}),
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
//#region Inline code
|
//#region Inline code
|
||||||
inlineCode: r =>
|
inlineCode: r =>
|
||||||
P.regexp(/`(.+?)`/, 1)
|
P.regexp(/`([^´\n]+?)`/, 1)
|
||||||
.map(x => makeNode('inlineCode', { code: x })),
|
.map(x => makeNode('inlineCode', { code: x })),
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
@@ -180,6 +230,9 @@ const mfm = P.createLanguage({
|
|||||||
r.mention,
|
r.mention,
|
||||||
r.hashtag,
|
r.hashtag,
|
||||||
r.emoji,
|
r.emoji,
|
||||||
|
r.url,
|
||||||
|
r.link,
|
||||||
|
r.math,
|
||||||
r.text
|
r.text
|
||||||
).atLeast(1).tryParse(x))),
|
).atLeast(1).tryParse(x))),
|
||||||
//#endregion
|
//#endregion
|
||||||
@@ -245,11 +298,9 @@ const mfm = P.createLanguage({
|
|||||||
const match = text.match(/^https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.,=\+\-]+/);
|
const match = text.match(/^https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.,=\+\-]+/);
|
||||||
if (!match) return P.makeFailure(i, 'not a url');
|
if (!match) return P.makeFailure(i, 'not a url');
|
||||||
let url = match[0];
|
let url = match[0];
|
||||||
const before = input[i - 1];
|
url = url.substr(0, getTrailingPosition(url));
|
||||||
if (url.endsWith('.')) url = url.substr(0, url.lastIndexOf('.'));
|
if (url.endsWith('.')) url = url.substr(0, url.lastIndexOf('.'));
|
||||||
if (url.endsWith(',')) url = url.substr(0, url.lastIndexOf(','));
|
if (url.endsWith(',')) url = url.substr(0, url.lastIndexOf(','));
|
||||||
if (url.endsWith(')') && before == '(') url = url.substr(0, url.lastIndexOf(')'));
|
|
||||||
if (url.endsWith(']') && before == '[') url = url.substr(0, url.lastIndexOf(']'));
|
|
||||||
return P.makeSuccess(i + url.length, url);
|
return P.makeSuccess(i + url.length, url);
|
||||||
})
|
})
|
||||||
.map(x => makeNode('url', { url: x })),
|
.map(x => makeNode('url', { url: x })),
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
export default (acct: string) => {
|
export default (acct: string) => {
|
||||||
|
if (acct.startsWith('@')) acct = acct.substr(1);
|
||||||
const splitted = acct.split('@', 2);
|
const splitted = acct.split('@', 2);
|
||||||
return { username: splitted[0], host: splitted[1] || null };
|
return { username: splitted[0], host: splitted[1] || null };
|
||||||
};
|
};
|
||||||
|
@@ -15,7 +15,10 @@ const defaultMeta: any = {
|
|||||||
maxNoteTextLength: 1000,
|
maxNoteTextLength: 1000,
|
||||||
enableTwitterIntegration: false,
|
enableTwitterIntegration: false,
|
||||||
enableGithubIntegration: false,
|
enableGithubIntegration: false,
|
||||||
enableDiscordIntegration: false
|
enableDiscordIntegration: false,
|
||||||
|
enableExternalUserRecommendation: false,
|
||||||
|
externalUserRecommendationEngine: "https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}",
|
||||||
|
externalUserRecommendationTimeout: 300000
|
||||||
};
|
};
|
||||||
|
|
||||||
export default async function(): Promise<IMeta> {
|
export default async function(): Promise<IMeta> {
|
||||||
|
@@ -6,15 +6,24 @@ export default function(file: IDriveFile, thumbnail = false): string {
|
|||||||
|
|
||||||
if (file.metadata.withoutChunks) {
|
if (file.metadata.withoutChunks) {
|
||||||
if (thumbnail) {
|
if (thumbnail) {
|
||||||
return file.metadata.thumbnailUrl || file.metadata.url;
|
return file.metadata.thumbnailUrl || file.metadata.webpublicUrl || file.metadata.url;
|
||||||
} else {
|
} else {
|
||||||
return file.metadata.url;
|
return file.metadata.webpublicUrl || file.metadata.url;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (thumbnail) {
|
if (thumbnail) {
|
||||||
return `${config.drive_url}/${file._id}?thumbnail`;
|
return `${config.drive_url}/${file._id}?thumbnail`;
|
||||||
} else {
|
} else {
|
||||||
return `${config.drive_url}/${file._id}`;
|
return `${config.drive_url}/${file._id}?web`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getOriginalUrl(file: IDriveFile) {
|
||||||
|
if (file.metadata && file.metadata.url) {
|
||||||
|
return file.metadata.url;
|
||||||
|
}
|
||||||
|
|
||||||
|
const accessKey = file.metadata ? file.metadata.accessKey : null;
|
||||||
|
return `${config.drive_url}/${file._id}${accessKey ? '?original=' + accessKey : ''}`;
|
||||||
|
}
|
||||||
|
29
src/models/drive-file-webpublic.ts
Normal file
29
src/models/drive-file-webpublic.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import * as mongo from 'mongodb';
|
||||||
|
import monkDb, { nativeDbConn } from '../db/mongodb';
|
||||||
|
|
||||||
|
const DriveFileWebpublic = monkDb.get<IDriveFileWebpublic>('driveFileWebpublics.files');
|
||||||
|
DriveFileWebpublic.createIndex('metadata.originalId', { sparse: true, unique: true });
|
||||||
|
export default DriveFileWebpublic;
|
||||||
|
|
||||||
|
export const DriveFileWebpublicChunk = monkDb.get('driveFileWebpublics.chunks');
|
||||||
|
|
||||||
|
export const getDriveFileWebpublicBucket = async (): Promise<mongo.GridFSBucket> => {
|
||||||
|
const db = await nativeDbConn();
|
||||||
|
const bucket = new mongo.GridFSBucket(db, {
|
||||||
|
bucketName: 'driveFileWebpublics'
|
||||||
|
});
|
||||||
|
return bucket;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type IMetadata = {
|
||||||
|
originalId: mongo.ObjectID;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type IDriveFileWebpublic = {
|
||||||
|
_id: mongo.ObjectID;
|
||||||
|
uploadDate: Date;
|
||||||
|
md5: string;
|
||||||
|
filename: string;
|
||||||
|
contentType: string;
|
||||||
|
metadata: IMetadata;
|
||||||
|
};
|
@@ -3,7 +3,7 @@ const deepcopy = require('deepcopy');
|
|||||||
import { pack as packFolder } from './drive-folder';
|
import { pack as packFolder } from './drive-folder';
|
||||||
import monkDb, { nativeDbConn } from '../db/mongodb';
|
import monkDb, { nativeDbConn } from '../db/mongodb';
|
||||||
import isObjectId from '../misc/is-objectid';
|
import isObjectId from '../misc/is-objectid';
|
||||||
import getDriveFileUrl from '../misc/get-drive-file-url';
|
import getDriveFileUrl, { getOriginalUrl } from '../misc/get-drive-file-url';
|
||||||
|
|
||||||
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
|
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
|
||||||
DriveFile.createIndex('md5');
|
DriveFile.createIndex('md5');
|
||||||
@@ -28,21 +28,48 @@ export type IMetadata = {
|
|||||||
_user: any;
|
_user: any;
|
||||||
folderId: mongo.ObjectID;
|
folderId: mongo.ObjectID;
|
||||||
comment: string;
|
comment: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* リモートインスタンスから取得した場合の元URL
|
||||||
|
*/
|
||||||
uri?: string;
|
uri?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL for web(生成されている場合) or original
|
||||||
|
* * オブジェクトストレージを利用している or リモートサーバーへの直リンクである 場合のみ
|
||||||
|
*/
|
||||||
url?: string;
|
url?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL for thumbnail (thumbnailがなければなし)
|
||||||
|
* * オブジェクトストレージを利用している or リモートサーバーへの直リンクである 場合のみ
|
||||||
|
*/
|
||||||
thumbnailUrl?: string;
|
thumbnailUrl?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL for original (web用が生成されてない場合はurlがoriginalを指す)
|
||||||
|
* * オブジェクトストレージを利用している or リモートサーバーへの直リンクである 場合のみ
|
||||||
|
*/
|
||||||
|
webpublicUrl?: string;
|
||||||
|
|
||||||
|
accessKey?: string;
|
||||||
|
|
||||||
src?: string;
|
src?: string;
|
||||||
deletedAt?: Date;
|
deletedAt?: Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* このファイルの中身データがMongoDB内に保存されているのか否か
|
* このファイルの中身データがMongoDB内に保存されていないか否か
|
||||||
* オブジェクトストレージを利用している or リモートサーバーへの直リンクである
|
* オブジェクトストレージを利用している or リモートサーバーへの直リンクである
|
||||||
* な場合は false になります
|
* な場合は true になります
|
||||||
*/
|
*/
|
||||||
withoutChunks?: boolean;
|
withoutChunks?: boolean;
|
||||||
|
|
||||||
storage?: string;
|
storage?: string;
|
||||||
storageProps?: any;
|
|
||||||
|
/***
|
||||||
|
* ObjectStorage の格納先の情報
|
||||||
|
*/
|
||||||
|
storageProps?: IStorageProps;
|
||||||
isSensitive?: boolean;
|
isSensitive?: boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,6 +83,25 @@ export type IMetadata = {
|
|||||||
isRemote?: boolean;
|
isRemote?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type IStorageProps = {
|
||||||
|
/**
|
||||||
|
* ObjectStorage key for original
|
||||||
|
*/
|
||||||
|
key: string;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* ObjectStorage key for thumbnail (thumbnailがなければなし)
|
||||||
|
*/
|
||||||
|
thumbnailKey?: string;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* ObjectStorage key for webpublic (webpublicがなければなし)
|
||||||
|
*/
|
||||||
|
webpublicKey?: string;
|
||||||
|
|
||||||
|
id?: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type IDriveFile = {
|
export type IDriveFile = {
|
||||||
_id: mongo.ObjectID;
|
_id: mongo.ObjectID;
|
||||||
uploadDate: Date;
|
uploadDate: Date;
|
||||||
@@ -83,7 +129,8 @@ export function validateFileName(name: string): boolean {
|
|||||||
export const packMany = (
|
export const packMany = (
|
||||||
files: any[],
|
files: any[],
|
||||||
options?: {
|
options?: {
|
||||||
detail: boolean
|
detail?: boolean
|
||||||
|
self?: boolean,
|
||||||
}
|
}
|
||||||
) => {
|
) => {
|
||||||
return Promise.all(files.map(f => pack(f, options)));
|
return Promise.all(files.map(f => pack(f, options)));
|
||||||
@@ -95,11 +142,13 @@ export const packMany = (
|
|||||||
export const pack = (
|
export const pack = (
|
||||||
file: any,
|
file: any,
|
||||||
options?: {
|
options?: {
|
||||||
detail: boolean
|
detail?: boolean,
|
||||||
|
self?: boolean,
|
||||||
}
|
}
|
||||||
) => new Promise<any>(async (resolve, reject) => {
|
) => new Promise<any>(async (resolve, reject) => {
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
detail: false
|
detail: false,
|
||||||
|
self: false
|
||||||
}, options);
|
}, options);
|
||||||
|
|
||||||
let _file: any;
|
let _file: any;
|
||||||
@@ -165,5 +214,9 @@ export const pack = (
|
|||||||
delete _target.isRemote;
|
delete _target.isRemote;
|
||||||
delete _target._user;
|
delete _target._user;
|
||||||
|
|
||||||
|
if (opts.self) {
|
||||||
|
_target.url = getOriginalUrl(_file);
|
||||||
|
}
|
||||||
|
|
||||||
resolve(_target);
|
resolve(_target);
|
||||||
});
|
});
|
||||||
|
@@ -125,6 +125,19 @@ if ((config as any).github) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if ((config as any).user_recommendation) {
|
||||||
|
Meta.findOne({}).then(m => {
|
||||||
|
if (m != null && m.enableExternalUserRecommendation == null) {
|
||||||
|
Meta.update({}, {
|
||||||
|
$set: {
|
||||||
|
enableExternalUserRecommendation: true,
|
||||||
|
externalUserRecommendationEngine: (config as any).user_recommendation.engine,
|
||||||
|
externalUserRecommendationTimeout: (config as any).user_recommendation.timeout
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export type IMeta = {
|
export type IMeta = {
|
||||||
name?: string;
|
name?: string;
|
||||||
@@ -184,6 +197,8 @@ export type IMeta = {
|
|||||||
*/
|
*/
|
||||||
maxNoteTextLength?: number;
|
maxNoteTextLength?: number;
|
||||||
|
|
||||||
|
summalyProxy?: string;
|
||||||
|
|
||||||
enableTwitterIntegration?: boolean;
|
enableTwitterIntegration?: boolean;
|
||||||
twitterConsumerKey?: string;
|
twitterConsumerKey?: string;
|
||||||
twitterConsumerSecret?: string;
|
twitterConsumerSecret?: string;
|
||||||
@@ -195,4 +210,16 @@ export type IMeta = {
|
|||||||
enableDiscordIntegration?: boolean;
|
enableDiscordIntegration?: boolean;
|
||||||
discordClientId?: string;
|
discordClientId?: string;
|
||||||
discordClientSecret?: string;
|
discordClientSecret?: string;
|
||||||
|
|
||||||
|
enableExternalUserRecommendation?: boolean;
|
||||||
|
externalUserRecommendationEngine?: string;
|
||||||
|
externalUserRecommendationTimeout?: number;
|
||||||
|
|
||||||
|
enableEmail?: boolean;
|
||||||
|
email?: string;
|
||||||
|
smtpSecure?: boolean;
|
||||||
|
smtpHost?: string;
|
||||||
|
smtpPort?: number;
|
||||||
|
smtpUser?: string;
|
||||||
|
smtpPass?: string;
|
||||||
};
|
};
|
||||||
|
@@ -18,6 +18,7 @@ Note.createIndex('uri', { sparse: true, unique: true });
|
|||||||
Note.createIndex('userId');
|
Note.createIndex('userId');
|
||||||
Note.createIndex('mentions');
|
Note.createIndex('mentions');
|
||||||
Note.createIndex('visibleUserIds');
|
Note.createIndex('visibleUserIds');
|
||||||
|
Note.createIndex('replyId');
|
||||||
Note.createIndex('tagsLower');
|
Note.createIndex('tagsLower');
|
||||||
Note.createIndex('_user.host');
|
Note.createIndex('_user.host');
|
||||||
Note.createIndex('_files._id');
|
Note.createIndex('_files._id');
|
||||||
@@ -99,7 +100,6 @@ export type INote = {
|
|||||||
host: string;
|
host: string;
|
||||||
inbox?: string;
|
inbox?: string;
|
||||||
};
|
};
|
||||||
_replyIds?: mongo.ObjectID[];
|
|
||||||
_files?: IDriveFile[];
|
_files?: IDriveFile[];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -258,6 +258,8 @@ export const pack = async (
|
|||||||
delete _note._reply;
|
delete _note._reply;
|
||||||
delete _note._renote;
|
delete _note._renote;
|
||||||
delete _note._files;
|
delete _note._files;
|
||||||
|
delete _note._replyIds;
|
||||||
|
|
||||||
if (_note.geo) delete _note.geo.type;
|
if (_note.geo) delete _note.geo.type;
|
||||||
|
|
||||||
// Populate user
|
// Populate user
|
||||||
|
@@ -26,6 +26,7 @@ export default User;
|
|||||||
type IUserBase = {
|
type IUserBase = {
|
||||||
_id: mongo.ObjectID;
|
_id: mongo.ObjectID;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
updatedAt?: Date;
|
||||||
deletedAt?: Date;
|
deletedAt?: Date;
|
||||||
followersCount: number;
|
followersCount: number;
|
||||||
followingCount: number;
|
followingCount: number;
|
||||||
@@ -37,6 +38,8 @@ type IUserBase = {
|
|||||||
bannerId: mongo.ObjectID;
|
bannerId: mongo.ObjectID;
|
||||||
avatarUrl?: string;
|
avatarUrl?: string;
|
||||||
bannerUrl?: string;
|
bannerUrl?: string;
|
||||||
|
avatarColor?: any;
|
||||||
|
bannerColor?: any;
|
||||||
wallpaperId: mongo.ObjectID;
|
wallpaperId: mongo.ObjectID;
|
||||||
wallpaperUrl?: string;
|
wallpaperUrl?: string;
|
||||||
data: any;
|
data: any;
|
||||||
@@ -75,6 +78,8 @@ export interface ILocalUser extends IUserBase {
|
|||||||
host: null;
|
host: null;
|
||||||
keypair: string;
|
keypair: string;
|
||||||
email: string;
|
email: string;
|
||||||
|
emailVerified?: boolean;
|
||||||
|
emailVerifyCode?: string;
|
||||||
password: string;
|
password: string;
|
||||||
token: string;
|
token: string;
|
||||||
twitter: {
|
twitter: {
|
||||||
@@ -96,15 +101,11 @@ export interface ILocalUser extends IUserBase {
|
|||||||
username: string;
|
username: string;
|
||||||
discriminator: string;
|
discriminator: string;
|
||||||
};
|
};
|
||||||
line: {
|
|
||||||
userId: string;
|
|
||||||
};
|
|
||||||
profile: {
|
profile: {
|
||||||
location: string;
|
location: string;
|
||||||
birthday: string; // 'YYYY-MM-DD'
|
birthday: string; // 'YYYY-MM-DD'
|
||||||
tags: string[];
|
tags: string[];
|
||||||
};
|
};
|
||||||
lastUsedAt: Date;
|
|
||||||
isCat: boolean;
|
isCat: boolean;
|
||||||
isAdmin?: boolean;
|
isAdmin?: boolean;
|
||||||
isModerator?: boolean;
|
isModerator?: boolean;
|
||||||
@@ -132,7 +133,7 @@ export interface IRemoteUser extends IUserBase {
|
|||||||
id: string;
|
id: string;
|
||||||
publicKeyPem: string;
|
publicKeyPem: string;
|
||||||
};
|
};
|
||||||
updatedAt: Date;
|
lastFetchedAt: Date;
|
||||||
isAdmin: false;
|
isAdmin: false;
|
||||||
isModerator: false;
|
isModerator: false;
|
||||||
}
|
}
|
||||||
@@ -284,6 +285,7 @@ export const pack = (
|
|||||||
delete _user._id;
|
delete _user._id;
|
||||||
|
|
||||||
delete _user.usernameLower;
|
delete _user.usernameLower;
|
||||||
|
delete _user.emailVerifyCode;
|
||||||
|
|
||||||
if (_user.host == null) {
|
if (_user.host == null) {
|
||||||
// Remove private properties
|
// Remove private properties
|
||||||
@@ -304,11 +306,11 @@ export const pack = (
|
|||||||
delete _user.discord.refreshToken;
|
delete _user.discord.refreshToken;
|
||||||
delete _user.discord.expiresDate;
|
delete _user.discord.expiresDate;
|
||||||
}
|
}
|
||||||
delete _user.line;
|
|
||||||
|
|
||||||
// Visible via only the official client
|
// Visible via only the official client
|
||||||
if (!opts.includeSecrets) {
|
if (!opts.includeSecrets) {
|
||||||
delete _user.email;
|
delete _user.email;
|
||||||
|
delete _user.emailVerified;
|
||||||
delete _user.settings;
|
delete _user.settings;
|
||||||
delete _user.clientSettings;
|
delete _user.clientSettings;
|
||||||
}
|
}
|
||||||
|
@@ -96,6 +96,13 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
|
|||||||
// リプライ
|
// リプライ
|
||||||
const reply = note.inReplyTo ? await resolveNote(note.inReplyTo, resolver) : null;
|
const reply = note.inReplyTo ? await resolveNote(note.inReplyTo, resolver) : null;
|
||||||
|
|
||||||
|
// 引用
|
||||||
|
let quote: INote;
|
||||||
|
|
||||||
|
if (note._misskey_quote && typeof note._misskey_quote == 'string') {
|
||||||
|
quote = await resolveNote(note._misskey_quote).catch(() => null);
|
||||||
|
}
|
||||||
|
|
||||||
// テキストのパース
|
// テキストのパース
|
||||||
const text = note._misskey_content ? note._misskey_content : htmlToMFM(note.content);
|
const text = note._misskey_content ? note._misskey_content : htmlToMFM(note.content);
|
||||||
|
|
||||||
@@ -104,7 +111,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
|
|||||||
});
|
});
|
||||||
|
|
||||||
// ユーザーの情報が古かったらついでに更新しておく
|
// ユーザーの情報が古かったらついでに更新しておく
|
||||||
if (actor.updatedAt == null || Date.now() - actor.updatedAt.getTime() > 1000 * 60 * 60 * 24) {
|
if (actor.lastFetchedAt == null || Date.now() - actor.lastFetchedAt.getTime() > 1000 * 60 * 60 * 24) {
|
||||||
updatePerson(note.attributedTo);
|
updatePerson(note.attributedTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +119,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
|
|||||||
createdAt: new Date(note.published),
|
createdAt: new Date(note.published),
|
||||||
files: files,
|
files: files,
|
||||||
reply,
|
reply,
|
||||||
renote: undefined,
|
renote: quote,
|
||||||
cw: note.summary,
|
cw: note.summary,
|
||||||
text: text,
|
text: text,
|
||||||
viaMobile: false,
|
viaMobile: false,
|
||||||
|
@@ -143,7 +143,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
|
|||||||
avatarId: null,
|
avatarId: null,
|
||||||
bannerId: null,
|
bannerId: null,
|
||||||
createdAt: Date.parse(person.published) || null,
|
createdAt: Date.parse(person.published) || null,
|
||||||
updatedAt: new Date(),
|
lastFetchedAt: new Date(),
|
||||||
description: htmlToMFM(person.summary),
|
description: htmlToMFM(person.summary),
|
||||||
followersCount,
|
followersCount,
|
||||||
followingCount,
|
followingCount,
|
||||||
@@ -212,13 +212,17 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
|
|||||||
const bannerId = banner ? banner._id : null;
|
const bannerId = banner ? banner._id : null;
|
||||||
const avatarUrl = getDriveFileUrl(avatar, true);
|
const avatarUrl = getDriveFileUrl(avatar, true);
|
||||||
const bannerUrl = getDriveFileUrl(banner, false);
|
const bannerUrl = getDriveFileUrl(banner, false);
|
||||||
|
const avatarColor = avatar && avatar.metadata.properties.avgColor ? avatar.metadata.properties.avgColor : null;
|
||||||
|
const bannerColor = banner && avatar.metadata.properties.avgColor ? banner.metadata.properties.avgColor : null;
|
||||||
|
|
||||||
await User.update({ _id: user._id }, {
|
await User.update({ _id: user._id }, {
|
||||||
$set: {
|
$set: {
|
||||||
avatarId,
|
avatarId,
|
||||||
bannerId,
|
bannerId,
|
||||||
avatarUrl,
|
avatarUrl,
|
||||||
bannerUrl
|
bannerUrl,
|
||||||
|
avatarColor,
|
||||||
|
bannerColor
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -226,6 +230,8 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
|
|||||||
user.bannerId = bannerId;
|
user.bannerId = bannerId;
|
||||||
user.avatarUrl = avatarUrl;
|
user.avatarUrl = avatarUrl;
|
||||||
user.bannerUrl = bannerUrl;
|
user.bannerUrl = bannerUrl;
|
||||||
|
user.avatarColor = avatarColor;
|
||||||
|
user.bannerColor = bannerColor;
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
await updateFeatured(user._id).catch(err => console.log(err));
|
await updateFeatured(user._id).catch(err => console.log(err));
|
||||||
@@ -298,7 +304,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
|
|||||||
// Update user
|
// Update user
|
||||||
await User.update({ _id: exist._id }, {
|
await User.update({ _id: exist._id }, {
|
||||||
$set: {
|
$set: {
|
||||||
updatedAt: new Date(),
|
lastFetchedAt: new Date(),
|
||||||
inbox: person.inbox,
|
inbox: person.inbox,
|
||||||
sharedInbox: person.sharedInbox,
|
sharedInbox: person.sharedInbox,
|
||||||
featured: person.featured,
|
featured: person.featured,
|
||||||
@@ -306,6 +312,8 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
|
|||||||
bannerId: banner ? banner._id : null,
|
bannerId: banner ? banner._id : null,
|
||||||
avatarUrl: getDriveFileUrl(avatar, true),
|
avatarUrl: getDriveFileUrl(avatar, true),
|
||||||
bannerUrl: getDriveFileUrl(banner, false),
|
bannerUrl: getDriveFileUrl(banner, false),
|
||||||
|
avatarColor: avatar && avatar.metadata.properties.avgColor ? avatar.metadata.properties.avgColor : null,
|
||||||
|
bannerColor: banner && banner.metadata.properties.avgColor ? banner.metadata.properties.avgColor : null,
|
||||||
description: htmlToMFM(person.summary),
|
description: htmlToMFM(person.summary),
|
||||||
followersCount,
|
followersCount,
|
||||||
followingCount,
|
followingCount,
|
||||||
|
@@ -42,6 +42,18 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
|
|||||||
inReplyTo = null;
|
inReplyTo = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let quote;
|
||||||
|
|
||||||
|
if (note.renoteId) {
|
||||||
|
const renote = await Note.findOne({
|
||||||
|
_id: note.renoteId,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (renote) {
|
||||||
|
quote = renote.uri ? renote.uri : `${config.url}/notes/${renote._id}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const user = await User.findOne({
|
const user = await User.findOne({
|
||||||
_id: note.userId
|
_id: note.userId
|
||||||
});
|
});
|
||||||
@@ -112,6 +124,7 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
|
|||||||
summary: note.cw,
|
summary: note.cw,
|
||||||
content,
|
content,
|
||||||
_misskey_content: text,
|
_misskey_content: text,
|
||||||
|
_misskey_quote: quote,
|
||||||
published: note.createdAt.toISOString(),
|
published: note.createdAt.toISOString(),
|
||||||
to,
|
to,
|
||||||
cc,
|
cc,
|
||||||
|
@@ -41,6 +41,7 @@ export interface IOrderedCollection extends IObject {
|
|||||||
export interface INote extends IObject {
|
export interface INote extends IObject {
|
||||||
type: 'Note';
|
type: 'Note';
|
||||||
_misskey_content: string;
|
_misskey_content: string;
|
||||||
|
_misskey_quote: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IPerson extends IObject {
|
export interface IPerson extends IObject {
|
||||||
|
@@ -76,7 +76,7 @@ router.get('/notes/:note', async (ctx, next) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = pack(await renderNote(note, false));
|
ctx.body = pack(await renderNote(note, false));
|
||||||
ctx.set('Cache-Control', 'public, max-age=180');
|
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -4,21 +4,24 @@ import config from '../../../config';
|
|||||||
import { ILocalUser } from '../../../models/user';
|
import { ILocalUser } from '../../../models/user';
|
||||||
|
|
||||||
export default function(ctx: Koa.Context, user: ILocalUser, redirect = false) {
|
export default function(ctx: Koa.Context, user: ILocalUser, redirect = false) {
|
||||||
const expires = 1000 * 60 * 60 * 24 * 365; // One Year
|
|
||||||
ctx.cookies.set('i', user.token, {
|
|
||||||
path: '/',
|
|
||||||
domain: config.hostname,
|
|
||||||
// SEE: https://github.com/koajs/koa/issues/974
|
|
||||||
//secure: config.url.startsWith('https'),
|
|
||||||
secure: false,
|
|
||||||
httpOnly: false,
|
|
||||||
expires: new Date(Date.now() + expires),
|
|
||||||
maxAge: expires
|
|
||||||
});
|
|
||||||
|
|
||||||
if (redirect) {
|
if (redirect) {
|
||||||
|
//#region Cookie
|
||||||
|
const expires = 1000 * 60 * 60 * 24 * 365; // One Year
|
||||||
|
ctx.cookies.set('i', user.token, {
|
||||||
|
path: '/',
|
||||||
|
domain: config.hostname,
|
||||||
|
// SEE: https://github.com/koajs/koa/issues/974
|
||||||
|
// When using a SSL proxy it should be configured to add the "X-Forwarded-Proto: https" header
|
||||||
|
secure: config.url.startsWith('https'),
|
||||||
|
httpOnly: false,
|
||||||
|
expires: new Date(Date.now() + expires),
|
||||||
|
maxAge: expires
|
||||||
|
});
|
||||||
|
//#endregion
|
||||||
|
|
||||||
ctx.redirect(config.url);
|
ctx.redirect(config.url);
|
||||||
} else {
|
} else {
|
||||||
ctx.status = 204;
|
ctx.body = { i: user.token };
|
||||||
|
ctx.status = 200;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
57
src/server/api/endpoints/admin/reset-password.ts
Normal file
57
src/server/api/endpoints/admin/reset-password.ts
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import $ from 'cafy';
|
||||||
|
import ID, { transform } from '../../../../misc/cafy-id';
|
||||||
|
import define from '../../define';
|
||||||
|
import User from '../../../../models/user';
|
||||||
|
import * as bcrypt from 'bcryptjs';
|
||||||
|
import rndstr from 'rndstr';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '指定したユーザーのパスワードをリセットします。',
|
||||||
|
},
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
requireModerator: true,
|
||||||
|
|
||||||
|
params: {
|
||||||
|
userId: {
|
||||||
|
validator: $.type(ID),
|
||||||
|
transform: transform,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '対象のユーザーID',
|
||||||
|
'en-US': 'The user ID which you want to suspend'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default define(meta, (ps) => new Promise(async (res, rej) => {
|
||||||
|
const user = await User.findOne({
|
||||||
|
_id: ps.userId
|
||||||
|
});
|
||||||
|
|
||||||
|
if (user == null) {
|
||||||
|
return rej('user not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user.isAdmin) {
|
||||||
|
return rej('cannot reset password of admin');
|
||||||
|
}
|
||||||
|
|
||||||
|
const passwd = rndstr('a-zA-Z0-9', 8);
|
||||||
|
|
||||||
|
// Generate hash of password
|
||||||
|
const hash = bcrypt.hashSync(passwd);
|
||||||
|
|
||||||
|
await User.findOneAndUpdate({
|
||||||
|
_id: user._id
|
||||||
|
}, {
|
||||||
|
$set: {
|
||||||
|
password: hash
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
res({
|
||||||
|
password: passwd
|
||||||
|
});
|
||||||
|
}));
|
40
src/server/api/endpoints/admin/show-user.ts
Normal file
40
src/server/api/endpoints/admin/show-user.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import $ from 'cafy';
|
||||||
|
import ID, { transform } from '../../../../misc/cafy-id';
|
||||||
|
import define from '../../define';
|
||||||
|
import User from '../../../../models/user';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '指定したユーザーの情報を取得します。',
|
||||||
|
},
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
requireModerator: true,
|
||||||
|
|
||||||
|
params: {
|
||||||
|
userId: {
|
||||||
|
validator: $.type(ID),
|
||||||
|
transform: transform,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '対象のユーザーID',
|
||||||
|
'en-US': 'The user ID which you want to suspend'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||||
|
const user = await User.findOne({
|
||||||
|
_id: ps.userId
|
||||||
|
});
|
||||||
|
|
||||||
|
if (user == null) {
|
||||||
|
return rej('user not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me.isModerator && user.isAdmin) {
|
||||||
|
return rej('cannot show info of admin');
|
||||||
|
}
|
||||||
|
|
||||||
|
res(user);
|
||||||
|
}));
|
@@ -139,6 +139,13 @@ export const meta = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
summalyProxy: {
|
||||||
|
validator: $.str.optional.nullable,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'summalyプロキシURL'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
enableTwitterIntegration: {
|
enableTwitterIntegration: {
|
||||||
validator: $.bool.optional,
|
validator: $.bool.optional,
|
||||||
desc: {
|
desc: {
|
||||||
@@ -200,7 +207,77 @@ export const meta = {
|
|||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'DiscordアプリのClient Secret'
|
'ja-JP': 'DiscordアプリのClient Secret'
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
|
enableExternalUserRecommendation: {
|
||||||
|
validator: $.bool.optional,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '外部ユーザーレコメンデーションを有効にする'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
externalUserRecommendationEngine: {
|
||||||
|
validator: $.str.optional.nullable,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '外部ユーザーレコメンデーションのサードパーティエンジン'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
externalUserRecommendationTimeout: {
|
||||||
|
validator: $.num.optional.nullable.min(0),
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '外部ユーザーレコメンデーションのタイムアウト (ミリ秒)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
enableEmail: {
|
||||||
|
validator: $.bool.optional,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'メール配信を有効にするか否か'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
email: {
|
||||||
|
validator: $.str.optional.nullable,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'メール配信する際に利用するメールアドレス'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
smtpSecure: {
|
||||||
|
validator: $.bool.optional,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'SMTPサーバがSSLを使用しているか否か'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
smtpHost: {
|
||||||
|
validator: $.str.optional.nullable,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'SMTPサーバのホスト'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
smtpPort: {
|
||||||
|
validator: $.num.optional.nullable,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'SMTPサーバのポート'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
smtpUser: {
|
||||||
|
validator: $.str.optional.nullable,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'SMTPサーバのユーザー名'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
smtpPass: {
|
||||||
|
validator: $.str.optional.nullable,
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'SMTPサーバのパスワード'
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -279,6 +356,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
|
|||||||
set.langs = ps.langs;
|
set.langs = ps.langs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ps.summalyProxy !== undefined) {
|
||||||
|
set.summalyProxy = ps.summalyProxy;
|
||||||
|
}
|
||||||
|
|
||||||
if (ps.enableTwitterIntegration !== undefined) {
|
if (ps.enableTwitterIntegration !== undefined) {
|
||||||
set.enableTwitterIntegration = ps.enableTwitterIntegration;
|
set.enableTwitterIntegration = ps.enableTwitterIntegration;
|
||||||
}
|
}
|
||||||
@@ -315,6 +396,46 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
|
|||||||
set.discordClientSecret = ps.discordClientSecret;
|
set.discordClientSecret = ps.discordClientSecret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ps.enableExternalUserRecommendation !== undefined) {
|
||||||
|
set.enableExternalUserRecommendation = ps.enableExternalUserRecommendation;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.externalUserRecommendationEngine !== undefined) {
|
||||||
|
set.externalUserRecommendationEngine = ps.externalUserRecommendationEngine;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.externalUserRecommendationTimeout !== undefined) {
|
||||||
|
set.externalUserRecommendationTimeout = ps.externalUserRecommendationTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.enableEmail !== undefined) {
|
||||||
|
set.enableEmail = ps.enableEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.email !== undefined) {
|
||||||
|
set.email = ps.email;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.smtpSecure !== undefined) {
|
||||||
|
set.smtpSecure = ps.smtpSecure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.smtpHost !== undefined) {
|
||||||
|
set.smtpHost = ps.smtpHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.smtpPort !== undefined) {
|
||||||
|
set.smtpPort = ps.smtpPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.smtpUser !== undefined) {
|
||||||
|
set.smtpUser = ps.smtpUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ps.smtpPass !== undefined) {
|
||||||
|
set.smtpPass = ps.smtpPass;
|
||||||
|
}
|
||||||
|
|
||||||
await Meta.update({}, {
|
await Meta.update({}, {
|
||||||
$set: set
|
$set: set
|
||||||
}, { upsert: true });
|
}, { upsert: true });
|
||||||
|
@@ -3,6 +3,8 @@ import define from '../../define';
|
|||||||
import driveChart from '../../../../chart/drive';
|
import driveChart from '../../../../chart/drive';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ドライブのチャートを取得します。'
|
'ja-JP': 'ドライブのチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -3,6 +3,8 @@ import define from '../../define';
|
|||||||
import federationChart from '../../../../chart/federation';
|
import federationChart from '../../../../chart/federation';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'フェデレーションのチャートを取得します。'
|
'ja-JP': 'フェデレーションのチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -3,6 +3,8 @@ import define from '../../define';
|
|||||||
import hashtagChart from '../../../../chart/hashtag';
|
import hashtagChart from '../../../../chart/hashtag';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ハッシュタグごとのチャートを取得します。'
|
'ja-JP': 'ハッシュタグごとのチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -3,6 +3,8 @@ import define from '../../define';
|
|||||||
import networkChart from '../../../../chart/network';
|
import networkChart from '../../../../chart/network';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ネットワークのチャートを取得します。'
|
'ja-JP': 'ネットワークのチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -3,6 +3,8 @@ import define from '../../define';
|
|||||||
import notesChart from '../../../../chart/notes';
|
import notesChart from '../../../../chart/notes';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': '投稿のチャートを取得します。'
|
'ja-JP': '投稿のチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -4,6 +4,8 @@ import perUserDriveChart from '../../../../../chart/per-user-drive';
|
|||||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ユーザーごとのドライブのチャートを取得します。'
|
'ja-JP': 'ユーザーごとのドライブのチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -4,6 +4,8 @@ import perUserFollowingChart from '../../../../../chart/per-user-following';
|
|||||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ユーザーごとのフォロー/フォロワーのチャートを取得します。'
|
'ja-JP': 'ユーザーごとのフォロー/フォロワーのチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -4,6 +4,8 @@ import perUserNotesChart from '../../../../../chart/per-user-notes';
|
|||||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ユーザーごとの投稿のチャートを取得します。'
|
'ja-JP': 'ユーザーごとの投稿のチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -4,6 +4,8 @@ import perUserReactionsChart from '../../../../../chart/per-user-reactions';
|
|||||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ユーザーごとの被リアクション数のチャートを取得します。'
|
'ja-JP': 'ユーザーごとの被リアクション数のチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -3,6 +3,8 @@ import define from '../../define';
|
|||||||
import usersChart from '../../../../chart/users';
|
import usersChart from '../../../../chart/users';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
stability: 'stable',
|
||||||
|
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'ユーザーのチャートを取得します。'
|
'ja-JP': 'ユーザーのチャートを取得します。'
|
||||||
},
|
},
|
||||||
|
@@ -77,5 +77,5 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
|
|||||||
sort: sort
|
sort: sort
|
||||||
});
|
});
|
||||||
|
|
||||||
res(await packMany(files));
|
res(await packMany(files, { detail: false, self: true }));
|
||||||
}));
|
}));
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user