Compare commits
526 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16d59e9988 | ||
|
|
93ce25db91 | ||
|
|
c97a523ada | ||
|
|
488fe2e7bd | ||
|
|
8da278a279 | ||
|
|
da69650505 | ||
|
|
a85f6edd8a | ||
|
|
d17c6adba4 | ||
|
|
2671c6b4f2 | ||
|
|
a81d5786f3 | ||
|
|
75e2b075e1 | ||
|
|
533884dcaa | ||
|
|
7298b41a16 | ||
|
|
39561e858a | ||
|
|
96b88ee369 | ||
|
|
d94e2025be | ||
|
|
6ba5968861 | ||
|
|
cea2d621f2 | ||
|
|
84be4aa91e | ||
|
|
a943bf3906 | ||
|
|
42a14508f6 | ||
|
|
f4cb62db16 | ||
|
|
4dc4ac2f0c | ||
|
|
bf9da8458c | ||
|
|
1832b2e53c | ||
|
|
17ebaa01f5 | ||
|
|
c595f68d9d | ||
|
|
b040ac6373 | ||
|
|
e94dd8a5e8 | ||
|
|
e14509574d | ||
|
|
3a093f8bd7 | ||
|
|
ebb9a9b64f | ||
|
|
ef17838c64 | ||
|
|
11ddbdc58d | ||
|
|
4e8047275b | ||
|
|
c19670d611 | ||
|
|
540bd3630a | ||
|
|
49f6b3233e | ||
|
|
0f2d392b4b | ||
|
|
53fba9b137 | ||
|
|
24f2183829 | ||
|
|
61642539b1 | ||
|
|
1b7454ca77 | ||
|
|
60d2558ed6 | ||
|
|
9f5a763c69 | ||
|
|
0ef31a8bac | ||
|
|
1a8632e802 | ||
|
|
c1c955031e | ||
|
|
75ab146860 | ||
|
|
c3f9b2dcc3 | ||
|
|
c9e33f665e | ||
|
|
b719d43049 | ||
|
|
f555aa734b | ||
|
|
37fb685016 | ||
|
|
09fe1b355a | ||
|
|
9d530a5c38 | ||
|
|
827c378ac1 | ||
|
|
9b91b92bca | ||
|
|
e7fcca0e06 | ||
|
|
a36e5b4543 | ||
|
|
ba474648a2 | ||
|
|
a7b710a2f8 | ||
|
|
c033464b92 | ||
|
|
3ef6305c76 | ||
|
|
511ef20b8a | ||
|
|
4db710a4b0 | ||
|
|
efe92724a4 | ||
|
|
aa19767ebc | ||
|
|
143190ab38 | ||
|
|
baf94f86c4 | ||
|
|
d36b129369 | ||
|
|
f36d88246a | ||
|
|
03f87140b3 | ||
|
|
1dc07f6b72 | ||
|
|
0aa0a9d24b | ||
|
|
a9a93db2b4 | ||
|
|
f187df3933 | ||
|
|
8abe8042d7 | ||
|
|
58fd46ff6f | ||
|
|
fef8b662c1 | ||
|
|
8de2f4ce76 | ||
|
|
e5e344e1cd | ||
|
|
e70d7edf41 | ||
|
|
71d4d51fb2 | ||
|
|
aaf38f1cbe | ||
|
|
0e0d6692c0 | ||
|
|
29f927fe72 | ||
|
|
ee39d9594e | ||
|
|
cefd2a4c54 | ||
|
|
a08c20d9af | ||
|
|
dc11f1afbf | ||
|
|
b0f2b209a2 | ||
|
|
a25fdfd519 | ||
|
|
c1aa58596d | ||
|
|
b6a3eb2445 | ||
|
|
310f4d2edb | ||
|
|
701fee3139 | ||
|
|
593c2b9517 | ||
|
|
96b2267cb8 | ||
|
|
84730a071a | ||
|
|
d0b0cf8dfb | ||
|
|
749200d22b | ||
|
|
a47baad943 | ||
|
|
50abb51ece | ||
|
|
1f890c5bed | ||
|
|
97f23af86d | ||
|
|
d77aa1f26a | ||
|
|
0b075ad4e9 | ||
|
|
423f776ed0 | ||
|
|
084fd8152b | ||
|
|
89d35c2e63 | ||
|
|
be33581642 | ||
|
|
2d6d9f30e1 | ||
|
|
85721065fd | ||
|
|
9d65768d4d | ||
|
|
13f69e4291 | ||
|
|
6a0affcec1 | ||
|
|
ab6a84cd45 | ||
|
|
ba93bf7478 | ||
|
|
1c4e1af7c3 | ||
|
|
a85f4c4fc4 | ||
|
|
9d6c8806af | ||
|
|
ff52ea2a7c | ||
|
|
f247ee9dd3 | ||
|
|
f4cec53ba1 | ||
|
|
ad70b50fee | ||
|
|
ea7b2b3141 | ||
|
|
c2f932e28b | ||
|
|
c637882578 | ||
|
|
ef7221e39e | ||
|
|
6b571a7799 | ||
|
|
0638b6cb69 | ||
|
|
a39c1706a1 | ||
|
|
c741e27057 | ||
|
|
ede854c215 | ||
|
|
6a953b4d94 | ||
|
|
1d763096c7 | ||
|
|
630d873ec0 | ||
|
|
d427957ea7 | ||
|
|
2430cc0e2c | ||
|
|
e57ee24864 | ||
|
|
3bc05ab3f2 | ||
|
|
4e50dcfa93 | ||
|
|
fcf5531e5b | ||
|
|
3bef69ee58 | ||
|
|
311a4f28b0 | ||
|
|
01e692b353 | ||
|
|
3b445af6fc | ||
|
|
1e43ece637 | ||
|
|
6f1048c006 | ||
|
|
d686e70f2b | ||
|
|
70f524b82d | ||
|
|
79c6475028 | ||
|
|
7dee5309dc | ||
|
|
958ec7b03f | ||
|
|
9153434906 | ||
|
|
3a08364c24 | ||
|
|
a9beeab502 | ||
|
|
38c901069a | ||
|
|
3f7606060e | ||
|
|
777f20e9be | ||
|
|
8e39aecffe | ||
|
|
9e1ab54097 | ||
|
|
0f9e09f4bd | ||
|
|
743ebc17b9 | ||
|
|
9bc4af76b8 | ||
|
|
46fa26426d | ||
|
|
58d0dc1795 | ||
|
|
bc11702f7d | ||
|
|
6288de5813 | ||
|
|
bbf59c7d9f | ||
|
|
d7787bacf7 | ||
|
|
23ae0515c4 | ||
|
|
fe88b34b8a | ||
|
|
74aa031a22 | ||
|
|
6aeed212d9 | ||
|
|
45b972c059 | ||
|
|
7ecfc007a9 | ||
|
|
fc78c75bab | ||
|
|
59493a0cd9 | ||
|
|
6060c6d56e | ||
|
|
6cdbb27169 | ||
|
|
ed8b073e54 | ||
|
|
7dd193636c | ||
|
|
01d018510c | ||
|
|
1c273a0a75 | ||
|
|
fa2c7658a0 | ||
|
|
84ca3a7d45 | ||
|
|
902c73e6ac | ||
|
|
3b626f72e4 | ||
|
|
f5ce137a6b | ||
|
|
3ce9d12361 | ||
|
|
2fe2f3b1eb | ||
|
|
17b3ee41db | ||
|
|
56d2a5d5d3 | ||
|
|
3a17ff0983 | ||
|
|
9a9270bbe9 | ||
|
|
512eee4f51 | ||
|
|
db01fa0eef | ||
|
|
0c49a1ebd5 | ||
|
|
636d6394e3 | ||
|
|
c67c091b3a | ||
|
|
333604898c | ||
|
|
076ac3b614 | ||
|
|
0e1468b159 | ||
|
|
66409029e7 | ||
|
|
8ec6b2ec11 | ||
|
|
14736620ec | ||
|
|
831ca53b63 | ||
|
|
6138d46509 | ||
|
|
c3003cb363 | ||
|
|
4277e53433 | ||
|
|
6516bd2ade | ||
|
|
27d22f954a | ||
|
|
88f5e8e8e2 | ||
|
|
fd2ae6d3cf | ||
|
|
238edd36f7 | ||
|
|
5d847f9808 | ||
|
|
ac914af9c3 | ||
|
|
636f90ca0c | ||
|
|
29469bb7c6 | ||
|
|
4f043b1841 | ||
|
|
85008303f5 | ||
|
|
3432d6e615 | ||
|
|
855c990a17 | ||
|
|
eef2dc2f62 | ||
|
|
fa54140973 | ||
|
|
e770d32916 | ||
|
|
8aeabf530c | ||
|
|
6fbf1cfc28 | ||
|
|
5480df35bc | ||
|
|
8b5104d564 | ||
|
|
3c1192d6bf | ||
|
|
eb8ef35122 | ||
|
|
8a31e5fd0f | ||
|
|
751728db84 | ||
|
|
e695f54ef0 | ||
|
|
b2ed45ae38 | ||
|
|
5e36f75f8a | ||
|
|
7ac13a386c | ||
|
|
56c8ad9df3 | ||
|
|
f1ab918ecd | ||
|
|
42af8c7695 | ||
|
|
0de2e150cb | ||
|
|
1ac498c8fe | ||
|
|
545d29a40a | ||
|
|
73bbef2922 | ||
|
|
26567cdeb2 | ||
|
|
84941cbb97 | ||
|
|
cd5b24d4eb | ||
|
|
c8abd512e1 | ||
|
|
de9bd2651b | ||
|
|
c432310cae | ||
|
|
1c95cdffdc | ||
|
|
c3ec668e16 | ||
|
|
2af79e9855 | ||
|
|
f6ac6f9c6f | ||
|
|
d8c835fa51 | ||
|
|
a97c14a7b7 | ||
|
|
54ecf97c22 | ||
|
|
9c4e64b7b5 | ||
|
|
ef44eda69e | ||
|
|
f1a7ab639b | ||
|
|
0d8286cb2a | ||
|
|
8e4ad4b919 | ||
|
|
9a09ed6290 | ||
|
|
9ca36021b0 | ||
|
|
eaebb95827 | ||
|
|
b8cce2067c | ||
|
|
07a0631964 | ||
|
|
ebc2b05231 | ||
|
|
4c79dd4e96 | ||
|
|
abc57519a7 | ||
|
|
a23a10d375 | ||
|
|
01e7716170 | ||
|
|
0a29ce13b6 | ||
|
|
6d0ee61661 | ||
|
|
9c684fd6c4 | ||
|
|
cbb8edd5ed | ||
|
|
f933fa0e78 | ||
|
|
b3e5198f23 | ||
|
|
6e042ca344 | ||
|
|
9381842af2 | ||
|
|
a6644c540a | ||
|
|
063427a660 | ||
|
|
6846067a5d | ||
|
|
b7273c90ae | ||
|
|
a6f5e23069 | ||
|
|
f37f22b163 | ||
|
|
9440fdb2d0 | ||
|
|
96c19b2607 | ||
|
|
b34c1379e9 | ||
|
|
0fc965f342 | ||
|
|
617db05808 | ||
|
|
6a20ab687c | ||
|
|
6c3bcdad54 | ||
|
|
aeea275ec2 | ||
|
|
b3c6e28717 | ||
|
|
70691e1523 | ||
|
|
2cb032b0e0 | ||
|
|
ebbf5268ac | ||
|
|
b2030e8403 | ||
|
|
82493bb741 | ||
|
|
aa15901c23 | ||
|
|
0bd4d069a2 | ||
|
|
ab871c6991 | ||
|
|
feec5e88fc | ||
|
|
a091cbb93a | ||
|
|
a59ab79da0 | ||
|
|
8ca4d39440 | ||
|
|
41d041f701 | ||
|
|
3e516474c2 | ||
|
|
405c9c258b | ||
|
|
24e389bcf3 | ||
|
|
933c83679e | ||
|
|
a7aa924949 | ||
|
|
0eb84fe874 | ||
|
|
2f451fa058 | ||
|
|
2465a377a1 | ||
|
|
697219e946 | ||
|
|
4478298a0a | ||
|
|
925f89720a | ||
|
|
0f71d9f47a | ||
|
|
a7ec54ea97 | ||
|
|
1d43d18b19 | ||
|
|
0bcb25a983 | ||
|
|
ec1f2a285b | ||
|
|
c2c06694da | ||
|
|
5343b005df | ||
|
|
eb783f827c | ||
|
|
6064c3ae47 | ||
|
|
05862a420f | ||
|
|
393ad283e1 | ||
|
|
841c8d619f | ||
|
|
5c2ed9e5d3 | ||
|
|
d39aabc143 | ||
|
|
4628f507e5 | ||
|
|
8b05816860 | ||
|
|
3b8ea90fdc | ||
|
|
638458e2c1 | ||
|
|
bd8d7c3d0f | ||
|
|
4b747d20b7 | ||
|
|
351b236014 | ||
|
|
e9251debe0 | ||
|
|
22c4842154 | ||
|
|
788edd3622 | ||
|
|
5afe96e15a | ||
|
|
899fc8a7bd | ||
|
|
2afcdda058 | ||
|
|
c2fc637575 | ||
|
|
82d2b0608f | ||
|
|
047a46d966 | ||
|
|
e97dd13e81 | ||
|
|
067e9ec6f4 | ||
|
|
64397708fd | ||
|
|
5ae6b0058f | ||
|
|
c201326906 | ||
|
|
3bc2fe8527 | ||
|
|
c76c1fc4ef | ||
|
|
fb3fa06ae7 | ||
|
|
48353cccae | ||
|
|
65bf863093 | ||
|
|
87a6ef0581 | ||
|
|
af583d2ef6 | ||
|
|
68d49bc770 | ||
|
|
d848195a6e | ||
|
|
3c5324bbbb | ||
|
|
e2d59293fb | ||
|
|
411f038f34 | ||
|
|
26f2ae093b | ||
|
|
6a53ccf814 | ||
|
|
114523e69e | ||
|
|
d5caf22d8c | ||
|
|
a8f945ae8e | ||
|
|
d078f78602 | ||
|
|
a5c6145237 | ||
|
|
50df9f7dff | ||
|
|
7b33522d97 | ||
|
|
d3edf03125 | ||
|
|
d5cd38b459 | ||
|
|
2c76d410ab | ||
|
|
dfd991a6c6 | ||
|
|
16b81fff38 | ||
|
|
f379a721f1 | ||
|
|
194a958d40 | ||
|
|
327ffd3498 | ||
|
|
40276d7f1a | ||
|
|
9254f95679 | ||
|
|
2e1a9dffbe | ||
|
|
ead5a6a258 | ||
|
|
97002400a8 | ||
|
|
5e7a4e4752 | ||
|
|
2c955858a0 | ||
|
|
a0e56504de | ||
|
|
d46e9f5abe | ||
|
|
fd94b817ab | ||
|
|
f17e229c1e | ||
|
|
96e23b0e5b | ||
|
|
014b945ea6 | ||
|
|
76693138d3 | ||
|
|
10677b57d4 | ||
|
|
5f0ac0f46a | ||
|
|
7ffe559525 | ||
|
|
919e3e2fed | ||
|
|
03e999875a | ||
|
|
ed0070c470 | ||
|
|
d764316708 | ||
|
|
06b1203ef9 | ||
|
|
b2cf74e878 | ||
|
|
21064f7859 | ||
|
|
bb2d76ffa3 | ||
|
|
763b70e01b | ||
|
|
5a349eb376 | ||
|
|
0141affe05 | ||
|
|
a8379e3bc9 | ||
|
|
952789cc1e | ||
|
|
0500600cdd | ||
|
|
6b897e562a | ||
|
|
f74bc309b1 | ||
|
|
bc83963ac7 | ||
|
|
94715e6153 | ||
|
|
31a5247b9c | ||
|
|
ac9f77752d | ||
|
|
73ac2632c2 | ||
|
|
20f11a6701 | ||
|
|
9bdc67c1f6 | ||
|
|
bb4ca7b31a | ||
|
|
89f16668e6 | ||
|
|
8409b59dea | ||
|
|
1707002d43 | ||
|
|
16b03fc157 | ||
|
|
fa0023e541 | ||
|
|
aec5911821 | ||
|
|
26f4c038f3 | ||
|
|
6136f6f33a | ||
|
|
2b8d0225cc | ||
|
|
18184441f1 | ||
|
|
bd83939993 | ||
|
|
2c1932faa7 | ||
|
|
33d79420eb | ||
|
|
80d8af84dd | ||
|
|
aac519bf80 | ||
|
|
d64dffbdda | ||
|
|
4015ccef2f | ||
|
|
b6f985abaf | ||
|
|
2dac8d3d1f | ||
|
|
4f284e1bc0 | ||
|
|
b0280355e8 | ||
|
|
048d88b784 | ||
|
|
bb52ebdc3e | ||
|
|
5f2fda85ba | ||
|
|
1331f0b953 | ||
|
|
736fdabc1d | ||
|
|
7096c0ca49 | ||
|
|
1a984de8e8 | ||
|
|
285d0d13f9 | ||
|
|
63c659bc8f | ||
|
|
af60b45ee7 | ||
|
|
e7effd606d | ||
|
|
5042d23bc4 | ||
|
|
b134467bd3 | ||
|
|
5cc1aab530 | ||
|
|
49d57ce049 | ||
|
|
f1feceaf1a | ||
|
|
1204e1c5e4 | ||
|
|
96cf4c30cf | ||
|
|
a3853611ad | ||
|
|
ef7eaaabfa | ||
|
|
a4a96710b0 | ||
|
|
6d08909b2f | ||
|
|
2615368b1e | ||
|
|
2bd03ca725 | ||
|
|
67dda01fcb | ||
|
|
e9dc54c4d9 | ||
|
|
fde9fc2891 | ||
|
|
6e59798e82 | ||
|
|
5e3cc0a3c6 | ||
|
|
cfb35324d0 | ||
|
|
9bfbc12afa | ||
|
|
b41cddaf5a | ||
|
|
1432a7193d | ||
|
|
20630cb3a0 | ||
|
|
2eb02ae581 | ||
|
|
801f9027aa | ||
|
|
802739a2df | ||
|
|
95b1e1a21d | ||
|
|
b8060a522a | ||
|
|
fe2191a491 | ||
|
|
2891f52817 | ||
|
|
5bdc44c672 | ||
|
|
65d359b57a | ||
|
|
7b6e717e23 | ||
|
|
2820f6a621 | ||
|
|
6f96e05fec | ||
|
|
4c2c762b87 | ||
|
|
81fadfa4ff | ||
|
|
c227641d50 | ||
|
|
dacc713f99 | ||
|
|
a1f794ee05 | ||
|
|
8b2098fc89 | ||
|
|
4436852de0 | ||
|
|
a8ff1e19dc | ||
|
|
d559aa8e6d | ||
|
|
83fedcff3b | ||
|
|
9969cf8816 | ||
|
|
dee48fff12 | ||
|
|
aff80199e5 | ||
|
|
b9f1a55190 | ||
|
|
07d5bce61a | ||
|
|
834edd216c | ||
|
|
4670a3d886 | ||
|
|
78952df364 | ||
|
|
d69df60da4 | ||
|
|
6ca69f6f2e | ||
|
|
8e8428b667 | ||
|
|
5dbe1d448b | ||
|
|
85d8e6f220 | ||
|
|
72fb23f4d5 | ||
|
|
9403ee6495 | ||
|
|
94ce4fa780 | ||
|
|
911f5c1455 | ||
|
|
a6a88af513 | ||
|
|
fad1352d51 | ||
|
|
41cdae07c3 | ||
|
|
3b0daeac3c | ||
|
|
155da0c6a3 |
@@ -8,6 +8,9 @@
|
|||||||
# Final accessible URL seen by a user.
|
# Final accessible URL seen by a user.
|
||||||
url: https://example.tld/
|
url: https://example.tld/
|
||||||
|
|
||||||
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
|
# URL SETTINGS AFTER THAT!
|
||||||
|
|
||||||
# ┌───────────────────────┐
|
# ┌───────────────────────┐
|
||||||
#───┘ Port and TLS settings └───────────────────────────────────
|
#───┘ Port and TLS settings └───────────────────────────────────
|
||||||
|
|
||||||
@@ -62,6 +65,9 @@ db:
|
|||||||
user: example-misskey-user
|
user: example-misskey-user
|
||||||
pass: example-misskey-pass
|
pass: example-misskey-pass
|
||||||
|
|
||||||
|
# Whether disable Caching queries
|
||||||
|
#disableCache: true
|
||||||
|
|
||||||
# Extra Connection options
|
# Extra Connection options
|
||||||
#extra:
|
#extra:
|
||||||
# ssl: true
|
# ssl: true
|
||||||
@@ -110,8 +116,25 @@ autoAdmin: true
|
|||||||
# Whether disable HSTS
|
# Whether disable HSTS
|
||||||
#disableHsts: true
|
#disableHsts: true
|
||||||
|
|
||||||
# Clustering
|
# Number of worker processes
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Job concurrency per worker
|
||||||
|
# deliverJobConcurrency: 128;
|
||||||
|
# inboxJobConcurrency: 16;
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
#outgoingAddressFamily: ipv4
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
|
# Syslog option
|
||||||
|
#syslog:
|
||||||
|
# host: localhost
|
||||||
|
# port: 514
|
||||||
|
|
||||||
|
# Proxy for HTTP/HTTPS
|
||||||
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
|
# Proxy for SMTP/SMTPS
|
||||||
|
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||||
|
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||||
|
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||||
|
|||||||
24
.eslintrc
24
.eslintrc
@@ -1,23 +1,23 @@
|
|||||||
{
|
{
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
"parser": "typescript-eslint-parser"
|
"parser": "@typescript-eslint/parser"
|
||||||
},
|
},
|
||||||
"extends": [
|
"extends": [
|
||||||
"eslint:recommended",
|
"eslint:recommended",
|
||||||
"plugin:vue/recommended"
|
"plugin:vue/recommended"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
"vue/require-v-for-key": false,
|
"vue/require-v-for-key": 0,
|
||||||
"vue/max-attributes-per-line": false,
|
"vue/max-attributes-per-line": 0,
|
||||||
"vue/html-indent": false,
|
"vue/html-indent": 0,
|
||||||
"vue/html-self-closing": false,
|
"vue/html-self-closing": 0,
|
||||||
"vue/no-unused-vars": false,
|
"vue/no-unused-vars": 0,
|
||||||
"vue/attributes-order": false,
|
"vue/attributes-order": 0,
|
||||||
"vue/require-prop-types": false,
|
"vue/require-prop-types": 0,
|
||||||
"vue/require-default-prop": false,
|
"vue/require-default-prop": 0,
|
||||||
"vue/html-closing-bracket-spacing": false,
|
"vue/html-closing-bracket-spacing": 0,
|
||||||
"vue/singleline-html-element-content-newline": false,
|
"vue/singleline-html-element-content-newline": 0,
|
||||||
"vue/no-v-html": false,
|
"vue/no-v-html": 0,
|
||||||
"no-console": 0,
|
"no-console": 0,
|
||||||
"no-unused-vars": 0,
|
"no-unused-vars": 0,
|
||||||
"no-empty": 0
|
"no-empty": 0
|
||||||
|
|||||||
6
.gitattributes
vendored
6
.gitattributes
vendored
@@ -1,5 +1,7 @@
|
|||||||
*.svg -diff -text
|
*.svg -diff -text
|
||||||
*.psd -diff -text
|
*.psd -diff -text
|
||||||
*.ai -diff -text
|
*.ai -diff -text
|
||||||
yarn.lock -diff -text
|
*.mqo -diff -text
|
||||||
package-lock.json -diff -text
|
*.glb -diff -text
|
||||||
|
*.blend -diff -text
|
||||||
|
*.afdesign -diff -text
|
||||||
|
|||||||
11
.gitignore
vendored
11
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
# Visual Studio Code
|
# Visual Studio Code
|
||||||
/.vscode
|
/.vscode
|
||||||
|
!/.vscode/extensions.json
|
||||||
|
|
||||||
# Intelij-IDEA
|
# Intelij-IDEA
|
||||||
/.idea
|
/.idea
|
||||||
@@ -7,9 +8,6 @@
|
|||||||
# Node.js
|
# Node.js
|
||||||
/node_modules
|
/node_modules
|
||||||
|
|
||||||
# yarn
|
|
||||||
yarn.lock
|
|
||||||
|
|
||||||
# config
|
# config
|
||||||
/.config/*
|
/.config/*
|
||||||
!/.config/example.yml
|
!/.config/example.yml
|
||||||
@@ -32,3 +30,10 @@ api-docs.json
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
/files
|
/files
|
||||||
ormconfig.json
|
ormconfig.json
|
||||||
|
|
||||||
|
# blender backups
|
||||||
|
*.blend1
|
||||||
|
*.blend2
|
||||||
|
*.blend3
|
||||||
|
*.blend4
|
||||||
|
*.blend5
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v12.1.0
|
v12.11.1
|
||||||
|
|||||||
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@@ -2,10 +2,10 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"ducksoupdev.vue2",
|
"ducksoupdev.vue2",
|
||||||
"editorconfig.editorconfig",
|
"editorconfig.editorconfig",
|
||||||
"eg2.tslint",
|
|
||||||
"eg2.vscode-npm-script",
|
"eg2.vscode-npm-script",
|
||||||
"hollowtree.vue-snippets",
|
"hollowtree.vue-snippets",
|
||||||
"ms-vscode.typescript-javascript-grammar",
|
"ms-vscode.typescript-javascript-grammar",
|
||||||
|
"ms-vscode.vscode-typescript-tslint-plugin",
|
||||||
"octref.vetur",
|
"octref.vetur",
|
||||||
"sysoev.language-stylus"
|
"sysoev.language-stylus"
|
||||||
]
|
]
|
||||||
|
|||||||
410
CHANGELOG.md
410
CHANGELOG.md
@@ -1,21 +1,394 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
If you encounter any problems with updating, please try the following:
|
11.34.0 (2019/10/14)
|
||||||
1. `npm run clean` or `npm run cleanall`
|
--------------------
|
||||||
2. Retry update (Don't forget `npm i`)
|
### ✨Improvements
|
||||||
|
* みつけるに連合分を表示するように
|
||||||
|
* リアクションピッカーをカスタマイズできるように
|
||||||
|
* inputで不正な値を入力したときにメッセージを表示するように
|
||||||
|
* ドライブファイルダウンロードURLにdownloadを付けないように
|
||||||
|
* web-pushでProxyを使用するように
|
||||||
|
|
||||||
Migration
|
### 🐛Fixes
|
||||||
------------------------------
|
* 投稿本文が合字を含んで8192文字の場合に制限をパスしても投稿できない問題を修正
|
||||||
#### 1
|
* meta.maxNoteTextLengthをnote.textの最大サイズより大きく設定できる問題を修正
|
||||||
```
|
* ページ移動等してもメニュー等が閉じずに残ってしまう問題を修正
|
||||||
npm i -g ts-node
|
* ページ移動してもメディアビューワーが残ってしまう問題を修正
|
||||||
```
|
* APに関する問題の修正
|
||||||
|
* オフライン時に大室櫻子が出てこない問題を修正
|
||||||
|
|
||||||
#### 2
|
11.33.0 (2019/09/27)
|
||||||
```
|
--------------------
|
||||||
npm run migrate
|
### ✨Improvements
|
||||||
```
|
* 絵文字ピッカーの Unicode 12.0 対応
|
||||||
|
* Adminページのユーザー一覧フィルターに利用可能アカウントを追加
|
||||||
|
* お知らせウィジェットのデザインを変更
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ユーザーを特定のリストから外すと他のリストからも消える問題を修正
|
||||||
|
* 任意のグループからユーザーを削除すると他のグループからでも削除されちゃうのを修正
|
||||||
|
* 非公開の投稿にリアクションや返信がついたとき通知が正しく行われない問題を修正
|
||||||
|
* AP: featured collectionの取り扱いが間違ってるのを修正
|
||||||
|
* AP: 存在しないユーザーをAPで参照すると404にするべきところ500になってしまうのを修正
|
||||||
|
* AndoridとデスクトップOSのChromeでPWAとしてインストール(ホーム画面に追加)できない問題を修正
|
||||||
|
* /@:user/* でユーザー用のページを返さない問題を修正
|
||||||
|
* インスタンス設定で空Arrayがうまく保存できない問題を修正
|
||||||
|
* 絵文字サジェスト時にそれがサロゲートペアだった場合「1文字」分しかカーソルが移動しない問題を修正
|
||||||
|
* ハッシュタグパースの修正
|
||||||
|
* MFMでKeycap Number Signが表示できない問題を修正
|
||||||
|
* フォローリクエストページのデザインを修正
|
||||||
|
* selectコンポーネントに余分な下線が付く問題を修正
|
||||||
|
|
||||||
|
11.32.0 (2019/09/10)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* APでRenote/Boost取り消しをやりとりするように
|
||||||
|
* リモートNote存在確認から作成までの間にLockをかけるように
|
||||||
|
* 広告ブロッカーの警告を削除
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ミュートしているユーザーからトークメッセージが来たときに通知インジケーターが点灯する問題を修正
|
||||||
|
* リアクションした人が10人を超えるときツールチップの表示がおかしい問題を修正
|
||||||
|
|
||||||
|
11.31.4 (2019/09/03)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 誰がリアクションしたか見れるやつの表示を改善
|
||||||
|
|
||||||
|
11.31.3 (2019/09/03)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 誰がリアクションしたか見れるやつの表示を改善
|
||||||
|
|
||||||
|
11.31.2 (2019/09/03)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 誰がリアクションしたか見れるやつの表示を改善
|
||||||
|
|
||||||
|
11.31.1 (2019/09/03)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 誰がリアクションしたか見れるやつの表示を改善
|
||||||
|
|
||||||
|
11.31.0 (2019/09/02)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* Syslogサポート
|
||||||
|
* チャートの同期機能をAPI経由で使えるように
|
||||||
|
* SMTPでProxyを使用できるように
|
||||||
|
* リアクションにホバーすることで誰がリアクションしたか見れるように
|
||||||
|
* リプライ時、返信元のlocalOnly属性を引き継ぐように
|
||||||
|
* 引用付き、ローカルのみなどの案内文にアイコン追加
|
||||||
|
* AP deliver/inbox job の並列度を変更できるように
|
||||||
|
* clusterLimitの既定値を1に
|
||||||
|
* AP inbox ジョブの並列度を下げる
|
||||||
|
* CWが付いた投稿はAP上でNote.sensitiveフラグを付けるように
|
||||||
|
* メモウィジェットの内容を自動で保存するように
|
||||||
|
* ページURLが他と重複してたらエラーを投げるように
|
||||||
|
* ページURLが空の時エラーを投げるように
|
||||||
|
* リアクションが解除されたときはアニメーションしないように
|
||||||
|
* 設定の各セクションごとにURLを割り当てるように
|
||||||
|
* 管理画面の各セクションごとにURLを割り当てるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 未実装のTLのRenoteクエリを実装
|
||||||
|
* タイムラインAPIのexcludeNsfwオプションを実装
|
||||||
|
* ユーザーページの投稿一覧の私の投稿にRenoteが表示される問題を修正
|
||||||
|
* meta APIでemojiプロパティに不要な情報が含まれているのを修正
|
||||||
|
* モバイル版でドライブのファイルを削除したときの挙動がおかしい問題を修正
|
||||||
|
* visiblity-chooserにlocalOnly属性が伝わらなかったのを修正
|
||||||
|
* 言語指定したときコードブロックが表示されない問題を修正
|
||||||
|
* トークのメッセージがはみ出す問題を修正
|
||||||
|
* CWの中のサムネイルのサイズが変なのを少し修正
|
||||||
|
* リアクションが初めて付いた時のエフェクトが消えている問題を修正
|
||||||
|
* 無効になっているスイッチを操作できる問題を修正
|
||||||
|
* Mキー連打で画面が真っ暗問題を修正
|
||||||
|
* AmazonのURLプレビューが出来ない問題を修正
|
||||||
|
* 表記ゆれを修正
|
||||||
|
|
||||||
|
11.30.0 (2019/08/24)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* Room: 家具をすべてしまうボタンを追加
|
||||||
|
* Room: カップ麺追加
|
||||||
|
* Room: ホログラフィックディスプレイ追加
|
||||||
|
* Room: エナジードリンク追加
|
||||||
|
* Room: ピンギンの色を変えられるように
|
||||||
|
* Room: プレビューの見やすさを向上
|
||||||
|
* Room保存時にダイアログを表示するように
|
||||||
|
* Roomから移動するときに未保存ならば警告するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* MisskeyRoomからページを戻した時、テキスト入力画面で選択位置変更ができない問題を修正
|
||||||
|
|
||||||
|
11.29.0 (2019/08/19)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* Room: ソファ追加
|
||||||
|
* Room: 螺旋階段追加
|
||||||
|
* Room: ゴミ箱追加
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* Room: 部屋を離れても裏でレンダリングが続く問題を修正
|
||||||
|
* Room: アバターのレンダリングを修正
|
||||||
|
* Room: ライティングの調整
|
||||||
|
|
||||||
|
11.28.2 (2019/08/18)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 他人の部屋なのに部屋編集UIが表示されるのを修正
|
||||||
|
* オブジェクトストレージを使用している場合Roomで画像を読み込めない問題を修正
|
||||||
|
|
||||||
|
11.28.1 (2019/08/18)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* オブジェクトストレージを使用している場合Roomで画像を読み込めない問題を修正
|
||||||
|
* Roomで家具を移動など確定せずに「しまう」と部屋ごと消える問題を修正
|
||||||
|
|
||||||
|
11.28.0 (2019/08/18)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 自分の部屋を作れるように
|
||||||
|
* Delキーを押して投稿を削除するときに確認ダイアログを出すように
|
||||||
|
* Elasticsearchのインデックス名をconfigで変更できるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* コンテンツを遡ってる途中に新しいアイテムが先頭に追加されると上限に達している場合末尾のアイテムが削除される問題を修正
|
||||||
|
* ユーザー名が突き抜けるのを修正
|
||||||
|
* ユーザー一覧とかでサイレンス・凍結されたユーザーの状態が表示されてなかったのを修正
|
||||||
|
* タイトルやアイコンがきちんと設定されないことがあるのを修正
|
||||||
|
* ドライブアップロード直後に取得できるURLがoriginalじゃない問題を修正
|
||||||
|
* リモートユーザー向けのNoteUnreadsレコードが作成される問題を修正
|
||||||
|
* Hashtagがupdateできない問題を修正
|
||||||
|
* ハッシュタグの更新がタグの数だけ並列で行われてDBを重くしてしまうことがあるのを修正
|
||||||
|
|
||||||
|
11.27.1 (2019/08/01)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* オブジェクトストレージに関する問題を修正
|
||||||
|
|
||||||
|
11.27.0 (2019/07/29)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 「削除して編集」機能を追加
|
||||||
|
* HTTPリクエストのKeep-AliveとPrxoy対応(サーバーのパフォーマンス向上)
|
||||||
|
* 通知を種類でフィルタリングして表示できるように
|
||||||
|
* モバイルで通知ページを表示することができるように
|
||||||
|
* 非ログイン時の警告処理
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* リモートの絵文字が更新されない問題を修正
|
||||||
|
* リンクバリデーションリンクが一瞬表示されてしまう問題を修正
|
||||||
|
* 選択していない状態でウィジェットが追加できる問題を修正
|
||||||
|
|
||||||
|
11.26.2 (2019/07/25)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* すでに使われたことのあるユーザー名を再度使えないように
|
||||||
|
* モバイルのウィジェットページが常に i/update-client-setting を呼び続ける問題を修正
|
||||||
|
* 投稿フォームのヘッダに添付ファイル数がちゃんと表示されない問題を修正
|
||||||
|
|
||||||
|
11.26.1 (2019/07/21)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* リモートアンケートの期限が保存されないのを修正
|
||||||
|
* 自分をブロックしているユーザーがおすすめユーザーに表示されている問題を修正
|
||||||
|
* スクロールしてると絵文字ピッカーの位置がずれる問題を修正
|
||||||
|
* 投稿フォームが画面外にはみ出さないように
|
||||||
|
* 投稿フォームの「引用付き」の表示が見づらい問題の修正
|
||||||
|
* 投稿フォームにもうリノートや引用ノートのデータがある場合はリンクを貼っても「引用として添付しますか?」のダイアログボックスが出ないように
|
||||||
|
* 「タイムライン上部に投稿フォームを表示する」機能の使用時、ノートを投稿しても引用ノートのデータが残る問題の修正
|
||||||
|
* デスクトップ版のアクティビティウィジェットの日付とデータの表示が変だったのを修正
|
||||||
|
|
||||||
|
11.26.0 (2019/07/19)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* モデレーターログを記録して確認できるように
|
||||||
|
* プロフィールに追加情報を設定できるように
|
||||||
|
* Mastodonのリンクの所有者認証に対応
|
||||||
|
* AP: Delete Person アクティビティを配信するように
|
||||||
|
* AP: Delete アクティビティの後にフォロー解除するように
|
||||||
|
* AP: アカウント削除でもDelete activityを配信するように
|
||||||
|
* Pages: ラジオボタンを追加
|
||||||
|
* AdminページのUsers Viewでユーザーのレコードをクリックすることですぐユーザーを照会できるように
|
||||||
|
* AdminページのUsers Viewでユーザー一覧からユーザー名とホスト情報で検索できるように
|
||||||
|
* 特定ホストへのメンションの特別処理をクライアントに追加
|
||||||
|
* 設定画面でデスクトップ・モバイルモード変更時はすぐにrefreshするか伺うように
|
||||||
|
* ペーストされたファイル名のテンプレート変更時すぐどのようになるか見れるように
|
||||||
|
* (コ`・ヘ・´ケ)を追加
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* ログインのログが正しく保存されない問題を修正
|
||||||
|
* 同じユーザー名のユーザーが作成できてしまうことがある問題を修正
|
||||||
|
* 報告されたレポート内容が表示されない問題を修正
|
||||||
|
* リモートのプロフィールの追加情報が表示されない問題を修正
|
||||||
|
* 「見つける」のタグが大文字小文字区別されている問題を修正
|
||||||
|
* 管理画面のインスタンス一覧でソートが正しく機能していない問題を修正
|
||||||
|
* プロフィール設定でバナーに動画を設定すると以降編集ができない問題を修正
|
||||||
|
* ウェブ検索エンジンの設定でグリッチが発生する問題を修正
|
||||||
|
* MFMの引用がインライン表示になっている問題を修正
|
||||||
|
* アンケートの期限入力部分のタイトル表示がおかしい問題を修正
|
||||||
|
* 画面上の項目がすべていなくなると実際はロードされてないだけのファイルやフォルダーがあるにも関わらず「もっと読み込む」ボタンがなくなり「このフォルダーは空です」っていうplaceholderが表示されてしまう問題を修正
|
||||||
|
* proxy-media後のContent-Typeが違う問題を修正
|
||||||
|
* ビルド時にエラーが出るのを修正
|
||||||
|
|
||||||
|
11.25.1 (2019/07/09)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* ページイベントが正しくストリームに流れてこない問題を修正
|
||||||
|
* フォントの調整
|
||||||
|
|
||||||
|
11.25.0 (2019/07/08)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* パスワード無しログイン機能
|
||||||
|
* MisskeyPagesにイベント送信ボタンを追加
|
||||||
|
* MisskeyPagesでボタンを目立たせることができるように
|
||||||
|
* ページをピン留めできるように
|
||||||
|
* デッキのカラム内でページを見れるように
|
||||||
|
* 既定のアップロード先フォルダを設定できるように
|
||||||
|
* ファイルをペーストしてアップロードするときのファイル名をカスタマイズできるように
|
||||||
|
* 公開以外へのリプライ時元の公開範囲で指定したユーザー情報を引き継ぐように
|
||||||
|
* デスクトップ版を使うかモバイル版を使うか手動で設定できるように
|
||||||
|
* フォルダーを削除できないときダイアログボックスで知らせるように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* postgres redis cache の option が適用されない問題を修正
|
||||||
|
* 一部MFMテキストが折り返されず突き抜ける問題を修正
|
||||||
|
|
||||||
|
11.24.2 (2019/07/05)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* チャートAPIの返り値が文字列になっていることがある問題を修正
|
||||||
|
* チャートに数字が表示される問題を修正
|
||||||
|
* ペタバイト単位が表示できない問題を修正
|
||||||
|
* SingleLineなMFMが折り返されてしまう問題を修正
|
||||||
|
|
||||||
|
11.24.1 (2019/07/05)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* WebAuthnでログインできない問題を修正
|
||||||
|
* 絵文字の変更事項のmetaへの反映が最大1時間遅延される問題を修正
|
||||||
|
* ハッシュタグのトレンドの計算を5分単位で丸めるように
|
||||||
|
* APNGでもMIME typeはimage/pngにするように
|
||||||
|
* カスタム絵文字リアクションがたまに文字になってしまう問題を修正
|
||||||
|
|
||||||
|
11.24.0 (2019/07/05)
|
||||||
|
--------------------
|
||||||
|
### 注意
|
||||||
|
- このアップデート後に、`node built/tools/accept-migration Init 1000000000000`してください。
|
||||||
|
- プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
|
||||||
|
|
||||||
|
|
||||||
|
### ✨Improvements
|
||||||
|
* WebAuthnサポート
|
||||||
|
* APNGサポート
|
||||||
|
* アバターファイル選択でimage以外は表示しないように
|
||||||
|
* データベース手動バキューム機能
|
||||||
|
* メールサーバー設定が正しいか確認できるように
|
||||||
|
* ピン止めの上限に達したときエラーを表示するように
|
||||||
|
* AP: attributedTo, to, cc が Array や Object のパターンに対応
|
||||||
|
* AP: object type が Audio, Document, Image, Page, Video のパターンに対応
|
||||||
|
* フォロー解除時に確認ダイアログを表示するように
|
||||||
|
* ユーザー入力ダイアログで、入力時にユーザーの存在を確認するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 自分のインスタンスのルートURIへのリンクが無になる問題を修正
|
||||||
|
* リモートファイルの削除が重い問題を修正
|
||||||
|
* 投稿などの連続したスペースがひとつに纏まるのを修正
|
||||||
|
* MFMのパース修正
|
||||||
|
* マイグレーション時にエラーが出る問題を修正
|
||||||
|
|
||||||
|
11.23.1 (2019/06/25)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* クライアントの設定がリセットされることがある問題を修正
|
||||||
|
|
||||||
|
11.23.0 (2019/06/23)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* ホーム/デッキのカスタマイズ情報を複数のデバイスで同期できるように
|
||||||
|
* ホーム/デッキのカスタマイズ情報の複数プリセット切り替え
|
||||||
|
* サーバー情報にRedisのバージョンを追加
|
||||||
|
* ServiceWorker有効化
|
||||||
|
* MisskeyPagesでリストの要素数を取得する関数を追加
|
||||||
|
* URLプレビューでハッシュだけ違うプレビューカードは表示しないように
|
||||||
|
* URLプレビューをユーザーロケールで出し分けるように
|
||||||
|
* リモートの凍結されたアカウントからのアクティビティはすべて無視するように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* フォロー解除してもフォローボタンがフォロー中のままになる問題を修正
|
||||||
|
|
||||||
|
11.22.0 (2019/06/18)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 管理画面でデータベースの各テーブルのレコード数やサイズを確認できるように
|
||||||
|
* サーバー情報にPostgreSQLのバージョンを追加
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* リモートファイルのダウンロードに失敗することがある問題を修正
|
||||||
|
* アンケートの期間を日時指定で選択すると日時がUTCになってしまう問題を修正
|
||||||
|
* MFMのパースを修正
|
||||||
|
|
||||||
|
11.21.0 (2019/06/16)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* Unicode 12.0 の絵文字に対応
|
||||||
|
* 閉鎖しているホストにはAP deliverしないように
|
||||||
|
* image以外はproxyしないように
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* サムネイル生成でエラーになるとファイルのアップロードに失敗する問題を修正
|
||||||
|
* オートコンプリートにアニメーション停止が効かない問題を修正
|
||||||
|
|
||||||
|
11.20.4 (2019/06/13)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 検索結果がループする問題を修正
|
||||||
|
* 設定でPostgreSQLのクエリー結果のキャッシュを無効できるように
|
||||||
|
* 「投稿内の動きのあるテキストを無効にする」だけ反応しない問題を修正
|
||||||
|
* 特定の操作のデータベースのパフォーマンス調整
|
||||||
|
|
||||||
|
11.20.3 (2019/06/10)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* 絵文字サジェストが動作しなくなっていた問題を修正
|
||||||
|
|
||||||
|
11.20.2 (2019/06/10)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* Redisにパスワードを設定している場合接続できない問題を修正
|
||||||
|
* i18n
|
||||||
|
* など
|
||||||
|
|
||||||
|
11.20.1 (2019/06/07)
|
||||||
|
--------------------
|
||||||
|
### 🐛Fixes
|
||||||
|
* リモートファイルのキャッシュをすべて削除するときの動作を修正
|
||||||
|
* ストリームのハッシュタグチャンネルが死んでいる問題を修正
|
||||||
|
* Pagesから他の同一インスタンス内のPagesのページへのリンクができない問題を修正
|
||||||
|
* /api/notes/create 公開範囲private を渡すとタイムアウトする問題を修正
|
||||||
|
* パスワードの確認が完了しなくてもユーザー登録できる問題を修正
|
||||||
|
* 依存関係の更新
|
||||||
|
* i18n
|
||||||
|
|
||||||
|
11.20.0 (2019/05/27)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* 管理画面からリモートファイルのキャッシュをすべて削除できるように
|
||||||
|
* 投稿フォームに投稿のURLをペーストしようとすると引用RNにできるように
|
||||||
|
* モバイル版の投稿フォームにファイルをドロップできるように
|
||||||
|
* モバイル版でも投稿の下書き自動保存ができるように
|
||||||
|
* リモートファイルのキャッシュが期限切れになったときにサムネイルが無くならないように
|
||||||
|
* ジョブキュー管理画面を強化
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 投稿内のローカルなURLプレビューをクリックしたとき not found になることがある問題を修正
|
||||||
|
* デスクトップでユーザーページに遷移するときページが再度読み込みされることがある問題を修正
|
||||||
|
* フォロー申請自動承認オプションが常にオフで表示される問題を修正
|
||||||
|
* ポートを設定せずに起動したときに適切なエラーメッセージが表示されない問題を修正
|
||||||
|
* i18n
|
||||||
|
|
||||||
11.19.1 (2019/05/26)
|
11.19.1 (2019/05/26)
|
||||||
--------------------
|
--------------------
|
||||||
@@ -496,12 +869,11 @@ mongodb:
|
|||||||
db: misskey
|
db: misskey
|
||||||
```
|
```
|
||||||
3. migration ブランチに切り替え
|
3. migration ブランチに切り替え
|
||||||
4. `npm i`
|
4. `yarn install`
|
||||||
5. `npm run build`
|
5. `yarn build`
|
||||||
6. `npm run init`
|
6. `yarn migrate`
|
||||||
7. `npm run migrate`
|
7. master ブランチに戻す
|
||||||
8. master ブランチに戻す
|
8. enjoy
|
||||||
9. enjoy
|
|
||||||
|
|
||||||
10.100.0
|
10.100.0
|
||||||
----------
|
----------
|
||||||
|
|||||||
@@ -7,18 +7,24 @@ Feature suggestions and bug reports are filed in https://github.com/syuilo/missk
|
|||||||
* Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one.
|
* Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one.
|
||||||
* If you have multiple independent issues, please submit them separately.
|
* If you have multiple independent issues, please submit them separately.
|
||||||
|
|
||||||
|
## Branches
|
||||||
|
* **master** branch is tracking the latest release and used for production purposes.
|
||||||
|
* **develop** branch is where we work for the next release.
|
||||||
|
* **l10n_develop** branch is reserved for localization management.
|
||||||
|
|
||||||
## Localization (l10n)
|
## Localization (l10n)
|
||||||
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
||||||
You can improve our translations with your Crowdin account.
|
You can improve our translations with your Crowdin account.
|
||||||
Changes you make in Crowdin will be merged into develop branch.
|
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
|
||||||
|
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
|
||||||
|
|
||||||
If you can't find the language you want to contribute with, please open an issue.
|
If your language is not listed in Crowdin, please open an issue.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Internationalization (i18n)
|
## Internationalization (i18n)
|
||||||
Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
|
Misskey uses the Vue.js plugin [Vue I18n](https://github.com/kazupon/vue-i18n).
|
||||||
|
Documentation of Vue I18n is available at http://kazupon.github.io/vue-i18n/introduction.html .
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
* Documents for contributors are located in [`/docs`](/docs).
|
* Documents for contributors are located in [`/docs`](/docs).
|
||||||
@@ -29,9 +35,25 @@ Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
|
|||||||
* Test codes are located in [`/test`](/test).
|
* Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses CircleCI for automated test.
|
Misskey uses CircleCI for executing automated tests.
|
||||||
Configuration files are located in [`/.circleci`](/.circleci).
|
Configuration files are located in [`/.circleci`](/.circleci).
|
||||||
|
|
||||||
|
## Adding MisskeyRoom items
|
||||||
|
* Use English for material, object and texture names.
|
||||||
|
* Use meter for unit of length.
|
||||||
|
* Your PR should include all source files (e.g. `.png`, `.blend`) of your models (for later editing).
|
||||||
|
* Your PR must include the glTF binary files (`.glb`) of your models.
|
||||||
|
* Add a locale key `room.furnitures.YOUR_ITEM` at [`/locales/ja-JP.yml`](/locales/ja-JP.yml).
|
||||||
|
* Add a furniture definition at [`/src/client/app/common/scripts/room/furnitures.json5`](/src/client/app/common/scripts/room/furnitures.json5).
|
||||||
|
|
||||||
|
If you have no experience on 3D modeling, we suggest to use the free 3DCG software [Blender](https://www.blender.org/).
|
||||||
|
You can find information on glTF 2.0 at [glTF 2.0 — Blender Manual]( https://docs.blender.org/manual/en/dev/addons/io_scene_gltf2.html).
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
### How to resolve conflictions occurred at yarn.lock?
|
||||||
|
|
||||||
|
Just execute `yarn` to fix it.
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
### AP
|
### AP
|
||||||
Stands for _**A**ctivity**P**ub_.
|
Stands for _**A**ctivity**P**ub_.
|
||||||
@@ -51,11 +73,15 @@ Convert な(na) to にゃ(nya)
|
|||||||
#### Denyaize
|
#### Denyaize
|
||||||
Revert Nyaize
|
Revert Nyaize
|
||||||
|
|
||||||
## Code style
|
## TypeScript Coding Style
|
||||||
### セミコロンを省略しない
|
### Do not omit semicolons
|
||||||
ASI Hazardを避けるためでもある
|
This is to avoid Automatic Semicolon Insertion (ASI) hazard.
|
||||||
|
|
||||||
### 中括弧を省略しない
|
Ref:
|
||||||
|
* https://www.ecma-international.org/ecma-262/#sec-automatic-semicolon-insertion
|
||||||
|
* https://github.com/tc39/ecma262/pull/1062
|
||||||
|
|
||||||
|
### Do not omit curly brackets
|
||||||
Bad:
|
Bad:
|
||||||
``` ts
|
``` ts
|
||||||
if (foo)
|
if (foo)
|
||||||
@@ -73,18 +99,38 @@ if (foo) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
ただし**`if`が一行**の時だけは省略しても良い
|
As a special case, you can omit the curly brackets if
|
||||||
|
|
||||||
|
* the body of the `if`-statement have only one statement and,
|
||||||
|
* the `if`-statement does not have `else`-clause.
|
||||||
|
|
||||||
Good:
|
Good:
|
||||||
``` ts
|
``` ts
|
||||||
if (foo) bar;
|
if (foo) bar;
|
||||||
```
|
```
|
||||||
|
|
||||||
### `export default`を使わない
|
Make sure that the condition and the body statement are on the same line.
|
||||||
インテリセンスと相性が悪かったりするため
|
|
||||||
|
|
||||||
参考:
|
### Do not use `==` when it can simply be replaced with `===`.
|
||||||
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
🥰
|
||||||
|
|
||||||
|
### Use only boolean (or null related) values in the condition of an `if`-statement.
|
||||||
|
Bad:
|
||||||
|
``` ts
|
||||||
|
if (foo.length)
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
``` ts
|
||||||
|
if (foo.length > 0)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Do not use `export default`
|
||||||
|
This is because the current language support does not work well with `export default`.
|
||||||
|
|
||||||
|
Ref:
|
||||||
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
||||||
|
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
||||||
|
|
||||||
Bad:
|
Bad:
|
||||||
``` ts
|
``` ts
|
||||||
@@ -219,11 +265,12 @@ const user = await Users.findOne(userId).then(ensure);
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Migration作成方法
|
### Migration作成方法
|
||||||
コードの変更をした後、`ormconfig.json`(`npm run ormconfig`で生成)を用意し、
|
|
||||||
|
|
||||||
```
|
```
|
||||||
npm i -g ts-node
|
npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
||||||
ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
|
||||||
```
|
```
|
||||||
|
|
||||||
作成されたスクリプトは不必要な変更を含むため除去してください。
|
作成されたスクリプトは不必要な変更を含むため除去してください。
|
||||||
|
|
||||||
|
## その他
|
||||||
|
### HTMLのクラス名で follow という単語は使わない
|
||||||
|
広告ブロッカーで誤ってブロックされる
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM node:12.1-alpine AS base
|
FROM node:12.11.1-alpine AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
@@ -23,9 +23,9 @@ RUN apk add --no-cache \
|
|||||||
zlib-dev
|
zlib-dev
|
||||||
|
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN npm i
|
RUN yarn install
|
||||||
COPY . ./
|
COPY . ./
|
||||||
RUN npm run build
|
RUN yarn build
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
|
|
||||||
|
|||||||
46
README.md
46
README.md
@@ -104,78 +104,72 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/20010324/b8af4bd31ae34fbf8806cc0e6228e400/1.png?token-time=2145916800&token-hash=iyiocfousNIUwASmatsIDq8EOsmLUdrQNkWyktHlmJg%3D" alt="Nemo" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1.jpe?token-time=2145916800&token-hash=bqwLTk0Wo0hUJJ8J5y7ii05bLzz-_CDA7Bo0Mp4RFU0%3D" alt="ne_moni" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4.jpe?token-time=2145916800&token-hash=zEyJqVM7u9d8Ri-65fJYSJcWF1jBH1nJ5a3taRzrTmw%3D" alt="Melilot" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
|
|
||||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
|
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=20010324">Nemo</a></td>
|
||||||
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
|
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=19045173">kiritan</a></td>
|
<td><a href="https://www.patreon.com/user?u=19045173">kiritan</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
|
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1.png?token-time=2145916800&token-hash=FMV7cPKBD1TU2WTbl1jg6AcdKSvTb2BSFcDhgc-EO8w%3D" alt="gutfuckllc" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5788159/af42076ab3354bb49803cfba65f94bee/1.jpg?token-time=2145916800&token-hash=iSaxp_Yr2-ZiU2YVi9rcpZZj9mj3UvNSMrZr4CU4qtA%3D" alt="mewl hayabusa" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
|
|
||||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||||
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
|
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
|
||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
|
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
|
||||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4.jpe?token-time=2145916800&token-hash=UslrPVM-8TXOe8AapuNiaFYjcIJgPNcU-fKpGbfGJNI%3D" alt="Damillora" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4.jpe?token-time=2145916800&token-hash=UslrPVM-8TXOe8AapuNiaFYjcIJgPNcU-fKpGbfGJNI%3D" alt="Damillora" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1.jpeg?token-time=2145916800&token-hash=l4AoMR7Nj7K4yAHrkrk2hAoggPkbSPm12m1nmbe9Pb8%3D" alt="Naoki Hirayama" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
||||||
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
||||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
|
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
|
||||||
<td><a href="https://www.patreon.com/Corset">CG</a></td>
|
<td><a href="https://www.patreon.com/Corset">CG</a></td>
|
||||||
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
||||||
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/23932002" alt="nenohi" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
||||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=23932002">nenohi</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Sun, 19 May 2019 02:37:06 UTC
|
**Last updated:** Thu, 03 Oct 2019 14:45:07 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
|||||||
BIN
assets/icons/512.png
Normal file
BIN
assets/icons/512.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
91
assets/icons/icon.svg
Normal file
91
assets/icons/icon.svg
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
id="svg8"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 135.46667 135.46667"
|
||||||
|
height="512"
|
||||||
|
width="512"
|
||||||
|
sodipodi:docname="icon.svg"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||||
|
inkscape:export-filename="H:\misskey\assets\icons\512.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96">
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="965"
|
||||||
|
id="namedview10"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:snap-page="true"
|
||||||
|
inkscape:zoom="0.921875"
|
||||||
|
inkscape:cx="219.9952"
|
||||||
|
inkscape:cy="361.00053"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg8" />
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#2ba3bc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291675;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||||
|
id="rect828"
|
||||||
|
width="135.46667"
|
||||||
|
height="135.46667"
|
||||||
|
x="1.896631e-16"
|
||||||
|
y="0" />
|
||||||
|
<g
|
||||||
|
transform="matrix(0.57430748,0,0,0.57430748,11.070705,-35.453717)"
|
||||||
|
id="layer1"
|
||||||
|
style="stroke-width:1.74122751;fill:#ffffff;fill-opacity:1">
|
||||||
|
<g
|
||||||
|
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"
|
||||||
|
id="g4502"
|
||||||
|
style="stroke-width:1.74122751;fill:#ffffff;fill-opacity:1">
|
||||||
|
<g
|
||||||
|
id="g5125"
|
||||||
|
transform="translate(-1.3333333e-6,-1.3439941e-6)"
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke-width:1.74122751">
|
||||||
|
<g
|
||||||
|
aria-label="Mi"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.50409585px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
id="text4489"
|
||||||
|
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)">
|
||||||
|
<path
|
||||||
|
id="path5210"
|
||||||
|
transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
|
||||||
|
d="m 62.474609,76.585938 c -7.47555,0 -14.595784,1.246427 -21.359375,3.738281 C 29.011968,84.595952 19.044417,92.249798 11.212891,103.28516 3.7373405,113.96451 0,125.88934 0,139.06055 v 233.8789 c 0,17.08697 6.0510264,31.85913 18.154297,44.31836 12.459246,12.10327 27.233346,18.15625 44.320312,18.15625 17.442947,0 32.215089,-6.05298 44.318361,-18.15625 12.45925,-12.45923 18.68945,-27.23139 18.68945,-44.31836 V 330.4082 c 0.13441,-9.21122 9.6225,-6.79429 14.41797,0 8.98111,15.55395 28.02226,28.91242 50.19141,28.83594 22.16915,-0.0764 40.58194,-11.03699 50.19336,-28.83594 3.63981,-4.29263 13.89902,-11.60675 14.95117,0 v 42.53125 c 0,17.08697 6.05102,31.85913 18.15429,44.31836 12.45923,12.10327 27.23335,18.15625 44.32032,18.15625 17.44294,0 32.21509,-6.05298 44.31836,-18.15625 12.45923,-12.45923 18.68945,-27.23139 18.68945,-44.31836 v -233.8789 c 0,-13.17121 -3.9146,-25.09604 -11.74609,-35.77539 -7.47557,-11.035362 -17.26588,-18.689208 -29.36914,-22.960941 -7.11956,-2.491854 -14.23982,-3.738281 -21.35938,-3.738281 -19.22286,0 -35.41865,7.476649 -48.58984,22.427734 l -63.40235,74.199218 c -1.42391,1.06791 -6.14093,9.23242 -16.16015,9.23242 -10.01923,0 -14.20109,-8.16451 -15.625,-9.23242 L 110.53125,99.013672 C 97.716024,84.062587 81.697447,76.585938 62.474609,76.585938 Z m 395.060551,0 c -14.9511,-10e-7 -27.76596,5.340179 -38.44532,16.019531 -10.32338,10.323381 -15.48437,22.961011 -15.48437,37.912111 0,14.9511 5.16099,27.76596 15.48437,38.44531 10.67936,10.32338 23.49422,15.48633 38.44532,15.48633 14.95109,0 27.76596,-5.16295 38.44531,-15.48633 C 506.65982,158.28354 512,145.46868 512,130.51758 512,115.56648 506.65982,102.92885 495.98047,92.605469 485.30112,81.926117 472.48625,76.585938 457.53516,76.585938 Z m 0.5332,118.541012 c -14.9511,0 -27.76596,5.34018 -38.44531,16.01953 -10.67936,10.67936 -16.01758,23.49422 -16.01758,38.44532 v 131.89062 c 0,14.9511 5.33822,27.76596 16.01758,38.44531 10.67935,10.32339 23.49421,15.48633 38.44531,15.48633 14.9511,0 27.58873,-5.16294 37.91211,-15.48633 C 506.65982,409.24838 512,396.43352 512,381.48242 V 249.5918 c 0,-14.9511 -5.34018,-27.76596 -16.01953,-38.44532 -10.32338,-10.67935 -22.96101,-16.01953 -37.91211,-16.01953 z"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:1.90855289px"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
@@ -68,7 +68,7 @@ Build misskey with the following:
|
|||||||
*5.* Init DB
|
*5.* Init DB
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
docker-compose run --rm web npm run init
|
docker-compose run --rm web yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*6.* That is it.
|
*6.* That is it.
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ cp docker_example.env docker.env
|
|||||||
*5.* データベースを初期化
|
*5.* データベースを初期化
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
docker-compose run --rm web npm run init
|
docker-compose run --rm web yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*6.* 以上です!
|
*6.* 以上です!
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Sample nginx configuration for Misskey
|
# Sample nginx configuration for Misskey
|
||||||
#
|
#
|
||||||
# 1. Replace example.tld to your domain
|
# 1. Replace example.tld to your domain
|
||||||
# 2. Copy to /etc/nginx/sites-available/ and then symlink from /etc/nginx/sites-ebabled/
|
# 2. Copy to /etc/nginx/sites-available/ and then symlink from /etc/nginx/sites-enabled/
|
||||||
# or copy to /etc/nginx/conf.d/
|
# or copy to /etc/nginx/conf.d/
|
||||||
|
|
||||||
# For WebSocket
|
# For WebSocket
|
||||||
@@ -25,10 +25,9 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 http2;
|
listen 443 ssl http2;
|
||||||
listen [::]:443 http2;
|
listen [::]:443 ssl http2;
|
||||||
server_name example.tld;
|
server_name example.tld;
|
||||||
ssl on;
|
|
||||||
ssl_session_cache shared:ssl_session_cache:10m;
|
ssl_session_cache shared:ssl_session_cache:10m;
|
||||||
|
|
||||||
# To use Let's Encrypt certificate
|
# To use Let's Encrypt certificate
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ Please install and setup these softwares:
|
|||||||
* **[Redis](https://redis.io/)**
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optional
|
##### Optional
|
||||||
|
* [Yarn](https://yarnpkg.com/) *Optional but recommended for security reason. If you won't install it, use `npx yarn` instead of `yarn`.*
|
||||||
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
|
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
|
|
||||||
@@ -50,7 +51,7 @@ Please install and setup these softwares:
|
|||||||
|
|
||||||
5. Install misskey dependencies.
|
5. Install misskey dependencies.
|
||||||
|
|
||||||
`npm install`
|
`yarn`
|
||||||
|
|
||||||
*4.* Configure Misskey
|
*4.* Configure Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -65,21 +66,20 @@ Please install and setup these softwares:
|
|||||||
|
|
||||||
Build misskey with the following:
|
Build misskey with the following:
|
||||||
|
|
||||||
`NODE_ENV=production npm run build`
|
`NODE_ENV=production yarn build`
|
||||||
|
|
||||||
If you're on Debian, you will need to install the `build-essential`, `python` package.
|
If you're on Debian, you will need to install the `build-essential`, `python` package.
|
||||||
|
|
||||||
If you're still encountering errors about some modules, use node-gyp:
|
If you're still encountering errors about some modules, use node-gyp:
|
||||||
|
|
||||||
1. `npm install -g node-gyp`
|
1. `npx node-gyp configure`
|
||||||
2. `node-gyp configure`
|
2. `npx node-gyp build`
|
||||||
3. `node-gyp build`
|
3. `NODE_ENV=production yarn build`
|
||||||
4. `NODE_ENV=production npm run build`
|
|
||||||
|
|
||||||
*6.* Init DB
|
*6.* Init DB
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
npm run init
|
yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*7.* That is it.
|
*7.* That is it.
|
||||||
@@ -130,12 +130,16 @@ You can check if the service is running with `systemctl status misskey`.
|
|||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `yarn install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production yarn build`
|
||||||
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
5. `yarn migrate`
|
||||||
6. Restart your Misskey process to apply changes
|
6. Restart your Misskey process to apply changes
|
||||||
7. Enjoy
|
7. Enjoy
|
||||||
|
|
||||||
|
If you encounter any problems with updating, please try the following:
|
||||||
|
1. `yarn clean` or `yarn cleanall`
|
||||||
|
2. Retry update (Don't forget `yarn install`
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
If you have any questions or troubles, feel free to contact us!
|
If you have any questions or troubles, feel free to contact us!
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ Installez les paquets suivants :
|
|||||||
* **[Redis](https://redis.io/)**
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optionnels
|
##### Optionnels
|
||||||
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
|
* [Yarn](https://yarnpkg.com/) - *recommander pour des raisons de sécurité. Si vous ne l'installez pas, utilisez `npx yarn` au lieu de` yarn`.*
|
||||||
|
* [Elasticsearch](https://www.elastic.co/) - *requis pour pouvoir activer la fonctionnalité de recherche.*
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
|
|
||||||
*3.* Installation de Misskey
|
*3.* Installation de Misskey
|
||||||
@@ -50,7 +51,7 @@ Installez les paquets suivants :
|
|||||||
|
|
||||||
5. Installez les dépendances de misskey.
|
5. Installez les dépendances de misskey.
|
||||||
|
|
||||||
`npm install`
|
`yarn install`
|
||||||
|
|
||||||
*4.* Création du fichier de configuration
|
*4.* Création du fichier de configuration
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -65,23 +66,22 @@ Installez les paquets suivants :
|
|||||||
|
|
||||||
Construisez Misskey comme ceci :
|
Construisez Misskey comme ceci :
|
||||||
|
|
||||||
`NODE_ENV=production npm run build`
|
`NODE_ENV=production yarn build`
|
||||||
|
|
||||||
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
|
Si vous êtes sous Debian, vous serez amené à installer les paquets `build-essential` et `python`.
|
||||||
|
|
||||||
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
||||||
|
|
||||||
1. `npm install -g node-gyp`
|
1. `npx node-gyp configure`
|
||||||
2. `node-gyp configure`
|
2. `npx node-gyp build`
|
||||||
3. `node-gyp build`
|
3. `NODE_ENV=production yarn build`
|
||||||
4. `NODE_ENV=production npm run build`
|
|
||||||
|
|
||||||
*6.* C'est tout.
|
*6.* C'est tout.
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
||||||
|
|
||||||
### Lancement conventionnel
|
### Lancement conventionnel
|
||||||
Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-vous bien !
|
Lancez tout simplement `NODE_ENV=production yarn start`. Bonne chance et amusez-vous bien !
|
||||||
|
|
||||||
### Démarrage avec systemd
|
### Démarrage avec systemd
|
||||||
|
|
||||||
@@ -124,9 +124,9 @@ Vous pouvez vérifier si le service a démarré en utilisant la commande `system
|
|||||||
### Méthode de mise à jour vers la plus récente version de Misskey
|
### Méthode de mise à jour vers la plus récente version de Misskey
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `yarn install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production yarn build`
|
||||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
5. `yarn migrate`
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
* **[Redis](https://redis.io/)**
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### オプション
|
##### オプション
|
||||||
|
* [Yarn](https://yarnpkg.com/)
|
||||||
|
* セキュリティの観点から推奨されます。 yarn をインストールしない方針の場合は、文章中の `yarn` を適宜 `npx yarn` と読み替えてください。
|
||||||
* [Elasticsearch](https://www.elastic.co/)
|
* [Elasticsearch](https://www.elastic.co/)
|
||||||
* 検索機能を有効にするためにはインストールが必要です。
|
* 検索機能を有効にするためにはインストールが必要です。
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
@@ -51,7 +53,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
|
|
||||||
5. Misskeyの依存パッケージをインストール
|
5. Misskeyの依存パッケージをインストール
|
||||||
|
|
||||||
`npm install`
|
`yarn install`
|
||||||
|
|
||||||
*4.* 設定ファイルを作成する
|
*4.* 設定ファイルを作成する
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@@ -66,20 +68,19 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
|
|
||||||
次のコマンドでMisskeyをビルドしてください:
|
次のコマンドでMisskeyをビルドしてください:
|
||||||
|
|
||||||
`NODE_ENV=production npm run build`
|
`NODE_ENV=production yarn build`
|
||||||
|
|
||||||
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
|
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
|
||||||
|
|
||||||
何らかのモジュールでエラーが発生する場合はnode-gypを使ってください:
|
何らかのモジュールでエラーが発生する場合はnode-gypを使ってください:
|
||||||
1. `npm install -g node-gyp`
|
1. `npx node-gyp configure`
|
||||||
2. `node-gyp configure`
|
2. `npx node-gyp build`
|
||||||
3. `node-gyp build`
|
3. `NODE_ENV=production yarn build`
|
||||||
4. `NODE_ENV=production npm run build`
|
|
||||||
|
|
||||||
*6.* データベースを初期化
|
*6.* データベースを初期化
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
``` shell
|
``` shell
|
||||||
npm run init
|
yarn run init
|
||||||
```
|
```
|
||||||
|
|
||||||
*7.* 以上です!
|
*7.* 以上です!
|
||||||
@@ -87,7 +88,7 @@ npm run init
|
|||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
|
|
||||||
### 通常起動
|
### 通常起動
|
||||||
`NODE_ENV=production npm start`するだけです。GLHF!
|
`NODE_ENV=production yarn start`するだけです。GLHF!
|
||||||
|
|
||||||
### systemdを用いた起動
|
### systemdを用いた起動
|
||||||
1. systemdサービスのファイルを作成
|
1. systemdサービスのファイルを作成
|
||||||
@@ -120,7 +121,7 @@ npm run init
|
|||||||
|
|
||||||
3. systemdを再読み込みしmisskeyサービスを有効化
|
3. systemdを再読み込みしmisskeyサービスを有効化
|
||||||
|
|
||||||
`systemctl daemon-reload ; systemctl enable misskey`
|
`systemctl daemon-reload; systemctl enable misskey`
|
||||||
|
|
||||||
4. misskeyサービスの起動
|
4. misskeyサービスの起動
|
||||||
|
|
||||||
@@ -131,11 +132,11 @@ npm run init
|
|||||||
### Misskeyを最新バージョンにアップデートする方法:
|
### Misskeyを最新バージョンにアップデートする方法:
|
||||||
1. `git checkout master`
|
1. `git checkout master`
|
||||||
2. `git pull`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `yarn install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production yarn build`
|
||||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
5. `yarn migrate`
|
||||||
|
|
||||||
なにか問題が発生した場合は、`npm run clean`または`npm run cleanall`すると直る場合があります。
|
なにか問題が発生した場合は、`yarn clean`または`yarn cleanall`すると直る場合があります。
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -47,9 +47,14 @@ gulp.task('build:copy:views', () =>
|
|||||||
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
gulp.task('build:copy:fonts', () =>
|
||||||
|
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:fonts', () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./src/const.json',
|
'./src/const.json',
|
||||||
|
'./src/emojilist.json',
|
||||||
'./src/server/web/views/**/*',
|
'./src/server/web/views/**/*',
|
||||||
'./src/**/assets/**/*',
|
'./src/**/assets/**/*',
|
||||||
'!./src/client/app/**/assets/**/*'
|
'!./src/client/app/**/assets/**/*'
|
||||||
|
|||||||
8
index.js
8
index.js
@@ -1 +1,7 @@
|
|||||||
require('./built').default();
|
const fs = require('fs');
|
||||||
|
|
||||||
|
if (fs.existsSync('./built')) {
|
||||||
|
require('./built').default();
|
||||||
|
} else {
|
||||||
|
console.log('Built code is not found. Probably an error occurred during a build or you just forgot to build.');
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,9 +18,6 @@ common:
|
|||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
drive-desc: "Chcete sdílet obrázek, který jste již nahráli? Chcete vaše nahrané soubory organizovat, pojmenovávat a vytvářet pro ně složky? Misskey Disk je pro vás nejlepší řešení. Je velmi snadné sdílet vaše soubory online."
|
drive-desc: "Chcete sdílet obrázek, který jste již nahráli? Chcete vaše nahrané soubory organizovat, pojmenovávat a vytvářet pro ně složky? Misskey Disk je pro vás nejlepší řešení. Je velmi snadné sdílet vaše soubory online."
|
||||||
outro: "Podívejte se na unikátní vlastnosti Misskey vlastníma očima! Pokud si myslíte, že tato instance není pro vás, zkuste jiné instance, neboť Misskey je decentralizovaná sociální síť, takže můžete snadno najít své přátele. Hodně štěstí a zábavy!"
|
outro: "Podívejte se na unikátní vlastnosti Misskey vlastníma očima! Pokud si myslíte, že tato instance není pro vás, zkuste jiné instance, neboť Misskey je decentralizovaná sociální síť, takže můžete snadno najít své přátele. Hodně štěstí a zábavy!"
|
||||||
adblock:
|
|
||||||
detected: "Prosím vypněte svůj blokovač reklam"
|
|
||||||
warning: "Některé vlastnosti mohou být nedostupné nebo mohou způsobovat chyby, pokud máte povolený blokovač reklam. <strong>Misskey nepoužívá reklamy</strong>."
|
|
||||||
application-authorization: "Autorizované aplikace"
|
application-authorization: "Autorizované aplikace"
|
||||||
close: "Zavřít"
|
close: "Zavřít"
|
||||||
do-not-copy-paste: "Prosím nezadávejte ani nevkládejte sem kód. Váš účet může být kompromitován."
|
do-not-copy-paste: "Prosím nezadávejte ani nevkládejte sem kód. Váš účet může být kompromitován."
|
||||||
@@ -34,6 +31,20 @@ common:
|
|||||||
signup: "Registrovat"
|
signup: "Registrovat"
|
||||||
signout: "Odhlásit"
|
signout: "Odhlásit"
|
||||||
reload-to-apply-the-setting: "Pro uplatnění tohoto nastavení musíte znovu načíst tuto stránku. Chcete ji načíst teď?"
|
reload-to-apply-the-setting: "Pro uplatnění tohoto nastavení musíte znovu načíst tuto stránku. Chcete ji načíst teď?"
|
||||||
|
fetching-as-ap-object: "Načítám data z Fediversu..."
|
||||||
|
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
|
||||||
|
signin-required: "Přihlašte se, prosím"
|
||||||
|
notification-type: "Typy oznámení"
|
||||||
|
notification-types:
|
||||||
|
all: "Všechny"
|
||||||
|
pollVote: "Hlasy"
|
||||||
|
follow: "Sledovaní"
|
||||||
|
receiveFollowRequest: "Žádost o sledování"
|
||||||
|
reply: "Odpovědi"
|
||||||
|
quote: "Citace"
|
||||||
|
renote: "Renotovat"
|
||||||
|
mention: "Zmínky"
|
||||||
|
reaction: "Reakce"
|
||||||
got-it: "Rozumím!"
|
got-it: "Rozumím!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Tipy pro přizpůsobení"
|
title: "Tipy pro přizpůsobení"
|
||||||
@@ -89,10 +100,40 @@ common:
|
|||||||
"read:notifications": "Prohlížet oznámení"
|
"read:notifications": "Prohlížet oznámení"
|
||||||
"write:notifications": "Pracovat s oznámeními"
|
"write:notifications": "Pracovat s oznámeními"
|
||||||
"read:reactions": "Prohlížet reakce"
|
"read:reactions": "Prohlížet reakce"
|
||||||
|
"write:reactions": "Narabět s reakcemi"
|
||||||
"write:votes": "Hlasovat"
|
"write:votes": "Hlasovat"
|
||||||
|
"read:pages": "Zhlédnutí stránky"
|
||||||
|
"write:pages": "Upravit stránky"
|
||||||
|
"write:user-groups": "Upravit uživatelskou skupinu"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Poznámky sledujících se zobrazí ve vaší časové ose"
|
follow-users-to-make-your-timeline: "Poznámky sledujících se zobrazí ve vaší časové ose"
|
||||||
explore: "Najít uživatele"
|
explore: "Najít uživatele"
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "Přidat informace o lokaci"
|
||||||
|
hide-contents: "Schovat obsah"
|
||||||
|
reply-placeholder: "Odpovědět na tento příspěvek"
|
||||||
|
quote-placeholder: "Citovat tento příspěvek"
|
||||||
|
quote-attached: "Přiložit citaci"
|
||||||
|
submit: "Odeslat"
|
||||||
|
reply: "Odpovědět"
|
||||||
|
renote: "Renotovat"
|
||||||
|
posting: "Posílání"
|
||||||
|
attach-media-from-local: "Nahrát soubor z vašeho zařízení"
|
||||||
|
attach-media-from-drive: "Přiložit soubory z vašeho Drivu"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "Vytvořit anketu"
|
||||||
|
text-remain: "zbývá ještě {} znaků"
|
||||||
|
recent-tags: "Nejnovější"
|
||||||
|
local-only-message: "Publikovat zprávu pouze lokálně"
|
||||||
|
click-to-tagging: "Klikni pro otágování"
|
||||||
|
visibility: "Viditelnost"
|
||||||
|
geolocation-alert: "Vaše zařízení nedalo k dispozici lokaci"
|
||||||
|
error: "Chyba"
|
||||||
|
enter-username: "Zadejte své uživatelské jméno"
|
||||||
|
specified-recipient: "Pro"
|
||||||
|
add-visible-user: "Přidat uživatele"
|
||||||
|
username-prompt: "Zadejte své uživatelské jméno"
|
||||||
|
enter-file-name: "Upravit název souboru"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Ne"
|
sunday: "Ne"
|
||||||
monday: "Po"
|
monday: "Po"
|
||||||
@@ -152,6 +193,7 @@ common:
|
|||||||
other: "Ostatní"
|
other: "Ostatní"
|
||||||
appearance: "Vzhled"
|
appearance: "Vzhled"
|
||||||
behavior: "Chování"
|
behavior: "Chování"
|
||||||
|
reactions: "Reakce"
|
||||||
fetch-on-scroll: "Nekonečné načítaní posuvem"
|
fetch-on-scroll: "Nekonečné načítaní posuvem"
|
||||||
fetch-on-scroll-desc: "Pokud budete rolovat dolů po stránce, automaticky bude načten další obsah."
|
fetch-on-scroll-desc: "Pokud budete rolovat dolů po stránce, automaticky bude načten další obsah."
|
||||||
note-visibility: "Viditelnost příspěvku"
|
note-visibility: "Viditelnost příspěvku"
|
||||||
@@ -159,6 +201,9 @@ common:
|
|||||||
remember-note-visibility: "Zapamatovat viditelnost příspěvků"
|
remember-note-visibility: "Zapamatovat viditelnost příspěvků"
|
||||||
web-search-engine: "Webové vyhledávače"
|
web-search-engine: "Webové vyhledávače"
|
||||||
web-search-engine-desc: "Například: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Například: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "Vložit"
|
||||||
|
pasted-file-name-desc: "Například: \"rrrr-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "Upravit název vloženého souboru"
|
||||||
keep-cw: "Zachovat varování o obsahu"
|
keep-cw: "Zachovat varování o obsahu"
|
||||||
keep-cw-desc: "Při odpovědi na příspěvek bude varování o obsahu nastaveno stejně jako původní příspěvek."
|
keep-cw-desc: "Při odpovědi na příspěvek bude varování o obsahu nastaveno stejně jako původní příspěvek."
|
||||||
i-like-sushi: "Mam radši sushi (než puding)"
|
i-like-sushi: "Mam radši sushi (než puding)"
|
||||||
@@ -196,7 +241,7 @@ common:
|
|||||||
deck-column-width-wide: "Široké"
|
deck-column-width-wide: "Široké"
|
||||||
use-shadow: "Používat v rozhraní stíny"
|
use-shadow: "Používat v rozhraní stíny"
|
||||||
rounded-corners: "Zakulatit rohy v rozhraní"
|
rounded-corners: "Zakulatit rohy v rozhraní"
|
||||||
circle-icons: "Používat kulaté ikony"
|
circle-icons: "Používat kulaté avatary"
|
||||||
contrasted-acct: "Přidat uživatelskému účtu kontrast"
|
contrasted-acct: "Přidat uživatelskému účtu kontrast"
|
||||||
wallpaper: "Obrázek na pozadí"
|
wallpaper: "Obrázek na pozadí"
|
||||||
choose-wallpaper: "Zvolit pozadí"
|
choose-wallpaper: "Zvolit pozadí"
|
||||||
@@ -241,6 +286,18 @@ common:
|
|||||||
disable-via-mobile: "Neoznačovat příspěvky jako „z mobilu“"
|
disable-via-mobile: "Neoznačovat příspěvky jako „z mobilu“"
|
||||||
load-raw-images: "Zobrazovat obrázky v původní kvalitě"
|
load-raw-images: "Zobrazovat obrázky v původní kvalitě"
|
||||||
load-remote-media: "Zobrazovat média ze vzdáleného serveru"
|
load-remote-media: "Zobrazovat média ze vzdáleného serveru"
|
||||||
|
sync: "Synchronizace"
|
||||||
|
save: "Uložit"
|
||||||
|
saved: "Uloženo"
|
||||||
|
room: "Místnost"
|
||||||
|
_room:
|
||||||
|
graphicsQuality: "Kvalita grafiky"
|
||||||
|
_graphicsQuality:
|
||||||
|
ultra: "Nejvyšší"
|
||||||
|
high: "Vysoká"
|
||||||
|
medium: "Střední"
|
||||||
|
low: "Nízká"
|
||||||
|
cheep: "Nejnižší"
|
||||||
search: "Hledání"
|
search: "Hledání"
|
||||||
delete: "Odstranit"
|
delete: "Odstranit"
|
||||||
loading: "Načítám..."
|
loading: "Načítám..."
|
||||||
@@ -251,7 +308,7 @@ common:
|
|||||||
my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a."
|
my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a."
|
||||||
hide-password: "Skrýt heslo"
|
hide-password: "Skrýt heslo"
|
||||||
show-password: "Zobrazit heslo"
|
show-password: "Zobrazit heslo"
|
||||||
enter-username: "Zadejte uživatelské jméno"
|
enter-username: "Zadejte své uživatelské jméno"
|
||||||
do-not-use-in-production: "Tohle je vývojářský build. Nepoužívejte v produkci."
|
do-not-use-in-production: "Tohle je vývojářský build. Nepoužívejte v produkci."
|
||||||
user-suspended: "Tomuto uživateli byl pozastaven účet."
|
user-suspended: "Tomuto uživateli byl pozastaven účet."
|
||||||
is-remote-user: "Informace o tomto uživateli nemusí být kompletní."
|
is-remote-user: "Informace o tomto uživateli nemusí být kompletní."
|
||||||
@@ -308,7 +365,10 @@ auth/views/form.vue:
|
|||||||
accept: "Povolit přístup"
|
accept: "Povolit přístup"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "Načítám..."
|
loading: "Načítám..."
|
||||||
|
denied-paragraph: "Tato aplikace nebude mít přístup k Vašemu účtu."
|
||||||
already-authorized: "Tato aplikace byla již autorizována."
|
already-authorized: "Tato aplikace byla již autorizována."
|
||||||
|
callback-url: "Zpátky do aplikace."
|
||||||
|
please-go-back: "Prosím vraťte se zpátky do aplikace."
|
||||||
error: "Taková relace neexistuje."
|
error: "Taková relace neexistuje."
|
||||||
sign-in: "Prosím přihlaste se."
|
sign-in: "Prosím přihlaste se."
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
@@ -330,7 +390,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "Vzdát se"
|
surrender: "Vzdát se"
|
||||||
|
surrendered: "Vzdaním se"
|
||||||
looped-map: "Zacyklená mapa"
|
looped-map: "Zacyklená mapa"
|
||||||
|
can-put-everywhere: "Lze položit kamkoliv"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Hrajte Reversi s Vašimi kamarády!"
|
sub-title: "Hrajte Reversi s Vašimi kamarády!"
|
||||||
@@ -358,23 +420,34 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
waiting-for-both: "Připravuji"
|
waiting-for-both: "Připravuji"
|
||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
ready: "Připraveno"
|
ready: "Připraveno"
|
||||||
|
cancel-ready: "Pokračovat v přípravě"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "Nelze se připojit k serveru"
|
title: "Nelze se připojit k serveru"
|
||||||
description: "Nastal problém s Vaším připojením k internetu, nebo server není dostupný nebo zrovna probíhá údržba. Prosím {zkuste to znova} za pár minut."
|
description: "Nastal problém s Vaším připojením k internetu, nebo server není dostupný nebo zrovna probíhá údržba. Prosím {zkuste to znova} za pár minut."
|
||||||
thanks: "Děkujeme že jste použili Misskey."
|
thanks: "Děkujeme že jste použili Misskey."
|
||||||
|
troubleshoot: "Odstranění problémů"
|
||||||
common/views/components/connect-failed.troubleshooter.vue:
|
common/views/components/connect-failed.troubleshooter.vue:
|
||||||
|
title: "Poradce při potížích"
|
||||||
network: "Síťové připojení"
|
network: "Síťové připojení"
|
||||||
checking-network: "Prověřit síťové připojení"
|
checking-network: "Prověřit síťové připojení"
|
||||||
internet: "Připojení k internetu"
|
internet: "Připojení k internetu"
|
||||||
checking-internet: "Ověřuji připojení k internetu."
|
checking-internet: "Ověřuji připojení k internetu."
|
||||||
server: "Připojení k serveru"
|
server: "Připojení k serveru"
|
||||||
|
checking-server: "Spojuji se se serverem"
|
||||||
|
finding: "Vyšetřování problému"
|
||||||
|
no-network: "Žádné připojení k síti"
|
||||||
no-network-desc: "Ujistěte se že jste připojeni k Internetu."
|
no-network-desc: "Ujistěte se že jste připojeni k Internetu."
|
||||||
no-internet: "Nejste připojeni k internetu"
|
no-internet: "Nejste připojeni k internetu"
|
||||||
no-internet-desc: "Jste připojen k síti, ale zdá se že stále chybí připojení k Internetu. Prosím zkontrolujte Vaše připojení k Internetu."
|
no-internet-desc: "Jste připojen k síti, ale zdá se že stále chybí připojení k Internetu. Prosím zkontrolujte Vaše připojení k Internetu."
|
||||||
no-server: "Nelze se připojit k serveru Misskey"
|
no-server: "Nelze se připojit k serveru Misskey"
|
||||||
|
success: "Úspěšně se podařilo spojit s Misskey serverem"
|
||||||
|
flush: "Vyčistit mezipaměť"
|
||||||
|
set-version: "Vyberte verzi"
|
||||||
common/views/components/media-banner.vue:
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "Choulostivý obsah"
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
|
theme: "Vzhled"
|
||||||
light-theme: "Motiv pro použití ve světlém vzhledu"
|
light-theme: "Motiv pro použití ve světlém vzhledu"
|
||||||
dark-theme: "Motiv pro použití v tmavém vzhledu"
|
dark-theme: "Motiv pro použití v tmavém vzhledu"
|
||||||
light-themes: "Světlý vzhled"
|
light-themes: "Světlý vzhled"
|
||||||
@@ -385,6 +458,7 @@ common/views/components/theme.vue:
|
|||||||
installed: "\"{}\" byl nainstalován"
|
installed: "\"{}\" byl nainstalován"
|
||||||
create-a-theme: "Vytvořit motiv"
|
create-a-theme: "Vytvořit motiv"
|
||||||
save-created-theme: "Uložit motiv"
|
save-created-theme: "Uložit motiv"
|
||||||
|
primary-color: "Základní barva"
|
||||||
text-color: "Barva textu"
|
text-color: "Barva textu"
|
||||||
base-theme: "Základní vzhled"
|
base-theme: "Základní vzhled"
|
||||||
base-theme-light: "Světlý"
|
base-theme-light: "Světlý"
|
||||||
@@ -392,8 +466,10 @@ common/views/components/theme.vue:
|
|||||||
find-more-theme: "Najít další vzhledy"
|
find-more-theme: "Najít další vzhledy"
|
||||||
theme-name: "Jméno vzhledu"
|
theme-name: "Jméno vzhledu"
|
||||||
preview-created-theme: "Náhled"
|
preview-created-theme: "Náhled"
|
||||||
|
invalid-theme: "Vzhled není validní"
|
||||||
already-installed: "Tento vzhled je již nainstalován."
|
already-installed: "Tento vzhled je již nainstalován."
|
||||||
saved: "Uloženo"
|
saved: "Uloženo"
|
||||||
|
manage-themes: "Správa vzhledů"
|
||||||
builtin-themes: "Standardní vzhledy"
|
builtin-themes: "Standardní vzhledy"
|
||||||
my-themes: "Moje vzhledy"
|
my-themes: "Moje vzhledy"
|
||||||
installed-themes: "Nainstalované vzhledy"
|
installed-themes: "Nainstalované vzhledy"
|
||||||
@@ -404,6 +480,7 @@ common/views/components/theme.vue:
|
|||||||
desc: "Popis"
|
desc: "Popis"
|
||||||
export: "Exportovat"
|
export: "Exportovat"
|
||||||
import: "Importovat"
|
import: "Importovat"
|
||||||
|
import-by-code: "nebo zkopírujte kód"
|
||||||
theme-name-required: "Jméno vzhledu je povinné"
|
theme-name-required: "Jméno vzhledu je povinné"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "Skrýt"
|
hide: "Skrýt"
|
||||||
@@ -416,9 +493,14 @@ common/views/components/messaging.vue:
|
|||||||
you: "Vy"
|
you: "Vy"
|
||||||
no-history: "Žádná historie"
|
no-history: "Žádná historie"
|
||||||
user: "Uživatel"
|
user: "Uživatel"
|
||||||
|
group: "Skupina"
|
||||||
|
start-with-user: "Zahájit konverzaci s uživatelem"
|
||||||
|
start-with-group: "Zahájit skupinovou konverzaci"
|
||||||
|
select-group: "Vybrat skupinu"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
new-message: "Máte novou zprávu"
|
new-message: "Máte novou zprávu"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
|
input-message-here: "Sem zadejte zprávu"
|
||||||
send: "Odeslat"
|
send: "Odeslat"
|
||||||
attach-from-local: "Přiložit soubory z Vašeho zařízení"
|
attach-from-local: "Přiložit soubory z Vašeho zařízení"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
@@ -433,6 +515,7 @@ common/views/components/nav.vue:
|
|||||||
repository: "Úložiště"
|
repository: "Úložiště"
|
||||||
develop: "Vývojáři"
|
develop: "Vývojáři"
|
||||||
feedback: "Zpětná vazba"
|
feedback: "Zpětná vazba"
|
||||||
|
tos: "Podmínky užívání"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
mention: "Zmínění"
|
mention: "Zmínění"
|
||||||
detail: "Více"
|
detail: "Více"
|
||||||
@@ -446,6 +529,7 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "Odepnout"
|
unpin: "Odepnout"
|
||||||
delete: "Odstranit"
|
delete: "Odstranit"
|
||||||
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
|
delete-confirm: "Opravdu chcete smazat tento příspěvek?"
|
||||||
|
delete-and-edit: "Smazat a upravit"
|
||||||
remote: "Ukázat originální poznámku"
|
remote: "Ukázat originální poznámku"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "Zmínění"
|
mention: "Zmínění"
|
||||||
@@ -476,17 +560,22 @@ common/views/components/poll-editor.vue:
|
|||||||
remove: "Odstranit tuto možnost"
|
remove: "Odstranit tuto možnost"
|
||||||
add: "+ Přidat možnost"
|
add: "+ Přidat možnost"
|
||||||
destroy: "Zahodit dotazník"
|
destroy: "Zahodit dotazník"
|
||||||
|
multiple: "Více odpovědí je povoleno"
|
||||||
expiration: "Termín"
|
expiration: "Termín"
|
||||||
infinite: "Nekonečne"
|
infinite: "Nekonečne"
|
||||||
at: "Výběr data a času"
|
at: "Výběr data a času"
|
||||||
|
no-more: "Více už přidat nemůžete"
|
||||||
deadline-date: "Termín ukončení"
|
deadline-date: "Termín ukončení"
|
||||||
|
deadline-time: "Doba trvání"
|
||||||
interval: "Trvání"
|
interval: "Trvání"
|
||||||
|
unit: "Jednotka"
|
||||||
second: "Sekunda"
|
second: "Sekunda"
|
||||||
minute: "Minuta"
|
minute: "Minuta"
|
||||||
hour: "Hodina"
|
hour: "Hodina"
|
||||||
day: "Ne"
|
day: "Ne"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Vyberte svoji reakci"
|
choose-reaction: "Vyberte svoji reakci"
|
||||||
|
input-reaction-placeholder: "nebo vložte Emoji"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "Emoji"
|
custom-emoji: "Emoji"
|
||||||
people: "Lidé"
|
people: "Lidé"
|
||||||
@@ -497,15 +586,25 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objekty"
|
objects: "Objekty"
|
||||||
symbols: "Symboly"
|
symbols: "Symboly"
|
||||||
flags: "Vlajky"
|
flags: "Vlajky"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "Režim"
|
||||||
|
intro: "Můžete vybrat zdali chcete použít stolní, nebo mobilní vzhled."
|
||||||
|
choices:
|
||||||
|
auto: "Vybrat vzhled automaticky"
|
||||||
|
desktop: "Vždy použít stolní vzhled"
|
||||||
|
mobile: "Vždy použít mobilní vzhled"
|
||||||
|
info: "Pro aktivování změn musíte znovu načíst stránky."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Přezdívka"
|
username: "Přezdívka"
|
||||||
password: "Heslo"
|
password: "Heslo"
|
||||||
|
token: "Token"
|
||||||
signing-in: "Přihlašování..."
|
signing-in: "Přihlašování..."
|
||||||
or: "Nebo"
|
or: "Nebo"
|
||||||
signin-with-twitter: "Přihlásit se pomocí účtu Twitter"
|
signin-with-twitter: "Přihlásit se pomocí účtu Twitter"
|
||||||
signin-with-github: "Přihlásit se pomocí účtu GitHub"
|
signin-with-github: "Přihlásit se pomocí účtu GitHub"
|
||||||
signin-with-discord: "Přihlásit se pomocí účtu Discord"
|
signin-with-discord: "Přihlásit se pomocí účtu Discord"
|
||||||
login-failed: "Nelze se přihlásit. Zkontrolujte prosím své uživatelské jméno a heslo."
|
login-failed: "Nelze se přihlásit. Zkontrolujte prosím své uživatelské jméno a heslo."
|
||||||
|
enter-2fa-code: "Vložte Váš verifikační kód"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "Kód pozvánky"
|
invitation-code: "Kód pozvánky"
|
||||||
invitation-info: "Pokud máte pozvánku, prosím kontaktujte <a href=\"{}\">administrátora</a>."
|
invitation-info: "Pokud máte pozvánku, prosím kontaktujte <a href=\"{}\">administrátora</a>."
|
||||||
@@ -527,6 +626,8 @@ common/views/components/signup.vue:
|
|||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
password-not-matched: "Neshodují se"
|
password-not-matched: "Neshodují se"
|
||||||
recaptcha: "Potvrzení"
|
recaptcha: "Potvrzení"
|
||||||
|
agree-to: "Souhlasím s {0}."
|
||||||
|
tos: "Podmínky užívání"
|
||||||
create: "Vytvořit účet"
|
create: "Vytvořit účet"
|
||||||
some-error: "Pokus o vytvoření účtu selhal. Prosím zkuste to znovu."
|
some-error: "Pokus o vytvoření účtu selhal. Prosím zkuste to znovu."
|
||||||
common/views/components/special-message.vue:
|
common/views/components/special-message.vue:
|
||||||
@@ -542,8 +643,10 @@ common/views/components/notification-settings.vue:
|
|||||||
mark-as-read-all-unread-notes: "Označit všechny příspěvky za přečtené"
|
mark-as-read-all-unread-notes: "Označit všechny příspěvky za přečtené"
|
||||||
mark-as-read-all-talk-messages: "Označit všechny zprávy za přečtené"
|
mark-as-read-all-talk-messages: "Označit všechny zprávy za přečtené"
|
||||||
common/views/components/integration-settings.vue:
|
common/views/components/integration-settings.vue:
|
||||||
|
title: "Integrace"
|
||||||
connect: "Připojit"
|
connect: "Připojit"
|
||||||
disconnect: "Odpojit"
|
disconnect: "Odpojit"
|
||||||
|
connected-to: "Jste připojen k tomuto GitHub účtu"
|
||||||
common/views/components/github-setting.vue:
|
common/views/components/github-setting.vue:
|
||||||
description: "Jakmile spojíte Váš GitHub účet s Vaším Misskey účtem, uvidíte informace o Vašem GitHub účtu na Vašem profilu a budete se moci přihlásit skrze GitHub."
|
description: "Jakmile spojíte Váš GitHub účet s Vaším Misskey účtem, uvidíte informace o Vašem GitHub účtu na Vašem profilu a budete se moci přihlásit skrze GitHub."
|
||||||
connected-to: "Je připojen k tomuto GitHub účtu"
|
connected-to: "Je připojen k tomuto GitHub účtu"
|
||||||
@@ -563,8 +666,11 @@ common/views/components/uploader.vue:
|
|||||||
common/views/components/visibility-chooser.vue:
|
common/views/components/visibility-chooser.vue:
|
||||||
public: "Veřejné"
|
public: "Veřejné"
|
||||||
home: "Domů"
|
home: "Domů"
|
||||||
|
home-desc: "Poslat pouze na domovskou časovou osu"
|
||||||
|
specified: "Přímá"
|
||||||
specified-desc: "Poslat pouze zmíněným uživatelům"
|
specified-desc: "Poslat pouze zmíněným uživatelům"
|
||||||
local-public: "Veřejná (pouze místní)"
|
local-public: "Veřejná (pouze místní)"
|
||||||
|
local-public-desc: "Nepublikovat na vzdálených serverech"
|
||||||
local-home: "Domovská (pouze místní)"
|
local-home: "Domovská (pouze místní)"
|
||||||
local-followers: "Pro sledující (pouze místní)"
|
local-followers: "Pro sledující (pouze místní)"
|
||||||
common/views/components/trends.vue:
|
common/views/components/trends.vue:
|
||||||
@@ -574,6 +680,8 @@ common/views/components/language-settings.vue:
|
|||||||
title: "Zobrazit jazyky"
|
title: "Zobrazit jazyky"
|
||||||
pick-language: "Zvolte jazyk"
|
pick-language: "Zvolte jazyk"
|
||||||
recommended: "Doporučené"
|
recommended: "Doporučené"
|
||||||
|
auto: "Automaticky"
|
||||||
|
specify-language: "Vyberte jazyk"
|
||||||
info: "Pro aktivování změn musíte znovu načíst stránky."
|
info: "Pro aktivování změn musíte znovu načíst stránky."
|
||||||
common/views/components/profile-editor.vue:
|
common/views/components/profile-editor.vue:
|
||||||
title: "Profil"
|
title: "Profil"
|
||||||
@@ -594,12 +702,14 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Profil byl úspěšně aktualizován"
|
saved: "Profil byl úspěšně aktualizován"
|
||||||
uploading: "Nahrávám"
|
uploading: "Nahrávám"
|
||||||
upload-failed: "Nahrávání selhalo"
|
upload-failed: "Nahrávání selhalo"
|
||||||
|
unable-to-process: "Operace nemohla být dokončena."
|
||||||
email: "Nastavení e-mailů"
|
email: "Nastavení e-mailů"
|
||||||
email-address: "Emailová adresa"
|
email-address: "Emailová adresa"
|
||||||
email-verified: "Váš e-mail byl ověřen"
|
email-verified: "Váš e-mail byl ověřen"
|
||||||
email-not-verified: "Váš email není potvrzen. Prosím zkontrolujte si svou schránku."
|
email-not-verified: "Váš email není potvrzen. Prosím zkontrolujte si svou schránku."
|
||||||
export: "Exportovat"
|
export: "Exportovat"
|
||||||
import: "Importovat"
|
import: "Importovat"
|
||||||
|
export-and-import: "Import / Export"
|
||||||
export-targets:
|
export-targets:
|
||||||
following-list: "Seznam sledujících"
|
following-list: "Seznam sledujících"
|
||||||
mute-list: "Seznam ztlumených uživatelů"
|
mute-list: "Seznam ztlumených uživatelů"
|
||||||
@@ -609,6 +719,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "Nebezpečná zóna"
|
danger-zone: "Nebezpečná zóna"
|
||||||
delete-account: "Smazat účet"
|
delete-account: "Smazat účet"
|
||||||
account-deleted: "Váš účet byl smazán. Může chvilku trvat než zmizí všechna data."
|
account-deleted: "Váš účet byl smazán. Může chvilku trvat než zmizí všechna data."
|
||||||
|
profile-metadata: "Metadata profilu"
|
||||||
|
metadata-label: "Popis"
|
||||||
|
metadata-content: "Obsah"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Uživatel"
|
users: "Uživatel"
|
||||||
rename: "Přejmenovat seznam"
|
rename: "Přejmenovat seznam"
|
||||||
@@ -618,16 +731,35 @@ common/views/components/user-list-editor.vue:
|
|||||||
deleted: "Smazáno"
|
deleted: "Smazáno"
|
||||||
add-user: "Přidat uživatele"
|
add-user: "Přidat uživatele"
|
||||||
common/views/components/user-group-editor.vue:
|
common/views/components/user-group-editor.vue:
|
||||||
|
users: "Členové"
|
||||||
|
rename: "Přejmenovat skupinu"
|
||||||
|
delete: "Odstranit skupinu"
|
||||||
|
transfer: "Přesunout skupinu"
|
||||||
|
transfer-are-you-sure: "Jste si jistí že chcete přidat @$2 do skupiny: $1?"
|
||||||
|
transferred: "Skupina přesunuta"
|
||||||
|
remove-user: "Odebrat uživatele z této skupiny"
|
||||||
|
delete-are-you-sure: "Jste si jistí že chcete smazat skupinu \"$1\"?"
|
||||||
deleted: "Smazáno"
|
deleted: "Smazáno"
|
||||||
invite: "Pozvat"
|
invite: "Pozvat"
|
||||||
|
invited: "Pozvánka byla úspěšně odeslána"
|
||||||
common/views/components/user-lists.vue:
|
common/views/components/user-lists.vue:
|
||||||
user-lists: "Seznamy"
|
user-lists: "Seznamy"
|
||||||
|
create-list: "Vytvořit seznam"
|
||||||
list-name: "Název seznamu"
|
list-name: "Název seznamu"
|
||||||
common/views/components/user-groups.vue:
|
common/views/components/user-groups.vue:
|
||||||
|
user-groups: "Skupiny"
|
||||||
|
create-group: "Vytvořit skupinu"
|
||||||
|
group-name: "Název skupiny"
|
||||||
|
owned-groups: "Moje skupiny"
|
||||||
invites: "Pozvat"
|
invites: "Pozvat"
|
||||||
|
accept-invite: "Přidat se"
|
||||||
|
reject-invite: "Odmítnout"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Načítám"
|
fetching: "Načítám"
|
||||||
|
no-broadcasts: "Žádná nová oznámení"
|
||||||
|
have-a-nice-day: "Přejeme Vám příjemný den!"
|
||||||
next: "Další"
|
next: "Další"
|
||||||
|
prev: "Předchozí"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "Rok {}"
|
year: "Rok {}"
|
||||||
month: "{},"
|
month: "{},"
|
||||||
@@ -636,6 +768,7 @@ common/views/widgets/calendar.vue:
|
|||||||
this-month: "Měsíc:"
|
this-month: "Měsíc:"
|
||||||
this-year: "Rok:"
|
this-year: "Rok:"
|
||||||
common/views/widgets/photo-stream.vue:
|
common/views/widgets/photo-stream.vue:
|
||||||
|
title: "Foto stream"
|
||||||
no-photos: "Žádné obrázky"
|
no-photos: "Žádné obrázky"
|
||||||
common/views/widgets/posts-monitor.vue:
|
common/views/widgets/posts-monitor.vue:
|
||||||
title: "Grafy příspěvků"
|
title: "Grafy příspěvků"
|
||||||
@@ -651,14 +784,23 @@ common/views/widgets/memo.vue:
|
|||||||
save: "Uložit"
|
save: "Uložit"
|
||||||
common/views/widgets/slideshow.vue:
|
common/views/widgets/slideshow.vue:
|
||||||
no-image: "V této složce nebyly nalezeny žádné fotky."
|
no-image: "V této složce nebyly nalezeny žádné fotky."
|
||||||
|
common/views/widgets/tips.vue:
|
||||||
|
tips-line23: "Ai-chan kawaii!"
|
||||||
common/views/pages/not-found.vue:
|
common/views/pages/not-found.vue:
|
||||||
page-not-found: "Stránka nenalezena"
|
page-not-found: "Stránka nenalezena"
|
||||||
|
common/views/pages/follow.vue:
|
||||||
|
following: "Sledování"
|
||||||
|
follow: "Sledovat"
|
||||||
|
common/views/pages/follow-requests.vue:
|
||||||
|
accept: "Přijmout"
|
||||||
|
reject: "Odmítnout"
|
||||||
desktop:
|
desktop:
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
avatar-crop-title: "Vyberte část, která se zobrazí jako avatar"
|
avatar-crop-title: "Vyberte část, která se zobrazí jako avatar"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
uploading-avatar: "Nahrál nový avatar"
|
uploading-avatar: "Nahrál nový avatar"
|
||||||
avatar-updated: "Vaše avatar byl aktualizován"
|
avatar-updated: "Vaše avatar byl aktualizován"
|
||||||
|
unable-to-process: "Operace nemohla být dokončena."
|
||||||
invalid-filetype: "Tento formát souboru není podporován"
|
invalid-filetype: "Tento formát souboru není podporován"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Černá ... Celkem"
|
total: "Černá ... Celkem"
|
||||||
@@ -695,7 +837,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
rename: "Přejmenovat"
|
rename: "Přejmenovat"
|
||||||
copy-url: "Kopírovat URL"
|
copy-url: "Kopírovat URL"
|
||||||
download: "Stáhnout"
|
download: "Stáhnout"
|
||||||
else-files: "Více..."
|
else-files: "Ostatní"
|
||||||
set-as-avatar: "Nastavit jako avatar"
|
set-as-avatar: "Nastavit jako avatar"
|
||||||
set-as-banner: "Nastavit jako baner"
|
set-as-banner: "Nastavit jako baner"
|
||||||
open-in-app: "Otevřít v aplikaci"
|
open-in-app: "Otevřít v aplikaci"
|
||||||
@@ -713,7 +855,9 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Přejmenovat"
|
rename: "Přejmenovat"
|
||||||
rename-folder: "Přejmenovat složku"
|
rename-folder: "Přejmenovat složku"
|
||||||
input-new-folder-name: "Zadejte nové jméno"
|
input-new-folder-name: "Zadejte nové jméno"
|
||||||
|
else-folders: "Ostatní"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
|
search: "Vyhledávání"
|
||||||
empty-drive-description: "Klikněte pravým tlačítkem myši pro otevření menu, nebo sem přetáhněte soubor pro nahrání."
|
empty-drive-description: "Klikněte pravým tlačítkem myši pro otevření menu, nebo sem přetáhněte soubor pro nahrání."
|
||||||
empty-folder: "Tato složka je prázdná"
|
empty-folder: "Tato složka je prázdná"
|
||||||
unable-to-process: "Operace nemohla být dokončena."
|
unable-to-process: "Operace nemohla být dokončena."
|
||||||
@@ -729,10 +873,13 @@ desktop/views/components/drive.vue:
|
|||||||
url-upload: "Nahrát z URL"
|
url-upload: "Nahrát z URL"
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
|
desktop/views/components/followers.vue:
|
||||||
|
empty: "Vypadá to že Vás nikdo nesleduje."
|
||||||
desktop/views/components/game-window.vue:
|
desktop/views/components/game-window.vue:
|
||||||
game: "Reversi"
|
game: "Reversi"
|
||||||
desktop/views/components/home.vue:
|
desktop/views/components/home.vue:
|
||||||
done: "Hotovo"
|
done: "Hotovo"
|
||||||
|
add-widget: "Přidat widget:"
|
||||||
add: "Přidat"
|
add: "Přidat"
|
||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
@@ -740,6 +887,7 @@ desktop/views/input-dialog.vue:
|
|||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "Tento příspěvek je soukromý"
|
private: "Tento příspěvek je soukromý"
|
||||||
deleted: "Tento příspěvek byl odstraněn"
|
deleted: "Tento příspěvek byl odstraněn"
|
||||||
|
location: "Lokace"
|
||||||
renote: "Renotovat"
|
renote: "Renotovat"
|
||||||
add-reaction: "Přidat reakci"
|
add-reaction: "Přidat reakci"
|
||||||
undo-reaction: "Odebrat reakci"
|
undo-reaction: "Odebrat reakci"
|
||||||
@@ -754,28 +902,14 @@ desktop/views/components/note.vue:
|
|||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "Načítání selhalo."
|
error: "Načítání selhalo."
|
||||||
retry: "Opakovat"
|
retry: "Opakovat"
|
||||||
|
desktop/views/components/notifications.vue:
|
||||||
|
empty: "Žádné nové notifikace!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Přidat uživatele"
|
|
||||||
attach-location-information: "Přidat informace o lokaci"
|
|
||||||
hide-contents: "Schovat obsah"
|
|
||||||
reply-placeholder: "Odpovědět na tento příspěvěk"
|
|
||||||
quote-placeholder: "Citovat tento příspěvek"
|
|
||||||
submit: "Příspěvek"
|
|
||||||
reply: "Odpovědět"
|
|
||||||
renote: "Renotovat"
|
|
||||||
posted: "Odesláno!"
|
posted: "Odesláno!"
|
||||||
replied: "Odpověděno!"
|
replied: "Odpověděno!"
|
||||||
reposted: "Renotováno!"
|
reposted: "Renotováno!"
|
||||||
note-failed: "Nepodařilo se přidat příspěvek"
|
note-failed: "Nepodařilo se přidat příspěvek"
|
||||||
renote-failed: "Renotování neuspělo"
|
renote-failed: "Renotování neuspělo"
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Vytvořit anketu"
|
|
||||||
text-remain: "{0} znaků zbývá"
|
|
||||||
recent-tags: "Nejnovější"
|
|
||||||
visibility: "Viditelnost"
|
|
||||||
geolocation-alert: "Vaše zařízení nepodporuje lokační službu"
|
|
||||||
error: "Chyba"
|
|
||||||
enter-username: "Zadejte své uživatelské jméno..."
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nový příspěvek"
|
note: "Nový příspěvek"
|
||||||
reply: "Odpovědět"
|
reply: "Odpovědět"
|
||||||
@@ -794,9 +928,29 @@ desktop/views/components/renote-form-window.vue:
|
|||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
detail: "Více…"
|
detail: "Více…"
|
||||||
url: "https://www.google.cz/landing/2step/"
|
url: "https://www.google.cz/landing/2step/"
|
||||||
|
register: "Přidat zařízení"
|
||||||
|
already-registered: "Toto zařízení je již připojené"
|
||||||
|
unregister: "Odebrat"
|
||||||
|
enter-password: "Prosím zadejte heslo"
|
||||||
|
authenticator: "Nejprve musíte nainstalovat Google Authenticator na Vašem zařízení:"
|
||||||
|
howtoinstall: "Jak nainstalovat"
|
||||||
|
token: "Token"
|
||||||
|
scan: "Poté naskenujte QR kód:"
|
||||||
|
done: "Prosím vložte kód zobrazený na Vašem zařízení:"
|
||||||
|
submit: "Uložit"
|
||||||
|
success: "Nastavení uloženo!"
|
||||||
|
failed: "Nepodařilo se spárovat. Prosím zkontrolujte správnost bezpečnostního kódu."
|
||||||
|
totp-header: "Ověřovací aplikace"
|
||||||
|
security-key-header: "Bezpečnostní klíč"
|
||||||
|
last-used: "Naposledy použito:"
|
||||||
|
activate-key: "Klikněte pro aktivaci bezpečnostního klíče"
|
||||||
|
security-key-name: "Název klíče"
|
||||||
|
key-unregistered: "Bezpečnostní klíč byl odstraněn"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
|
sensitive: "NSFW"
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
|
caution: "Nepoužívejte tento kód v žádné jiné aplikace nebo ho sdílejte s ostatními (jinak můžete ohrozit svojí bezpečnost)."
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Prosím zadejte heslo"
|
enter-password: "Prosím zadejte heslo"
|
||||||
console:
|
console:
|
||||||
@@ -850,7 +1004,9 @@ desktop/views/components/ui.header.vue:
|
|||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Váš profil"
|
profile: "Váš profil"
|
||||||
lists: "Seznamy"
|
lists: "Seznamy"
|
||||||
|
groups: "Skupiny"
|
||||||
admin: "Administrace"
|
admin: "Administrace"
|
||||||
|
room: "Místnost"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "Hry"
|
game: "Hry"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
@@ -876,15 +1032,48 @@ admin/views/index.vue:
|
|||||||
announcements: "Oznámení"
|
announcements: "Oznámení"
|
||||||
queue: "Fronta úloh"
|
queue: "Fronta úloh"
|
||||||
logs: "Logy"
|
logs: "Logy"
|
||||||
|
db: "Databáze"
|
||||||
back-to-misskey: "Zpět na Misskey"
|
back-to-misskey: "Zpět na Misskey"
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "Tabulky"
|
||||||
|
vacuum: "Vysavač"
|
||||||
|
vacuum-info: "Uklidí databázi. Neohrozí data a sníží využití disku. Tohle se děje automaticky a opakovaně."
|
||||||
|
vacuum-exclamation: "Vysavač může dočasně přetížit databázi a dočasně omezit akce uživatelů."
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
|
dashboard: "Kontrolní panel"
|
||||||
accounts: "Účty"
|
accounts: "Účty"
|
||||||
notes: "Poznámky"
|
notes: "Poznámky"
|
||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
instances: "Instance"
|
instances: "Instance"
|
||||||
this-instance: "Tato instance"
|
this-instance: "Tato instance"
|
||||||
federated: "Z fedivesmíru"
|
federated: "Z fedivesmíru"
|
||||||
|
admin/views/queue.vue:
|
||||||
|
title: "Ve frontě"
|
||||||
|
remove-all-jobs: "Vyčistit frontu"
|
||||||
|
jobs: "Úkoly"
|
||||||
|
queue: "Ve frontě"
|
||||||
|
domains:
|
||||||
|
inbox: "Obdržené"
|
||||||
|
db: "Databáze"
|
||||||
|
states:
|
||||||
|
active: "V procesu"
|
||||||
|
delayed: "Naplánováno"
|
||||||
|
waiting: "Ve frontě"
|
||||||
|
result-is-truncated: "Zkrácený výsledek"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Logy"
|
||||||
|
domain: "Doména"
|
||||||
|
level: "Úroveň"
|
||||||
|
levels:
|
||||||
|
all: "Vše"
|
||||||
|
info: "Informace"
|
||||||
|
success: "Podařilo se"
|
||||||
|
warning: "Varování"
|
||||||
|
error: "Chyba"
|
||||||
|
debug: "Debug"
|
||||||
|
delete-all: "Smazat vše"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
|
target: "Cíl"
|
||||||
details: "Popis"
|
details: "Popis"
|
||||||
remove-report: "Odstranit"
|
remove-report: "Odstranit"
|
||||||
admin/views/instance.vue:
|
admin/views/instance.vue:
|
||||||
@@ -892,17 +1081,33 @@ admin/views/instance.vue:
|
|||||||
instance-name: "Název instance"
|
instance-name: "Název instance"
|
||||||
instance-description: "Popis instance"
|
instance-description: "Popis instance"
|
||||||
host: "Hostitel"
|
host: "Hostitel"
|
||||||
|
icon-url: "URL ikonky"
|
||||||
|
logo-url: "URL loga"
|
||||||
banner-url: "URL pro baner"
|
banner-url: "URL pro baner"
|
||||||
|
error-image-url: "URL pro chybový obrázek"
|
||||||
languages: "Jazyk této instance"
|
languages: "Jazyk této instance"
|
||||||
languages-desc: "Můžete nastavit více než jeden, oddělte mezerami."
|
languages-desc: "Můžete nastavit více než jeden, oddělte mezerami."
|
||||||
|
tos-url: "URL pro smluvní podmínky"
|
||||||
|
repository-url: "URL adresa repositáře"
|
||||||
|
feedback-url: "URL pro zpětnou vazbu"
|
||||||
maintainer-config: "Informace o administrátorovi"
|
maintainer-config: "Informace o administrátorovi"
|
||||||
maintainer-name: "Jméno administrátora"
|
maintainer-name: "Jméno administrátora"
|
||||||
maintainer-email: "Kontakt na administrátora"
|
maintainer-email: "Kontakt na administrátora"
|
||||||
|
advanced-config: "Další nastavení"
|
||||||
|
object-storage-base-url: "URL"
|
||||||
|
object-storage-prefix: "Předpona"
|
||||||
object-storage-endpoint: "Endpoint"
|
object-storage-endpoint: "Endpoint"
|
||||||
|
object-storage-region: "Region"
|
||||||
|
object-storage-port: "Port"
|
||||||
|
object-storage-access-key: "Přístupový klíč"
|
||||||
|
object-storage-secret-key: "Tajný Klíč (Secret Key)"
|
||||||
|
object-storage-use-ssl: "Použít SSL"
|
||||||
|
object-storage-s3-info-here: "zde"
|
||||||
mb: "V megabajtech"
|
mb: "V megabajtech"
|
||||||
recaptcha-config: "nastavení služby reCAPTCHA"
|
recaptcha-config: "nastavení služby reCAPTCHA"
|
||||||
recaptcha-info: "reCAPTCHA token je povinný. Můžete jej získat na https://www.google.com/recaptcha/intro/"
|
recaptcha-info: "reCAPTCHA token je povinný. Můžete jej získat na https://www.google.com/recaptcha/intro/"
|
||||||
enable-recaptcha: "povolit reCAPTCHA"
|
enable-recaptcha: "povolit reCAPTCHA"
|
||||||
|
recaptcha-secret-key: "Tajný Klíč (Secret Key)"
|
||||||
recaptcha-preview: "Náhled"
|
recaptcha-preview: "Náhled"
|
||||||
twitter-integration-config: "Nastavení spojení s Twitterem"
|
twitter-integration-config: "Nastavení spojení s Twitterem"
|
||||||
twitter-integration-info: "The callback URL is set on {url}."
|
twitter-integration-info: "The callback URL is set on {url}."
|
||||||
@@ -927,6 +1132,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "Provést SMTP autentikaci"
|
smtp-auth: "Provést SMTP autentikaci"
|
||||||
smtp-user: "SMTP uživatel"
|
smtp-user: "SMTP uživatel"
|
||||||
smtp-pass: "SMTP heslo"
|
smtp-pass: "SMTP heslo"
|
||||||
|
test-email: "Test"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "Povolit ServiceWorker"
|
enable-serviceworker: "Povolit ServiceWorker"
|
||||||
vapid-publickey: "VAPID veřejný klíč"
|
vapid-publickey: "VAPID veřejný klíč"
|
||||||
@@ -974,6 +1180,8 @@ admin/views/users.vue:
|
|||||||
reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?"
|
reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?"
|
||||||
password-updated: "Heslo je nyní \"{password}\""
|
password-updated: "Heslo je nyní \"{password}\""
|
||||||
update-remote-user: "Aktualizovat informace o vzdáleném účtu"
|
update-remote-user: "Aktualizovat informace o vzdáleném účtu"
|
||||||
|
username: "Přezdívka"
|
||||||
|
host: "Hostitel"
|
||||||
users:
|
users:
|
||||||
title: "Uživatel"
|
title: "Uživatel"
|
||||||
state:
|
state:
|
||||||
@@ -990,6 +1198,11 @@ admin/views/users.vue:
|
|||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "Vytvořit moderátora"
|
title: "Vytvořit moderátora"
|
||||||
|
logs:
|
||||||
|
title: "Logy"
|
||||||
|
moderator: "Moderátoři"
|
||||||
|
type: "Operace"
|
||||||
|
info: "Informace"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "Přidat emoji"
|
title: "Přidat emoji"
|
||||||
@@ -1026,6 +1239,7 @@ admin/views/federation.vue:
|
|||||||
host: "Hostitel"
|
host: "Hostitel"
|
||||||
notes: "Poznámky"
|
notes: "Poznámky"
|
||||||
users: "Uživatelé"
|
users: "Uživatelé"
|
||||||
|
following: "Sledování"
|
||||||
caught-at: "Vytvořeno"
|
caught-at: "Vytvořeno"
|
||||||
status: "Status"
|
status: "Status"
|
||||||
latest-request-received-at: "Poslední požadavek přijat"
|
latest-request-received-at: "Poslední požadavek přijat"
|
||||||
@@ -1045,6 +1259,7 @@ admin/views/federation.vue:
|
|||||||
hour: "za hodinu"
|
hour: "za hodinu"
|
||||||
day: "za den"
|
day: "za den"
|
||||||
blocked-hosts: "Blokován"
|
blocked-hosts: "Blokován"
|
||||||
|
save: "Uložit"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "O Misskey"
|
about: "O Misskey"
|
||||||
timeline: "Časová osa"
|
timeline: "Časová osa"
|
||||||
@@ -1083,12 +1298,17 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
no-photos: "Žádné obrázky"
|
no-photos: "Žádné obrázky"
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "Poznámky"
|
posts: "Poznámky"
|
||||||
|
following: "Sledovaní"
|
||||||
|
followers: "Sledující"
|
||||||
month: "Po"
|
month: "Po"
|
||||||
day: "Ne"
|
day: "Ne"
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Oznámení"
|
title: "Oznámení"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
title: "Ankety"
|
title: "Ankety"
|
||||||
|
nothing: "Žádné nové notifikace!"
|
||||||
|
desktop/views/widgets/trends.vue:
|
||||||
|
nothing: "Žádné nové notifikace!"
|
||||||
desktop/views/widgets/users.vue:
|
desktop/views/widgets/users.vue:
|
||||||
title: "Doporučení uživatelé"
|
title: "Doporučení uživatelé"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
@@ -1111,6 +1331,7 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
mobile/views/components/media-video.vue:
|
mobile/views/components/media-video.vue:
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
common/views/components/follow-button.vue:
|
common/views/components/follow-button.vue:
|
||||||
|
following: "Sledování"
|
||||||
follow-processing: "Zpracovávám"
|
follow-processing: "Zpracovávám"
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
private: "Tento příspěvek je soukromý"
|
private: "Tento příspěvek je soukromý"
|
||||||
@@ -1130,15 +1351,8 @@ mobile/views/components/note-sub.vue:
|
|||||||
admin: "admin"
|
admin: "admin"
|
||||||
bot: "bot"
|
bot: "bot"
|
||||||
cat: "kočka"
|
cat: "kočka"
|
||||||
mobile/views/components/post-form.vue:
|
mobile/views/components/notifications.vue:
|
||||||
add-visible-user: "Přidat uživatele"
|
empty: "Žádné nové notifikace!"
|
||||||
submit: "Příspěvek"
|
|
||||||
reply: "Odpovědět"
|
|
||||||
renote: "Renotovat"
|
|
||||||
reply-placeholder: "Odpovědět na tento příspěvěk"
|
|
||||||
geolocation-alert: "Vaše zařízení nepodporuje lokační službu"
|
|
||||||
error: "Chyba"
|
|
||||||
username-prompt: "Zadejte uživatelské jméno"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Tento příspěvek je soukromý"
|
private: "Tento příspěvek je soukromý"
|
||||||
deleted: "Tento příspěvek byl odstraněn"
|
deleted: "Tento příspěvek byl odstraněn"
|
||||||
@@ -1151,6 +1365,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
notifications: "Oznámení"
|
notifications: "Oznámení"
|
||||||
search: "Vyhledávání"
|
search: "Vyhledávání"
|
||||||
user-lists: "Seznamy"
|
user-lists: "Seznamy"
|
||||||
|
user-groups: "Skupiny"
|
||||||
widgets: "Widgety"
|
widgets: "Widgety"
|
||||||
game: "Hry"
|
game: "Hry"
|
||||||
admin: "Administrace"
|
admin: "Administrace"
|
||||||
@@ -1181,9 +1396,12 @@ mobile/views/pages/note.vue:
|
|||||||
mobile/views/pages/games/reversi.vue:
|
mobile/views/pages/games/reversi.vue:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
|
search: "Vyhledávání"
|
||||||
not-found: "Pro '{q}' nebyly nalezeny žádné příspěvky."
|
not-found: "Pro '{q}' nebyly nalezeny žádné příspěvky."
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Vybrat soubory"
|
select-file: "Vybrat soubory"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Oznámení"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
activity: "Aktivita"
|
activity: "Aktivita"
|
||||||
frequently-replied-users: "Častá zmínění"
|
frequently-replied-users: "Častá zmínění"
|
||||||
@@ -1207,6 +1425,8 @@ deck/deck.user-column.vue:
|
|||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
app-name-desc: "Jméno vaší aplikace"
|
app-name-desc: "Jméno vaší aplikace"
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "Připnout"
|
||||||
|
unpin-this-page: "Odepnout"
|
||||||
like: "Lajk"
|
like: "Lajk"
|
||||||
title: "Titulek"
|
title: "Titulek"
|
||||||
blocks:
|
blocks:
|
||||||
@@ -1228,6 +1448,8 @@ pages:
|
|||||||
_action:
|
_action:
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "Obsah"
|
content: "Obsah"
|
||||||
|
_radioButton:
|
||||||
|
title: "Titulek"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
random: "Náhodně"
|
random: "Náhodně"
|
||||||
@@ -1244,5 +1466,14 @@ pages:
|
|||||||
arg2: "Seznamy"
|
arg2: "Seznamy"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Seznamy"
|
arg1: "Seznamy"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Seznamy"
|
||||||
types:
|
types:
|
||||||
array: "Seznamy"
|
array: "Seznamy"
|
||||||
|
room:
|
||||||
|
translate: "Přesunout"
|
||||||
|
save: "Uložit"
|
||||||
|
saved: "Uloženo"
|
||||||
|
furnitures:
|
||||||
|
moon: "Měsíc"
|
||||||
|
bin: "Koš"
|
||||||
|
|||||||
@@ -18,9 +18,6 @@ common:
|
|||||||
drive: "Drev"
|
drive: "Drev"
|
||||||
drive-desc: "Vil du poste et billede, som du tidligere har uploadet? Har du brug for at navngive filer og organisere dem i mapper, som du selv har navngivet? Så er Misskey Drev den bedste løsning for dig. Den gør det så let som ingenting at dele dine filer online."
|
drive-desc: "Vil du poste et billede, som du tidligere har uploadet? Har du brug for at navngive filer og organisere dem i mapper, som du selv har navngivet? Så er Misskey Drev den bedste løsning for dig. Den gør det så let som ingenting at dele dine filer online."
|
||||||
outro: "Tjek Misskey's unikke funktioner ved at se dem med dine egne øjne. Hvis du kommer frem til, at den ene server ikke er noget for dig, så kan du prøve en anden. Misskey er et decentraliseret SNS, så du kan lettere finde frem til brugere, som du klikker med. God fornøjelse!"
|
outro: "Tjek Misskey's unikke funktioner ved at se dem med dine egne øjne. Hvis du kommer frem til, at den ene server ikke er noget for dig, så kan du prøve en anden. Misskey er et decentraliseret SNS, så du kan lettere finde frem til brugere, som du klikker med. God fornøjelse!"
|
||||||
adblock:
|
|
||||||
detected: "Her kan du deaktivere ad blocker."
|
|
||||||
warning: "Visse funktioner kan forsvinde eller medføre forstyrrelser, hvis ad blocking er aktiveret. <strong>Misskey kører ikke annoncer</strong>."
|
|
||||||
application-authorization: "Adgangsstyring"
|
application-authorization: "Adgangsstyring"
|
||||||
close: "Luk"
|
close: "Luk"
|
||||||
do-not-copy-paste: "Undgå venligst at skrive eller klistre kode ind her. I modsat fald kan din konto blive kompromitteret."
|
do-not-copy-paste: "Undgå venligst at skrive eller klistre kode ind her. I modsat fald kan din konto blive kompromitteret."
|
||||||
@@ -35,6 +32,13 @@ common:
|
|||||||
signout: "Log ud"
|
signout: "Log ud"
|
||||||
reload-to-apply-the-setting: "Denne indstilling slår først igennem, når du har genindlæst siden. Vil du genindlæse siden nu?"
|
reload-to-apply-the-setting: "Denne indstilling slår først igennem, når du har genindlæst siden. Vil du genindlæse siden nu?"
|
||||||
fetching-as-ap-object: "Tilladelse til sammenkobling"
|
fetching-as-ap-object: "Tilladelse til sammenkobling"
|
||||||
|
delete-confirm: "Er du helt sikker på, at du vil slette denne post?"
|
||||||
|
notification-types:
|
||||||
|
all: "Alle"
|
||||||
|
follow: "Følger"
|
||||||
|
reply: "Svar"
|
||||||
|
renote: "Gen-postering"
|
||||||
|
reaction: "Reaktion"
|
||||||
got-it: "Det er OK"
|
got-it: "Det er OK"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Tips om tilpasning"
|
title: "Tips om tilpasning"
|
||||||
@@ -95,6 +99,14 @@ common:
|
|||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Følgende brugere vil få vist deres poster på tidslinjen."
|
follow-users-to-make-your-timeline: "Følgende brugere vil få vist deres poster på tidslinjen."
|
||||||
explore: "Find brugere"
|
explore: "Find brugere"
|
||||||
|
post-form:
|
||||||
|
submit: "Post"
|
||||||
|
reply: "Svar"
|
||||||
|
renote: "Gen-postering"
|
||||||
|
error: "Fejl"
|
||||||
|
enter-username: "Angiv brugernavn"
|
||||||
|
add-visible-user: "Tilføj en bruger"
|
||||||
|
username-prompt: "Angiv brugernavn"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Søn"
|
sunday: "Søn"
|
||||||
monday: "Man"
|
monday: "Man"
|
||||||
@@ -154,6 +166,7 @@ common:
|
|||||||
other: "Andet"
|
other: "Andet"
|
||||||
appearance: "Udseende"
|
appearance: "Udseende"
|
||||||
behavior: "Opførsel"
|
behavior: "Opførsel"
|
||||||
|
reactions: "Reaktion"
|
||||||
fetch-on-scroll: "Uendeligt scroll"
|
fetch-on-scroll: "Uendeligt scroll"
|
||||||
fetch-on-scroll-desc: "Når du scroller ned ad siden, hentes der automatisk nyt indhold ind"
|
fetch-on-scroll-desc: "Når du scroller ned ad siden, hentes der automatisk nyt indhold ind"
|
||||||
note-visibility: "Post synlighed"
|
note-visibility: "Post synlighed"
|
||||||
@@ -198,7 +211,7 @@ common:
|
|||||||
deck-column-width-wide: "Bred"
|
deck-column-width-wide: "Bred"
|
||||||
use-shadow: "Vis skygger"
|
use-shadow: "Vis skygger"
|
||||||
rounded-corners: "Vis afrundede hjørner"
|
rounded-corners: "Vis afrundede hjørner"
|
||||||
circle-icons: "Anvend cykliske ikoner"
|
circle-icons: "Anvend cykliske avatar"
|
||||||
contrasted-acct: "Tilføj kontrast til brugerkontoen"
|
contrasted-acct: "Tilføj kontrast til brugerkontoen"
|
||||||
wallpaper: "Baggrundsbillede"
|
wallpaper: "Baggrundsbillede"
|
||||||
choose-wallpaper: "Vælg en baggrund"
|
choose-wallpaper: "Vælg en baggrund"
|
||||||
@@ -243,6 +256,8 @@ common:
|
|||||||
disable-via-mobile: "Marker aldrig posten som \"fra mobil\""
|
disable-via-mobile: "Marker aldrig posten som \"fra mobil\""
|
||||||
load-raw-images: "Vis vedhæftede bilag i original kvalitet"
|
load-raw-images: "Vis vedhæftede bilag i original kvalitet"
|
||||||
load-remote-media: "Vis medie-materiale fra en ekstern server"
|
load-remote-media: "Vis medie-materiale fra en ekstern server"
|
||||||
|
save: "Gem"
|
||||||
|
saved: "Gemt"
|
||||||
search: "Søg"
|
search: "Søg"
|
||||||
delete: "Slet"
|
delete: "Slet"
|
||||||
loading: "Henter"
|
loading: "Henter"
|
||||||
@@ -560,6 +575,8 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objekt"
|
objects: "Objekt"
|
||||||
symbols: "Symboler"
|
symbols: "Symboler"
|
||||||
flags: "Flag"
|
flags: "Flag"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "Du er nødt til at genindlæse siden, før ændringerne slår igennem."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Brugernavn"
|
username: "Brugernavn"
|
||||||
password: "Adgangskode"
|
password: "Adgangskode"
|
||||||
@@ -661,7 +678,7 @@ common/views/components/profile-editor.vue:
|
|||||||
you-can-include-hashtags: "Du må gerne bruge hashtags i din profil beskrivelse"
|
you-can-include-hashtags: "Du må gerne bruge hashtags i din profil beskrivelse"
|
||||||
language: "Sprog"
|
language: "Sprog"
|
||||||
birthday: "Fødselsdag"
|
birthday: "Fødselsdag"
|
||||||
avatar: "Ikon"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
is-cat: "Denne konto er en Kat"
|
is-cat: "Denne konto er en Kat"
|
||||||
is-bot: "Denne konto er en Bot"
|
is-bot: "Denne konto er en Bot"
|
||||||
@@ -674,6 +691,7 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Profil er opdateret med succes"
|
saved: "Profil er opdateret med succes"
|
||||||
uploading: "Overfører"
|
uploading: "Overfører"
|
||||||
upload-failed: "Fejl ved overførsel"
|
upload-failed: "Fejl ved overførsel"
|
||||||
|
unable-to-process: "Handlingen kunne ikke gennemføres."
|
||||||
email: "Email indstillinger"
|
email: "Email indstillinger"
|
||||||
email-address: "Email adresse"
|
email-address: "Email adresse"
|
||||||
email-verified: "Din email er blevet bekræftet"
|
email-verified: "Din email er blevet bekræftet"
|
||||||
@@ -693,6 +711,7 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "Risici"
|
danger-zone: "Risici"
|
||||||
delete-account: "Slet kontoen"
|
delete-account: "Slet kontoen"
|
||||||
account-deleted: "Kontoen er slettet. Det kan vare lidt, inden alle data forsvinder."
|
account-deleted: "Kontoen er slettet. Det kan vare lidt, inden alle data forsvinder."
|
||||||
|
metadata-content: "Indhold"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Bruger"
|
users: "Bruger"
|
||||||
rename: "Omdøb listen"
|
rename: "Omdøb listen"
|
||||||
@@ -799,6 +818,7 @@ desktop:
|
|||||||
uploading-avatar: "Overfør en ny avatar"
|
uploading-avatar: "Overfør en ny avatar"
|
||||||
avatar-updated: "Avatar er overført med succes"
|
avatar-updated: "Avatar er overført med succes"
|
||||||
choose-avatar: "Vælg et billede til din avatar"
|
choose-avatar: "Vælg et billede til din avatar"
|
||||||
|
unable-to-process: "Handlingen kunne ikke gennemføres."
|
||||||
invalid-filetype: "Denne filtype kan ikke benyttes her"
|
invalid-filetype: "Denne filtype kan ikke benyttes her"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Sort ... Total"
|
total: "Sort ... Total"
|
||||||
@@ -839,7 +859,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "Fjern markering som 'følsom'"
|
unmark-as-sensitive: "Fjern markering som 'følsom'"
|
||||||
copy-url: "Kopier webadresse"
|
copy-url: "Kopier webadresse"
|
||||||
download: "Download"
|
download: "Download"
|
||||||
else-files: "Andre"
|
else-files: "Avanceret"
|
||||||
set-as-avatar: "Vælg som avatar"
|
set-as-avatar: "Vælg som avatar"
|
||||||
set-as-banner: "Vælg som banner"
|
set-as-banner: "Vælg som banner"
|
||||||
open-in-app: "Åbn i app"
|
open-in-app: "Åbn i app"
|
||||||
@@ -858,6 +878,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Omdøb"
|
rename: "Omdøb"
|
||||||
rename-folder: "Omdøb mappe"
|
rename-folder: "Omdøb mappe"
|
||||||
input-new-folder-name: "Angiv nyt navn"
|
input-new-folder-name: "Angiv nyt navn"
|
||||||
|
else-folders: "Avanceret"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Søg"
|
search: "Søg"
|
||||||
empty-draghover: "Smid det her! Fordi du ved, at jeg er meget sød, ikke?"
|
empty-draghover: "Smid det her! Fordi du ved, at jeg er meget sød, ikke?"
|
||||||
@@ -918,34 +939,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Der er ingen notifikationer!"
|
empty: "Der er ingen notifikationer!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Tilføj bruger"
|
|
||||||
attach-location-information: "Vedhæft oplysninger om placering"
|
|
||||||
hide-contents: "Skjul indhold"
|
|
||||||
reply-placeholder: "Svar på denne post"
|
|
||||||
quote-placeholder: "Citer denne post"
|
|
||||||
submit: "Post"
|
|
||||||
reply: "Svar"
|
|
||||||
renote: "Gen-postering"
|
|
||||||
posted: "Afsendt!"
|
posted: "Afsendt!"
|
||||||
replied: "Besvaret!"
|
replied: "Besvaret!"
|
||||||
reposted: "Gen-posteret!"
|
reposted: "Gen-posteret!"
|
||||||
note-failed: "Fejl under afsendelse"
|
note-failed: "Fejl under afsendelse"
|
||||||
reply-failed: "Fejl under besvarelse"
|
reply-failed: "Fejl under besvarelse"
|
||||||
renote-failed: "Fejl under gen-postering"
|
renote-failed: "Fejl under gen-postering"
|
||||||
posting: "Afsender"
|
|
||||||
attach-media-from-local: "Vedhæft medie fra din enhed"
|
|
||||||
attach-media-from-drive: "Vedhæft medie fra dit drev"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Opret en afstemning"
|
|
||||||
text-remain: "Der mangler {} tegn"
|
|
||||||
recent-tags: "Seneste"
|
|
||||||
local-only-message: "Denne post vil kun blive offentliggjort lokalt"
|
|
||||||
click-to-tagging: "Klik for at tagge"
|
|
||||||
visibility: "Synlighed"
|
|
||||||
geolocation-alert: "Din enhed giver ikke mulighed for at benytte placeringstjenester"
|
|
||||||
error: "Fejl"
|
|
||||||
enter-username: "Angiv brugernavn"
|
|
||||||
annotations: "Kommentarer til posten (frivillige)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Ny post"
|
note: "Ny post"
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
@@ -1009,6 +1008,7 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "Kapacitet"
|
max: "Kapacitet"
|
||||||
in-use: "I brug"
|
in-use: "I brug"
|
||||||
stats: "Statistik"
|
stats: "Statistik"
|
||||||
|
default-upload-folder-name: "Mappe(r)"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "Annuller / Bloker"
|
mute-and-block: "Annuller / Bloker"
|
||||||
mute: "Annuller"
|
mute: "Annuller"
|
||||||
@@ -1106,6 +1106,13 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "Kø"
|
title: "Kø"
|
||||||
remove-all-jobs: "Ryd alle job køer"
|
remove-all-jobs: "Ryd alle job køer"
|
||||||
|
queue: "Kø"
|
||||||
|
state: "Sorter efter"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Logs"
|
||||||
|
levels:
|
||||||
|
info: "Information"
|
||||||
|
error: "Fejl"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Misbrug"
|
title: "Misbrug"
|
||||||
target: "Mål"
|
target: "Mål"
|
||||||
@@ -1202,6 +1209,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "Udfør autentifikation af SMTP"
|
smtp-auth: "Udfør autentifikation af SMTP"
|
||||||
smtp-user: "SMTP bruger"
|
smtp-user: "SMTP bruger"
|
||||||
smtp-pass: "SMTP adgangskode"
|
smtp-pass: "SMTP adgangskode"
|
||||||
|
test-email: "Test"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "Aktiver ServiceWorker"
|
enable-serviceworker: "Aktiver ServiceWorker"
|
||||||
serviceworker-info: "Skal være aktiveret for at give push notifikationer."
|
serviceworker-info: "Skal være aktiveret for at give push notifikationer."
|
||||||
@@ -1278,6 +1286,8 @@ admin/views/users.vue:
|
|||||||
remote-user-updated: "Informationen om den eksterne bruger er nu blevet opdateret."
|
remote-user-updated: "Informationen om den eksterne bruger er nu blevet opdateret."
|
||||||
delete-all-files: "Slet alle filer"
|
delete-all-files: "Slet alle filer"
|
||||||
delete-all-files-confirm: "Er du sikker på, at alle filerne skal slettes?"
|
delete-all-files-confirm: "Er du sikker på, at alle filerne skal slettes?"
|
||||||
|
username: "Brugernavn"
|
||||||
|
host: "Vært"
|
||||||
users:
|
users:
|
||||||
title: "Bruger"
|
title: "Bruger"
|
||||||
sort:
|
sort:
|
||||||
@@ -1308,6 +1318,11 @@ admin/views/moderators.vue:
|
|||||||
added: "Redaktør er oprettet"
|
added: "Redaktør er oprettet"
|
||||||
remove: "Fjern"
|
remove: "Fjern"
|
||||||
removed: "Redaktøren er nu fjernet"
|
removed: "Redaktøren er nu fjernet"
|
||||||
|
logs:
|
||||||
|
title: "Logs"
|
||||||
|
moderator: "Redaktører"
|
||||||
|
type: "Drift"
|
||||||
|
info: "Information"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "Tilføj emoji"
|
title: "Tilføj emoji"
|
||||||
@@ -1402,6 +1417,7 @@ admin/views/federation.vue:
|
|||||||
day: "pr. dag"
|
day: "pr. dag"
|
||||||
blocked-hosts: "Bloker"
|
blocked-hosts: "Bloker"
|
||||||
blocked-hosts-info: "Beskrivelse af værterne du vil blokere, adskilt af linjeskift."
|
blocked-hosts-info: "Beskrivelse af værterne du vil blokere, adskilt af linjeskift."
|
||||||
|
save: "Gem"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "Mere info..."
|
about: "Mere info..."
|
||||||
timeline: "Tidslinje"
|
timeline: "Tidslinje"
|
||||||
@@ -1533,17 +1549,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Der er ingen notifikationer!"
|
empty: "Der er ingen notifikationer!"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Tilføj en bruger"
|
|
||||||
submit: "Post"
|
|
||||||
reply: "Svar"
|
|
||||||
renote: "Gen-postering"
|
|
||||||
quote-placeholder: "Citer denne post... (valgfrit)"
|
|
||||||
reply-placeholder: "Svar på denne post"
|
|
||||||
cw-placeholder: "Kommentar til indholdet (valgfrit)"
|
|
||||||
geolocation-alert: "Din enhed giver ikke mulighed for at benytte placeringstjenester"
|
|
||||||
error: "Fejl"
|
|
||||||
username-prompt: "Angiv brugernavn"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Posten er privat"
|
private: "Posten er privat"
|
||||||
deleted: "Posten er blevet fjernet"
|
deleted: "Posten er blevet fjernet"
|
||||||
@@ -1606,6 +1611,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "Ingen poster fundet for \"{q}\""
|
not-found: "Ingen poster fundet for \"{q}\""
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Vælg fil(er)"
|
select-file: "Vælg fil(er)"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notifikationer"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Logget ind som {}"
|
signed-in-as: "Logget ind som {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1680,6 +1687,8 @@ dev/views/new-app.vue:
|
|||||||
app-name: "Navn på app"
|
app-name: "Navn på app"
|
||||||
app-name-placeholder: "F.eks. Misskey for iOS"
|
app-name-placeholder: "F.eks. Misskey for iOS"
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "Tilknyt til din profil"
|
||||||
|
unpin-this-page: "Fjern tilknytning til din profil"
|
||||||
like: "Synes om"
|
like: "Synes om"
|
||||||
title: "Titel"
|
title: "Titel"
|
||||||
blocks:
|
blocks:
|
||||||
@@ -1725,6 +1734,10 @@ pages:
|
|||||||
_dialog:
|
_dialog:
|
||||||
content: "Indhold"
|
content: "Indhold"
|
||||||
resetRandom: "Nulstil tilfældigt tal"
|
resetRandom: "Nulstil tilfældigt tal"
|
||||||
|
_radioButton:
|
||||||
|
name: "Variabel navn"
|
||||||
|
title: "Titel"
|
||||||
|
default: "Standard værdi"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
flow: "Kontrol"
|
flow: "Kontrol"
|
||||||
@@ -1778,8 +1791,7 @@ pages:
|
|||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
remind: "÷ Tomo"
|
_mod:
|
||||||
_remind:
|
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
eq: "A og B er ens"
|
eq: "A og B er ens"
|
||||||
@@ -1862,6 +1874,8 @@ pages:
|
|||||||
_pick:
|
_pick:
|
||||||
arg1: "Lister"
|
arg1: "Lister"
|
||||||
arg2: "Position"
|
arg2: "Position"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Lister"
|
||||||
number: "Tal"
|
number: "Tal"
|
||||||
stringToNumber: "Tekst til tal"
|
stringToNumber: "Tekst til tal"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
@@ -1894,3 +1908,10 @@ pages:
|
|||||||
enviromentVariables: "Miljø variabel"
|
enviromentVariables: "Miljø variabel"
|
||||||
pageVariables: "Side element"
|
pageVariables: "Side element"
|
||||||
argVariables: "Input slot"
|
argVariables: "Input slot"
|
||||||
|
room:
|
||||||
|
translate: "Flyt"
|
||||||
|
save: "Gem"
|
||||||
|
saved: "Gemt"
|
||||||
|
furnitures:
|
||||||
|
moon: "Måne"
|
||||||
|
bin: "Skraldespand"
|
||||||
|
|||||||
@@ -18,9 +18,6 @@ common:
|
|||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
drive-desc: "Du willst ein hochgeladenes Foto nochmal posten? Deine Dateien benennen und in Ordnern sortieren? Misskeys Drive ist der beste Ort dafür. Damit wird das Teilen zum Kinderspiel!"
|
drive-desc: "Du willst ein hochgeladenes Foto nochmal posten? Deine Dateien benennen und in Ordnern sortieren? Misskeys Drive ist der beste Ort dafür. Damit wird das Teilen zum Kinderspiel!"
|
||||||
outro: "Probiere Misskey aus und entdecke Misskeys einzigartige Funktionen. Wenn dir diese Instanz nicht zusagt, nimm einfach eine andere. Dank Misskeys dezentralem System kannst du dich überall mit deinen Freunden verbinden. Also dann, GLHF!"
|
outro: "Probiere Misskey aus und entdecke Misskeys einzigartige Funktionen. Wenn dir diese Instanz nicht zusagt, nimm einfach eine andere. Dank Misskeys dezentralem System kannst du dich überall mit deinen Freunden verbinden. Also dann, GLHF!"
|
||||||
adblock:
|
|
||||||
detected: "Bitte deaktiviere den Werbeblocker."
|
|
||||||
warning: "<strong>Misskey hat keine Werbung.</strong> Allerdings können Werbeblocker für unerwartete Probleme und fehlende Funktionen sorgen."
|
|
||||||
application-authorization: "Autorisierte Anwendungen"
|
application-authorization: "Autorisierte Anwendungen"
|
||||||
close: "Schließen"
|
close: "Schließen"
|
||||||
do-not-copy-paste: "Bitte keinen Code einfügen. Ihr Account könnte gefährdet werden."
|
do-not-copy-paste: "Bitte keinen Code einfügen. Ihr Account könnte gefährdet werden."
|
||||||
@@ -35,6 +32,10 @@ common:
|
|||||||
signout: "Ausloggen"
|
signout: "Ausloggen"
|
||||||
reload-to-apply-the-setting: "Die Seite muss zum Übernehmen dieser Einstellung aktualisiert werden. Soll die Seite jetzt neu geladen werden?"
|
reload-to-apply-the-setting: "Die Seite muss zum Übernehmen dieser Einstellung aktualisiert werden. Soll die Seite jetzt neu geladen werden?"
|
||||||
fetching-as-ap-object: "Hole Daten…"
|
fetching-as-ap-object: "Hole Daten…"
|
||||||
|
delete-confirm: "Diesen Beitrag löschen?"
|
||||||
|
notification-types:
|
||||||
|
reply: "Antworten"
|
||||||
|
renote: "Anmerkung"
|
||||||
got-it: "Verstanden!"
|
got-it: "Verstanden!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Anpassung-Tipps"
|
title: "Anpassung-Tipps"
|
||||||
@@ -95,6 +96,11 @@ common:
|
|||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Beiträge von Benutzern, denen du folgst, werden in der Zeitleiste angezeigt."
|
follow-users-to-make-your-timeline: "Beiträge von Benutzern, denen du folgst, werden in der Zeitleiste angezeigt."
|
||||||
explore: "Benutzer finden"
|
explore: "Benutzer finden"
|
||||||
|
post-form:
|
||||||
|
reply: "Antworten"
|
||||||
|
renote: "Anmerkung"
|
||||||
|
enter-username: "Bitte gib einen Benutzernamen ein"
|
||||||
|
username-prompt: "Bitte gib einen Benutzernamen ein"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "So"
|
sunday: "So"
|
||||||
monday: "Mo"
|
monday: "Mo"
|
||||||
@@ -198,7 +204,7 @@ common:
|
|||||||
deck-column-width-wide: "Sehr breit"
|
deck-column-width-wide: "Sehr breit"
|
||||||
use-shadow: "Nutze Schatten"
|
use-shadow: "Nutze Schatten"
|
||||||
rounded-corners: "Abgerundete Ecken"
|
rounded-corners: "Abgerundete Ecken"
|
||||||
circle-icons: "Kreisförmige Icons"
|
circle-icons: "Kreisförmige Avatar"
|
||||||
contrasted-acct: "Nutzernamen kontrastreicher darstellen"
|
contrasted-acct: "Nutzernamen kontrastreicher darstellen"
|
||||||
wallpaper: "Hintergrund"
|
wallpaper: "Hintergrund"
|
||||||
choose-wallpaper: "Hintergrund auswählen"
|
choose-wallpaper: "Hintergrund auswählen"
|
||||||
@@ -243,6 +249,8 @@ common:
|
|||||||
disable-via-mobile: "Beitrag nicht als „vom Handy“ markieren"
|
disable-via-mobile: "Beitrag nicht als „vom Handy“ markieren"
|
||||||
load-raw-images: "Anhänge in voller Größe laden"
|
load-raw-images: "Anhänge in voller Größe laden"
|
||||||
load-remote-media: "Zeige Inhalte von fremden Servern"
|
load-remote-media: "Zeige Inhalte von fremden Servern"
|
||||||
|
save: "Speichern"
|
||||||
|
saved: "Gespeichert"
|
||||||
search: "Suche"
|
search: "Suche"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
loading: "Laden"
|
loading: "Laden"
|
||||||
@@ -560,6 +568,7 @@ common/views/components/profile-editor.vue:
|
|||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
|
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
|
||||||
export: "Exportieren"
|
export: "Exportieren"
|
||||||
import: "Importieren"
|
import: "Importieren"
|
||||||
export-targets:
|
export-targets:
|
||||||
@@ -593,6 +602,8 @@ common/views/widgets/memo.vue:
|
|||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
desktop:
|
desktop:
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
avatar: "Avatar"
|
||||||
|
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Schwarz ... komplett"
|
total: "Schwarz ... komplett"
|
||||||
notes: "Blau ... Hinweise"
|
notes: "Blau ... Hinweise"
|
||||||
@@ -627,7 +638,6 @@ desktop/views/components/drive.file.vue:
|
|||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
copy-url: "URL kopieren"
|
copy-url: "URL kopieren"
|
||||||
download: "Download"
|
download: "Download"
|
||||||
else-files: "Anderes…"
|
|
||||||
set-as-avatar: "Als Avatar festlegen"
|
set-as-avatar: "Als Avatar festlegen"
|
||||||
set-as-banner: "Setze als Banner"
|
set-as-banner: "Setze als Banner"
|
||||||
open-in-app: "In der App öffnen"
|
open-in-app: "In der App öffnen"
|
||||||
@@ -684,7 +694,7 @@ desktop/views/components/note-detail.vue:
|
|||||||
add-reaction: "Reaktion hinzufügen"
|
add-reaction: "Reaktion hinzufügen"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
renote: "Anmerken"
|
renote: "Anmerkung"
|
||||||
detail: "Details"
|
detail: "Details"
|
||||||
private: "Dieser Beitrag ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
@@ -694,27 +704,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Keine Benachrichtigungen"
|
empty: "Keine Benachrichtigungen"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Nutzer hinzufügen"
|
|
||||||
hide-contents: "Inhalt verstecken"
|
|
||||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
|
||||||
quote-placeholder: "Zitiere diese Anmerkung..."
|
|
||||||
submit: "Abschicken"
|
|
||||||
reply: "Antworten"
|
|
||||||
renote: "Anmerken"
|
|
||||||
posted: "Gepostet!"
|
posted: "Gepostet!"
|
||||||
replied: "Geantwortet!"
|
replied: "Geantwortet!"
|
||||||
reposted: "Weitergesagt!"
|
reposted: "Weitergesagt!"
|
||||||
note-failed: "Anmerkung fehlgeschlagen"
|
note-failed: "Anmerkung fehlgeschlagen"
|
||||||
reply-failed: "Antwort fehlgeschlagen"
|
reply-failed: "Antwort fehlgeschlagen"
|
||||||
renote-failed: "Anmerkung fehlgeschlagen"
|
renote-failed: "Anmerkung fehlgeschlagen"
|
||||||
posting: "Posting"
|
|
||||||
attach-media-from-local: "Medien von deinem PC hinzufügen"
|
|
||||||
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
|
|
||||||
create-poll: "Eine Abstimmung erstellen"
|
|
||||||
text-remain: "{} Zeichen verbleibend"
|
|
||||||
visibility: "Sichtbarkeit"
|
|
||||||
error: "Fehler"
|
|
||||||
enter-username: "Bitte gib einen Benutzernamen ein..."
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Neuer Beitrag"
|
note: "Neuer Beitrag"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
@@ -785,6 +780,7 @@ admin/views/instance.vue:
|
|||||||
invite: "Einladen"
|
invite: "Einladen"
|
||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
saved: "Gespeichert"
|
saved: "Gespeichert"
|
||||||
|
test-email: "Test"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
@@ -792,6 +788,7 @@ admin/views/drive.vue:
|
|||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Benutzername"
|
||||||
users:
|
users:
|
||||||
origin:
|
origin:
|
||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
@@ -807,6 +804,7 @@ admin/views/announcements.vue:
|
|||||||
saved: "Gespeichert"
|
saved: "Gespeichert"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
status: "Status"
|
status: "Status"
|
||||||
|
save: "Speichern"
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
prev: "Vorheriger Kommentar"
|
prev: "Vorheriger Kommentar"
|
||||||
next: "Nächster Kommentar"
|
next: "Nächster Kommentar"
|
||||||
@@ -851,10 +849,6 @@ mobile/views/components/note-detail.vue:
|
|||||||
location: "Ort"
|
location: "Ort"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Keine Benachrichtigungen"
|
empty: "Keine Benachrichtigungen"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
reply: "Antworten"
|
|
||||||
renote: "Anmerken"
|
|
||||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Dieser Beitrag ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
@@ -884,6 +878,8 @@ mobile/views/pages/note.vue:
|
|||||||
next: "Nächster Kommentar"
|
next: "Nächster Kommentar"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Suchen"
|
search: "Suchen"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Benachrichtigungen"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
activity: "Aktivität"
|
activity: "Aktivität"
|
||||||
keywords: "Schlagwörter"
|
keywords: "Schlagwörter"
|
||||||
@@ -923,6 +919,8 @@ dev/views/new-app.vue:
|
|||||||
authority-desc: "Nur die hier eingetragenen Berechtigungen, werden per API zur Verfügung stehen."
|
authority-desc: "Nur die hier eingetragenen Berechtigungen, werden per API zur Verfügung stehen."
|
||||||
authority-warning: "Dies kann auch nach dem erstellen der Anwendung geändert werden, allerdings werden dann alle bisher generierten Token ungültig."
|
authority-warning: "Dies kann auch nach dem erstellen der Anwendung geändert werden, allerdings werden dann alle bisher generierten Token ungültig."
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "An die Profilseite pinnen"
|
||||||
|
unpin-this-page: "Lösen"
|
||||||
like: "Gefällt mir"
|
like: "Gefällt mir"
|
||||||
blocks:
|
blocks:
|
||||||
post: "\"Neuer Beitrag\"-Formular"
|
post: "\"Neuer Beitrag\"-Formular"
|
||||||
@@ -942,5 +940,13 @@ pages:
|
|||||||
arg2: "Listen"
|
arg2: "Listen"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Listen"
|
arg1: "Listen"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listen"
|
||||||
types:
|
types:
|
||||||
array: "Listen"
|
array: "Listen"
|
||||||
|
room:
|
||||||
|
save: "Speichern"
|
||||||
|
saved: "Gespeichert"
|
||||||
|
furnitures:
|
||||||
|
moon: "Mond"
|
||||||
|
bin: "Papierkorb"
|
||||||
|
|||||||
@@ -12,15 +12,12 @@ common:
|
|||||||
rich-contents: "Post"
|
rich-contents: "Post"
|
||||||
rich-contents-desc: "Just post your idea, hot topics, and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files, including videos, or create a poll - those are some of the things you can do with Misskey!"
|
rich-contents-desc: "Just post your idea, hot topics, and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files, including videos, or create a poll - those are some of the things you can do with Misskey!"
|
||||||
reaction: "Reactions"
|
reaction: "Reactions"
|
||||||
reaction-desc: "The easiest way to express your emotions. Misskey allows you to add various kinds of reactions to other's posts. The emotional experience on Misskey will never be on other SNSs, which are only able to push “likes”."
|
reaction-desc: "The easiest way to express your emotions. Misskey allows you to add various reactions to posts. Other SNSs only have a \"like\" reaction."
|
||||||
ui: "Interface"
|
ui: "Interface"
|
||||||
ui-desc: "No single UI can suit everyone. Therefore, Misskey has a highly customizable UI for your tastes. You can make your home original by editing the layout of your timeline, and moving around selectable widgets that you can easily adjust to make this place your own."
|
ui-desc: "No single UI can suit everyone. Therefore, Misskey has a highly customizable UI for your tastes. You can make your home original by editing the layout of your timeline, and moving around selectable widgets that you can easily adjust to make this place your own."
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
drive-desc: "Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online."
|
drive-desc: "Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online."
|
||||||
outro: "Check Misskey-unique features by seeing them with your own eyes! If you feel like this instance is not for you, try other instances, as Misskey is a decentralized SNS, so that you can easily find your mates. Then, GLHF!"
|
outro: "Check Misskey-unique features by seeing them with your own eyes! If you feel like this instance is not for you, try other instances, as Misskey is a decentralized SNS, so that you can easily find your mates. Then, GLHF!"
|
||||||
adblock:
|
|
||||||
detected: "Please disable ad blocker."
|
|
||||||
warning: "Some features may be unavailable or cause malfunctions if ad blocking features are enabled. <strong>Misskey is not running ads</strong>."
|
|
||||||
application-authorization: "Application authorizations"
|
application-authorization: "Application authorizations"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
||||||
@@ -30,11 +27,25 @@ common:
|
|||||||
customize-home: "Customize home layout"
|
customize-home: "Customize home layout"
|
||||||
featured-notes: "Featured notes"
|
featured-notes: "Featured notes"
|
||||||
dark-mode: "Dark Mode"
|
dark-mode: "Dark Mode"
|
||||||
signin: "Log In"
|
signin: "Login"
|
||||||
signup: "Sign up"
|
signup: "Sign up"
|
||||||
signout: "Logout"
|
signout: "Logout"
|
||||||
reload-to-apply-the-setting: "You'll need to reload the page to reflect this setting. Do you want to reload it now?"
|
reload-to-apply-the-setting: "You'll need to reload the page to reflect this setting. Do you want to reload it now?"
|
||||||
fetching-as-ap-object: "Inquiring to union"
|
fetching-as-ap-object: "Inquiring to fediverse"
|
||||||
|
unfollow-confirm: "Do you want to unfollow {name}?"
|
||||||
|
delete-confirm: "Are you sure you want to delete this post?"
|
||||||
|
signin-required: "Please login"
|
||||||
|
notification-type: "Notification Type"
|
||||||
|
notification-types:
|
||||||
|
all: "All"
|
||||||
|
pollVote: "Votes"
|
||||||
|
follow: "Following"
|
||||||
|
receiveFollowRequest: "Follow requests"
|
||||||
|
reply: "Reply"
|
||||||
|
quote: "Quote"
|
||||||
|
renote: "Renote"
|
||||||
|
mention: "Mentions"
|
||||||
|
reaction: "Reaction"
|
||||||
got-it: "Got it!"
|
got-it: "Got it!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
@@ -80,7 +91,7 @@ common:
|
|||||||
"write:drive": "Work with the Drive"
|
"write:drive": "Work with the Drive"
|
||||||
"read:favorites": "View Favorites"
|
"read:favorites": "View Favorites"
|
||||||
"write:favorites": "Work with Favorites"
|
"write:favorites": "Work with Favorites"
|
||||||
"read:following": "View Follower info"
|
"read:following": "View your Follow info"
|
||||||
"write:following": "Work with Follow info"
|
"write:following": "Work with Follow info"
|
||||||
"read:messaging": "View Messaging"
|
"read:messaging": "View Messaging"
|
||||||
"write:messaging": "Work with Messaging"
|
"write:messaging": "Work with Messaging"
|
||||||
@@ -92,9 +103,44 @@ common:
|
|||||||
"read:reactions": "View reactions"
|
"read:reactions": "View reactions"
|
||||||
"write:reactions": "Work with reactions"
|
"write:reactions": "Work with reactions"
|
||||||
"write:votes": "Vote"
|
"write:votes": "Vote"
|
||||||
|
"read:pages": "View Pages"
|
||||||
|
"write:pages": "Update Pages"
|
||||||
|
"read:page-likes": "View Likes on Pages"
|
||||||
|
"write:page-likes": "Update Likes on Pages"
|
||||||
|
"read:user-groups": "View User groups"
|
||||||
|
"write:user-groups": "Edit User groups"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Following users will show their posts in your timeline."
|
follow-users-to-make-your-timeline: "Following users will show their posts in your timeline."
|
||||||
explore: "Find users"
|
explore: "Find users"
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "Attach location information"
|
||||||
|
hide-contents: "Hide contents"
|
||||||
|
reply-placeholder: "Reply to this post..."
|
||||||
|
quote-placeholder: "Quote this Post..."
|
||||||
|
option-quote-placeholder: "Quote this post... (optional)"
|
||||||
|
quote-attached: "Quoted"
|
||||||
|
quote-question: "Do you want to append a quote?"
|
||||||
|
submit: "Post"
|
||||||
|
reply: "Reply"
|
||||||
|
renote: "Renote"
|
||||||
|
posting: "Posting"
|
||||||
|
attach-media-from-local: "Attach media from your device"
|
||||||
|
attach-media-from-drive: "Attach media from your Drive"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "Create a poll"
|
||||||
|
text-remain: "{} characters remaining"
|
||||||
|
recent-tags: "Recent"
|
||||||
|
local-only-message: "This post will only be published locally"
|
||||||
|
click-to-tagging: "Click to tagging"
|
||||||
|
visibility: "Visibility"
|
||||||
|
geolocation-alert: "Your device does not provide location services"
|
||||||
|
error: "Error"
|
||||||
|
enter-username: "Please enter username"
|
||||||
|
specified-recipient: "Recipient"
|
||||||
|
add-visible-user: "Add a user"
|
||||||
|
cw-placeholder: "Comments for the post (optional)"
|
||||||
|
username-prompt: "Please enter username"
|
||||||
|
enter-file-name: "Edit file name"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "S"
|
sunday: "S"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -154,6 +200,8 @@ common:
|
|||||||
other: "Other"
|
other: "Other"
|
||||||
appearance: "Appearance"
|
appearance: "Appearance"
|
||||||
behavior: "Behavior"
|
behavior: "Behavior"
|
||||||
|
reactions: "Reaction"
|
||||||
|
reactions-description: "Customize Emojis of Reaction picker delimited by line breaks"
|
||||||
fetch-on-scroll: "Endless loading on scroll"
|
fetch-on-scroll: "Endless loading on scroll"
|
||||||
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
||||||
note-visibility: "Post visibility"
|
note-visibility: "Post visibility"
|
||||||
@@ -161,6 +209,11 @@ common:
|
|||||||
remember-note-visibility: "Remember post visibility"
|
remember-note-visibility: "Remember post visibility"
|
||||||
web-search-engine: "Web search engine"
|
web-search-engine: "Web search engine"
|
||||||
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "Paste"
|
||||||
|
pasted-file-name: "Template for pasted file name"
|
||||||
|
pasted-file-name-desc: "Example: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "Edit the pasted file name"
|
||||||
|
paste-dialog-desc: "Display a dialog to edit the file name when you paste a file."
|
||||||
keep-cw: "Preserve content warning"
|
keep-cw: "Preserve content warning"
|
||||||
keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post."
|
keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post."
|
||||||
i-like-sushi: "I prefer sushi rather than pudding"
|
i-like-sushi: "I prefer sushi rather than pudding"
|
||||||
@@ -168,6 +221,7 @@ common:
|
|||||||
use-avatar-reversi-stones: "Use avatar as a stone in reversi"
|
use-avatar-reversi-stones: "Use avatar as a stone in reversi"
|
||||||
disable-animated-mfm: "Disable animated texts in a post"
|
disable-animated-mfm: "Disable animated texts in a post"
|
||||||
disable-showing-animated-images: "Do not play animated images"
|
disable-showing-animated-images: "Do not play animated images"
|
||||||
|
enable-quick-notification-view: "Enable Quick Notification View"
|
||||||
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
||||||
always-show-nsfw: "Always show NSFW contents"
|
always-show-nsfw: "Always show NSFW contents"
|
||||||
always-mark-nsfw: "Always mark posts with media attachments as NSFW"
|
always-mark-nsfw: "Always mark posts with media attachments as NSFW"
|
||||||
@@ -198,7 +252,7 @@ common:
|
|||||||
deck-column-width-wide: "Wide"
|
deck-column-width-wide: "Wide"
|
||||||
use-shadow: "Use shadows in the UI"
|
use-shadow: "Use shadows in the UI"
|
||||||
rounded-corners: "Round the corners of the UI"
|
rounded-corners: "Round the corners of the UI"
|
||||||
circle-icons: "Use circular icons"
|
circle-icons: "Use circular avatar icon"
|
||||||
contrasted-acct: "Add contrast to user account"
|
contrasted-acct: "Add contrast to user account"
|
||||||
wallpaper: "Background image"
|
wallpaper: "Background image"
|
||||||
choose-wallpaper: "Choose a background"
|
choose-wallpaper: "Choose a background"
|
||||||
@@ -243,6 +297,21 @@ common:
|
|||||||
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
||||||
load-raw-images: "Show attached images in original quality"
|
load-raw-images: "Show attached images in original quality"
|
||||||
load-remote-media: "Show media from a remote server"
|
load-remote-media: "Show media from a remote server"
|
||||||
|
sync: "Sync"
|
||||||
|
save: "Save"
|
||||||
|
saved: "Saved"
|
||||||
|
home-profile: "Home profile"
|
||||||
|
deck-profile: "Deck profile"
|
||||||
|
room: "Room"
|
||||||
|
_room:
|
||||||
|
graphicsQuality: "Graphics Quality"
|
||||||
|
_graphicsQuality:
|
||||||
|
ultra: "Ultra"
|
||||||
|
high: "High"
|
||||||
|
medium: "Medium"
|
||||||
|
low: "Low"
|
||||||
|
cheep: "Cheep"
|
||||||
|
useOrthographicCamera: "Use Orthographic Camera"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
@@ -253,7 +322,7 @@ common:
|
|||||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||||
hide-password: "Hide Password"
|
hide-password: "Hide Password"
|
||||||
show-password: "Show Password"
|
show-password: "Show Password"
|
||||||
enter-username: "Enter user name"
|
enter-username: "Please enter username"
|
||||||
do-not-use-in-production: "This is a development build. Do not use in production."
|
do-not-use-in-production: "This is a development build. Do not use in production."
|
||||||
user-suspended: "This user has been suspended."
|
user-suspended: "This user has been suspended."
|
||||||
is-remote-user: "The information about this user may not be entirely complete."
|
is-remote-user: "The information about this user may not be entirely complete."
|
||||||
@@ -319,7 +388,7 @@ auth/views/index.vue:
|
|||||||
error: "Session does not exist."
|
error: "Session does not exist."
|
||||||
sign-in: "Please sign in."
|
sign-in: "Please sign in."
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
pinned-users: "Higlighted users"
|
pinned-users: "Pinned users"
|
||||||
popular-users: "Popular users"
|
popular-users: "Popular users"
|
||||||
recently-updated-users: "Recently active users"
|
recently-updated-users: "Recently active users"
|
||||||
recently-registered-users: "Users who joined recently"
|
recently-registered-users: "Users who joined recently"
|
||||||
@@ -327,6 +396,9 @@ common/views/pages/explore.vue:
|
|||||||
federated: "From the fediverse"
|
federated: "From the fediverse"
|
||||||
explore: "Explore {host}"
|
explore: "Explore {host}"
|
||||||
users-info: "Currently, {users} users are registered here"
|
users-info: "Currently, {users} users are registered here"
|
||||||
|
common/views/components/reactions-viewer.details.vue:
|
||||||
|
few-users: "{users} reacted with {reaction}"
|
||||||
|
many-users: "{users}, and {omitted} more reacted with {reaction}"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "Enable playback"
|
enable-player: "Enable playback"
|
||||||
disable-player: "Close the player"
|
disable-player: "Close the player"
|
||||||
@@ -492,7 +564,10 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "Unpin"
|
unpin: "Unpin"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
delete-confirm: "Are you sure you want to delete this post?"
|
delete-confirm: "Are you sure you want to delete this post?"
|
||||||
|
delete-and-edit: "Delete and Edit"
|
||||||
|
delete-and-edit-confirm: "Are you sure you want to delete this note and edit it? You will lose all reactions, renotes and replies to it."
|
||||||
remote: "Show original note"
|
remote: "Show original note"
|
||||||
|
pin-limit-exceeded: "You can't pin any more posts."
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "Mention"
|
mention: "Mention"
|
||||||
mute: "Mute"
|
mute: "Mute"
|
||||||
@@ -561,6 +636,14 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objects"
|
objects: "Objects"
|
||||||
symbols: "Symbols"
|
symbols: "Symbols"
|
||||||
flags: "Flags"
|
flags: "Flags"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "Mode"
|
||||||
|
intro: "You can specify whether you want to use the desktop, or the mobile layout."
|
||||||
|
choices:
|
||||||
|
auto: "Choose layout automatically"
|
||||||
|
desktop: "Always use the desktop layout"
|
||||||
|
mobile: "Always use the mobile layout"
|
||||||
|
info: "You need to reload the page for the changes to take effect."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Username"
|
username: "Username"
|
||||||
password: "Password"
|
password: "Password"
|
||||||
@@ -570,7 +653,9 @@ common/views/components/signin.vue:
|
|||||||
signin-with-twitter: "Log in with Twitter"
|
signin-with-twitter: "Log in with Twitter"
|
||||||
signin-with-github: "Sign in with GitHub"
|
signin-with-github: "Sign in with GitHub"
|
||||||
signin-with-discord: "Sign in with Discord"
|
signin-with-discord: "Sign in with Discord"
|
||||||
login-failed: "Logging in has failed. Make sure you have entered the correct username and password."
|
login-failed: "Unable to log in. The username or password you entered is incorrect."
|
||||||
|
tap-key: "Click on the Security Key to log in"
|
||||||
|
enter-2fa-code: "Enter your verification code"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "Invitation code"
|
invitation-code: "Invitation code"
|
||||||
invitation-info: "If you do not have an invitation code, please contact an <a href=\"{}\">administrator</a>."
|
invitation-info: "If you do not have an invitation code, please contact an <a href=\"{}\">administrator</a>."
|
||||||
@@ -662,7 +747,7 @@ common/views/components/profile-editor.vue:
|
|||||||
you-can-include-hashtags: "You can also include hashtags in your profile description."
|
you-can-include-hashtags: "You can also include hashtags in your profile description."
|
||||||
language: "Language"
|
language: "Language"
|
||||||
birthday: "Birthday"
|
birthday: "Birthday"
|
||||||
avatar: "Icon"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
is-cat: "This account is a Cat"
|
is-cat: "This account is a Cat"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
@@ -675,6 +760,9 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Profile updated successfully"
|
saved: "Profile updated successfully"
|
||||||
uploading: "Uploading"
|
uploading: "Uploading"
|
||||||
upload-failed: "Failed to upload"
|
upload-failed: "Failed to upload"
|
||||||
|
unable-to-process: "The operation could not be completed."
|
||||||
|
avatar-not-an-image: "The file you specified as an avatar is not an image"
|
||||||
|
banner-not-an-image: "The file you specified as a banner is not an image"
|
||||||
email: "Email settings"
|
email: "Email settings"
|
||||||
email-address: "Email Address"
|
email-address: "Email Address"
|
||||||
email-verified: "Your email has been verified."
|
email-verified: "Your email has been verified."
|
||||||
@@ -694,6 +782,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "Cautious options"
|
danger-zone: "Cautious options"
|
||||||
delete-account: "Remove the account"
|
delete-account: "Remove the account"
|
||||||
account-deleted: "The account has been deleted. It may take some time until all of the data disappears."
|
account-deleted: "The account has been deleted. It may take some time until all of the data disappears."
|
||||||
|
profile-metadata: "Profile metadata"
|
||||||
|
metadata-label: "Label"
|
||||||
|
metadata-content: "Content"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "User"
|
users: "User"
|
||||||
rename: "Rename list"
|
rename: "Rename list"
|
||||||
@@ -708,7 +799,9 @@ common/views/components/user-group-editor.vue:
|
|||||||
delete: "Delete group"
|
delete: "Delete group"
|
||||||
transfer: "transfer group"
|
transfer: "transfer group"
|
||||||
transfer-are-you-sure: "Are you sure you want to add @$2 to the group $1?"
|
transfer-are-you-sure: "Are you sure you want to add @$2 to the group $1?"
|
||||||
|
transferred: "Group transferred"
|
||||||
remove-user: "Remove a user from this group"
|
remove-user: "Remove a user from this group"
|
||||||
|
delete-are-you-sure: "Are you sure to delete group \"$1\"?"
|
||||||
deleted: "Deleted"
|
deleted: "Deleted"
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
invited: "The invitation was successfully sent"
|
invited: "The invitation was successfully sent"
|
||||||
@@ -717,7 +810,7 @@ common/views/components/user-lists.vue:
|
|||||||
create-list: "Create a list"
|
create-list: "Create a list"
|
||||||
list-name: "List name"
|
list-name: "List name"
|
||||||
common/views/components/user-groups.vue:
|
common/views/components/user-groups.vue:
|
||||||
user-groups: "Group"
|
user-groups: "Groups"
|
||||||
create-group: "Create a group"
|
create-group: "Create a group"
|
||||||
group-name: "Group name"
|
group-name: "Group name"
|
||||||
owned-groups: "My groups"
|
owned-groups: "My groups"
|
||||||
@@ -730,6 +823,7 @@ common/views/widgets/broadcast.vue:
|
|||||||
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"
|
||||||
|
prev: "Previous"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "Year {}"
|
year: "Year {}"
|
||||||
month: "{},"
|
month: "{},"
|
||||||
@@ -801,6 +895,7 @@ desktop:
|
|||||||
uploading-avatar: "Uploading a new avatar"
|
uploading-avatar: "Uploading a new avatar"
|
||||||
avatar-updated: "Successfully updated the avatar"
|
avatar-updated: "Successfully updated the avatar"
|
||||||
choose-avatar: "Select an image for the avatar"
|
choose-avatar: "Select an image for the avatar"
|
||||||
|
unable-to-process: "The operation could not be completed."
|
||||||
invalid-filetype: "This filetype is not acceptable here"
|
invalid-filetype: "This filetype is not acceptable here"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Black ... Total"
|
total: "Black ... Total"
|
||||||
@@ -841,8 +936,8 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "Unmark as 'sensitive'"
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
copy-url: "Copy URL"
|
copy-url: "Copy URL"
|
||||||
download: "Download"
|
download: "Download"
|
||||||
else-files: "Others"
|
else-files: "Other"
|
||||||
set-as-avatar: "Set as an avatar"
|
set-as-avatar: "Set as avatar"
|
||||||
set-as-banner: "Set as a banner"
|
set-as-banner: "Set as a banner"
|
||||||
open-in-app: "Open in app"
|
open-in-app: "Open in app"
|
||||||
add-app: "Add app"
|
add-app: "Add app"
|
||||||
@@ -851,15 +946,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied: "Copied"
|
copied: "Copied"
|
||||||
copied-url-to-clipboard: "URL has been copied to clipboard"
|
copied-url-to-clipboard: "URL has been copied to clipboard"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "Default Upload location"
|
||||||
unable-to-process: "The operation could not be completed."
|
unable-to-process: "The operation could not be completed."
|
||||||
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
|
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
|
||||||
unhandled-error: "Unknown error"
|
unhandled-error: "Unknown error"
|
||||||
|
unable-to-delete: "Unable to delete"
|
||||||
|
has-child-files-or-folders: "Since this folder is not empty, it can not be deleted."
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "Move to this folder"
|
move-to-this-folder: "Move to this folder"
|
||||||
show-in-new-window: "Open in new window"
|
show-in-new-window: "Open in new window"
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
rename-folder: "Rename folder"
|
rename-folder: "Rename folder"
|
||||||
input-new-folder-name: "Enter new name"
|
input-new-folder-name: "Enter new name"
|
||||||
|
else-folders: "Other"
|
||||||
|
set-as-upload-folder: "Set as default upload folder"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Search"
|
search: "Search"
|
||||||
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
|
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
|
||||||
@@ -920,34 +1020,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "No notifications!"
|
empty: "No notifications!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Add a user"
|
|
||||||
attach-location-information: "Attach location information"
|
|
||||||
hide-contents: "Hide contents"
|
|
||||||
reply-placeholder: "Reply to this post..."
|
|
||||||
quote-placeholder: "Quote this Post..."
|
|
||||||
submit: "Post"
|
|
||||||
reply: "Reply"
|
|
||||||
renote: "Renote"
|
|
||||||
posted: "Posted!"
|
posted: "Posted!"
|
||||||
replied: "Replied!"
|
replied: "Replied!"
|
||||||
reposted: "Renoted!"
|
reposted: "Renoted!"
|
||||||
note-failed: "Failed to post"
|
note-failed: "Failed to post"
|
||||||
reply-failed: "Failed to reply"
|
reply-failed: "Failed to reply"
|
||||||
renote-failed: "Failed to Renote"
|
renote-failed: "Failed to Renote"
|
||||||
posting: "Posting"
|
|
||||||
attach-media-from-local: "Attach media from your device"
|
|
||||||
attach-media-from-drive: "Attach media from your Drive"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Create a poll"
|
|
||||||
text-remain: "{} characters remaining"
|
|
||||||
recent-tags: "Recent"
|
|
||||||
local-only-message: "This post will only be published locally"
|
|
||||||
click-to-tagging: "Click to tagging"
|
|
||||||
visibility: "Visibility"
|
|
||||||
geolocation-alert: "Your device does not provide location services."
|
|
||||||
error: "Error"
|
|
||||||
enter-username: "Please enter a username..."
|
|
||||||
annotations: "Annotations for the post (optional)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "New Post"
|
note: "New Post"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
@@ -987,6 +1065,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Settings saved!"
|
success: "Settings saved!"
|
||||||
failed: "Failed to setup. Please ensure that the token is correct."
|
failed: "Failed to setup. Please ensure that the token is correct."
|
||||||
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
|
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
|
||||||
|
totp-header: "Authenticator App"
|
||||||
|
security-key-header: "Security Key"
|
||||||
|
security-key: "For additional security, you can log in to your account using a hardware Security Key that supports FIDO2. When you then sign in, you'll need the registered Security Key, or an authenticator app with you."
|
||||||
|
last-used: "Last used:"
|
||||||
|
activate-key: "Click to activate the Security Key"
|
||||||
|
security-key-name: "Name the Key"
|
||||||
|
register-security-key: "Complete Key registration"
|
||||||
|
something-went-wrong: "Wow! There was a problem registering the Key:"
|
||||||
|
key-unregistered: "The Key has been deleted"
|
||||||
|
use-password-less-login: "Use Password-less login"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
click-to-show: "Click to show"
|
click-to-show: "Click to show"
|
||||||
@@ -1011,6 +1099,9 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "Max"
|
max: "Max"
|
||||||
in-use: "In use"
|
in-use: "In use"
|
||||||
stats: "Statistics"
|
stats: "Statistics"
|
||||||
|
default-upload-folder: "Default upload folder location"
|
||||||
|
default-upload-folder-name: "Folder(s)"
|
||||||
|
change-default-upload-folder: "Change folder"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "Mute / Block"
|
mute-and-block: "Mute / Block"
|
||||||
mute: "Mute"
|
mute: "Mute"
|
||||||
@@ -1061,9 +1152,10 @@ desktop/views/components/ui.header.vue:
|
|||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Your profile"
|
profile: "Your profile"
|
||||||
lists: "Lists"
|
lists: "Lists"
|
||||||
groups: "Group"
|
groups: "Groups"
|
||||||
follow-requests: "Follow requests"
|
follow-requests: "Follow requests"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
|
room: "Room"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "Games"
|
game: "Games"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
@@ -1096,7 +1188,13 @@ admin/views/index.vue:
|
|||||||
abuse: "Abuse"
|
abuse: "Abuse"
|
||||||
queue: "Job Queue"
|
queue: "Job Queue"
|
||||||
logs: "Logs"
|
logs: "Logs"
|
||||||
|
db: "Database"
|
||||||
back-to-misskey: "Back to Misskey"
|
back-to-misskey: "Back to Misskey"
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "Tables"
|
||||||
|
vacuum: "Vacuum"
|
||||||
|
vacuum-info: "Tidies up the database. Keeps the data intact and reduces disk usage. This is usually done automatically and periodically."
|
||||||
|
vacuum-exclamation: "Vacuuming can overload the database for a while, and cause users not to be able to participate in interactions."
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
accounts: "Accounts"
|
accounts: "Accounts"
|
||||||
@@ -1108,6 +1206,32 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "Queue"
|
title: "Queue"
|
||||||
remove-all-jobs: "Clear all queued jobs"
|
remove-all-jobs: "Clear all queued jobs"
|
||||||
|
jobs: "Jobs"
|
||||||
|
queue: "Queue"
|
||||||
|
domains:
|
||||||
|
deliver: "Delivers"
|
||||||
|
inbox: "Received"
|
||||||
|
db: "Database"
|
||||||
|
objectStorage: "Object Storage"
|
||||||
|
state: "Sort"
|
||||||
|
states:
|
||||||
|
active: "Running"
|
||||||
|
delayed: "Scheduled"
|
||||||
|
waiting: "Queued"
|
||||||
|
result-is-truncated: "Result is truncated"
|
||||||
|
other-queues: "Other queues"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Logs"
|
||||||
|
domain: "Domain"
|
||||||
|
level: "Level"
|
||||||
|
levels:
|
||||||
|
all: "All"
|
||||||
|
info: "Information"
|
||||||
|
success: "Success"
|
||||||
|
warning: "Warning"
|
||||||
|
error: "Error"
|
||||||
|
debug: "Debug"
|
||||||
|
delete-all: "Remove All"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abuse"
|
title: "Abuse"
|
||||||
target: "Target"
|
target: "Target"
|
||||||
@@ -1132,13 +1256,21 @@ admin/views/instance.vue:
|
|||||||
maintainer-name: "Administrator name"
|
maintainer-name: "Administrator name"
|
||||||
maintainer-email: "Contact Administrator"
|
maintainer-email: "Contact Administrator"
|
||||||
advanced-config: "Other settings"
|
advanced-config: "Other settings"
|
||||||
|
note-and-tl: "Notes and timelines"
|
||||||
drive-config: "Drive settings"
|
drive-config: "Drive settings"
|
||||||
|
use-object-storage: "Use Object Storage"
|
||||||
object-storage-base-url: "URL"
|
object-storage-base-url: "URL"
|
||||||
|
object-storage-bucket: "Bucket Name"
|
||||||
|
object-storage-prefix: "Prefix"
|
||||||
object-storage-endpoint: "Endpoint"
|
object-storage-endpoint: "Endpoint"
|
||||||
|
object-storage-region: "Region"
|
||||||
object-storage-port: "Port"
|
object-storage-port: "Port"
|
||||||
object-storage-access-key: "Access Key"
|
object-storage-access-key: "Access Key"
|
||||||
object-storage-secret-key: "Secret Key"
|
object-storage-secret-key: "Secret Key"
|
||||||
object-storage-use-ssl: "Use SSL"
|
object-storage-use-ssl: "Use SSL"
|
||||||
|
object-storage-s3-info: "If you are going to use Amazon S3 as Object Storage, Please refer {0} to configure 'Endpoint' and 'Region'."
|
||||||
|
object-storage-s3-info-here: "here"
|
||||||
|
object-storage-gcs-info: "If you are going to use Google Cloud Storage as Object Storage, Set the 'Endpoint' as storage.googleapis.com, and keep the 'Region' is blank."
|
||||||
cache-remote-files: "Cache remote files"
|
cache-remote-files: "Cache remote files"
|
||||||
cache-remote-files-desc: "Without this parameter, all remote files are linked to their host server directly. This will be an effective solution to save your server storage, however make remote files invisible to users who set direct-link disabled, since no thumbnail will be generated, increase traffic. It is recommended that this parameter set enabled."
|
cache-remote-files-desc: "Without this parameter, all remote files are linked to their host server directly. This will be an effective solution to save your server storage, however make remote files invisible to users who set direct-link disabled, since no thumbnail will be generated, increase traffic. It is recommended that this parameter set enabled."
|
||||||
local-drive-capacity-mb: "Volume of Drive per user"
|
local-drive-capacity-mb: "Volume of Drive per user"
|
||||||
@@ -1146,9 +1278,14 @@ admin/views/instance.vue:
|
|||||||
mb: "In megabytes"
|
mb: "In megabytes"
|
||||||
recaptcha-config: "the reCAPTCHA settings"
|
recaptcha-config: "the reCAPTCHA settings"
|
||||||
recaptcha-info: "reCAPTCHA token is required. Please get it on https://www.google.com/recaptcha/intro/"
|
recaptcha-info: "reCAPTCHA token is required. Please get it on https://www.google.com/recaptcha/intro/"
|
||||||
|
recaptcha-info2: "v3 is not supported. Please use v2."
|
||||||
enable-recaptcha: "enable reCAPTCHA"
|
enable-recaptcha: "enable reCAPTCHA"
|
||||||
|
recaptcha-site-key: "Site key"
|
||||||
recaptcha-secret-key: "Secret Key"
|
recaptcha-secret-key: "Secret Key"
|
||||||
recaptcha-preview: "Preview"
|
recaptcha-preview: "Preview"
|
||||||
|
hidden-tags: "Hidden hashtags"
|
||||||
|
hidden-tags-info: "List up the hashtags delimited by line breaks that you want exclude from statistics."
|
||||||
|
external-service-integration-config: "Connect an external service"
|
||||||
twitter-integration-config: "Settings of connecting to Twitter"
|
twitter-integration-config: "Settings of connecting to Twitter"
|
||||||
twitter-integration-info: "The callback URL is set on {url}."
|
twitter-integration-info: "The callback URL is set on {url}."
|
||||||
enable-twitter-integration: "Enable connection to Twitter"
|
enable-twitter-integration: "Enable connection to Twitter"
|
||||||
@@ -1165,7 +1302,7 @@ admin/views/instance.vue:
|
|||||||
discord-integration-client-id: "Client ID"
|
discord-integration-client-id: "Client ID"
|
||||||
discord-integration-client-secret: "Client Secret"
|
discord-integration-client-secret: "Client Secret"
|
||||||
proxy-account-config: "Proxy account"
|
proxy-account-config: "Proxy account"
|
||||||
proxy-account-info: "Proxy account can follow a remote user to deliver activities if no one in this instance follow him or her. When you add a remote user who is followed by nobody in this instance to your list, in order to get his or her data, proxy account follow him or her instead of your following."
|
proxy-account-info: "A proxy account is an account that acts as a remote follower for users under certain conditions. For example, when a user adds a remote user to the list, the activity will not be delivered to the server if no one is following that user, so the proxy account will follow instead."
|
||||||
proxy-account-username: "Proxy account user name"
|
proxy-account-username: "Proxy account user name"
|
||||||
proxy-account-username-desc: "Specify the user name of the account that is used as a proxy."
|
proxy-account-username-desc: "Specify the user name of the account that is used as a proxy."
|
||||||
proxy-account-warn: "You must make an account having this username before this action."
|
proxy-account-warn: "You must make an account having this username before this action."
|
||||||
@@ -1179,7 +1316,8 @@ admin/views/instance.vue:
|
|||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
pinned-users: "Higlighted user"
|
pinned-users: "Pinned user"
|
||||||
|
pinned-users-info: "List up the users delimited by line breaks that you want to show as 'Pinned Users'."
|
||||||
email-config: "Email server settings"
|
email-config: "Email server settings"
|
||||||
email-config-info: "Used to confirm email and password reset etc."
|
email-config-info: "Used to confirm email and password reset etc."
|
||||||
enable-email: "Enable email delivery"
|
enable-email: "Enable email delivery"
|
||||||
@@ -1191,6 +1329,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "Perform SMTP authentication"
|
smtp-auth: "Perform SMTP authentication"
|
||||||
smtp-user: "SMTP User"
|
smtp-user: "SMTP User"
|
||||||
smtp-pass: "SMTP Password"
|
smtp-pass: "SMTP Password"
|
||||||
|
test-email: "Test"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "Enable ServiceWorker"
|
enable-serviceworker: "Enable ServiceWorker"
|
||||||
serviceworker-info: "Must be enabled for push notifications."
|
serviceworker-info: "Must be enabled for push notifications."
|
||||||
@@ -1245,6 +1384,9 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "Unmark as 'sensitive'"
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
marked-as-sensitive: "Set a sensitive content notice"
|
marked-as-sensitive: "Set a sensitive content notice"
|
||||||
unmarked-as-sensitive: "Remove the sensitive content notice"
|
unmarked-as-sensitive: "Remove the sensitive content notice"
|
||||||
|
clean-remote-files: "Clear the remote files cache"
|
||||||
|
clean-remote-files-are-you-sure: "Are you sure you want to remove all cached files from remote?"
|
||||||
|
clean-up: "Clean up"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "Operations"
|
operation: "Operations"
|
||||||
username-or-userid: "Username or user ID"
|
username-or-userid: "Username or user ID"
|
||||||
@@ -1267,6 +1409,8 @@ admin/views/users.vue:
|
|||||||
remote-user-updated: "The information regarding the remote user has been updated."
|
remote-user-updated: "The information regarding the remote user has been updated."
|
||||||
delete-all-files: "Delete all files"
|
delete-all-files: "Delete all files"
|
||||||
delete-all-files-confirm: "Are you sure that you want to delete all files?"
|
delete-all-files-confirm: "Are you sure that you want to delete all files?"
|
||||||
|
username: "Username"
|
||||||
|
host: "Host"
|
||||||
users:
|
users:
|
||||||
title: "Users"
|
title: "Users"
|
||||||
sort:
|
sort:
|
||||||
@@ -1278,6 +1422,7 @@ admin/views/users.vue:
|
|||||||
state:
|
state:
|
||||||
title: "Sort"
|
title: "Sort"
|
||||||
all: "All"
|
all: "All"
|
||||||
|
available: "Available"
|
||||||
admin: "Administrator"
|
admin: "Administrator"
|
||||||
moderator: "Moderator"
|
moderator: "Moderator"
|
||||||
adminOrModerator: "Admin/Moderator"
|
adminOrModerator: "Admin/Moderator"
|
||||||
@@ -1297,6 +1442,12 @@ admin/views/moderators.vue:
|
|||||||
added: "Registered a Moderator."
|
added: "Registered a Moderator."
|
||||||
remove: "Discharge"
|
remove: "Discharge"
|
||||||
removed: "The moderator has been discharged"
|
removed: "The moderator has been discharged"
|
||||||
|
logs:
|
||||||
|
title: "Logs"
|
||||||
|
moderator: "Moderators"
|
||||||
|
type: "Operations"
|
||||||
|
at: "Timestamp"
|
||||||
|
info: "Information"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "Add emoji"
|
title: "Add emoji"
|
||||||
@@ -1390,6 +1541,8 @@ admin/views/federation.vue:
|
|||||||
hour: "Hourly"
|
hour: "Hourly"
|
||||||
day: "Daily"
|
day: "Daily"
|
||||||
blocked-hosts: "Blocking"
|
blocked-hosts: "Blocking"
|
||||||
|
blocked-hosts-info: "List up the hosts delimited by line breaks that you want to block."
|
||||||
|
save: "Save"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "More details..."
|
about: "More details..."
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
@@ -1521,17 +1674,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "No notifications"
|
empty: "No notifications"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Add a user"
|
|
||||||
submit: "Post"
|
|
||||||
reply: "Reply"
|
|
||||||
renote: "Renote"
|
|
||||||
quote-placeholder: "Quote this post... (optional)"
|
|
||||||
reply-placeholder: "Reply to this note..."
|
|
||||||
cw-placeholder: "Comments for the post (optional)"
|
|
||||||
geolocation-alert: "Your device does not provide location services."
|
|
||||||
error: "Error"
|
|
||||||
username-prompt: "Enter user name"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "This post is private"
|
private: "This post is private"
|
||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
@@ -1546,7 +1688,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
follow-requests: "Follow requests"
|
follow-requests: "Follow requests"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
user-lists: "Lists"
|
user-lists: "Lists"
|
||||||
user-groups: "Group"
|
user-groups: "Groups"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
game: "Games"
|
game: "Games"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
@@ -1594,6 +1736,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "No posts were found for '{q}'"
|
not-found: "No posts were found for '{q}'"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Choose files"
|
select-file: "Choose files"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notifications"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Signed in as {}"
|
signed-in-as: "Signed in as {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1652,6 +1796,7 @@ deck/deck.user-column.vue:
|
|||||||
activity: "Activity"
|
activity: "Activity"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
pinned-notes: "Pinned posts"
|
pinned-notes: "Pinned posts"
|
||||||
|
pinned-page: "Pinned page"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Found an error, or do you want to contribute to the documentation?"
|
edit-this-page-on-github: "Found an error, or do you want to contribute to the documentation?"
|
||||||
edit-this-page-on-github-link: "Edit this page at GitHub!"
|
edit-this-page-on-github-link: "Edit this page at GitHub!"
|
||||||
@@ -1683,9 +1828,14 @@ pages:
|
|||||||
read-page: "Viewing the source"
|
read-page: "Viewing the source"
|
||||||
page-created: "Created the page!"
|
page-created: "Created the page!"
|
||||||
page-updated: "Updated the page"
|
page-updated: "Updated the page"
|
||||||
|
name-already-exists: "The specified page name already exists"
|
||||||
|
title-invalid-name: "The specified page URL is invalid"
|
||||||
|
text-invalid-name: "Check whether that is not a blank"
|
||||||
are-you-sure-delete: "Do you want to delete this page?"
|
are-you-sure-delete: "Do you want to delete this page?"
|
||||||
page-deleted: "The page has been deleted"
|
page-deleted: "The page has been deleted"
|
||||||
edit-this-page: "Edit this page"
|
edit-this-page: "Edit this page"
|
||||||
|
pin-this-page: "Pin to your profile"
|
||||||
|
unpin-this-page: "Unpin"
|
||||||
view-source: "View Source"
|
view-source: "View Source"
|
||||||
view-page: "View page"
|
view-page: "View page"
|
||||||
like: "Like"
|
like: "Like"
|
||||||
@@ -1695,11 +1845,16 @@ pages:
|
|||||||
inspector: "Inspector"
|
inspector: "Inspector"
|
||||||
content: "Page block"
|
content: "Page block"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
|
variables-info: "You can make your page more dynamic by using variables. If you write down <b>{ variable name }</b> in the text, you can embed the value of the variable there. For example, if the source text is <b>Hello { thing } world!</b> and the value of variable 'thing' is <b> ai </b>, that text becomes to <b>Hello ai world!</b>."
|
||||||
|
variables-info2: "Because the evaluation(=calculating) of variables are performed from top to bottom, the variable cannot refer another variable which exists on later line. For example, when defining three variables <b>A</b>, <b>B</b> and <b>C</b>, variable <b>C</b> <i>can</i> refer the variable <b>A</b> and <b>B</b> in its expression, but variable <b>A</b> <i>cannot</i> refer the variable <b>B</b> or <b>C</b> in its expression."
|
||||||
|
variables-info3: "If you want to get some input from the user, place a 'User Input' block on the page and set the variable name as which you want to store that input in 'variable name' (variables are created automatically). You can use that variable to perform actions in response to user's input."
|
||||||
|
variables-info4: "Function allows make your processing logic as group in a reusable way. To create a function, create a variable of type 'Function'. A function can have a slot (Argument) whose value is available as a variable in the function. There are also functions that take functions as arguments in the AiScript standard (called the higher-order function.). In addition to the predefined functions, you can also set them in the slots of such higher-order functions on the fly."
|
||||||
more-details: "Description"
|
more-details: "Description"
|
||||||
title: "Title"
|
title: "Title"
|
||||||
url: "Page URL"
|
url: "Page URL"
|
||||||
summary: "Summary of page"
|
summary: "Summary of page"
|
||||||
align-center: "Center align"
|
align-center: "Center align"
|
||||||
|
hide-title-when-pinned: "Hide page title when pinned to profile"
|
||||||
font: "Font"
|
font: "Font"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans Serif"
|
fontSansSerif: "Sans Serif"
|
||||||
@@ -1753,12 +1908,25 @@ pages:
|
|||||||
inc: "Increase number"
|
inc: "Increase number"
|
||||||
_button:
|
_button:
|
||||||
text: "Title"
|
text: "Title"
|
||||||
|
colored: "Color"
|
||||||
action: "Operation when the button pressed"
|
action: "Operation when the button pressed"
|
||||||
_action:
|
_action:
|
||||||
dialog: "Show a dialog"
|
dialog: "Show a dialog"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "Content"
|
content: "Content"
|
||||||
resetRandom: "Reset a random number"
|
resetRandom: "Reset a random number"
|
||||||
|
pushEvent: "Send an event"
|
||||||
|
_pushEvent:
|
||||||
|
event: "Name of the event"
|
||||||
|
message: "Message to display when pressed"
|
||||||
|
variable: "Variable to send"
|
||||||
|
no-variable: "None"
|
||||||
|
radioButton: "Choices"
|
||||||
|
_radioButton:
|
||||||
|
name: "Variable name"
|
||||||
|
title: "Title"
|
||||||
|
values: "Item of choices that delimited by line breaks"
|
||||||
|
default: "Default value"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
flow: "Control"
|
flow: "Control"
|
||||||
@@ -1792,6 +1960,7 @@ pages:
|
|||||||
strReverse: "Flip text"
|
strReverse: "Flip text"
|
||||||
_strReverse:
|
_strReverse:
|
||||||
arg1: "Text"
|
arg1: "Text"
|
||||||
|
join: "Text Concatenation"
|
||||||
_join:
|
_join:
|
||||||
arg1: "Lists"
|
arg1: "Lists"
|
||||||
arg2: "Separator"
|
arg2: "Separator"
|
||||||
@@ -1811,7 +1980,8 @@ pages:
|
|||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
_remind:
|
mod: "÷ Remaindering"
|
||||||
|
_mod:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
eq: "A and B are equal"
|
eq: "A and B are equal"
|
||||||
@@ -1874,21 +2044,29 @@ pages:
|
|||||||
dailyRandomPick: "Choose at random from the list (Daily for each user)"
|
dailyRandomPick: "Choose at random from the list (Daily for each user)"
|
||||||
_dailyRandomPick:
|
_dailyRandomPick:
|
||||||
arg1: "Lists"
|
arg1: "Lists"
|
||||||
|
seedRandom: "Random (Seed)"
|
||||||
_seedRandom:
|
_seedRandom:
|
||||||
arg1: "Seed"
|
arg1: "Seed"
|
||||||
arg2: "Probability"
|
arg2: "Probability"
|
||||||
|
seedRannum: "Random number (Seed)"
|
||||||
_seedRannum:
|
_seedRannum:
|
||||||
arg1: "Seed"
|
arg1: "Seed"
|
||||||
arg2: "Minimum"
|
arg2: "Minimum"
|
||||||
arg3: "Maximum"
|
arg3: "Maximum"
|
||||||
|
seedRandomPick: "Randomly selected from list (Seed)"
|
||||||
_seedRandomPick:
|
_seedRandomPick:
|
||||||
arg1: "Seed"
|
arg1: "Seed"
|
||||||
arg2: "Lists"
|
arg2: "Lists"
|
||||||
|
DRPWPM: "Randomly selected from weighted list (Daily updated per user)"
|
||||||
_DRPWPM:
|
_DRPWPM:
|
||||||
arg1: "List of text"
|
arg1: "List of text"
|
||||||
|
pick: "Select from list"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Lists"
|
arg1: "Lists"
|
||||||
arg2: "Position"
|
arg2: "Position"
|
||||||
|
listLen: "Get length of list"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Lists"
|
||||||
number: "Number"
|
number: "Number"
|
||||||
stringToNumber: "Text to number"
|
stringToNumber: "Text to number"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
@@ -1903,8 +2081,13 @@ pages:
|
|||||||
fn: "Function"
|
fn: "Function"
|
||||||
_fn:
|
_fn:
|
||||||
slots: "Slots"
|
slots: "Slots"
|
||||||
|
slots-info: "Please delimit each slot with a line break"
|
||||||
arg1: "Output"
|
arg1: "Output"
|
||||||
for: "Repeat"
|
for: "Repeat"
|
||||||
|
_for:
|
||||||
|
arg1: "Count"
|
||||||
|
arg2: "Action"
|
||||||
|
typeError: "Slot {slot} accepts \"{expect}\" type, but It actually contains \"{actual}\" type!"
|
||||||
thereIsEmptySlot: "Slot {slot} is empty!"
|
thereIsEmptySlot: "Slot {slot} is empty!"
|
||||||
types:
|
types:
|
||||||
string: "Text"
|
string: "Text"
|
||||||
@@ -1916,3 +2099,64 @@ pages:
|
|||||||
enviromentVariables: "Environment variable"
|
enviromentVariables: "Environment variable"
|
||||||
pageVariables: "Page element"
|
pageVariables: "Page element"
|
||||||
argVariables: "Input slot"
|
argVariables: "Input slot"
|
||||||
|
room:
|
||||||
|
add-furniture: "Place furniture"
|
||||||
|
translate: "Move"
|
||||||
|
rotate: "Rotate"
|
||||||
|
exit: "Deselect"
|
||||||
|
remove: "Remove"
|
||||||
|
save: "Save"
|
||||||
|
saved: "Saved"
|
||||||
|
clear: "Remove All"
|
||||||
|
clear-confirm: "Are you sure to remove all furnitures in your room?"
|
||||||
|
leave-confirm: "There are unsaved changes. Do you really want to leave?"
|
||||||
|
chooseImage: "Select an image"
|
||||||
|
room-type: "Room type"
|
||||||
|
carpet-color: "Color of carpet"
|
||||||
|
rooms:
|
||||||
|
default: "Default"
|
||||||
|
washitsu: "Japanese-style"
|
||||||
|
furnitures:
|
||||||
|
milk: "Milk carton"
|
||||||
|
bed: "Bed"
|
||||||
|
low-table: "Low Table"
|
||||||
|
desk: "Desk"
|
||||||
|
chair: "Chair"
|
||||||
|
chair2: "Chair 2"
|
||||||
|
fan: "Fan"
|
||||||
|
pc: "Computer"
|
||||||
|
plant: "Houseplant"
|
||||||
|
plant2: "Houseplant 2"
|
||||||
|
eraser: "Eraser"
|
||||||
|
pencil: "Pencil"
|
||||||
|
pudding: "Pudding"
|
||||||
|
cardboard-box: "Cardboard Box"
|
||||||
|
cardboard-box2: "Cardboard Box 2"
|
||||||
|
cardboard-box3: "Cardboard Box 3"
|
||||||
|
book: "Book"
|
||||||
|
book2: "Book 2"
|
||||||
|
piano: "Piano"
|
||||||
|
facial-tissue: "Facial tissue"
|
||||||
|
server: "Servers"
|
||||||
|
moon: "Moon"
|
||||||
|
corkboard: "Cork board"
|
||||||
|
mousepad: "Mousepad"
|
||||||
|
monitor: "Monitor"
|
||||||
|
keyboard: "Keyboard"
|
||||||
|
carpet-stripe: "Carpet (stripe)"
|
||||||
|
mat: "Mat"
|
||||||
|
color-box: "Bookshelf"
|
||||||
|
wall-clock: "Wall clock"
|
||||||
|
photoframe: "Picture frame"
|
||||||
|
cube: "Cube"
|
||||||
|
tv: "TV"
|
||||||
|
pinguin: "Penguin"
|
||||||
|
rubik-cube: "Rubik's Cube"
|
||||||
|
poster-h: "Poster (Horizontal)"
|
||||||
|
poster-v: "Poster (Vertical)"
|
||||||
|
sofa: "Sofa"
|
||||||
|
spiral: "Spiral Staircase"
|
||||||
|
bin: "Waste bin"
|
||||||
|
cup-noodle: "Cup noodle"
|
||||||
|
holo-display: "Holographic display"
|
||||||
|
energy-drink: "Energy drink"
|
||||||
|
|||||||
@@ -16,9 +16,6 @@ common:
|
|||||||
ui: "Interfaz"
|
ui: "Interfaz"
|
||||||
ui-desc: "No hay ninguna interfaz que le vaya bien a todos. Por eso, Misskey tiene una interfaz altamente personalizable para tus gustos. Puedes hacer tu página principal única editando la interfaz de tu timeline y moviendo varios widgets para conseguir hacer de este lugar uno propio."
|
ui-desc: "No hay ninguna interfaz que le vaya bien a todos. Por eso, Misskey tiene una interfaz altamente personalizable para tus gustos. Puedes hacer tu página principal única editando la interfaz de tu timeline y moviendo varios widgets para conseguir hacer de este lugar uno propio."
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
adblock:
|
|
||||||
detected: "Por favor, desactive el bloqueador de publicidad."
|
|
||||||
warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado."
|
|
||||||
application-authorization: "Autorizaciones de la aplicación."
|
application-authorization: "Autorizaciones de la aplicación."
|
||||||
close: "Cerrar"
|
close: "Cerrar"
|
||||||
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
||||||
@@ -31,6 +28,11 @@ common:
|
|||||||
signin: "Iniciar sesión"
|
signin: "Iniciar sesión"
|
||||||
signup: "¡Regístrate!"
|
signup: "¡Regístrate!"
|
||||||
signout: "Cerrar sesión"
|
signout: "Cerrar sesión"
|
||||||
|
delete-confirm: "¿Seguro que quieres borrar la publicación?"
|
||||||
|
notification-types:
|
||||||
|
all: "Todo"
|
||||||
|
reply: "Responder"
|
||||||
|
renote: "Volver a publicar"
|
||||||
got-it: "¡Listo!"
|
got-it: "¡Listo!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Consejos de personalización"
|
title: "Consejos de personalización"
|
||||||
@@ -80,6 +82,11 @@ common:
|
|||||||
"read:notifications": "Ver notificaciones"
|
"read:notifications": "Ver notificaciones"
|
||||||
"read:reactions": "Ver reacciones"
|
"read:reactions": "Ver reacciones"
|
||||||
"write:votes": "Vota"
|
"write:votes": "Vota"
|
||||||
|
post-form:
|
||||||
|
reply: "Responder"
|
||||||
|
renote: "Volver a publicar"
|
||||||
|
enter-username: "Ingresar nombre de usuario"
|
||||||
|
username-prompt: "Ingresar nombre de usuario"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "domingo"
|
sunday: "domingo"
|
||||||
monday: "lunes"
|
monday: "lunes"
|
||||||
@@ -167,7 +174,7 @@ common:
|
|||||||
deck-column-width-wide: "Ancho"
|
deck-column-width-wide: "Ancho"
|
||||||
use-shadow: "Usar sombras en la Interfaz de Usuario"
|
use-shadow: "Usar sombras en la Interfaz de Usuario"
|
||||||
rounded-corners: "Esquinas redondeadas en la Interfaz de Usuario"
|
rounded-corners: "Esquinas redondeadas en la Interfaz de Usuario"
|
||||||
circle-icons: "Usar iconos circulares"
|
circle-icons: "Usar avatar circulares"
|
||||||
contrasted-acct: "Añadir contraste al nombre de usuario"
|
contrasted-acct: "Añadir contraste al nombre de usuario"
|
||||||
wallpaper: "Fondo de pantalla"
|
wallpaper: "Fondo de pantalla"
|
||||||
choose-wallpaper: "Escoge un fondo de pantalla"
|
choose-wallpaper: "Escoge un fondo de pantalla"
|
||||||
@@ -192,6 +199,8 @@ common:
|
|||||||
update-available-desc: "Las actualizaciones se aplicarán cuando la página se vuelva a cargar."
|
update-available-desc: "Las actualizaciones se aplicarán cuando la página se vuelva a cargar."
|
||||||
advanced-settings: "Configuraciones avanzadas"
|
advanced-settings: "Configuraciones avanzadas"
|
||||||
navbar-position-left: "Izquierda"
|
navbar-position-left: "Izquierda"
|
||||||
|
save: "Guardar"
|
||||||
|
saved: "Guardado"
|
||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
delete: "eliminar"
|
delete: "eliminar"
|
||||||
loading: "cargando"
|
loading: "cargando"
|
||||||
@@ -202,6 +211,7 @@ common:
|
|||||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||||
hide-password: "Ocultar contraseña"
|
hide-password: "Ocultar contraseña"
|
||||||
show-password: "Mostrar contraseña"
|
show-password: "Mostrar contraseña"
|
||||||
|
enter-username: "Ingresar nombre de usuario"
|
||||||
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
|
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
|
||||||
user-suspended: "Este usuario ha sido suspendido"
|
user-suspended: "Este usuario ha sido suspendido"
|
||||||
is-remote-user: "La información sobre este usuario puede no estar completa"
|
is-remote-user: "La información sobre este usuario puede no estar completa"
|
||||||
@@ -452,6 +462,8 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objetos"
|
objects: "Objetos"
|
||||||
symbols: "Símbolos"
|
symbols: "Símbolos"
|
||||||
flags: "Países"
|
flags: "Países"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "Necesitas recargar la página para que los cambios tengan efecto."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Usuario"
|
username: "Usuario"
|
||||||
password: "Contraseña"
|
password: "Contraseña"
|
||||||
@@ -559,6 +571,7 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Perfil actualizado con exito"
|
saved: "Perfil actualizado con exito"
|
||||||
uploading: "Subiendo"
|
uploading: "Subiendo"
|
||||||
upload-failed: "Error al subir"
|
upload-failed: "Error al subir"
|
||||||
|
unable-to-process: "La operación no se puede llevar a cabo"
|
||||||
email: "Preferencias de correo"
|
email: "Preferencias de correo"
|
||||||
email-address: "Correo electrónico"
|
email-address: "Correo electrónico"
|
||||||
email-verified: "Tu cuenta de correo ha sido verificada."
|
email-verified: "Tu cuenta de correo ha sido verificada."
|
||||||
@@ -661,6 +674,7 @@ desktop:
|
|||||||
uploading-avatar: "Cargando un nuevo avatar"
|
uploading-avatar: "Cargando un nuevo avatar"
|
||||||
avatar-updated: "Avatar actualizado"
|
avatar-updated: "Avatar actualizado"
|
||||||
choose-avatar: "Escoge una imagen de avatar"
|
choose-avatar: "Escoge una imagen de avatar"
|
||||||
|
unable-to-process: "La operación no se puede llevar a cabo"
|
||||||
invalid-filetype: "Este tipo de archivo no es compatible aquí"
|
invalid-filetype: "Este tipo de archivo no es compatible aquí"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Negro ... Total"
|
total: "Negro ... Total"
|
||||||
@@ -719,6 +733,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
rename-folder: "Renombrar carpeta"
|
rename-folder: "Renombrar carpeta"
|
||||||
input-new-folder-name: "Escribe el nombre nuevo"
|
input-new-folder-name: "Escribe el nombre nuevo"
|
||||||
|
else-folders: "Otros"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
empty-draghover: "¡Saluda!"
|
empty-draghover: "¡Saluda!"
|
||||||
@@ -766,7 +781,7 @@ desktop/views/components/note-detail.vue:
|
|||||||
add-reaction: "Agregar una reacción"
|
add-reaction: "Agregar una reacción"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
renote: "Republicar"
|
renote: "Volver a publicar"
|
||||||
add-reaction: "Reacción"
|
add-reaction: "Reacción"
|
||||||
detail: "Detalles"
|
detail: "Detalles"
|
||||||
private: "Esta publicación es privada"
|
private: "Esta publicación es privada"
|
||||||
@@ -777,32 +792,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "No hay notificaciones"
|
empty: "No hay notificaciones"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Agregar usuario"
|
|
||||||
attach-location-information: "Agregar localización"
|
|
||||||
hide-contents: "Esconder contenidos"
|
|
||||||
reply-placeholder: "Responder a esta nota..."
|
|
||||||
quote-placeholder: "Citar esta nota..."
|
|
||||||
submit: "Publicar"
|
|
||||||
reply: "Responder"
|
|
||||||
renote: "Republicar"
|
|
||||||
posted: "¡Publicado!"
|
posted: "¡Publicado!"
|
||||||
replied: "¡Respondido!"
|
replied: "¡Respondido!"
|
||||||
reposted: "¡Republicado!"
|
reposted: "¡Republicado!"
|
||||||
note-failed: "Error al publicar nota"
|
note-failed: "Error al publicar nota"
|
||||||
reply-failed: "Error al responder"
|
reply-failed: "Error al responder"
|
||||||
renote-failed: "Error al republicar"
|
renote-failed: "Error al republicar"
|
||||||
posting: "Publicando"
|
|
||||||
attach-media-from-local: "Agregar medios de tu dispositivo"
|
|
||||||
attach-media-from-drive: "Adjunta multimedia desde tu Disco"
|
|
||||||
create-poll: "Crea una encuesta"
|
|
||||||
text-remain: "quedan {} caracteres"
|
|
||||||
recent-tags: "Reciente"
|
|
||||||
click-to-tagging: "Click para etiquetar"
|
|
||||||
visibility: "Visibilidad"
|
|
||||||
geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización."
|
|
||||||
error: "Error"
|
|
||||||
enter-username: "Por favor escribe un nombre de usuario..."
|
|
||||||
annotations: "Anotaciones a la publicación (opcional)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nota nueva"
|
note: "Nota nueva"
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
@@ -921,6 +916,9 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "Cola"
|
title: "Cola"
|
||||||
remove-all-jobs: "Limpiar todos los trabajos pendientes"
|
remove-all-jobs: "Limpiar todos los trabajos pendientes"
|
||||||
|
queue: "Cola"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Registros"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abuso"
|
title: "Abuso"
|
||||||
target: "Destinatario"
|
target: "Destinatario"
|
||||||
@@ -950,6 +948,7 @@ admin/views/instance.vue:
|
|||||||
smtp-port: "Puerto SMTP"
|
smtp-port: "Puerto SMTP"
|
||||||
smtp-user: "Usuario SMTP"
|
smtp-user: "Usuario SMTP"
|
||||||
smtp-pass: "Contraseña SMTP"
|
smtp-pass: "Contraseña SMTP"
|
||||||
|
test-email: "Prueba"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "Gráficos"
|
title: "Gráficos"
|
||||||
per-day: "Por día"
|
per-day: "Por día"
|
||||||
@@ -969,12 +968,18 @@ admin/views/drive.vue:
|
|||||||
mark-as-sensitive: "Marcar como 'sensible'"
|
mark-as-sensitive: "Marcar como 'sensible'"
|
||||||
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Usuario"
|
||||||
|
host: "Host"
|
||||||
users:
|
users:
|
||||||
state:
|
state:
|
||||||
all: "Todo"
|
all: "Todo"
|
||||||
moderator: "Moderadores"
|
moderator: "Moderadores"
|
||||||
origin:
|
origin:
|
||||||
local: "Local"
|
local: "Local"
|
||||||
|
admin/views/moderators.vue:
|
||||||
|
logs:
|
||||||
|
title: "Registros"
|
||||||
|
moderator: "Moderadores"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
add: "Agregar"
|
add: "Agregar"
|
||||||
@@ -1000,6 +1005,7 @@ admin/views/federation.vue:
|
|||||||
hour: "Por hora"
|
hour: "Por hora"
|
||||||
day: "Por día"
|
day: "Por día"
|
||||||
blocked-hosts: "Bloquear"
|
blocked-hosts: "Bloquear"
|
||||||
|
save: "Guardar"
|
||||||
desktop/views/pages/selectdrive.vue:
|
desktop/views/pages/selectdrive.vue:
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
desktop/views/pages/user-list.users.vue:
|
desktop/views/pages/user-list.users.vue:
|
||||||
@@ -1052,11 +1058,6 @@ mobile/views/components/note-detail.vue:
|
|||||||
location: "Localización"
|
location: "Localización"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "No hay notificaciones"
|
empty: "No hay notificaciones"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
reply: "Responder"
|
|
||||||
renote: "Republicar"
|
|
||||||
reply-placeholder: "Responder a esta nota..."
|
|
||||||
geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización."
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Esta publicación es privada"
|
private: "Esta publicación es privada"
|
||||||
deleted: "Esta publicación ha sido removida"
|
deleted: "Esta publicación ha sido removida"
|
||||||
@@ -1090,6 +1091,8 @@ mobile/views/pages/games/reversi.vue:
|
|||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notificaciones"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
activity: "Actividad"
|
activity: "Actividad"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@@ -1105,6 +1108,7 @@ deck:
|
|||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
activity: "Actividad"
|
activity: "Actividad"
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "Fijar en el perfil"
|
||||||
like: "Me gusta"
|
like: "Me gusta"
|
||||||
blocks:
|
blocks:
|
||||||
post: "Formulario"
|
post: "Formulario"
|
||||||
@@ -1124,5 +1128,13 @@ pages:
|
|||||||
arg2: "Listas"
|
arg2: "Listas"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Listas"
|
arg1: "Listas"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listas"
|
||||||
types:
|
types:
|
||||||
array: "Listas"
|
array: "Listas"
|
||||||
|
room:
|
||||||
|
save: "Guardar"
|
||||||
|
saved: "Guardado"
|
||||||
|
furnitures:
|
||||||
|
moon: "Luna"
|
||||||
|
bin: "Papelera"
|
||||||
|
|||||||
@@ -12,15 +12,12 @@ common:
|
|||||||
rich-contents: "Notes"
|
rich-contents: "Notes"
|
||||||
rich-contents-desc: "Partagez vos idées, les événements et les sujets qui vous tiennent à cœur ainsi que tout autre chose que vous souhaitez partager avec les autres. Si vous le désirez, vous pouvez décorer vos messages en utilisant une syntaxe différente ou en y joignant des sondages et des fichiers, tels que les photos ou les vidéos que vous aimez."
|
rich-contents-desc: "Partagez vos idées, les événements et les sujets qui vous tiennent à cœur ainsi que tout autre chose que vous souhaitez partager avec les autres. Si vous le désirez, vous pouvez décorer vos messages en utilisant une syntaxe différente ou en y joignant des sondages et des fichiers, tels que les photos ou les vidéos que vous aimez."
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
reaction-desc: "Une manière simple d'exprimer vos émotions. Misskey peut attacher diverses réactions aux publications des autres utilisateurs. Si vous essayez les réactions sur Misskey, vous ne pourrez plus retourner sur une autre plateforme de réseaux sociaux n'offrant que des « J'aime »."
|
reaction-desc: "Une manière simple d'exprimer vos émotions. Misskey peut attacher diverses réactions aux publications des autres utilisateur·rice·s. Si vous essayez les réactions sur Misskey, vous ne pourrez plus retourner sur une autre plateforme de réseaux sociaux n'offrant que des « J'aime »."
|
||||||
ui: "Interface"
|
ui: "Interface"
|
||||||
ui-desc: "Aucune interface graphique ne peut plaire à tout le monde. Par conséquent, Misskey possède une interface utilisateur hautement personnalisable selon vos goûts. Vous pouvez rendre votre page d'accueil originale en modifiant la mise en page de votre fil et en déplaçant les widgets que vous pouvez facilement ajuster pour vous approprier cet espace."
|
ui-desc: "Aucune interface graphique ne peut plaire à tout le monde. Par conséquent, Misskey possède une interface utilisateur hautement personnalisable selon vos goûts. Vous pouvez rendre votre page d'accueil originale en modifiant la mise en page de votre fil et en déplaçant les widgets que vous pouvez facilement ajuster pour vous approprier cet espace."
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
drive-desc: "Vous voulez poster une photo que vous avez déjà transférée ? Vous souhaitez organiser, nommer et créer un dossier pour vos fichiers téléversés ? Misskey Drive est la meilleure solution pour vous. Très facile de partager vos fichiers en ligne."
|
drive-desc: "Vous voulez poster une photo que vous avez déjà transférée ? Vous souhaitez organiser, nommer et créer un dossier pour vos fichiers téléversés ? Misskey Drive est la meilleure solution pour vous. Très facile de partager vos fichiers en ligne."
|
||||||
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseau social fédéré, vous pouvez essayer d’autres instances afin de trouver vos amis si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien !"
|
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseau social fédéré, vous pouvez essayer d’autres instances afin de trouver vos amis si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien !"
|
||||||
adblock:
|
|
||||||
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é."
|
|
||||||
application-authorization: "Autorisations de l’application"
|
application-authorization: "Autorisations de l’application"
|
||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte pourrait être compromis."
|
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte pourrait être compromis."
|
||||||
@@ -34,6 +31,20 @@ common:
|
|||||||
signup: "S'enregistrer"
|
signup: "S'enregistrer"
|
||||||
signout: "Se déconnecter"
|
signout: "Se déconnecter"
|
||||||
reload-to-apply-the-setting: "Le rechargement de la page est nécessaire pour appliquer ces paramètres. Désirez-vous la recharger maintenant ?"
|
reload-to-apply-the-setting: "Le rechargement de la page est nécessaire pour appliquer ces paramètres. Désirez-vous la recharger maintenant ?"
|
||||||
|
unfollow-confirm: "Désirez-vous vous désabonner de {name} ?"
|
||||||
|
delete-confirm: "Supprimer cette publication ?"
|
||||||
|
signin-required: "Veuillez vous connecter"
|
||||||
|
notification-type: "Type de notifications"
|
||||||
|
notification-types:
|
||||||
|
all: "Tout"
|
||||||
|
pollVote: "Sondages"
|
||||||
|
follow: "Abonnements"
|
||||||
|
receiveFollowRequest: "Demandes d’abonnements"
|
||||||
|
reply: "Réponses"
|
||||||
|
quote: "Cité par"
|
||||||
|
renote: "Partages"
|
||||||
|
mention: "Mentions"
|
||||||
|
reaction: "Réactions"
|
||||||
got-it: "J’ai compris !"
|
got-it: "J’ai compris !"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
@@ -78,17 +89,47 @@ common:
|
|||||||
"write:drive": "Écrire sur le Drive"
|
"write:drive": "Écrire sur le Drive"
|
||||||
"read:favorites": "Afficher les favoris"
|
"read:favorites": "Afficher les favoris"
|
||||||
"write:favorites": "Écrire des favoris"
|
"write:favorites": "Écrire des favoris"
|
||||||
|
"read:following": "Voir les informations de l'abonné"
|
||||||
"read:messaging": "Lire les conversations"
|
"read:messaging": "Lire les conversations"
|
||||||
"write:messaging": "Utiliser la messagerie"
|
"write:messaging": "Utiliser la messagerie"
|
||||||
|
"read:mutes": "Voir les comptes masqués"
|
||||||
"write:notes": "Créer ou supprimer des publications"
|
"write:notes": "Créer ou supprimer des publications"
|
||||||
"read:notifications": "Afficher les notifications"
|
"read:notifications": "Afficher les notifications"
|
||||||
"write:notifications": "Gérer vos notifications"
|
"write:notifications": "Gérer vos notifications"
|
||||||
"read:reactions": "Lire les réactions"
|
"read:reactions": "Lire les réactions"
|
||||||
"write:reactions": "Gérer vos réactions"
|
"write:reactions": "Gérer vos réactions"
|
||||||
"write:votes": "Vote"
|
"write:votes": "Vote"
|
||||||
|
"read:pages": "Afficher la page"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "Les utilisateurs suivants afficheront leurs publications sur votre fil."
|
follow-users-to-make-your-timeline: "Les utilisateur·rice·s suivant·e·s afficheront leurs publications sur votre fil."
|
||||||
explore: "Trouver des utilisateurs"
|
explore: "Trouver des utilisateur·rice·s"
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "Joindre des informations de localisation"
|
||||||
|
hide-contents: "Masquer les contenus"
|
||||||
|
reply-placeholder: "Répondre à cette note …"
|
||||||
|
quote-placeholder: "Citer cette note …"
|
||||||
|
option-quote-placeholder: "Citer ce billet ... (Facultatif)"
|
||||||
|
quote-attached: "Cité"
|
||||||
|
submit: "Publication"
|
||||||
|
reply: "Répondre"
|
||||||
|
renote: "Republier"
|
||||||
|
posting: "Publication …"
|
||||||
|
attach-media-from-local: "Joindre un média depuis votre appareil"
|
||||||
|
attach-media-from-drive: "Joindre un média depuis votre Drive"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "Créer un sondage"
|
||||||
|
text-remain: "{} caractères restants"
|
||||||
|
recent-tags: "Récent"
|
||||||
|
local-only-message: "Ce message sera publié uniquement sur le fil local"
|
||||||
|
click-to-tagging: "Cliquer pour taguer"
|
||||||
|
visibility: "Visibilité"
|
||||||
|
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
||||||
|
error: "Erreur"
|
||||||
|
enter-username: "Saisir un nom d'utilisateur"
|
||||||
|
add-visible-user: "Ajouter un utilisateur"
|
||||||
|
cw-placeholder: "Commenter le contenu (optionnel)"
|
||||||
|
username-prompt: "Saisir un nom d'utilisateur"
|
||||||
|
enter-file-name: "Éditer le nom du fichier"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "D"
|
sunday: "D"
|
||||||
monday: "L"
|
monday: "L"
|
||||||
@@ -120,13 +161,13 @@ common:
|
|||||||
public: "Public"
|
public: "Public"
|
||||||
home: "Principal"
|
home: "Principal"
|
||||||
home-desc: "Publier sur le fil principal uniquement"
|
home-desc: "Publier sur le fil principal uniquement"
|
||||||
followers: "Abonnés"
|
followers: "Abonné·e·s"
|
||||||
followers-desc: "Publier à vos abonnés uniquement"
|
followers-desc: "Publier à vos abonné·e·s uniquement"
|
||||||
specified: "Direct"
|
specified: "Direct"
|
||||||
specified-desc: "Publier uniquement aux utilisateurs mentionnés"
|
specified-desc: "Publier uniquement aux utilisateur·rice·s mentionné·e·s"
|
||||||
local-public: "Local (Public)"
|
local-public: "Local (Public)"
|
||||||
local-home: "Accueil (local uniquement)"
|
local-home: "Accueil (local uniquement)"
|
||||||
local-followers: "Local (Abonnés)"
|
local-followers: "Abonné·e·s (Local uniquement)"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "Que faites-vous maintenant ?"
|
a: "Que faites-vous maintenant ?"
|
||||||
b: "Quoi de neuf ?"
|
b: "Quoi de neuf ?"
|
||||||
@@ -140,7 +181,7 @@ common:
|
|||||||
notification: "Notifications"
|
notification: "Notifications"
|
||||||
apps: "Applications"
|
apps: "Applications"
|
||||||
tags: "Hashtags"
|
tags: "Hashtags"
|
||||||
mute-and-block: "Silencés / Bloqués"
|
mute-and-block: "Masqués / Bloqués"
|
||||||
blocking: "En cours blocage"
|
blocking: "En cours blocage"
|
||||||
security: "Sécurité"
|
security: "Sécurité"
|
||||||
signin: "Historique des connexions"
|
signin: "Historique des connexions"
|
||||||
@@ -148,6 +189,7 @@ common:
|
|||||||
other: "Avancé"
|
other: "Avancé"
|
||||||
appearance: "Apparence"
|
appearance: "Apparence"
|
||||||
behavior: "Comportement"
|
behavior: "Comportement"
|
||||||
|
reactions: "Réaction"
|
||||||
fetch-on-scroll: "Chargement automatique lors du défilement"
|
fetch-on-scroll: "Chargement automatique lors du défilement"
|
||||||
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
|
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
|
||||||
note-visibility: "Visibilité de la publication"
|
note-visibility: "Visibilité de la publication"
|
||||||
@@ -155,7 +197,10 @@ common:
|
|||||||
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: "Moteur de recherche Web"
|
web-search-engine: "Moteur de recherche Web"
|
||||||
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "Coller"
|
||||||
|
pasted-file-name-desc: "Exemple : \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
keep-cw: "Maintenir l'avertissement de contenu"
|
keep-cw: "Maintenir l'avertissement de contenu"
|
||||||
|
keep-cw-desc: "Lorsque vous répondez à un message, le même avertissement de contenu est reprit par défaut dans la réponse, le même que celui qui a été défini dans le message original."
|
||||||
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
||||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||||
use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
|
use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
|
||||||
@@ -191,16 +236,18 @@ common:
|
|||||||
deck-column-width-wide: "Large"
|
deck-column-width-wide: "Large"
|
||||||
use-shadow: "Utiliser les ombres dans l'interface utilisateur"
|
use-shadow: "Utiliser les ombres dans l'interface utilisateur"
|
||||||
rounded-corners: "Coins arrondis de l'interface utilisateur"
|
rounded-corners: "Coins arrondis de l'interface utilisateur"
|
||||||
circle-icons: "Utiliser des icônes circulaires"
|
circle-icons: "Utiliser des avatar circulaires"
|
||||||
contrasted-acct: "Ajouter du contraste au nom de l’utilisateur"
|
contrasted-acct: "Ajouter du contraste au nom de l’utilisateur"
|
||||||
wallpaper: "Image du fond d'écran"
|
wallpaper: "Image du fond d'écran"
|
||||||
choose-wallpaper: "Sélectionner un fond d'écran"
|
choose-wallpaper: "Sélectionner un fond d'écran"
|
||||||
delete-wallpaper: "Supprimer le fond d'écran"
|
delete-wallpaper: "Supprimer le fond d'écran"
|
||||||
post-form-on-timeline: "Afficher le champs de saisie en haut du fil"
|
post-form-on-timeline: "Afficher le champs de saisie en haut du fil"
|
||||||
show-clock-on-header: "Afficher l'horloge sur le coté supérieur droit"
|
show-clock-on-header: "Afficher l'horloge sur le coté supérieur droit"
|
||||||
|
show-reply-target: "Afficher les réponses"
|
||||||
timeline: "Fil d’actualité"
|
timeline: "Fil d’actualité"
|
||||||
show-my-renotes: "Afficher mes republications dans le fil"
|
show-my-renotes: "Afficher mes republications dans le fil"
|
||||||
show-renoted-my-notes: "Afficher les partages de mes propres notes sur le fil"
|
show-renoted-my-notes: "Afficher les partages de mes propres notes sur le fil"
|
||||||
|
show-local-renotes: "Afficher les partages locaux sur les fils"
|
||||||
remain-deleted-note: "Continuer à afficher les notes supprimées"
|
remain-deleted-note: "Continuer à afficher les notes supprimées"
|
||||||
sound: "Son"
|
sound: "Son"
|
||||||
enable-sounds: "Activer les sons"
|
enable-sounds: "Activer les sons"
|
||||||
@@ -234,6 +281,21 @@ common:
|
|||||||
disable-via-mobile: "Enlever la mention publié via 'mobile'"
|
disable-via-mobile: "Enlever la mention publié via 'mobile'"
|
||||||
load-raw-images: "Afficher les photos jointes dans leur qualité originale"
|
load-raw-images: "Afficher les photos jointes dans leur qualité originale"
|
||||||
load-remote-media: "Afficher les médias depuis le serveur distant"
|
load-remote-media: "Afficher les médias depuis le serveur distant"
|
||||||
|
sync: "Synchroniser"
|
||||||
|
save: "Enregistrer"
|
||||||
|
saved: "enregistré"
|
||||||
|
home-profile: "Profil principal"
|
||||||
|
deck-profile: "Profil deck"
|
||||||
|
room: "Pièce"
|
||||||
|
_room:
|
||||||
|
graphicsQuality: "Qualité des graphismes"
|
||||||
|
_graphicsQuality:
|
||||||
|
ultra: "Très élevée"
|
||||||
|
high: "Élevée"
|
||||||
|
medium: "Moyenne"
|
||||||
|
low: "Basse"
|
||||||
|
cheep: "Minimale"
|
||||||
|
useOrthographicCamera: "Utiliser une caméra orthographique"
|
||||||
search: "Recherche"
|
search: "Recherche"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
loading: "Chargement en cours …"
|
loading: "Chargement en cours …"
|
||||||
@@ -283,7 +345,7 @@ common:
|
|||||||
version: "Version"
|
version: "Version"
|
||||||
broadcast: "Diffusion"
|
broadcast: "Diffusion"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
users: "Utilisateurs recommandés"
|
users: "Utilisateur·rice·s recommandé·e·s"
|
||||||
polls: "Sondages"
|
polls: "Sondages"
|
||||||
post-form: "Champs de publication"
|
post-form: "Champs de publication"
|
||||||
server: "Infos sur le serveur"
|
server: "Infos sur le serveur"
|
||||||
@@ -310,13 +372,16 @@ auth/views/index.vue:
|
|||||||
error: "La session n’existe pas."
|
error: "La session n’existe pas."
|
||||||
sign-in: "Veuillez vous connecter"
|
sign-in: "Veuillez vous connecter"
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
popular-users: "Utilisateurs populaires"
|
pinned-users: "Utilisateur·rice·s épinglé·e·s"
|
||||||
recently-updated-users: "Utilisateurs actifs récemment"
|
popular-users: "Utilisateur·rice·s populaires"
|
||||||
|
recently-updated-users: "Utilisateur·rice·s actif·ve·s récemment"
|
||||||
recently-registered-users: "Les nouveaux inscrits"
|
recently-registered-users: "Les nouveaux inscrits"
|
||||||
popular-tags: "Mots-clés populaires"
|
popular-tags: "Mots-clés populaires"
|
||||||
federated: "Du Fédiverse"
|
federated: "Du Fédiverse"
|
||||||
explore: "Explorer {host}"
|
explore: "Explorer {host}"
|
||||||
users-info: "Actuellement, {users} utilisateurs se sont inscrit ici"
|
users-info: "Actuellement, {users} utilisateur·rice·s se sont inscrit ici"
|
||||||
|
common/views/components/reactions-viewer.details.vue:
|
||||||
|
few-users: "{users} ont réagit avec {reaction}"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "Activer la lecture"
|
enable-player: "Activer la lecture"
|
||||||
disable-player: "Fermer le lecteur"
|
disable-player: "Fermer le lecteur"
|
||||||
@@ -354,6 +419,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
black-or-white: "Noirs/Blancs"
|
black-or-white: "Noirs/Blancs"
|
||||||
black-is: "{} Noirs"
|
black-is: "{} Noirs"
|
||||||
rules: "Règles"
|
rules: "Règles"
|
||||||
|
is-llotheo: "Celui ou celle qui a le moins de pièces gagne (Llotheo)"
|
||||||
looped-map: "Carte en boucle"
|
looped-map: "Carte en boucle"
|
||||||
can-put-everywhere: "Peut poser partout"
|
can-put-everywhere: "Peut poser partout"
|
||||||
settings-of-the-bot: "Configuration du bot"
|
settings-of-the-bot: "Configuration du bot"
|
||||||
@@ -441,6 +507,7 @@ common/views/components/messaging.vue:
|
|||||||
user: "Utilisateur·rice·s"
|
user: "Utilisateur·rice·s"
|
||||||
group: "Groupe"
|
group: "Groupe"
|
||||||
start-with-user: "Initier une discussion avec un·e utilisateur·rice"
|
start-with-user: "Initier une discussion avec un·e utilisateur·rice"
|
||||||
|
start-with-group: "Démarrer un groupe et converser"
|
||||||
select-group: "Sélectionner un groupe"
|
select-group: "Sélectionner un groupe"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
not-talked-user: "Vous n'avez pas encore discuté avec cet·te utilisateur·rice"
|
not-talked-user: "Vous n'avez pas encore discuté avec cet·te utilisateur·rice"
|
||||||
@@ -480,7 +547,9 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "Désépingler"
|
unpin: "Désépingler"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
delete-confirm: "Supprimer cette publication ?"
|
delete-confirm: "Supprimer cette publication ?"
|
||||||
|
delete-and-edit: "Supprimer et réécrire"
|
||||||
remote: "Afficher la note originale"
|
remote: "Afficher la note originale"
|
||||||
|
pin-limit-exceeded: "Vous ne pouvez plus épingler davantage de publications."
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "Mention"
|
mention: "Mention"
|
||||||
mute: "Silencier"
|
mute: "Silencier"
|
||||||
@@ -498,8 +567,10 @@ common/views/components/user-menu.vue:
|
|||||||
report-abuse-reported: "Transmit à l’administrateur. Merci de votre collaboration."
|
report-abuse-reported: "Transmit à l’administrateur. Merci de votre collaboration."
|
||||||
silence: "Mettre en sourdine"
|
silence: "Mettre en sourdine"
|
||||||
unsilence: "Enlever la sourdine"
|
unsilence: "Enlever la sourdine"
|
||||||
|
silence-confirm: "Êtes-vous surs de vouloir mettre cet·te utilisateur·rice en sourdine ?"
|
||||||
suspend: "Suspendre"
|
suspend: "Suspendre"
|
||||||
unsuspend: "Ne plus suspendre"
|
unsuspend: "Ne plus suspendre"
|
||||||
|
suspend-confirm: "Êtes-vous surs de vouloir suspendre cet·te utilisateur·rice ?"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Voter pour '{}'"
|
vote-to: "Voter pour '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
@@ -518,6 +589,7 @@ common/views/components/poll-editor.vue:
|
|||||||
remove: "Supprimer ce choix"
|
remove: "Supprimer ce choix"
|
||||||
add: "+ Ajouter un choix"
|
add: "+ Ajouter un choix"
|
||||||
destroy: "Annuler ce sondage"
|
destroy: "Annuler ce sondage"
|
||||||
|
multiple: "Autoriser le multi-choix"
|
||||||
expiration: "Valide jusqu'à"
|
expiration: "Valide jusqu'à"
|
||||||
infinite: "Illimité"
|
infinite: "Illimité"
|
||||||
at: "Choisir une date et une durée"
|
at: "Choisir une date et une durée"
|
||||||
@@ -531,7 +603,8 @@ common/views/components/poll-editor.vue:
|
|||||||
hour: "Heures"
|
hour: "Heures"
|
||||||
day: "D"
|
day: "D"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Choisissez votre réaction"
|
choose-reaction: "Envoyer une réaction"
|
||||||
|
input-reaction-placeholder: "ou insérez un émoji"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "Émoji personnalisé"
|
custom-emoji: "Émoji personnalisé"
|
||||||
people: "Personnes"
|
people: "Personnes"
|
||||||
@@ -542,6 +615,14 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Objets"
|
objects: "Objets"
|
||||||
symbols: "Symboles"
|
symbols: "Symboles"
|
||||||
flags: "Drapeaux"
|
flags: "Drapeaux"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "Mode"
|
||||||
|
intro: "Vous pouvez choisir, si vous voulez utiliser la disposition de bureau ou mobile."
|
||||||
|
choices:
|
||||||
|
auto: "Choisir la disposition automatiquement"
|
||||||
|
desktop: "Toujours utiliser la disposition de bureau"
|
||||||
|
mobile: "Toujours utiliser la disposition mobile"
|
||||||
|
info: "Le rechargement de la page est requis afin d'appliquer les modifications."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Nom d'utilisateur·rice"
|
username: "Nom d'utilisateur·rice"
|
||||||
password: "Mot de passe"
|
password: "Mot de passe"
|
||||||
@@ -552,6 +633,8 @@ common/views/components/signin.vue:
|
|||||||
signin-with-github: "Se connecter avec GitHub"
|
signin-with-github: "Se connecter avec GitHub"
|
||||||
signin-with-discord: "Se connecter avec Discord"
|
signin-with-discord: "Se connecter avec Discord"
|
||||||
login-failed: "Échec d’authentification. Veuillez vérifier que votre nom d’utilisateur et mot de passe sont corrects."
|
login-failed: "Échec d’authentification. Veuillez vérifier que votre nom d’utilisateur et mot de passe sont corrects."
|
||||||
|
tap-key: "Cliquez sur la clé de sécurité pour vous connecter"
|
||||||
|
enter-2fa-code: "Entrez votre code de vérification"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "Code d’invitation"
|
invitation-code: "Code d’invitation"
|
||||||
invitation-info: "Si vous n’avez pas de code d’invitation, contactez un <a href=\"{}\">administrateur</a>."
|
invitation-info: "Si vous n’avez pas de code d’invitation, contactez un <a href=\"{}\">administrateur</a>."
|
||||||
@@ -573,6 +656,7 @@ common/views/components/signup.vue:
|
|||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
password-not-matched: "Les mots de passe ne correspondent pas."
|
password-not-matched: "Les mots de passe ne correspondent pas."
|
||||||
recaptcha: "Vérifier"
|
recaptcha: "Vérifier"
|
||||||
|
agree-to: "Accepter {0}."
|
||||||
tos: "Conditions d'utilisation"
|
tos: "Conditions d'utilisation"
|
||||||
create: "Créer un compte"
|
create: "Créer un compte"
|
||||||
some-error: "La création du compte a échoué. Veuillez réessayer."
|
some-error: "La création du compte a échoué. Veuillez réessayer."
|
||||||
@@ -618,13 +702,13 @@ common/views/components/visibility-chooser.vue:
|
|||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
followers-desc: "Publier à vos abonné·e·s uniquement"
|
followers-desc: "Publier à vos abonné·e·s uniquement"
|
||||||
specified: "Direct"
|
specified: "Direct"
|
||||||
specified-desc: "Publier uniquement aux utilisateurs mentionnés"
|
specified-desc: "Publier uniquement aux utilisateur·rice·s mentionné·e·s"
|
||||||
local-public: "Local (Public)"
|
local-public: "Local (Public)"
|
||||||
local-public-desc: "Ne pas publier pour les distants"
|
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: "Abonné·e·s (Local uniquement)"
|
||||||
common/views/components/trends.vue:
|
common/views/components/trends.vue:
|
||||||
count: "{} utilisateurs mentionnés"
|
count: "{} utilisateur·rice·s mentionné·e·s"
|
||||||
empty: "Aucune tendance"
|
empty: "Aucune tendance"
|
||||||
common/views/components/language-settings.vue:
|
common/views/components/language-settings.vue:
|
||||||
title: "Langue "
|
title: "Langue "
|
||||||
@@ -655,6 +739,9 @@ 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"
|
||||||
|
unable-to-process: "L'opération n'a pas pu être complétée"
|
||||||
|
avatar-not-an-image: "Le fichier sélectionné pour votre avatar n'est pas une image"
|
||||||
|
banner-not-an-image: "Le fichier sélectionné pour votre bannière n'est pas une image"
|
||||||
email: "Paramètres de messagerie"
|
email: "Paramètres de messagerie"
|
||||||
email-address: "Adresse de courrier électronique"
|
email-address: "Adresse de courrier électronique"
|
||||||
email-verified: "L’adresse du courrier électronique a été vérifiée."
|
email-verified: "L’adresse du courrier électronique a été vérifiée."
|
||||||
@@ -674,6 +761,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "Zone de danger"
|
danger-zone: "Zone de danger"
|
||||||
delete-account: "Supprimer le compte"
|
delete-account: "Supprimer le compte"
|
||||||
account-deleted: "Le compte a été supprimé. Cela peut prendre un certain temps avant que toutes les données disparaissent."
|
account-deleted: "Le compte a été supprimé. Cela peut prendre un certain temps avant que toutes les données disparaissent."
|
||||||
|
profile-metadata: "Métadonnées du profil"
|
||||||
|
metadata-label: "Étiquette"
|
||||||
|
metadata-content: "Contenu"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "Utilisateur·rice"
|
users: "Utilisateur·rice"
|
||||||
rename: "Renommer la liste"
|
rename: "Renommer la liste"
|
||||||
@@ -683,8 +773,14 @@ common/views/components/user-list-editor.vue:
|
|||||||
deleted: "Supprimé"
|
deleted: "Supprimé"
|
||||||
add-user: "Ajouter un utilisateur"
|
add-user: "Ajouter un utilisateur"
|
||||||
common/views/components/user-group-editor.vue:
|
common/views/components/user-group-editor.vue:
|
||||||
|
users: "Membres"
|
||||||
rename: "Renommer le groupe"
|
rename: "Renommer le groupe"
|
||||||
delete: "Supprimer le groupe"
|
delete: "Supprimer le groupe"
|
||||||
|
transfer: "Transférer de groupe"
|
||||||
|
transfer-are-you-sure: "Êtes vous surs de vouloir ajouter @$2 au groupe $1 ?"
|
||||||
|
transferred: "Groupe transféré"
|
||||||
|
remove-user: "Enlever un utilisateur de ce groupe"
|
||||||
|
delete-are-you-sure: "Désirez-vous vraiment supprimer le groupe $1 ?"
|
||||||
deleted: "Supprimé"
|
deleted: "Supprimé"
|
||||||
invite: "Inviter"
|
invite: "Inviter"
|
||||||
invited: "Invitation envoyée avec succès"
|
invited: "Invitation envoyée avec succès"
|
||||||
@@ -776,6 +872,7 @@ desktop:
|
|||||||
uploading-avatar: "Téléversement du nouvel avatar"
|
uploading-avatar: "Téléversement du nouvel avatar"
|
||||||
avatar-updated: "Mise à jour de l’avatar avec succès"
|
avatar-updated: "Mise à jour de l’avatar avec succès"
|
||||||
choose-avatar: "Choisir un avatar"
|
choose-avatar: "Choisir un avatar"
|
||||||
|
unable-to-process: "L'opération n'a pas pu être complétée"
|
||||||
invalid-filetype: "Ce format de fichier n’est pas pris en charge"
|
invalid-filetype: "Ce format de fichier n’est pas pris en charge"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Noirs ... Total"
|
total: "Noirs ... Total"
|
||||||
@@ -816,7 +913,7 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
||||||
copy-url: "Copier l’URL"
|
copy-url: "Copier l’URL"
|
||||||
download: "Télécharger"
|
download: "Télécharger"
|
||||||
else-files: "Autres..."
|
else-files: "Avancé"
|
||||||
set-as-avatar: "Utiliser en tant qu'avatar"
|
set-as-avatar: "Utiliser en tant qu'avatar"
|
||||||
set-as-banner: "Utiliser en tant que bannière"
|
set-as-banner: "Utiliser en tant que bannière"
|
||||||
open-in-app: "Ouvrir dans l'application"
|
open-in-app: "Ouvrir dans l'application"
|
||||||
@@ -826,15 +923,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied: "Copié"
|
copied: "Copié"
|
||||||
copied-url-to-clipboard: "L'URL a été copiée dans le presse-papier"
|
copied-url-to-clipboard: "L'URL a été copiée dans le presse-papier"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "Emplacement de téléversement par défaut"
|
||||||
unable-to-process: "L'opération n'a pas pu être complétée"
|
unable-to-process: "L'opération n'a pas pu être complétée"
|
||||||
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
||||||
unhandled-error: "Erreur inconnue"
|
unhandled-error: "Erreur inconnue"
|
||||||
|
unable-to-delete: "Ne peut pas être supprimé"
|
||||||
|
has-child-files-or-folders: "Ce dossier n'est pas vide, il ne peut pas être supprimé"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "Déplacer dans ce dossier"
|
move-to-this-folder: "Déplacer dans ce dossier"
|
||||||
show-in-new-window: "Ouvrir dans une nouvelle fenêtre"
|
show-in-new-window: "Ouvrir dans une nouvelle fenêtre"
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
rename-folder: "Renommer le dossier"
|
rename-folder: "Renommer le dossier"
|
||||||
input-new-folder-name: "Entrer un nouveau nom"
|
input-new-folder-name: "Entrer un nouveau nom"
|
||||||
|
else-folders: "Avancé"
|
||||||
|
set-as-upload-folder: "Spécifier en tant que dossier de téléversement par défaut"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
empty-draghover: "Drop Welcome!"
|
empty-draghover: "Drop Welcome!"
|
||||||
@@ -858,7 +960,7 @@ desktop/views/components/media-video.vue:
|
|||||||
sensitive: "Le contenu est NSFW"
|
sensitive: "Le contenu est NSFW"
|
||||||
click-to-show: "Cliquer pour afficher"
|
click-to-show: "Cliquer pour afficher"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} abonné·e·s"
|
followers: "Abonné·e·s de {}"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
empty: "Il semble que vous n’avez pas encore d’abonné·e·s."
|
empty: "Il semble que vous n’avez pas encore d’abonné·e·s."
|
||||||
desktop/views/components/following-window.vue:
|
desktop/views/components/following-window.vue:
|
||||||
@@ -879,8 +981,8 @@ desktop/views/components/note-detail.vue:
|
|||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
location: "Géolocalisation"
|
location: "Géolocalisation"
|
||||||
renote: "Republier"
|
renote: "Republier"
|
||||||
add-reaction: "Ajouter votre reaction"
|
add-reaction: "Ajouter une réaction"
|
||||||
undo-reaction: "Inverser la réaction"
|
undo-reaction: "Annuler la réaction"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
renote: "Partager"
|
renote: "Partager"
|
||||||
@@ -895,34 +997,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Aucune de notification !"
|
empty: "Aucune de notification !"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Ajouter un·e utilisateur·rice"
|
|
||||||
attach-location-information: "Attacher des informations de localisation"
|
|
||||||
hide-contents: "Masquer les contenus"
|
|
||||||
reply-placeholder: "Répondre à cette note …"
|
|
||||||
quote-placeholder: "Citer cette note …"
|
|
||||||
submit: "Publier"
|
|
||||||
reply: "Répondre"
|
|
||||||
renote: "Republier"
|
|
||||||
posted: "Publié !"
|
posted: "Publié !"
|
||||||
replied: "Répondu !"
|
replied: "Répondu !"
|
||||||
reposted: "Reposté !"
|
reposted: "Reposté !"
|
||||||
note-failed: "La note à échoué"
|
note-failed: "La note à échoué"
|
||||||
reply-failed: "La réponse a échoué"
|
reply-failed: "La réponse a échoué"
|
||||||
renote-failed: "Échec lors de la republication"
|
renote-failed: "Échec lors de la republication"
|
||||||
posting: "Publication …"
|
|
||||||
attach-media-from-local: "Joindre un média depuis votre appareil"
|
|
||||||
attach-media-from-drive: "Joindre un média depuis votre Drive"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Créer un sondage"
|
|
||||||
text-remain: "{} caractères restants"
|
|
||||||
recent-tags: "Récent"
|
|
||||||
local-only-message: "Ce message sera publié uniquement sur le fil local"
|
|
||||||
click-to-tagging: "Cliquer pour taguer"
|
|
||||||
visibility: "Visibilité"
|
|
||||||
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
|
||||||
error: "Erreur"
|
|
||||||
enter-username: "Saisir un nom d'utilisateur …"
|
|
||||||
annotations: "Commenter le contenu (optionnel)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nouvelle note"
|
note: "Nouvelle note"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
@@ -962,6 +1042,14 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "Sauvegarde des paramètres avec succès !"
|
success: "Sauvegarde des paramètres avec succès !"
|
||||||
failed: "L’opération a échoué. Veuillez vous assurer que le jeton a été saisi correctement."
|
failed: "L’opération a échoué. Veuillez vous assurer que le jeton a été saisi correctement."
|
||||||
info: "À partir de maintenant, à chaque fois que vous vous connectez entrez votre mot de passe ainsi que le jeton généré sur votre appareil."
|
info: "À partir de maintenant, à chaque fois que vous vous connectez entrez votre mot de passe ainsi que le jeton généré sur votre appareil."
|
||||||
|
totp-header: "Application d'authentification"
|
||||||
|
security-key-header: "Clé de sécurité"
|
||||||
|
last-used: "Dernière utilisation :"
|
||||||
|
activate-key: "Cliquez pour activer la clé de sécurité"
|
||||||
|
security-key-name: "Nom de la clé"
|
||||||
|
something-went-wrong: "Oula ! Il y a eu un problème lors de l’enregistrement de la clé."
|
||||||
|
key-unregistered: "La clé a été supprimée"
|
||||||
|
use-password-less-login: "Utiliser une connexion sans mot de passe"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "Contenu sensible"
|
sensitive: "Contenu sensible"
|
||||||
click-to-show: "Cliquer pour afficher"
|
click-to-show: "Cliquer pour afficher"
|
||||||
@@ -986,10 +1074,13 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "Maximale"
|
max: "Maximale"
|
||||||
in-use: "utilisé"
|
in-use: "utilisé"
|
||||||
stats: "Statistiques"
|
stats: "Statistiques"
|
||||||
|
default-upload-folder: "Emplacement par défaut du dossier de transfert"
|
||||||
|
default-upload-folder-name: "Dossier·s"
|
||||||
|
change-default-upload-folder: "Changer de dossier"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "Silencés / Bloqués"
|
mute-and-block: "Masqués / Bloqués"
|
||||||
mute: "Mettre en sourdine"
|
mute: "Mis en sourdine"
|
||||||
block: "En cours blocage"
|
block: "Vous avez bloqué"
|
||||||
no-muted-users: "Aucun utilisateur n’est mis en sourdine"
|
no-muted-users: "Aucun utilisateur n’est mis en sourdine"
|
||||||
no-blocked-users: "Aucun utilisateur n’est bloqué"
|
no-blocked-users: "Aucun utilisateur n’est bloqué"
|
||||||
word-mute: "Filtre de mots"
|
word-mute: "Filtre de mots"
|
||||||
@@ -1039,6 +1130,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
groups: "Groupes"
|
groups: "Groupes"
|
||||||
follow-requests: "Demandes d’abonnement"
|
follow-requests: "Demandes d’abonnement"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
|
room: "Pièce"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "Jeux"
|
game: "Jeux"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
@@ -1071,7 +1163,10 @@ admin/views/index.vue:
|
|||||||
abuse: "Abus"
|
abuse: "Abus"
|
||||||
queue: "File d’attente"
|
queue: "File d’attente"
|
||||||
logs: "Journaux"
|
logs: "Journaux"
|
||||||
|
db: "Base de données"
|
||||||
back-to-misskey: "Retour vers Misskey"
|
back-to-misskey: "Retour vers Misskey"
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "Tables"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
accounts: "Comptes"
|
accounts: "Comptes"
|
||||||
@@ -1083,6 +1178,32 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "File d'attente"
|
title: "File d'attente"
|
||||||
remove-all-jobs: "Enlever toutes les tâches en attente"
|
remove-all-jobs: "Enlever toutes les tâches en attente"
|
||||||
|
jobs: "Tâches"
|
||||||
|
queue: "File d'attente"
|
||||||
|
domains:
|
||||||
|
deliver: "Délivrées"
|
||||||
|
inbox: "Reçues"
|
||||||
|
db: "Base de données"
|
||||||
|
objectStorage: "Stockage d'objets"
|
||||||
|
state: "État"
|
||||||
|
states:
|
||||||
|
active: "en cours"
|
||||||
|
delayed: "Programmé"
|
||||||
|
waiting: "En file d'attente"
|
||||||
|
result-is-truncated: "Le résultat est tronqué"
|
||||||
|
other-queues: "Autres files d’attente"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "Journaux"
|
||||||
|
domain: "Domaine"
|
||||||
|
level: "Niveau"
|
||||||
|
levels:
|
||||||
|
all: "Tous"
|
||||||
|
info: "Informations"
|
||||||
|
success: "Succès"
|
||||||
|
warning: "Avertissement"
|
||||||
|
error: "Erreur"
|
||||||
|
debug: "Débogage"
|
||||||
|
delete-all: "Effacer tout"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abus"
|
title: "Abus"
|
||||||
target: "Cible"
|
target: "Cible"
|
||||||
@@ -1102,13 +1223,18 @@ admin/views/instance.vue:
|
|||||||
languages-desc: "Vous pouvez en définir plus d’une, séparées par des espaces."
|
languages-desc: "Vous pouvez en définir plus d’une, séparées par des espaces."
|
||||||
tos-url: "URL des conditions d'utilisation"
|
tos-url: "URL des conditions d'utilisation"
|
||||||
repository-url: "URL du dépôt"
|
repository-url: "URL du dépôt"
|
||||||
|
feedback-url: "URL pour les commentaires"
|
||||||
maintainer-config: "Informations de l’administrateur"
|
maintainer-config: "Informations de l’administrateur"
|
||||||
maintainer-name: "Nom de l’administrateur"
|
maintainer-name: "Nom de l’administrateur"
|
||||||
maintainer-email: "Contact administratif"
|
maintainer-email: "Contact administratif"
|
||||||
advanced-config: "Autres réglages"
|
advanced-config: "Autres réglages"
|
||||||
|
note-and-tl: "Notes et fils"
|
||||||
drive-config: "Paramètres du lecteur"
|
drive-config: "Paramètres du lecteur"
|
||||||
|
use-object-storage: "Utiliser le stockage d'objets"
|
||||||
object-storage-base-url: "URL"
|
object-storage-base-url: "URL"
|
||||||
|
object-storage-prefix: "Préfixe"
|
||||||
object-storage-endpoint: "Point de terminaison"
|
object-storage-endpoint: "Point de terminaison"
|
||||||
|
object-storage-region: "Région"
|
||||||
object-storage-port: "Port"
|
object-storage-port: "Port"
|
||||||
object-storage-access-key: "Clé d'accès"
|
object-storage-access-key: "Clé d'accès"
|
||||||
object-storage-secret-key: "Clé secrète"
|
object-storage-secret-key: "Clé secrète"
|
||||||
@@ -1120,10 +1246,13 @@ admin/views/instance.vue:
|
|||||||
mb: "en mégaoctets"
|
mb: "en mégaoctets"
|
||||||
recaptcha-config: "Paramètres de reCAPTCHA"
|
recaptcha-config: "Paramètres de reCAPTCHA"
|
||||||
recaptcha-info: "Si activé, un jeton reCAPTCHA est requis. Vous pouvez en obtenir un sur https://www.google.com/recaptcha/intro/"
|
recaptcha-info: "Si activé, un jeton reCAPTCHA est requis. Vous pouvez en obtenir un sur https://www.google.com/recaptcha/intro/"
|
||||||
|
recaptcha-info2: "v3 n'est pas supportée. Veuillez utiliser v2."
|
||||||
enable-recaptcha: "Activation de reCAPTCHA"
|
enable-recaptcha: "Activation de reCAPTCHA"
|
||||||
|
recaptcha-site-key: "Clé du site"
|
||||||
recaptcha-secret-key: "Clé secrète"
|
recaptcha-secret-key: "Clé secrète"
|
||||||
recaptcha-preview: "Prévisualisation"
|
recaptcha-preview: "Prévisualisation"
|
||||||
hidden-tags: "Tags cachés"
|
hidden-tags: "Tags cachés"
|
||||||
|
external-service-integration-config: "Services connectés"
|
||||||
twitter-integration-config: "Paramètres de connexion à Twitter"
|
twitter-integration-config: "Paramètres de connexion à Twitter"
|
||||||
twitter-integration-info: "L'URL de callback est {url}."
|
twitter-integration-info: "L'URL de callback est {url}."
|
||||||
enable-twitter-integration: "Activer la connexion à Twitter"
|
enable-twitter-integration: "Activer la connexion à Twitter"
|
||||||
@@ -1148,9 +1277,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "Désactiver le fil local"
|
disable-local-timeline: "Désactiver le fil local"
|
||||||
disable-global-timeline: "Désactiver le fil global"
|
disable-global-timeline: "Désactiver le fil global"
|
||||||
disabling-timelines-info: "Même si vous désactivez ces fils, l'administrateur et les modérateurs peuvent continuer à les utiliser."
|
disabling-timelines-info: "Même si vous désactivez ces fils, l'administrateur et les modérateurs peuvent continuer à les utiliser."
|
||||||
|
enable-emoji-reaction: "Activer les pictogrammes dans les réactions"
|
||||||
|
use-star-for-reaction-fallback: "Utiliser une étoile si une réaction est inconnue"
|
||||||
invite: "Inviter"
|
invite: "Inviter"
|
||||||
save: "Sauvegarder"
|
save: "Sauvegarder"
|
||||||
saved: "Enregistré"
|
saved: "Enregistré"
|
||||||
|
pinned-users: "Utilisateur·rice épinglé·e"
|
||||||
email-config: "Paramètres du serveur de messagerie"
|
email-config: "Paramètres du serveur de messagerie"
|
||||||
email-config-info: "Utilisé pour confirmer votre adresse de courrier électronique et la réinitialisation de votre mot de passe."
|
email-config-info: "Utilisé pour confirmer votre adresse de courrier électronique et la réinitialisation de votre mot de passe."
|
||||||
enable-email: "Activation de la distribution du courrier"
|
enable-email: "Activation de la distribution du courrier"
|
||||||
@@ -1162,6 +1294,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "Effectuer une authentification SMTP"
|
smtp-auth: "Effectuer une authentification SMTP"
|
||||||
smtp-user: "Utilisateur SMTP"
|
smtp-user: "Utilisateur SMTP"
|
||||||
smtp-pass: "Mot de passe SMTP"
|
smtp-pass: "Mot de passe SMTP"
|
||||||
|
test-email: "Test"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "Activer ServiceWorker"
|
enable-serviceworker: "Activer ServiceWorker"
|
||||||
serviceworker-info: "Devrait être activé pour les notifications push."
|
serviceworker-info: "Devrait être activé pour les notifications push."
|
||||||
@@ -1174,7 +1307,7 @@ admin/views/charts.vue:
|
|||||||
per-hour: "par heure"
|
per-hour: "par heure"
|
||||||
federation: "Fédération"
|
federation: "Fédération"
|
||||||
notes: "Publications"
|
notes: "Publications"
|
||||||
users: "Utilisateurs"
|
users: "Utilisateur·rice·s"
|
||||||
drive: "Lecteur"
|
drive: "Lecteur"
|
||||||
network: "Réseau"
|
network: "Réseau"
|
||||||
charts:
|
charts:
|
||||||
@@ -1184,8 +1317,8 @@ admin/views/charts.vue:
|
|||||||
local-notes: "Nombre des publications : augmentation/diminution (Local)"
|
local-notes: "Nombre des publications : augmentation/diminution (Local)"
|
||||||
remote-notes: "Nombre de publications : augmentation/diminution (distants)"
|
remote-notes: "Nombre de publications : augmentation/diminution (distants)"
|
||||||
notes-total: "Total des notes"
|
notes-total: "Total des notes"
|
||||||
users: "Nombre d’utilisateurs : augmentation/diminution"
|
users: "Nombre d’utilisateur·rice·s : augmentation/diminution"
|
||||||
users-total: "Nombre total des utilisateurs"
|
users-total: "Nombre total des utilisateur·rice·s"
|
||||||
active-users: "Utilisateur·rice·s actif·ve·s"
|
active-users: "Utilisateur·rice·s actif·ve·s"
|
||||||
drive: "Capacité utilisée comme stockage : augmentation/diminution"
|
drive: "Capacité utilisée comme stockage : augmentation/diminution"
|
||||||
drive-total: "Utilisation totale du lecteur"
|
drive-total: "Utilisation totale du lecteur"
|
||||||
@@ -1216,6 +1349,8 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
||||||
marked-as-sensitive: "Marqué comme sensible"
|
marked-as-sensitive: "Marqué comme sensible"
|
||||||
unmarked-as-sensitive: "Marqué comme non sensible"
|
unmarked-as-sensitive: "Marqué comme non sensible"
|
||||||
|
clean-remote-files: "Nettoyer le cache des fichiers distants"
|
||||||
|
clean-up: "Nettoyage"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "Actions"
|
operation: "Actions"
|
||||||
username-or-userid: "Nom d’utilisateur·rice ou ID utilisateur"
|
username-or-userid: "Nom d’utilisateur·rice ou ID utilisateur"
|
||||||
@@ -1235,6 +1370,10 @@ admin/views/users.vue:
|
|||||||
unmake-silence: "Enlever la sourdine"
|
unmake-silence: "Enlever la sourdine"
|
||||||
update-remote-user: "Mettre à jour les informations de l’utilisateur·rice distant·e"
|
update-remote-user: "Mettre à jour les informations de l’utilisateur·rice distant·e"
|
||||||
remote-user-updated: "Les informations de l’utilisateur·rice distant·e ont étés mis à jour"
|
remote-user-updated: "Les informations de l’utilisateur·rice distant·e ont étés mis à jour"
|
||||||
|
delete-all-files: "Supprimer tous les fichiers"
|
||||||
|
delete-all-files-confirm: "Êtes vous surs de vouloir supprimer tous les fichiers ?"
|
||||||
|
username: "Nom d'utilisateur·rice"
|
||||||
|
host: "Hôte"
|
||||||
users:
|
users:
|
||||||
title: "Utilisateur·rice·s"
|
title: "Utilisateur·rice·s"
|
||||||
sort:
|
sort:
|
||||||
@@ -1246,6 +1385,7 @@ admin/views/users.vue:
|
|||||||
state:
|
state:
|
||||||
title: "État"
|
title: "État"
|
||||||
all: "Tout"
|
all: "Tout"
|
||||||
|
available: "Disponible"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
moderator: "Modérateur"
|
moderator: "Modérateur"
|
||||||
adminOrModerator: "Administrateur/Modérateur"
|
adminOrModerator: "Administrateur/Modérateur"
|
||||||
@@ -1265,6 +1405,12 @@ admin/views/moderators.vue:
|
|||||||
added: "Ajouté en tant que modérateur"
|
added: "Ajouté en tant que modérateur"
|
||||||
remove: "Révoquer"
|
remove: "Révoquer"
|
||||||
removed: "Le modérateur a été révoqué"
|
removed: "Le modérateur a été révoqué"
|
||||||
|
logs:
|
||||||
|
title: "Journaux"
|
||||||
|
moderator: "Modérateurs"
|
||||||
|
type: "Actions"
|
||||||
|
at: "Date de modification"
|
||||||
|
info: "Informations"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "Ajouter un émoji"
|
title: "Ajouter un émoji"
|
||||||
@@ -1309,6 +1455,7 @@ admin/views/federation.vue:
|
|||||||
latest-request-sent-at: "Dernière requête envoyée"
|
latest-request-sent-at: "Dernière requête envoyée"
|
||||||
latest-request-received-at: "Dernière requête reçue"
|
latest-request-received-at: "Dernière requête reçue"
|
||||||
remove-all-following-info: "Se désabonner de tous les comptes de {host}. Exécutez cette commande si l'instance n'existe plus."
|
remove-all-following-info: "Se désabonner de tous les comptes de {host}. Exécutez cette commande si l'instance n'existe plus."
|
||||||
|
delete-all-files: "Supprimer tous les fichiers"
|
||||||
block: "Bloquer"
|
block: "Bloquer"
|
||||||
marked-as-closed: "Marquées comme fermées"
|
marked-as-closed: "Marquées comme fermées"
|
||||||
lookup: "Recherche"
|
lookup: "Recherche"
|
||||||
@@ -1321,7 +1468,7 @@ admin/views/federation.vue:
|
|||||||
lastCommunicatedAtAsc: "La date et l'heure des interactions plus anciennes"
|
lastCommunicatedAtAsc: "La date et l'heure des interactions plus anciennes"
|
||||||
lastCommunicatedAtDesc: "La date et l'heure des nouvelles interactions"
|
lastCommunicatedAtDesc: "La date et l'heure des nouvelles interactions"
|
||||||
notesDesc: "Description des notes"
|
notesDesc: "Description des notes"
|
||||||
usersAsc: "Peu d'abonnés"
|
usersAsc: "Peu d'abonné·e·s"
|
||||||
followingAsc: "Les moins suivies"
|
followingAsc: "Les moins suivies"
|
||||||
followingDesc: "Ayant le plus d'abonné·e·s"
|
followingDesc: "Ayant le plus d'abonné·e·s"
|
||||||
followersAsc: "Ayant le moins d'abonné·e·s"
|
followersAsc: "Ayant le moins d'abonné·e·s"
|
||||||
@@ -1336,7 +1483,7 @@ admin/views/federation.vue:
|
|||||||
charts: "Graphs"
|
charts: "Graphs"
|
||||||
chart-srcs:
|
chart-srcs:
|
||||||
requests: "Requêtes"
|
requests: "Requêtes"
|
||||||
users: "Nombre d’utilisateurs·trices : augmentation/diminution"
|
users: "Nombre d’utilisateur·trice·s : augmentation/diminution"
|
||||||
users-total: "Nombre total des utilisateur·rice·s"
|
users-total: "Nombre total des utilisateur·rice·s"
|
||||||
notes: "Augmentation/diminution du nombre des notes"
|
notes: "Augmentation/diminution du nombre des notes"
|
||||||
notes-total: "Nombre total des notes"
|
notes-total: "Nombre total des notes"
|
||||||
@@ -1348,6 +1495,7 @@ admin/views/federation.vue:
|
|||||||
hour: "Par heure"
|
hour: "Par heure"
|
||||||
day: "Par jour"
|
day: "Par jour"
|
||||||
blocked-hosts: "En cours blocage"
|
blocked-hosts: "En cours blocage"
|
||||||
|
save: "Enregistrer"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "à propos"
|
about: "à propos"
|
||||||
timeline: "Fil d’actualité"
|
timeline: "Fil d’actualité"
|
||||||
@@ -1377,7 +1525,7 @@ desktop/views/pages/user-list.users.vue:
|
|||||||
desktop/views/pages/user/user.followers-you-know.vue:
|
desktop/views/pages/user/user.followers-you-know.vue:
|
||||||
title: "Abonné·e·s que vous connaissez"
|
title: "Abonné·e·s que vous connaissez"
|
||||||
loading: "Chargement en cours"
|
loading: "Chargement en cours"
|
||||||
no-users: "Aucun abonné connu"
|
no-users: "Aucun·e abonné·e connu·e"
|
||||||
desktop/views/pages/user/user.friends.vue:
|
desktop/views/pages/user/user.friends.vue:
|
||||||
title: "Mentions fréquentes"
|
title: "Mentions fréquentes"
|
||||||
loading: "Chargement en cours"
|
loading: "Chargement en cours"
|
||||||
@@ -1430,8 +1578,10 @@ mobile/views/components/drive.vue:
|
|||||||
nothing-in-drive: "Rien"
|
nothing-in-drive: "Rien"
|
||||||
folder-is-empty: "Ce dossier est vide"
|
folder-is-empty: "Ce dossier est vide"
|
||||||
folder-name: "Nom du dossier"
|
folder-name: "Nom du dossier"
|
||||||
|
here-is-root: "Actuellement, vous êtes dans la racine et non pas dans un dossier."
|
||||||
url-prompt: "URL du fichier que vous souhaitez téléverser"
|
url-prompt: "URL du fichier que vous souhaitez téléverser"
|
||||||
uploading: "Envoi demandé. Le téléversement pourrait prendre un certain temps avant de s'achever."
|
uploading: "Envoi demandé. Le téléversement pourrait prendre un certain temps avant de s'achever."
|
||||||
|
folder-name-cannot-empty: "Le nom du dossier ne peut être laissé vide."
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
select-file: "Choisissez un fichier"
|
select-file: "Choisissez un fichier"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
@@ -1476,17 +1626,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "chat"
|
cat: "chat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Aucune de notification !"
|
empty: "Aucune de notification !"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Ajouter un·e utilisateur·rice"
|
|
||||||
submit: "Publier"
|
|
||||||
reply: "Répondre"
|
|
||||||
renote: "Republier"
|
|
||||||
quote-placeholder: "Citer ce billet ... (Facultatif)"
|
|
||||||
reply-placeholder: "Répondre à cette note"
|
|
||||||
cw-placeholder: "Commenter le contenu (optionnel)"
|
|
||||||
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
|
|
||||||
error: "Erreur"
|
|
||||||
username-prompt: "Saisir un nom d'utilisateur"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
@@ -1548,6 +1687,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "Aucune publication trouvée pour « {q} »."
|
not-found: "Aucune publication trouvée pour « {q} »."
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Choisissez un fichier"
|
select-file: "Choisissez un fichier"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notifications"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Connecté·e en tant que {}"
|
signed-in-as: "Connecté·e en tant que {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1589,7 +1730,7 @@ deck:
|
|||||||
remove: "Supprimer la colonne"
|
remove: "Supprimer la colonne"
|
||||||
add-column: "Ajouter une colonne"
|
add-column: "Ajouter une colonne"
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
stack-left: "Vers la gauche"
|
stack-left: "Empiler à gauche"
|
||||||
pop-right: "Vers la droite"
|
pop-right: "Vers la droite"
|
||||||
disabled-timeline:
|
disabled-timeline:
|
||||||
title: "Le fil été désactivé"
|
title: "Le fil été désactivé"
|
||||||
@@ -1601,11 +1742,12 @@ deck/deck.user-column.vue:
|
|||||||
follows-you: "Vous suit"
|
follows-you: "Vous suit"
|
||||||
posts: "Notes"
|
posts: "Notes"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
followers: "Abonnés"
|
followers: "Abonné·e·s"
|
||||||
images: "Images"
|
images: "Images"
|
||||||
activity: "Activité"
|
activity: "Activité"
|
||||||
timeline: "Fil d’actualité"
|
timeline: "Fil d’actualité"
|
||||||
pinned-notes: "Notes épinglées"
|
pinned-notes: "Notes épinglées"
|
||||||
|
pinned-page: "Page épinglée"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Vous avez trouvé une erreur ou vous voulez contribuer à la documentation ?"
|
edit-this-page-on-github: "Vous avez trouvé une erreur ou vous voulez contribuer à la documentation ?"
|
||||||
edit-this-page-on-github-link: "Éditez cette page sur GitHub !"
|
edit-this-page-on-github-link: "Éditez cette page sur GitHub !"
|
||||||
@@ -1617,23 +1759,39 @@ dev/views/apps.vue:
|
|||||||
app-missing: "Aucune application"
|
app-missing: "Aucune application"
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
new-app: "Nouvelle application"
|
new-app: "Nouvelle application"
|
||||||
|
new-app-info: "Vous pouvez aussi créer une application avec l'API. (app/create)"
|
||||||
create-app: "Création d’une application"
|
create-app: "Création d’une application"
|
||||||
app-name: "Nom de l’application"
|
app-name: "Nom de l’application"
|
||||||
|
app-name-placeholder: "p. ex. Misskey pour iOS"
|
||||||
app-name-desc: "Le nom de votre application"
|
app-name-desc: "Le nom de votre application"
|
||||||
app-overview: "Description courte de l’application"
|
app-overview: "Description courte de l’application"
|
||||||
|
app-overview-placeholder: "p. ex. Misskey pour iOS"
|
||||||
|
app-overview-desc: "Brève description introductive à votre application."
|
||||||
callback-url: "L’Url de callback (facultatif)"
|
callback-url: "L’Url de callback (facultatif)"
|
||||||
|
callback-url-placeholder: "p. ex. https://votre.app.example.com/callback.php"
|
||||||
callback-url-desc: "Vous pouvez définir l’URL de redirection lorsque l’utilisateur s’est authentifié via formulaire d’authentification."
|
callback-url-desc: "Vous pouvez définir l’URL de redirection lorsque l’utilisateur s’est authentifié via formulaire d’authentification."
|
||||||
authority: "Autorisations "
|
authority: "Autorisations "
|
||||||
authority-desc: "Sont accessibles via l’API, uniquement les fonctionnalités demandées ici."
|
authority-desc: "Sont accessibles via l’API, uniquement les fonctionnalités demandées ici."
|
||||||
authority-warning: "Vous pouvez le changer même après avoir créé l'application, mais si vous attribuez une nouvelle permission, toutes les clés utilisateur associées seront dès lors invalides."
|
authority-warning: "Vous pouvez le changer même après avoir créé l'application, mais si vous attribuez une nouvelle permission, toutes les clés utilisateur associées seront dès lors invalides."
|
||||||
pages:
|
pages:
|
||||||
|
new-page: "Créer une page"
|
||||||
|
edit-page: "Modifier une page"
|
||||||
|
read-page: "Voir la source"
|
||||||
page-created: "Page a été créée !"
|
page-created: "Page a été créée !"
|
||||||
|
page-updated: "A mis à jour la page"
|
||||||
|
name-already-exists: "Une page portant le même nom existe déjà"
|
||||||
|
title-invalid-name: "L’URL de la page spécifiée n’est pas valide"
|
||||||
are-you-sure-delete: "Confirmez-vous la suppression de cette page ?"
|
are-you-sure-delete: "Confirmez-vous la suppression de cette page ?"
|
||||||
page-deleted: "La page a bien été supprimée."
|
page-deleted: "La page a bien été supprimée."
|
||||||
edit-this-page: "Éditer cette page"
|
edit-this-page: "Éditer cette page"
|
||||||
|
pin-this-page: "Épingler sur votre profil"
|
||||||
|
unpin-this-page: "Désépingler"
|
||||||
view-source: "Afficher la source"
|
view-source: "Afficher la source"
|
||||||
view-page: "Afficher la page"
|
view-page: "Afficher la page"
|
||||||
like: "Bien"
|
like: "Bien"
|
||||||
|
unlike: "Je n’aime pas"
|
||||||
|
liked-pages: "Pages favorites"
|
||||||
|
my-pages: "Mes pages"
|
||||||
inspector: "Inspecteur"
|
inspector: "Inspecteur"
|
||||||
content: "Bloc de page"
|
content: "Bloc de page"
|
||||||
variables: "Variables"
|
variables: "Variables"
|
||||||
@@ -1642,9 +1800,12 @@ pages:
|
|||||||
url: "URL de page"
|
url: "URL de page"
|
||||||
summary: "Résumé de page"
|
summary: "Résumé de page"
|
||||||
align-center: "Centrée"
|
align-center: "Centrée"
|
||||||
|
hide-title-when-pinned: "Masquer le titre de la page lorsque celle-ci est épinglée au profil"
|
||||||
font: "Police de caractères"
|
font: "Police de caractères"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans Serif"
|
fontSansSerif: "Sans Serif"
|
||||||
|
set-eye-catching-image: "Définir une image attirante"
|
||||||
|
remove-eye-catching-image: "Supprimer une image attirante"
|
||||||
choose-block: "Ajouter un bloc"
|
choose-block: "Ajouter un bloc"
|
||||||
select-type: "Choisir un type"
|
select-type: "Choisir un type"
|
||||||
enter-variable-name: "Veuillez choisir un nom de variable"
|
enter-variable-name: "Veuillez choisir un nom de variable"
|
||||||
@@ -1692,12 +1853,24 @@ pages:
|
|||||||
inc: "Augmenter le chiffre"
|
inc: "Augmenter le chiffre"
|
||||||
_button:
|
_button:
|
||||||
text: "Titre"
|
text: "Titre"
|
||||||
|
colored: "Couleur"
|
||||||
action: "L'opération lorsque le bouton sera pressé"
|
action: "L'opération lorsque le bouton sera pressé"
|
||||||
_action:
|
_action:
|
||||||
dialog: "Afficher une fenêtre de dialogue"
|
dialog: "Afficher une fenêtre de dialogue"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "Contenu"
|
content: "Contenu"
|
||||||
resetRandom: "Réinitialiser le nombre aléatoire"
|
resetRandom: "Réinitialiser le nombre aléatoire"
|
||||||
|
pushEvent: "Envoyer un évènement"
|
||||||
|
_pushEvent:
|
||||||
|
event: "Nom de l'évènement"
|
||||||
|
message: "Message à afficher lorsque appuyé"
|
||||||
|
variable: "Variable à envoyer"
|
||||||
|
no-variable: "Aucune"
|
||||||
|
radioButton: "Choix"
|
||||||
|
_radioButton:
|
||||||
|
name: "Nom de la variable"
|
||||||
|
title: "Titre"
|
||||||
|
default: "Valeur par défaut"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
flow: "Contrôle"
|
flow: "Contrôle"
|
||||||
@@ -1707,9 +1880,11 @@ pages:
|
|||||||
random: "Aléatoire"
|
random: "Aléatoire"
|
||||||
value: "Valeur"
|
value: "Valeur"
|
||||||
fn: "Fonction"
|
fn: "Fonction"
|
||||||
|
text: "Actions texte"
|
||||||
list: "Listes"
|
list: "Listes"
|
||||||
blocks:
|
blocks:
|
||||||
text: "Texte"
|
text: "Texte"
|
||||||
|
textList: "Liste de texte"
|
||||||
strLen: "Longueur du texte"
|
strLen: "Longueur du texte"
|
||||||
_strLen:
|
_strLen:
|
||||||
arg1: "Texte"
|
arg1: "Texte"
|
||||||
@@ -1742,7 +1917,7 @@ pages:
|
|||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
_remind:
|
_mod:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
eq: "A et B sont équivalents"
|
eq: "A et B sont équivalents"
|
||||||
@@ -1753,21 +1928,27 @@ pages:
|
|||||||
_notEq:
|
_notEq:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
and: "A et B"
|
||||||
_and:
|
_and:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
or: "A ou B"
|
||||||
_or:
|
_or:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
lt: "A est plus petit que B"
|
||||||
_lt:
|
_lt:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
gt: "A est supérieur à B"
|
||||||
_gt:
|
_gt:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
ltEq: "A est plus petit ou égal à B"
|
||||||
_ltEq:
|
_ltEq:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
|
gtEq: "A est supérieur ou égal à B"
|
||||||
_gtEq:
|
_gtEq:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
@@ -1779,6 +1960,13 @@ pages:
|
|||||||
_not:
|
_not:
|
||||||
arg1: "négation"
|
arg1: "négation"
|
||||||
random: "Aléatoire"
|
random: "Aléatoire"
|
||||||
|
_random:
|
||||||
|
arg1: "Probabilité"
|
||||||
|
rannum: "Nombre aléatoire"
|
||||||
|
_rannum:
|
||||||
|
arg1: "Minimum"
|
||||||
|
arg2: "Maximum"
|
||||||
|
randomPick: "Choisir aléatoirement depuis la liste"
|
||||||
_randomPick:
|
_randomPick:
|
||||||
arg1: "Listes"
|
arg1: "Listes"
|
||||||
_dailyRandom:
|
_dailyRandom:
|
||||||
@@ -1801,6 +1989,8 @@ pages:
|
|||||||
_pick:
|
_pick:
|
||||||
arg1: "Listes"
|
arg1: "Listes"
|
||||||
arg2: "Position"
|
arg2: "Position"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listes"
|
||||||
number: "Numérique"
|
number: "Numérique"
|
||||||
stringToNumber: "Chaîne en chiffres"
|
stringToNumber: "Chaîne en chiffres"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
@@ -1816,12 +2006,74 @@ pages:
|
|||||||
slots: "Emplacement"
|
slots: "Emplacement"
|
||||||
arg1: "Sortie"
|
arg1: "Sortie"
|
||||||
for: "Répéter"
|
for: "Répéter"
|
||||||
|
_for:
|
||||||
|
arg1: "Compter"
|
||||||
|
arg2: "Action"
|
||||||
thereIsEmptySlot: "Slot {slot} est vide !"
|
thereIsEmptySlot: "Slot {slot} est vide !"
|
||||||
types:
|
types:
|
||||||
string: "Texte"
|
string: "Texte"
|
||||||
number: "Numérique"
|
number: "Numérique"
|
||||||
|
boolean: "Marqueur"
|
||||||
array: "Listes"
|
array: "Listes"
|
||||||
stringArray: "Liste de texte"
|
stringArray: "Liste de texte"
|
||||||
emptySlot: "Slot vide"
|
emptySlot: "Slot vide"
|
||||||
enviromentVariables: "Variables d'environnement"
|
enviromentVariables: "Variables d'environnement"
|
||||||
pageVariables: "Élément de page"
|
pageVariables: "Élément de page"
|
||||||
|
room:
|
||||||
|
add-furniture: "Placer des meubles"
|
||||||
|
translate: "Déplacer"
|
||||||
|
rotate: "Tourner"
|
||||||
|
remove: "Enlever"
|
||||||
|
save: "Enregistrer"
|
||||||
|
saved: "enregistré"
|
||||||
|
clear: "Tout enlever"
|
||||||
|
clear-confirm: "Désirez-vous enlever tout les meubles de votre chambre ?"
|
||||||
|
leave-confirm: "Vous avez des modifications non-sauvegardées. Voulez-vous vraiment quitter ?"
|
||||||
|
chooseImage: "Sélectionnez une image"
|
||||||
|
room-type: "Type de chambre"
|
||||||
|
carpet-color: "Couleur du tapis"
|
||||||
|
rooms:
|
||||||
|
default: "Par défaut"
|
||||||
|
washitsu: "Style japonnais"
|
||||||
|
furnitures:
|
||||||
|
milk: "Lait en carton"
|
||||||
|
bed: "Lit"
|
||||||
|
low-table: "Table basse"
|
||||||
|
desk: "Bureau"
|
||||||
|
chair: "Chaise"
|
||||||
|
chair2: "Chaise 2"
|
||||||
|
fan: "Ventilateur"
|
||||||
|
pc: "Ordinateur"
|
||||||
|
plant: "Plante d’intérieur"
|
||||||
|
plant2: "Plante d’intérieur 2"
|
||||||
|
eraser: "Gomme"
|
||||||
|
pencil: "Crayon"
|
||||||
|
cardboard-box: "Boîte en carton"
|
||||||
|
cardboard-box2: "Boîte en carton 2"
|
||||||
|
cardboard-box3: "Boîte en carton 3"
|
||||||
|
book: "Livre"
|
||||||
|
book2: "Livre 2"
|
||||||
|
piano: "Piano"
|
||||||
|
facial-tissue: "Mouchoirs en papier"
|
||||||
|
server: "Serveurs"
|
||||||
|
moon: "Lune"
|
||||||
|
corkboard: "Tableau en liège"
|
||||||
|
mousepad: "Tapis de souris"
|
||||||
|
monitor: "Écran"
|
||||||
|
keyboard: "Clavier"
|
||||||
|
carpet-stripe: "Tapis (zébré)"
|
||||||
|
color-box: "Étagère"
|
||||||
|
wall-clock: "Horloge murale"
|
||||||
|
photoframe: "Cadre photo"
|
||||||
|
cube: "Cube"
|
||||||
|
tv: "Téléviseur"
|
||||||
|
pinguin: "Pingouin"
|
||||||
|
rubik-cube: "Cube de Rubik"
|
||||||
|
poster-h: "Affiche (horizontale)"
|
||||||
|
poster-v: "Affiche (verticale)"
|
||||||
|
sofa: "Canapé"
|
||||||
|
spiral: "Escaliers en spirale"
|
||||||
|
bin: "Corbeille"
|
||||||
|
cup-noodle: "Bol de nouilles"
|
||||||
|
holo-display: "Affichage holographique"
|
||||||
|
energy-drink: "Boisson énergétique"
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ common:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||||
adblock:
|
|
||||||
detected: "広告ブロッカーを無効にしてください"
|
|
||||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
|
||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
@@ -36,6 +33,20 @@ common:
|
|||||||
signout: "ログアウト"
|
signout: "ログアウト"
|
||||||
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
reload-to-apply-the-setting: "この設定を反映するにはページをリロードする必要があります。今すぐリロードしますか?"
|
||||||
fetching-as-ap-object: "連合に照会中"
|
fetching-as-ap-object: "連合に照会中"
|
||||||
|
unfollow-confirm: "{name}さんをフォロー解除しますか?"
|
||||||
|
delete-confirm: "この投稿を削除しますか?"
|
||||||
|
signin-required: "ログインしてください"
|
||||||
|
notification-type: "通知の種類"
|
||||||
|
notification-types:
|
||||||
|
all: "すべて"
|
||||||
|
pollVote: "投票"
|
||||||
|
follow: "フォロー"
|
||||||
|
receiveFollowRequest: "フォローリクエスト"
|
||||||
|
reply: "返信"
|
||||||
|
quote: "引用"
|
||||||
|
renote: "Renote"
|
||||||
|
mention: "言及"
|
||||||
|
reaction: "リアクション"
|
||||||
|
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
@@ -96,11 +107,47 @@ common:
|
|||||||
"read:reactions": "リアクションを見る"
|
"read:reactions": "リアクションを見る"
|
||||||
"write:reactions": "リアクションを操作する"
|
"write:reactions": "リアクションを操作する"
|
||||||
"write:votes": "投票する"
|
"write:votes": "投票する"
|
||||||
|
"read:pages": "ページを見る"
|
||||||
|
"write:pages": "ページを操作する"
|
||||||
|
"read:page-likes": "ページのいいねを見る"
|
||||||
|
"write:page-likes": "ページのいいねを操作する"
|
||||||
|
"read:user-groups": "ユーザーグループを見る"
|
||||||
|
"write:user-groups": "ユーザーグループを操作する"
|
||||||
|
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||||
explore: "ユーザーを探索する"
|
explore: "ユーザーを探索する"
|
||||||
|
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "位置情報を添付する"
|
||||||
|
hide-contents: "内容を隠す"
|
||||||
|
reply-placeholder: "この投稿への返信..."
|
||||||
|
quote-placeholder: "この投稿を引用..."
|
||||||
|
option-quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
|
quote-attached: "引用付き"
|
||||||
|
quote-question: "引用として添付しますか?"
|
||||||
|
submit: "投稿"
|
||||||
|
reply: "返信"
|
||||||
|
renote: "Renote"
|
||||||
|
posting: "投稿中"
|
||||||
|
attach-media-from-local: "PCからメディアを添付"
|
||||||
|
attach-media-from-drive: "ドライブからメディアを添付"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "アンケートを作成"
|
||||||
|
text-remain: "残り{}文字"
|
||||||
|
recent-tags: "最近"
|
||||||
|
local-only-message: "この投稿はローカルにのみ公開されます"
|
||||||
|
click-to-tagging: "クリックでタグ付け"
|
||||||
|
visibility: "公開範囲"
|
||||||
|
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||||
|
error: "エラー"
|
||||||
|
enter-username: "ユーザー名を入力してください"
|
||||||
|
specified-recipient: "宛先"
|
||||||
|
add-visible-user: "ユーザーを追加"
|
||||||
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
|
username-prompt: "ユーザー名を入力してください"
|
||||||
|
enter-file-name: "ファイル名を編集"
|
||||||
|
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -165,6 +212,8 @@ common:
|
|||||||
other: "その他"
|
other: "その他"
|
||||||
appearance: "デザイン"
|
appearance: "デザイン"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
|
reactions: "リアクション"
|
||||||
|
reactions-description: "リアクションピッカーに表示するリアクションを改行で区切って設定します。"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||||
note-visibility: "投稿の公開範囲"
|
note-visibility: "投稿の公開範囲"
|
||||||
@@ -172,6 +221,11 @@ common:
|
|||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
web-search-engine: "ウェブ検索エンジン"
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "ペースト"
|
||||||
|
pasted-file-name: "ペーストされたファイル名のテンプレート"
|
||||||
|
pasted-file-name-desc: "例: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "ペースト時にファイル名を編集"
|
||||||
|
paste-dialog-desc: "ペースト時にファイル名を編集するダイアログを表示するようにします。"
|
||||||
keep-cw: "CW保持"
|
keep-cw: "CW保持"
|
||||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
@@ -179,6 +233,7 @@ common:
|
|||||||
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
|
use-avatar-reversi-stones: "リバーシの石にアバターを使う"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
disable-showing-animated-images: "アニメーション画像を再生しない"
|
disable-showing-animated-images: "アニメーション画像を再生しない"
|
||||||
|
enable-quick-notification-view: "通知のクイックビューを有効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
@@ -209,7 +264,7 @@ common:
|
|||||||
deck-column-width-wide: "広"
|
deck-column-width-wide: "広"
|
||||||
use-shadow: "UIに影を使用"
|
use-shadow: "UIに影を使用"
|
||||||
rounded-corners: "UIの角を丸める"
|
rounded-corners: "UIの角を丸める"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアバターを使用"
|
||||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
wallpaper: "壁紙"
|
wallpaper: "壁紙"
|
||||||
choose-wallpaper: "壁紙を選択"
|
choose-wallpaper: "壁紙を選択"
|
||||||
@@ -254,6 +309,21 @@ common:
|
|||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
|
sync: "同期"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存しました"
|
||||||
|
home-profile: "ホームのプロファイル"
|
||||||
|
deck-profile: "デッキのプロファイル"
|
||||||
|
room: "ルーム"
|
||||||
|
_room:
|
||||||
|
graphicsQuality: "グラフィックの品質"
|
||||||
|
_graphicsQuality:
|
||||||
|
ultra: "最高"
|
||||||
|
high: "高"
|
||||||
|
medium: "中"
|
||||||
|
low: "低"
|
||||||
|
cheep: "最低"
|
||||||
|
useOrthographicCamera: "平行投影カメラを使用"
|
||||||
|
|
||||||
search: "検索"
|
search: "検索"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
@@ -343,11 +413,17 @@ common/views/pages/explore.vue:
|
|||||||
popular-users: "人気のユーザー"
|
popular-users: "人気のユーザー"
|
||||||
recently-updated-users: "最近投稿したユーザー"
|
recently-updated-users: "最近投稿したユーザー"
|
||||||
recently-registered-users: "新規ユーザー"
|
recently-registered-users: "新規ユーザー"
|
||||||
|
recently-discovered-users: "最近発見されたユーザー"
|
||||||
popular-tags: "人気のタグ"
|
popular-tags: "人気のタグ"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
explore: "{host}を探索"
|
explore: "{host}を探索"
|
||||||
|
explore-fediverse: "Fediverseを探索"
|
||||||
users-info: "現在{users}ユーザーが登録されています"
|
users-info: "現在{users}ユーザーが登録されています"
|
||||||
|
|
||||||
|
common/views/components/reactions-viewer.details.vue:
|
||||||
|
few-users: "{users}が{reaction}をリアクション"
|
||||||
|
many-users: "{users}と他{omitted}人が{reaction}をリアクション"
|
||||||
|
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "プレイヤーを開く"
|
enable-player: "プレイヤーを開く"
|
||||||
disable-player: "プレイヤーを閉じる"
|
disable-player: "プレイヤーを閉じる"
|
||||||
@@ -529,7 +605,10 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "ピン留め解除"
|
unpin: "ピン留め解除"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
delete-confirm: "この投稿を削除しますか?"
|
delete-confirm: "この投稿を削除しますか?"
|
||||||
|
delete-and-edit: "削除して編集"
|
||||||
|
delete-and-edit-confirm: "この投稿を削除してもう一度編集しますか?この投稿へのリアクション、Renote、返信も全て削除されます。"
|
||||||
remote: "投稿元で見る"
|
remote: "投稿元で見る"
|
||||||
|
pin-limit-exceeded: "これ以上ピン留めできません。"
|
||||||
|
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
@@ -604,6 +683,15 @@ common/views/components/emoji-picker.vue:
|
|||||||
symbols: "記号"
|
symbols: "記号"
|
||||||
flags: "旗"
|
flags: "旗"
|
||||||
|
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "モード"
|
||||||
|
intro: "デスクトップ版とモバイル版のどちらを使うかを指定できます。"
|
||||||
|
choices:
|
||||||
|
auto: "自動で選択"
|
||||||
|
desktop: "デスクトップ版に固定"
|
||||||
|
mobile: "モバイル版に固定"
|
||||||
|
info: "変更はページの再度読み込み後に反映されます。"
|
||||||
|
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -614,6 +702,8 @@ common/views/components/signin.vue:
|
|||||||
signin-with-github: "GitHubでログイン"
|
signin-with-github: "GitHubでログイン"
|
||||||
signin-with-discord: "Discordでログイン"
|
signin-with-discord: "Discordでログイン"
|
||||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
|
tap-key: "セキュリティキーをクリックしてログイン"
|
||||||
|
enter-2fa-code: "認証コードを入力してください"
|
||||||
|
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "招待コード"
|
invitation-code: "招待コード"
|
||||||
@@ -717,7 +807,7 @@ common/views/components/profile-editor.vue:
|
|||||||
you-can-include-hashtags: "ハッシュタグを含めることができます。"
|
you-can-include-hashtags: "ハッシュタグを含めることができます。"
|
||||||
language: "言語"
|
language: "言語"
|
||||||
birthday: "誕生日"
|
birthday: "誕生日"
|
||||||
avatar: "アイコン"
|
avatar: "アバター"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
is-cat: "このアカウントはCatです"
|
is-cat: "このアカウントはCatです"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
@@ -730,6 +820,9 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存しました"
|
saved: "プロフィールを保存しました"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
|
unable-to-process: "操作を完了できません"
|
||||||
|
avatar-not-an-image: "アバターとして指定したファイルは画像ではありません"
|
||||||
|
banner-not-an-image: "バナーとして指定したファイルは画像ではありません"
|
||||||
email: "メール設定"
|
email: "メール設定"
|
||||||
email-address: "メールアドレス"
|
email-address: "メールアドレス"
|
||||||
email-verified: "メールアドレスが確認されました"
|
email-verified: "メールアドレスが確認されました"
|
||||||
@@ -749,6 +842,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "危険な設定"
|
danger-zone: "危険な設定"
|
||||||
delete-account: "アカウントを削除"
|
delete-account: "アカウントを削除"
|
||||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||||
|
profile-metadata: "プロフィール補足情報"
|
||||||
|
metadata-label: "ラベル"
|
||||||
|
metadata-content: "内容"
|
||||||
|
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
@@ -792,6 +888,7 @@ common/views/widgets/broadcast.vue:
|
|||||||
no-broadcasts: "お知らせはありません"
|
no-broadcasts: "お知らせはありません"
|
||||||
have-a-nice-day: "良い一日を!"
|
have-a-nice-day: "良い一日を!"
|
||||||
next: "次"
|
next: "次"
|
||||||
|
prev: "前"
|
||||||
|
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "{}年"
|
year: "{}年"
|
||||||
@@ -875,6 +972,7 @@ desktop:
|
|||||||
uploading-avatar: "新しいアバターをアップロードしています"
|
uploading-avatar: "新しいアバターをアップロードしています"
|
||||||
avatar-updated: "アバターを更新しました"
|
avatar-updated: "アバターを更新しました"
|
||||||
choose-avatar: "アバターにする画像を選択"
|
choose-avatar: "アバターにする画像を選択"
|
||||||
|
unable-to-process: "操作を完了できません"
|
||||||
invalid-filetype: "この形式のファイルはサポートされていません"
|
invalid-filetype: "この形式のファイルはサポートされていません"
|
||||||
|
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
@@ -914,7 +1012,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
used: "使用中"
|
used: "使用中"
|
||||||
|
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アバター"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
nsfw: "閲覧注意"
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
@@ -923,8 +1021,8 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
copy-url: "URLをコピー"
|
copy-url: "URLをコピー"
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
else-files: "その他..."
|
else-files: "その他"
|
||||||
set-as-avatar: "アイコンに設定"
|
set-as-avatar: "アバターに設定"
|
||||||
set-as-banner: "バナーに設定"
|
set-as-banner: "バナーに設定"
|
||||||
open-in-app: "アプリで開く"
|
open-in-app: "アプリで開く"
|
||||||
add-app: "アプリを追加"
|
add-app: "アプリを追加"
|
||||||
@@ -934,15 +1032,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
|
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
|
||||||
|
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "既定アップロード先"
|
||||||
unable-to-process: "操作を完了できません"
|
unable-to-process: "操作を完了できません"
|
||||||
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
||||||
unhandled-error: "不明なエラー"
|
unhandled-error: "不明なエラー"
|
||||||
|
unable-to-delete: "削除できません"
|
||||||
|
has-child-files-or-folders: "このフォルダは空でないため、削除できません。"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "このフォルダへ移動"
|
move-to-this-folder: "このフォルダへ移動"
|
||||||
show-in-new-window: "新しいウィンドウで表示"
|
show-in-new-window: "新しいウィンドウで表示"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "フォルダ名の変更"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "新しいフォルダ名を入力してください"
|
||||||
|
else-folders: "その他"
|
||||||
|
set-as-upload-folder: "既定アップロード先に設定"
|
||||||
|
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
@@ -1017,34 +1120,12 @@ desktop/views/components/notifications.vue:
|
|||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
|
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+ユーザーを追加"
|
|
||||||
attach-location-information: "位置情報を添付する"
|
|
||||||
hide-contents: "内容を隠す"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
|
||||||
quote-placeholder: "この投稿を引用..."
|
|
||||||
submit: "投稿"
|
|
||||||
reply: "返信"
|
|
||||||
renote: "Renote"
|
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
replied: "返信しました!"
|
replied: "返信しました!"
|
||||||
reposted: "Renoteしました!"
|
reposted: "Renoteしました!"
|
||||||
note-failed: "投稿に失敗しました"
|
note-failed: "投稿に失敗しました"
|
||||||
reply-failed: "返信に失敗しました"
|
reply-failed: "返信に失敗しました"
|
||||||
renote-failed: "Renoteに失敗しました"
|
renote-failed: "Renoteに失敗しました"
|
||||||
posting: "投稿中"
|
|
||||||
attach-media-from-local: "PCからメディアを添付"
|
|
||||||
attach-media-from-drive: "ドライブからメディアを添付"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "アンケートを作成"
|
|
||||||
text-remain: "残り{}文字"
|
|
||||||
recent-tags: "最近"
|
|
||||||
local-only-message: "この投稿はローカルにのみ公開されます"
|
|
||||||
click-to-tagging: "クリックでタグ付け"
|
|
||||||
visibility: "公開範囲"
|
|
||||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
|
||||||
error: "エラー"
|
|
||||||
enter-username: "ユーザー名を入力してください"
|
|
||||||
annotations: "内容への注釈 (オプション)"
|
|
||||||
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "新規投稿"
|
note: "新規投稿"
|
||||||
@@ -1090,6 +1171,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "設定が完了しました!"
|
success: "設定が完了しました!"
|
||||||
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
|
||||||
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
|
||||||
|
totp-header: "認証アプリ"
|
||||||
|
security-key-header: "セキュリティキー"
|
||||||
|
security-key: "セキュリティを強化するために、FIDO2をサポートするハードウェアセキュリティキーを使用してアカウントにログインできます。 サインインの際は、登録されたセキュリティキーまたは認証アプリが必要になります。"
|
||||||
|
last-used: "最後の使用:"
|
||||||
|
activate-key: "クリックしてセキュリティキーをアクティベートしてください"
|
||||||
|
security-key-name: "キー名"
|
||||||
|
register-security-key: "キーの登録を完了"
|
||||||
|
something-went-wrong: "わー! キーを登録する際に問題が発生しました:"
|
||||||
|
key-unregistered: "キーが削除されました"
|
||||||
|
use-password-less-login: "パスワードなしのログインを使用"
|
||||||
|
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
@@ -1118,6 +1209,9 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "容量"
|
max: "容量"
|
||||||
in-use: "使用中"
|
in-use: "使用中"
|
||||||
stats: "統計"
|
stats: "統計"
|
||||||
|
default-upload-folder: "既定のアップロード先フォルダ"
|
||||||
|
default-upload-folder-name: "フォルダ"
|
||||||
|
change-default-upload-folder: "フォルダを変更"
|
||||||
|
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "ミュートとブロック"
|
mute-and-block: "ミュートとブロック"
|
||||||
@@ -1179,6 +1273,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
groups: "グループ"
|
groups: "グループ"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
|
room: "ルーム"
|
||||||
|
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
@@ -1220,8 +1315,15 @@ admin/views/index.vue:
|
|||||||
abuse: "スパム報告"
|
abuse: "スパム報告"
|
||||||
queue: "ジョブキュー"
|
queue: "ジョブキュー"
|
||||||
logs: "ログ"
|
logs: "ログ"
|
||||||
|
db: "データベース"
|
||||||
back-to-misskey: "Misskeyに戻る"
|
back-to-misskey: "Misskeyに戻る"
|
||||||
|
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "テーブル"
|
||||||
|
vacuum: "バキューム"
|
||||||
|
vacuum-info: "データベースの掃除を行います。データはそのままで、ディスク使用量を減らします。通常この操作は自動で定期的に行われます。"
|
||||||
|
vacuum-exclamation: "バキュームを行うと、しばらくの間データベースの負荷が高くなり、ユーザーの操作を受け付けなくなる場合があります。"
|
||||||
|
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
accounts: "アカウント"
|
accounts: "アカウント"
|
||||||
@@ -1234,6 +1336,33 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "キュー"
|
title: "キュー"
|
||||||
remove-all-jobs: "すべてのジョブをクリア"
|
remove-all-jobs: "すべてのジョブをクリア"
|
||||||
|
jobs: "ジョブ"
|
||||||
|
queue: "キュー"
|
||||||
|
domains:
|
||||||
|
deliver: "配送"
|
||||||
|
inbox: "受信"
|
||||||
|
db: "データベース"
|
||||||
|
objectStorage: "オブジェクトストレージ"
|
||||||
|
state: "状態"
|
||||||
|
states:
|
||||||
|
active: "処理中"
|
||||||
|
delayed: "予約済み"
|
||||||
|
waiting: "順番待ち"
|
||||||
|
result-is-truncated: "結果は省略されています"
|
||||||
|
other-queues: "その他のキュー"
|
||||||
|
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "ログ"
|
||||||
|
domain: "ドメイン"
|
||||||
|
level: "レベル"
|
||||||
|
levels:
|
||||||
|
all: "全て"
|
||||||
|
info: "情報"
|
||||||
|
success: "成功"
|
||||||
|
warning: "警告"
|
||||||
|
error: "エラー"
|
||||||
|
debug: "デバッグ"
|
||||||
|
delete-all: "全て削除"
|
||||||
|
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "スパム報告"
|
title: "スパム報告"
|
||||||
@@ -1333,6 +1462,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "SMTP認証を行う"
|
smtp-auth: "SMTP認証を行う"
|
||||||
smtp-user: "SMTPユーザー"
|
smtp-user: "SMTPユーザー"
|
||||||
smtp-pass: "SMTPパスワード"
|
smtp-pass: "SMTPパスワード"
|
||||||
|
test-email: "テスト"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "ServiceWorkerを有効にする"
|
enable-serviceworker: "ServiceWorkerを有効にする"
|
||||||
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
|
||||||
@@ -1389,6 +1519,9 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
marked-as-sensitive: "閲覧注意に設定しました"
|
marked-as-sensitive: "閲覧注意に設定しました"
|
||||||
unmarked-as-sensitive: "閲覧注意を解除しました"
|
unmarked-as-sensitive: "閲覧注意を解除しました"
|
||||||
|
clean-remote-files: "リモートファイルのキャッシュを削除"
|
||||||
|
clean-remote-files-are-you-sure: "すべてのリモートファイルのキャッシュを削除してもよろしいですか?"
|
||||||
|
clean-up: "クリーンアップ"
|
||||||
|
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
@@ -1412,6 +1545,8 @@ admin/views/users.vue:
|
|||||||
remote-user-updated: "リモートユーザー情報を更新しました"
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
delete-all-files: "すべてのファイルを削除"
|
delete-all-files: "すべてのファイルを削除"
|
||||||
delete-all-files-confirm: "すべてのファイルを削除しますか?"
|
delete-all-files-confirm: "すべてのファイルを削除しますか?"
|
||||||
|
username: "ユーザー名"
|
||||||
|
host: "ホスト"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
sort:
|
sort:
|
||||||
@@ -1423,6 +1558,7 @@ admin/views/users.vue:
|
|||||||
state:
|
state:
|
||||||
title: "状態"
|
title: "状態"
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
|
available: "利用可能"
|
||||||
admin: "管理者"
|
admin: "管理者"
|
||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
@@ -1443,6 +1579,12 @@ admin/views/moderators.vue:
|
|||||||
added: "モデレーターを登録しました"
|
added: "モデレーターを登録しました"
|
||||||
remove: "解除"
|
remove: "解除"
|
||||||
removed: "モデレーター登録を解除しました"
|
removed: "モデレーター登録を解除しました"
|
||||||
|
logs:
|
||||||
|
title: "ログ"
|
||||||
|
moderator: "モデレーター"
|
||||||
|
type: "操作"
|
||||||
|
at: "日時"
|
||||||
|
info: "情報"
|
||||||
|
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
@@ -1541,6 +1683,7 @@ admin/views/federation.vue:
|
|||||||
day: "1日ごと"
|
day: "1日ごと"
|
||||||
blocked-hosts: "ブロック"
|
blocked-hosts: "ブロック"
|
||||||
blocked-hosts-info: "ブロックしたいホストを改行で区切って記述します。"
|
blocked-hosts-info: "ブロックしたいホストを改行で区切って記述します。"
|
||||||
|
save: "保存"
|
||||||
|
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
@@ -1703,18 +1846,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
|
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "ユーザーを追加"
|
|
||||||
submit: "投稿"
|
|
||||||
reply: "返信"
|
|
||||||
renote: "Renote"
|
|
||||||
quote-placeholder: "この投稿を引用... (オプション)"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
|
||||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
|
||||||
error: "エラー"
|
|
||||||
username-prompt: "ユーザー名を入力してください"
|
|
||||||
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@@ -1793,6 +1924,9 @@ mobile/views/pages/search.vue:
|
|||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
|
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "通知"
|
||||||
|
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
|
|
||||||
@@ -1857,6 +1991,7 @@ deck/deck.user-column.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
pinned-notes: "ピン留めされた投稿"
|
pinned-notes: "ピン留めされた投稿"
|
||||||
|
pinned-page: "ピン留めされたページ"
|
||||||
|
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
||||||
@@ -1893,9 +2028,14 @@ pages:
|
|||||||
read-page: "ソースを表示中"
|
read-page: "ソースを表示中"
|
||||||
page-created: "ページを作成しました"
|
page-created: "ページを作成しました"
|
||||||
page-updated: "ページを更新しました"
|
page-updated: "ページを更新しました"
|
||||||
|
name-already-exists: "指定されたページURLは既に存在しています"
|
||||||
|
title-invalid-name: "不正なページURLです"
|
||||||
|
text-invalid-name: "空白でないか確認してください"
|
||||||
are-you-sure-delete: "このページを削除しますか?"
|
are-you-sure-delete: "このページを削除しますか?"
|
||||||
page-deleted: "ページを削除しました"
|
page-deleted: "ページを削除しました"
|
||||||
edit-this-page: "このページを編集"
|
edit-this-page: "このページを編集"
|
||||||
|
pin-this-page: "ピン留め"
|
||||||
|
unpin-this-page: "ピン留め解除"
|
||||||
view-source: "ソースを表示"
|
view-source: "ソースを表示"
|
||||||
view-page: "ページを見る"
|
view-page: "ページを見る"
|
||||||
like: "いいね"
|
like: "いいね"
|
||||||
@@ -1914,6 +2054,7 @@ pages:
|
|||||||
url: "ページURL"
|
url: "ページURL"
|
||||||
summary: "ページの要約"
|
summary: "ページの要約"
|
||||||
align-center: "中央寄せ"
|
align-center: "中央寄せ"
|
||||||
|
hide-title-when-pinned: "ピン留めされているときにタイトルを非表示"
|
||||||
font: "フォント"
|
font: "フォント"
|
||||||
fontSerif: "セリフ"
|
fontSerif: "セリフ"
|
||||||
fontSansSerif: "サンセリフ"
|
fontSansSerif: "サンセリフ"
|
||||||
@@ -1975,12 +2116,26 @@ pages:
|
|||||||
|
|
||||||
_button:
|
_button:
|
||||||
text: "タイトル"
|
text: "タイトル"
|
||||||
|
colored: "色付き"
|
||||||
action: "ボタンを押したときの動作"
|
action: "ボタンを押したときの動作"
|
||||||
_action:
|
_action:
|
||||||
dialog: "ダイアログを表示する"
|
dialog: "ダイアログを表示する"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "内容"
|
content: "内容"
|
||||||
resetRandom: "乱数をリセット"
|
resetRandom: "乱数をリセット"
|
||||||
|
pushEvent: "イベントを送信させる"
|
||||||
|
_pushEvent:
|
||||||
|
event: "イベント名"
|
||||||
|
message: "押したときに表示するメッセージ"
|
||||||
|
variable: "送信する変数"
|
||||||
|
no-variable: "なし"
|
||||||
|
|
||||||
|
radioButton: "選択肢"
|
||||||
|
_radioButton:
|
||||||
|
name: "変数名"
|
||||||
|
title: "タイトル"
|
||||||
|
values: "改行で区切った選択肢"
|
||||||
|
default: "デフォルト値"
|
||||||
|
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
@@ -2035,8 +2190,8 @@ pages:
|
|||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
remind: "÷ 割った余り"
|
mod: "÷ 割った余り"
|
||||||
_remind:
|
_mod:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
eq: "AとBが同じ"
|
eq: "AとBが同じ"
|
||||||
@@ -2119,6 +2274,9 @@ pages:
|
|||||||
_pick:
|
_pick:
|
||||||
arg1: "リスト"
|
arg1: "リスト"
|
||||||
arg2: "位置"
|
arg2: "位置"
|
||||||
|
listLen: "リストの長さを取得"
|
||||||
|
_listLen:
|
||||||
|
arg1: "リスト"
|
||||||
number: "数値"
|
number: "数値"
|
||||||
stringToNumber: "テキストを数値に"
|
stringToNumber: "テキストを数値に"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
@@ -2151,3 +2309,65 @@ pages:
|
|||||||
enviromentVariables: "環境変数"
|
enviromentVariables: "環境変数"
|
||||||
pageVariables: "ページ要素"
|
pageVariables: "ページ要素"
|
||||||
argVariables: "入力スロット"
|
argVariables: "入力スロット"
|
||||||
|
|
||||||
|
room:
|
||||||
|
add-furniture: "家具を置く"
|
||||||
|
translate: "移動"
|
||||||
|
rotate: "回転"
|
||||||
|
exit: "戻る"
|
||||||
|
remove: "しまう"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存しました"
|
||||||
|
clear: "片付け"
|
||||||
|
clear-confirm: "全ての家具をしまいますか?"
|
||||||
|
leave-confirm: "未保存の変更があります、移動しますか?"
|
||||||
|
chooseImage: "画像を選択"
|
||||||
|
room-type: "部屋のタイプ"
|
||||||
|
carpet-color: "床の色"
|
||||||
|
rooms:
|
||||||
|
default: "デフォルト"
|
||||||
|
washitsu: "和室"
|
||||||
|
furnitures:
|
||||||
|
milk: "牛乳パック"
|
||||||
|
bed: "ベッド"
|
||||||
|
low-table: "ローテーブル"
|
||||||
|
desk: "デスク"
|
||||||
|
chair: "チェア"
|
||||||
|
chair2: "チェア2"
|
||||||
|
fan: "換気扇"
|
||||||
|
pc: "パソコン"
|
||||||
|
plant: "観葉植物"
|
||||||
|
plant2: "観葉植物2"
|
||||||
|
eraser: "消しゴム"
|
||||||
|
pencil: "鉛筆"
|
||||||
|
pudding: "プリン"
|
||||||
|
cardboard-box: "段ボール箱"
|
||||||
|
cardboard-box2: "段ボール箱2"
|
||||||
|
cardboard-box3: "段ボール箱3"
|
||||||
|
book: "本"
|
||||||
|
book2: "本2"
|
||||||
|
piano: "ピアノ"
|
||||||
|
facial-tissue: "ティッシュボックス"
|
||||||
|
server: "サーバー"
|
||||||
|
moon: "月"
|
||||||
|
corkboard: "コルクボード"
|
||||||
|
mousepad: "マウスパッド"
|
||||||
|
monitor: "モニター"
|
||||||
|
keyboard: "キーボード"
|
||||||
|
carpet-stripe: "カーペット(縞)"
|
||||||
|
mat: "マット"
|
||||||
|
color-box: "カラーボックス"
|
||||||
|
wall-clock: "壁掛け時計"
|
||||||
|
photoframe: "額縁"
|
||||||
|
cube: "キューブ"
|
||||||
|
tv: "テレビ"
|
||||||
|
pinguin: "ピンギン"
|
||||||
|
rubik-cube: "ルービックキューブ"
|
||||||
|
poster-h: "ポスター(横長)"
|
||||||
|
poster-v: "ポスター(縦長)"
|
||||||
|
sofa: "ソファ"
|
||||||
|
spiral: "螺旋階段"
|
||||||
|
bin: "ゴミ箱"
|
||||||
|
cup-noodle: "カップ麺"
|
||||||
|
holo-display: "ホログラフィックディスプレイ"
|
||||||
|
energy-drink: "エナジードリンク"
|
||||||
|
|||||||
@@ -18,15 +18,19 @@ common:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
drive-desc: "「こないだの画像、どこやったかな……また投稿したいんやけど……」「さっきのファイルあのフォルダに直しといて」そんなこと言わんとって。Misskeyはもとからドライブ機能持っとるさかい、心配あらへん。ファイルの「わけわけ」したってな。"
|
drive-desc: "「こないだの画像、どこやったかな……また投稿したいんやけど……」「さっきのファイルあのフォルダに直しといて」そんなこと言わんとって。Misskeyはもとからドライブ機能持っとるさかい、心配あらへん。ファイルの「わけわけ」したってな。"
|
||||||
outro: "Misskeyの機能は無限大や!知らんけど。知らん言うとるやんけ、あんたが見に行けや!Misskeyは分散型SNSやから、ここがあかんくても他がある。阪神でもオリックスでもワイは応援するで!"
|
outro: "Misskeyの機能は無限大や!知らんけど。知らん言うとるやんけ、あんたが見に行けや!Misskeyは分散型SNSやから、ここがあかんくても他がある。阪神でもオリックスでもワイは応援するで!"
|
||||||
adblock:
|
|
||||||
detected: "広告ブロッカーを無効にしてや"
|
|
||||||
warning: "<strong>Misskeyは広告を掲載してへん</strong>けど、広告をブロックしはる機能がおると一部の機能が利用できんくなったり、不具合が発生するかも分からん。知らんけど。"
|
|
||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "さいなら"
|
close: "さいなら"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
|
||||||
load-more: "もっとあらへんのか!"
|
load-more: "もっとあらへんのか!"
|
||||||
enter-password: "パスワードを入れてや"
|
enter-password: "パスワードを入れてや"
|
||||||
2fa: "二段階認証"
|
2fa: "二段階認証"
|
||||||
|
delete-confirm: "この投稿を削除してもええか?"
|
||||||
|
notification-types:
|
||||||
|
all: "すべて"
|
||||||
|
follow: "フォロー"
|
||||||
|
reply: "返す"
|
||||||
|
renote: "Renote"
|
||||||
|
reaction: "リアクション"
|
||||||
got-it: "ほい"
|
got-it: "ほい"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
@@ -62,6 +66,14 @@ common:
|
|||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
permissions:
|
permissions:
|
||||||
"write:votes": "投票するで"
|
"write:votes": "投票するで"
|
||||||
|
post-form:
|
||||||
|
submit: "投稿"
|
||||||
|
reply: "返す"
|
||||||
|
renote: "Renote"
|
||||||
|
error: "エラー"
|
||||||
|
enter-username: "ユーザー名を入力してや"
|
||||||
|
add-visible-user: "ユーザー増やす"
|
||||||
|
username-prompt: "ユーザー名を入力してや"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "月"
|
monday: "月"
|
||||||
@@ -114,7 +126,10 @@ common:
|
|||||||
blocking: "ブロック"
|
blocking: "ブロック"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
other: "その他"
|
other: "その他"
|
||||||
|
reactions: "リアクション"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存したで!"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
@@ -355,6 +370,8 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "物"
|
objects: "物"
|
||||||
symbols: "記号"
|
symbols: "記号"
|
||||||
flags: "旗"
|
flags: "旗"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "ページもっぺん読み込んだら反映したるで。"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
@@ -448,7 +465,7 @@ common/views/components/profile-editor.vue:
|
|||||||
description: "自己紹介"
|
description: "自己紹介"
|
||||||
language: "言語"
|
language: "言語"
|
||||||
birthday: "誕生日"
|
birthday: "誕生日"
|
||||||
avatar: "アイコン"
|
avatar: "アバター"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
is-cat: "このアカウントはCatやで"
|
is-cat: "このアカウントはCatやで"
|
||||||
is-bot: "このアカウントはBotやで"
|
is-bot: "このアカウントはBotやで"
|
||||||
@@ -460,6 +477,7 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "プロフィールを保存したで"
|
saved: "プロフィールを保存したで"
|
||||||
uploading: "アップロードしとります"
|
uploading: "アップロードしとります"
|
||||||
upload-failed: "これアップロードでけへんわ"
|
upload-failed: "これアップロードでけへんわ"
|
||||||
|
unable-to-process: "あかん、無理やわ"
|
||||||
email: "メール設定"
|
email: "メール設定"
|
||||||
email-address: "メールアドレス"
|
email-address: "メールアドレス"
|
||||||
email-verified: "このメールアドレスOKや!"
|
email-verified: "このメールアドレスOKや!"
|
||||||
@@ -553,6 +571,7 @@ desktop:
|
|||||||
uploading-avatar: "新しいアバターをアップロードしとるで"
|
uploading-avatar: "新しいアバターをアップロードしとるで"
|
||||||
avatar-updated: "アバターを更新したで"
|
avatar-updated: "アバターを更新したで"
|
||||||
choose-avatar: "アバターにする画像選んでや"
|
choose-avatar: "アバターにする画像選んでや"
|
||||||
|
unable-to-process: "あかん、無理やわ"
|
||||||
invalid-filetype: "この形式のファイル無理やねん"
|
invalid-filetype: "この形式のファイル無理やねん"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "黒いの ... 全部"
|
total: "黒いの ... 全部"
|
||||||
@@ -584,7 +603,7 @@ desktop/views/components/crop-window.vue:
|
|||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使うとる"
|
used: "使うとる"
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アバター"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
nsfw: "見たらあかんで"
|
nsfw: "見たらあかんで"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
@@ -593,8 +612,8 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "やっぱ見せたるわ"
|
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||||
copy-url: "URLをコピー"
|
copy-url: "URLをコピー"
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
else-files: "まだあんで..."
|
else-files: "その他"
|
||||||
set-as-avatar: "アイコンにする"
|
set-as-avatar: "アバターにする"
|
||||||
set-as-banner: "バナーにする"
|
set-as-banner: "バナーにする"
|
||||||
open-in-app: "アプリで開く"
|
open-in-app: "アプリで開く"
|
||||||
add-app: "アプリ増やす"
|
add-app: "アプリ増やす"
|
||||||
@@ -612,6 +631,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "名前を変えるで"
|
rename: "名前を変えるで"
|
||||||
rename-folder: "フォルダ名を変えるで"
|
rename-folder: "フォルダ名を変えるで"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してや"
|
input-new-folder-name: "新しいフォルダ名を入力してや"
|
||||||
|
else-folders: "その他"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "検索"
|
||||||
empty-draghover: "ドロップするにゃ!お魚以外なら何でもいいにゃ!"
|
empty-draghover: "ドロップするにゃ!お魚以外なら何でもいいにゃ!"
|
||||||
@@ -670,33 +690,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "あらへん!"
|
empty: "あらへん!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+ユーザー増やす"
|
|
||||||
attach-location-information: "いる場所くっつけるで"
|
|
||||||
hide-contents: "内容を隠す"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
|
||||||
quote-placeholder: "この投稿を引用..."
|
|
||||||
submit: "投稿"
|
|
||||||
reply: "返信"
|
|
||||||
renote: "Renote"
|
|
||||||
posted: "投稿したで!"
|
posted: "投稿したで!"
|
||||||
replied: "返信したで!"
|
replied: "返信したで!"
|
||||||
reposted: "Renoteしたで!"
|
reposted: "Renoteしたで!"
|
||||||
note-failed: "投稿に失敗したで"
|
note-failed: "投稿に失敗したで"
|
||||||
reply-failed: "返信に失敗したで"
|
reply-failed: "返信に失敗したで"
|
||||||
renote-failed: "Renoteでけへん"
|
renote-failed: "Renoteでけへん"
|
||||||
posting: "投稿中"
|
|
||||||
attach-media-from-local: "PCからメディア持ってくる"
|
|
||||||
attach-media-from-drive: "ドライブからメディア持ってくる"
|
|
||||||
create-poll: "アンケートを作成"
|
|
||||||
text-remain: "残り{}文字"
|
|
||||||
recent-tags: "最近のタグ"
|
|
||||||
local-only-message: "この投稿はローカルだけ公開されるで"
|
|
||||||
click-to-tagging: "クリックでタグ付け"
|
|
||||||
visibility: "公開範囲"
|
|
||||||
geolocation-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
|
|
||||||
error: "エラー"
|
|
||||||
enter-username: "ユーザー名を入力してや"
|
|
||||||
annotations: "もっと教えてな(別にええけど)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "新規投稿"
|
note: "新規投稿"
|
||||||
reply: "返す"
|
reply: "返す"
|
||||||
@@ -760,6 +759,7 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "容量"
|
max: "容量"
|
||||||
in-use: "使うとる"
|
in-use: "使うとる"
|
||||||
stats: "統計"
|
stats: "統計"
|
||||||
|
default-upload-folder-name: "フォルダ"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "ミュートとブロック"
|
mute-and-block: "ミュートとブロック"
|
||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
@@ -845,6 +845,10 @@ admin/views/dashboard.vue:
|
|||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
this-instance: "ワイのインスタンス"
|
this-instance: "ワイのインスタンス"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
levels:
|
||||||
|
info: "情報"
|
||||||
|
error: "エラー"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "もっと"
|
details: "もっと"
|
||||||
remove-report: "削除"
|
remove-report: "削除"
|
||||||
@@ -947,6 +951,8 @@ admin/views/users.vue:
|
|||||||
reset-password: "パスワードをリセット"
|
reset-password: "パスワードをリセット"
|
||||||
password-updated: "パスワードは現在「{password} 」やで"
|
password-updated: "パスワードは現在「{password} 」やで"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
|
username: "ユーザー名"
|
||||||
|
host: "ホスト"
|
||||||
users:
|
users:
|
||||||
title: "ユーザー"
|
title: "ユーザー"
|
||||||
state:
|
state:
|
||||||
@@ -954,6 +960,11 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
origin:
|
origin:
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
|
admin/views/moderators.vue:
|
||||||
|
logs:
|
||||||
|
moderator: "モデレーター"
|
||||||
|
type: "操作"
|
||||||
|
info: "情報"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
@@ -991,6 +1002,7 @@ admin/views/federation.vue:
|
|||||||
hour: "1時間ごと"
|
hour: "1時間ごと"
|
||||||
day: "1日ごと"
|
day: "1日ごと"
|
||||||
blocked-hosts: "ブロック"
|
blocked-hosts: "ブロック"
|
||||||
|
save: "保存"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "もうちょい……"
|
about: "もうちょい……"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
@@ -1114,17 +1126,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "あらへん!"
|
empty: "あらへん!"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "ユーザー増やす"
|
|
||||||
submit: "投稿"
|
|
||||||
reply: "返す"
|
|
||||||
renote: "Renote"
|
|
||||||
quote-placeholder: "この投稿を持ってくる(オプション)"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
|
||||||
geolocation-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。"
|
|
||||||
error: "エラー"
|
|
||||||
username-prompt: "ユーザー名を入力してや"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
@@ -1180,6 +1181,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "ワイは「{q}」なんて投稿知らんわ、無いんちゃう?知らんけど。"
|
not-found: "ワイは「{q}」なんて投稿知らんわ、無いんちゃう?知らんけど。"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "ファイル選んでや"
|
select-file: "ファイル選んでや"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "通知"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "あんたは橋の下で拾った{}や!"
|
signed-in-as: "あんたは橋の下で拾った{}や!"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1253,6 +1256,8 @@ dev/views/new-app.vue:
|
|||||||
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
||||||
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "ピン留め"
|
||||||
|
unpin-this-page: "ピン留めやめる"
|
||||||
like: "ええやん"
|
like: "ええやん"
|
||||||
blocks:
|
blocks:
|
||||||
image: "画像"
|
image: "画像"
|
||||||
@@ -1273,5 +1278,14 @@ pages:
|
|||||||
arg2: "リスト"
|
arg2: "リスト"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "リスト"
|
arg1: "リスト"
|
||||||
|
_listLen:
|
||||||
|
arg1: "リスト"
|
||||||
types:
|
types:
|
||||||
array: "リスト"
|
array: "リスト"
|
||||||
|
room:
|
||||||
|
translate: "移動"
|
||||||
|
save: "保存"
|
||||||
|
saved: "保存したで!"
|
||||||
|
furnitures:
|
||||||
|
moon: "月"
|
||||||
|
bin: "ゴミ箱"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ meta:
|
|||||||
common:
|
common:
|
||||||
misskey: "연합우주의 ⭐"
|
misskey: "연합우주의 ⭐"
|
||||||
about-title: "연합우주의 ⭐."
|
about-title: "연합우주의 ⭐."
|
||||||
about: "Misskey를 찾아주셔서 감사합니다. Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse(다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
|
about: "Misskey를 발견해주셔서 감사합니다! Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS</b> 입니다. Fediverse (다양한 SNS가 함께하는 우주) 속에 존재하고 있어서, 다른 SNS와 서로 연결되어 있습니다. 번잡한 도시에서 벗어나 새로운 인터넷에 빠져보지 않으시겠어요?"
|
||||||
intro:
|
intro:
|
||||||
title: "Misskey란?"
|
title: "Misskey란?"
|
||||||
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 리액션, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
|
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 리액션, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
|
||||||
@@ -18,9 +18,6 @@ common:
|
|||||||
drive: "드라이브"
|
drive: "드라이브"
|
||||||
drive-desc: "이전에 올렸던 적 있는 이미지를 다시 올리고 싶을 때가 있지 않으신가요? 아니면 업로드했던 파일을 폴더로 정리하고 싶지 않으신가요? Misskey에 기본적으로 내장된 드라이브 기능으로 해결됩니다. 파일 공유도 쉽습니다."
|
drive-desc: "이전에 올렸던 적 있는 이미지를 다시 올리고 싶을 때가 있지 않으신가요? 아니면 업로드했던 파일을 폴더로 정리하고 싶지 않으신가요? Misskey에 기본적으로 내장된 드라이브 기능으로 해결됩니다. 파일 공유도 쉽습니다."
|
||||||
outro: "이외에도 Misskey에만 있는 기능이 아직도 더 있으니 부디 여러분 자신의 눈으로 확인해보시기 바랍니다. Misskey는 분산형 SNS라서 이 인스턴스가 마음에 들지 않으신다면 다른 인스턴스를 시도해보실 수도 있습니다. 그럼, GLHF!"
|
outro: "이외에도 Misskey에만 있는 기능이 아직도 더 있으니 부디 여러분 자신의 눈으로 확인해보시기 바랍니다. Misskey는 분산형 SNS라서 이 인스턴스가 마음에 들지 않으신다면 다른 인스턴스를 시도해보실 수도 있습니다. 그럼, GLHF!"
|
||||||
adblock:
|
|
||||||
detected: "광고 차단기를 해제하십시오"
|
|
||||||
warning: "<strong>Misskey는 광고를 게재하지 않습니다</strong>. 하지만 광고 차단 기능을 사용할 경우 일부 기능을 사용할 수 없거나 문제가 발생할 수 있습니다."
|
|
||||||
application-authorization: "앱 연계"
|
application-authorization: "앱 연계"
|
||||||
close: "닫기"
|
close: "닫기"
|
||||||
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
|
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
|
||||||
@@ -35,6 +32,20 @@ common:
|
|||||||
signout: "로그아웃"
|
signout: "로그아웃"
|
||||||
reload-to-apply-the-setting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
reload-to-apply-the-setting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
||||||
fetching-as-ap-object: "연합에서 조회 중"
|
fetching-as-ap-object: "연합에서 조회 중"
|
||||||
|
unfollow-confirm: "{name} 님을 팔로우 해제하시겠습니까?"
|
||||||
|
delete-confirm: "이 글을 삭제하시겠습니까?"
|
||||||
|
signin-required: "로그인 해주세요"
|
||||||
|
notification-type: "알림의 종류"
|
||||||
|
notification-types:
|
||||||
|
all: "모두"
|
||||||
|
pollVote: "투표"
|
||||||
|
follow: "팔로잉"
|
||||||
|
receiveFollowRequest: "팔로우 요청"
|
||||||
|
reply: "답글 달기"
|
||||||
|
quote: "인용"
|
||||||
|
renote: "리노트"
|
||||||
|
mention: "멘션"
|
||||||
|
reaction: "리액션"
|
||||||
got-it: "알겠습니다"
|
got-it: "알겠습니다"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "커스터마이징 도움말"
|
title: "커스터마이징 도움말"
|
||||||
@@ -72,14 +83,14 @@ common:
|
|||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
favorites: "즐겨찾기"
|
favorites: "즐겨찾기"
|
||||||
permissions:
|
permissions:
|
||||||
"read:account": "계정의 정보를 볼 수 있습니다."
|
"read:account": "계정 정보 보기"
|
||||||
"write:account": "계정의 정보를 변경할 수 있습니다."
|
"write:account": "계정 정보 변경"
|
||||||
"read:blocks": "차단 목록을 볼 수 있습니다."
|
"read:blocks": "차단 보기"
|
||||||
"write:blocks": "차단 목록을 조작할 수 있습니다."
|
"write:blocks": "차단 수정"
|
||||||
"read:drive": "드라이브의 파일들을 볼 수 있습니다."
|
"read:drive": "드라이브 보기"
|
||||||
"write:drive": "드라이브의 파일들을 조작할 수 있습니다."
|
"write:drive": "드라이브 수정"
|
||||||
"read:favorites": "즐겨찾기 목록을 볼 수 있습니다."
|
"read:favorites": "즐겨찾기 보기"
|
||||||
"write:favorites": "즐겨찾기 목록을 조작할 수 있습니다."
|
"write:favorites": "즐겨찾기 수정"
|
||||||
"read:following": "팔로우 정보 보기"
|
"read:following": "팔로우 정보 보기"
|
||||||
"write:following": "팔로잉, 팔로우 수정"
|
"write:following": "팔로잉, 팔로우 수정"
|
||||||
"read:messaging": "대화 보기"
|
"read:messaging": "대화 보기"
|
||||||
@@ -87,14 +98,49 @@ common:
|
|||||||
"read:mutes": "뮤트 보기"
|
"read:mutes": "뮤트 보기"
|
||||||
"write:mutes": "뮤트 수정"
|
"write:mutes": "뮤트 수정"
|
||||||
"write:notes": "글 작성, 삭제"
|
"write:notes": "글 작성, 삭제"
|
||||||
"read:notifications": "글 보기"
|
"read:notifications": "알림 보기"
|
||||||
"write:notifications": "알림 수정"
|
"write:notifications": "알림 수정"
|
||||||
"read:reactions": "리액션 보기"
|
"read:reactions": "리액션 보기"
|
||||||
"write:reactions": "리액션 수정"
|
"write:reactions": "리액션 수정"
|
||||||
"write:votes": "투표하기"
|
"write:votes": "투표하기"
|
||||||
|
"read:pages": "페이지 보기"
|
||||||
|
"write:pages": "페이지 변경"
|
||||||
|
"read:page-likes": "페이지의 좋아요 보기"
|
||||||
|
"write:page-likes": "페이지의 좋아요 변경"
|
||||||
|
"read:user-groups": "유저 그룹 보기"
|
||||||
|
"write:user-groups": "유저 그룹을 변경"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
||||||
explore: "사용자 탐색"
|
explore: "사용자 탐색"
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "위치 정보를 첨부합니다"
|
||||||
|
hide-contents: "내용 숨기기"
|
||||||
|
reply-placeholder: "이 글에 답글..."
|
||||||
|
quote-placeholder: "이 글을 인용..."
|
||||||
|
option-quote-placeholder: "이 글을 인용... (옵션)"
|
||||||
|
quote-attached: "인용함"
|
||||||
|
quote-question: "인용해서 작성하시겠습니까?"
|
||||||
|
submit: "글쓰기"
|
||||||
|
reply: "답글 달기"
|
||||||
|
renote: "리노트"
|
||||||
|
posting: "게시중"
|
||||||
|
attach-media-from-local: "PC에서 미디어 첨부"
|
||||||
|
attach-media-from-drive: "드라이브에서 미디어 첨부"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "투표 만들기"
|
||||||
|
text-remain: "{}문자 남음"
|
||||||
|
recent-tags: "최근"
|
||||||
|
local-only-message: "이 글은 로컬에만 공개되어 있습니다"
|
||||||
|
click-to-tagging: "클릭하여 태그 넣기"
|
||||||
|
visibility: "공개 범위"
|
||||||
|
geolocation-alert: "사용 중이신 장치에서는 위치 정보를 사용할 수 없습니다"
|
||||||
|
error: "오류"
|
||||||
|
enter-username: "사용자명을 입력해주세요"
|
||||||
|
specified-recipient: "수신인"
|
||||||
|
add-visible-user: "사용자 추가"
|
||||||
|
cw-placeholder: "내용에 대한 주석 (옵션)"
|
||||||
|
username-prompt: "사용자명을 입력해주세요"
|
||||||
|
enter-file-name: "파일 이름 수정"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "일"
|
sunday: "일"
|
||||||
monday: "월"
|
monday: "월"
|
||||||
@@ -154,6 +200,8 @@ common:
|
|||||||
other: "기타"
|
other: "기타"
|
||||||
appearance: "디자인"
|
appearance: "디자인"
|
||||||
behavior: "동작"
|
behavior: "동작"
|
||||||
|
reactions: "리액션"
|
||||||
|
reactions-description: "리액션 선택창에 표시할 리액션을 줄바꿈으로 구분해 설정합니다."
|
||||||
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
|
fetch-on-scroll: "스크롤하여 자동으로 불러오기"
|
||||||
fetch-on-scroll-desc: "페이지를 아래로 스크롤하였을 때 자동으로 추가 콘텐츠를 불러옵니다."
|
fetch-on-scroll-desc: "페이지를 아래로 스크롤하였을 때 자동으로 추가 콘텐츠를 불러옵니다."
|
||||||
note-visibility: "게시물의 공개 범위"
|
note-visibility: "게시물의 공개 범위"
|
||||||
@@ -161,6 +209,11 @@ common:
|
|||||||
remember-note-visibility: "글의 공개 범위를 기억하기"
|
remember-note-visibility: "글의 공개 범위를 기억하기"
|
||||||
web-search-engine: "웹 검색엔진"
|
web-search-engine: "웹 검색엔진"
|
||||||
web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "예: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "붙여넣기"
|
||||||
|
pasted-file-name: "붙여넣은 파일의 이름 템플릿"
|
||||||
|
pasted-file-name-desc: "예시: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "붙여넣기 시 파일 이름을 편집"
|
||||||
|
paste-dialog-desc: "붙여넣기 시 파일 이름을 편집할 수 있도록 대화 상자를 표시합니다."
|
||||||
keep-cw: "CW 유지"
|
keep-cw: "CW 유지"
|
||||||
keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
|
keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다."
|
||||||
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
|
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
|
||||||
@@ -168,6 +221,7 @@ common:
|
|||||||
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
|
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
|
||||||
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
||||||
disable-showing-animated-images: "움직이는 이미지를 자동으로 재생하지 않음"
|
disable-showing-animated-images: "움직이는 이미지를 자동으로 재생하지 않음"
|
||||||
|
enable-quick-notification-view: "알림의 빠른 보기를 사용합니다"
|
||||||
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
||||||
always-show-nsfw: "항상 열람주의 미디어를 표시"
|
always-show-nsfw: "항상 열람주의 미디어를 표시"
|
||||||
always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
|
always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
|
||||||
@@ -198,7 +252,7 @@ common:
|
|||||||
deck-column-width-wide: "넓음"
|
deck-column-width-wide: "넓음"
|
||||||
use-shadow: "UI에 그림자 효과 적용"
|
use-shadow: "UI에 그림자 효과 적용"
|
||||||
rounded-corners: "UI의 모서리를 둥글게 설정"
|
rounded-corners: "UI의 모서리를 둥글게 설정"
|
||||||
circle-icons: "원형 아이콘 사용"
|
circle-icons: "원형 아바타를 사용"
|
||||||
contrasted-acct: "사용자명에 대비 추가"
|
contrasted-acct: "사용자명에 대비 추가"
|
||||||
wallpaper: "배경"
|
wallpaper: "배경"
|
||||||
choose-wallpaper: "배경 설정"
|
choose-wallpaper: "배경 설정"
|
||||||
@@ -243,6 +297,21 @@ common:
|
|||||||
disable-via-mobile: "작성하는 글에 \"모바일에서 작성함\" 을 붙이지 않음"
|
disable-via-mobile: "작성하는 글에 \"모바일에서 작성함\" 을 붙이지 않음"
|
||||||
load-raw-images: "첨부 이미지를 고품질로 표시"
|
load-raw-images: "첨부 이미지를 고품질로 표시"
|
||||||
load-remote-media: "원격 서버의 미디어를 표시"
|
load-remote-media: "원격 서버의 미디어를 표시"
|
||||||
|
sync: "동기화"
|
||||||
|
save: "저장"
|
||||||
|
saved: "저장하였습니다"
|
||||||
|
home-profile: "홈 프로필"
|
||||||
|
deck-profile: "덱 프로필"
|
||||||
|
room: "룸"
|
||||||
|
_room:
|
||||||
|
graphicsQuality: "그래픽 품질"
|
||||||
|
_graphicsQuality:
|
||||||
|
ultra: "최고"
|
||||||
|
high: "높음"
|
||||||
|
medium: "보통"
|
||||||
|
low: "낮음"
|
||||||
|
cheep: "최저"
|
||||||
|
useOrthographicCamera: "평행 투시 카메라를 사용"
|
||||||
search: "검색"
|
search: "검색"
|
||||||
delete: "삭제"
|
delete: "삭제"
|
||||||
loading: "로드 중"
|
loading: "로드 중"
|
||||||
@@ -253,13 +322,13 @@ common:
|
|||||||
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
|
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
|
||||||
hide-password: "비밀번호 숨기기"
|
hide-password: "비밀번호 숨기기"
|
||||||
show-password: "비밀번호 표시"
|
show-password: "비밀번호 표시"
|
||||||
enter-username: "사용자명을 입력하여 주십시오"
|
enter-username: "사용자명을 입력해주세요"
|
||||||
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
|
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
|
||||||
user-suspended: "이 사용자는 정지된 상태입니다."
|
user-suspended: "이 사용자는 정지된 상태입니다."
|
||||||
is-remote-user: "이 사용자 정보는 정확하지 않을 수 있습니다."
|
is-remote-user: "이 사용자 정보는 정확하지 않을 수 있습니다."
|
||||||
is-remote-post: "이 글 정보는 복사본입니다."
|
is-remote-post: "이 글 정보는 복사본입니다."
|
||||||
view-on-remote: "정확한 정보 보기"
|
view-on-remote: "정확한 정보 보기"
|
||||||
renoted-by: "{user}이(가) 리노트"
|
renoted-by: "{user} 님이 리노트"
|
||||||
no-notes: "글이 없습니다"
|
no-notes: "글이 없습니다"
|
||||||
turn-on-darkmode: "어둠에 삼켜져라"
|
turn-on-darkmode: "어둠에 삼켜져라"
|
||||||
turn-off-darkmode: "빛이 있으라"
|
turn-off-darkmode: "빛이 있으라"
|
||||||
@@ -327,6 +396,9 @@ common/views/pages/explore.vue:
|
|||||||
federated: "연합"
|
federated: "연합"
|
||||||
explore: "{host}을(를) 탐색"
|
explore: "{host}을(를) 탐색"
|
||||||
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
||||||
|
common/views/components/reactions-viewer.details.vue:
|
||||||
|
few-users: "{users}님이 {reaction} 리액션"
|
||||||
|
many-users: "{users}님 외 {omitted}명이 {reaction} 리액션"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "플레이어 열기"
|
enable-player: "플레이어 열기"
|
||||||
disable-player: "플레이어 닫기"
|
disable-player: "플레이어 닫기"
|
||||||
@@ -492,7 +564,10 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "프로필에서 고정 해제"
|
unpin: "프로필에서 고정 해제"
|
||||||
delete: "삭제"
|
delete: "삭제"
|
||||||
delete-confirm: "이 글을 삭제하시겠습니까?"
|
delete-confirm: "이 글을 삭제하시겠습니까?"
|
||||||
|
delete-and-edit: "삭제 후 편집"
|
||||||
|
delete-and-edit-confirm: "이 글을 삭제한 뒤 다시 편집하시겠습니까? 이 글에 대한 리액션, 리노트, 답글 또한 모두 삭제됩니다."
|
||||||
remote: "글 원본 보기"
|
remote: "글 원본 보기"
|
||||||
|
pin-limit-exceeded: "더 이상 고정할 수 없습니다."
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
mute: "뮤트"
|
mute: "뮤트"
|
||||||
@@ -561,6 +636,14 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "사물"
|
objects: "사물"
|
||||||
symbols: "기호"
|
symbols: "기호"
|
||||||
flags: "깃발"
|
flags: "깃발"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "모드"
|
||||||
|
intro: "데스크톱과 모바일 중 어떤 레이아웃을 사용할 지 지정할 수 있습니다."
|
||||||
|
choices:
|
||||||
|
auto: "자동으로 선택"
|
||||||
|
desktop: "데스크톱 레이아웃으로 고정"
|
||||||
|
mobile: "모바일 레이아웃으로 고정"
|
||||||
|
info: "변경사항은 페이지를 새로고침한 뒤에 반영됩니다."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "사용자명"
|
username: "사용자명"
|
||||||
password: "비밀번호"
|
password: "비밀번호"
|
||||||
@@ -571,6 +654,8 @@ common/views/components/signin.vue:
|
|||||||
signin-with-github: "GitHub으로 로그인"
|
signin-with-github: "GitHub으로 로그인"
|
||||||
signin-with-discord: "Discord로 로그인"
|
signin-with-discord: "Discord로 로그인"
|
||||||
login-failed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
|
login-failed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
|
||||||
|
tap-key: "보안 키를 클릭하여 로그인"
|
||||||
|
enter-2fa-code: "인증 코드를 입력하여 주십시오"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "초대 코드"
|
invitation-code: "초대 코드"
|
||||||
invitation-info: "초대 코드가 없으신 분은 <a href=\"{}\">관리자</a>에게 연락하시기 바랍니다."
|
invitation-info: "초대 코드가 없으신 분은 <a href=\"{}\">관리자</a>에게 연락하시기 바랍니다."
|
||||||
@@ -675,6 +760,9 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "프로필을 저장하였습니다"
|
saved: "프로필을 저장하였습니다"
|
||||||
uploading: "업로드 중"
|
uploading: "업로드 중"
|
||||||
upload-failed: "업로드에 실패하였습니다"
|
upload-failed: "업로드에 실패하였습니다"
|
||||||
|
unable-to-process: "작업을 완료할 수 없습니다"
|
||||||
|
avatar-not-an-image: "아바타로 지정한 파일이 이미지 형식이 아닙니다"
|
||||||
|
banner-not-an-image: "배너로 지정한 파일이 이미지 형식이 아닙니다"
|
||||||
email: "메일 설정"
|
email: "메일 설정"
|
||||||
email-address: "메일 주소"
|
email-address: "메일 주소"
|
||||||
email-verified: "매일 주소가 확인되었습니다"
|
email-verified: "매일 주소가 확인되었습니다"
|
||||||
@@ -694,6 +782,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "위험한 설정"
|
danger-zone: "위험한 설정"
|
||||||
delete-account: "계정 삭제"
|
delete-account: "계정 삭제"
|
||||||
account-deleted: "계정이 삭제되었습니다. 데이터가 사라질 때까지 시간이 걸릴 수 있습니다."
|
account-deleted: "계정이 삭제되었습니다. 데이터가 사라질 때까지 시간이 걸릴 수 있습니다."
|
||||||
|
profile-metadata: "프로필 추가 정보"
|
||||||
|
metadata-label: "라벨"
|
||||||
|
metadata-content: "내용"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "사용자"
|
users: "사용자"
|
||||||
rename: "리스트 이름 바꾸기"
|
rename: "리스트 이름 바꾸기"
|
||||||
@@ -732,6 +823,7 @@ common/views/widgets/broadcast.vue:
|
|||||||
no-broadcasts: "공지사항이 없습니다"
|
no-broadcasts: "공지사항이 없습니다"
|
||||||
have-a-nice-day: "좋은 하루 되세요!"
|
have-a-nice-day: "좋은 하루 되세요!"
|
||||||
next: "다음"
|
next: "다음"
|
||||||
|
prev: "이전"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "{}년"
|
year: "{}년"
|
||||||
month: "{}월"
|
month: "{}월"
|
||||||
@@ -803,6 +895,7 @@ desktop:
|
|||||||
uploading-avatar: "새로운 아바타를 업로드하고 있습니다"
|
uploading-avatar: "새로운 아바타를 업로드하고 있습니다"
|
||||||
avatar-updated: "아바타가 변경되었습니다"
|
avatar-updated: "아바타가 변경되었습니다"
|
||||||
choose-avatar: "아바타 이미지를 선택"
|
choose-avatar: "아바타 이미지를 선택"
|
||||||
|
unable-to-process: "작업을 완료할 수 없습니다"
|
||||||
invalid-filetype: "이 형식의 파일은 지원되지 않습니다"
|
invalid-filetype: "이 형식의 파일은 지원되지 않습니다"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "검은색 ... 전체"
|
total: "검은색 ... 전체"
|
||||||
@@ -843,8 +936,8 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "열람주의 해제"
|
unmark-as-sensitive: "열람주의 해제"
|
||||||
copy-url: "URL 복사"
|
copy-url: "URL 복사"
|
||||||
download: "다운로드"
|
download: "다운로드"
|
||||||
else-files: "기타..."
|
else-files: "기타"
|
||||||
set-as-avatar: "아이콘으로 설정"
|
set-as-avatar: "아바타로 설정"
|
||||||
set-as-banner: "배너로 설정"
|
set-as-banner: "배너로 설정"
|
||||||
open-in-app: "앱에서 열기"
|
open-in-app: "앱에서 열기"
|
||||||
add-app: "앱 추가"
|
add-app: "앱 추가"
|
||||||
@@ -853,15 +946,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied: "복사 완료"
|
copied: "복사 완료"
|
||||||
copied-url-to-clipboard: "URL을 클립보드에 복사하였습니다"
|
copied-url-to-clipboard: "URL을 클립보드에 복사하였습니다"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "기본 업로드 위치"
|
||||||
unable-to-process: "작업을 완료할 수 없습니다"
|
unable-to-process: "작업을 완료할 수 없습니다"
|
||||||
circular-reference-detected: "대상 폴더가 이동할 폴더의 하위 폴더입니다."
|
circular-reference-detected: "대상 폴더가 이동할 폴더의 하위 폴더입니다."
|
||||||
unhandled-error: "알 수 없는 오류"
|
unhandled-error: "알 수 없는 오류"
|
||||||
|
unable-to-delete: "삭제할 수 없습니다"
|
||||||
|
has-child-files-or-folders: "이 폴더는 비어있지 않기 때문에 삭제할 수 없습니다."
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "이 폴더로 이동"
|
move-to-this-folder: "이 폴더로 이동"
|
||||||
show-in-new-window: "새 창으로 보기"
|
show-in-new-window: "새 창으로 보기"
|
||||||
rename: "이름 변경"
|
rename: "이름 변경"
|
||||||
rename-folder: "폴더 이름 변경"
|
rename-folder: "폴더 이름 변경"
|
||||||
input-new-folder-name: "새 폴더 이름을 입력하여 주십시오"
|
input-new-folder-name: "새 폴더 이름을 입력하여 주십시오"
|
||||||
|
else-folders: "기타"
|
||||||
|
set-as-upload-folder: "기본 업로드 위치로 설정"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "검색"
|
search: "검색"
|
||||||
empty-draghover: "끌어놓으신 거 맞나요? 괜찮아요, 저는 귀여우니까요"
|
empty-draghover: "끌어놓으신 거 맞나요? 괜찮아요, 저는 귀여우니까요"
|
||||||
@@ -922,34 +1020,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "비었습니다!"
|
empty: "비었습니다!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+사용자 추가"
|
|
||||||
attach-location-information: "위치정보를 첨부하기"
|
|
||||||
hide-contents: "내용 숨기기"
|
|
||||||
reply-placeholder: "이 글에 답글..."
|
|
||||||
quote-placeholder: "이 글을 인용..."
|
|
||||||
submit: "글쓰기"
|
|
||||||
reply: "답글 달기"
|
|
||||||
renote: "리노트"
|
|
||||||
posted: "게시하였습니다!"
|
posted: "게시하였습니다!"
|
||||||
replied: "답글을 달았습니다!"
|
replied: "답글을 달았습니다!"
|
||||||
reposted: "리노트 하였습니다!"
|
reposted: "리노트 하였습니다!"
|
||||||
note-failed: "게시에 실패하였습니다"
|
note-failed: "게시에 실패하였습니다"
|
||||||
reply-failed: "답글을 달지 못했습니다"
|
reply-failed: "답글을 달지 못했습니다"
|
||||||
renote-failed: "리노트에 실패하였습니다"
|
renote-failed: "리노트에 실패하였습니다"
|
||||||
posting: "게시중"
|
|
||||||
attach-media-from-local: "PC에서 미디어 첨부"
|
|
||||||
attach-media-from-drive: "드라이브에서 미디어 첨부"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "투표 만들기"
|
|
||||||
text-remain: "{}문자 남음"
|
|
||||||
recent-tags: "최근"
|
|
||||||
local-only-message: "이 글은 로컬에만 공개되어 있습니다"
|
|
||||||
click-to-tagging: "클릭하여 태그 넣기"
|
|
||||||
visibility: "공개설정"
|
|
||||||
geolocation-alert: "사용하시는 장치가 위치정보 기능에 대응하지 않습니다"
|
|
||||||
error: "오류"
|
|
||||||
enter-username: "사용자명을 입력해주세요"
|
|
||||||
annotations: "내용 주석 (선택적)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "새 글"
|
note: "새 글"
|
||||||
reply: "답글 달기"
|
reply: "답글 달기"
|
||||||
@@ -989,6 +1065,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "설정이 완료되었습니다!"
|
success: "설정이 완료되었습니다!"
|
||||||
failed: "설정에 실패했습니다. 토큰이 잘못되었는지 확인해주십시오."
|
failed: "설정에 실패했습니다. 토큰이 잘못되었는지 확인해주십시오."
|
||||||
info: "다음 로그인부터는 이와 동일하게 비밀번호에 더해 장치에 표시된 토큰을 입력합니다."
|
info: "다음 로그인부터는 이와 동일하게 비밀번호에 더해 장치에 표시된 토큰을 입력합니다."
|
||||||
|
totp-header: "인증 앱"
|
||||||
|
security-key-header: "보안 키"
|
||||||
|
security-key: "보안을 강화하려면 FIDO2를 지원하는 하드웨어 보안 키를 사용하여 계정에 로그인할 수 있습니다. 로그인 시 등록하였던 보안 키 또는 인증 앱이 필요하게 됩니다."
|
||||||
|
last-used: "마지막 사용:"
|
||||||
|
activate-key: "클릭하여 보안 키를 활성화하여 주십시오"
|
||||||
|
security-key-name: "키 이름"
|
||||||
|
register-security-key: "키 등록 완료"
|
||||||
|
something-went-wrong: "으악! 키를 등록하는 도중 문제가 발생하였습니다:"
|
||||||
|
key-unregistered: "키가 등록되어 있지 않습니다"
|
||||||
|
use-password-less-login: "비밀번호 없는 로그인 사용"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "열람주의"
|
sensitive: "열람주의"
|
||||||
click-to-show: "클릭하여 보기"
|
click-to-show: "클릭하여 보기"
|
||||||
@@ -1013,6 +1099,9 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "최대 용량"
|
max: "최대 용량"
|
||||||
in-use: "사용중"
|
in-use: "사용중"
|
||||||
stats: "통계"
|
stats: "통계"
|
||||||
|
default-upload-folder: "기본 업로드 폴더 위치"
|
||||||
|
default-upload-folder-name: "폴더"
|
||||||
|
change-default-upload-folder: "폴더 변경"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "뮤트 및 차단"
|
mute-and-block: "뮤트 및 차단"
|
||||||
mute: "뮤트"
|
mute: "뮤트"
|
||||||
@@ -1066,6 +1155,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
groups: "그룹"
|
groups: "그룹"
|
||||||
follow-requests: "팔로우 요청"
|
follow-requests: "팔로우 요청"
|
||||||
admin: "관리"
|
admin: "관리"
|
||||||
|
room: "룸"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "게임"
|
game: "게임"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
@@ -1098,7 +1188,13 @@ admin/views/index.vue:
|
|||||||
abuse: "스팸 신고"
|
abuse: "스팸 신고"
|
||||||
queue: "작업 대기열"
|
queue: "작업 대기열"
|
||||||
logs: "로그"
|
logs: "로그"
|
||||||
|
db: "데이터베이스"
|
||||||
back-to-misskey: "Misskey로 돌아가기"
|
back-to-misskey: "Misskey로 돌아가기"
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "테이블"
|
||||||
|
vacuum: "청소"
|
||||||
|
vacuum-info: "데이터베이스를 청소합니다. 데이터는 그대로인 채로 데이터의 사용량을 줄입니다. 일반적으로 이 작업은 자동으로 정기적으로 수행됩니다."
|
||||||
|
vacuum-exclamation: "청소를 수행하면 한동안 데이터베이스의 부하가 높아져 사용자 조작을 처리하지 못 할 수 있습니다."
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "대시보드"
|
dashboard: "대시보드"
|
||||||
accounts: "계정"
|
accounts: "계정"
|
||||||
@@ -1110,6 +1206,32 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "큐"
|
title: "큐"
|
||||||
remove-all-jobs: "모든 작업 제거"
|
remove-all-jobs: "모든 작업 제거"
|
||||||
|
jobs: "작업"
|
||||||
|
queue: "큐"
|
||||||
|
domains:
|
||||||
|
deliver: "전송"
|
||||||
|
inbox: "수신"
|
||||||
|
db: "데이터베이스"
|
||||||
|
objectStorage: "오브젝트 스토리지"
|
||||||
|
state: "상태"
|
||||||
|
states:
|
||||||
|
active: "처리중"
|
||||||
|
delayed: "지연됨"
|
||||||
|
waiting: "대기열에 있음"
|
||||||
|
result-is-truncated: "결과는 생략되었습니다"
|
||||||
|
other-queues: "기타 큐"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "로그"
|
||||||
|
domain: "도메인"
|
||||||
|
level: "수준"
|
||||||
|
levels:
|
||||||
|
all: "전체"
|
||||||
|
info: "정보"
|
||||||
|
success: "성공"
|
||||||
|
warning: "경고"
|
||||||
|
error: "오류"
|
||||||
|
debug: "디버그"
|
||||||
|
delete-all: "모두 삭제"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "스팸 신고"
|
title: "스팸 신고"
|
||||||
target: "대상"
|
target: "대상"
|
||||||
@@ -1207,6 +1329,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "SMTP 인증 수행"
|
smtp-auth: "SMTP 인증 수행"
|
||||||
smtp-user: "SMTP 사용자"
|
smtp-user: "SMTP 사용자"
|
||||||
smtp-pass: "SMTP 비밀번호"
|
smtp-pass: "SMTP 비밀번호"
|
||||||
|
test-email: "테스트"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "ServiceWorker 사용"
|
enable-serviceworker: "ServiceWorker 사용"
|
||||||
serviceworker-info: "푸시알림을 수행하려면 사용해야 합니다."
|
serviceworker-info: "푸시알림을 수행하려면 사용해야 합니다."
|
||||||
@@ -1261,6 +1384,9 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "열람주의 해제"
|
unmark-as-sensitive: "열람주의 해제"
|
||||||
marked-as-sensitive: "열람주의로 설정하였습니다"
|
marked-as-sensitive: "열람주의로 설정하였습니다"
|
||||||
unmarked-as-sensitive: "열람주의를 제거하였습니다"
|
unmarked-as-sensitive: "열람주의를 제거하였습니다"
|
||||||
|
clean-remote-files: "리모트 파일 캐시를 삭제"
|
||||||
|
clean-remote-files-are-you-sure: "정말 모든 리모트 파일의 캐시를 삭제하시겠습니까?"
|
||||||
|
clean-up: "청소"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "작업"
|
operation: "작업"
|
||||||
username-or-userid: "사용자명 혹은 사용자 ID"
|
username-or-userid: "사용자명 혹은 사용자 ID"
|
||||||
@@ -1283,6 +1409,8 @@ admin/views/users.vue:
|
|||||||
remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
|
remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
|
||||||
delete-all-files: "모든 파일 삭제"
|
delete-all-files: "모든 파일 삭제"
|
||||||
delete-all-files-confirm: "모든 파일을 삭제하시겠습니까?"
|
delete-all-files-confirm: "모든 파일을 삭제하시겠습니까?"
|
||||||
|
username: "사용자명"
|
||||||
|
host: "호스트"
|
||||||
users:
|
users:
|
||||||
title: "사용자"
|
title: "사용자"
|
||||||
sort:
|
sort:
|
||||||
@@ -1294,6 +1422,7 @@ admin/views/users.vue:
|
|||||||
state:
|
state:
|
||||||
title: "상태"
|
title: "상태"
|
||||||
all: "모두"
|
all: "모두"
|
||||||
|
available: "이용 가능"
|
||||||
admin: "관리자"
|
admin: "관리자"
|
||||||
moderator: "모더레이터"
|
moderator: "모더레이터"
|
||||||
adminOrModerator: "관리자+모더레이터"
|
adminOrModerator: "관리자+모더레이터"
|
||||||
@@ -1313,6 +1442,12 @@ admin/views/moderators.vue:
|
|||||||
added: "모더레이터를 등록하였습니다"
|
added: "모더레이터를 등록하였습니다"
|
||||||
remove: "해제"
|
remove: "해제"
|
||||||
removed: "모더레이터 등록을 해제했습니다"
|
removed: "모더레이터 등록을 해제했습니다"
|
||||||
|
logs:
|
||||||
|
title: "로그"
|
||||||
|
moderator: "모더레이터"
|
||||||
|
type: "작업"
|
||||||
|
at: "일시"
|
||||||
|
info: "정보"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "이모지 등록"
|
title: "이모지 등록"
|
||||||
@@ -1407,6 +1542,7 @@ admin/views/federation.vue:
|
|||||||
day: "1일마다"
|
day: "1일마다"
|
||||||
blocked-hosts: "차단"
|
blocked-hosts: "차단"
|
||||||
blocked-hosts-info: "차단할 호스트를 줄바꿈으로 구분하여 기술합니다."
|
blocked-hosts-info: "차단할 호스트를 줄바꿈으로 구분하여 기술합니다."
|
||||||
|
save: "저장"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "자세히..."
|
about: "자세히..."
|
||||||
timeline: "타임라인"
|
timeline: "타임라인"
|
||||||
@@ -1538,17 +1674,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "없습니다!"
|
empty: "없습니다!"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "사용자 추가"
|
|
||||||
submit: "글쓰기"
|
|
||||||
reply: "답글 달기"
|
|
||||||
renote: "리노트"
|
|
||||||
quote-placeholder: "이 글을 인용... (선택적)"
|
|
||||||
reply-placeholder: "이 글에 답글..."
|
|
||||||
cw-placeholder: "내용 주석 (선택적)"
|
|
||||||
geolocation-alert: "사용하시는 장치가 위치정보 기능에 대응하지 않습니다"
|
|
||||||
error: "오류"
|
|
||||||
username-prompt: "사용자명을 입력하여 주십시오"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "이 글은 비공개입니다"
|
private: "이 글은 비공개입니다"
|
||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
@@ -1611,6 +1736,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "\"{q}\" 와 일치하는 글을 찾을 수 없습니다."
|
not-found: "\"{q}\" 와 일치하는 글을 찾을 수 없습니다."
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "파일 선택"
|
select-file: "파일 선택"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "알림"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "{}(으)로 로그인"
|
signed-in-as: "{}(으)로 로그인"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1669,6 +1796,7 @@ deck/deck.user-column.vue:
|
|||||||
activity: "활동"
|
activity: "활동"
|
||||||
timeline: "타임라인"
|
timeline: "타임라인"
|
||||||
pinned-notes: "고정해놓은 글"
|
pinned-notes: "고정해놓은 글"
|
||||||
|
pinned-page: "고정해놓은 페이지"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "틀린 점이나 개선할 점을 찾으셨나요?"
|
edit-this-page-on-github: "틀린 점이나 개선할 점을 찾으셨나요?"
|
||||||
edit-this-page-on-github-link: "이 페이지를 GitHub에서 편집"
|
edit-this-page-on-github-link: "이 페이지를 GitHub에서 편집"
|
||||||
@@ -1700,9 +1828,14 @@ pages:
|
|||||||
read-page: "소스 표시중"
|
read-page: "소스 표시중"
|
||||||
page-created: "페이지를 만들었습니다"
|
page-created: "페이지를 만들었습니다"
|
||||||
page-updated: "페이지를 수정했습니다"
|
page-updated: "페이지를 수정했습니다"
|
||||||
|
name-already-exists: "지정한 페이지 URL은 이미 존재합니다"
|
||||||
|
title-invalid-name: "유효하지 않은 페이지 URL입니다"
|
||||||
|
text-invalid-name: "비어있지 않은지 확인해주세요"
|
||||||
are-you-sure-delete: "이 페이지를 삭제하시겠습니까?"
|
are-you-sure-delete: "이 페이지를 삭제하시겠습니까?"
|
||||||
page-deleted: "페이지가 삭제되었습니다"
|
page-deleted: "페이지가 삭제되었습니다"
|
||||||
edit-this-page: "이 페이지를 편집"
|
edit-this-page: "이 페이지를 편집"
|
||||||
|
pin-this-page: "프로필에 고정"
|
||||||
|
unpin-this-page: "프로필에서 고정 해제"
|
||||||
view-source: "소스 보기"
|
view-source: "소스 보기"
|
||||||
view-page: "페이지 보기"
|
view-page: "페이지 보기"
|
||||||
like: "좋아요"
|
like: "좋아요"
|
||||||
@@ -1721,6 +1854,7 @@ pages:
|
|||||||
url: "페이지 URL"
|
url: "페이지 URL"
|
||||||
summary: "페이지 요약"
|
summary: "페이지 요약"
|
||||||
align-center: "가운데 정렬"
|
align-center: "가운데 정렬"
|
||||||
|
hide-title-when-pinned: "프로필에 고정해놓은 경우 타이틀을 표시하지 않음"
|
||||||
font: "글꼴"
|
font: "글꼴"
|
||||||
fontSerif: "세리프"
|
fontSerif: "세리프"
|
||||||
fontSansSerif: "산 세리프"
|
fontSansSerif: "산 세리프"
|
||||||
@@ -1774,12 +1908,25 @@ pages:
|
|||||||
inc: "증가치"
|
inc: "증가치"
|
||||||
_button:
|
_button:
|
||||||
text: "제목"
|
text: "제목"
|
||||||
|
colored: "색상"
|
||||||
action: "버튼을 눌렀을 때의 동작"
|
action: "버튼을 눌렀을 때의 동작"
|
||||||
_action:
|
_action:
|
||||||
dialog: "대화상자를 표시"
|
dialog: "대화상자를 표시"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "내용"
|
content: "내용"
|
||||||
resetRandom: "난수를 초기화"
|
resetRandom: "난수를 초기화"
|
||||||
|
pushEvent: "이벤트 보내기"
|
||||||
|
_pushEvent:
|
||||||
|
event: "이벤트 이름"
|
||||||
|
message: "눌렀을 때 표시할 메시지"
|
||||||
|
variable: "보낼 변수"
|
||||||
|
no-variable: "없음"
|
||||||
|
radioButton: "선택지"
|
||||||
|
_radioButton:
|
||||||
|
name: "변수명"
|
||||||
|
title: "제목"
|
||||||
|
values: "줄바꿈으로 구분된 선택지"
|
||||||
|
default: "기본값"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
flow: "흐름 제어"
|
flow: "흐름 제어"
|
||||||
@@ -1833,8 +1980,8 @@ pages:
|
|||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
remind: "÷ 나눈 나머지"
|
mod: "÷ 나눈 나머지"
|
||||||
_remind:
|
_mod:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
eq: "A와 B가 동일"
|
eq: "A와 B가 동일"
|
||||||
@@ -1917,6 +2064,9 @@ pages:
|
|||||||
_pick:
|
_pick:
|
||||||
arg1: "리스트"
|
arg1: "리스트"
|
||||||
arg2: "위치"
|
arg2: "위치"
|
||||||
|
listLen: "리스트의 길이 가져오기"
|
||||||
|
_listLen:
|
||||||
|
arg1: "리스트"
|
||||||
number: "수치"
|
number: "수치"
|
||||||
stringToNumber: "텍스트를 수치로"
|
stringToNumber: "텍스트를 수치로"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
@@ -1949,3 +2099,64 @@ pages:
|
|||||||
enviromentVariables: "환경 변수"
|
enviromentVariables: "환경 변수"
|
||||||
pageVariables: "페이지 요소"
|
pageVariables: "페이지 요소"
|
||||||
argVariables: "입력 슬롯"
|
argVariables: "입력 슬롯"
|
||||||
|
room:
|
||||||
|
add-furniture: "가구를 배치"
|
||||||
|
translate: "이동"
|
||||||
|
rotate: "회전"
|
||||||
|
exit: "선택 해제"
|
||||||
|
remove: "치우기"
|
||||||
|
save: "저장"
|
||||||
|
saved: "저장하였습니다"
|
||||||
|
clear: "모두 치우기"
|
||||||
|
clear-confirm: "정말 방 안의 모든 가구를 치우시겠습니까?"
|
||||||
|
leave-confirm: "저장되지 않은 변경 사항이 있습니다. 정말 나가시겠습니까?"
|
||||||
|
chooseImage: "이미지 선택"
|
||||||
|
room-type: "룸 종류"
|
||||||
|
carpet-color: "바닥 색상"
|
||||||
|
rooms:
|
||||||
|
default: "기본"
|
||||||
|
washitsu: "일본식"
|
||||||
|
furnitures:
|
||||||
|
milk: "우유 팩"
|
||||||
|
bed: "침대"
|
||||||
|
low-table: "낮은 테이블"
|
||||||
|
desk: "책상"
|
||||||
|
chair: "의자"
|
||||||
|
chair2: "의자 2"
|
||||||
|
fan: "환기구"
|
||||||
|
pc: "컴퓨터"
|
||||||
|
plant: "관엽식물"
|
||||||
|
plant2: "관엽식물 2"
|
||||||
|
eraser: "지우개"
|
||||||
|
pencil: "연필"
|
||||||
|
pudding: "푸딩"
|
||||||
|
cardboard-box: "골판지 상자"
|
||||||
|
cardboard-box2: "골판지 상자 2"
|
||||||
|
cardboard-box3: "골판지 상자 3"
|
||||||
|
book: "책"
|
||||||
|
book2: "책 2"
|
||||||
|
piano: "피아노"
|
||||||
|
facial-tissue: "휴지 상자"
|
||||||
|
server: "서버"
|
||||||
|
moon: "달"
|
||||||
|
corkboard: "게시판"
|
||||||
|
mousepad: "마우스 패드"
|
||||||
|
monitor: "모니터"
|
||||||
|
keyboard: "키보드"
|
||||||
|
carpet-stripe: "카페트 (줄무늬)"
|
||||||
|
mat: "매트"
|
||||||
|
color-box: "책장"
|
||||||
|
wall-clock: "벽걸이 시계"
|
||||||
|
photoframe: "액자"
|
||||||
|
cube: "큐브"
|
||||||
|
tv: "TV"
|
||||||
|
pinguin: "펭귄"
|
||||||
|
rubik-cube: "루빅스 큐브"
|
||||||
|
poster-h: "포스터 (가로)"
|
||||||
|
poster-v: "포스터 (세로)"
|
||||||
|
sofa: "소파"
|
||||||
|
spiral: "나선형 계단"
|
||||||
|
bin: "휴지통"
|
||||||
|
cup-noodle: "컵라면"
|
||||||
|
holo-display: "홀로그램"
|
||||||
|
energy-drink: "에너지 드링크"
|
||||||
|
|||||||
@@ -3,11 +3,58 @@ meta:
|
|||||||
lang: "Nederlands"
|
lang: "Nederlands"
|
||||||
common:
|
common:
|
||||||
misskey: "Deel alles met anderen die ook Misskey gebruiken."
|
misskey: "Deel alles met anderen die ook Misskey gebruiken."
|
||||||
|
about-title: "Een ster van het fediverse"
|
||||||
|
about: "Bedankt voor het ontdekken van Misskey. Misskey is een <b>gedecentraliseerd microblogging platform</b> geboren op aarde. Omdat het bestaat binnen het Fediverse (een georganiseerd universum van verschillende sociale mediaplatformen), staat het verbonden met andere sociale medieplatformen. Neem een pauze van de stedelijke drukte, en duik in het nieuwe intenet?"
|
||||||
intro:
|
intro:
|
||||||
|
title: "Wat is Misskey?"
|
||||||
|
about: "Misskey is een open source <b>gedecentraliseerd blogplatform</b>. Het heeft een gesofisticeerde, volledig aanpasbare gebruikersinterface, uitgebreide reactiemogelijkheden voor posts, gratis geïntegreerd bestandsoplagbeheer en andere geavanceerde mogelijkheden. Daarnaast staat Misskey verbonden aan een netwerksysteem genaam het \"Fediverse\", hiermee kunnen we communiceren met andere gebruikers op andere SNSs. Dit betekent dat wanneer je iets post het niet enkel verstuurd wordt naar andere Misskey gebruikers, maar ook naar gebruikers op Mastodon en Pleroma. Stel je voor dat een planeet een radiosignaal verzendt naar een andere planeet als manier van communiceren."
|
||||||
|
features: "Kenmerken"
|
||||||
rich-contents: "Bericht"
|
rich-contents: "Bericht"
|
||||||
|
rich-contents-desc: "Post jouw idee, hot topic, wat je ook maar wil delen. Maak jouw teksten aantrekkelijk met je favoriete foto's, verzend bestanden, zelfs video's, of maak een poll. Dit zijn enkele van de mogelijkheden die Misskey aanbiedt!"
|
||||||
reaction: "Reactie"
|
reaction: "Reactie"
|
||||||
|
reaction-desc: "Dé makkelijkste manier om jouw gevoelens uit te drukken. Met Misskey kan je verschillende reacties toevoegen aan jouw posts. Andere SNSs hebben enkel maar een \"vind ik leuk\" reactie."
|
||||||
|
ui: "Interface"
|
||||||
|
ui-desc: "Niet één UI past nij iedereen. Daarom heeft Misskey een uitgebreide keuze om de UI naar jouw hand te zetten. Je kan jouw nieuwe thuis zo origineel maken als je zelf wil door jouw tijdslijn aan te passen door widgets te verplaatsen en hun look te veranderen. Zo maak je van Misskey jouw eigen stek."
|
||||||
|
drive: "Drive"
|
||||||
|
drive-desc: "Wil je een foto posten die je reeds het geüpload? Wens je georganiseerde map met zelfgekozen naam maken voor al jouw bestanden? De beste oplossing voor jou is Misskey Drive. Dit maakt het supermakkelijk om jouw bestanden online te delen."
|
||||||
|
application-authorization: "Geauthoriseerde applicaties"
|
||||||
close: "Sluiten"
|
close: "Sluiten"
|
||||||
|
do-not-copy-paste: "Gelieve de code hier niet in te geven of te plakken. De account kan gecompromiseerd zijn."
|
||||||
|
load-more: "Laad meer resultaten"
|
||||||
enter-password: "Voer het wachtwoord in"
|
enter-password: "Voer het wachtwoord in"
|
||||||
|
2fa: "Tweestapsverificatie"
|
||||||
|
customize-home: "Layout aanpassen"
|
||||||
|
featured-notes: "Uitgelicht"
|
||||||
|
dark-mode: "Donker thema"
|
||||||
|
signin: "Aanmelden"
|
||||||
|
signup: "Registreren"
|
||||||
|
signout: "Afmelden"
|
||||||
|
reload-to-apply-the-setting: "Herlaad de pagina om je aanpassingen te bekijken. Wil je de pagina nu herladen?"
|
||||||
|
fetching-as-ap-object: "Verzenden naar Fediverse"
|
||||||
|
unfollow-confirm: "Wil stoppen met {name} te volgen?"
|
||||||
|
delete-confirm: "Ben je zeker dat je dit bericht wil verwijderen?"
|
||||||
|
signin-required: "Gelieve in te loggen"
|
||||||
|
notification-type: "Notificatietype"
|
||||||
|
notification-types:
|
||||||
|
all: "Alle"
|
||||||
|
pollVote: "Stemmen"
|
||||||
|
follow: "Volgend"
|
||||||
|
receiveFollowRequest: "Volgverzoeken"
|
||||||
|
reply: "Beantwoorden"
|
||||||
|
quote: "Bron"
|
||||||
|
mention: "Vermeldingen"
|
||||||
|
reaction: "Reactie"
|
||||||
|
got-it: "Ik snap het!"
|
||||||
|
customization-tips:
|
||||||
|
title: "Aanpassingstips"
|
||||||
|
gotit: "Ik snap het!"
|
||||||
|
notification:
|
||||||
|
file-uploaded: "Je bestand is geüpload"
|
||||||
|
message-from: "Bericht van {}:"
|
||||||
|
reversi-invited: "Uitgenodigd voor spel"
|
||||||
|
notified-by: "Bemerkt door: {}"
|
||||||
|
reply-from: "Antwoord van: {}"
|
||||||
|
quoted-by: "Geciteerd door: {}"
|
||||||
time:
|
time:
|
||||||
unknown: "onbekend"
|
unknown: "onbekend"
|
||||||
future: "toekomstig"
|
future: "toekomstig"
|
||||||
@@ -19,12 +66,22 @@ common:
|
|||||||
weeks_ago: "{}week/weken geleden"
|
weeks_ago: "{}week/weken geleden"
|
||||||
months_ago: "{}maand(en) geleden"
|
months_ago: "{}maand(en) geleden"
|
||||||
years_ago: "{}jaar geleden"
|
years_ago: "{}jaar geleden"
|
||||||
|
month-and-day: "{day} {month}"
|
||||||
|
trash: "Prullenbak"
|
||||||
|
drive: "Drive"
|
||||||
|
pages: "Pagina's"
|
||||||
|
messaging: "Gesprekken"
|
||||||
home: "Startpagina"
|
home: "Startpagina"
|
||||||
|
deck: "Deck"
|
||||||
timeline: "Tijdlijn"
|
timeline: "Tijdlijn"
|
||||||
followers: "Volgers"
|
followers: "Volgers"
|
||||||
favorites: "Deze notitie toevoegen aan favorieten"
|
favorites: "Deze notitie toevoegen aan favorieten"
|
||||||
permissions:
|
permissions:
|
||||||
"write:votes": "Stemmen"
|
"write:votes": "Stemmen"
|
||||||
|
post-form:
|
||||||
|
submit: "Bericht"
|
||||||
|
reply: "Beantwoorden"
|
||||||
|
add-visible-user: "Gebruiker toevoegen"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Z"
|
sunday: "Z"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -50,7 +107,11 @@ common:
|
|||||||
profile: "Je profiel"
|
profile: "Je profiel"
|
||||||
notification: "Meldingen"
|
notification: "Meldingen"
|
||||||
password: "Wachtwoord"
|
password: "Wachtwoord"
|
||||||
|
reactions: "Reactie"
|
||||||
|
deck-column-align-center: "Centreren"
|
||||||
|
deck-column-align-left: "Links"
|
||||||
timeline: "Tijdlijn"
|
timeline: "Tijdlijn"
|
||||||
|
navbar-position-left: "Links"
|
||||||
search: "Zoeken"
|
search: "Zoeken"
|
||||||
delete: "Verwijderen"
|
delete: "Verwijderen"
|
||||||
loading: "Bezig met laden"
|
loading: "Bezig met laden"
|
||||||
@@ -195,6 +256,7 @@ common/views/components/profile-editor.vue:
|
|||||||
name: "Naam"
|
name: "Naam"
|
||||||
avatar: "Gebruikersafbeelding"
|
avatar: "Gebruikersafbeelding"
|
||||||
banner: "Omslagfoto"
|
banner: "Omslagfoto"
|
||||||
|
unable-to-process: "De operatie kan niet worden voltooid."
|
||||||
export-targets:
|
export-targets:
|
||||||
following-list: "Volgend"
|
following-list: "Volgend"
|
||||||
user-lists: "Lijsten"
|
user-lists: "Lijsten"
|
||||||
@@ -222,6 +284,8 @@ common/views/pages/follow.vue:
|
|||||||
follow: "Volgend"
|
follow: "Volgend"
|
||||||
desktop:
|
desktop:
|
||||||
banner: "Omslagfoto"
|
banner: "Omslagfoto"
|
||||||
|
avatar: "Gebruikersafbeelding"
|
||||||
|
unable-to-process: "De operatie kan niet worden voltooid."
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Zwart ... totaal"
|
total: "Zwart ... totaal"
|
||||||
notes: "Blauw ... notities"
|
notes: "Blauw ... notities"
|
||||||
@@ -256,7 +320,6 @@ desktop/views/components/drive.file.vue:
|
|||||||
rename: "Naam wijzigen"
|
rename: "Naam wijzigen"
|
||||||
copy-url: "URL kopiëren"
|
copy-url: "URL kopiëren"
|
||||||
download: "Downloaden"
|
download: "Downloaden"
|
||||||
else-files: "Overig"
|
|
||||||
set-as-avatar: "Instellen als gebruikersafbeelding"
|
set-as-avatar: "Instellen als gebruikersafbeelding"
|
||||||
set-as-banner: "Instellen als omslagfoto"
|
set-as-banner: "Instellen als omslagfoto"
|
||||||
open-in-app: "Openen in app"
|
open-in-app: "Openen in app"
|
||||||
@@ -325,21 +388,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Geen meldingen"
|
empty: "Geen meldingen"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
reply-placeholder: "Deze notitie beantwoorden..."
|
|
||||||
quote-placeholder: "Deze notitie citeren..."
|
|
||||||
submit: "Bericht"
|
|
||||||
reply: "Beantwoorden"
|
|
||||||
posted: "Geplaatst!"
|
posted: "Geplaatst!"
|
||||||
replied: "Beantwoord!"
|
replied: "Beantwoord!"
|
||||||
reposted: "Hergeplaatst!"
|
reposted: "Hergeplaatst!"
|
||||||
note-failed: "Noteren mislukt"
|
note-failed: "Noteren mislukt"
|
||||||
reply-failed: "Beantwoorden mislukt"
|
reply-failed: "Beantwoorden mislukt"
|
||||||
renote-failed: "Renote mislukt"
|
renote-failed: "Renote mislukt"
|
||||||
posting: "Bezig met plaatsen"
|
|
||||||
attach-media-from-local: "Media bijvoegen van je computer"
|
|
||||||
attach-media-from-drive: "Media bijvoegen uit je Drive"
|
|
||||||
create-poll: "Peiling creëren"
|
|
||||||
text-remain: "{} resterende tekens"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nieuwe notitie"
|
note: "Nieuwe notitie"
|
||||||
reply: "Beantwoorden"
|
reply: "Beantwoorden"
|
||||||
@@ -382,6 +436,7 @@ common/views/components/api-settings.vue:
|
|||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
in-use: "gebruikt"
|
in-use: "gebruikt"
|
||||||
stats: "Statistieken"
|
stats: "Statistieken"
|
||||||
|
default-upload-folder-name: "Map(pen)"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "(dit bericht is privé)"
|
private: "(dit bericht is privé)"
|
||||||
poll: "Peilingen"
|
poll: "Peilingen"
|
||||||
@@ -420,16 +475,19 @@ admin/views/index.vue:
|
|||||||
users: "Gebruiker"
|
users: "Gebruiker"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
notes: "Bericht"
|
notes: "Bericht"
|
||||||
|
drive: "Drive"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
remove-report: "Verwijderen"
|
remove-report: "Verwijderen"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
notes: "Bericht"
|
notes: "Bericht"
|
||||||
users: "Gebruiker"
|
users: "Gebruiker"
|
||||||
|
drive: "Drive"
|
||||||
admin/views/drive.vue:
|
admin/views/drive.vue:
|
||||||
origin:
|
origin:
|
||||||
local: "Lokaal"
|
local: "Lokaal"
|
||||||
delete: "Verwijderen"
|
delete: "Verwijderen"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Gebruikersnaam"
|
||||||
users:
|
users:
|
||||||
title: "Gebruiker"
|
title: "Gebruiker"
|
||||||
state:
|
state:
|
||||||
@@ -538,11 +596,6 @@ mobile/views/components/note-detail.vue:
|
|||||||
location: "Locatie"
|
location: "Locatie"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Geen meldingen"
|
empty: "Geen meldingen"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Gebruiker toevoegen"
|
|
||||||
submit: "Plaatsen"
|
|
||||||
reply: "Antwoord"
|
|
||||||
reply-placeholder: "Deze notitie beantwoorden..."
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "(dit bericht is privé)"
|
private: "(dit bericht is privé)"
|
||||||
media-count: "{} media"
|
media-count: "{} media"
|
||||||
@@ -564,6 +617,7 @@ mobile/views/pages/home.vue:
|
|||||||
global: "Algemeen"
|
global: "Algemeen"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
add-widget: "Toevoegen"
|
add-widget: "Toevoegen"
|
||||||
|
customization-tips: "Aanpassingstips"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
activity: "Activiteit"
|
activity: "Activiteit"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
@@ -576,6 +630,8 @@ mobile/views/pages/search.vue:
|
|||||||
search: "Zoeken"
|
search: "Zoeken"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Kies een bestand"
|
select-file: "Kies een bestand"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Meldingen"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Ingelogd als {}"
|
signed-in-as: "Ingelogd als {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -616,6 +672,7 @@ docs:
|
|||||||
edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
|
edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
|
||||||
edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
|
edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "Vastmaken aan profielpagina"
|
||||||
like: "Leuk"
|
like: "Leuk"
|
||||||
blocks:
|
blocks:
|
||||||
image: "Afbeeldingen"
|
image: "Afbeeldingen"
|
||||||
@@ -633,5 +690,12 @@ pages:
|
|||||||
arg2: "Lijsten"
|
arg2: "Lijsten"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Lijsten"
|
arg1: "Lijsten"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Lijsten"
|
||||||
types:
|
types:
|
||||||
array: "Lijsten"
|
array: "Lijsten"
|
||||||
|
room:
|
||||||
|
translate: "Verplaatsen"
|
||||||
|
furnitures:
|
||||||
|
moon: "Maan"
|
||||||
|
bin: "Prullenbak"
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ common:
|
|||||||
rich-contents: "Innlegg"
|
rich-contents: "Innlegg"
|
||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
|
notification-types:
|
||||||
|
all: "Alle"
|
||||||
|
follow: "Følger"
|
||||||
|
reply: "Svar"
|
||||||
got-it: "Skjønner!"
|
got-it: "Skjønner!"
|
||||||
notification:
|
notification:
|
||||||
file-uploaded: "Filen ble lastet opp!"
|
file-uploaded: "Filen ble lastet opp!"
|
||||||
@@ -39,6 +43,10 @@ common:
|
|||||||
favorites: "Merket som favoritt"
|
favorites: "Merket som favoritt"
|
||||||
permissions:
|
permissions:
|
||||||
"write:votes": "Stem"
|
"write:votes": "Stem"
|
||||||
|
post-form:
|
||||||
|
submit: "Innlegg"
|
||||||
|
reply: "Svar"
|
||||||
|
error: "Feil"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "S"
|
sunday: "S"
|
||||||
monday: "M"
|
monday: "M"
|
||||||
@@ -74,6 +82,7 @@ common:
|
|||||||
_settings:
|
_settings:
|
||||||
notification: "Notifikasjon"
|
notification: "Notifikasjon"
|
||||||
password: "Passord"
|
password: "Passord"
|
||||||
|
save: "Lagre"
|
||||||
search: "Søk"
|
search: "Søk"
|
||||||
delete: "Slett"
|
delete: "Slett"
|
||||||
loading: "Laster inn..."
|
loading: "Laster inn..."
|
||||||
@@ -261,13 +270,6 @@ desktop/views/components/note.vue:
|
|||||||
detail: "Detaljer"
|
detail: "Detaljer"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
retry: "Prøv på nytt"
|
retry: "Prøv på nytt"
|
||||||
desktop/views/components/post-form.vue:
|
|
||||||
submit: "Send"
|
|
||||||
reply: "Svar"
|
|
||||||
posting: "Publiserer"
|
|
||||||
recent-tags: "Nylig"
|
|
||||||
visibility: "Synlighet"
|
|
||||||
error: "Feil"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nytt innlegg"
|
note: "Nytt innlegg"
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
@@ -289,6 +291,7 @@ common/views/components/api-settings.vue:
|
|||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
in-use: "brukt"
|
in-use: "brukt"
|
||||||
stats: "Statistikk"
|
stats: "Statistikk"
|
||||||
|
default-upload-folder-name: "Mappe(r)"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
save: "Lagre"
|
save: "Lagre"
|
||||||
desktop/views/components/settings.tags.vue:
|
desktop/views/components/settings.tags.vue:
|
||||||
@@ -328,6 +331,10 @@ admin/views/index.vue:
|
|||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
notes: "Innlegg"
|
notes: "Innlegg"
|
||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
levels:
|
||||||
|
info: "Informasjon"
|
||||||
|
error: "Feil"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "Detaljer"
|
details: "Detaljer"
|
||||||
remove-report: "Slett"
|
remove-report: "Slett"
|
||||||
@@ -343,12 +350,16 @@ admin/views/drive.vue:
|
|||||||
local: "Lokalt"
|
local: "Lokalt"
|
||||||
delete: "Slett"
|
delete: "Slett"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
|
username: "Brukernavn"
|
||||||
users:
|
users:
|
||||||
title: "Bruker"
|
title: "Bruker"
|
||||||
state:
|
state:
|
||||||
all: "Alle"
|
all: "Alle"
|
||||||
origin:
|
origin:
|
||||||
local: "Lokalt"
|
local: "Lokalt"
|
||||||
|
admin/views/moderators.vue:
|
||||||
|
logs:
|
||||||
|
info: "Informasjon"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
add: "Legg til"
|
add: "Legg til"
|
||||||
@@ -366,6 +377,7 @@ admin/views/federation.vue:
|
|||||||
status: "Status"
|
status: "Status"
|
||||||
states:
|
states:
|
||||||
all: "Alle"
|
all: "Alle"
|
||||||
|
save: "Lagre"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
announcements: "Kunngjøringer"
|
announcements: "Kunngjøringer"
|
||||||
info: "Informasjon"
|
info: "Informasjon"
|
||||||
@@ -437,10 +449,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
admin: "admin"
|
admin: "admin"
|
||||||
bot: "bot"
|
bot: "bot"
|
||||||
cat: "katt"
|
cat: "katt"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
submit: "Send"
|
|
||||||
reply: "Svar"
|
|
||||||
error: "Feil"
|
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
adjective: "Mr."
|
adjective: "Mr."
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
@@ -463,6 +471,8 @@ mobile/views/pages/games/reversi.vue:
|
|||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Søk"
|
search: "Søk"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Notifikasjon"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
following: "Følger"
|
following: "Følger"
|
||||||
followers: "Følgere"
|
followers: "Følgere"
|
||||||
@@ -486,6 +496,7 @@ deck/deck.user-column.vue:
|
|||||||
followers: "Følgere"
|
followers: "Følgere"
|
||||||
images: "Bilder"
|
images: "Bilder"
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "Fest til profilen din"
|
||||||
like: "Lik"
|
like: "Lik"
|
||||||
blocks:
|
blocks:
|
||||||
image: "Bilder"
|
image: "Bilder"
|
||||||
@@ -505,5 +516,13 @@ pages:
|
|||||||
arg2: "Lister"
|
arg2: "Lister"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Lister"
|
arg1: "Lister"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Lister"
|
||||||
types:
|
types:
|
||||||
array: "Lister"
|
array: "Lister"
|
||||||
|
room:
|
||||||
|
translate: "Flytt"
|
||||||
|
save: "Lagre"
|
||||||
|
furnitures:
|
||||||
|
moon: "Måne"
|
||||||
|
bin: "Papirkurv"
|
||||||
|
|||||||
@@ -14,9 +14,6 @@ common:
|
|||||||
ui: "Interfejs"
|
ui: "Interfejs"
|
||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
drive-desc: "Chcesz opublikować zdjęcie, które już przesłałeś? Chcesz uporządkować, nazwać i utworzyć folder dla przesłanych plików? Dysk Misskey to najlepsze rozwiązanie dla Ciebie. Bardzo łatwo udostępniać swoje pliki online."
|
drive-desc: "Chcesz opublikować zdjęcie, które już przesłałeś? Chcesz uporządkować, nazwać i utworzyć folder dla przesłanych plików? Dysk Misskey to najlepsze rozwiązanie dla Ciebie. Bardzo łatwo udostępniać swoje pliki online."
|
||||||
adblock:
|
|
||||||
detected: "Spróbuj wyłączyć blokadę reklam."
|
|
||||||
warning: "<strong>Misskey nie zawiera reklam</strong>, ale część funkcji może nie działać prawidłowo z włączonym blokowaniem reklam."
|
|
||||||
application-authorization: "Współpraca aplikacji"
|
application-authorization: "Współpraca aplikacji"
|
||||||
close: "Zamknij"
|
close: "Zamknij"
|
||||||
load-more: "Załaduj więcej"
|
load-more: "Załaduj więcej"
|
||||||
@@ -28,6 +25,18 @@ common:
|
|||||||
signin: "Zaloguj się"
|
signin: "Zaloguj się"
|
||||||
signup: "Rejestracja"
|
signup: "Rejestracja"
|
||||||
signout: "Wyloguj się"
|
signout: "Wyloguj się"
|
||||||
|
delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
|
||||||
|
notification-type: "Typy powiadomień"
|
||||||
|
notification-types:
|
||||||
|
all: "Wszyscy"
|
||||||
|
pollVote: "Głosy"
|
||||||
|
follow: "Śledzeni"
|
||||||
|
receiveFollowRequest: "Prośby o śledzenie"
|
||||||
|
reply: "Odpowiedzi"
|
||||||
|
quote: "Cytat"
|
||||||
|
renote: "Udostępnij"
|
||||||
|
mention: "Wzmianki"
|
||||||
|
reaction: "Reakcje"
|
||||||
got-it: "Rozumiem!"
|
got-it: "Rozumiem!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Wskazówki o dostosowywaniu"
|
title: "Wskazówki o dostosowywaniu"
|
||||||
@@ -65,9 +74,31 @@ common:
|
|||||||
favorites: "Moje ulubione"
|
favorites: "Moje ulubione"
|
||||||
permissions:
|
permissions:
|
||||||
"read:drive": "Wyświetl dysk"
|
"read:drive": "Wyświetl dysk"
|
||||||
|
"read:messaging": "Zobacz konwersację"
|
||||||
"write:votes": "Zagłosuj"
|
"write:votes": "Zagłosuj"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
explore: "Poznaj"
|
explore: "Poznaj"
|
||||||
|
post-form:
|
||||||
|
hide-contents: "Ukryj zawartość"
|
||||||
|
reply-placeholder: "Odpowiedź na ten wpis…"
|
||||||
|
quote-placeholder: "Zacytuj ten wpis…"
|
||||||
|
quote-attached: "Z cytatem"
|
||||||
|
submit: "Wpis"
|
||||||
|
reply: "Odpowiedz"
|
||||||
|
renote: "Udostępnij"
|
||||||
|
posting: "Wysyłanie"
|
||||||
|
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
||||||
|
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
||||||
|
create-poll: "Utwórz ankietę"
|
||||||
|
text-remain: "pozostałe znaki: {}"
|
||||||
|
recent-tags: "Ostatnie"
|
||||||
|
visibility: "Widoczność"
|
||||||
|
error: "Błąd"
|
||||||
|
enter-username: "Wprowadź nazwę użytkownika"
|
||||||
|
specified-recipient: "Adresat"
|
||||||
|
add-visible-user: "Dodaj użytkownika"
|
||||||
|
username-prompt: "Wprowadź nazwę użytkownika"
|
||||||
|
enter-file-name: "Wprowadź nazwę pliku"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "N"
|
sunday: "N"
|
||||||
monday: "Pn"
|
monday: "Pn"
|
||||||
@@ -126,10 +157,12 @@ common:
|
|||||||
other: "Inne"
|
other: "Inne"
|
||||||
appearance: "Wygląd"
|
appearance: "Wygląd"
|
||||||
behavior: "Zachowanie"
|
behavior: "Zachowanie"
|
||||||
|
reactions: "Reakcja"
|
||||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||||
note-visibility: "Widoczność wpisów"
|
note-visibility: "Widoczność wpisów"
|
||||||
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||||
web-search-engine: "Wyszukiwarka internetowa"
|
web-search-engine: "Wyszukiwarka internetowa"
|
||||||
|
paste: "Wklej"
|
||||||
line-width: "Szerokości linii"
|
line-width: "Szerokości linii"
|
||||||
line-width-thin: "Cienka"
|
line-width-thin: "Cienka"
|
||||||
line-width-normal: "Normalna"
|
line-width-normal: "Normalna"
|
||||||
@@ -158,6 +191,8 @@ common:
|
|||||||
version: "Wersja:"
|
version: "Wersja:"
|
||||||
do-update: "Sprawdź dostępność nowych aktualizacji"
|
do-update: "Sprawdź dostępność nowych aktualizacji"
|
||||||
navbar-position-left: "Z lewej"
|
navbar-position-left: "Z lewej"
|
||||||
|
save: "Zapisz"
|
||||||
|
saved: "Zapisano"
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
delete: "Usuń"
|
delete: "Usuń"
|
||||||
loading: "Ładowanie"
|
loading: "Ładowanie"
|
||||||
@@ -218,6 +253,9 @@ auth/views/index.vue:
|
|||||||
please-go-back: "Wróć do aplikacji."
|
please-go-back: "Wróć do aplikacji."
|
||||||
error: "Sesja nie istnieje."
|
error: "Sesja nie istnieje."
|
||||||
sign-in: "Proszę zalogować się."
|
sign-in: "Proszę zalogować się."
|
||||||
|
common/views/pages/explore.vue:
|
||||||
|
popular-users: "Popularni użytkownicy"
|
||||||
|
popular-tags: "Popularne tagi"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "Oczekiwanie na {}"
|
waiting-for: "Oczekiwanie na {}"
|
||||||
@@ -391,6 +429,8 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "Rzeczy"
|
objects: "Rzeczy"
|
||||||
symbols: "Symbole"
|
symbols: "Symbole"
|
||||||
flags: "Flagi"
|
flags: "Flagi"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Nazwa użytkownika"
|
username: "Nazwa użytkownika"
|
||||||
password: "Hasło"
|
password: "Hasło"
|
||||||
@@ -491,6 +531,7 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "Pomyślnie zaktualizowano profil"
|
saved: "Pomyślnie zaktualizowano profil"
|
||||||
uploading: "Wysyłanie"
|
uploading: "Wysyłanie"
|
||||||
upload-failed: "Wysyłanie nie powiodło się"
|
upload-failed: "Wysyłanie nie powiodło się"
|
||||||
|
unable-to-process: "Nie udało się ukończyć działania."
|
||||||
email: "Ustawienia e-mail"
|
email: "Ustawienia e-mail"
|
||||||
email-address: "Adres e-mail"
|
email-address: "Adres e-mail"
|
||||||
email-verified: "Twój adres e-mail został zweryfikowany."
|
email-verified: "Twój adres e-mail został zweryfikowany."
|
||||||
@@ -585,6 +626,7 @@ desktop:
|
|||||||
uploading-avatar: "Wysyłanie awatara"
|
uploading-avatar: "Wysyłanie awatara"
|
||||||
avatar-updated: "Wysłano awatar"
|
avatar-updated: "Wysłano awatar"
|
||||||
choose-avatar: "Wybierz awatar"
|
choose-avatar: "Wybierz awatar"
|
||||||
|
unable-to-process: "Nie udało się ukończyć działania."
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Czarny … Łącznie"
|
total: "Czarny … Łącznie"
|
||||||
notes: "Niebieski … Wpisy"
|
notes: "Niebieski … Wpisy"
|
||||||
@@ -643,6 +685,7 @@ desktop/views/components/drive.folder.vue:
|
|||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
rename-folder: "Zmień nazwę katalogu"
|
rename-folder: "Zmień nazwę katalogu"
|
||||||
input-new-folder-name: "Wprowadź nową nazwę"
|
input-new-folder-name: "Wprowadź nową nazwę"
|
||||||
|
else-folders: "Inne"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
empty-draghover: "Przeciągnij tutaj!"
|
empty-draghover: "Przeciągnij tutaj!"
|
||||||
@@ -701,33 +744,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "Brak powiadomień"
|
empty: "Brak powiadomień"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+Dodaj użytkownika"
|
|
||||||
attach-location-information: "Załącz informacje o lokalizacji"
|
|
||||||
hide-contents: "Ukryj zawartość"
|
|
||||||
reply-placeholder: "Odpowiedz na ten wpis…"
|
|
||||||
quote-placeholder: "Zacytuj ten wpis…"
|
|
||||||
submit: "Wyślij"
|
|
||||||
reply: "Odpowiedz"
|
|
||||||
renote: "Udostępnienie"
|
|
||||||
posted: "Opublikowano!"
|
posted: "Opublikowano!"
|
||||||
replied: "Odpowiedziano!"
|
replied: "Odpowiedziano!"
|
||||||
reposted: "Udostępniono!"
|
reposted: "Udostępniono!"
|
||||||
note-failed: "Nie udało się wysłać"
|
note-failed: "Nie udało się wysłać"
|
||||||
reply-failed: "Nie udało się odpowiedzieć"
|
reply-failed: "Nie udało się odpowiedzieć"
|
||||||
renote-failed: "Nie udało się udostępnić"
|
renote-failed: "Nie udało się udostępnić"
|
||||||
posting: "Wysyłanie"
|
|
||||||
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
|
||||||
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "Utwórz ankietę"
|
|
||||||
text-remain: "pozostałe znaki: {}"
|
|
||||||
recent-tags: "Ostatnie"
|
|
||||||
click-to-tagging: "Naciśnij aby oznaczyć"
|
|
||||||
visibility: "Widoczność"
|
|
||||||
geolocation-alert: "Twoje urządzenie nie obsługuje geolokalizacji."
|
|
||||||
error: "Bład"
|
|
||||||
enter-username: "Wprowadź nazwę użytkownika…"
|
|
||||||
annotations: "Treść ostrzeżenia (opcjonalnie)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Nowy wpis"
|
note: "Nowy wpis"
|
||||||
reply: "Odpowiedz"
|
reply: "Odpowiedz"
|
||||||
@@ -783,6 +805,7 @@ common/views/components/drive-settings.vue:
|
|||||||
max: "Max"
|
max: "Max"
|
||||||
in-use: "użyto"
|
in-use: "użyto"
|
||||||
stats: "Statystyki"
|
stats: "Statystyki"
|
||||||
|
default-upload-folder-name: "Katalog(i)"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "Wycisz / Zablokuj"
|
mute-and-block: "Wycisz / Zablokuj"
|
||||||
mute: "Wycisz"
|
mute: "Wycisz"
|
||||||
@@ -862,6 +885,10 @@ admin/views/dashboard.vue:
|
|||||||
notes: "Wpisy"
|
notes: "Wpisy"
|
||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
instances: "Instancja"
|
instances: "Instancja"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
levels:
|
||||||
|
info: "Informacje"
|
||||||
|
error: "Błąd"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "Szczegóły"
|
details: "Szczegóły"
|
||||||
remove-report: "Usuń"
|
remove-report: "Usuń"
|
||||||
@@ -876,6 +903,7 @@ admin/views/instance.vue:
|
|||||||
save: "Zapisz"
|
save: "Zapisz"
|
||||||
saved: "Zapisano"
|
saved: "Zapisano"
|
||||||
email: "Adres e-mail"
|
email: "Adres e-mail"
|
||||||
|
test-email: "Test"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
notes: "Wpisy"
|
notes: "Wpisy"
|
||||||
users: "Użytkownicy"
|
users: "Użytkownicy"
|
||||||
@@ -897,6 +925,7 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "Cofnij oznaczenie jako zawartość wrażliwą"
|
unmark-as-sensitive: "Cofnij oznaczenie jako zawartość wrażliwą"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
user-not-found: "Nie znaleziono użytkownika"
|
user-not-found: "Nie znaleziono użytkownika"
|
||||||
|
username: "Nazwa użytkownika"
|
||||||
users:
|
users:
|
||||||
title: "Użytkownicy"
|
title: "Użytkownicy"
|
||||||
sort:
|
sort:
|
||||||
@@ -912,6 +941,9 @@ admin/views/users.vue:
|
|||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
add: "Zarejestruj się"
|
add: "Zarejestruj się"
|
||||||
|
logs:
|
||||||
|
moderator: "Moderatorzy"
|
||||||
|
info: "Informacje"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
name: "Nazwa Emoji"
|
name: "Nazwa Emoji"
|
||||||
@@ -950,6 +982,7 @@ admin/views/federation.vue:
|
|||||||
chart-srcs:
|
chart-srcs:
|
||||||
requests: "Żądania"
|
requests: "Żądania"
|
||||||
blocked-hosts: "Zablokuj"
|
blocked-hosts: "Zablokuj"
|
||||||
|
save: "Zapisz"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "O Misskey"
|
about: "O Misskey"
|
||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
@@ -1072,17 +1105,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "kot"
|
cat: "kot"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "Brak powiadomień"
|
empty: "Brak powiadomień"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "Dodaj użytkownika"
|
|
||||||
submit: "Wyślij"
|
|
||||||
reply: "Odpowiedz"
|
|
||||||
renote: "Udostępnij"
|
|
||||||
quote-placeholder: "Zacytuj ten wpis… (nieobowiązkowe)"
|
|
||||||
reply-placeholder: "Odpowiedź na ten wpis…"
|
|
||||||
cw-placeholder: "Treść ostrzeżenia (opcjonalnie)"
|
|
||||||
geolocation-alert: "Twoje urządzenie nie obsługuje geolokalizacji."
|
|
||||||
error: "Błąd"
|
|
||||||
username-prompt: "Wprowadź nazwę użytkownika"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "ten wpis jest prywatny"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "ten wpis został usunięty"
|
deleted: "ten wpis został usunięty"
|
||||||
@@ -1128,6 +1150,8 @@ mobile/views/pages/search.vue:
|
|||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Wybierz plik"
|
select-file: "Wybierz plik"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "Powiadomienia"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "Zalogowany jako {}"
|
signed-in-as: "Zalogowany jako {}"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1192,6 +1216,8 @@ dev/views/new-app.vue:
|
|||||||
app-name: "Nazwa Aplikacji"
|
app-name: "Nazwa Aplikacji"
|
||||||
authority: "Uprawnienia"
|
authority: "Uprawnienia"
|
||||||
pages:
|
pages:
|
||||||
|
pin-this-page: "Przypnij do profilu"
|
||||||
|
unpin-this-page: "Odepnij"
|
||||||
like: "Lubię"
|
like: "Lubię"
|
||||||
title: "Tytuł"
|
title: "Tytuł"
|
||||||
blocks:
|
blocks:
|
||||||
@@ -1209,6 +1235,8 @@ pages:
|
|||||||
text: "Tytuł"
|
text: "Tytuł"
|
||||||
_button:
|
_button:
|
||||||
text: "Tytuł"
|
text: "Tytuł"
|
||||||
|
_radioButton:
|
||||||
|
title: "Tytuł"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
random: "Losowy"
|
random: "Losowy"
|
||||||
@@ -1225,5 +1253,14 @@ pages:
|
|||||||
arg2: "Listy"
|
arg2: "Listy"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Listy"
|
arg1: "Listy"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listy"
|
||||||
types:
|
types:
|
||||||
array: "Listy"
|
array: "Listy"
|
||||||
|
room:
|
||||||
|
translate: "Przenieś"
|
||||||
|
save: "Zapisz"
|
||||||
|
saved: "Zapisano"
|
||||||
|
furnitures:
|
||||||
|
moon: "Księżyc"
|
||||||
|
bin: "Kosz"
|
||||||
|
|||||||
@@ -12,12 +12,12 @@ common:
|
|||||||
rich-contents: "Post"
|
rich-contents: "Post"
|
||||||
rich-contents-desc: "Apenas poste suas ideias, temas do momento e qualquer coisa que você queira compartilhar. Você pode querer decorar suas palavras, anexar suas imagens favoritas, enviar arquivos, inclusive vídeos ou criar uma enquete. Essas são as coisas que você pode fazer em Misskey."
|
rich-contents-desc: "Apenas poste suas ideias, temas do momento e qualquer coisa que você queira compartilhar. Você pode querer decorar suas palavras, anexar suas imagens favoritas, enviar arquivos, inclusive vídeos ou criar uma enquete. Essas são as coisas que você pode fazer em Misskey."
|
||||||
reaction: "Reações"
|
reaction: "Reações"
|
||||||
adblock:
|
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません"
|
||||||
detected: "Por favor, desative o bloqueador de anúncios."
|
|
||||||
warning: "Alguns recursos podem não estar disponíveis ou apresentar mal funcionamento se o bloqueio de anúncios estiver ativado. <strong>Misskey não está usando anúncios</strong>"
|
|
||||||
application-authorization: "Aplicativos autorizados"
|
application-authorization: "Aplicativos autorizados"
|
||||||
close: "Fechar"
|
close: "Fechar"
|
||||||
do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
|
do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
|
||||||
|
notification-types:
|
||||||
|
follow: "Seguindo"
|
||||||
got-it: "Entendi!"
|
got-it: "Entendi!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Dicas de personalização"
|
title: "Dicas de personalização"
|
||||||
@@ -45,6 +45,9 @@ common:
|
|||||||
trash: "Lixo"
|
trash: "Lixo"
|
||||||
timeline: "Linha do tempo"
|
timeline: "Linha do tempo"
|
||||||
followers: "Seguidores"
|
followers: "Seguidores"
|
||||||
|
post-form:
|
||||||
|
enter-username: "Digite o nome de usuário."
|
||||||
|
username-prompt: "Digite o nome de usuário."
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Dom"
|
sunday: "Dom"
|
||||||
monday: "Seg"
|
monday: "Seg"
|
||||||
@@ -89,6 +92,7 @@ common:
|
|||||||
update-available-title: "Atualização disponível"
|
update-available-title: "Atualização disponível"
|
||||||
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
|
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
|
||||||
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
|
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
|
||||||
|
enter-username: "Digite o nome de usuário."
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
my-turn: "Seu turno"
|
my-turn: "Seu turno"
|
||||||
@@ -278,3 +282,7 @@ pages:
|
|||||||
blocks:
|
blocks:
|
||||||
image: "Imagens"
|
image: "Imagens"
|
||||||
post: "Formulário de publicação"
|
post: "Formulário de publicação"
|
||||||
|
room:
|
||||||
|
furnitures:
|
||||||
|
moon: "Lua"
|
||||||
|
bin: "Lixo"
|
||||||
|
|||||||
@@ -18,14 +18,19 @@ common:
|
|||||||
drive: "Хранилище файлов"
|
drive: "Хранилище файлов"
|
||||||
drive-desc: "Хотите запостить картинку, которую уже отправляли ранее? Хочется сортировать, переименовать и создать папку для ваших выложенных файлов? Тогда Misskey Drive - это лучшее решение для вас. Очень лёгкий способ делиться своими файлами онлайн."
|
drive-desc: "Хотите запостить картинку, которую уже отправляли ранее? Хочется сортировать, переименовать и создать папку для ваших выложенных файлов? Тогда Misskey Drive - это лучшее решение для вас. Очень лёгкий способ делиться своими файлами онлайн."
|
||||||
outro: "Попробуйте будущие, уникальные для Misskey функции своими глазами! Если чувствуете, что это не в вашем вкусе, то попробуйте другие инстанции, ведь Misskey - это децентрализованная социальная сеть, так что ты можешь с лёгкостью найти себе товарищей. И наконец, GLHF!"
|
outro: "Попробуйте будущие, уникальные для Misskey функции своими глазами! Если чувствуете, что это не в вашем вкусе, то попробуйте другие инстанции, ведь Misskey - это децентрализованная социальная сеть, так что ты можешь с лёгкостью найти себе товарищей. И наконец, GLHF!"
|
||||||
adblock:
|
|
||||||
detected: "Пожалуйста, отключите блокировщик рекламы."
|
|
||||||
warning: "Некоторые функции перестанут быть доступными или будут работать неправильно, если включена блокировка рекламы. <strong>В Misskey нет рекламы</strong>."
|
|
||||||
application-authorization: "Авторизация приложений"
|
application-authorization: "Авторизация приложений"
|
||||||
close: "Закрыть"
|
close: "Закрыть"
|
||||||
do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
|
do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
|
||||||
load-more: "Загрузить больше"
|
load-more: "Загрузить больше"
|
||||||
enter-password: "Пожалуйста, введите ваш пароль"
|
enter-password: "Пожалуйста, введите ваш пароль"
|
||||||
|
2fa: "Двухфакторная аутентификация"
|
||||||
|
customize-home: "Настройка домашней страницы"
|
||||||
|
featured-notes: "Рекомендуемые"
|
||||||
|
dark-mode: "Тёмная тема"
|
||||||
|
signin: "Войти"
|
||||||
|
signup: "Регистрация"
|
||||||
|
signout: "Выйти"
|
||||||
|
reload-to-apply-the-setting: "Вам необходимо перезагрузить страницу, чтобы применить настройки. Вы хотите перезагрузить сейчас?"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Советы по настройке"
|
title: "Советы по настройке"
|
||||||
gotit: "Понятно!"
|
gotit: "Понятно!"
|
||||||
@@ -51,7 +56,14 @@ common:
|
|||||||
month-and-day: "{day}.{month}"
|
month-and-day: "{day}.{month}"
|
||||||
trash: "Мусорное ведро"
|
trash: "Мусорное ведро"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
pages: "Страницы"
|
||||||
messaging: "Чат"
|
messaging: "Чат"
|
||||||
|
timeline: "Лента"
|
||||||
|
followers: "Подписчики"
|
||||||
|
favorites: "Избранное"
|
||||||
|
post-form:
|
||||||
|
reply: "Ответить"
|
||||||
|
create-poll: "Создать опрос"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "Вс"
|
sunday: "Вс"
|
||||||
monday: "Пн"
|
monday: "Пн"
|
||||||
@@ -153,3 +165,7 @@ pages:
|
|||||||
random: "Случайно"
|
random: "Случайно"
|
||||||
blocks:
|
blocks:
|
||||||
random: "Случайно"
|
random: "Случайно"
|
||||||
|
room:
|
||||||
|
furnitures:
|
||||||
|
moon: "Луна"
|
||||||
|
bin: "Мусорное ведро"
|
||||||
|
|||||||
@@ -18,9 +18,6 @@ common:
|
|||||||
drive: "网盘"
|
drive: "网盘"
|
||||||
drive-desc: "想要发布一张您已经上传过的照片吗?想要管理文件或为上传的文件创建文件夹吗?Misskey的网盘是一个最好的解决方案。"
|
drive-desc: "想要发布一张您已经上传过的照片吗?想要管理文件或为上传的文件创建文件夹吗?Misskey的网盘是一个最好的解决方案。"
|
||||||
outro: "Misskey还有其他更多功能,请亲身体验一下吧。因为 Misskey 是一个分布式的 SNS,如果您感觉某个功能不适合自己,试试其他的吧。祝您玩得开心!"
|
outro: "Misskey还有其他更多功能,请亲身体验一下吧。因为 Misskey 是一个分布式的 SNS,如果您感觉某个功能不适合自己,试试其他的吧。祝您玩得开心!"
|
||||||
adblock:
|
|
||||||
detected: "请关闭广告拦截器"
|
|
||||||
warning: "<strong>Misskey不会发布广告</strong>如果您启用广告拦截器, 可能会导致某些功能无法正常使用。"
|
|
||||||
application-authorization: "应用程序授权"
|
application-authorization: "应用程序授权"
|
||||||
close: "关闭"
|
close: "关闭"
|
||||||
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
|
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
|
||||||
@@ -35,6 +32,20 @@ common:
|
|||||||
signout: "退出"
|
signout: "退出"
|
||||||
reload-to-apply-the-setting: "必须重新加载页面以应用此设置。 确实要立即重新加载吗?"
|
reload-to-apply-the-setting: "必须重新加载页面以应用此设置。 确实要立即重新加载吗?"
|
||||||
fetching-as-ap-object: "联合查询"
|
fetching-as-ap-object: "联合查询"
|
||||||
|
unfollow-confirm: "取消对{name}的关注?"
|
||||||
|
delete-confirm: "确定删除这个投稿吗?"
|
||||||
|
signin-required: "请先登录"
|
||||||
|
notification-type: "通知类型"
|
||||||
|
notification-types:
|
||||||
|
all: "所有"
|
||||||
|
pollVote: "投票"
|
||||||
|
follow: "关注中"
|
||||||
|
receiveFollowRequest: "关注请求"
|
||||||
|
reply: "回复"
|
||||||
|
quote: "引用"
|
||||||
|
renote: "转推"
|
||||||
|
mention: "提及"
|
||||||
|
reaction: "回应"
|
||||||
got-it: "知道了"
|
got-it: "知道了"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "自定义提示"
|
title: "自定义提示"
|
||||||
@@ -92,9 +103,44 @@ common:
|
|||||||
"read:reactions": "查看回应"
|
"read:reactions": "查看回应"
|
||||||
"write:reactions": "回应操作"
|
"write:reactions": "回应操作"
|
||||||
"write:votes": "投票"
|
"write:votes": "投票"
|
||||||
|
"read:pages": "查看页面"
|
||||||
|
"write:pages": "操作页面"
|
||||||
|
"read:page-likes": "查看喜欢的页面"
|
||||||
|
"write:page-likes": "操作喜欢的页面"
|
||||||
|
"read:user-groups": "查看用户组"
|
||||||
|
"write:user-groups": "操作用户组"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "关注其他用户时,帖子将显示在时间线中。"
|
follow-users-to-make-your-timeline: "关注其他用户时,帖子将显示在时间线中。"
|
||||||
explore: "查找用户"
|
explore: "查找用户"
|
||||||
|
post-form:
|
||||||
|
attach-location-information: "添加位置信息"
|
||||||
|
hide-contents: "隐藏内容"
|
||||||
|
reply-placeholder: "回复此贴..."
|
||||||
|
quote-placeholder: "引用此帖…"
|
||||||
|
option-quote-placeholder: "引用此帖…(可选)"
|
||||||
|
quote-attached: "已引用"
|
||||||
|
quote-question: "是否将其作为引用附上?"
|
||||||
|
submit: "帖子"
|
||||||
|
reply: "回复"
|
||||||
|
renote: "转推"
|
||||||
|
posting: "发送中"
|
||||||
|
attach-media-from-local: "从PC中添加媒体文件"
|
||||||
|
attach-media-from-drive: "从网盘中添加媒体文件"
|
||||||
|
insert-a-kao: "v('ω')v"
|
||||||
|
create-poll: "创建一个投票"
|
||||||
|
text-remain: "还剩{}个字符"
|
||||||
|
recent-tags: "最近"
|
||||||
|
local-only-message: "这篇文章只会在本地发布"
|
||||||
|
click-to-tagging: "点击添加标签"
|
||||||
|
visibility: "可见性"
|
||||||
|
geolocation-alert: "您的设备不支持定位服务"
|
||||||
|
error: "错误"
|
||||||
|
enter-username: "输入用户名"
|
||||||
|
specified-recipient: "收件人"
|
||||||
|
add-visible-user: "添加用户"
|
||||||
|
cw-placeholder: "评论帖子(可选)"
|
||||||
|
username-prompt: "输入用户名"
|
||||||
|
enter-file-name: "编辑文件名"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "日"
|
sunday: "日"
|
||||||
monday: "一"
|
monday: "一"
|
||||||
@@ -154,6 +200,7 @@ common:
|
|||||||
other: "其他"
|
other: "其他"
|
||||||
appearance: "设计"
|
appearance: "设计"
|
||||||
behavior: "行为"
|
behavior: "行为"
|
||||||
|
reactions: "回应"
|
||||||
fetch-on-scroll: "向下滚动时自动加载"
|
fetch-on-scroll: "向下滚动时自动加载"
|
||||||
fetch-on-scroll-desc: "向下滚动页面时,它会自动提取其他内容。"
|
fetch-on-scroll-desc: "向下滚动页面时,它会自动提取其他内容。"
|
||||||
note-visibility: "帖子可见性"
|
note-visibility: "帖子可见性"
|
||||||
@@ -161,6 +208,11 @@ common:
|
|||||||
remember-note-visibility: "记住帖子可见性"
|
remember-note-visibility: "记住帖子可见性"
|
||||||
web-search-engine: "搜索引擎"
|
web-search-engine: "搜索引擎"
|
||||||
web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}"
|
||||||
|
paste: "粘贴"
|
||||||
|
pasted-file-name: "粘贴的文件名模板"
|
||||||
|
pasted-file-name-desc: "例: \"yyyy-MM-dd HH-mm-ss [{{number}}]\" → \"2018-03-20 21-30-24 1\""
|
||||||
|
paste-dialog: "粘贴时编辑文件名"
|
||||||
|
paste-dialog-desc: "粘贴时显示编辑文件名的对话框"
|
||||||
keep-cw: "保留内容警告"
|
keep-cw: "保留内容警告"
|
||||||
keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。"
|
keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。"
|
||||||
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
||||||
@@ -168,6 +220,7 @@ common:
|
|||||||
use-avatar-reversi-stones: "用头像作为黑白棋的棋子"
|
use-avatar-reversi-stones: "用头像作为黑白棋的棋子"
|
||||||
disable-animated-mfm: "在帖子中禁用动画文本"
|
disable-animated-mfm: "在帖子中禁用动画文本"
|
||||||
disable-showing-animated-images: "不播放动画"
|
disable-showing-animated-images: "不播放动画"
|
||||||
|
enable-quick-notification-view: "启用通知快速查看"
|
||||||
suggest-recent-hashtags: "在帖子表单上显示最近流行的哈希标签"
|
suggest-recent-hashtags: "在帖子表单上显示最近流行的哈希标签"
|
||||||
always-show-nsfw: "总是显示 NSFW 的内容"
|
always-show-nsfw: "总是显示 NSFW 的内容"
|
||||||
always-mark-nsfw: "总是用 NSFW 来标记附件"
|
always-mark-nsfw: "总是用 NSFW 来标记附件"
|
||||||
@@ -198,7 +251,7 @@ common:
|
|||||||
deck-column-width-wide: "宽"
|
deck-column-width-wide: "宽"
|
||||||
use-shadow: "在UI中使用阴影效果"
|
use-shadow: "在UI中使用阴影效果"
|
||||||
rounded-corners: "UI界面圆角效果"
|
rounded-corners: "UI界面圆角效果"
|
||||||
circle-icons: "使用圆形图标"
|
circle-icons: "使用圆形头像"
|
||||||
contrasted-acct: "增加用户名的对比度"
|
contrasted-acct: "增加用户名的对比度"
|
||||||
wallpaper: "壁纸"
|
wallpaper: "壁纸"
|
||||||
choose-wallpaper: "选择壁纸"
|
choose-wallpaper: "选择壁纸"
|
||||||
@@ -243,6 +296,21 @@ common:
|
|||||||
disable-via-mobile: "不要将帖子标记为“来自手机”"
|
disable-via-mobile: "不要将帖子标记为“来自手机”"
|
||||||
load-raw-images: "以原始质量显示附加图像"
|
load-raw-images: "以原始质量显示附加图像"
|
||||||
load-remote-media: "显示来自远程服务器的媒体"
|
load-remote-media: "显示来自远程服务器的媒体"
|
||||||
|
sync: "同步"
|
||||||
|
save: "保存"
|
||||||
|
saved: "已保存"
|
||||||
|
home-profile: "定制首页数据"
|
||||||
|
deck-profile: "定制Deck数据"
|
||||||
|
room: "房间"
|
||||||
|
_room:
|
||||||
|
graphicsQuality: "图形质量"
|
||||||
|
_graphicsQuality:
|
||||||
|
ultra: "最高"
|
||||||
|
high: "高"
|
||||||
|
medium: "中"
|
||||||
|
low: "低"
|
||||||
|
cheep: "最低"
|
||||||
|
useOrthographicCamera: "使用正交相机"
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
delete: "删除"
|
delete: "删除"
|
||||||
loading: "正在加载中"
|
loading: "正在加载中"
|
||||||
@@ -253,7 +321,7 @@ common:
|
|||||||
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
||||||
hide-password: "隐藏密码"
|
hide-password: "隐藏密码"
|
||||||
show-password: "显示密码"
|
show-password: "显示密码"
|
||||||
enter-username: "请输入用户名"
|
enter-username: "输入用户名"
|
||||||
do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用."
|
do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用."
|
||||||
user-suspended: "该用户已被冻结。"
|
user-suspended: "该用户已被冻结。"
|
||||||
is-remote-user: "此用户信息可能不准确。"
|
is-remote-user: "此用户信息可能不准确。"
|
||||||
@@ -327,6 +395,9 @@ common/views/pages/explore.vue:
|
|||||||
federated: "联合"
|
federated: "联合"
|
||||||
explore: "查找{host}"
|
explore: "查找{host}"
|
||||||
users-info: "当前有{users}个注册用户"
|
users-info: "当前有{users}个注册用户"
|
||||||
|
common/views/components/reactions-viewer.details.vue:
|
||||||
|
few-users: "{users}作出了{reaction}的回应"
|
||||||
|
many-users: "{users}和其他{omitted}人做出了{reaction}的回应"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "打开播放器"
|
enable-player: "打开播放器"
|
||||||
disable-player: "关闭播放器"
|
disable-player: "关闭播放器"
|
||||||
@@ -492,7 +563,10 @@ common/views/components/note-menu.vue:
|
|||||||
unpin: "取消置顶"
|
unpin: "取消置顶"
|
||||||
delete: "删除"
|
delete: "删除"
|
||||||
delete-confirm: "确定删除这个投稿吗?"
|
delete-confirm: "确定删除这个投稿吗?"
|
||||||
|
delete-and-edit: "删除和编辑"
|
||||||
|
delete-and-edit-confirm: "要删除此帖并再次编辑吗?对此帖的所有回应,转推和回复也将被删除。"
|
||||||
remote: "显示原始投稿"
|
remote: "显示原始投稿"
|
||||||
|
pin-limit-exceeded: "无法置顶更多了。"
|
||||||
common/views/components/user-menu.vue:
|
common/views/components/user-menu.vue:
|
||||||
mention: "提到"
|
mention: "提到"
|
||||||
mute: "屏蔽"
|
mute: "屏蔽"
|
||||||
@@ -550,6 +624,7 @@ common/views/components/poll-editor.vue:
|
|||||||
day: "日"
|
day: "日"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "选择回应"
|
choose-reaction: "选择回应"
|
||||||
|
input-reaction-placeholder: "表情符号输入"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "自定义表情符号"
|
custom-emoji: "自定义表情符号"
|
||||||
people: "人"
|
people: "人"
|
||||||
@@ -560,6 +635,14 @@ common/views/components/emoji-picker.vue:
|
|||||||
objects: "物品"
|
objects: "物品"
|
||||||
symbols: "符号"
|
symbols: "符号"
|
||||||
flags: "旗帜"
|
flags: "旗帜"
|
||||||
|
common/views/components/settings/app-type.vue:
|
||||||
|
title: "模式"
|
||||||
|
intro: "您可以指定使用桌面版或移动版。"
|
||||||
|
choices:
|
||||||
|
auto: "自动选择"
|
||||||
|
desktop: "固定为桌面版"
|
||||||
|
mobile: "固定为移动版"
|
||||||
|
info: "更改将在刷新页面后生效。"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "用户名"
|
username: "用户名"
|
||||||
password: "密码"
|
password: "密码"
|
||||||
@@ -570,6 +653,8 @@ common/views/components/signin.vue:
|
|||||||
signin-with-github: "用 GitHub 登录"
|
signin-with-github: "用 GitHub 登录"
|
||||||
signin-with-discord: "用 Discord 登录"
|
signin-with-discord: "用 Discord 登录"
|
||||||
login-failed: "登录失败。请检查用户名和密码。"
|
login-failed: "登录失败。请检查用户名和密码。"
|
||||||
|
tap-key: "点击安全密钥登录"
|
||||||
|
enter-2fa-code: "输入验证码"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
invitation-code: "邀请码"
|
invitation-code: "邀请码"
|
||||||
invitation-info: "如果您没有邀请码,请联系<a href=\"{}\">管理员</a>。"
|
invitation-info: "如果您没有邀请码,请联系<a href=\"{}\">管理员</a>。"
|
||||||
@@ -674,6 +759,9 @@ common/views/components/profile-editor.vue:
|
|||||||
saved: "您的个人资料已保存"
|
saved: "您的个人资料已保存"
|
||||||
uploading: "正在上传"
|
uploading: "正在上传"
|
||||||
upload-failed: "上传失败"
|
upload-failed: "上传失败"
|
||||||
|
unable-to-process: "无法完成操作"
|
||||||
|
avatar-not-an-image: "选择的头像文件不是图片格式"
|
||||||
|
banner-not-an-image: "选择的横幅背景不是图片格式"
|
||||||
email: "邮件设置"
|
email: "邮件设置"
|
||||||
email-address: "电子邮件地址"
|
email-address: "电子邮件地址"
|
||||||
email-verified: "电子邮件地址已验证"
|
email-verified: "电子邮件地址已验证"
|
||||||
@@ -693,6 +781,9 @@ common/views/components/profile-editor.vue:
|
|||||||
danger-zone: "危险选项"
|
danger-zone: "危险选项"
|
||||||
delete-account: "删除帐户"
|
delete-account: "删除帐户"
|
||||||
account-deleted: "帐户已被删除。 数据会在一段时间之后清除。"
|
account-deleted: "帐户已被删除。 数据会在一段时间之后清除。"
|
||||||
|
profile-metadata: "个人资料补充信息"
|
||||||
|
metadata-label: "标签"
|
||||||
|
metadata-content: "内容"
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "用户"
|
users: "用户"
|
||||||
rename: "重命名列表"
|
rename: "重命名列表"
|
||||||
@@ -731,6 +822,7 @@ common/views/widgets/broadcast.vue:
|
|||||||
no-broadcasts: "没有公告"
|
no-broadcasts: "没有公告"
|
||||||
have-a-nice-day: "祝你有愉快的一天!"
|
have-a-nice-day: "祝你有愉快的一天!"
|
||||||
next: "下一个"
|
next: "下一个"
|
||||||
|
prev: "上一首"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "{}年"
|
year: "{}年"
|
||||||
month: "{}月"
|
month: "{}月"
|
||||||
@@ -802,6 +894,7 @@ desktop:
|
|||||||
uploading-avatar: "上传一个新的头像"
|
uploading-avatar: "上传一个新的头像"
|
||||||
avatar-updated: "成功上传头像"
|
avatar-updated: "成功上传头像"
|
||||||
choose-avatar: "选择作为头像的图片"
|
choose-avatar: "选择作为头像的图片"
|
||||||
|
unable-to-process: "无法完成操作"
|
||||||
invalid-filetype: "不接受此文件类型"
|
invalid-filetype: "不接受此文件类型"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "黑 ... 总计"
|
total: "黑 ... 总计"
|
||||||
@@ -831,7 +924,7 @@ desktop/views/components/crop-window.vue:
|
|||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
ok: "确定"
|
ok: "确定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "已使用"
|
||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "头像"
|
avatar: "头像"
|
||||||
banner: "背景"
|
banner: "背景"
|
||||||
@@ -842,8 +935,8 @@ desktop/views/components/drive.file.vue:
|
|||||||
unmark-as-sensitive: "取消标记为“敏感”"
|
unmark-as-sensitive: "取消标记为“敏感”"
|
||||||
copy-url: "复制链接"
|
copy-url: "复制链接"
|
||||||
download: "下载"
|
download: "下载"
|
||||||
else-files: "其他..."
|
else-files: "其他"
|
||||||
set-as-avatar: "设置为头像"
|
set-as-avatar: "设为头像"
|
||||||
set-as-banner: "设置为背景"
|
set-as-banner: "设置为背景"
|
||||||
open-in-app: "在应用程序中打开"
|
open-in-app: "在应用程序中打开"
|
||||||
add-app: "添加应用"
|
add-app: "添加应用"
|
||||||
@@ -852,15 +945,20 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied: "已复制"
|
copied: "已复制"
|
||||||
copied-url-to-clipboard: "已复制链接到剪贴板"
|
copied-url-to-clipboard: "已复制链接到剪贴板"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
|
upload-folder: "默认上传文件夹"
|
||||||
unable-to-process: "无法完成操作"
|
unable-to-process: "无法完成操作"
|
||||||
circular-reference-detected: "目标文件夹是您要移动的文件夹的子文件夹。"
|
circular-reference-detected: "目标文件夹是您要移动的文件夹的子文件夹。"
|
||||||
unhandled-error: "未知错误"
|
unhandled-error: "未知错误"
|
||||||
|
unable-to-delete: "无法删除"
|
||||||
|
has-child-files-or-folders: "此文件夹不为空,无法删除。"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "移动到此文件夹"
|
move-to-this-folder: "移动到此文件夹"
|
||||||
show-in-new-window: "在新窗口打开"
|
show-in-new-window: "在新窗口打开"
|
||||||
rename: "重命名"
|
rename: "重命名"
|
||||||
rename-folder: "重命名文件夹"
|
rename-folder: "重命名文件夹"
|
||||||
input-new-folder-name: "请输入新文件名"
|
input-new-folder-name: "请输入新文件名"
|
||||||
|
else-folders: "其他"
|
||||||
|
set-as-upload-folder: "设置为默认上传文件夹"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
empty-draghover: "放在这里!因为你知道我很可爱,对吗?"
|
empty-draghover: "放在这里!因为你知道我很可爱,对吗?"
|
||||||
@@ -921,34 +1019,12 @@ desktop/views/components/notes.vue:
|
|||||||
desktop/views/components/notifications.vue:
|
desktop/views/components/notifications.vue:
|
||||||
empty: "没有通知哦!"
|
empty: "没有通知哦!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
add-visible-user: "+添加用户"
|
|
||||||
attach-location-information: "添加位置信息"
|
|
||||||
hide-contents: "隐藏内容"
|
|
||||||
reply-placeholder: "回复这个帖子"
|
|
||||||
quote-placeholder: "引用这个帖子…"
|
|
||||||
submit: "投稿"
|
|
||||||
reply: "回复"
|
|
||||||
renote: "转推"
|
|
||||||
posted: "已发送投稿!"
|
posted: "已发送投稿!"
|
||||||
replied: "已回复!"
|
replied: "已回复!"
|
||||||
reposted: "已转推!"
|
reposted: "已转推!"
|
||||||
note-failed: "发帖失败"
|
note-failed: "发帖失败"
|
||||||
reply-failed: "回复失败"
|
reply-failed: "回复失败"
|
||||||
renote-failed: "转推失败"
|
renote-failed: "转推失败"
|
||||||
posting: "发送中"
|
|
||||||
attach-media-from-local: "从设备中添加媒体文件"
|
|
||||||
attach-media-from-drive: "从网盘中添加媒体文件"
|
|
||||||
insert-a-kao: "v('ω')v"
|
|
||||||
create-poll: "创建一个投票"
|
|
||||||
text-remain: "还剩{}字"
|
|
||||||
recent-tags: "最近"
|
|
||||||
local-only-message: "这篇文章只会在本地发表"
|
|
||||||
click-to-tagging: "点击添加标签"
|
|
||||||
visibility: "可见性"
|
|
||||||
geolocation-alert: "您的设备不提供位置服务"
|
|
||||||
error: "错误"
|
|
||||||
enter-username: "请填写一个用户名"
|
|
||||||
annotations: "注释帖子(可选)"
|
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "新建帖子"
|
note: "新建帖子"
|
||||||
reply: "回复"
|
reply: "回复"
|
||||||
@@ -988,6 +1064,16 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
success: "设置完成"
|
success: "设置完成"
|
||||||
failed: "设置失败, 请确保您的密钥是正确的。"
|
failed: "设置失败, 请确保您的密钥是正确的。"
|
||||||
info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
|
info: "从下次登录Misskey时,您的设备上显示的令牌以及密码也是必需的。"
|
||||||
|
totp-header: "身份验证 App"
|
||||||
|
security-key-header: "安全密钥"
|
||||||
|
security-key: "为了增强安全性,您可以使用支持FIDO2的硬件安全密钥登录您的帐户。 登录时,您将需要注册安全密钥或身份验证应用。"
|
||||||
|
last-used: "最后使用:"
|
||||||
|
activate-key: "单击以激活您的安全密钥"
|
||||||
|
security-key-name: "密钥名称"
|
||||||
|
register-security-key: "安全密钥注册完成"
|
||||||
|
something-went-wrong: "糟糕!安全密钥注册出现问题:"
|
||||||
|
key-unregistered: "安全密钥已被删除。"
|
||||||
|
use-password-less-login: "使用免密码登录"
|
||||||
common/views/components/media-image.vue:
|
common/views/components/media-image.vue:
|
||||||
sensitive: "阅读注意"
|
sensitive: "阅读注意"
|
||||||
click-to-show: "点击查看"
|
click-to-show: "点击查看"
|
||||||
@@ -1010,8 +1096,11 @@ desktop/views/components/settings.apps.vue:
|
|||||||
no-apps: "没有已连接的应用程序"
|
no-apps: "没有已连接的应用程序"
|
||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "容量"
|
max: "容量"
|
||||||
in-use: "正在使用"
|
in-use: "已使用"
|
||||||
stats: "统计"
|
stats: "统计"
|
||||||
|
default-upload-folder: "默认上传文件夹"
|
||||||
|
default-upload-folder-name: "文件夹"
|
||||||
|
change-default-upload-folder: "更改文件夹"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "屏蔽/拉黑"
|
mute-and-block: "屏蔽/拉黑"
|
||||||
mute: "屏蔽"
|
mute: "屏蔽"
|
||||||
@@ -1065,6 +1154,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
groups: "群组"
|
groups: "群组"
|
||||||
follow-requests: "关注申请"
|
follow-requests: "关注申请"
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
|
room: "房间"
|
||||||
desktop/views/components/ui.header.nav.vue:
|
desktop/views/components/ui.header.nav.vue:
|
||||||
game: "游戏"
|
game: "游戏"
|
||||||
desktop/views/components/ui.header.notifications.vue:
|
desktop/views/components/ui.header.notifications.vue:
|
||||||
@@ -1097,7 +1187,13 @@ admin/views/index.vue:
|
|||||||
abuse: "举报垃圾信息"
|
abuse: "举报垃圾信息"
|
||||||
queue: "作业队列"
|
queue: "作业队列"
|
||||||
logs: "登录"
|
logs: "登录"
|
||||||
|
db: "数据库"
|
||||||
back-to-misskey: "返回 Misskey"
|
back-to-misskey: "返回 Misskey"
|
||||||
|
admin/views/db.vue:
|
||||||
|
tables: "表格"
|
||||||
|
vacuum: "VACUUM"
|
||||||
|
vacuum-info: "清理数据库。 保持数据完整并减少磁盘使用量。 此操作通常会自动定期执行。"
|
||||||
|
vacuum-exclamation: "运行VACUUM之后,数据库上的负载可能会持续一段时间,并且可能不响应用户操作。"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
accounts: "账户"
|
accounts: "账户"
|
||||||
@@ -1109,6 +1205,32 @@ admin/views/dashboard.vue:
|
|||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
title: "队列"
|
title: "队列"
|
||||||
remove-all-jobs: "清除所有作业"
|
remove-all-jobs: "清除所有作业"
|
||||||
|
jobs: "任务"
|
||||||
|
queue: "队列"
|
||||||
|
domains:
|
||||||
|
deliver: "交付"
|
||||||
|
inbox: "收件箱"
|
||||||
|
db: "数据库"
|
||||||
|
objectStorage: "对象存储"
|
||||||
|
state: "状态"
|
||||||
|
states:
|
||||||
|
active: "处理中"
|
||||||
|
delayed: "已预订"
|
||||||
|
waiting: "队列等待中"
|
||||||
|
result-is-truncated: "结果已省略"
|
||||||
|
other-queues: "其他队列"
|
||||||
|
admin/views/logs.vue:
|
||||||
|
logs: "登录"
|
||||||
|
domain: "域"
|
||||||
|
level: "级别"
|
||||||
|
levels:
|
||||||
|
all: "所有"
|
||||||
|
info: "信息"
|
||||||
|
success: "成功"
|
||||||
|
warning: "警告"
|
||||||
|
error: "错误"
|
||||||
|
debug: "调试"
|
||||||
|
delete-all: "全部删除"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "举报垃圾信息"
|
title: "举报垃圾信息"
|
||||||
target: "目标"
|
target: "目标"
|
||||||
@@ -1206,6 +1328,7 @@ admin/views/instance.vue:
|
|||||||
smtp-auth: "SMTP身份验证"
|
smtp-auth: "SMTP身份验证"
|
||||||
smtp-user: "SMTP 用户名"
|
smtp-user: "SMTP 用户名"
|
||||||
smtp-pass: "SMTP 密码"
|
smtp-pass: "SMTP 密码"
|
||||||
|
test-email: "测试"
|
||||||
serviceworker-config: "ServiceWorker"
|
serviceworker-config: "ServiceWorker"
|
||||||
enable-serviceworker: "启用ServiceWorker"
|
enable-serviceworker: "启用ServiceWorker"
|
||||||
serviceworker-info: "您需要启用推送通知"
|
serviceworker-info: "您需要启用推送通知"
|
||||||
@@ -1260,6 +1383,9 @@ admin/views/drive.vue:
|
|||||||
unmark-as-sensitive: "取消标记为“敏感”"
|
unmark-as-sensitive: "取消标记为“敏感”"
|
||||||
marked-as-sensitive: "标记为“敏感”"
|
marked-as-sensitive: "标记为“敏感”"
|
||||||
unmarked-as-sensitive: "取消标记为“敏感”"
|
unmarked-as-sensitive: "取消标记为“敏感”"
|
||||||
|
clean-remote-files: "删除远程文件缓存"
|
||||||
|
clean-remote-files-are-you-sure: "确定要删除所有远程文件缓存吗?"
|
||||||
|
clean-up: "清除缓存"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "用户名或用户ID"
|
username-or-userid: "用户名或用户ID"
|
||||||
@@ -1282,6 +1408,8 @@ admin/views/users.vue:
|
|||||||
remote-user-updated: "远程用户信息已更新"
|
remote-user-updated: "远程用户信息已更新"
|
||||||
delete-all-files: "删除所有文件"
|
delete-all-files: "删除所有文件"
|
||||||
delete-all-files-confirm: "删除所有文件吗?"
|
delete-all-files-confirm: "删除所有文件吗?"
|
||||||
|
username: "用户名"
|
||||||
|
host: "主机名"
|
||||||
users:
|
users:
|
||||||
title: "用户"
|
title: "用户"
|
||||||
sort:
|
sort:
|
||||||
@@ -1293,6 +1421,7 @@ admin/views/users.vue:
|
|||||||
state:
|
state:
|
||||||
title: "状态"
|
title: "状态"
|
||||||
all: "全部"
|
all: "全部"
|
||||||
|
available: "可用"
|
||||||
admin: "管理员"
|
admin: "管理员"
|
||||||
moderator: "版主"
|
moderator: "版主"
|
||||||
adminOrModerator: "管理员+版主"
|
adminOrModerator: "管理员+版主"
|
||||||
@@ -1312,6 +1441,12 @@ admin/views/moderators.vue:
|
|||||||
added: "已注册版主。"
|
added: "已注册版主。"
|
||||||
remove: "取消"
|
remove: "取消"
|
||||||
removed: "取消注册版主"
|
removed: "取消注册版主"
|
||||||
|
logs:
|
||||||
|
title: "登录"
|
||||||
|
moderator: "版主"
|
||||||
|
type: "操作"
|
||||||
|
at: "日期和时间"
|
||||||
|
info: "信息"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "添加emoji"
|
title: "添加emoji"
|
||||||
@@ -1406,6 +1541,7 @@ admin/views/federation.vue:
|
|||||||
day: "每天"
|
day: "每天"
|
||||||
blocked-hosts: "拉黑"
|
blocked-hosts: "拉黑"
|
||||||
blocked-hosts-info: "描述您要阻止的主机,以换行符分隔。"
|
blocked-hosts-info: "描述您要阻止的主机,以换行符分隔。"
|
||||||
|
save: "保存"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "更多信息..."
|
about: "更多信息..."
|
||||||
timeline: "时间线"
|
timeline: "时间线"
|
||||||
@@ -1482,7 +1618,7 @@ desktop/views/widgets/users.vue:
|
|||||||
refresh: "更多"
|
refresh: "更多"
|
||||||
no-one: "不是!"
|
no-one: "不是!"
|
||||||
mobile/views/components/drive.vue:
|
mobile/views/components/drive.vue:
|
||||||
used: "使用中"
|
used: "已使用"
|
||||||
folder-count: "文件夹"
|
folder-count: "文件夹"
|
||||||
count-separator: ","
|
count-separator: ","
|
||||||
file-count: "文件"
|
file-count: "文件"
|
||||||
@@ -1537,17 +1673,6 @@ mobile/views/components/note-sub.vue:
|
|||||||
cat: "cat"
|
cat: "cat"
|
||||||
mobile/views/components/notifications.vue:
|
mobile/views/components/notifications.vue:
|
||||||
empty: "没有通知哦!"
|
empty: "没有通知哦!"
|
||||||
mobile/views/components/post-form.vue:
|
|
||||||
add-visible-user: "添加用户"
|
|
||||||
submit: "帖子"
|
|
||||||
reply: "回复"
|
|
||||||
renote: "转推"
|
|
||||||
quote-placeholder: "引用这个帖子t... (可选)"
|
|
||||||
reply-placeholder: "回复这个帖子"
|
|
||||||
cw-placeholder: "评论帖子(可选)"
|
|
||||||
geolocation-alert: "您的设备不提供位置服务"
|
|
||||||
error: "错误"
|
|
||||||
username-prompt: "请输入用户名"
|
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "私密帖子"
|
private: "私密帖子"
|
||||||
deleted: "帖子已删除"
|
deleted: "帖子已删除"
|
||||||
@@ -1610,6 +1735,8 @@ mobile/views/pages/search.vue:
|
|||||||
not-found: "没有找到有关于“{q}”的帖子"
|
not-found: "没有找到有关于“{q}”的帖子"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "选择文件"
|
select-file: "选择文件"
|
||||||
|
mobile/views/pages/notifications.vue:
|
||||||
|
notifications: "通知"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
signed-in-as: "以{}登录"
|
signed-in-as: "以{}登录"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
@@ -1668,6 +1795,7 @@ deck/deck.user-column.vue:
|
|||||||
activity: "活动"
|
activity: "活动"
|
||||||
timeline: "时间线"
|
timeline: "时间线"
|
||||||
pinned-notes: "置顶帖"
|
pinned-notes: "置顶帖"
|
||||||
|
pinned-page: "已置顶的页面"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "发现错误或想要为文档做出贡献?"
|
edit-this-page-on-github: "发现错误或想要为文档做出贡献?"
|
||||||
edit-this-page-on-github-link: "在GitHub上编辑这个页面。"
|
edit-this-page-on-github-link: "在GitHub上编辑这个页面。"
|
||||||
@@ -1699,9 +1827,14 @@ pages:
|
|||||||
read-page: "查看源"
|
read-page: "查看源"
|
||||||
page-created: "页面已创建"
|
page-created: "页面已创建"
|
||||||
page-updated: "页面已更新"
|
page-updated: "页面已更新"
|
||||||
|
name-already-exists: "该页面URL已存在"
|
||||||
|
title-invalid-name: "无效的页面URL"
|
||||||
|
text-invalid-name: "请确认该项不为空"
|
||||||
are-you-sure-delete: "是否删除此页面?"
|
are-you-sure-delete: "是否删除此页面?"
|
||||||
page-deleted: "该页面已被删除。"
|
page-deleted: "该页面已被删除。"
|
||||||
edit-this-page: "编辑此页面"
|
edit-this-page: "编辑此页面"
|
||||||
|
pin-this-page: "置顶"
|
||||||
|
unpin-this-page: "取消置顶"
|
||||||
view-source: "查看源代码"
|
view-source: "查看源代码"
|
||||||
view-page: "查看页面"
|
view-page: "查看页面"
|
||||||
like: "赞"
|
like: "赞"
|
||||||
@@ -1720,6 +1853,7 @@ pages:
|
|||||||
url: "页面URL"
|
url: "页面URL"
|
||||||
summary: "页面摘要"
|
summary: "页面摘要"
|
||||||
align-center: "居中"
|
align-center: "居中"
|
||||||
|
hide-title-when-pinned: "置顶时隐藏标题"
|
||||||
font: "字体"
|
font: "字体"
|
||||||
fontSerif: "衬线字体"
|
fontSerif: "衬线字体"
|
||||||
fontSansSerif: "无衬线字体"
|
fontSansSerif: "无衬线字体"
|
||||||
@@ -1773,12 +1907,25 @@ pages:
|
|||||||
inc: "增加值"
|
inc: "增加值"
|
||||||
_button:
|
_button:
|
||||||
text: "标题"
|
text: "标题"
|
||||||
|
colored: "彩色"
|
||||||
action: "按下按钮时的行为"
|
action: "按下按钮时的行为"
|
||||||
_action:
|
_action:
|
||||||
dialog: "显示对话框"
|
dialog: "显示对话框"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "内容"
|
content: "内容"
|
||||||
resetRandom: "随机值重置"
|
resetRandom: "随机值重置"
|
||||||
|
pushEvent: "发送事件"
|
||||||
|
_pushEvent:
|
||||||
|
event: "事件名称"
|
||||||
|
message: "按下时显示的消息"
|
||||||
|
variable: "发送的变量"
|
||||||
|
no-variable: "空"
|
||||||
|
radioButton: "选择项"
|
||||||
|
_radioButton:
|
||||||
|
name: "变量名"
|
||||||
|
title: "标题"
|
||||||
|
values: "使用换行区分的选择项"
|
||||||
|
default: "默认值"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
flow: "控制"
|
flow: "控制"
|
||||||
@@ -1832,8 +1979,8 @@ pages:
|
|||||||
_divide:
|
_divide:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
remind: "÷ 取模"
|
mod: "÷ 取模"
|
||||||
_remind:
|
_mod:
|
||||||
arg1: "A"
|
arg1: "A"
|
||||||
arg2: "B"
|
arg2: "B"
|
||||||
eq: "A和B相等"
|
eq: "A和B相等"
|
||||||
@@ -1916,6 +2063,9 @@ pages:
|
|||||||
_pick:
|
_pick:
|
||||||
arg1: "列表"
|
arg1: "列表"
|
||||||
arg2: "位置"
|
arg2: "位置"
|
||||||
|
listLen: "获取列表长度"
|
||||||
|
_listLen:
|
||||||
|
arg1: "列表"
|
||||||
number: "数值"
|
number: "数值"
|
||||||
stringToNumber: "文本到数字"
|
stringToNumber: "文本到数字"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
@@ -1948,3 +2098,64 @@ pages:
|
|||||||
enviromentVariables: "环境变量"
|
enviromentVariables: "环境变量"
|
||||||
pageVariables: "页面元素"
|
pageVariables: "页面元素"
|
||||||
argVariables: "输入槽函数"
|
argVariables: "输入槽函数"
|
||||||
|
room:
|
||||||
|
add-furniture: "放置家具"
|
||||||
|
translate: "移动"
|
||||||
|
rotate: "旋转"
|
||||||
|
exit: "返回"
|
||||||
|
remove: "移除"
|
||||||
|
save: "保存"
|
||||||
|
saved: "已保存"
|
||||||
|
clear: "清理"
|
||||||
|
clear-confirm: "是否清除所有家具?"
|
||||||
|
leave-confirm: "有尚未保存的修改。是否离开?"
|
||||||
|
chooseImage: "选择图片"
|
||||||
|
room-type: "房间类型"
|
||||||
|
carpet-color: "地板颜色"
|
||||||
|
rooms:
|
||||||
|
default: "默认"
|
||||||
|
washitsu: "和式房间"
|
||||||
|
furnitures:
|
||||||
|
milk: "牛奶纸箱"
|
||||||
|
bed: "床"
|
||||||
|
low-table: "矮桌"
|
||||||
|
desk: "书桌"
|
||||||
|
chair: "椅子"
|
||||||
|
chair2: "椅子2"
|
||||||
|
fan: "换气扇"
|
||||||
|
pc: "电脑"
|
||||||
|
plant: "观叶植物"
|
||||||
|
plant2: "观叶植物2"
|
||||||
|
eraser: "橡皮擦"
|
||||||
|
pencil: "铅笔"
|
||||||
|
pudding: "布丁"
|
||||||
|
cardboard-box: "纸板箱"
|
||||||
|
cardboard-box2: "纸板箱2"
|
||||||
|
cardboard-box3: "纸板箱3"
|
||||||
|
book: "书"
|
||||||
|
book2: "书2"
|
||||||
|
piano: "钢琴"
|
||||||
|
facial-tissue: "纸巾盒"
|
||||||
|
server: "服务器"
|
||||||
|
moon: "月球"
|
||||||
|
corkboard: "软木板"
|
||||||
|
mousepad: "鼠标垫"
|
||||||
|
monitor: "显示器"
|
||||||
|
keyboard: "键盘"
|
||||||
|
carpet-stripe: "地毯(条纹)"
|
||||||
|
mat: "垫子"
|
||||||
|
color-box: "收纳柜"
|
||||||
|
wall-clock: "挂钟"
|
||||||
|
photoframe: "相框"
|
||||||
|
cube: "立方体"
|
||||||
|
tv: "电视"
|
||||||
|
pinguin: "企鹅君"
|
||||||
|
rubik-cube: "魔方"
|
||||||
|
poster-h: "海报(横向)"
|
||||||
|
poster-v: "海报(纵向)"
|
||||||
|
sofa: "沙发"
|
||||||
|
spiral: "螺旋楼梯"
|
||||||
|
bin: "垃圾箱"
|
||||||
|
cup-noodle: "杯面"
|
||||||
|
holo-display: "全息显示器"
|
||||||
|
energy-drink: "能量饮料"
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ common:
|
|||||||
rich-contents: "發佈"
|
rich-contents: "發佈"
|
||||||
reaction: "回應"
|
reaction: "回應"
|
||||||
drive: "雲端硬碟"
|
drive: "雲端硬碟"
|
||||||
adblock:
|
|
||||||
detected: "請禁用廣告封鎖器"
|
|
||||||
close: "關閉"
|
close: "關閉"
|
||||||
enter-password: "請輸入密碼"
|
enter-password: "請輸入密碼"
|
||||||
2fa: "雙重身份驗證"
|
2fa: "雙重身份驗證"
|
||||||
@@ -88,3 +86,6 @@ admin/views/charts.vue:
|
|||||||
drive: "雲端硬碟"
|
drive: "雲端硬碟"
|
||||||
pages:
|
pages:
|
||||||
like: "贊"
|
like: "贊"
|
||||||
|
room:
|
||||||
|
furnitures:
|
||||||
|
moon: "月"
|
||||||
|
|||||||
485
migration/1000000000000-Init.ts
Normal file
485
migration/1000000000000-Init.ts
Normal file
@@ -0,0 +1,485 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class Init1000000000000 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TYPE "log_level_enum" AS ENUM('error', 'warning', 'info', 'success', 'debug')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "domain" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "level" "log_level_enum" NOT NULL, "worker" character varying(8) NOT NULL, "machine" character varying(128) NOT NULL, "message" character varying(1024) NOT NULL, "data" jsonb NOT NULL DEFAULT '{}', CONSTRAINT "PK_350604cbdf991d5930d9e618fbd" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8e4eb51a35d81b64dda28eed0a" ON "log" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8cb40cfc8f3c28261e6f887b03" ON "log" ("domain") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_584b536b49e53ac81beb39a177" ON "log" ("level") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "drive_folder" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(128) NOT NULL, "userId" character varying(32), "parentId" character varying(32), CONSTRAINT "PK_7a0c089191f5ebdc214e0af808a" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_02878d441ceae15ce060b73daf" ON "drive_folder" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f4fc06e49c0171c85f1c48060d" ON "drive_folder" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_00ceffb0cdc238b3233294f08f" ON "drive_folder" ("parentId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "drive_file" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32), "userHost" character varying(128), "md5" character varying(32) NOT NULL, "name" character varying(256) NOT NULL, "type" character varying(128) NOT NULL, "size" integer NOT NULL, "comment" character varying(512), "properties" jsonb NOT NULL DEFAULT '{}', "storedInternal" boolean NOT NULL, "url" character varying(512) NOT NULL, "thumbnailUrl" character varying(512), "webpublicUrl" character varying(512), "accessKey" character varying(256), "thumbnailAccessKey" character varying(256), "webpublicAccessKey" character varying(256), "uri" character varying(512), "src" character varying(512), "folderId" character varying(32), "isSensitive" boolean NOT NULL DEFAULT false, "isLink" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_43ddaaaf18c9e68029b7cbb032e" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c8dfad3b72196dd1d6b5db168a" ON "drive_file" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_860fa6f6c7df5bb887249fba22" ON "drive_file" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_92779627994ac79277f070c91e" ON "drive_file" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_37bb9a1b4585f8a3beb24c62d6" ON "drive_file" ("md5") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a40b8df8c989d7db937ea27cf6" ON "drive_file" ("type") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d85a184c2540d2deba33daf642" ON "drive_file" ("accessKey") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e74022ce9a074b3866f70e0d27" ON "drive_file" ("thumbnailAccessKey") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_c55b2b7c284d9fef98026fc88e" ON "drive_file" ("webpublicAccessKey") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e5848eac4940934e23dbc17581" ON "drive_file" ("uri") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bb90d1956dafc4068c28aa7560" ON "drive_file" ("folderId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE, "lastFetchedAt" TIMESTAMP WITH TIME ZONE, "username" character varying(128) NOT NULL, "usernameLower" character varying(128) NOT NULL, "name" character varying(128), "followersCount" integer NOT NULL DEFAULT 0, "followingCount" integer NOT NULL DEFAULT 0, "notesCount" integer NOT NULL DEFAULT 0, "avatarId" character varying(32), "bannerId" character varying(32), "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "avatarUrl" character varying(512), "bannerUrl" character varying(512), "avatarColor" character varying(32), "bannerColor" character varying(32), "isSuspended" boolean NOT NULL DEFAULT false, "isSilenced" boolean NOT NULL DEFAULT false, "isLocked" boolean NOT NULL DEFAULT false, "isBot" boolean NOT NULL DEFAULT false, "isCat" boolean NOT NULL DEFAULT false, "isAdmin" boolean NOT NULL DEFAULT false, "isModerator" boolean NOT NULL DEFAULT false, "isVerified" boolean NOT NULL DEFAULT false, "emojis" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "host" character varying(128), "inbox" character varying(512), "sharedInbox" character varying(512), "featured" character varying(512), "uri" character varying(512), "token" character(16), CONSTRAINT "UQ_a854e557b1b14814750c7c7b0c9" UNIQUE ("token"), CONSTRAINT "REL_58f5c71eaab331645112cf8cfa" UNIQUE ("avatarId"), CONSTRAINT "REL_afc64b53f8db3707ceb34eb28e" UNIQUE ("bannerId"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e11e649824a45d8ed01d597fd9" ON "user" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_80ca6e6ef65fb9ef34ea8c90f4" ON "user" ("updatedAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a27b942a0d6dcff90e3ee9b5e8" ON "user" ("usernameLower") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_fa99d777623947a5b05f394cae" ON "user" ("tags") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3252a5df8d5bbd16b281f7799e" ON "user" ("host") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_be623adaa4c566baf5d29ce0c8" ON "user" ("uri") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a854e557b1b14814750c7c7b0c" ON "user" ("token") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5deb01ae162d1d70b80d064c27" ON "user" ("usernameLower", "host") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "app" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32), "secret" character varying(64) NOT NULL, "name" character varying(128) NOT NULL, "description" character varying(512) NOT NULL, "permission" character varying(64) array NOT NULL, "callbackUrl" character varying(512), CONSTRAINT "PK_9478629fc093d229df09e560aea" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_048a757923ed8b157e9895da53" ON "app" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3f5b0899ef90527a3462d7c2cb" ON "app" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f49922d511d666848f250663c4" ON "app" ("secret") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "access_token" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "token" character varying(128) NOT NULL, "hash" character varying(128) NOT NULL, "userId" character varying(32) NOT NULL, "appId" character varying(32) NOT NULL, CONSTRAINT "PK_f20f028607b2603deabd8182d12" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_70ba8f6af34bc924fc9e12adb8" ON "access_token" ("token") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_64c327441248bae40f7d92f34f" ON "access_token" ("hash") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_9949557d0e1b2c19e5344c171e" ON "access_token" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TYPE "note_visibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "replyId" character varying(32), "renoteId" character varying(32), "text" text, "name" character varying(256), "cw" character varying(512), "appId" character varying(32), "userId" character varying(32) NOT NULL, "viaMobile" boolean NOT NULL DEFAULT false, "localOnly" boolean NOT NULL DEFAULT false, "renoteCount" smallint NOT NULL DEFAULT 0, "repliesCount" smallint NOT NULL DEFAULT 0, "reactions" jsonb NOT NULL DEFAULT '{}', "visibility" "note_visibility_enum" NOT NULL, "uri" character varying(512), "score" integer NOT NULL DEFAULT 0, "fileIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "attachedFileTypes" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "visibleUserIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "mentions" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "mentionedRemoteUsers" text NOT NULL DEFAULT '[]', "emojis" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "hasPoll" boolean NOT NULL DEFAULT false, "geo" jsonb DEFAULT null, "userHost" character varying(128), "replyUserId" character varying(32), "replyUserHost" character varying(128), "renoteUserId" character varying(32), "renoteUserHost" character varying(128), CONSTRAINT "PK_96d0c172a4fba276b1bbed43058" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e7c0567f5261063592f022e9b5" ON "note" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_17cb3553c700a4985dff5a30ff" ON "note" ("replyId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_52ccc804d7c69037d558bac4c9" ON "note" ("renoteId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_153536c67d05e9adb24e99fc2b" ON "note" ("uri") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_51c063b6a133a9cb87145450f5" ON "note" ("fileIds") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_25dfc71b0369b003a4cd434d0b" ON "note" ("attachedFileTypes") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_796a8c03959361f97dc2be1d5c" ON "note" ("visibleUserIds") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_54ebcb6d27222913b908d56fd8" ON "note" ("mentions") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_88937d94d7443d9a99a76fa5c0" ON "note" ("tags") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7125a826ab192eb27e11d358a5" ON "note" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "poll_vote" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "choice" integer NOT NULL, CONSTRAINT "PK_fd002d371201c472490ba89c6a0" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0fb627e1c2f753262a74f0562d" ON "poll_vote" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_66d2bd2ee31d14bcc23069a89f" ON "poll_vote" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_aecfbd5ef60374918e63ee95fa" ON "poll_vote" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_50bd7164c5b78f1f4a42c4d21f" ON "poll_vote" ("userId", "noteId", "choice") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_reaction" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "reaction" character varying(128) NOT NULL, CONSTRAINT "PK_767ec729b108799b587a3fcc9cf" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_01f4581f114e0ebd2bbb876f0b" ON "note_reaction" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_13761f64257f40c5636d0ff95e" ON "note_reaction" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_45145e4953780f3cd5656f0ea6" ON "note_reaction" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_ad0c221b25672daf2df320a817" ON "note_reaction" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_watching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "noteUserId" character varying(32) NOT NULL, CONSTRAINT "PK_49286fdb23725945a74aa27d757" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_318cdf42a9cfc11f479bd802bb" ON "note_watching" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b0134ec406e8d09a540f818288" ON "note_watching" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_03e7028ab8388a3f5e3ce2a861" ON "note_watching" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_44499765eec6b5489d72c4253b" ON "note_watching" ("noteUserId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a42c93c69989ce1d09959df4cf" ON "note_watching" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_unread" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "noteUserId" character varying(32) NOT NULL, "isSpecified" boolean NOT NULL, CONSTRAINT "PK_1904eda61a784f57e6e51fa9c1f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_56b0166d34ddae49d8ef7610bb" ON "note_unread" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e637cba4dc4410218c4251260e" ON "note_unread" ("noteId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d908433a4953cc13216cd9c274" ON "note_unread" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "notification" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "notifieeId" character varying(32) NOT NULL, "notifierId" character varying(32) NOT NULL, "type" character varying(32) NOT NULL, "isRead" boolean NOT NULL DEFAULT false, "noteId" character varying(32), "reaction" character varying(128), "choice" integer, CONSTRAINT "PK_705b6c7cdf9b2c2ff7ac7872cb7" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON "notification" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON "notification" ("notifieeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/assets/ai.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT 'https://xn--931a.moe/aiart/yubitun.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT true, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "following" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_c76c6e044bdf76ecf8bfb82a645" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_582f8fab771a9040a12961f3e7" ON "following" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_24e0042143a18157b234df186c" ON "following" ("followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6516c5a6f3c015b4eed39978be" ON "following" ("followerId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_307be5f1d1252e0388662acb96" ON "following" ("followerId", "followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "instance" ("id" character varying(32) NOT NULL, "caughtAt" TIMESTAMP WITH TIME ZONE NOT NULL, "host" character varying(128) NOT NULL, "system" character varying(64), "usersCount" integer NOT NULL DEFAULT 0, "notesCount" integer NOT NULL DEFAULT 0, "followingCount" integer NOT NULL DEFAULT 0, "followersCount" integer NOT NULL DEFAULT 0, "driveUsage" integer NOT NULL DEFAULT 0, "driveFiles" integer NOT NULL DEFAULT 0, "latestRequestSentAt" TIMESTAMP WITH TIME ZONE, "latestStatus" integer, "latestRequestReceivedAt" TIMESTAMP WITH TIME ZONE, "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "isNotResponding" boolean NOT NULL DEFAULT false, "isMarkedAsClosed" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_eaf60e4a0c399c9935413e06474" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2cd3b2a6b4cf0b910b260afe08" ON "instance" ("caughtAt") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_8d5afc98982185799b160e10eb" ON "instance" ("host") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "muteeId" character varying(32) NOT NULL, "muterId" character varying(32) NOT NULL, CONSTRAINT "PK_2e92d06c8b5c602eeb27ca9ba48" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f86d57fbca33c7a4e6897490cc" ON "muting" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ec96b4fed9dae517e0dbbe0675" ON "muting" ("muteeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_93060675b4a79a577f31d260c6" ON "muting" ("muterId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_1eb9d9824a630321a29fd3b290" ON "muting" ("muterId", "muteeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "sw_subscription" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "endpoint" character varying(512) NOT NULL, "auth" character varying(256) NOT NULL, "publickey" character varying(128) NOT NULL, CONSTRAINT "PK_e8f763631530051b95eb6279b91" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_97754ca6f2baff9b4abb7f853d" ON "sw_subscription" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "blocking" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "blockeeId" character varying(32) NOT NULL, "blockerId" character varying(32) NOT NULL, CONSTRAINT "PK_e5d9a541cc1965ee7e048ea09dd" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b9a354f7941c1e779f3b33aea6" ON "blocking" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2cd4a2743a99671308f5417759" ON "blocking" ("blockeeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0627125f1a8a42c9a1929edb55" ON "blocking" ("blockerId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_98a1bc5cb30dfd159de056549f" ON "blocking" ("blockerId", "blockeeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_list" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, CONSTRAINT "PK_87bab75775fd9b1ff822b656402" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b7fcefbdd1c18dce86687531f9" ON "user_list" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_list_joining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userListId" character varying(32) NOT NULL, CONSTRAINT "PK_11abb3768da1c5f8de101c9df45" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d844bfc6f3f523a05189076efa" ON "user_list_joining" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_605472305f26818cc93d1baaa7" ON "user_list_joining" ("userListId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "hashtag" ("id" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, "mentionedUserIds" character varying(32) array NOT NULL, "mentionedUsersCount" integer NOT NULL DEFAULT 0, "mentionedLocalUserIds" character varying(32) array NOT NULL, "mentionedLocalUsersCount" integer NOT NULL DEFAULT 0, "mentionedRemoteUserIds" character varying(32) array NOT NULL, "mentionedRemoteUsersCount" integer NOT NULL DEFAULT 0, "attachedUserIds" character varying(32) array NOT NULL, "attachedUsersCount" integer NOT NULL DEFAULT 0, "attachedLocalUserIds" character varying(32) array NOT NULL, "attachedLocalUsersCount" integer NOT NULL DEFAULT 0, "attachedRemoteUserIds" character varying(32) array NOT NULL, "attachedRemoteUsersCount" integer NOT NULL DEFAULT 0, CONSTRAINT "PK_cb36eb8af8412bfa978f1165d78" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_347fec870eafea7b26c8a73bac" ON "hashtag" ("name") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2710a55f826ee236ea1a62698f" ON "hashtag" ("mentionedUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0e206cec573f1edff4a3062923" ON "hashtag" ("mentionedLocalUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_4c02d38a976c3ae132228c6fce" ON "hashtag" ("mentionedRemoteUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d57f9030cd3af7f63ffb1c267c" ON "hashtag" ("attachedUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0c44bf4f680964145f2a68a341" ON "hashtag" ("attachedLocalUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0b03cbcd7e6a7ce068efa8ecc2" ON "hashtag" ("attachedRemoteUsersCount") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "note_favorite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_af0da35a60b9fa4463a62082b36" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_47f4b1892f5d6ba8efb3057d81" ON "note_favorite" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0f4fb9ad355f3effff221ef245" ON "note_favorite" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "abuse_user_report" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "reporterId" character varying(32) NOT NULL, "comment" character varying(512) NOT NULL, CONSTRAINT "PK_87873f5f5cc5c321a1306b2d18c" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_db2098070b2b5a523c58181f74" ON "abuse_user_report" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d049123c413e68ca52abe73420" ON "abuse_user_report" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_04cc96756f89d0b7f9473e8cdf" ON "abuse_user_report" ("reporterId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5cd442c3b2e74fdd99dae20243" ON "abuse_user_report" ("userId", "reporterId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "registration_ticket" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "code" character varying(64) NOT NULL, CONSTRAINT "PK_f11696b6fafcf3662d4292734f8" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0ff69e8dfa9fe31bb4a4660f59" ON "registration_ticket" ("code") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "messaging_message" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "recipientId" character varying(32) NOT NULL, "text" character varying(4096), "isRead" boolean NOT NULL DEFAULT false, "fileId" character varying(32), CONSTRAINT "PK_db398fd79dc95d0eb8c30456eaa" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e21cd3646e52ef9c94aaf17c2e" ON "messaging_message" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5377c307783fce2b6d352e1203" ON "messaging_message" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_cac14a4e3944454a5ce7daa514" ON "messaging_message" ("recipientId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "signin" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "ip" character varying(128) NOT NULL, "headers" jsonb NOT NULL, "success" boolean NOT NULL, CONSTRAINT "PK_9e96ddc025712616fc492b3b588" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2c308dbdc50d94dc625670055f" ON "signin" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "auth_session" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "token" character varying(128) NOT NULL, "userId" character varying(32), "appId" character varying(32) NOT NULL, CONSTRAINT "PK_19354ed146424a728c1112a8cbf" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_62cb09e1129f6ec024ef66e183" ON "auth_session" ("token") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "follow_request" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "requestId" character varying(128), "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_53a9aa3725f7a3deb150b39dbfc" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_12c01c0d1a79f77d9f6c15fadd" ON "follow_request" ("followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a7fd92dd6dc519e6fb435dd108" ON "follow_request" ("followerId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d54a512b822fac7ed52800f6b4" ON "follow_request" ("followerId", "followeeId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "emoji" ("id" character varying(32) NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE, "name" character varying(128) NOT NULL, "host" character varying(128), "url" character varying(512) NOT NULL, "uri" character varying(512), "type" character varying(64), "aliases" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_df74ce05e24999ee01ea0bc50a3" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b37dafc86e9af007e3295c2781" ON "emoji" ("name") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5900e907bb46516ddf2871327c" ON "emoji" ("host") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_4f4d35e1256c84ae3d1f0eab10" ON "emoji" ("name", "host") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "reversi_game" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "startedAt" TIMESTAMP WITH TIME ZONE, "user1Id" character varying(32) NOT NULL, "user2Id" character varying(32) NOT NULL, "user1Accepted" boolean NOT NULL DEFAULT false, "user2Accepted" boolean NOT NULL DEFAULT false, "black" integer, "isStarted" boolean NOT NULL DEFAULT false, "isEnded" boolean NOT NULL DEFAULT false, "winnerId" character varying(32), "surrendered" character varying(32), "logs" jsonb NOT NULL DEFAULT '[]', "map" character varying(64) array NOT NULL, "bw" character varying(32) NOT NULL, "isLlotheo" boolean NOT NULL DEFAULT false, "canPutEverywhere" boolean NOT NULL DEFAULT false, "loopedBoard" boolean NOT NULL DEFAULT false, "form1" jsonb DEFAULT null, "form2" jsonb DEFAULT null, "crc32" character varying(32), CONSTRAINT "PK_76b30eeba71b1193ad7c5311c3f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b46ec40746efceac604142be1c" ON "reversi_game" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "reversi_matching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "parentId" character varying(32) NOT NULL, "childId" character varying(32) NOT NULL, CONSTRAINT "PK_880bd0afbab232f21c8b9d146cf" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b604d92d6c7aec38627f6eaf16" ON "reversi_matching" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3b25402709dd9882048c2bbade" ON "reversi_matching" ("parentId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e247b23a3c9b45f89ec1299d06" ON "reversi_matching" ("childId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_note_pining" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_a6a2dad4ae000abce2ea9d9b103" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bfbc6f79ba4007b4ce5097f08d" ON "user_note_pining" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_410cd649884b501c02d6e72738" ON "user_note_pining" ("userId", "noteId") `);
|
||||||
|
await queryRunner.query(`CREATE TYPE "poll_notevisibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "poll" ("noteId" character varying(32) NOT NULL, "expiresAt" TIMESTAMP WITH TIME ZONE, "multiple" boolean NOT NULL, "choices" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], "votes" integer array NOT NULL, "noteVisibility" "poll_notevisibility_enum" NOT NULL, "userId" character varying(32) NOT NULL, "userHost" character varying(128), CONSTRAINT "REL_da851e06d0dfe2ef397d8b1bf1" UNIQUE ("noteId"), CONSTRAINT "PK_da851e06d0dfe2ef397d8b1bf1b" PRIMARY KEY ("noteId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0610ebcfcfb4a18441a9bcdab2" ON "poll" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7fa20a12319c7f6dc3aed98c0a" ON "poll" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_keypair" ("userId" character varying(32) NOT NULL, "publicKey" character varying(4096) NOT NULL, "privateKey" character varying(4096) NOT NULL, CONSTRAINT "REL_f4853eb41ab722fe05f81cedeb" UNIQUE ("userId"), CONSTRAINT "PK_f4853eb41ab722fe05f81cedeb6" PRIMARY KEY ("userId"))`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_publickey" ("userId" character varying(32) NOT NULL, "keyId" character varying(256) NOT NULL, "keyPem" character varying(4096) NOT NULL, CONSTRAINT "REL_10c146e4b39b443ede016f6736" UNIQUE ("userId"), CONSTRAINT "PK_10c146e4b39b443ede016f6736d" PRIMARY KEY ("userId"))`);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_171e64971c780ebd23fae140bb" ON "user_publickey" ("keyId") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_profile" ("userId" character varying(32) NOT NULL, "location" character varying(128), "birthday" character(10), "description" character varying(1024), "fields" jsonb NOT NULL DEFAULT '[]', "url" character varying(512), "email" character varying(128), "emailVerifyCode" character varying(128), "emailVerified" boolean NOT NULL DEFAULT false, "twoFactorTempSecret" character varying(128), "twoFactorSecret" character varying(128), "twoFactorEnabled" boolean NOT NULL DEFAULT false, "password" character varying(128), "clientData" jsonb NOT NULL DEFAULT '{}', "autoWatch" boolean NOT NULL DEFAULT false, "autoAcceptFollowed" boolean NOT NULL DEFAULT false, "alwaysMarkNsfw" boolean NOT NULL DEFAULT false, "carefulBot" boolean NOT NULL DEFAULT false, "twitter" boolean NOT NULL DEFAULT false, "twitterAccessToken" character varying(64) DEFAULT null, "twitterAccessTokenSecret" character varying(64) DEFAULT null, "twitterUserId" character varying(64) DEFAULT null, "twitterScreenName" character varying(64) DEFAULT null, "github" boolean NOT NULL DEFAULT false, "githubAccessToken" character varying(64) DEFAULT null, "githubId" integer DEFAULT null, "githubLogin" character varying(64) DEFAULT null, "discord" boolean NOT NULL DEFAULT false, "discordAccessToken" character varying(64) DEFAULT null, "discordRefreshToken" character varying(64) DEFAULT null, "discordExpiresDate" integer DEFAULT null, "discordId" character varying(64) DEFAULT null, "discordUsername" character varying(64) DEFAULT null, "discordDiscriminator" character varying(64) DEFAULT null, "userHost" character varying(128), CONSTRAINT "REL_51cb79b5555effaf7d69ba1cff" UNIQUE ("userId"), CONSTRAINT "PK_51cb79b5555effaf7d69ba1cff9" PRIMARY KEY ("userId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_dce530b98e454793dac5ec2f5a" ON "user_profile" ("userHost") `);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__active_users_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__active_users" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__active_users_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_317237a9f733b970604a11e314f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__drive_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__drive" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__drive_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_totalCount" bigint NOT NULL, "___local_totalSize" bigint NOT NULL, "___local_incCount" bigint NOT NULL, "___local_incSize" bigint NOT NULL, "___local_decCount" bigint NOT NULL, "___local_decSize" bigint NOT NULL, "___remote_totalCount" bigint NOT NULL, "___remote_totalSize" bigint NOT NULL, "___remote_incCount" bigint NOT NULL, "___remote_incSize" bigint NOT NULL, "___remote_decCount" bigint NOT NULL, "___remote_decSize" bigint NOT NULL, CONSTRAINT "PK_f96bc548a765cd4b3b354221ce7" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__federation_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__federation" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__federation_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___instance_total" bigint NOT NULL, "___instance_inc" bigint NOT NULL, "___instance_dec" bigint NOT NULL, CONSTRAINT "PK_b39dcd31a0fe1a7757e348e85fd" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__hashtag_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__hashtag" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__hashtag_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_c32f1ea2b44a5d2f7881e37f8f9" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__instance_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__instance" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__instance_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___requests_failed" bigint NOT NULL, "___requests_succeeded" bigint NOT NULL, "___requests_received" bigint NOT NULL, "___notes_total" bigint NOT NULL, "___notes_inc" bigint NOT NULL, "___notes_dec" bigint NOT NULL, "___notes_diffs_normal" bigint NOT NULL, "___notes_diffs_reply" bigint NOT NULL, "___notes_diffs_renote" bigint NOT NULL, "___users_total" bigint NOT NULL, "___users_inc" bigint NOT NULL, "___users_dec" bigint NOT NULL, "___following_total" bigint NOT NULL, "___following_inc" bigint NOT NULL, "___following_dec" bigint NOT NULL, "___followers_total" bigint NOT NULL, "___followers_inc" bigint NOT NULL, "___followers_dec" bigint NOT NULL, "___drive_totalFiles" bigint NOT NULL, "___drive_totalUsage" bigint NOT NULL, "___drive_incFiles" bigint NOT NULL, "___drive_incUsage" bigint NOT NULL, "___drive_decFiles" bigint NOT NULL, "___drive_decUsage" bigint NOT NULL, CONSTRAINT "PK_1267c67c7c2d47b4903975f2c00" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__network_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__network" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__network_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___incomingRequests" bigint NOT NULL, "___outgoingRequests" bigint NOT NULL, "___totalTime" bigint NOT NULL, "___incomingBytes" bigint NOT NULL, "___outgoingBytes" bigint NOT NULL, CONSTRAINT "PK_bc4290c2e27fad14ef0c1ca93f3" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__notes_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__notes" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__notes_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_total" bigint NOT NULL, "___local_inc" bigint NOT NULL, "___local_dec" bigint NOT NULL, "___local_diffs_normal" bigint NOT NULL, "___local_diffs_reply" bigint NOT NULL, "___local_diffs_renote" bigint NOT NULL, "___remote_total" bigint NOT NULL, "___remote_inc" bigint NOT NULL, "___remote_dec" bigint NOT NULL, "___remote_diffs_normal" bigint NOT NULL, "___remote_diffs_reply" bigint NOT NULL, "___remote_diffs_renote" bigint NOT NULL, CONSTRAINT "PK_0aec823fa85c7f901bdb3863b14" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_drive_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_drive" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_drive_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___totalCount" bigint NOT NULL, "___totalSize" bigint NOT NULL, "___incCount" bigint NOT NULL, "___incSize" bigint NOT NULL, "___decCount" bigint NOT NULL, "___decSize" bigint NOT NULL, CONSTRAINT "PK_d0ef23d24d666e1a44a0cd3d208" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_following_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_following" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_following_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_followings_total" bigint NOT NULL, "___local_followings_inc" bigint NOT NULL, "___local_followings_dec" bigint NOT NULL, "___local_followers_total" bigint NOT NULL, "___local_followers_inc" bigint NOT NULL, "___local_followers_dec" bigint NOT NULL, "___remote_followings_total" bigint NOT NULL, "___remote_followings_inc" bigint NOT NULL, "___remote_followings_dec" bigint NOT NULL, "___remote_followers_total" bigint NOT NULL, "___remote_followers_inc" bigint NOT NULL, "___remote_followers_dec" bigint NOT NULL, CONSTRAINT "PK_85bb1b540363a29c2fec83bd907" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_notes_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_notes" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_notes_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___total" bigint NOT NULL, "___inc" bigint NOT NULL, "___dec" bigint NOT NULL, "___diffs_normal" bigint NOT NULL, "___diffs_reply" bigint NOT NULL, "___diffs_renote" bigint NOT NULL, CONSTRAINT "PK_334acf6e915af2f29edc11b8e50" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__per_user_reaction_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__per_user_reaction" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__per_user_reaction_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_count" bigint NOT NULL, "___remote_count" bigint NOT NULL, CONSTRAINT "PK_984f54dae441e65b633e8d27a7f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__test_grouped_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__test_grouped" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_grouped_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo_total" bigint NOT NULL, "___foo_inc" bigint NOT NULL, "___foo_dec" bigint NOT NULL, CONSTRAINT "PK_f4a2b175d308695af30d4293272" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__test_unique_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__test_unique" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_unique_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo" bigint NOT NULL, CONSTRAINT "PK_409bac9c97cc612d8500012319d" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__test_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__test" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__test_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___foo_total" bigint NOT NULL, "___foo_inc" bigint NOT NULL, "___foo_dec" bigint NOT NULL, CONSTRAINT "PK_b4bc31dffbd1b785276a3ecfc1e" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "__chart__users_span_enum" AS ENUM('hour', 'day')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "__chart__users" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "group" character varying(128), "span" "__chart__users_span_enum" NOT NULL, "unique" jsonb NOT NULL DEFAULT '{}', "___local_total" bigint NOT NULL, "___local_inc" bigint NOT NULL, "___local_dec" bigint NOT NULL, "___remote_total" bigint NOT NULL, "___remote_inc" bigint NOT NULL, "___remote_dec" bigint NOT NULL, CONSTRAINT "PK_4dfcf2c78d03524b9eb2c99d328" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" ADD CONSTRAINT "FK_f4fc06e49c0171c85f1c48060d2" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" ADD CONSTRAINT "FK_00ceffb0cdc238b3233294f08f2" FOREIGN KEY ("parentId") REFERENCES "drive_folder"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" ADD CONSTRAINT "FK_860fa6f6c7df5bb887249fba22e" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" ADD CONSTRAINT "FK_bb90d1956dafc4068c28aa7560a" FOREIGN KEY ("folderId") REFERENCES "drive_folder"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" ADD CONSTRAINT "FK_58f5c71eaab331645112cf8cfa5" FOREIGN KEY ("avatarId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" ADD CONSTRAINT "FK_afc64b53f8db3707ceb34eb28e2" FOREIGN KEY ("bannerId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "app" ADD CONSTRAINT "FK_3f5b0899ef90527a3462d7c2cb3" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_9949557d0e1b2c19e5344c171e9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_52ccc804d7c69037d558bac4c96" FOREIGN KEY ("renoteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_ec5c201576192ba8904c345c5cc" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_5b87d9d19127bd5d92026017a7b" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" ADD CONSTRAINT "FK_66d2bd2ee31d14bcc23069a89f8" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" ADD CONSTRAINT "FK_aecfbd5ef60374918e63ee95fa7" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" ADD CONSTRAINT "FK_13761f64257f40c5636d0ff95ee" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" ADD CONSTRAINT "FK_45145e4953780f3cd5656f0ea6a" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" ADD CONSTRAINT "FK_b0134ec406e8d09a540f8182888" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" ADD CONSTRAINT "FK_03e7028ab8388a3f5e3ce2a8619" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" ADD CONSTRAINT "FK_56b0166d34ddae49d8ef7610bb9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" ADD CONSTRAINT "FK_e637cba4dc4410218c4251260e4" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9" FOREIGN KEY ("notifieeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" ADD CONSTRAINT "FK_24e0042143a18157b234df186c3" FOREIGN KEY ("followeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" ADD CONSTRAINT "FK_6516c5a6f3c015b4eed39978be5" FOREIGN KEY ("followerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" ADD CONSTRAINT "FK_ec96b4fed9dae517e0dbbe0675c" FOREIGN KEY ("muteeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" ADD CONSTRAINT "FK_93060675b4a79a577f31d260c67" FOREIGN KEY ("muterId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "sw_subscription" ADD CONSTRAINT "FK_97754ca6f2baff9b4abb7f853dd" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" ADD CONSTRAINT "FK_2cd4a2743a99671308f5417759e" FOREIGN KEY ("blockeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" ADD CONSTRAINT "FK_0627125f1a8a42c9a1929edb552" FOREIGN KEY ("blockerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list" ADD CONSTRAINT "FK_b7fcefbdd1c18dce86687531f99" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" ADD CONSTRAINT "FK_d844bfc6f3f523a05189076efaa" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" ADD CONSTRAINT "FK_605472305f26818cc93d1baaa74" FOREIGN KEY ("userListId") REFERENCES "user_list"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" ADD CONSTRAINT "FK_47f4b1892f5d6ba8efb3057d81a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" ADD CONSTRAINT "FK_0e00498f180193423c992bc4370" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_d049123c413e68ca52abe734203" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_04cc96756f89d0b7f9473e8cdf3" FOREIGN KEY ("reporterId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_5377c307783fce2b6d352e1203b" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_cac14a4e3944454a5ce7daa5142" FOREIGN KEY ("recipientId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_535def119223ac05ad3fa9ef64b" FOREIGN KEY ("fileId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "signin" ADD CONSTRAINT "FK_2c308dbdc50d94dc625670055f7" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" ADD CONSTRAINT "FK_c072b729d71697f959bde66ade0" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" ADD CONSTRAINT "FK_dbe037d4bddd17b03a1dc778dee" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" ADD CONSTRAINT "FK_12c01c0d1a79f77d9f6c15fadd2" FOREIGN KEY ("followeeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" ADD CONSTRAINT "FK_a7fd92dd6dc519e6fb435dd108f" FOREIGN KEY ("followerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_f7467510c60a45ce5aca6292743" FOREIGN KEY ("user1Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_6649a4e8c5d5cf32fb03b5da9f6" FOREIGN KEY ("user2Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_3b25402709dd9882048c2bbade0" FOREIGN KEY ("parentId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_e247b23a3c9b45f89ec1299d066" FOREIGN KEY ("childId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" ADD CONSTRAINT "FK_bfbc6f79ba4007b4ce5097f08d6" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" ADD CONSTRAINT "FK_68881008f7c3588ad7ecae471cf" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll" ADD CONSTRAINT "FK_da851e06d0dfe2ef397d8b1bf1b" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_keypair" ADD CONSTRAINT "FK_f4853eb41ab722fe05f81cedeb6" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_publickey" ADD CONSTRAINT "FK_10c146e4b39b443ede016f6736d" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "FK_51cb79b5555effaf7d69ba1cff9" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "FK_51cb79b5555effaf7d69ba1cff9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_publickey" DROP CONSTRAINT "FK_10c146e4b39b443ede016f6736d"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_keypair" DROP CONSTRAINT "FK_f4853eb41ab722fe05f81cedeb6"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll" DROP CONSTRAINT "FK_da851e06d0dfe2ef397d8b1bf1b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" DROP CONSTRAINT "FK_68881008f7c3588ad7ecae471cf"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_note_pining" DROP CONSTRAINT "FK_bfbc6f79ba4007b4ce5097f08d6"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" DROP CONSTRAINT "FK_e247b23a3c9b45f89ec1299d066"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_matching" DROP CONSTRAINT "FK_3b25402709dd9882048c2bbade0"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" DROP CONSTRAINT "FK_6649a4e8c5d5cf32fb03b5da9f6"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" DROP CONSTRAINT "FK_f7467510c60a45ce5aca6292743"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" DROP CONSTRAINT "FK_a7fd92dd6dc519e6fb435dd108f"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "follow_request" DROP CONSTRAINT "FK_12c01c0d1a79f77d9f6c15fadd2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" DROP CONSTRAINT "FK_dbe037d4bddd17b03a1dc778dee"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "auth_session" DROP CONSTRAINT "FK_c072b729d71697f959bde66ade0"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "signin" DROP CONSTRAINT "FK_2c308dbdc50d94dc625670055f7"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_535def119223ac05ad3fa9ef64b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_cac14a4e3944454a5ce7daa5142"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_5377c307783fce2b6d352e1203b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_04cc96756f89d0b7f9473e8cdf3"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_d049123c413e68ca52abe734203"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" DROP CONSTRAINT "FK_0e00498f180193423c992bc4370"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_favorite" DROP CONSTRAINT "FK_47f4b1892f5d6ba8efb3057d81a"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" DROP CONSTRAINT "FK_605472305f26818cc93d1baaa74"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_joining" DROP CONSTRAINT "FK_d844bfc6f3f523a05189076efaa"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list" DROP CONSTRAINT "FK_b7fcefbdd1c18dce86687531f99"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" DROP CONSTRAINT "FK_0627125f1a8a42c9a1929edb552"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "blocking" DROP CONSTRAINT "FK_2cd4a2743a99671308f5417759e"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "sw_subscription" DROP CONSTRAINT "FK_97754ca6f2baff9b4abb7f853dd"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" DROP CONSTRAINT "FK_93060675b4a79a577f31d260c67"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "muting" DROP CONSTRAINT "FK_ec96b4fed9dae517e0dbbe0675c"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" DROP CONSTRAINT "FK_6516c5a6f3c015b4eed39978be5"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "following" DROP CONSTRAINT "FK_24e0042143a18157b234df186c3"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" DROP CONSTRAINT "FK_e637cba4dc4410218c4251260e4"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_unread" DROP CONSTRAINT "FK_56b0166d34ddae49d8ef7610bb9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" DROP CONSTRAINT "FK_03e7028ab8388a3f5e3ce2a8619"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_watching" DROP CONSTRAINT "FK_b0134ec406e8d09a540f8182888"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" DROP CONSTRAINT "FK_45145e4953780f3cd5656f0ea6a"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note_reaction" DROP CONSTRAINT "FK_13761f64257f40c5636d0ff95ee"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" DROP CONSTRAINT "FK_aecfbd5ef60374918e63ee95fa7"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "poll_vote" DROP CONSTRAINT "FK_66d2bd2ee31d14bcc23069a89f8"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_5b87d9d19127bd5d92026017a7b"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_ec5c201576192ba8904c345c5cc"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_52ccc804d7c69037d558bac4c96"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_9949557d0e1b2c19e5344c171e9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "app" DROP CONSTRAINT "FK_3f5b0899ef90527a3462d7c2cb3"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" DROP CONSTRAINT "FK_afc64b53f8db3707ceb34eb28e2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" DROP CONSTRAINT "FK_58f5c71eaab331645112cf8cfa5"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" DROP CONSTRAINT "FK_bb90d1956dafc4068c28aa7560a"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_file" DROP CONSTRAINT "FK_860fa6f6c7df5bb887249fba22e"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" DROP CONSTRAINT "FK_00ceffb0cdc238b3233294f08f2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "drive_folder" DROP CONSTRAINT "FK_f4fc06e49c0171c85f1c48060d2"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__users"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__users_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__test"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__test_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__test_unique"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__test_unique_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__test_grouped"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__test_grouped_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_reaction"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_reaction_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_notes"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_notes_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_following"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_following_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__per_user_drive"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__per_user_drive_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__notes"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__notes_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__network"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__network_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__instance"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__instance_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__hashtag"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__hashtag_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__federation"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__federation_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__drive"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__drive_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "__chart__active_users"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "__chart__active_users_span_enum"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dce530b98e454793dac5ec2f5a"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_profile"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_171e64971c780ebd23fae140bb"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_publickey"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_keypair"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7fa20a12319c7f6dc3aed98c0a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0610ebcfcfb4a18441a9bcdab2"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "poll"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "poll_notevisibility_enum"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_410cd649884b501c02d6e72738"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bfbc6f79ba4007b4ce5097f08d"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_note_pining"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e247b23a3c9b45f89ec1299d06"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3b25402709dd9882048c2bbade"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b604d92d6c7aec38627f6eaf16"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "reversi_matching"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b46ec40746efceac604142be1c"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "reversi_game"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4f4d35e1256c84ae3d1f0eab10"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5900e907bb46516ddf2871327c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b37dafc86e9af007e3295c2781"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "emoji"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d54a512b822fac7ed52800f6b4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a7fd92dd6dc519e6fb435dd108"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_12c01c0d1a79f77d9f6c15fadd"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "follow_request"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_62cb09e1129f6ec024ef66e183"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "auth_session"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2c308dbdc50d94dc625670055f"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "signin"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_cac14a4e3944454a5ce7daa514"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5377c307783fce2b6d352e1203"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e21cd3646e52ef9c94aaf17c2e"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "messaging_message"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0ff69e8dfa9fe31bb4a4660f59"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "registration_ticket"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5cd442c3b2e74fdd99dae20243"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_04cc96756f89d0b7f9473e8cdf"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d049123c413e68ca52abe73420"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_db2098070b2b5a523c58181f74"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "abuse_user_report"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0f4fb9ad355f3effff221ef245"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_47f4b1892f5d6ba8efb3057d81"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_favorite"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0b03cbcd7e6a7ce068efa8ecc2"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0c44bf4f680964145f2a68a341"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d57f9030cd3af7f63ffb1c267c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4c02d38a976c3ae132228c6fce"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0e206cec573f1edff4a3062923"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2710a55f826ee236ea1a62698f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_347fec870eafea7b26c8a73bac"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "hashtag"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_605472305f26818cc93d1baaa7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d844bfc6f3f523a05189076efa"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_list_joining"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b7fcefbdd1c18dce86687531f9"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_list"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_98a1bc5cb30dfd159de056549f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0627125f1a8a42c9a1929edb55"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2cd4a2743a99671308f5417759"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b9a354f7941c1e779f3b33aea6"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "blocking"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_97754ca6f2baff9b4abb7f853d"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "sw_subscription"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_1eb9d9824a630321a29fd3b290"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_93060675b4a79a577f31d260c6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ec96b4fed9dae517e0dbbe0675"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f86d57fbca33c7a4e6897490cc"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "muting"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8d5afc98982185799b160e10eb"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2cd3b2a6b4cf0b910b260afe08"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "instance"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_307be5f1d1252e0388662acb96"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6516c5a6f3c015b4eed39978be"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_24e0042143a18157b234df186c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_582f8fab771a9040a12961f3e7"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "following"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "meta"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3c601b70a1066d2c8b517094cb"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b11a5e627c41d4dc3170f1d370"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "notification"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d908433a4953cc13216cd9c274"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e637cba4dc4410218c4251260e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_56b0166d34ddae49d8ef7610bb"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_unread"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a42c93c69989ce1d09959df4cf"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_44499765eec6b5489d72c4253b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_03e7028ab8388a3f5e3ce2a861"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b0134ec406e8d09a540f818288"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_318cdf42a9cfc11f479bd802bb"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_watching"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ad0c221b25672daf2df320a817"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_45145e4953780f3cd5656f0ea6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_13761f64257f40c5636d0ff95e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_01f4581f114e0ebd2bbb876f0b"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note_reaction"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_50bd7164c5b78f1f4a42c4d21f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_aecfbd5ef60374918e63ee95fa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_66d2bd2ee31d14bcc23069a89f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0fb627e1c2f753262a74f0562d"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "poll_vote"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7125a826ab192eb27e11d358a5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_88937d94d7443d9a99a76fa5c0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_54ebcb6d27222913b908d56fd8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_796a8c03959361f97dc2be1d5c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25dfc71b0369b003a4cd434d0b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_51c063b6a133a9cb87145450f5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_153536c67d05e9adb24e99fc2b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5b87d9d19127bd5d92026017a7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_52ccc804d7c69037d558bac4c9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_17cb3553c700a4985dff5a30ff"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e7c0567f5261063592f022e9b5"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "note"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "note_visibility_enum"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9949557d0e1b2c19e5344c171e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_64c327441248bae40f7d92f34f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_70ba8f6af34bc924fc9e12adb8"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "access_token"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f49922d511d666848f250663c4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3f5b0899ef90527a3462d7c2cb"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_048a757923ed8b157e9895da53"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "app"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5deb01ae162d1d70b80d064c27"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a854e557b1b14814750c7c7b0c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_be623adaa4c566baf5d29ce0c8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3252a5df8d5bbd16b281f7799e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fa99d777623947a5b05f394cae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a27b942a0d6dcff90e3ee9b5e8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_80ca6e6ef65fb9ef34ea8c90f4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e11e649824a45d8ed01d597fd9"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bb90d1956dafc4068c28aa7560"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e5848eac4940934e23dbc17581"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c55b2b7c284d9fef98026fc88e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e74022ce9a074b3866f70e0d27"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d85a184c2540d2deba33daf642"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a40b8df8c989d7db937ea27cf6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_37bb9a1b4585f8a3beb24c62d6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_92779627994ac79277f070c91e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_860fa6f6c7df5bb887249fba22"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c8dfad3b72196dd1d6b5db168a"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "drive_file"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_00ceffb0cdc238b3233294f08f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f4fc06e49c0171c85f1c48060d"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_02878d441ceae15ce060b73daf"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "drive_folder"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_584b536b49e53ac81beb39a177"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8cb40cfc8f3c28261e6f887b03"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8e4eb51a35d81b64dda28eed0a"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "log"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "log_level_enum"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
29
migration/1561706992953-webauthn.ts
Normal file
29
migration/1561706992953-webauthn.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class webauthn1561706992953 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "attestation_challenge" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "challenge" character varying(64) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "registrationChallenge" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_d0ba6786e093f1bcb497572a6b5" PRIMARY KEY ("id", "userId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f1a461a618fa1755692d0e0d59" ON "attestation_challenge" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_47efb914aed1f72dd39a306c7b" ON "attestation_challenge" ("challenge") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_security_key" ("id" character varying NOT NULL, "userId" character varying(32) NOT NULL, "publicKey" character varying NOT NULL, "lastUsed" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(30) NOT NULL, CONSTRAINT "PK_3e508571121ab39c5f85d10c166" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ff9ca3b5f3ee3d0681367a9b44" ON "user_security_key" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0d7718e562dcedd0aa5cf2c9f7" ON "user_security_key" ("publicKey") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "securityKeysAvailable" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "attestation_challenge" ADD CONSTRAINT "FK_f1a461a618fa1755692d0e0d592" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_security_key" ADD CONSTRAINT "FK_ff9ca3b5f3ee3d0681367a9b447" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_security_key" DROP CONSTRAINT "FK_ff9ca3b5f3ee3d0681367a9b447"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "attestation_challenge" DROP CONSTRAINT "FK_f1a461a618fa1755692d0e0d592"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "securityKeysAvailable"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0d7718e562dcedd0aa5cf2c9f7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ff9ca3b5f3ee3d0681367a9b44"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_security_key"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_47efb914aed1f72dd39a306c7b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f1a461a618fa1755692d0e0d59"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "attestation_challenge"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
201
migration/1561873850023-ChartIndexes.ts
Normal file
201
migration/1561873850023-ChartIndexes.ts
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class ChartIndexes1561873850023 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc" ON "__chart__active_users" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_15e91a03aeeac9dbccdf43fc06" ON "__chart__active_users" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_00ed5f86db1f7efafb1978bf21" ON "__chart__active_users" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_20f57cc8f142c131340ee16742" ON "__chart__active_users" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_9a3ed15a30ab7e3a37702e6e08" ON "__chart__active_users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c26e2c1cbb6e911e0554b27416" ON "__chart__active_users" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_13565815f618a1ff53886c5b28" ON "__chart__drive" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3fa0d0f17ca72e3dc80999a032" ON "__chart__drive" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7a170f67425e62a8fabb76c872" ON "__chart__drive" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6e1df243476e20cbf86572ecc0" ON "__chart__drive" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3313d7288855ec105b5bbf6c21" ON "__chart__drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_06690fc959f1c9fdaf21928222" ON "__chart__drive" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_36cb699c49580d4e6c2e6159f9" ON "__chart__federation" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e447064455928cf627590ef527" ON "__chart__federation" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_76e87c7bfc5d925fcbba405d84" ON "__chart__federation" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2d416e6af791a82e338c79d480" ON "__chart__federation" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_dd907becf76104e4b656659e6b" ON "__chart__federation" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e9cd07672b37d8966cf3709283" ON "__chart__federation" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_07747a1038c05f532a718fe1de" ON "__chart__hashtag" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_fcc181fb8283009c61cc4083ef" ON "__chart__hashtag" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_99a7d2faaef84a6f728d714ad6" ON "__chart__hashtag" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_49975586f50ed7b800fdd88fbd" ON "__chart__hashtag" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_25a97c02003338124b2b75fdbc" ON "__chart__hashtag" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6d6f156ceefc6bc5f273a0e370" ON "__chart__hashtag" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_6b8f34a1a64b06014b6fb66824" ON "__chart__instance" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c12f0af4a66cdd30c2287ce8aa" ON "__chart__instance" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63" ON "__chart__instance" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d0a4f79af5a97b08f37b547197" ON "__chart__instance" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_39ee857ab2f23493037c6b6631" ON "__chart__instance" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f5448d9633cff74208d850aabe" ON "__chart__instance" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a1efd3e0048a5f2793a47360dc" ON "__chart__network" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f8dd01baeded2ffa833e0a610a" ON "__chart__network" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7b5da130992ec9df96712d4290" ON "__chart__network" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_08fac0eb3b11f04c200c0b40dd" ON "__chart__network" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0a905b992fecd2b5c3fb98759e" ON "__chart__network" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_9ff6944f01acb756fdc92d7563" ON "__chart__network" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_42eb716a37d381cdf566192b2b" ON "__chart__notes" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e69096589f11e3baa98ddd64d0" ON "__chart__notes" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7036f2957151588b813185c794" ON "__chart__notes" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0c9a159c5082cbeef3ca6706b5" ON "__chart__notes" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f09d543e3acb16c5976bdb31fa" ON "__chart__notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_924fc196c80ca24bae01dd37e4" ON "__chart__notes" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5f86db6492274e07c1a3cdf286" ON "__chart__per_user_drive" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_328f259961e60c4fa0bfcf55ca" ON "__chart__per_user_drive" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e496ca8096d28f6b9b509264dc" ON "__chart__per_user_drive" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53" ON "__chart__per_user_drive" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_30bf67687f483ace115c5ca642" ON "__chart__per_user_drive" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f2aeafde2ae6fbad38e857631b" ON "__chart__per_user_drive" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7af07790712aa3438ff6773f3b" ON "__chart__per_user_following" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f92dd6d03f8d994f29987f6214" ON "__chart__per_user_following" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_4b3593098b6edc9c5afe36b18b" ON "__chart__per_user_following" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f" ON "__chart__per_user_following" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b77d4dd9562c3a899d9a286fcd" ON "__chart__per_user_following" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_4db3b84c7be0d3464714f3e0b1" ON "__chart__per_user_following" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_84234bd1abb873f07329681c83" ON "__chart__per_user_notes" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8d2cbbc8114d90d19b44d626b6" ON "__chart__per_user_notes" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_55bf20f366979f2436de99206b" ON "__chart__per_user_notes" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_046feeb12e9ef5f783f409866a" ON "__chart__per_user_notes" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5048e9daccbbbc6d567bb142d3" ON "__chart__per_user_notes" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f68a5ab958f9f5fa17a32ac23b" ON "__chart__per_user_notes" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f7bf4c62059764c2c2bb40fdab" ON "__chart__per_user_reaction" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_65633a106bce43fc7c5c30a5c7" ON "__chart__per_user_reaction" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8cf3156fd7a6b15c43459c6e3b" ON "__chart__per_user_reaction" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_edeb73c09c3143a81bcb34d569" ON "__chart__per_user_reaction" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_229a41ad465f9205f1f5703291" ON "__chart__per_user_reaction" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e316f01a6d24eb31db27f88262" ON "__chart__per_user_reaction" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0c641990ecf47d2545df4edb75" ON "__chart__test_grouped" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_2be7ec6cebddc14dc11e206686" ON "__chart__test_grouped" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_234dff3c0b56a6150b95431ab9" ON "__chart__test_grouped" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a5133470f4825902e170328ca5" ON "__chart__test_grouped" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b14489029e4b3aaf4bba5fb524" ON "__chart__test_grouped" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_84e661abb7bd1e51b690d4b017" ON "__chart__test_grouped" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_437bab3c6061d90f6bb65fd2cc" ON "__chart__test_unique" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_5c73bf61da4f6e6f15bae88ed1" ON "__chart__test_unique" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_bbfa573a8181018851ed0b6357" ON "__chart__test_unique" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d70c86baedc68326be11f9c0ce" ON "__chart__test_unique" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a0cd75442dd10d0643a17c4a49" ON "__chart__test_unique" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_66e1e1ecd2f29e57778af35b59" ON "__chart__test_unique" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_b070a906db04b44c67c6c2144d" ON "__chart__test" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_92255988735563f0fe4aba1f05" ON "__chart__test" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d41cce6aee1a50bfc062038f9b" ON "__chart__test" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_c5870993e25c3d5771f91f5003" ON "__chart__test" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a319e5dbf47e8a17497623beae" ON "__chart__test" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f170de677ea75ad4533de2723e" ON "__chart__test" ("span", "date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_845254b3eaf708ae8a6cac3026" ON "__chart__users" ("date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_7c184198ecf66a8d3ecb253ab3" ON "__chart__users" ("span") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_ed9b95919c672a13008e9487ee" ON "__chart__users" ("group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f091abb24193d50c653c6b77fc" ON "__chart__users" ("span", "date") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_337e9599f278bd7537fe30876f" ON "__chart__users" ("date", "group") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a770a57c70e668cc61590c9161" ON "__chart__users" ("span", "date", "group") `);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a770a57c70e668cc61590c9161"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_337e9599f278bd7537fe30876f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f091abb24193d50c653c6b77fc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_ed9b95919c672a13008e9487ee"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7c184198ecf66a8d3ecb253ab3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_845254b3eaf708ae8a6cac3026"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f170de677ea75ad4533de2723e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a319e5dbf47e8a17497623beae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c5870993e25c3d5771f91f5003"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d41cce6aee1a50bfc062038f9b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_92255988735563f0fe4aba1f05"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b070a906db04b44c67c6c2144d"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_66e1e1ecd2f29e57778af35b59"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a0cd75442dd10d0643a17c4a49"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d70c86baedc68326be11f9c0ce"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_bbfa573a8181018851ed0b6357"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5c73bf61da4f6e6f15bae88ed1"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_437bab3c6061d90f6bb65fd2cc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_84e661abb7bd1e51b690d4b017"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b14489029e4b3aaf4bba5fb524"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a5133470f4825902e170328ca5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_234dff3c0b56a6150b95431ab9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2be7ec6cebddc14dc11e206686"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0c641990ecf47d2545df4edb75"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e316f01a6d24eb31db27f88262"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_229a41ad465f9205f1f5703291"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_edeb73c09c3143a81bcb34d569"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8cf3156fd7a6b15c43459c6e3b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_65633a106bce43fc7c5c30a5c7"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f7bf4c62059764c2c2bb40fdab"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f68a5ab958f9f5fa17a32ac23b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5048e9daccbbbc6d567bb142d3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_046feeb12e9ef5f783f409866a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_55bf20f366979f2436de99206b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8d2cbbc8114d90d19b44d626b6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_84234bd1abb873f07329681c83"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4db3b84c7be0d3464714f3e0b1"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_b77d4dd9562c3a899d9a286fcd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_57b5458d0d3d6d1e7f13d4e57f"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_4b3593098b6edc9c5afe36b18b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f92dd6d03f8d994f29987f6214"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7af07790712aa3438ff6773f3b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f2aeafde2ae6fbad38e857631b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_30bf67687f483ace115c5ca642"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_42ea9381f0fda8dfe0fa1c8b53"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e496ca8096d28f6b9b509264dc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_328f259961e60c4fa0bfcf55ca"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_5f86db6492274e07c1a3cdf286"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_924fc196c80ca24bae01dd37e4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f09d543e3acb16c5976bdb31fa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0c9a159c5082cbeef3ca6706b5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7036f2957151588b813185c794"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e69096589f11e3baa98ddd64d0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_42eb716a37d381cdf566192b2b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9ff6944f01acb756fdc92d7563"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0a905b992fecd2b5c3fb98759e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_08fac0eb3b11f04c200c0b40dd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7b5da130992ec9df96712d4290"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f8dd01baeded2ffa833e0a610a"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a1efd3e0048a5f2793a47360dc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_f5448d9633cff74208d850aabe"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_39ee857ab2f23493037c6b6631"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d0a4f79af5a97b08f37b547197"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c12f0af4a66cdd30c2287ce8aa"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6b8f34a1a64b06014b6fb66824"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6d6f156ceefc6bc5f273a0e370"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25a97c02003338124b2b75fdbc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_49975586f50ed7b800fdd88fbd"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_99a7d2faaef84a6f728d714ad6"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fcc181fb8283009c61cc4083ef"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_07747a1038c05f532a718fe1de"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e9cd07672b37d8966cf3709283"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_dd907becf76104e4b656659e6b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_2d416e6af791a82e338c79d480"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_76e87c7bfc5d925fcbba405d84"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_e447064455928cf627590ef527"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_36cb699c49580d4e6c2e6159f9"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_06690fc959f1c9fdaf21928222"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3313d7288855ec105b5bbf6c21"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_6e1df243476e20cbf86572ecc0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_7a170f67425e62a8fabb76c872"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_3fa0d0f17ca72e3dc80999a032"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_13565815f618a1ff53886c5b28"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c26e2c1cbb6e911e0554b27416"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_9a3ed15a30ab7e3a37702e6e08"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_20f57cc8f142c131340ee16742"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_00ed5f86db1f7efafb1978bf21"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_15e91a03aeeac9dbccdf43fc06"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_90148bbc2bf0854428786bfc15"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_88937d94d7443d9a99a76fa5c0"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_54ebcb6d27222913b908d56fd8"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_796a8c03959361f97dc2be1d5c"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_25dfc71b0369b003a4cd434d0b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_51c063b6a133a9cb87145450f5"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fa99d777623947a5b05f394cae"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_315c779174fe8247ab324f036e"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_c5d46cbfda48b1c33ed852e21b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_8cb40cfc8f3c28261e6f887b03"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1562422242907-PasswordLessLogin.ts
Normal file
13
migration/1562422242907-PasswordLessLogin.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PasswordLessLogin1562422242907 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "usePasswordLessLogin" boolean DEFAULT false NOT NULL`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "usePasswordLessLogin"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
17
migration/1562444565093-PinnedPage.ts
Normal file
17
migration/1562444565093-PinnedPage.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PinnedPage1562444565093 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "pinnedPageId" character varying(32)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27" UNIQUE ("pinnedPageId")`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27" FOREIGN KEY ("pinnedPageId") REFERENCES "page"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "FK_6dc44f1ceb65b1e72bacef2ca27"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "pinnedPageId"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1562448332510-PageTitleHideOption.ts
Normal file
13
migration/1562448332510-PageTitleHideOption.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class PageTitleHideOption1562448332510 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" ADD "hideTitleWhenPinned" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "hideTitleWhenPinned"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
17
migration/1562869971568-ModerationLog.ts
Normal file
17
migration/1562869971568-ModerationLog.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class ModerationLog1562869971568 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "moderation_log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "type" character varying(128) NOT NULL, "info" jsonb NOT NULL, CONSTRAINT "PK_d0adca6ecfd068db83e4526cc26" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_a08ad074601d204e0f69da9a95" ON "moderation_log" ("userId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "moderation_log" ADD CONSTRAINT "FK_a08ad074601d204e0f69da9a954" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "moderation_log" DROP CONSTRAINT "FK_a08ad074601d204e0f69da9a954"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_a08ad074601d204e0f69da9a95"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "moderation_log"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1563757595828-UsedUsername.ts
Normal file
13
migration/1563757595828-UsedUsername.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class UsedUsername1563757595828 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "used_username" ("username" character varying(128) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, CONSTRAINT "PK_78fd79d2d24c6ac2f4cc9a31a5d" PRIMARY KEY ("username"))`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`DROP TABLE "used_username"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
migration/1565634203341-room.ts
Normal file
13
migration/1565634203341-room.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class room1565634203341 implements MigrationInterface {
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "room" jsonb NOT NULL DEFAULT '{}'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "room"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import * as fs from 'fs';
|
const config = require('./built/config').default;
|
||||||
import config from './config';
|
const entities = require('./built/db/postgre').entities;
|
||||||
|
|
||||||
const json = {
|
module.exports = {
|
||||||
type: 'postgres',
|
type: 'postgres',
|
||||||
host: config.db.host,
|
host: config.db.host,
|
||||||
port: config.db.port,
|
port: config.db.port,
|
||||||
@@ -9,11 +9,9 @@ const json = {
|
|||||||
password: config.db.pass,
|
password: config.db.pass,
|
||||||
database: config.db.db,
|
database: config.db.db,
|
||||||
extra: config.db.extra,
|
extra: config.db.extra,
|
||||||
entities: ['src/models/entities/*.ts'],
|
entities: entities,
|
||||||
migrations: ['migration/*.ts'],
|
migrations: ['migration/*.ts'],
|
||||||
cli: {
|
cli: {
|
||||||
migrationsDir: 'migration'
|
migrationsDir: 'migration'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fs.writeFileSync('ormconfig.json', JSON.stringify(json));
|
|
||||||
234
package.json
234
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "11.19.1",
|
"version": "11.34.0",
|
||||||
"codename": "daybreak",
|
"codename": "daybreak",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -11,9 +11,9 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./index.js",
|
"start": "node ./index.js",
|
||||||
"init": "node ./built/init.js",
|
"init": "npm run migrate",
|
||||||
"ormconfig": "node ./built/ormconfig.js",
|
"ormconfig": "node ./built/ormconfig.js",
|
||||||
"migrate": "npm run ormconfig && ts-node ./node_modules/typeorm/cli.js migration:run",
|
"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
||||||
"migrateandstart": "npm run migrate && npm run start",
|
"migrateandstart": "npm run migrate && npm run start",
|
||||||
"build": "webpack && gulp build",
|
"build": "webpack && gulp build",
|
||||||
"webpack": "webpack",
|
"webpack": "webpack",
|
||||||
@@ -25,107 +25,117 @@
|
|||||||
"test": "gulp test",
|
"test": "gulp test",
|
||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"gulp-cssnano/cssnano/postcss-svgo/svgo/js-yaml": "^3.13.1",
|
||||||
|
"https-proxy-agent": "^3.0.0",
|
||||||
|
"lodash": "^4.17.13"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@elastic/elasticsearch": "7.0.0-rc.2",
|
"@elastic/elasticsearch": "7.4.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.15",
|
"@fortawesome/fontawesome-svg-core": "1.2.25",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.7.2",
|
"@fortawesome/free-brands-svg-icons": "5.11.2",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.7.2",
|
"@fortawesome/free-regular-svg-icons": "5.11.2",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.7.2",
|
"@fortawesome/free-solid-svg-icons": "5.11.2",
|
||||||
"@fortawesome/vue-fontawesome": "0.1.5",
|
"@fortawesome/vue-fontawesome": "0.1.7",
|
||||||
"@koa/cors": "2.2.3",
|
"@koa/cors": "3.0.0",
|
||||||
|
"@koa/multer": "2.0.0",
|
||||||
|
"@koa/router": "8.0.2",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.5.11",
|
"@types/bull": "3.10.3",
|
||||||
"@types/dateformat": "3.0.0",
|
"@types/cbor": "2.0.0",
|
||||||
|
"@types/dateformat": "3.0.1",
|
||||||
"@types/deep-equal": "1.0.1",
|
"@types/deep-equal": "1.0.1",
|
||||||
"@types/double-ended-queue": "2.1.0",
|
"@types/double-ended-queue": "2.1.1",
|
||||||
"@types/gulp": "4.0.6",
|
"@types/gulp": "4.0.6",
|
||||||
"@types/gulp-mocha": "0.0.32",
|
"@types/gulp-mocha": "0.0.32",
|
||||||
"@types/gulp-rename": "0.0.33",
|
"@types/gulp-rename": "0.0.33",
|
||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
"@types/gulp-uglify": "3.0.6",
|
"@types/gulp-uglify": "3.0.6",
|
||||||
"@types/gulp-util": "3.0.34",
|
"@types/gulp-util": "3.0.34",
|
||||||
"@types/is-root": "1.0.0",
|
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.12.1",
|
"@types/js-yaml": "3.12.1",
|
||||||
"@types/jsdom": "12.2.3",
|
"@types/jsdom": "12.2.4",
|
||||||
"@types/katex": "0.10.1",
|
"@types/katex": "0.10.2",
|
||||||
"@types/koa": "2.0.48",
|
"@types/koa": "2.0.50",
|
||||||
"@types/koa-bodyparser": "5.0.2",
|
"@types/koa-bodyparser": "5.0.2",
|
||||||
"@types/koa-compress": "2.0.9",
|
"@types/koa-compress": "2.0.9",
|
||||||
"@types/koa-cors": "0.0.0",
|
"@types/koa-cors": "0.0.0",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.19",
|
||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "3.0.1",
|
"@types/koa-mount": "4.0.0",
|
||||||
"@types/koa-multer": "1.0.0",
|
|
||||||
"@types/koa-router": "7.0.40",
|
|
||||||
"@types/koa-send": "4.1.2",
|
"@types/koa-send": "4.1.2",
|
||||||
"@types/koa-views": "2.0.3",
|
"@types/koa-views": "2.0.3",
|
||||||
"@types/koa__cors": "2.2.3",
|
"@types/koa__cors": "2.2.3",
|
||||||
|
"@types/koa__multer": "2.0.0",
|
||||||
|
"@types/koa__router": "8.0.0",
|
||||||
"@types/lolex": "3.1.1",
|
"@types/lolex": "3.1.1",
|
||||||
"@types/minio": "7.0.1",
|
"@types/mocha": "5.2.7",
|
||||||
"@types/mocha": "5.2.6",
|
"@types/node": "12.7.12",
|
||||||
"@types/node": "11.13.8",
|
"@types/nodemailer": "6.2.1",
|
||||||
"@types/nodemailer": "4.6.8",
|
"@types/nprogress": "0.2.0",
|
||||||
"@types/nprogress": "0.0.29",
|
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parse5": "5.0.0",
|
"@types/parse5": "5.0.2",
|
||||||
"@types/parsimmon": "1.10.0",
|
"@types/parsimmon": "1.10.0",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.3.2",
|
"@types/qrcode": "1.3.4",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.12",
|
"@types/redis": "2.8.14",
|
||||||
"@types/rename": "1.0.1",
|
"@types/rename": "1.0.1",
|
||||||
"@types/request": "2.48.1",
|
"@types/request": "2.48.3",
|
||||||
"@types/request-promise-native": "1.0.16",
|
"@types/request-promise-native": "1.0.17",
|
||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "2.0.2",
|
"@types/rimraf": "2.0.2",
|
||||||
"@types/seedrandom": "2.4.28",
|
"@types/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.22.1",
|
"@types/sharp": "0.22.3",
|
||||||
"@types/showdown": "1.9.2",
|
"@types/showdown": "1.9.3",
|
||||||
"@types/speakeasy": "2.0.4",
|
"@types/speakeasy": "2.0.5",
|
||||||
"@types/systeminformation": "3.23.1",
|
"@types/systeminformation": "3.23.1",
|
||||||
"@types/tinycolor2": "1.4.1",
|
"@types/tinycolor2": "1.4.2",
|
||||||
"@types/tmp": "0.1.0",
|
"@types/tmp": "0.1.0",
|
||||||
"@types/uuid": "3.4.4",
|
"@types/uuid": "3.4.5",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.0",
|
||||||
"@types/webpack": "4.4.29",
|
"@types/webpack": "4.39.3",
|
||||||
"@types/webpack-stream": "3.2.10",
|
"@types/webpack-stream": "3.2.10",
|
||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.3",
|
||||||
"animejs": "3.0.1",
|
"@typescript-eslint/parser": "2.3.3",
|
||||||
"apexcharts": "3.6.12",
|
"agentkeepalive": "4.1.0",
|
||||||
|
"animejs": "3.1.0",
|
||||||
|
"apexcharts": "3.10.0",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
|
"aws-sdk": "2.548.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bootstrap-vue": "2.0.0-rc.13",
|
"bootstrap": "4.3.1",
|
||||||
"bull": "3.9.1",
|
"bootstrap-vue": "2.0.4",
|
||||||
|
"bull": "3.11.0",
|
||||||
"cafy": "15.1.1",
|
"cafy": "15.1.1",
|
||||||
|
"cbor": "5.0.1",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chalk": "2.4.2",
|
"chalk": "2.4.2",
|
||||||
"cli-highlight": "2.1.1",
|
"cli-highlight": "2.1.1",
|
||||||
"commander": "2.20.0",
|
"commander": "3.0.2",
|
||||||
"content-disposition": "0.5.3",
|
"content-disposition": "0.5.3",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "2.1.1",
|
"css-loader": "3.2.0",
|
||||||
"cssnano": "4.1.10",
|
"cssnano": "4.1.10",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "3.0.3",
|
||||||
"deep-equal": "1.0.1",
|
"deep-equal": "1.1.0",
|
||||||
"diskusage": "1.1.1",
|
"diskusage": "1.1.3",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"emojilib": "2.4.0",
|
"eslint": "6.5.1",
|
||||||
"eslint": "5.16.0",
|
"eslint-plugin-vue": "5.2.3",
|
||||||
"eslint-plugin-vue": "5.2.2",
|
"eventemitter3": "4.0.0",
|
||||||
"eventemitter3": "3.1.2",
|
"feed": "4.0.0",
|
||||||
"feed": "2.0.4",
|
"file-type": "12.3.0",
|
||||||
"file-type": "10.11.0",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"fuckadblock": "3.2.1",
|
|
||||||
"gulp": "4.0.2",
|
"gulp": "4.0.2",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-imagemin": "5.0.3",
|
"gulp-imagemin": "6.1.1",
|
||||||
"gulp-mocha": "6.0.0",
|
"gulp-mocha": "7.0.2",
|
||||||
"gulp-rename": "1.4.0",
|
"gulp-rename": "1.4.0",
|
||||||
"gulp-replace": "1.0.0",
|
"gulp-replace": "1.0.0",
|
||||||
"gulp-sourcemaps": "2.6.5",
|
"gulp-sourcemaps": "2.6.5",
|
||||||
@@ -137,124 +147,126 @@
|
|||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
"html-minifier": "4.0.0",
|
"html-minifier": "4.0.0",
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.2.0",
|
"https-proxy-agent": "3.0.0",
|
||||||
|
"insert-text-at-cursor": "0.3.0",
|
||||||
"is-root": "2.1.0",
|
"is-root": "2.1.0",
|
||||||
"is-svg": "4.1.0",
|
"is-svg": "4.2.0",
|
||||||
"js-yaml": "3.13.1",
|
"js-yaml": "3.13.1",
|
||||||
"jsdom": "15.1.0",
|
"jsdom": "15.1.1",
|
||||||
"json5": "2.1.0",
|
"json5": "2.1.1",
|
||||||
"json5-loader": "2.0.0",
|
"json5-loader": "3.0.0",
|
||||||
"katex": "0.10.1",
|
"jsrsasign": "8.0.12",
|
||||||
"koa": "2.7.0",
|
"katex": "0.11.1",
|
||||||
|
"koa": "2.10.0",
|
||||||
"koa-bodyparser": "4.2.1",
|
"koa-bodyparser": "4.2.1",
|
||||||
"koa-compress": "3.0.0",
|
"koa-compress": "3.0.0",
|
||||||
"koa-favicon": "2.0.1",
|
"koa-favicon": "2.0.1",
|
||||||
"koa-json-body": "5.3.0",
|
"koa-json-body": "5.3.0",
|
||||||
"koa-logger": "3.2.0",
|
"koa-logger": "3.2.1",
|
||||||
"koa-mount": "4.0.0",
|
"koa-mount": "4.0.0",
|
||||||
"koa-multer": "1.0.2",
|
|
||||||
"koa-router": "7.4.0",
|
|
||||||
"koa-send": "5.0.0",
|
"koa-send": "5.0.0",
|
||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "6.2.0",
|
"koa-views": "6.2.1",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"loader-utils": "1.2.3",
|
"loader-utils": "1.2.3",
|
||||||
"lolex": "3.1.0",
|
"lolex": "4.2.0",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"minio": "7.0.8",
|
"mocha": "6.2.1",
|
||||||
"mocha": "6.1.4",
|
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"moment": "2.24.0",
|
"ms": "2.1.2",
|
||||||
"ms": "2.1.1",
|
"multer": "1.4.2",
|
||||||
"nested-property": "0.0.7",
|
"nested-property": "1.0.1",
|
||||||
"node-fetch": "2.5.0",
|
"node-fetch": "2.6.0",
|
||||||
"nodemailer": "6.1.1",
|
"nodemailer": "6.3.1",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"parse5": "5.1.0",
|
"parse5": "5.1.0",
|
||||||
"parsimmon": "1.12.0",
|
"parsimmon": "1.13.0",
|
||||||
"pg": "7.11.0",
|
"pg": "7.12.1",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "3.0.0",
|
||||||
"prismjs": "1.16.0",
|
"prismjs": "1.17.1",
|
||||||
"progress-bar-webpack-plugin": "1.12.1",
|
"progress-bar-webpack-plugin": "1.12.1",
|
||||||
"promise-any": "0.2.0",
|
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
"pug": "2.0.3",
|
"pug": "2.0.4",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
"pureimage": "0.1.6",
|
"pureimage": "0.1.6",
|
||||||
"qrcode": "1.3.3",
|
"qrcode": "1.4.2",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"randomcolor": "0.5.4",
|
"randomcolor": "0.5.4",
|
||||||
"ratelimiter": "3.3.0",
|
"ratelimiter": "3.3.1",
|
||||||
"recaptcha-promise": "0.1.3",
|
"recaptcha-promise": "0.1.3",
|
||||||
"reconnecting-websocket": "4.1.10",
|
"reconnecting-websocket": "4.2.0",
|
||||||
"redis": "2.8.0",
|
"redis": "2.8.0",
|
||||||
|
"redis-lock": "0.1.4",
|
||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"rename": "1.0.4",
|
"rename": "1.0.4",
|
||||||
"request": "2.88.0",
|
"request": "2.88.0",
|
||||||
"request-promise-native": "1.0.7",
|
"request-promise-native": "1.0.7",
|
||||||
"request-stats": "3.0.0",
|
"request-stats": "3.0.0",
|
||||||
"require-all": "3.0.0",
|
"require-all": "3.0.0",
|
||||||
"rimraf": "2.6.3",
|
"rimraf": "3.0.0",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"seedrandom": "3.0.1",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.22.1",
|
"sharp": "0.23.1",
|
||||||
"showdown": "1.9.0",
|
"showdown": "1.9.0",
|
||||||
"showdown-highlightjs-extension": "0.1.2",
|
"showdown-highlightjs-extension": "0.1.2",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"stringz": "1.0.0",
|
"stringz": "2.0.0",
|
||||||
"style-loader": "0.23.1",
|
"style-loader": "1.0.0",
|
||||||
"stylus": "0.54.5",
|
"stylus": "0.54.7",
|
||||||
"stylus-loader": "3.0.2",
|
"stylus-loader": "3.0.2",
|
||||||
"summaly": "2.2.0",
|
"summaly": "2.3.1",
|
||||||
"systeminformation": "4.1.6",
|
"syslog-pro": "1.0.0",
|
||||||
|
"systeminformation": "4.14.11",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"terser-webpack-plugin": "1.2.4",
|
"terser-webpack-plugin": "2.1.3",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
|
"three": "0.109.0",
|
||||||
"tinycolor2": "1.4.1",
|
"tinycolor2": "1.4.1",
|
||||||
"tmp": "0.1.0",
|
"tmp": "0.1.0",
|
||||||
"ts-loader": "5.3.3",
|
"ts-loader": "6.2.0",
|
||||||
"ts-node": "7.0.1",
|
"ts-node": "8.4.1",
|
||||||
"tslint": "5.15.0",
|
"tslint": "5.20.0",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"typeorm": "0.2.16-rc.1",
|
"typeorm": "0.2.19",
|
||||||
"typescript": "3.3.3333",
|
"typescript": "3.6.4",
|
||||||
"typescript-eslint-parser": "22.0.0",
|
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "2.2.0",
|
||||||
"uuid": "3.3.2",
|
"uuid": "3.3.3",
|
||||||
"v-animate-css": "0.0.3",
|
"v-animate-css": "0.0.3",
|
||||||
"v-debounce": "0.1.2",
|
"v-debounce": "0.1.2",
|
||||||
"video-thumbnail-generator": "1.1.3",
|
|
||||||
"vue": "2.6.10",
|
"vue": "2.6.10",
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.0",
|
||||||
"vue-content-loading": "1.6.0",
|
"vue-content-loading": "1.6.0",
|
||||||
"vue-cropperjs": "3.0.0",
|
"vue-cropperjs": "4.0.0",
|
||||||
"vue-i18n": "8.11.2",
|
"vue-i18n": "8.14.1",
|
||||||
"vue-js-modal": "1.3.31",
|
"vue-js-modal": "1.3.31",
|
||||||
"vue-json-pretty": "1.6.0",
|
"vue-json-pretty": "1.6.2",
|
||||||
"vue-loader": "15.7.0",
|
"vue-loader": "15.7.1",
|
||||||
"vue-marquee-text-component": "1.1.1",
|
"vue-marquee-text-component": "1.1.1",
|
||||||
"vue-prism-component": "1.1.1",
|
"vue-prism-component": "1.1.1",
|
||||||
"vue-router": "3.0.6",
|
"vue-router": "3.1.3",
|
||||||
"vue-sequential-entrance": "1.1.3",
|
"vue-sequential-entrance": "1.1.3",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-svg-inline-loader": "1.2.15",
|
"vue-svg-inline-loader": "1.3.3",
|
||||||
"vue-template-compiler": "2.6.10",
|
"vue-template-compiler": "2.6.10",
|
||||||
"vuedraggable": "2.21.0",
|
"vuedraggable": "2.23.2",
|
||||||
"vuewordcloud": "18.7.11",
|
"vuewordcloud": "18.7.11",
|
||||||
"vuex": "3.1.1",
|
"vuex": "3.1.1",
|
||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.5",
|
"web-push": "3.4.0",
|
||||||
"webpack": "4.32.2",
|
"webpack": "4.41.1",
|
||||||
"webpack-cli": "3.3.2",
|
"webpack-cli": "3.3.9",
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.30",
|
||||||
"ws": "7.0.0",
|
"ws": "7.1.2",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/fluent-ffmpeg": "2.1.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
803
src/@types/jsrsasign.d.ts
vendored
Normal file
803
src/@types/jsrsasign.d.ts
vendored
Normal file
@@ -0,0 +1,803 @@
|
|||||||
|
// Attention: Partial Type Definition
|
||||||
|
|
||||||
|
declare module 'jsrsasign' {
|
||||||
|
//// HELPER TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attention: The value might be changed by the function.
|
||||||
|
*/
|
||||||
|
type Mutable<T> = T;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deprecated: The function might be deleted in future release.
|
||||||
|
*/
|
||||||
|
type Deprecated<T> = T;
|
||||||
|
|
||||||
|
//// COMMON TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* byte number
|
||||||
|
*/
|
||||||
|
type ByteNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hexadecimal string /[0-9A-F]/
|
||||||
|
*/
|
||||||
|
type HexString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* binary string /[01]/
|
||||||
|
*/
|
||||||
|
type BinString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64 string /[A-Za-z0-9+/]=+/
|
||||||
|
*/
|
||||||
|
type Base64String = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64 URL encoded string /[A-Za-z0-9_-]/
|
||||||
|
*/
|
||||||
|
type Base64URLString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* time value (ex. "151231235959Z")
|
||||||
|
*/
|
||||||
|
type TimeValue = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OID string (ex. '1.2.3.4.567')
|
||||||
|
*/
|
||||||
|
type OID = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OID name
|
||||||
|
*/
|
||||||
|
type OIDName = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PEM formatted string
|
||||||
|
*/
|
||||||
|
type PEM = string;
|
||||||
|
|
||||||
|
//// ASN1 TYPES
|
||||||
|
|
||||||
|
class ASN1Object {
|
||||||
|
public isModified: boolean;
|
||||||
|
|
||||||
|
public hTLV: ASN1TLV;
|
||||||
|
|
||||||
|
public hT: ASN1T;
|
||||||
|
|
||||||
|
public hL: ASN1L;
|
||||||
|
|
||||||
|
public hV: ASN1V;
|
||||||
|
|
||||||
|
public getLengthHexFromValue(): HexString;
|
||||||
|
|
||||||
|
public getEncodedHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getValueHex(): ASN1V;
|
||||||
|
|
||||||
|
public getFreshValueHex(): ASN1V;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DERAbstractStructured extends ASN1Object {
|
||||||
|
constructor(params?: Partial<Record<'array', ASN1Object[]>>);
|
||||||
|
|
||||||
|
public setByASN1ObjectArray(asn1ObjectArray: ASN1Object[]): void;
|
||||||
|
|
||||||
|
public appendASN1Object(asn1Object: ASN1Object): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DERSequence extends DERAbstractStructured {
|
||||||
|
constructor(params?: Partial<Record<'array', ASN1Object[]>>);
|
||||||
|
|
||||||
|
public getFreshValueHex(): ASN1V;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// ASN1HEX TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 DER encoded data (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1S = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of something
|
||||||
|
*/
|
||||||
|
type Idx<T extends { [idx: string]: unknown } | { [idx: number]: unknown }> = ASN1S extends { [idx: string]: unknown } ? string : ASN1S extends { [idx: number]: unknown } ? number : never;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* byte length of something
|
||||||
|
*/
|
||||||
|
type ByteLength<T extends { length: unknown }> = T['length'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 L(length) (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1L = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 T(tag) (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1T = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 V(value) (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1V = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 TLV (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1TLV = HexString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 object string
|
||||||
|
*/
|
||||||
|
type ASN1ObjectString = string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nth
|
||||||
|
*/
|
||||||
|
type Nth = number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASN.1 DER encoded OID value (hexadecimal string)
|
||||||
|
*/
|
||||||
|
type ASN1OIDV = HexString;
|
||||||
|
|
||||||
|
class ASN1HEX {
|
||||||
|
public static getLblen(s: ASN1S, idx: Idx<ASN1S>): ByteLength<ASN1L>;
|
||||||
|
|
||||||
|
public static getL(s: ASN1S, idx: Idx<ASN1S>): ASN1L;
|
||||||
|
|
||||||
|
public static getVblen(s: ASN1S, idx: Idx<ASN1S>): ByteLength<ASN1V>;
|
||||||
|
|
||||||
|
public static getVidx(s: ASN1S, idx: Idx<ASN1S>): Idx<ASN1V>;
|
||||||
|
|
||||||
|
public static getV(s: ASN1S, idx: Idx<ASN1S>): ASN1V;
|
||||||
|
|
||||||
|
public static getTLV(s: ASN1S, idx: Idx<ASN1S>): ASN1TLV;
|
||||||
|
|
||||||
|
public static getNextSiblingIdx(s: ASN1S, idx: Idx<ASN1S>): Idx<ASN1ObjectString>;
|
||||||
|
|
||||||
|
public static getChildIdx(h: ASN1S, pos: Idx<ASN1S>): Idx<ASN1ObjectString>[];
|
||||||
|
|
||||||
|
public static getNthChildIdx(h: ASN1S, idx: Idx<ASN1S>, nth: Nth): Idx<ASN1ObjectString>;
|
||||||
|
|
||||||
|
public static getIdxbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): Idx<Mutable<Nth[]>>;
|
||||||
|
|
||||||
|
public static getTLVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): ASN1TLV;
|
||||||
|
|
||||||
|
public static getVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string, removeUnusedbits?: boolean): ASN1V;
|
||||||
|
|
||||||
|
public static hextooidstr(hex: ASN1OIDV): OID;
|
||||||
|
|
||||||
|
public static dump(hexOrObj: ASN1S | ASN1Object, flags?: Record<string, unknown>, idx?: Idx<ASN1S>, indent?: string): string;
|
||||||
|
|
||||||
|
public static isASN1HEX(hex: string): hex is HexString;
|
||||||
|
|
||||||
|
public static oidname(oidDotOrHex: OID | ASN1OIDV): OIDName;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// BIG INTEGER TYPES (PARTIAL)
|
||||||
|
|
||||||
|
class BigInteger {
|
||||||
|
constructor(a: null);
|
||||||
|
|
||||||
|
constructor(a: number, b: SecureRandom);
|
||||||
|
|
||||||
|
constructor(a: number, b: number, c: SecureRandom);
|
||||||
|
|
||||||
|
constructor(a: unknown);
|
||||||
|
|
||||||
|
constructor(a: string, b: number);
|
||||||
|
|
||||||
|
public am(i: number, x: number, w: number, j: number, c: number, n: number): number;
|
||||||
|
|
||||||
|
public DB: number;
|
||||||
|
|
||||||
|
public DM: number;
|
||||||
|
|
||||||
|
public DV: number;
|
||||||
|
|
||||||
|
public FV: number;
|
||||||
|
|
||||||
|
public F1: number;
|
||||||
|
|
||||||
|
public F2: number;
|
||||||
|
|
||||||
|
protected copyTo(r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected fromInt(x: number): void;
|
||||||
|
|
||||||
|
protected fromString(s: string, b: number): void;
|
||||||
|
|
||||||
|
protected clamp(): void;
|
||||||
|
|
||||||
|
public toString(b: number): string;
|
||||||
|
|
||||||
|
public negate(): BigInteger;
|
||||||
|
|
||||||
|
public abs(): BigInteger;
|
||||||
|
|
||||||
|
public compareTo(a: BigInteger): number;
|
||||||
|
|
||||||
|
public bitLength(): number;
|
||||||
|
|
||||||
|
protected dlShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected drShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected lShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected rShiftTo(n: number, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected subTo(a: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected multiplyTo(a: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected squareTo(r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
protected divRemTo(m: BigInteger, q: Mutable<BigInteger>, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public mod(a: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
protected invDigit(): number;
|
||||||
|
|
||||||
|
protected isEven(): boolean;
|
||||||
|
|
||||||
|
protected exp(e: number, z: Classic | Montgomery): BigInteger;
|
||||||
|
|
||||||
|
public modPowInt(e: number, m: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public static ZERO: BigInteger;
|
||||||
|
|
||||||
|
public static ONE: BigInteger;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Classic {
|
||||||
|
constructor(m: BigInteger);
|
||||||
|
|
||||||
|
public convert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public revert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public reduce(x: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public mulTo(x: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public sqrTo(x: BigInteger, y: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Montgomery {
|
||||||
|
constructor(m: BigInteger);
|
||||||
|
|
||||||
|
public convert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public revert(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public reduce(x: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public mulTo(x: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
|
||||||
|
public sqrTo(x: BigInteger, y: BigInteger, r: Mutable<BigInteger>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// KEYUTIL TYPES
|
||||||
|
|
||||||
|
type DecryptAES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type Decrypt3DES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type DecryptDES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type EncryptAES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type Encrypt3DES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type EncryptDES = (dataHex: HexString, keyHex: HexString, ivHex: HexString) => HexString;
|
||||||
|
|
||||||
|
type AlgList = {
|
||||||
|
'AES-256-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 32; ivlen: 16; };
|
||||||
|
'AES-192-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 24; ivlen: 16; };
|
||||||
|
'AES-128-CBC': { 'proc': DecryptAES; 'eproc': EncryptAES; keylen: 16; ivlen: 16; };
|
||||||
|
'DES-EDE3-CBC': { 'proc': Decrypt3DES; 'eproc': Encrypt3DES; keylen: 24; ivlen: 8; };
|
||||||
|
'DES-CBC': { 'proc': DecryptDES; 'eproc': EncryptDES; keylen: 8; ivlen: 8; };
|
||||||
|
};
|
||||||
|
|
||||||
|
type AlgName = keyof AlgList;
|
||||||
|
|
||||||
|
type PEMHeadAlgName = 'RSA' | 'EC' | 'DSA';
|
||||||
|
|
||||||
|
type GetKeyRSAParam = RSAKey | {
|
||||||
|
n: BigInteger;
|
||||||
|
e: number;
|
||||||
|
} | Record<'n' | 'e', HexString> | Record<'n' | 'e', HexString> & Record<'d' | 'p' | 'q' | 'dp' | 'dq' | 'co', HexString | null> | {
|
||||||
|
n: BigInteger;
|
||||||
|
e: number;
|
||||||
|
d: BigInteger;
|
||||||
|
} | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e', Base64URLString> | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e' | 'd' | 'p' | 'q' | 'dp' | 'dq' | 'qi', Base64URLString> | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e' | 'd', Base64URLString>;
|
||||||
|
|
||||||
|
type GetKeyECDSAParam = KJUR.crypto.ECDSA | {
|
||||||
|
curve: KJUR.crypto.CurveName;
|
||||||
|
xy: HexString;
|
||||||
|
} | {
|
||||||
|
curve: KJUR.crypto.CurveName;
|
||||||
|
d: HexString;
|
||||||
|
} | {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
} | {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
d: Base64URLString;
|
||||||
|
};
|
||||||
|
|
||||||
|
type GetKeyDSAParam = KJUR.crypto.DSA | Record<'p' | 'q' | 'g', BigInteger> & Record<'y', BigInteger | null> | Record<'p' | 'q' | 'g' | 'x', BigInteger> & Record<'y', BigInteger | null>;
|
||||||
|
|
||||||
|
type GetKeyParam = GetKeyRSAParam | GetKeyECDSAParam | GetKeyDSAParam | string;
|
||||||
|
|
||||||
|
class KEYUTIL {
|
||||||
|
public version: '1.0.0';
|
||||||
|
|
||||||
|
public parsePKCS5PEM(sPKCS5PEM: PEM): Partial<Record<'type' | 's', string>> & (Record<'cipher' | 'ivsalt', string> | Record<'cipher' | 'ivsalt', undefined>);
|
||||||
|
|
||||||
|
public getKeyAndUnusedIvByPasscodeAndIvsalt(algName: AlgName, passcode: string, ivsaltHex: HexString): Record<'keyhex' | 'ivhex', HexString>;
|
||||||
|
|
||||||
|
public decryptKeyB64(privateKeyB64: Base64String, sharedKeyAlgName: AlgName, sharedKeyHex: HexString, ivsaltHex: HexString): Base64String;
|
||||||
|
|
||||||
|
public getDecryptedKeyHex(sEncryptedPEM: PEM, passcode: string): HexString;
|
||||||
|
|
||||||
|
public getEncryptedPKCS5PEMFromPrvKeyHex(pemHeadAlg: PEMHeadAlgName, hPrvKey: string, passcode: string, sharedKeyAlgName?: AlgName | null, ivsaltHex?: HexString | null): PEM;
|
||||||
|
|
||||||
|
public parseHexOfEncryptedPKCS8(sHEX: HexString): {
|
||||||
|
ciphertext: ASN1V;
|
||||||
|
encryptionSchemeAlg: 'TripleDES';
|
||||||
|
encryptionSchemeIV: ASN1V;
|
||||||
|
pbkdf2Salt: ASN1V;
|
||||||
|
pbkdf2Iter: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
public getPBKDF2KeyHexFromParam(info: ReturnType<this['parseHexOfEncryptedPKCS8']>, passcode: string): HexString;
|
||||||
|
|
||||||
|
private _getPlainPKCS8HexFromEncryptedPKCS8PEM(pkcs8PEM: PEM, passcode: string): HexString;
|
||||||
|
|
||||||
|
public getKeyFromEncryptedPKCS8PEM(prvKeyHex: HexString): ReturnType<this['getKeyFromPlainPrivatePKCS8Hex']>;
|
||||||
|
|
||||||
|
public parsePlainPrivatePKCS8Hex(pkcs8PrvHex: HexString): {
|
||||||
|
algparam: ASN1V | null;
|
||||||
|
algoid: ASN1V;
|
||||||
|
keyidx: Idx<ASN1V>;
|
||||||
|
};
|
||||||
|
|
||||||
|
public getKeyFromPlainPrivatePKCS8PEM(prvKeyHex: HexString): ReturnType<this['getKeyFromPlainPrivatePKCS8Hex']>;
|
||||||
|
|
||||||
|
public getKeyFromPlainPrivatePKCS8Hex(prvKeyHex: HexString): RSAKey | KJUR.crypto.DSA | KJUR.crypto.ECDSA;
|
||||||
|
|
||||||
|
private _getKeyFromPublicPKCS8Hex(h: HexString): RSAKey | KJUR.crypto.DSA | KJUR.crypto.ECDSA;
|
||||||
|
|
||||||
|
public parsePublicRawRSAKeyHex(pubRawRSAHex: HexString): Record<'n' | 'e', ASN1V>;
|
||||||
|
|
||||||
|
public parsePublicPKCS8Hex(pkcs8PubHex: HexString): {
|
||||||
|
algparam: ASN1V | Record<'p' | 'q' | 'g', ASN1V> | null;
|
||||||
|
algoid: ASN1V;
|
||||||
|
key: ASN1V;
|
||||||
|
};
|
||||||
|
|
||||||
|
public static getKey(param: GetKeyRSAParam): RSAKey;
|
||||||
|
|
||||||
|
public static getKey(param: GetKeyECDSAParam): KJUR.crypto.ECDSA;
|
||||||
|
|
||||||
|
public static getKey(param: GetKeyDSAParam): KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static getKey(param: string, passcode?: string, hextype?: string): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static generateKeypair(alg: 'RSA', keylen: number): Record<'prvKeyObj' | 'pubKeyObj', RSAKey>;
|
||||||
|
|
||||||
|
public static generateKeypair(alg: 'EC', curve: KJUR.crypto.CurveName): Record<'prvKeyObj' | 'pubKeyObj', KJUR.crypto.ECDSA>;
|
||||||
|
|
||||||
|
public static getPEM(keyObjOrHex: RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA, formatType?: 'PKCS1PRV' | 'PKCS5PRV' | 'PKCS8PRV', passwd?: string, encAlg?: 'DES-CBC' | 'DES-EDE3-CBC' | 'AES-128-CBC' | 'AES-192-CBC' | 'AES-256-CBC', hexType?: string, ivsaltHex?: HexString): object; // To Do
|
||||||
|
|
||||||
|
public static getKeyFromCSRPEM(csrPEM: PEM): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static getKeyFromCSRHex(csrHex: HexString): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static parseCSRHex(csrHex: HexString): Record<'p8pubkeyhex', ASN1TLV>;
|
||||||
|
|
||||||
|
public static getJWKFromKey(keyObj: RSAKey): {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e' | 'd' | 'p' | 'q' | 'dp' | 'dq' | 'qi', Base64URLString> | {
|
||||||
|
kty: 'RSA';
|
||||||
|
} & Record<'n' | 'e', Base64URLString>;
|
||||||
|
|
||||||
|
public static getJWKFromKey(keyObj: KJUR.crypto.ECDSA): {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
d: Base64URLString;
|
||||||
|
} | {
|
||||||
|
kty: 'EC';
|
||||||
|
crv: KJUR.crypto.CurveName;
|
||||||
|
x: Base64URLString;
|
||||||
|
y: Base64URLString;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//// KJUR NAMESPACE (PARTIAL)
|
||||||
|
|
||||||
|
namespace KJUR {
|
||||||
|
namespace crypto {
|
||||||
|
type CurveName = 'secp128r1' | 'secp160k1' | 'secp160r1' | 'secp192k1' | 'secp192r1' | 'secp224r1' | 'secp256k1' | 'secp256r1' | 'secp384r1' | 'secp521r1';
|
||||||
|
|
||||||
|
class DSA {
|
||||||
|
public p: BigInteger | null;
|
||||||
|
|
||||||
|
public q: BigInteger | null;
|
||||||
|
|
||||||
|
public g: BigInteger | null;
|
||||||
|
|
||||||
|
public y: BigInteger | null;
|
||||||
|
|
||||||
|
public x: BigInteger | null;
|
||||||
|
|
||||||
|
public type: 'DSA';
|
||||||
|
|
||||||
|
public isPrivate: boolean;
|
||||||
|
|
||||||
|
public isPublic: boolean;
|
||||||
|
|
||||||
|
public setPrivate(p: BigInteger, q: BigInteger, g: BigInteger, y: BigInteger | null, x: BigInteger): void;
|
||||||
|
|
||||||
|
public setPrivateHex(hP: HexString, hQ: HexString, hG: HexString, hY: HexString | null, hX: HexString): void;
|
||||||
|
|
||||||
|
public setPublic(p: BigInteger, q: BigInteger, g: BigInteger, y: BigInteger): void;
|
||||||
|
|
||||||
|
public setPublicHex(hP: HexString, hQ: HexString, hG: HexString, hY: HexString): void;
|
||||||
|
|
||||||
|
public signWithMessageHash(sHashHex: HexString): HexString;
|
||||||
|
|
||||||
|
public verifyWithMessageHash(sHashHex: HexString, hSigVal: HexString): boolean;
|
||||||
|
|
||||||
|
public parseASN1Signature(hSigVal: HexString): [BigInteger, BigInteger];
|
||||||
|
|
||||||
|
public readPKCS5PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readCertPubKeyHex(h: HexString, nthPKI: number): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ECDSA {
|
||||||
|
constructor(params?: {
|
||||||
|
curve?: CurveName;
|
||||||
|
prv?: HexString;
|
||||||
|
pub?: HexString;
|
||||||
|
});
|
||||||
|
|
||||||
|
public p: BigInteger | null;
|
||||||
|
|
||||||
|
public q: BigInteger | null;
|
||||||
|
|
||||||
|
public g: BigInteger | null;
|
||||||
|
|
||||||
|
public y: BigInteger | null;
|
||||||
|
|
||||||
|
public x: BigInteger | null;
|
||||||
|
|
||||||
|
public type: 'EC';
|
||||||
|
|
||||||
|
public isPrivate: boolean;
|
||||||
|
|
||||||
|
public isPublic: boolean;
|
||||||
|
|
||||||
|
public getBigRandom(limit: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public setNamedCurve(curveName: CurveName): void;
|
||||||
|
|
||||||
|
public setPrivateKeyHex(prvKeyHex: HexString): void;
|
||||||
|
|
||||||
|
public setPublicKeyHex(pubKeyHex: HexString): void;
|
||||||
|
|
||||||
|
public getPublicKeyXYHex(): Record<'x' | 'y', HexString>;
|
||||||
|
|
||||||
|
public getShortNISTPCurveName(): 'P-256' | 'P-384' | null;
|
||||||
|
|
||||||
|
public generateKeyPairHex(): Record<'ecprvhex' | 'ecpubhex', HexString>;
|
||||||
|
|
||||||
|
public signWithMessageHash(hashHex: HexString): HexString;
|
||||||
|
|
||||||
|
public signHex(hashHex: HexString, privHex: HexString): HexString;
|
||||||
|
|
||||||
|
public verifyWithMessageHash(sHashHex: HexString, hSigVal: HexString): boolean;
|
||||||
|
|
||||||
|
public parseASN1Signature(hSigVal: HexString): [BigInteger, BigInteger];
|
||||||
|
|
||||||
|
public readPKCS5PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readCertPubKeyHex(h: HexString, nthPKI: number): void;
|
||||||
|
|
||||||
|
public static parseSigHex(sigHex: HexString): Record<'r' | 's', BigInteger>;
|
||||||
|
|
||||||
|
public static parseSigHexInHexRS(sigHex: HexString): Record<'r' | 's', ASN1V>;
|
||||||
|
|
||||||
|
public static asn1SigToConcatSig(asn1Sig: HexString): HexString;
|
||||||
|
|
||||||
|
public static concatSigToASN1Sig(concatSig: HexString): ASN1TLV;
|
||||||
|
|
||||||
|
public static hexRSSigToASN1Sig(hR: HexString, hS: HexString): ASN1TLV;
|
||||||
|
|
||||||
|
public static biRSSigToASN1Sig(biR: BigInteger, biS: BigInteger): ASN1TLV;
|
||||||
|
|
||||||
|
public static getName(s: CurveName | HexString): 'secp256r1' | 'secp256k1' | 'secp384r1' | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Signature {
|
||||||
|
constructor(params?: ({
|
||||||
|
alg: string;
|
||||||
|
prov?: string;
|
||||||
|
} | {}) & ({
|
||||||
|
psssaltlen: number;
|
||||||
|
} | {}) & ({
|
||||||
|
prvkeypem: PEM;
|
||||||
|
prvkeypas?: never;
|
||||||
|
} | {}));
|
||||||
|
|
||||||
|
private _setAlgNames(): void;
|
||||||
|
|
||||||
|
private _zeroPaddingOfSignature(hex: HexString, bitLength: number): HexString;
|
||||||
|
|
||||||
|
public setAlgAndProvider(alg: string, prov: string): void;
|
||||||
|
|
||||||
|
public init(key: GetKeyParam, pass?: string): void;
|
||||||
|
|
||||||
|
public updateString(str: string): void;
|
||||||
|
|
||||||
|
public updateHex(hex: HexString): void;
|
||||||
|
|
||||||
|
public sign(): HexString;
|
||||||
|
|
||||||
|
public signString(str: string): HexString;
|
||||||
|
|
||||||
|
public signHex(hex: HexString): HexString;
|
||||||
|
|
||||||
|
public verify(hSigVal: string): boolean | 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//// RSAKEY TYPES
|
||||||
|
|
||||||
|
class RSAKey {
|
||||||
|
public n: BigInteger | null;
|
||||||
|
|
||||||
|
public e: number;
|
||||||
|
|
||||||
|
public d: BigInteger | null;
|
||||||
|
|
||||||
|
public p: BigInteger | null;
|
||||||
|
|
||||||
|
public q: BigInteger | null;
|
||||||
|
|
||||||
|
public dmp1: BigInteger | null;
|
||||||
|
|
||||||
|
public dmq1: BigInteger | null;
|
||||||
|
|
||||||
|
public coeff: BigInteger | null;
|
||||||
|
|
||||||
|
public type: 'RSA';
|
||||||
|
|
||||||
|
public isPrivate?: boolean;
|
||||||
|
|
||||||
|
public isPublic?: boolean;
|
||||||
|
|
||||||
|
//// RSA PUBLIC
|
||||||
|
|
||||||
|
protected doPublic(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public setPublic(N: BigInteger, E: number): void;
|
||||||
|
|
||||||
|
public setPublic(N: HexString, E: HexString): void;
|
||||||
|
|
||||||
|
public encrypt(text: string): HexString | null;
|
||||||
|
|
||||||
|
public encryptOAEP(text: string, hash?: string, hashLen?: number): HexString | null;
|
||||||
|
|
||||||
|
public encryptOAEP(text: string, hash?: (s: string) => string, hashLen?: number): HexString | null;
|
||||||
|
|
||||||
|
//// RSA PRIVATE
|
||||||
|
|
||||||
|
protected doPrivate(x: BigInteger): BigInteger;
|
||||||
|
|
||||||
|
public setPrivate(N: BigInteger, E: number, D: BigInteger): void;
|
||||||
|
|
||||||
|
public setPrivate(N: HexString, E: HexString, D: HexString): void;
|
||||||
|
|
||||||
|
public setPrivateEx(N: HexString, E: HexString, D?: HexString | null, P?: HexString | null, Q?: HexString | null, DP?: HexString | null, DQ?: HexString | null, C?: HexString | null): void;
|
||||||
|
|
||||||
|
public generate(B: number, E: HexString): void;
|
||||||
|
|
||||||
|
public decrypt(ctext: HexString): string;
|
||||||
|
|
||||||
|
public decryptOAEP(ctext: HexString, hash?: string, hashLen?: number): string | null;
|
||||||
|
|
||||||
|
public encryptOAEP(ctext: HexString, hash?: (s: string) => string, hashLen?: number): string | null;
|
||||||
|
|
||||||
|
//// RSA PEM
|
||||||
|
|
||||||
|
public getPosArrayOfChildrenFromHex(hPrivateKey: PEM): Idx<ASN1ObjectString>[];
|
||||||
|
|
||||||
|
public getHexValueArrayOfChildrenFromHex(hPrivateKey: PEM): Idx<ASN1ObjectString>[];
|
||||||
|
|
||||||
|
public readPrivateKeyFromPEMString(keyPEM: PEM): void;
|
||||||
|
|
||||||
|
public readPKCS5PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PrvKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS5PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readPKCS8PubKeyHex(h: HexString): void;
|
||||||
|
|
||||||
|
public readCertPubKeyHex(h: HexString, nthPKI: Nth): void;
|
||||||
|
|
||||||
|
//// RSA SIGN
|
||||||
|
|
||||||
|
public sign(s: string, hashAlg: string): HexString;
|
||||||
|
|
||||||
|
public signWithMessageHash(sHashHex: HexString, hashAlg: string): HexString;
|
||||||
|
|
||||||
|
public signPSS(s: string, hashAlg: string, sLen: number): HexString;
|
||||||
|
|
||||||
|
public signWithMessageHashPSS(hHash: HexString, hashAlg: string, sLen: number): HexString;
|
||||||
|
|
||||||
|
public verify(sMsg: string, hSig: HexString): boolean | 0;
|
||||||
|
|
||||||
|
public verifyWithMessageHash(sHashHex: HexString, hSig: HexString): boolean | 0;
|
||||||
|
|
||||||
|
public verifyPSS(sMsg: string, hSig: HexString, hashAlg: string, sLen: number): boolean;
|
||||||
|
|
||||||
|
public verifyWithMessageHashPSS(hHash: HexString, hSig: HexString, hashAlg: string, sLen: number): boolean;
|
||||||
|
|
||||||
|
public static SALT_LEN_HLEN: -1;
|
||||||
|
|
||||||
|
public static SALT_LEN_MAX: -2;
|
||||||
|
|
||||||
|
public static SALT_LEN_RECOVER: -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// RNG TYPES
|
||||||
|
class SecureRandom {
|
||||||
|
public nextBytes(ba: Mutable<ByteNumber[]>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// X509 TYPES
|
||||||
|
|
||||||
|
type ExtInfo = {
|
||||||
|
critical: boolean;
|
||||||
|
oid: OID;
|
||||||
|
vidx: Idx<ASN1V>;
|
||||||
|
};
|
||||||
|
|
||||||
|
type ExtAIAInfo = Record<'ocsp' | 'caissuer', string>;
|
||||||
|
|
||||||
|
type ExtCertificatePolicy = {
|
||||||
|
id: OIDName;
|
||||||
|
} & Partial<{
|
||||||
|
cps: string;
|
||||||
|
} | {
|
||||||
|
unotice: string;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
class X509 {
|
||||||
|
public hex: HexString | null;
|
||||||
|
|
||||||
|
public version: number;
|
||||||
|
|
||||||
|
public foffset: number;
|
||||||
|
|
||||||
|
public aExtInfo: null;
|
||||||
|
|
||||||
|
public getVersion(): number;
|
||||||
|
|
||||||
|
public getSerialNumberHex(): ASN1V;
|
||||||
|
|
||||||
|
public getSignatureAlgorithmField(): OIDName;
|
||||||
|
|
||||||
|
public getIssuerHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getIssuerString(): HexString;
|
||||||
|
|
||||||
|
public getSubjectHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getSubjectString(): HexString;
|
||||||
|
|
||||||
|
public getNotBefore(): TimeValue;
|
||||||
|
|
||||||
|
public getNotAfter(): TimeValue;
|
||||||
|
|
||||||
|
public getPublicKeyHex(): ASN1TLV;
|
||||||
|
|
||||||
|
public getPublicKeyIdx(): Idx<Mutable<Nth[]>>;
|
||||||
|
|
||||||
|
public getPublicKeyContentIdx(): Idx<Mutable<Nth[]>>;
|
||||||
|
|
||||||
|
public getPublicKey(): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public getSignatureAlgorithmName(): OIDName;
|
||||||
|
|
||||||
|
public getSignatureValueHex(): ASN1V;
|
||||||
|
|
||||||
|
public verifySignature(pubKey: GetKeyParam): boolean | 0;
|
||||||
|
|
||||||
|
public parseExt(): void;
|
||||||
|
|
||||||
|
public getExtInfo(oidOrName: OID | string): ExtInfo | undefined;
|
||||||
|
|
||||||
|
public getExtBasicConstraints(): ExtInfo | {} | {
|
||||||
|
cA: true;
|
||||||
|
pathLen?: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
public getExtKeyUsageBin(): BinString;
|
||||||
|
|
||||||
|
public getExtKeyUsageString(): string;
|
||||||
|
|
||||||
|
public getExtSubjectKeyIdentifier(): ASN1V | undefined;
|
||||||
|
|
||||||
|
public getExtAuthorityKeyIdentifier(): {
|
||||||
|
kid: ASN1V;
|
||||||
|
} | undefined;
|
||||||
|
|
||||||
|
public getExtExtKeyUsageName(): OIDName[] | undefined;
|
||||||
|
|
||||||
|
public getExtSubjectAltName(): Deprecated<string[]>;
|
||||||
|
|
||||||
|
public getExtSubjectAltName2(): ['MAIL' | 'DNS' | 'DN' | 'URI' | 'IP', string][] | undefined;
|
||||||
|
|
||||||
|
public getExtCRLDistributionPointsURI(): string[] | undefined;
|
||||||
|
|
||||||
|
public getExtAIAInfo(): ExtAIAInfo | undefined;
|
||||||
|
|
||||||
|
public getExtCertificatePolicies(): ExtCertificatePolicy[] | undefined;
|
||||||
|
|
||||||
|
public readCertPEM(sCertPEM: PEM): void;
|
||||||
|
|
||||||
|
public readCertHex(sCertHex: HexString): void;
|
||||||
|
|
||||||
|
public getInfo(): string;
|
||||||
|
|
||||||
|
public static hex2dn(hex: HexString, idx?: Idx<HexString>): string;
|
||||||
|
|
||||||
|
public static hex2rdn(hex: HexString, idx?: Idx<HexString>): string;
|
||||||
|
|
||||||
|
public static hex2attrTypeValue(hex: HexString, idx?: Idx<HexString>): string;
|
||||||
|
|
||||||
|
public static getPublicKeyFromCertPEM(sCertPEM: PEM): RSAKey | KJUR.crypto.ECDSA | KJUR.crypto.DSA;
|
||||||
|
|
||||||
|
public static getPublicKeyInfoPropOfCertPEM(sCertPEM: PEM): {
|
||||||
|
algparam: ASN1V | null;
|
||||||
|
leyhex: ASN1V;
|
||||||
|
algoid: ASN1V;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/@types/lookup-dns-cache.d.ts
vendored
20
src/@types/lookup-dns-cache.d.ts
vendored
@@ -1,17 +1,9 @@
|
|||||||
declare module 'lookup-dns-cache' {
|
declare module 'lookup-dns-cache' {
|
||||||
type IPv4 = 4;
|
import { LookupOneOptions, LookupAllOptions, LookupOptions, LookupAddress } from 'dns';
|
||||||
|
|
||||||
type IPv6 = 6;
|
function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
||||||
|
function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
||||||
type Family = IPv4 | IPv6 | undefined;
|
function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void): void;
|
||||||
|
function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void): void;
|
||||||
interface IRunOptions {
|
function lookup(hostname: string, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void;
|
||||||
family?: Family;
|
|
||||||
all?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
type RunCallback = (error: Error | null, address?: string | string[], family?: Family) => void;
|
|
||||||
|
|
||||||
export function lookup(hostname: string, options: IRunOptions | Family, callback: RunCallback): {} | undefined;
|
|
||||||
export function lookup(hostname: string, callback: RunCallback): {} | undefined;
|
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/@types/promise-any.d.ts
vendored
7
src/@types/promise-any.d.ts
vendored
@@ -1,7 +0,0 @@
|
|||||||
declare module 'promise-any' {
|
|
||||||
function promiseAny<T>(iterable: Iterable<T | PromiseLike<T>>): Promise<T>;
|
|
||||||
|
|
||||||
namespace promiseAny {} // Hack
|
|
||||||
|
|
||||||
export = promiseAny;
|
|
||||||
}
|
|
||||||
@@ -50,7 +50,7 @@ export async function masterMain() {
|
|||||||
// initialize app
|
// initialize app
|
||||||
config = await init();
|
config = await init();
|
||||||
|
|
||||||
if (config.port == null) {
|
if (config.port == null || Number.isNaN(config.port)) {
|
||||||
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
@@ -79,6 +79,7 @@ export async function masterMain() {
|
|||||||
require('../daemons/server-stats').default();
|
require('../daemons/server-stats').default();
|
||||||
require('../daemons/notes-stats').default();
|
require('../daemons/notes-stats').default();
|
||||||
require('../daemons/queue-stats').default();
|
require('../daemons/queue-stats').default();
|
||||||
|
require('../daemons/janitor').default();
|
||||||
}
|
}
|
||||||
|
|
||||||
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
|
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
|
||||||
@@ -158,7 +159,7 @@ async function init(): Promise<Config> {
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function spawnWorkers(limit: number = Infinity) {
|
async function spawnWorkers(limit: number = 1) {
|
||||||
const workers = Math.min(limit, os.cpus().length);
|
const workers = Math.min(limit, os.cpus().length);
|
||||||
bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
|
bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
|
||||||
await Promise.all([...Array(workers)].map(spawnWorker));
|
await Promise.all([...Array(workers)].map(spawnWorker));
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ init(launch => {
|
|||||||
mode: 'history',
|
mode: 'history',
|
||||||
base: '/admin/',
|
base: '/admin/',
|
||||||
routes: [
|
routes: [
|
||||||
{ path: '/', component: Index },
|
{ path: '/:page', component: Index },
|
||||||
|
{ path: '/', redirect: '/dashboard' },
|
||||||
{ path: '*', component: NotFound }
|
{ path: '*', component: NotFound }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ export default Vue.extend({
|
|||||||
this.connection = this.$root.stream.useSharedConnection('serverStats');
|
this.connection = this.$root.stream.useSharedConnection('serverStats');
|
||||||
|
|
||||||
this.updateStats();
|
this.updateStats();
|
||||||
this.clock = setInterval(this.updateStats, 1000);
|
this.clock = setInterval(this.updateStats, 3000);
|
||||||
|
|
||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta().then(meta => {
|
||||||
this.meta = meta;
|
this.meta = meta;
|
||||||
|
|||||||
61
src/client/app/admin/views/db.vue
Normal file
61
src/client/app/admin/views/db.vue
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faDatabase"/> {{ $t('tables') }}</template>
|
||||||
|
<section v-if="tables">
|
||||||
|
<div v-for="table in Object.keys(tables)"><b>{{ table }}</b> {{ tables[table].count | number }} {{ tables[table].size | bytes }}</div>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<header><fa :icon="faBroom"/> {{ $t('vacuum') }}</header>
|
||||||
|
<ui-info>{{ $t('vacuum-info') }}</ui-info>
|
||||||
|
<ui-switch v-model="fullVacuum">FULL</ui-switch>
|
||||||
|
<ui-switch v-model="analyzeVacuum">ANALYZE</ui-switch>
|
||||||
|
<ui-button @click="vacuum()"><fa :icon="faBroom"/> {{ $t('vacuum') }}</ui-button>
|
||||||
|
<ui-info warn>{{ $t('vacuum-exclamation') }}</ui-info>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import { faDatabase, faBroom } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('admin/views/db.vue'),
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
tables: null,
|
||||||
|
fullVacuum: true,
|
||||||
|
analyzeVacuum: true,
|
||||||
|
faDatabase, faBroom
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.$root.api('admin/get-table-stats').then(tables => {
|
||||||
|
this.tables = tables;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
vacuum() {
|
||||||
|
this.$root.api('admin/vacuum', {
|
||||||
|
full: this.fullVacuum,
|
||||||
|
analyze: this.analyzeVacuum,
|
||||||
|
}).then(() => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -14,6 +14,10 @@
|
|||||||
<ui-button @click="show()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button @click="show()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
<ui-textarea v-if="file" :value="file | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
<ui-textarea v-if="file" :value="file | json5" readonly tall style="margin-top:16px;"></ui-textarea>
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<ui-button @click="cleanUp()"><fa :icon="faTrashAlt"/> {{ $t('clean-up') }}</ui-button>
|
||||||
|
<ui-button @click="cleanRemoteFiles()"><fa :icon="faTrashAlt"/> {{ $t('clean-remote-files') }}</ui-button>
|
||||||
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
@@ -227,6 +231,29 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
cleanRemoteFiles() {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('clean-remote-files-are-you-sure'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
this.$root.api('admin/drive/clean-remote-files');
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
cleanUp() {
|
||||||
|
this.$root.api('admin/drive/cleanup');
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
saveBlockedHosts() {
|
saveBlockedHosts() {
|
||||||
this.$root.api('admin/update-meta', {
|
this.$root.api('admin/update-meta', {
|
||||||
blockedHosts: this.blockedHosts.split('\n')
|
blockedHosts: this.blockedHosts ? this.blockedHosts.split('\n') : []
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
|
|||||||
@@ -18,17 +18,18 @@
|
|||||||
<p class="name"><mk-user-name :user="$store.state.i"/></p>
|
<p class="name"><mk-user-name :user="$store.state.i"/></p>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</li>
|
<li><router-link to="/dashboard" active-class="active"><fa icon="home" fixed-width/>{{ $t('dashboard') }}</router-link></li>
|
||||||
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
<li><router-link to="/instance" active-class="active"><fa icon="cog" fixed-width/>{{ $t('instance') }}</router-link></li>
|
||||||
<li @click="nav('queue')" :class="{ active: page == 'queue' }"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</li>
|
<li><router-link to="/queue" active-class="active"><fa :icon="faTasks" fixed-width/>{{ $t('queue') }}</router-link></li>
|
||||||
<li @click="nav('logs')" :class="{ active: page == 'logs' }"><fa :icon="faStream" fixed-width/>{{ $t('logs') }}</li>
|
<li><router-link to="/logs" active-class="active"><fa :icon="faStream" fixed-width/>{{ $t('logs') }}</router-link></li>
|
||||||
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
|
<li><router-link to="/db" active-class="active"><fa :icon="faDatabase" fixed-width/>{{ $t('db') }}</router-link></li>
|
||||||
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
|
<li><router-link to="/moderators" active-class="active"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</router-link></li>
|
||||||
<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
|
<li><router-link to="/users" active-class="active"><fa icon="users" fixed-width/>{{ $t('users') }}</router-link></li>
|
||||||
<li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</li>
|
<li><router-link to="/drive" active-class="active"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</router-link></li>
|
||||||
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
|
<li><router-link to="/federation" active-class="active"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</router-link></li>
|
||||||
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
|
<li><router-link to="/emoji" active-class="active"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</router-link></li>
|
||||||
<li @click="nav('abuse')" :class="{ active: page == 'abuse' }"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</li>
|
<li><router-link to="/announcements" active-class="active"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</router-link></li>
|
||||||
|
<li><router-link to="/abuse" active-class="active"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</router-link></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="back-to-misskey">
|
<div class="back-to-misskey">
|
||||||
<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
|
<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
|
||||||
@@ -43,6 +44,7 @@
|
|||||||
<div v-if="page == 'instance'"><x-instance/></div>
|
<div v-if="page == 'instance'"><x-instance/></div>
|
||||||
<div v-if="page == 'queue'"><x-queue/></div>
|
<div v-if="page == 'queue'"><x-queue/></div>
|
||||||
<div v-if="page == 'logs'"><x-logs/></div>
|
<div v-if="page == 'logs'"><x-logs/></div>
|
||||||
|
<div v-if="page == 'db'"><x-db/></div>
|
||||||
<div v-if="page == 'moderators'"><x-moderators/></div>
|
<div v-if="page == 'moderators'"><x-moderators/></div>
|
||||||
<div v-if="page == 'users'"><x-users/></div>
|
<div v-if="page == 'users'"><x-users/></div>
|
||||||
<div v-if="page == 'emoji'"><x-emoji/></div>
|
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||||
@@ -59,19 +61,20 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { version } from '../../config';
|
import { version } from '../../config';
|
||||||
import XDashboard from "./dashboard.vue";
|
import XDashboard from './dashboard.vue';
|
||||||
import XInstance from "./instance.vue";
|
import XInstance from './instance.vue';
|
||||||
import XQueue from "./queue.vue";
|
import XQueue from './queue.vue';
|
||||||
import XLogs from "./logs.vue";
|
import XLogs from './logs.vue';
|
||||||
import XModerators from "./moderators.vue";
|
import XDb from './db.vue';
|
||||||
import XEmoji from "./emoji.vue";
|
import XModerators from './moderators.vue';
|
||||||
import XAnnouncements from "./announcements.vue";
|
import XEmoji from './emoji.vue';
|
||||||
import XUsers from "./users.vue";
|
import XAnnouncements from './announcements.vue';
|
||||||
import XDrive from "./drive.vue";
|
import XUsers from './users.vue';
|
||||||
import XAbuse from "./abuse.vue";
|
import XDrive from './drive.vue';
|
||||||
import XFederation from "./federation.vue";
|
import XAbuse from './abuse.vue';
|
||||||
|
import XFederation from './federation.vue';
|
||||||
|
|
||||||
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream } from '@fortawesome/free-solid-svg-icons';
|
import { faHeadset, faArrowLeft, faGlobe, faExclamationCircle, faTasks, faStream, faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
// Detect the user agent
|
// Detect the user agent
|
||||||
@@ -85,6 +88,7 @@ export default Vue.extend({
|
|||||||
XInstance,
|
XInstance,
|
||||||
XQueue,
|
XQueue,
|
||||||
XLogs,
|
XLogs,
|
||||||
|
XDb,
|
||||||
XModerators,
|
XModerators,
|
||||||
XEmoji,
|
XEmoji,
|
||||||
XAnnouncements,
|
XAnnouncements,
|
||||||
@@ -98,7 +102,6 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
page: 'dashboard',
|
|
||||||
version,
|
version,
|
||||||
isMobile,
|
isMobile,
|
||||||
navOpend: !isMobile,
|
navOpend: !isMobile,
|
||||||
@@ -108,12 +111,13 @@ export default Vue.extend({
|
|||||||
faGlobe,
|
faGlobe,
|
||||||
faExclamationCircle,
|
faExclamationCircle,
|
||||||
faTasks,
|
faTasks,
|
||||||
faStream
|
faStream,
|
||||||
|
faDatabase,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
computed: {
|
||||||
nav(page: string) {
|
page() {
|
||||||
this.page = page;
|
return this.$route.params.page;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -235,11 +239,10 @@ export default Vue.extend({
|
|||||||
list-style none
|
list-style none
|
||||||
font-size 15px
|
font-size 15px
|
||||||
|
|
||||||
> li
|
> li > a
|
||||||
display block
|
display block
|
||||||
padding 10px 16px
|
padding 10px 16px
|
||||||
margin 0
|
margin 0
|
||||||
cursor pointer
|
|
||||||
user-select none
|
user-select none
|
||||||
color #eee
|
color #eee
|
||||||
transition margin-left 0.2s ease
|
transition margin-left 0.2s ease
|
||||||
|
|||||||
@@ -129,6 +129,7 @@
|
|||||||
<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
|
||||||
|
<ui-button @click="testEmail()">{{ $t('test-email') }}</ui-button>
|
||||||
</template>
|
</template>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
@@ -424,6 +425,24 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async testEmail() {
|
||||||
|
this.$root.api('admin/send-email', {
|
||||||
|
to: this.maintainerEmail,
|
||||||
|
subject: 'Test email',
|
||||||
|
text: 'Yo'
|
||||||
|
}).then(x => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
splash: true
|
||||||
|
});
|
||||||
|
}).catch(e => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
updateMeta() {
|
updateMeta() {
|
||||||
this.$root.api('admin/update-meta', {
|
this.$root.api('admin/update-meta', {
|
||||||
maintainerName: this.maintainerName,
|
maintainerName: this.maintainerName,
|
||||||
@@ -442,7 +461,7 @@ export default Vue.extend({
|
|||||||
iconUrl: this.iconUrl,
|
iconUrl: this.iconUrl,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
description: this.description,
|
description: this.description,
|
||||||
langs: this.languages.split(' '),
|
langs: this.languages ? this.languages.split(' ') : [],
|
||||||
cacheRemoteFiles: this.cacheRemoteFiles,
|
cacheRemoteFiles: this.cacheRemoteFiles,
|
||||||
localDriveCapacityMb: parseInt(this.localDriveCapacityMb, 10),
|
localDriveCapacityMb: parseInt(this.localDriveCapacityMb, 10),
|
||||||
remoteDriveCapacityMb: parseInt(this.remoteDriveCapacityMb, 10),
|
remoteDriveCapacityMb: parseInt(this.remoteDriveCapacityMb, 10),
|
||||||
@@ -471,8 +490,8 @@ export default Vue.extend({
|
|||||||
enableServiceWorker: this.enableServiceWorker,
|
enableServiceWorker: this.enableServiceWorker,
|
||||||
swPublicKey: this.swPublicKey,
|
swPublicKey: this.swPublicKey,
|
||||||
swPrivateKey: this.swPrivateKey,
|
swPrivateKey: this.swPrivateKey,
|
||||||
pinnedUsers: this.pinnedUsers.split('\n'),
|
pinnedUsers: this.pinnedUsers ? this.pinnedUsers.split('\n') : [],
|
||||||
hiddenTags: this.hiddenTags.split('\n'),
|
hiddenTags: this.hiddenTags ? this.hiddenTags.split('\n') : [],
|
||||||
useObjectStorage: this.useObjectStorage,
|
useObjectStorage: this.useObjectStorage,
|
||||||
objectStorageBaseUrl: this.objectStorageBaseUrl ? this.objectStorageBaseUrl : null,
|
objectStorageBaseUrl: this.objectStorageBaseUrl ? this.objectStorageBaseUrl : null,
|
||||||
objectStorageBucket: this.objectStorageBucket ? this.objectStorageBucket : null,
|
objectStorageBucket: this.objectStorageBucket ? this.objectStorageBucket : null,
|
||||||
|
|||||||
@@ -12,6 +12,31 @@
|
|||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title>{{ $t('logs.title') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
|
<div v-for="log in logs" :key="log.id" class="">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-input :value="log.user | acct" type="text" readonly>
|
||||||
|
<span>{{ $t('logs.moderator') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="log.type" type="text" readonly>
|
||||||
|
<span>{{ $t('logs.type') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="log.createdAt | date" type="text" readonly>
|
||||||
|
<span>{{ $t('logs.at') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-textarea :value="JSON.stringify(log.info, null, 4)" readonly>
|
||||||
|
<span>{{ $t('logs.info') }}</span>
|
||||||
|
</ui-textarea>
|
||||||
|
</div>
|
||||||
|
</sequential-entrance>
|
||||||
|
<ui-button v-if="existMoreLogs" @click="fetchLogs">{{ $t('@.load-more') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -26,10 +51,17 @@ export default Vue.extend({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
username: '',
|
username: '',
|
||||||
changing: false
|
changing: false,
|
||||||
|
logs: [],
|
||||||
|
untilLogId: null,
|
||||||
|
existMoreLogs: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.fetchLogs();
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
async add() {
|
async add() {
|
||||||
this.changing = true;
|
this.changing = true;
|
||||||
@@ -74,6 +106,22 @@ export default Vue.extend({
|
|||||||
|
|
||||||
this.changing = false;
|
this.changing = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
fetchLogs() {
|
||||||
|
this.$root.api('admin/show-moderation-logs', {
|
||||||
|
untilId: this.untilId,
|
||||||
|
limit: 10 + 1
|
||||||
|
}).then(logs => {
|
||||||
|
if (logs.length == 10 + 1) {
|
||||||
|
logs.pop();
|
||||||
|
this.existMoreLogs = true;
|
||||||
|
} else {
|
||||||
|
this.existMoreLogs = false;
|
||||||
|
}
|
||||||
|
this.logs = this.logs.concat(logs);
|
||||||
|
this.untilLogId = this.logs[this.logs.length - 1].id;
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
181
src/client/app/admin/views/queue.chart.vue
Normal file
181
src/client/app/admin/views/queue.chart.vue
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<ui-info warn v-if="latestStats && latestStats.waiting > 0">The queue is jammed.</ui-info>
|
||||||
|
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
||||||
|
<ui-input :value="latestStats.activeSincePrevTick | number" type="text" readonly>
|
||||||
|
<span>Process</span>
|
||||||
|
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
||||||
|
<template #suffix>jobs/tick</template>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="latestStats.active | number" type="text" readonly>
|
||||||
|
<span>Active</span>
|
||||||
|
<template #prefix><fa :icon="farPlayCircle"/></template>
|
||||||
|
<template #suffix>jobs</template>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="latestStats.waiting | number" type="text" readonly>
|
||||||
|
<span>Waiting</span>
|
||||||
|
<template #prefix><fa :icon="faStopCircle"/></template>
|
||||||
|
<template #suffix>jobs</template>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input :value="latestStats.delayed | number" type="text" readonly>
|
||||||
|
<span>Delayed</span>
|
||||||
|
<template #prefix><fa :icon="faStopwatch"/></template>
|
||||||
|
<template #suffix>jobs</template>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<div ref="chart" class="wptihjuy"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import ApexCharts from 'apexcharts';
|
||||||
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
import { faStopwatch, faPlayCircle as fasPlayCircle } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faStopCircle, faPlayCircle as farPlayCircle } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('admin/views/queue.vue'),
|
||||||
|
|
||||||
|
props: {
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
connection: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
limit: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
stats: [],
|
||||||
|
chart: null,
|
||||||
|
faStopwatch, faStopCircle, farPlayCircle, fasPlayCircle
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
latestStats(): any {
|
||||||
|
return this.stats.length > 0 ? this.stats[this.stats.length - 1][this.type] : null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
stats(stats) {
|
||||||
|
this.chart.updateSeries([{
|
||||||
|
name: 'Process',
|
||||||
|
type: 'area',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].activeSincePrevTick }))
|
||||||
|
}, {
|
||||||
|
name: 'Active',
|
||||||
|
type: 'area',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].active }))
|
||||||
|
}, {
|
||||||
|
name: 'Waiting',
|
||||||
|
type: 'line',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].waiting }))
|
||||||
|
}, {
|
||||||
|
name: 'Delayed',
|
||||||
|
type: 'line',
|
||||||
|
data: stats.map((x, i) => ({ x: i, y: x[this.type].delayed }))
|
||||||
|
}]);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.chart = new ApexCharts(this.$refs.chart, {
|
||||||
|
chart: {
|
||||||
|
id: this.type,
|
||||||
|
group: 'queue',
|
||||||
|
type: 'area',
|
||||||
|
height: 200,
|
||||||
|
animations: {
|
||||||
|
dynamicAnimation: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
zoom: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||||
|
xaxis: {
|
||||||
|
lines: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
curve: 'straight',
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
labels: {
|
||||||
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
series: [] as any,
|
||||||
|
colors: ['#00E396', '#00BCD4', '#FFB300', '#e53935'],
|
||||||
|
xaxis: {
|
||||||
|
type: 'numeric',
|
||||||
|
labels: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: false,
|
||||||
|
min: 0,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.chart.render();
|
||||||
|
|
||||||
|
this.connection.on('stats', this.onStats);
|
||||||
|
this.connection.on('statsLog', this.onStatsLog);
|
||||||
|
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
if (this.chart) this.chart.destroy();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onStats(stats) {
|
||||||
|
this.stats.push(stats);
|
||||||
|
if (this.stats.length > this.limit) this.stats.shift();
|
||||||
|
},
|
||||||
|
|
||||||
|
onStatsLog(statsLog) {
|
||||||
|
for (const stats of statsLog.reverse()) {
|
||||||
|
this.onStats(stats);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.wptihjuy
|
||||||
|
min-height 200px !important
|
||||||
|
margin -8px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -2,59 +2,27 @@
|
|||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="faChartBar"/> {{ $t('title') }}</template>
|
<template #title><fa :icon="faChartBar"/> {{ $t('title') }}</template>
|
||||||
<section class="wptihjuy">
|
<section>
|
||||||
<header><fa :icon="faPaperPlane"/> Deliver</header>
|
<header><fa :icon="faPaperPlane"/> {{ $t('domains.deliver') }}</header>
|
||||||
<ui-info warn v-if="latestStats && latestStats.deliver.waiting > 0">The queue is jammed.</ui-info>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="deliver"/>
|
||||||
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
|
||||||
<ui-input :value="latestStats.deliver.activeSincePrevTick | number" type="text" readonly>
|
|
||||||
<span>Process</span>
|
|
||||||
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
|
||||||
<template #suffix>jobs/tick</template>
|
|
||||||
</ui-input>
|
|
||||||
<ui-input :value="latestStats.deliver.active | number" type="text" readonly>
|
|
||||||
<span>Active</span>
|
|
||||||
<template #prefix><fa :icon="farPlayCircle"/></template>
|
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
<ui-input :value="latestStats.deliver.waiting | number" type="text" readonly>
|
|
||||||
<span>Waiting</span>
|
|
||||||
<template #prefix><fa :icon="faStopCircle"/></template>
|
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
<ui-input :value="latestStats.deliver.delayed | number" type="text" readonly>
|
|
||||||
<span>Delayed</span>
|
|
||||||
<template #prefix><fa :icon="faStopwatch"/></template>
|
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
</ui-horizon-group>
|
|
||||||
<div ref="deliverChart" class="chart"></div>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="wptihjuy">
|
<section>
|
||||||
<header><fa :icon="faInbox"/> Inbox</header>
|
<header><fa :icon="faInbox"/> {{ $t('domains.inbox') }}</header>
|
||||||
<ui-info warn v-if="latestStats && latestStats.inbox.waiting > 0">The queue is jammed.</ui-info>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="inbox"/>
|
||||||
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
</section>
|
||||||
<ui-input :value="latestStats.inbox.activeSincePrevTick | number" type="text" readonly>
|
<section>
|
||||||
<span>Process</span>
|
<details>
|
||||||
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
<summary>{{ $t('other-queues') }}</summary>
|
||||||
<template #suffix>jobs/tick</template>
|
<section>
|
||||||
</ui-input>
|
<header><fa :icon="faDatabase"/> {{ $t('domains.db') }}</header>
|
||||||
<ui-input :value="latestStats.inbox.active | number" type="text" readonly>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="db"/>
|
||||||
<span>Active</span>
|
</section>
|
||||||
<template #prefix><fa :icon="farPlayCircle"/></template>
|
<ui-hr/>
|
||||||
<template #suffix>jobs</template>
|
<section>
|
||||||
</ui-input>
|
<header><fa :icon="faCloud"/> {{ $t('domains.objectStorage') }}</header>
|
||||||
<ui-input :value="latestStats.inbox.waiting | number" type="text" readonly>
|
<x-chart v-if="connection" :connection="connection" :limit="chartLimit" type="objectStorage"/>
|
||||||
<span>Waiting</span>
|
</section>
|
||||||
<template #prefix><fa :icon="faStopCircle"/></template>
|
</details>
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
<ui-input :value="latestStats.inbox.delayed | number" type="text" readonly>
|
|
||||||
<span>Delayed</span>
|
|
||||||
<template #prefix><fa :icon="faStopwatch"/></template>
|
|
||||||
<template #suffix>jobs</template>
|
|
||||||
</ui-input>
|
|
||||||
</ui-horizon-group>
|
|
||||||
<div ref="inboxChart" class="chart"></div>
|
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
||||||
@@ -69,9 +37,13 @@
|
|||||||
<template #label>{{ $t('queue') }}</template>
|
<template #label>{{ $t('queue') }}</template>
|
||||||
<option value="deliver">{{ $t('domains.deliver') }}</option>
|
<option value="deliver">{{ $t('domains.deliver') }}</option>
|
||||||
<option value="inbox">{{ $t('domains.inbox') }}</option>
|
<option value="inbox">{{ $t('domains.inbox') }}</option>
|
||||||
|
<option value="db">{{ $t('domains.db') }}</option>
|
||||||
|
<option value="objectStorage">{{ $t('domains.objectStorage') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
<ui-select v-model="state">
|
<ui-select v-model="state">
|
||||||
<template #label>{{ $t('state') }}</template>
|
<template #label>{{ $t('state') }}</template>
|
||||||
|
<option value="active">{{ $t('states.active') }}</option>
|
||||||
|
<option value="waiting">{{ $t('states.waiting') }}</option>
|
||||||
<option value="delayed">{{ $t('states.delayed') }}</option>
|
<option value="delayed">{{ $t('states.delayed') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
@@ -94,74 +66,31 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
import { faTasks, faInbox, faDatabase, faCloud } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faPaperPlane, faChartBar } from '@fortawesome/free-regular-svg-icons';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import ApexCharts from 'apexcharts';
|
import XChart from './queue.chart.vue';
|
||||||
import * as tinycolor from 'tinycolor2';
|
|
||||||
import { faTasks, faInbox, faStopwatch, faPlayCircle as fasPlayCircle } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { faPaperPlane, faStopCircle, faPlayCircle as farPlayCircle, faChartBar } from '@fortawesome/free-regular-svg-icons';
|
|
||||||
|
|
||||||
const limit = 200;
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/queue.vue'),
|
i18n: i18n('admin/views/queue.vue'),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XChart
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
stats: [],
|
connection: null,
|
||||||
deliverChart: null,
|
chartLimit: 200,
|
||||||
inboxChart: null,
|
|
||||||
jobs: [],
|
jobs: [],
|
||||||
jobsLimit: 50,
|
jobsLimit: 50,
|
||||||
domain: 'deliver',
|
domain: 'deliver',
|
||||||
state: 'delayed',
|
state: 'delayed',
|
||||||
faTasks, faPaperPlane, faInbox, faStopwatch, faStopCircle, farPlayCircle, fasPlayCircle, faChartBar
|
faTasks, faPaperPlane, faInbox, faChartBar, faDatabase, faCloud
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
|
||||||
latestStats(): any {
|
|
||||||
return this.stats[this.stats.length - 1];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
stats(stats) {
|
|
||||||
this.inboxChart.updateSeries([{
|
|
||||||
name: 'Process',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.activeSincePrevTick }))
|
|
||||||
}, {
|
|
||||||
name: 'Active',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.active }))
|
|
||||||
}, {
|
|
||||||
name: 'Waiting',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.waiting }))
|
|
||||||
}, {
|
|
||||||
name: 'Delayed',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.delayed }))
|
|
||||||
}]);
|
|
||||||
this.deliverChart.updateSeries([{
|
|
||||||
name: 'Process',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.activeSincePrevTick }))
|
|
||||||
}, {
|
|
||||||
name: 'Active',
|
|
||||||
type: 'area',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.active }))
|
|
||||||
}, {
|
|
||||||
name: 'Waiting',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.waiting }))
|
|
||||||
}, {
|
|
||||||
name: 'Delayed',
|
|
||||||
type: 'line',
|
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.delayed }))
|
|
||||||
}]);
|
|
||||||
},
|
|
||||||
|
|
||||||
domain() {
|
domain() {
|
||||||
this.jobs = [];
|
this.jobs = [];
|
||||||
this.fetchJobs();
|
this.fetchJobs();
|
||||||
@@ -176,83 +105,14 @@ export default Vue.extend({
|
|||||||
mounted() {
|
mounted() {
|
||||||
this.fetchJobs();
|
this.fetchJobs();
|
||||||
|
|
||||||
const chartOpts = id => ({
|
this.connection = this.$root.stream.useSharedConnection('queueStats');
|
||||||
chart: {
|
this.connection.send('requestLog', {
|
||||||
id,
|
|
||||||
group: 'queue',
|
|
||||||
type: 'area',
|
|
||||||
height: 200,
|
|
||||||
animations: {
|
|
||||||
dynamicAnimation: {
|
|
||||||
enabled: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
toolbar: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
zoom: {
|
|
||||||
enabled: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dataLabels: {
|
|
||||||
enabled: false
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
clipMarkers: false,
|
|
||||||
borderColor: 'rgba(0, 0, 0, 0.1)',
|
|
||||||
xaxis: {
|
|
||||||
lines: {
|
|
||||||
show: true,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
stroke: {
|
|
||||||
curve: 'straight',
|
|
||||||
width: 2
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
enabled: false
|
|
||||||
},
|
|
||||||
legend: {
|
|
||||||
labels: {
|
|
||||||
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
|
||||||
},
|
|
||||||
},
|
|
||||||
series: [] as any,
|
|
||||||
colors: ['#00E396', '#00BCD4', '#FFB300', '#e53935'],
|
|
||||||
xaxis: {
|
|
||||||
type: 'numeric',
|
|
||||||
labels: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
enabled: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
yaxis: {
|
|
||||||
show: false,
|
|
||||||
min: 0,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.inboxChart = new ApexCharts(this.$refs.inboxChart, chartOpts('a'));
|
|
||||||
this.deliverChart = new ApexCharts(this.$refs.deliverChart, chartOpts('b'));
|
|
||||||
|
|
||||||
this.inboxChart.render();
|
|
||||||
this.deliverChart.render();
|
|
||||||
|
|
||||||
const connection = this.$root.stream.useSharedConnection('queueStats');
|
|
||||||
connection.on('stats', this.onStats);
|
|
||||||
connection.on('statsLog', this.onStatsLog);
|
|
||||||
connection.send('requestLog', {
|
|
||||||
id: Math.random().toString().substr(2, 8),
|
id: Math.random().toString().substr(2, 8),
|
||||||
length: limit
|
length: this.chartLimit
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$once('hook:beforeDestroy', () => {
|
this.$once('hook:beforeDestroy', () => {
|
||||||
connection.dispose();
|
this.connection.dispose();
|
||||||
this.inboxChart.destroy();
|
|
||||||
this.deliverChart.destroy();
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -274,17 +134,6 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onStats(stats) {
|
|
||||||
this.stats.push(stats);
|
|
||||||
if (this.stats.length > limit) this.stats.shift();
|
|
||||||
},
|
|
||||||
|
|
||||||
onStatsLog(statsLog) {
|
|
||||||
for (const stats of statsLog.reverse()) {
|
|
||||||
this.onStats(stats);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
fetchJobs() {
|
fetchJobs() {
|
||||||
this.$root.api('admin/queue/jobs', {
|
this.$root.api('admin/queue/jobs', {
|
||||||
domain: this.domain,
|
domain: this.domain,
|
||||||
@@ -299,11 +148,6 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.wptihjuy
|
|
||||||
> .chart
|
|
||||||
min-height 200px !important
|
|
||||||
margin 0 -8px
|
|
||||||
|
|
||||||
.xvvuvgsv
|
.xvvuvgsv
|
||||||
> b
|
> b
|
||||||
margin-right 16px
|
margin-right 16px
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div @click="click(user.id)">
|
||||||
<header>
|
<header>
|
||||||
<b><mk-user-name :user="user"/></b>
|
<b><mk-user-name :user="user"/></b>
|
||||||
<span class="username">@{{ user | acct }}</span>
|
<span class="username">@{{ user | acct }}</span>
|
||||||
@@ -32,7 +32,7 @@ import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
|||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/users.vue'),
|
i18n: i18n('admin/views/users.vue'),
|
||||||
props: ['user'],
|
props: ['user', 'click'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
faSnowflake, faMicrophoneSlash
|
faSnowflake, faMicrophoneSlash
|
||||||
@@ -44,7 +44,7 @@ export default Vue.extend({
|
|||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.kofvwchc
|
.kofvwchc
|
||||||
display flex
|
display flex
|
||||||
padding 16px 0
|
padding 16px
|
||||||
border-top solid 1px var(--faceDivider)
|
border-top solid 1px var(--faceDivider)
|
||||||
|
|
||||||
> div:first-child
|
> div:first-child
|
||||||
@@ -55,6 +55,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> div:last-child
|
> div:last-child
|
||||||
flex 1
|
flex 1
|
||||||
|
cursor pointer
|
||||||
padding-left 16px
|
padding-left 16px
|
||||||
|
|
||||||
@media (max-width 500px)
|
@media (max-width 500px)
|
||||||
@@ -80,4 +81,15 @@ export default Vue.extend({
|
|||||||
> .is-suspended
|
> .is-suspended
|
||||||
margin 0 0 0 .5em
|
margin 0 0 0 .5em
|
||||||
color #4dabf7
|
color #4dabf7
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color var(--primaryForeground)
|
||||||
|
background var(--primary)
|
||||||
|
text-decoration none
|
||||||
|
border-radius 3px
|
||||||
|
|
||||||
|
&:active
|
||||||
|
color var(--primaryForeground)
|
||||||
|
background var(--primaryDarken10)
|
||||||
|
border-radius 3px
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button @click="showUser"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
|
|
||||||
<div class="user" v-if="user">
|
<div ref="user" class="user" v-if="user" :key="user.id">
|
||||||
<x-user :user="user"/>
|
<x-user :user="user"/>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
|
<ui-button v-if="user.host != null" @click="updateRemoteUser"><fa :icon="faSync"/> {{ $t('update-remote-user') }}</ui-button>
|
||||||
@@ -42,6 +42,7 @@
|
|||||||
<ui-select v-model="state">
|
<ui-select v-model="state">
|
||||||
<template #label>{{ $t('users.state.title') }}</template>
|
<template #label>{{ $t('users.state.title') }}</template>
|
||||||
<option value="all">{{ $t('users.state.all') }}</option>
|
<option value="all">{{ $t('users.state.all') }}</option>
|
||||||
|
<option value="available">{{ $t('users.state.available') }}</option>
|
||||||
<option value="admin">{{ $t('users.state.admin') }}</option>
|
<option value="admin">{{ $t('users.state.admin') }}</option>
|
||||||
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
||||||
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
||||||
@@ -54,8 +55,16 @@
|
|||||||
<option value="remote">{{ $t('users.origin.remote') }}</option>
|
<option value="remote">{{ $t('users.origin.remote') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
<ui-horizon-group searchboxes>
|
||||||
|
<ui-input v-model="searchUsername" type="text" spellcheck="false" @input="fetchUsers(true)">
|
||||||
|
<span>{{ $t('username') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input v-model="searchHost" type="text" spellcheck="false" @input="fetchUsers(true)" :disabled="origin === 'local'">
|
||||||
|
<span>{{ $t('host') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<x-user v-for="user in users" :user='user' :key="user.id"/>
|
<x-user v-for="user in users" :key="user.id" :user='user' :click="showUserOnClick"/>
|
||||||
</sequential-entrance>
|
</sequential-entrance>
|
||||||
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
@@ -85,6 +94,8 @@ export default Vue.extend({
|
|||||||
sort: '+createdAt',
|
sort: '+createdAt',
|
||||||
state: 'all',
|
state: 'all',
|
||||||
origin: 'local',
|
origin: 'local',
|
||||||
|
searchUsername: '',
|
||||||
|
searchHost: '',
|
||||||
limit: 10,
|
limit: 10,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
users: [],
|
users: [],
|
||||||
@@ -107,6 +118,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
origin() {
|
origin() {
|
||||||
|
if (this.origin === 'local') this.searchHost = '';
|
||||||
this.users = [];
|
this.users = [];
|
||||||
this.offset = 0;
|
this.offset = 0;
|
||||||
this.fetchUsers();
|
this.fetchUsers();
|
||||||
@@ -157,6 +169,15 @@ export default Vue.extend({
|
|||||||
this.target = '';
|
this.target = '';
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async showUserOnClick(userId: string) {
|
||||||
|
this.$root.api('admin/show-user', { userId: userId }).then(info => {
|
||||||
|
this.user = info;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.user.scrollIntoView();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/** 処理対象ユーザーの情報を更新する */
|
/** 処理対象ユーザーの情報を更新する */
|
||||||
async refreshUser() {
|
async refreshUser() {
|
||||||
this.$root.api('admin/show-user', { userId: this.user.id }).then(info => {
|
this.$root.api('admin/show-user', { userId: this.user.id }).then(info => {
|
||||||
@@ -308,13 +329,16 @@ export default Vue.extend({
|
|||||||
return !confirm.canceled;
|
return !confirm.canceled;
|
||||||
},
|
},
|
||||||
|
|
||||||
fetchUsers() {
|
fetchUsers(truncate?: boolean) {
|
||||||
|
if (truncate) this.offset = 0;
|
||||||
this.$root.api('admin/show-users', {
|
this.$root.api('admin/show-users', {
|
||||||
state: this.state,
|
state: this.state,
|
||||||
origin: this.origin,
|
origin: this.origin,
|
||||||
sort: this.sort,
|
sort: this.sort,
|
||||||
offset: this.offset,
|
offset: this.offset,
|
||||||
limit: this.limit + 1
|
limit: this.limit + 1,
|
||||||
|
username: this.searchUsername,
|
||||||
|
hostname: this.searchHost
|
||||||
}).then(users => {
|
}).then(users => {
|
||||||
if (users.length == this.limit + 1) {
|
if (users.length == this.limit + 1) {
|
||||||
users.pop();
|
users.pop();
|
||||||
@@ -322,7 +346,7 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
this.users = this.users.concat(users);
|
this.users = truncate ? users : this.users.concat(users);
|
||||||
this.offset += this.limit;
|
this.offset += this.limit;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<header>
|
<header>
|
||||||
<h1 v-html="$t('share-access', { name: app.name })"></h1>
|
<h1 v-html="$t('share-access', { name })"></h1>
|
||||||
<img :src="app.iconUrl"/>
|
<img :src="app.iconUrl"/>
|
||||||
</header>
|
</header>
|
||||||
<div class="app">
|
<div class="app">
|
||||||
@@ -34,6 +34,11 @@ export default Vue.extend({
|
|||||||
i18n: i18n('auth/views/form.vue'),
|
i18n: i18n('auth/views/form.vue'),
|
||||||
props: ['session'],
|
props: ['session'],
|
||||||
computed: {
|
computed: {
|
||||||
|
name(): string {
|
||||||
|
const el = document.createElement('div');
|
||||||
|
el.textContent = this.app.name
|
||||||
|
return el.innerHTML;
|
||||||
|
},
|
||||||
app(): any {
|
app(): any {
|
||||||
return this.session.app;
|
return this.session.app;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
|
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
|
||||||
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
|
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
|
||||||
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
|
if (`${url.pathname}/`.startsWith('/admin/')) app = 'admin';
|
||||||
if (`${url.pathname}/`.startsWith('/test/')) app = 'test';
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// Script version
|
// Script version
|
||||||
@@ -85,22 +84,24 @@
|
|||||||
|
|
||||||
// Detect the user agent
|
// Detect the user agent
|
||||||
const ua = navigator.userAgent.toLowerCase();
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
const isMobile = /mobile|iphone|ipad|android/.test(ua);
|
let isMobile = /mobile|iphone|ipad|android/.test(ua) || window.innerWidth < 576;
|
||||||
|
if (settings && settings.device.appTypeForce) {
|
||||||
|
if (settings.device.appTypeForce === 'mobile') {
|
||||||
|
isMobile = true;
|
||||||
|
} else if (settings.device.appTypeForce === 'desktop') {
|
||||||
|
isMobile = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get the <head> element
|
// Get the <head> element
|
||||||
const head = document.getElementsByTagName('head')[0];
|
const head = document.getElementsByTagName('head')[0];
|
||||||
|
|
||||||
// If mobile, insert the viewport meta tag
|
// If mobile, insert the viewport meta tag
|
||||||
if (isMobile) {
|
if (isMobile) {
|
||||||
const meta = document.createElement('meta');
|
const viewport = document.getElementsByName("viewport").item(0);
|
||||||
meta.setAttribute('name', 'viewport');
|
viewport.setAttribute('content',
|
||||||
meta.setAttribute('content',
|
`${viewport.getAttribute('content')},minimum-scale=1,maximum-scale=1,user-scalable=no`);
|
||||||
'width=device-width,' +
|
head.appendChild(viewport);
|
||||||
'initial-scale=1,' +
|
|
||||||
'minimum-scale=1,' +
|
|
||||||
'maximum-scale=1,' +
|
|
||||||
'user-scalable=no');
|
|
||||||
head.appendChild(meta);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Switch desktop or mobile version
|
// Switch desktop or mobile version
|
||||||
|
|||||||
@@ -60,9 +60,9 @@ export default function <T extends object>(data: {
|
|||||||
|
|
||||||
save() {
|
save() {
|
||||||
if (this.platform == 'deck') {
|
if (this.platform == 'deck') {
|
||||||
this.$store.commit('device/updateDeckColumn', this.column);
|
this.$store.commit('updateDeckColumn', this.column);
|
||||||
} else {
|
} else {
|
||||||
this.$store.commit('device/updateWidget', this.widget);
|
this.$store.commit('updateWidget', this.widget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
src/client/app/common/scripts/2fa.ts
Normal file
5
src/client/app/common/scripts/2fa.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export function hexifyAB(buffer) {
|
||||||
|
return Array.from(new Uint8Array(buffer))
|
||||||
|
.map(item => item.toString(16).padStart(2, 0))
|
||||||
|
.join('');
|
||||||
|
}
|
||||||
@@ -32,6 +32,12 @@ export function collectPageVars(content) {
|
|||||||
type: 'number',
|
type: 'number',
|
||||||
value: 0
|
value: 0
|
||||||
});
|
});
|
||||||
|
} else if (x.type === 'radioButton') {
|
||||||
|
pageVars.push({
|
||||||
|
name: x.name,
|
||||||
|
type: 'string',
|
||||||
|
value: x.default || ''
|
||||||
|
});
|
||||||
} else if (x.children) {
|
} else if (x.children) {
|
||||||
collect(x.children);
|
collect(x.children);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
declare const fuckAdBlock: any;
|
|
||||||
|
|
||||||
export default ($root: any) => {
|
|
||||||
require('fuckadblock');
|
|
||||||
|
|
||||||
function adBlockDetected() {
|
|
||||||
$root.dialog({
|
|
||||||
title: $root.$t('@.adblock.detected'),
|
|
||||||
text: $root.$t('@.adblock.warning')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fuckAdBlock === undefined) {
|
|
||||||
adBlockDetected();
|
|
||||||
} else {
|
|
||||||
fuckAdBlock.onDetected(adBlockDetected);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -4,7 +4,8 @@ const faces = [
|
|||||||
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
||||||
'✌️(´・_・`)✌️',
|
'✌️(´・_・`)✌️',
|
||||||
'(。>﹏<。)',
|
'(。>﹏<。)',
|
||||||
'(Δ・x・Δ)'
|
'(Δ・x・Δ)',
|
||||||
|
'(コ`・ヘ・´ケ)'
|
||||||
];
|
];
|
||||||
|
|
||||||
export default () => faces[Math.floor(Math.random() * faces.length)];
|
export default () => faces[Math.floor(Math.random() * faces.length)];
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import { sum, unique } from '../../../../prelude/array';
|
|||||||
import shouldMuteNote from './should-mute-note';
|
import shouldMuteNote from './should-mute-note';
|
||||||
import MkNoteMenu from '../views/components/note-menu.vue';
|
import MkNoteMenu from '../views/components/note-menu.vue';
|
||||||
import MkReactionPicker from '../views/components/reaction-picker.vue';
|
import MkReactionPicker from '../views/components/reaction-picker.vue';
|
||||||
|
import pleaseLogin from './please-login';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
|
||||||
function focus(el, fn) {
|
function focus(el, fn) {
|
||||||
const target = fn(el);
|
const target = fn(el);
|
||||||
@@ -20,10 +22,13 @@ type Opts = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default (opts: Opts = {}) => ({
|
export default (opts: Opts = {}) => ({
|
||||||
|
i18n: i18n(),
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
showContent: false,
|
showContent: false,
|
||||||
hideThisNote: false
|
hideThisNote: false,
|
||||||
|
openingMenu: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -83,9 +88,19 @@ export default (opts: Opts = {}) => ({
|
|||||||
if (this.appearNote.text) {
|
if (this.appearNote.text) {
|
||||||
const ast = parse(this.appearNote.text);
|
const ast = parse(this.appearNote.text);
|
||||||
// TODO: 再帰的にURL要素がないか調べる
|
// TODO: 再帰的にURL要素がないか調べる
|
||||||
return unique(ast
|
const urls = unique(ast
|
||||||
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
|
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
|
||||||
.map(t => t.node.props.url));
|
.map(t => t.node.props.url));
|
||||||
|
|
||||||
|
// unique without hash
|
||||||
|
// [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ]
|
||||||
|
const removeHash = x => x.replace(/#[^#]*$/, '');
|
||||||
|
|
||||||
|
return urls.reduce((array, url) => {
|
||||||
|
const removed = removeHash(url);
|
||||||
|
if (!array.map(x => removeHash(x)).includes(removed)) array.push(url);
|
||||||
|
return array;
|
||||||
|
}, []);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -98,6 +113,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
reply(viaKeyboard = false) {
|
reply(viaKeyboard = false) {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.$root.$post({
|
this.$root.$post({
|
||||||
reply: this.appearNote,
|
reply: this.appearNote,
|
||||||
animation: !viaKeyboard,
|
animation: !viaKeyboard,
|
||||||
@@ -108,6 +124,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
renote(viaKeyboard = false) {
|
renote(viaKeyboard = false) {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.$root.$post({
|
this.$root.$post({
|
||||||
renote: this.appearNote,
|
renote: this.appearNote,
|
||||||
animation: !viaKeyboard,
|
animation: !viaKeyboard,
|
||||||
@@ -124,13 +141,17 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
react(viaKeyboard = false) {
|
react(viaKeyboard = false) {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.blur();
|
this.blur();
|
||||||
this.$root.new(MkReactionPicker, {
|
const w = this.$root.new(MkReactionPicker, {
|
||||||
source: this.$refs.reactButton,
|
source: this.$refs.reactButton,
|
||||||
note: this.appearNote,
|
note: this.appearNote,
|
||||||
showFocus: viaKeyboard,
|
showFocus: viaKeyboard,
|
||||||
animation: !viaKeyboard
|
animation: !viaKeyboard
|
||||||
}).$once('closed', this.focus);
|
}).$once('closed', this.focus);
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
w.close();
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
reactDirectly(reaction) {
|
reactDirectly(reaction) {
|
||||||
@@ -149,6 +170,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
favorite() {
|
favorite() {
|
||||||
|
pleaseLogin(this.$root);
|
||||||
this.$root.api('notes/favorites/create', {
|
this.$root.api('notes/favorites/create', {
|
||||||
noteId: this.appearNote.id
|
noteId: this.appearNote.id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
@@ -160,17 +182,33 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
del() {
|
del() {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('@.delete-confirm'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
|
||||||
this.$root.api('notes/delete', {
|
this.$root.api('notes/delete', {
|
||||||
noteId: this.appearNote.id
|
noteId: this.appearNote.id
|
||||||
});
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
this.$root.new(MkNoteMenu, {
|
if (this.openingMenu) return;
|
||||||
|
this.openingMenu = true;
|
||||||
|
const w = this.$root.new(MkNoteMenu, {
|
||||||
source: this.$refs.menuButton,
|
source: this.$refs.menuButton,
|
||||||
note: this.appearNote,
|
note: this.appearNote,
|
||||||
animation: !viaKeyboard
|
animation: !viaKeyboard
|
||||||
}).$once('closed', this.focus);
|
}).$once('closed', () => {
|
||||||
|
this.openingMenu = false;
|
||||||
|
this.focus();
|
||||||
|
});
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
w.destroyDom();
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
toggleShowContent() {
|
toggleShowContent() {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ export default (opts) => ({
|
|||||||
return {
|
return {
|
||||||
items: [],
|
items: [],
|
||||||
queue: [],
|
queue: [],
|
||||||
|
offset: 0,
|
||||||
fetching: true,
|
fetching: true,
|
||||||
moreFetching: false,
|
moreFetching: false,
|
||||||
inited: false,
|
inited: false,
|
||||||
@@ -43,13 +44,21 @@ export default (opts) => ({
|
|||||||
return window.scrollY <= 8;
|
return window.scrollY <= 8;
|
||||||
};
|
};
|
||||||
|
|
||||||
window.addEventListener('scroll', this.onWindowScroll, { passive: true });
|
window.addEventListener('scroll', this.onScroll, { passive: true });
|
||||||
|
} else if (opts.isContainer) {
|
||||||
|
this.isScrollTop = () => {
|
||||||
|
return this.$el.scrollTop <= 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$el.addEventListener('scroll', this.onScroll, { passive: true });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
if (opts.captureWindowScroll) {
|
if (opts.captureWindowScroll) {
|
||||||
window.removeEventListener('scroll', this.onWindowScroll);
|
window.removeEventListener('scroll', this.onScroll);
|
||||||
|
} else if (opts.isContainer) {
|
||||||
|
this.$el.removeEventListener('scroll', this.onScroll);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -66,6 +75,7 @@ export default (opts) => ({
|
|||||||
|
|
||||||
async init() {
|
async init() {
|
||||||
this.fetching = true;
|
this.fetching = true;
|
||||||
|
if (opts.beforeInit) opts.beforeInit(this);
|
||||||
let params = typeof this.pagination.params === 'function' ? this.pagination.params(true) : this.pagination.params;
|
let params = typeof this.pagination.params === 'function' ? this.pagination.params(true) : this.pagination.params;
|
||||||
if (params && params.then) params = await params;
|
if (params && params.then) params = await params;
|
||||||
await this.$root.api(this.pagination.endpoint, {
|
await this.$root.api(this.pagination.endpoint, {
|
||||||
@@ -80,6 +90,7 @@ export default (opts) => ({
|
|||||||
this.items = x;
|
this.items = x;
|
||||||
this.more = false;
|
this.more = false;
|
||||||
}
|
}
|
||||||
|
this.offset = x.length;
|
||||||
this.inited = true;
|
this.inited = true;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
if (opts.onInited) opts.onInited(this);
|
if (opts.onInited) opts.onInited(this);
|
||||||
@@ -96,7 +107,11 @@ export default (opts) => ({
|
|||||||
if (params && params.then) params = await params;
|
if (params && params.then) params = await params;
|
||||||
await this.$root.api(this.pagination.endpoint, {
|
await this.$root.api(this.pagination.endpoint, {
|
||||||
limit: (this.pagination.limit || 10) + 1,
|
limit: (this.pagination.limit || 10) + 1,
|
||||||
|
...(this.pagination.endpoint === 'notes/search' ? {
|
||||||
|
offset: this.offset,
|
||||||
|
} : {
|
||||||
untilId: this.items[this.items.length - 1].id,
|
untilId: this.items[this.items.length - 1].id,
|
||||||
|
}),
|
||||||
...params
|
...params
|
||||||
}).then(x => {
|
}).then(x => {
|
||||||
if (x.length == (this.pagination.limit || 10) + 1) {
|
if (x.length == (this.pagination.limit || 10) + 1) {
|
||||||
@@ -107,6 +122,7 @@ export default (opts) => ({
|
|||||||
this.items = this.items.concat(x);
|
this.items = this.items.concat(x);
|
||||||
this.more = false;
|
this.more = false;
|
||||||
}
|
}
|
||||||
|
this.offset += x.length;
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
}, e => {
|
}, e => {
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
@@ -144,7 +160,7 @@ export default (opts) => ({
|
|||||||
this.queue = [];
|
this.queue = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
onWindowScroll() {
|
onScroll() {
|
||||||
if (this.isScrollTop()) {
|
if (this.isScrollTop()) {
|
||||||
this.onTop();
|
this.onTop();
|
||||||
}
|
}
|
||||||
@@ -155,8 +171,10 @@ export default (opts) => ({
|
|||||||
// http://d.hatena.ne.jp/favril/20091105/1257403319
|
// http://d.hatena.ne.jp/favril/20091105/1257403319
|
||||||
if (this.$el.offsetHeight == 0) return;
|
if (this.$el.offsetHeight == 0) return;
|
||||||
|
|
||||||
const current = window.scrollY + window.innerHeight;
|
const bottomPosition = opts.isContainer ? this.$el.scrollHeight : document.body.offsetHeight;
|
||||||
if (current > document.body.offsetHeight - 8) this.onBottom();
|
|
||||||
|
const currentBottomPosition = opts.isContainer ? this.$el.scrollTop + this.$el.clientHeight : window.scrollY + window.innerHeight;
|
||||||
|
if (currentBottomPosition > (bottomPosition - 8)) this.onBottom();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
10
src/client/app/common/scripts/please-login.ts
Normal file
10
src/client/app/common/scripts/please-login.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
export default ($root: any) => {
|
||||||
|
if ($root.$store.getters.isSignedIn) return;
|
||||||
|
|
||||||
|
$root.dialog({
|
||||||
|
title: $root.$t('@.signin-required'),
|
||||||
|
text: null
|
||||||
|
});
|
||||||
|
|
||||||
|
throw new Error('signin required');
|
||||||
|
};
|
||||||
537
src/client/app/common/scripts/post-form.ts
Normal file
537
src/client/app/common/scripts/post-form.ts
Normal file
@@ -0,0 +1,537 @@
|
|||||||
|
import insertTextAtCursor from 'insert-text-at-cursor';
|
||||||
|
import { length } from 'stringz';
|
||||||
|
import { toASCII } from 'punycode';
|
||||||
|
import MkVisibilityChooser from '../views/components/visibility-chooser.vue';
|
||||||
|
import getFace from './get-face';
|
||||||
|
import { parse } from '../../../../mfm/parse';
|
||||||
|
import { host, url } from '../../config';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import { erase, unique } from '../../../../prelude/array';
|
||||||
|
import extractMentions from '../../../../misc/extract-mentions';
|
||||||
|
import { formatTimeString } from '../../../../misc/format-time-string';
|
||||||
|
|
||||||
|
export default (opts) => ({
|
||||||
|
i18n: i18n(),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XPostFormAttaches: () => import('../views/components/post-form-attaches.vue').then(m => m.default),
|
||||||
|
XPollEditor: () => import('../views/components/poll-editor.vue').then(m => m.default)
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
reply: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
renote: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
mention: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
initialText: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
initialNote: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
instant: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
posting: false,
|
||||||
|
text: '',
|
||||||
|
files: [],
|
||||||
|
uploadings: [],
|
||||||
|
poll: false,
|
||||||
|
pollChoices: [],
|
||||||
|
pollMultiple: false,
|
||||||
|
pollExpiration: [],
|
||||||
|
useCw: false,
|
||||||
|
cw: null,
|
||||||
|
geo: null,
|
||||||
|
visibility: 'public',
|
||||||
|
visibleUsers: [],
|
||||||
|
localOnly: false,
|
||||||
|
autocomplete: null,
|
||||||
|
draghover: false,
|
||||||
|
quoteId: null,
|
||||||
|
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
|
||||||
|
maxNoteTextLength: 1000
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
draftId(): string {
|
||||||
|
return this.renote
|
||||||
|
? `renote:${this.renote.id}`
|
||||||
|
: this.reply
|
||||||
|
? `reply:${this.reply.id}`
|
||||||
|
: 'note';
|
||||||
|
},
|
||||||
|
|
||||||
|
placeholder(): string {
|
||||||
|
const xs = [
|
||||||
|
this.$t('@.note-placeholders.a'),
|
||||||
|
this.$t('@.note-placeholders.b'),
|
||||||
|
this.$t('@.note-placeholders.c'),
|
||||||
|
this.$t('@.note-placeholders.d'),
|
||||||
|
this.$t('@.note-placeholders.e'),
|
||||||
|
this.$t('@.note-placeholders.f')
|
||||||
|
];
|
||||||
|
const x = xs[Math.floor(Math.random() * xs.length)];
|
||||||
|
|
||||||
|
return this.renote
|
||||||
|
? opts.mobile ? this.$t('@.post-form.option-quote-placeholder') : this.$t('@.post-form.quote-placeholder')
|
||||||
|
: this.reply
|
||||||
|
? this.$t('@.post-form.reply-placeholder')
|
||||||
|
: x;
|
||||||
|
},
|
||||||
|
|
||||||
|
submitText(): string {
|
||||||
|
return this.renote
|
||||||
|
? this.$t('@.post-form.renote')
|
||||||
|
: this.reply
|
||||||
|
? this.$t('@.post-form.reply')
|
||||||
|
: this.$t('@.post-form.submit');
|
||||||
|
},
|
||||||
|
|
||||||
|
canPost(): boolean {
|
||||||
|
return !this.posting &&
|
||||||
|
(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
|
||||||
|
(length(this.text.trim()) <= this.maxNoteTextLength) &&
|
||||||
|
(!this.poll || this.pollChoices.length >= 2);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.$root.getMeta().then(meta => {
|
||||||
|
this.maxNoteTextLength = meta.maxNoteTextLength;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
if (this.initialText) {
|
||||||
|
this.text = this.initialText;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.mention) {
|
||||||
|
this.text = this.mention.host ? `@${this.mention.username}@${toASCII(this.mention.host)}` : `@${this.mention.username}`;
|
||||||
|
this.text += ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.reply && this.reply.user.host != null) {
|
||||||
|
this.text = `@${this.reply.user.username}@${toASCII(this.reply.user.host)} `;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.reply && this.reply.text != null) {
|
||||||
|
const ast = parse(this.reply.text);
|
||||||
|
|
||||||
|
for (const x of extractMentions(ast)) {
|
||||||
|
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
||||||
|
|
||||||
|
// 自分は除外
|
||||||
|
if (this.$store.state.i.username == x.username && x.host == null) continue;
|
||||||
|
if (this.$store.state.i.username == x.username && x.host == host) continue;
|
||||||
|
|
||||||
|
// 重複は除外
|
||||||
|
if (this.text.indexOf(`${mention} `) != -1) continue;
|
||||||
|
|
||||||
|
this.text += `${mention} `;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// デフォルト公開範囲
|
||||||
|
this.applyVisibility(this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility);
|
||||||
|
|
||||||
|
if (this.reply && this.reply.localOnly) {
|
||||||
|
this.localOnly = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 公開以外へのリプライ時は元の公開範囲を引き継ぐ
|
||||||
|
if (this.reply && ['home', 'followers', 'specified'].includes(this.reply.visibility)) {
|
||||||
|
this.visibility = this.reply.visibility;
|
||||||
|
if (this.reply.visibility === 'specified') {
|
||||||
|
this.$root.api('users/show', {
|
||||||
|
userIds: this.reply.visibleUserIds.filter(uid => uid !== this.$store.state.i.id && uid !== this.reply.userId)
|
||||||
|
}).then(users => {
|
||||||
|
this.visibleUsers.push(...users);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.reply.userId !== this.$store.state.i.id) {
|
||||||
|
this.$root.api('users/show', { userId: this.reply.userId }).then(user => {
|
||||||
|
this.visibleUsers.push(user);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep cw when reply
|
||||||
|
if (this.$store.state.settings.keepCw && this.reply && this.reply.cw) {
|
||||||
|
this.useCw = true;
|
||||||
|
this.cw = this.reply.cw;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.focus();
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
// 書きかけの投稿を復元
|
||||||
|
if (!this.instant && !this.mention) {
|
||||||
|
const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId];
|
||||||
|
if (draft) {
|
||||||
|
this.text = draft.data.text;
|
||||||
|
this.files = (draft.data.files || []).filter(e => e);
|
||||||
|
if (draft.data.poll) {
|
||||||
|
this.poll = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
(this.$refs.poll as any).set(draft.data.poll);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 削除して編集
|
||||||
|
if (this.initialNote) {
|
||||||
|
const init = this.initialNote;
|
||||||
|
this.text = init.text ? init.text : '';
|
||||||
|
this.files = init.files;
|
||||||
|
this.cw = init.cw;
|
||||||
|
this.useCw = init.cw != null;
|
||||||
|
if (init.poll) {
|
||||||
|
this.poll = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
(this.$refs.poll as any).set({
|
||||||
|
choices: init.poll.choices.map(c => c.text),
|
||||||
|
multiple: init.poll.multiple
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// hack 位置情報投稿が動くようになったら適用する
|
||||||
|
this.geo = null;
|
||||||
|
this.visibility = init.visibility;
|
||||||
|
this.localOnly = init.localOnly;
|
||||||
|
this.quoteId = init.renote ? init.renote.id : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$nextTick(() => this.watch());
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
watch() {
|
||||||
|
this.$watch('text', () => this.saveDraft());
|
||||||
|
this.$watch('poll', () => this.saveDraft());
|
||||||
|
this.$watch('files', () => this.saveDraft());
|
||||||
|
},
|
||||||
|
|
||||||
|
trimmedLength(text: string) {
|
||||||
|
return length(text.trim());
|
||||||
|
},
|
||||||
|
|
||||||
|
addTag(tag: string) {
|
||||||
|
insertTextAtCursor(this.$refs.text, ` #${tag} `);
|
||||||
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
(this.$refs.text as any).focus();
|
||||||
|
},
|
||||||
|
|
||||||
|
chooseFile() {
|
||||||
|
(this.$refs.file as any).click();
|
||||||
|
},
|
||||||
|
|
||||||
|
chooseFileFromDrive() {
|
||||||
|
this.$chooseDriveFile({
|
||||||
|
multiple: true
|
||||||
|
}).then(files => {
|
||||||
|
for (const x of files) this.attachMedia(x);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
attachMedia(driveFile) {
|
||||||
|
this.files.push(driveFile);
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
},
|
||||||
|
|
||||||
|
detachMedia(id) {
|
||||||
|
this.files = this.files.filter(x => x.id != id);
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
},
|
||||||
|
|
||||||
|
onChangeFile() {
|
||||||
|
for (const x of Array.from((this.$refs.file as any).files)) this.upload(x);
|
||||||
|
},
|
||||||
|
|
||||||
|
upload(file: File, name?: string) {
|
||||||
|
(this.$refs.uploader as any).upload(file, this.$store.state.settings.uploadFolder, name);
|
||||||
|
},
|
||||||
|
|
||||||
|
onChangeUploadings(uploads) {
|
||||||
|
this.$emit('change-uploadings', uploads);
|
||||||
|
},
|
||||||
|
|
||||||
|
onPollUpdate() {
|
||||||
|
const got = this.$refs.poll.get();
|
||||||
|
this.pollChoices = got.choices;
|
||||||
|
this.pollMultiple = got.multiple;
|
||||||
|
this.pollExpiration = [got.expiration, got.expiresAt || got.expiredAfter];
|
||||||
|
this.saveDraft();
|
||||||
|
},
|
||||||
|
|
||||||
|
setGeo() {
|
||||||
|
if (navigator.geolocation == null) {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('@.post-form.geolocation-alert')
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
navigator.geolocation.getCurrentPosition(pos => {
|
||||||
|
this.geo = pos.coords;
|
||||||
|
this.$emit('geo-attached', this.geo);
|
||||||
|
}, err => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
title: this.$t('@.post-form.error'),
|
||||||
|
text: err.message
|
||||||
|
});
|
||||||
|
}, {
|
||||||
|
enableHighAccuracy: true
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeGeo() {
|
||||||
|
this.geo = null;
|
||||||
|
this.$emit('geo-dettached');
|
||||||
|
},
|
||||||
|
|
||||||
|
setVisibility() {
|
||||||
|
const w = this.$root.new(MkVisibilityChooser, {
|
||||||
|
source: this.$refs.visibilityButton,
|
||||||
|
currentVisibility: this.localOnly ? `local-${this.visibility}` : this.visibility
|
||||||
|
});
|
||||||
|
w.$once('chosen', v => {
|
||||||
|
this.applyVisibility(v);
|
||||||
|
});
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
w.close();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
applyVisibility(v: string) {
|
||||||
|
const m = v.match(/^local-(.+)/);
|
||||||
|
if (m) {
|
||||||
|
this.localOnly = true;
|
||||||
|
this.visibility = m[1];
|
||||||
|
} else {
|
||||||
|
this.localOnly = false;
|
||||||
|
this.visibility = v;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
addVisibleUser() {
|
||||||
|
this.$root.dialog({
|
||||||
|
title: this.$t('@.post-form.enter-username'),
|
||||||
|
user: true
|
||||||
|
}).then(({ canceled, result: user }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
this.visibleUsers.push(user);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeVisibleUser(user) {
|
||||||
|
this.visibleUsers = erase(user, this.visibleUsers);
|
||||||
|
},
|
||||||
|
|
||||||
|
clear() {
|
||||||
|
this.text = '';
|
||||||
|
this.files = [];
|
||||||
|
this.poll = false;
|
||||||
|
this.quoteId = null;
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
},
|
||||||
|
|
||||||
|
onKeydown(e) {
|
||||||
|
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && this.canPost) this.post();
|
||||||
|
},
|
||||||
|
|
||||||
|
async onPaste(e: ClipboardEvent) {
|
||||||
|
for (const { item, i } of Array.from(e.clipboardData.items).map((item, i) => ({item, i}))) {
|
||||||
|
if (item.kind == 'file') {
|
||||||
|
const file = item.getAsFile();
|
||||||
|
const lio = file.name.lastIndexOf('.');
|
||||||
|
const ext = lio >= 0 ? file.name.slice(lio) : '';
|
||||||
|
const formatted = `${formatTimeString(new Date(file.lastModified), this.$store.state.settings.pastedFileName).replace(/{{number}}/g, `${i + 1}`)}${ext}`;
|
||||||
|
const name = this.$store.state.settings.pasteDialog
|
||||||
|
? await this.$root.dialog({
|
||||||
|
title: this.$t('@.post-form.enter-file-name'),
|
||||||
|
input: {
|
||||||
|
default: formatted
|
||||||
|
},
|
||||||
|
allowEmpty: false
|
||||||
|
}).then(({ canceled, result }) => canceled ? false : result)
|
||||||
|
: formatted;
|
||||||
|
if (name) this.upload(file, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const paste = e.clipboardData.getData('text');
|
||||||
|
|
||||||
|
if (!this.renote && !this.quoteId && paste.startsWith(url + '/notes/')) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'info',
|
||||||
|
text: this.$t('@.post-form.quote-question'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) {
|
||||||
|
insertTextAtCursor(this.$refs.text, paste);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.quoteId = paste.substr(url.length).match(/^\/notes\/(.+?)\/?$/)[1];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onDragover(e) {
|
||||||
|
const isFile = e.dataTransfer.items[0].kind == 'file';
|
||||||
|
const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file';
|
||||||
|
if (isFile || isDriveFile) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.draghover = true;
|
||||||
|
e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onDragenter(e) {
|
||||||
|
this.draghover = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
onDragleave(e) {
|
||||||
|
this.draghover = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
onDrop(e): void {
|
||||||
|
this.draghover = false;
|
||||||
|
|
||||||
|
// ファイルだったら
|
||||||
|
if (e.dataTransfer.files.length > 0) {
|
||||||
|
e.preventDefault();
|
||||||
|
for (const x of Array.from(e.dataTransfer.files)) this.upload(x);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region ドライブのファイル
|
||||||
|
const driveFile = e.dataTransfer.getData('mk_drive_file');
|
||||||
|
if (driveFile != null && driveFile != '') {
|
||||||
|
const file = JSON.parse(driveFile);
|
||||||
|
this.files.push(file);
|
||||||
|
this.$emit('change-attached-files', this.files);
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
},
|
||||||
|
|
||||||
|
async emoji() {
|
||||||
|
const Picker = await import('../../desktop/views/components/emoji-picker-dialog.vue').then(m => m.default);
|
||||||
|
const button = this.$refs.emoji;
|
||||||
|
const rect = button.getBoundingClientRect();
|
||||||
|
const vm = this.$root.new(Picker, {
|
||||||
|
x: button.offsetWidth + rect.left + window.pageXOffset,
|
||||||
|
y: rect.top + window.pageYOffset
|
||||||
|
});
|
||||||
|
vm.$once('chosen', emoji => {
|
||||||
|
insertTextAtCursor(this.$refs.text, emoji);
|
||||||
|
});
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
vm.close();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
saveDraft() {
|
||||||
|
if (this.instant) return;
|
||||||
|
|
||||||
|
const data = JSON.parse(localStorage.getItem('drafts') || '{}');
|
||||||
|
|
||||||
|
data[this.draftId] = {
|
||||||
|
updatedAt: new Date(),
|
||||||
|
data: {
|
||||||
|
text: this.text,
|
||||||
|
files: this.files,
|
||||||
|
poll: this.poll && this.$refs.poll ? (this.$refs.poll as any).get() : undefined
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
localStorage.setItem('drafts', JSON.stringify(data));
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteDraft() {
|
||||||
|
const data = JSON.parse(localStorage.getItem('drafts') || '{}');
|
||||||
|
|
||||||
|
delete data[this.draftId];
|
||||||
|
|
||||||
|
localStorage.setItem('drafts', JSON.stringify(data));
|
||||||
|
},
|
||||||
|
|
||||||
|
kao() {
|
||||||
|
this.text += getFace();
|
||||||
|
},
|
||||||
|
|
||||||
|
post() {
|
||||||
|
this.posting = true;
|
||||||
|
const viaMobile = opts.mobile && !this.$store.state.settings.disableViaMobile;
|
||||||
|
this.$root.api('notes/create', {
|
||||||
|
text: this.text == '' ? undefined : this.text,
|
||||||
|
fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
||||||
|
replyId: this.reply ? this.reply.id : undefined,
|
||||||
|
renoteId: this.renote ? this.renote.id : this.quoteId ? this.quoteId : undefined,
|
||||||
|
poll: this.poll ? (this.$refs.poll as any).get() : undefined,
|
||||||
|
cw: this.useCw ? this.cw || '' : undefined,
|
||||||
|
visibility: this.visibility,
|
||||||
|
visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
|
||||||
|
localOnly: this.localOnly,
|
||||||
|
geo: this.geo ? {
|
||||||
|
coordinates: [this.geo.longitude, this.geo.latitude],
|
||||||
|
altitude: this.geo.altitude,
|
||||||
|
accuracy: this.geo.accuracy,
|
||||||
|
altitudeAccuracy: this.geo.altitudeAccuracy,
|
||||||
|
heading: isNaN(this.geo.heading) ? null : this.geo.heading,
|
||||||
|
speed: this.geo.speed,
|
||||||
|
} : null,
|
||||||
|
viaMobile: viaMobile
|
||||||
|
}).then(data => {
|
||||||
|
this.clear();
|
||||||
|
this.deleteDraft();
|
||||||
|
this.$emit('posted');
|
||||||
|
if (opts.onSuccess) opts.onSuccess(this);
|
||||||
|
}).catch(err => {
|
||||||
|
if (opts.onSuccess) opts.onFailure(this);
|
||||||
|
}).then(() => {
|
||||||
|
this.posting = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.text && this.text != '') {
|
||||||
|
const hashtags = parse(this.text).filter(x => x.node.type === 'hashtag').map(x => x.node.props.hashtag);
|
||||||
|
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
|
||||||
|
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
21
src/client/app/common/scripts/room/furniture.ts
Normal file
21
src/client/app/common/scripts/room/furniture.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
export type RoomInfo = {
|
||||||
|
roomType: string;
|
||||||
|
carpetColor: string;
|
||||||
|
furnitures: Furniture[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Furniture = {
|
||||||
|
id: string; // 同じ家具が複数ある場合にそれぞれを識別するためのIDであり、家具IDではない
|
||||||
|
type: string; // こっちが家具ID(chairとか)
|
||||||
|
position: {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
z: number;
|
||||||
|
};
|
||||||
|
rotation: {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
z: number;
|
||||||
|
};
|
||||||
|
props?: Record<string, any>;
|
||||||
|
};
|
||||||
397
src/client/app/common/scripts/room/furnitures.json5
Normal file
397
src/client/app/common/scripts/room/furnitures.json5
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
// 家具メタデータ
|
||||||
|
|
||||||
|
// 家具にはユーザーが設定できるプロパティを設定可能です:
|
||||||
|
//
|
||||||
|
// props: {
|
||||||
|
// <propname>: <proptype>
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// proptype一覧:
|
||||||
|
// * image ... 画像選択ダイアログを出し、その画像のURLが格納されます
|
||||||
|
// * color ... 色選択コントロールを出し、選択された色が格納されます
|
||||||
|
|
||||||
|
// 家具にカスタムテクスチャを適用できるようにするには、textureプロパティに以下の追加の情報を含めます:
|
||||||
|
// 便宜上そのUVのどの部分にカスタムテクスチャを貼り合わせるかのエリアをテクスチャエリアと呼びます。
|
||||||
|
// UVは1024*1024だと仮定します。
|
||||||
|
//
|
||||||
|
// <key>: {
|
||||||
|
// prop: <プロパティ名>,
|
||||||
|
// uv: {
|
||||||
|
// x: <テクスチャエリアX座標>,
|
||||||
|
// y: <テクスチャエリアY座標>,
|
||||||
|
// width: <テクスチャエリアの幅>,
|
||||||
|
// height: <テクスチャエリアの高さ>,
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// <key>には、カスタムテクスチャを適用したいメッシュ名を指定します
|
||||||
|
// <プロパティ名>には、カスタムテクスチャとして使用する画像を格納するプロパティ(前述)名を指定します
|
||||||
|
|
||||||
|
// 家具にカスタムカラーを適用できるようにするには、colorプロパティに以下の追加の情報を含めます:
|
||||||
|
//
|
||||||
|
// <key>: <プロパティ名>
|
||||||
|
//
|
||||||
|
// <key>には、カスタムカラーを適用したいマテリアル名を指定します
|
||||||
|
// <プロパティ名>には、カスタムカラーとして使用する色を格納するプロパティ(前述)名を指定します
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
id: "milk",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "bed",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "low-table",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Table: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "desk",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Board: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "chair",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Chair: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "chair2",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color1: 'color',
|
||||||
|
color2: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Cushion: 'color1',
|
||||||
|
Leg: 'color2'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "fan",
|
||||||
|
place: "wall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pc",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "plant",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "plant2",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "eraser",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pencil",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pudding",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cardboard-box",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cardboard-box2",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cardboard-box3",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "book",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Cover: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "book2",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "piano",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "facial-tissue",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "server",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "moon",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "corkboard",
|
||||||
|
place: "wall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "mousepad",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Pad: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "monitor",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
screen: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Screen: {
|
||||||
|
prop: 'screen',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 434,
|
||||||
|
width: 1024,
|
||||||
|
height: 588,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "tv",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
screen: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Screen: {
|
||||||
|
prop: 'screen',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 434,
|
||||||
|
width: 1024,
|
||||||
|
height: 588,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "keyboard",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "carpet-stripe",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color1: 'color',
|
||||||
|
color2: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
CarpetAreaA: 'color1',
|
||||||
|
CarpetAreaB: 'color2'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "mat",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Mat: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "color-box",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
main: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "wall-clock",
|
||||||
|
place: "wall"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cube",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Cube: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "photoframe",
|
||||||
|
place: "wall",
|
||||||
|
props: {
|
||||||
|
photo: 'image',
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Photo: {
|
||||||
|
prop: 'photo',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 342,
|
||||||
|
width: 1024,
|
||||||
|
height: 683,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Frame: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "pinguin",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
body: 'color',
|
||||||
|
belly: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Body: 'body',
|
||||||
|
Belly: 'belly',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "rubik-cube",
|
||||||
|
place: "floor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "poster-h",
|
||||||
|
place: "wall",
|
||||||
|
props: {
|
||||||
|
picture: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Poster: {
|
||||||
|
prop: 'picture',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 277,
|
||||||
|
width: 1024,
|
||||||
|
height: 745,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "poster-v",
|
||||||
|
place: "wall",
|
||||||
|
props: {
|
||||||
|
picture: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Poster: {
|
||||||
|
prop: 'picture',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width: 745,
|
||||||
|
height: 1024,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "sofa",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Sofa: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "spiral",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Step: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "bin",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
color: 'color'
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
Bin: 'color'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cup-noodle",
|
||||||
|
place: "floor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "holo-display",
|
||||||
|
place: "floor",
|
||||||
|
props: {
|
||||||
|
image: 'image'
|
||||||
|
},
|
||||||
|
texture: {
|
||||||
|
Image_Front: {
|
||||||
|
prop: 'image',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width: 1024,
|
||||||
|
height: 1024,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Image_Back: {
|
||||||
|
prop: 'image',
|
||||||
|
uv: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width: 1024,
|
||||||
|
height: 1024,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'energy-drink',
|
||||||
|
place: "floor",
|
||||||
|
}
|
||||||
|
]
|
||||||
776
src/client/app/common/scripts/room/room.ts
Normal file
776
src/client/app/common/scripts/room/room.ts
Normal file
@@ -0,0 +1,776 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import { v4 as uuid } from 'uuid';
|
||||||
|
import * as THREE from 'three';
|
||||||
|
import { GLTFLoader, GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
|
||||||
|
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
|
||||||
|
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
|
||||||
|
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
|
||||||
|
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';
|
||||||
|
import { BloomPass } from 'three/examples/jsm/postprocessing/BloomPass.js';
|
||||||
|
import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js';
|
||||||
|
import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';
|
||||||
|
import { Furniture, RoomInfo } from './furniture';
|
||||||
|
import { query as urlQuery } from '../../../../../prelude/url';
|
||||||
|
const furnitureDefs = require('./furnitures.json5');
|
||||||
|
|
||||||
|
THREE.ImageUtils.crossOrigin = '';
|
||||||
|
|
||||||
|
type Options = {
|
||||||
|
graphicsQuality: Room['graphicsQuality'];
|
||||||
|
onChangeSelect: Room['onChangeSelect'];
|
||||||
|
useOrthographicCamera: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MisskeyRoom Core Engine
|
||||||
|
*/
|
||||||
|
export class Room {
|
||||||
|
private clock: THREE.Clock;
|
||||||
|
private scene: THREE.Scene;
|
||||||
|
private renderer: THREE.WebGLRenderer;
|
||||||
|
private camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;
|
||||||
|
private controls: OrbitControls;
|
||||||
|
private composer: EffectComposer;
|
||||||
|
private mixers: THREE.AnimationMixer[] = [];
|
||||||
|
private furnitureControl: TransformControls;
|
||||||
|
private roomInfo: RoomInfo;
|
||||||
|
private graphicsQuality: 'cheep' | 'low' | 'medium' | 'high' | 'ultra';
|
||||||
|
private roomObj: THREE.Object3D;
|
||||||
|
private objects: THREE.Object3D[] = [];
|
||||||
|
private selectedObject: THREE.Object3D = null;
|
||||||
|
private onChangeSelect: Function;
|
||||||
|
private isTransformMode = false;
|
||||||
|
private renderFrameRequestId: number;
|
||||||
|
|
||||||
|
private get canvas(): HTMLCanvasElement {
|
||||||
|
return this.renderer.domElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
private get furnitures(): Furniture[] {
|
||||||
|
return this.roomInfo.furnitures;
|
||||||
|
}
|
||||||
|
|
||||||
|
private set furnitures(furnitures: Furniture[]) {
|
||||||
|
this.roomInfo.furnitures = furnitures;
|
||||||
|
}
|
||||||
|
|
||||||
|
private get enableShadow() {
|
||||||
|
return this.graphicsQuality != 'cheep';
|
||||||
|
}
|
||||||
|
|
||||||
|
private get usePostFXs() {
|
||||||
|
return this.graphicsQuality !== 'cheep' && this.graphicsQuality !== 'low';
|
||||||
|
}
|
||||||
|
|
||||||
|
private get shadowQuality() {
|
||||||
|
return (
|
||||||
|
this.graphicsQuality === 'ultra' ? 16384 :
|
||||||
|
this.graphicsQuality === 'high' ? 8192 :
|
||||||
|
this.graphicsQuality === 'medium' ? 4096 :
|
||||||
|
this.graphicsQuality === 'low' ? 1024 :
|
||||||
|
0); // cheep
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(user, isMyRoom, roomInfo: RoomInfo, container, options: Options) {
|
||||||
|
this.roomInfo = roomInfo;
|
||||||
|
this.graphicsQuality = options.graphicsQuality;
|
||||||
|
this.onChangeSelect = options.onChangeSelect;
|
||||||
|
|
||||||
|
this.clock = new THREE.Clock(true);
|
||||||
|
|
||||||
|
//#region Init a scene
|
||||||
|
this.scene = new THREE.Scene();
|
||||||
|
|
||||||
|
const width = window.innerWidth;
|
||||||
|
const height = window.innerHeight;
|
||||||
|
|
||||||
|
//#region Init a renderer
|
||||||
|
this.renderer = new THREE.WebGLRenderer({
|
||||||
|
antialias: false,
|
||||||
|
stencil: false,
|
||||||
|
alpha: false,
|
||||||
|
powerPreference:
|
||||||
|
this.graphicsQuality === 'ultra' ? 'high-performance' :
|
||||||
|
this.graphicsQuality === 'high' ? 'high-performance' :
|
||||||
|
this.graphicsQuality === 'medium' ? 'default' :
|
||||||
|
this.graphicsQuality === 'low' ? 'low-power' :
|
||||||
|
'low-power' // cheep
|
||||||
|
});
|
||||||
|
|
||||||
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
||||||
|
this.renderer.setSize(width, height);
|
||||||
|
this.renderer.autoClear = false;
|
||||||
|
this.renderer.setClearColor(new THREE.Color(0x051f2d));
|
||||||
|
this.renderer.shadowMap.enabled = this.enableShadow;
|
||||||
|
this.renderer.shadowMap.type =
|
||||||
|
this.graphicsQuality === 'ultra' ? THREE.PCFSoftShadowMap :
|
||||||
|
this.graphicsQuality === 'high' ? THREE.PCFSoftShadowMap :
|
||||||
|
this.graphicsQuality === 'medium' ? THREE.PCFShadowMap :
|
||||||
|
this.graphicsQuality === 'low' ? THREE.BasicShadowMap :
|
||||||
|
THREE.BasicShadowMap; // cheep
|
||||||
|
|
||||||
|
container.appendChild(this.canvas);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Init a camera
|
||||||
|
this.camera = options.useOrthographicCamera
|
||||||
|
? new THREE.OrthographicCamera(
|
||||||
|
width / - 2, width / 2, height / 2, height / - 2, -10, 10)
|
||||||
|
: new THREE.PerspectiveCamera(45, width / height);
|
||||||
|
|
||||||
|
if (options.useOrthographicCamera) {
|
||||||
|
this.camera.position.x = 2;
|
||||||
|
this.camera.position.y = 2;
|
||||||
|
this.camera.position.z = 2;
|
||||||
|
this.camera.zoom = 100;
|
||||||
|
this.camera.updateProjectionMatrix();
|
||||||
|
} else {
|
||||||
|
this.camera.position.x = 5;
|
||||||
|
this.camera.position.y = 2;
|
||||||
|
this.camera.position.z = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.add(this.camera);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region AmbientLight
|
||||||
|
const ambientLight = new THREE.AmbientLight(0xffffff, 1);
|
||||||
|
this.scene.add(ambientLight);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
if (this.graphicsQuality !== 'cheep') {
|
||||||
|
//#region Room light
|
||||||
|
const roomLight = new THREE.SpotLight(0xffffff, 0.1);
|
||||||
|
|
||||||
|
roomLight.position.set(0, 8, 0);
|
||||||
|
roomLight.castShadow = this.enableShadow;
|
||||||
|
roomLight.shadow.bias = -0.0001;
|
||||||
|
roomLight.shadow.mapSize.width = this.shadowQuality;
|
||||||
|
roomLight.shadow.mapSize.height = this.shadowQuality;
|
||||||
|
roomLight.shadow.camera.near = 0.1;
|
||||||
|
roomLight.shadow.camera.far = 9;
|
||||||
|
roomLight.shadow.camera.fov = 45;
|
||||||
|
|
||||||
|
this.scene.add(roomLight);
|
||||||
|
//#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region Out light
|
||||||
|
const outLight1 = new THREE.SpotLight(0xffffff, 0.4);
|
||||||
|
outLight1.position.set(9, 3, -2);
|
||||||
|
outLight1.castShadow = this.enableShadow;
|
||||||
|
outLight1.shadow.bias = -0.001; // アクネ、アーチファクト対策 その代わりピーターパンが発生する可能性がある
|
||||||
|
outLight1.shadow.mapSize.width = this.shadowQuality;
|
||||||
|
outLight1.shadow.mapSize.height = this.shadowQuality;
|
||||||
|
outLight1.shadow.camera.near = 6;
|
||||||
|
outLight1.shadow.camera.far = 15;
|
||||||
|
outLight1.shadow.camera.fov = 45;
|
||||||
|
this.scene.add(outLight1);
|
||||||
|
|
||||||
|
const outLight2 = new THREE.SpotLight(0xffffff, 0.2);
|
||||||
|
outLight2.position.set(-2, 3, 9);
|
||||||
|
outLight2.castShadow = false;
|
||||||
|
outLight2.shadow.bias = -0.001; // アクネ、アーチファクト対策 その代わりピーターパンが発生する可能性がある
|
||||||
|
outLight2.shadow.camera.near = 6;
|
||||||
|
outLight2.shadow.camera.far = 15;
|
||||||
|
outLight2.shadow.camera.fov = 45;
|
||||||
|
this.scene.add(outLight2);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Init a controller
|
||||||
|
this.controls = new OrbitControls(this.camera, this.canvas);
|
||||||
|
|
||||||
|
this.controls.target.set(0, 1, 0);
|
||||||
|
this.controls.enableZoom = true;
|
||||||
|
this.controls.enablePan = isMyRoom;
|
||||||
|
this.controls.minPolarAngle = 0;
|
||||||
|
this.controls.maxPolarAngle = Math.PI / 2;
|
||||||
|
this.controls.minAzimuthAngle = 0;
|
||||||
|
this.controls.maxAzimuthAngle = Math.PI / 2;
|
||||||
|
this.controls.enableDamping = true;
|
||||||
|
this.controls.dampingFactor = 0.2;
|
||||||
|
this.controls.mouseButtons.LEFT = 1;
|
||||||
|
this.controls.mouseButtons.MIDDLE = 2;
|
||||||
|
this.controls.mouseButtons.RIGHT = 0;
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region POST FXs
|
||||||
|
if (!this.usePostFXs) {
|
||||||
|
this.composer = null;
|
||||||
|
} else {
|
||||||
|
const renderTarget = new THREE.WebGLRenderTarget(width, height, {
|
||||||
|
minFilter: THREE.LinearFilter,
|
||||||
|
magFilter: THREE.LinearFilter,
|
||||||
|
format: THREE.RGBFormat,
|
||||||
|
stencilBuffer: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const fxaa = new ShaderPass(FXAAShader);
|
||||||
|
fxaa.uniforms['resolution'].value = new THREE.Vector2(1 / width, 1 / height);
|
||||||
|
fxaa.renderToScreen = true;
|
||||||
|
|
||||||
|
this.composer = new EffectComposer(this.renderer, renderTarget);
|
||||||
|
this.composer.addPass(new RenderPass(this.scene, this.camera));
|
||||||
|
if (this.graphicsQuality === 'ultra') {
|
||||||
|
this.composer.addPass(new BloomPass(0.25, 30, 128.0, 512));
|
||||||
|
}
|
||||||
|
this.composer.addPass(fxaa);
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Label
|
||||||
|
//#region Avatar
|
||||||
|
const avatarUrl = `/proxy/?${urlQuery({ url: user.avatarUrl })}`;
|
||||||
|
|
||||||
|
const textureLoader = new THREE.TextureLoader();
|
||||||
|
textureLoader.crossOrigin = 'anonymous';
|
||||||
|
|
||||||
|
const iconTexture = textureLoader.load(avatarUrl);
|
||||||
|
iconTexture.wrapS = THREE.RepeatWrapping;
|
||||||
|
iconTexture.wrapT = THREE.RepeatWrapping;
|
||||||
|
iconTexture.anisotropy = 16;
|
||||||
|
|
||||||
|
const avatarMaterial = new THREE.MeshBasicMaterial({
|
||||||
|
map: iconTexture,
|
||||||
|
side: THREE.DoubleSide,
|
||||||
|
alphaTest: 0.5
|
||||||
|
});
|
||||||
|
|
||||||
|
const iconGeometry = new THREE.PlaneGeometry(1, 1);
|
||||||
|
|
||||||
|
const avatarObject = new THREE.Mesh(iconGeometry, avatarMaterial);
|
||||||
|
avatarObject.position.set(-3, 2.5, 2);
|
||||||
|
avatarObject.rotation.y = Math.PI / 2;
|
||||||
|
avatarObject.castShadow = false;
|
||||||
|
|
||||||
|
this.scene.add(avatarObject);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Username
|
||||||
|
const name = user.username;
|
||||||
|
|
||||||
|
new THREE.FontLoader().load('/assets/fonts/helvetiker_regular.typeface.json', font => {
|
||||||
|
const nameGeometry = new THREE.TextGeometry(name, {
|
||||||
|
size: 0.5,
|
||||||
|
height: 0,
|
||||||
|
curveSegments: 8,
|
||||||
|
font: font,
|
||||||
|
bevelThickness: 0,
|
||||||
|
bevelSize: 0,
|
||||||
|
bevelEnabled: false
|
||||||
|
});
|
||||||
|
|
||||||
|
const nameMaterial = new THREE.MeshLambertMaterial({
|
||||||
|
color: 0xffffff
|
||||||
|
});
|
||||||
|
|
||||||
|
const nameObject = new THREE.Mesh(nameGeometry, nameMaterial);
|
||||||
|
nameObject.position.set(-3, 2.25, 1.25);
|
||||||
|
nameObject.rotation.y = Math.PI / 2;
|
||||||
|
nameObject.castShadow = false;
|
||||||
|
|
||||||
|
this.scene.add(nameObject);
|
||||||
|
});
|
||||||
|
//#endregion
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Interaction
|
||||||
|
if (isMyRoom) {
|
||||||
|
this.furnitureControl = new TransformControls(this.camera, this.canvas);
|
||||||
|
this.scene.add(this.furnitureControl);
|
||||||
|
|
||||||
|
// Hover highlight
|
||||||
|
this.canvas.onmousemove = this.onmousemove;
|
||||||
|
|
||||||
|
// Click
|
||||||
|
this.canvas.onmousedown = this.onmousedown;
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Init room
|
||||||
|
this.loadRoom();
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Load furnitures
|
||||||
|
for (const furniture of this.furnitures) {
|
||||||
|
this.loadFurniture(furniture).then(obj => {
|
||||||
|
this.scene.add(obj.scene);
|
||||||
|
this.objects.push(obj.scene);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
// Start render
|
||||||
|
if (this.usePostFXs) {
|
||||||
|
this.renderWithPostFXs();
|
||||||
|
} else {
|
||||||
|
this.renderWithoutPostFXs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private renderWithoutPostFXs() {
|
||||||
|
this.renderFrameRequestId =
|
||||||
|
window.requestAnimationFrame(this.renderWithoutPostFXs);
|
||||||
|
|
||||||
|
// Update animations
|
||||||
|
const clock = this.clock.getDelta();
|
||||||
|
for (const mixer of this.mixers) {
|
||||||
|
mixer.update(clock);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.controls.update();
|
||||||
|
this.renderer.render(this.scene, this.camera);
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private renderWithPostFXs() {
|
||||||
|
this.renderFrameRequestId =
|
||||||
|
window.requestAnimationFrame(this.renderWithPostFXs);
|
||||||
|
|
||||||
|
// Update animations
|
||||||
|
const clock = this.clock.getDelta();
|
||||||
|
for (const mixer of this.mixers) {
|
||||||
|
mixer.update(clock);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.controls.update();
|
||||||
|
this.renderer.clear();
|
||||||
|
this.composer.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private loadRoom() {
|
||||||
|
const type = this.roomInfo.roomType;
|
||||||
|
new GLTFLoader().load(`/assets/room/rooms/${type}/${type}.glb`, gltf => {
|
||||||
|
gltf.scene.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
|
||||||
|
child.receiveShadow = this.enableShadow;
|
||||||
|
|
||||||
|
child.material = new THREE.MeshLambertMaterial({
|
||||||
|
color: (child.material as THREE.MeshStandardMaterial).color,
|
||||||
|
map: (child.material as THREE.MeshStandardMaterial).map,
|
||||||
|
name: (child.material as THREE.MeshStandardMaterial).name,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 異方性フィルタリング
|
||||||
|
if ((child.material as THREE.MeshLambertMaterial).map && this.graphicsQuality !== 'cheep') {
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.minFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.magFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.anisotropy = 8;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
gltf.scene.position.set(0, 0, 0);
|
||||||
|
|
||||||
|
this.scene.add(gltf.scene);
|
||||||
|
this.roomObj = gltf.scene;
|
||||||
|
if (this.roomInfo.roomType === 'default') {
|
||||||
|
this.applyCarpetColor();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private loadFurniture(furniture: Furniture) {
|
||||||
|
const def = furnitureDefs.find(d => d.id === furniture.type);
|
||||||
|
return new Promise<GLTF>((res, rej) => {
|
||||||
|
const loader = new GLTFLoader();
|
||||||
|
loader.load(`/assets/room/furnitures/${furniture.type}/${furniture.type}.glb`, gltf => {
|
||||||
|
const model = gltf.scene;
|
||||||
|
|
||||||
|
// Load animation
|
||||||
|
if (gltf.animations.length > 0) {
|
||||||
|
const mixer = new THREE.AnimationMixer(model);
|
||||||
|
this.mixers.push(mixer);
|
||||||
|
for (const clip of gltf.animations) {
|
||||||
|
mixer.clipAction(clip).play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
model.name = furniture.id;
|
||||||
|
model.position.x = furniture.position.x;
|
||||||
|
model.position.y = furniture.position.y;
|
||||||
|
model.position.z = furniture.position.z;
|
||||||
|
model.rotation.x = furniture.rotation.x;
|
||||||
|
model.rotation.y = furniture.rotation.y;
|
||||||
|
model.rotation.z = furniture.rotation.z;
|
||||||
|
|
||||||
|
model.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
child.castShadow = this.enableShadow;
|
||||||
|
child.receiveShadow = this.enableShadow;
|
||||||
|
(child.material as THREE.MeshStandardMaterial).metalness = 0;
|
||||||
|
|
||||||
|
// 異方性フィルタリング
|
||||||
|
if ((child.material as THREE.MeshStandardMaterial).map && this.graphicsQuality !== 'cheep') {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).map.minFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshStandardMaterial).map.magFilter = THREE.LinearMipMapLinearFilter;
|
||||||
|
(child.material as THREE.MeshStandardMaterial).map.anisotropy = 8;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (def.color) { // カスタムカラー
|
||||||
|
this.applyCustomColor(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (def.texture) { // カスタムテクスチャ
|
||||||
|
this.applyCustomTexture(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
res(gltf);
|
||||||
|
}, null, rej);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private applyCarpetColor() {
|
||||||
|
this.roomObj.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
if (child.material &&
|
||||||
|
(child.material as THREE.MeshStandardMaterial).name &&
|
||||||
|
(child.material as THREE.MeshStandardMaterial).name === 'Carpet'
|
||||||
|
) {
|
||||||
|
const colorHex = parseInt(this.roomInfo.carpetColor.substr(1), 16);
|
||||||
|
(child.material as THREE.MeshStandardMaterial).color.setHex(colorHex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private applyCustomColor(model: THREE.Object3D) {
|
||||||
|
const furniture = this.furnitures.find(furniture => furniture.id === model.name);
|
||||||
|
const def = furnitureDefs.find(d => d.id === furniture.type);
|
||||||
|
if (def.color == null) return;
|
||||||
|
model.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
for (const t of Object.keys(def.color)) {
|
||||||
|
if (!child.material ||
|
||||||
|
!(child.material as THREE.MeshStandardMaterial).name ||
|
||||||
|
(child.material as THREE.MeshStandardMaterial).name !== t
|
||||||
|
) continue;
|
||||||
|
|
||||||
|
const prop = def.color[t];
|
||||||
|
const val = furniture.props ? furniture.props[prop] : undefined;
|
||||||
|
|
||||||
|
if (val == null) continue;
|
||||||
|
|
||||||
|
const colorHex = parseInt(val.substr(1), 16);
|
||||||
|
(child.material as THREE.MeshStandardMaterial).color.setHex(colorHex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private applyCustomTexture(model: THREE.Object3D) {
|
||||||
|
const furniture = this.furnitures.find(furniture => furniture.id === model.name);
|
||||||
|
const def = furnitureDefs.find(d => d.id === furniture.type);
|
||||||
|
if (def.texture == null) return;
|
||||||
|
|
||||||
|
model.traverse(child => {
|
||||||
|
if (!(child instanceof THREE.Mesh)) return;
|
||||||
|
for (const t of Object.keys(def.texture)) {
|
||||||
|
if (child.name !== t) continue;
|
||||||
|
|
||||||
|
const prop = def.texture[t].prop;
|
||||||
|
const val = furniture.props ? furniture.props[prop] : undefined;
|
||||||
|
|
||||||
|
if (val == null) continue;
|
||||||
|
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.height = 1024;
|
||||||
|
canvas.width = 1024;
|
||||||
|
|
||||||
|
child.material = new THREE.MeshLambertMaterial({
|
||||||
|
emissive: 0x111111,
|
||||||
|
side: THREE.DoubleSide,
|
||||||
|
alphaTest: 0.5,
|
||||||
|
});
|
||||||
|
|
||||||
|
const img = new Image();
|
||||||
|
img.crossOrigin = 'anonymous';
|
||||||
|
img.onload = () => {
|
||||||
|
const uvInfo = def.texture[t].uv;
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
ctx.drawImage(img,
|
||||||
|
0, 0, img.width, img.height,
|
||||||
|
uvInfo.x, uvInfo.y, uvInfo.width, uvInfo.height);
|
||||||
|
|
||||||
|
const texture = new THREE.Texture(canvas);
|
||||||
|
texture.wrapS = THREE.RepeatWrapping;
|
||||||
|
texture.wrapT = THREE.RepeatWrapping;
|
||||||
|
texture.anisotropy = 16;
|
||||||
|
texture.flipY = false;
|
||||||
|
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map = texture;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).needsUpdate = true;
|
||||||
|
(child.material as THREE.MeshLambertMaterial).map.needsUpdate = true;
|
||||||
|
};
|
||||||
|
img.src = val;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private onmousemove(ev: MouseEvent) {
|
||||||
|
if (this.isTransformMode) return;
|
||||||
|
|
||||||
|
const rect = (ev.target as HTMLElement).getBoundingClientRect();
|
||||||
|
const x = (((ev.clientX * window.devicePixelRatio) - rect.left) / this.canvas.width) * 2 - 1;
|
||||||
|
const y = -(((ev.clientY * window.devicePixelRatio) - rect.top) / this.canvas.height) * 2 + 1;
|
||||||
|
const pos = new THREE.Vector2(x, y);
|
||||||
|
|
||||||
|
this.camera.updateMatrixWorld();
|
||||||
|
|
||||||
|
const raycaster = new THREE.Raycaster();
|
||||||
|
raycaster.setFromCamera(pos, this.camera);
|
||||||
|
|
||||||
|
const intersects = raycaster.intersectObjects(this.objects, true);
|
||||||
|
|
||||||
|
for (const object of this.objects) {
|
||||||
|
if (this.isSelectedObject(object)) continue;
|
||||||
|
object.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x000000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intersects.length > 0) {
|
||||||
|
const intersected = this.getRoot(intersects[0].object);
|
||||||
|
if (this.isSelectedObject(intersected)) return;
|
||||||
|
intersected.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x191919);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private onmousedown(ev: MouseEvent) {
|
||||||
|
if (this.isTransformMode) return;
|
||||||
|
if (ev.target !== this.canvas || ev.button !== 0) return;
|
||||||
|
|
||||||
|
const rect = (ev.target as HTMLElement).getBoundingClientRect();
|
||||||
|
const x = (((ev.clientX * window.devicePixelRatio) - rect.left) / this.canvas.width) * 2 - 1;
|
||||||
|
const y = -(((ev.clientY * window.devicePixelRatio) - rect.top) / this.canvas.height) * 2 + 1;
|
||||||
|
const pos = new THREE.Vector2(x, y);
|
||||||
|
|
||||||
|
this.camera.updateMatrixWorld();
|
||||||
|
|
||||||
|
const raycaster = new THREE.Raycaster();
|
||||||
|
raycaster.setFromCamera(pos, this.camera);
|
||||||
|
|
||||||
|
const intersects = raycaster.intersectObjects(this.objects, true);
|
||||||
|
|
||||||
|
for (const object of this.objects) {
|
||||||
|
object.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0x000000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intersects.length > 0) {
|
||||||
|
const selectedObj = this.getRoot(intersects[0].object);
|
||||||
|
this.selectFurniture(selectedObj);
|
||||||
|
} else {
|
||||||
|
this.selectedObject = null;
|
||||||
|
this.onChangeSelect(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private getRoot(obj: THREE.Object3D): THREE.Object3D {
|
||||||
|
let found = false;
|
||||||
|
let x = obj.parent;
|
||||||
|
while (!found) {
|
||||||
|
if (x.parent.parent == null) {
|
||||||
|
found = true;
|
||||||
|
} else {
|
||||||
|
x = x.parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private isSelectedObject(obj: THREE.Object3D): boolean {
|
||||||
|
if (this.selectedObject == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return obj.name === this.selectedObject.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private selectFurniture(obj: THREE.Object3D) {
|
||||||
|
this.selectedObject = obj;
|
||||||
|
this.onChangeSelect(obj);
|
||||||
|
obj.traverse(child => {
|
||||||
|
if (child instanceof THREE.Mesh) {
|
||||||
|
(child.material as THREE.MeshStandardMaterial).emissive.setHex(0xff0000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 家具の移動/回転モードにします
|
||||||
|
* @param type 移動か回転か
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public enterTransformMode(type: 'translate' | 'rotate') {
|
||||||
|
this.isTransformMode = true;
|
||||||
|
this.furnitureControl.setMode(type);
|
||||||
|
this.furnitureControl.attach(this.selectedObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 家具の移動/回転モードを終了します
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public exitTransformMode() {
|
||||||
|
this.isTransformMode = false;
|
||||||
|
this.furnitureControl.detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 家具プロパティを更新します
|
||||||
|
* @param key プロパティ名
|
||||||
|
* @param value 値
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public updateProp(key: string, value: any) {
|
||||||
|
const furniture = this.furnitures.find(furniture => furniture.id === this.selectedObject.name);
|
||||||
|
if (furniture.props == null) furniture.props = {};
|
||||||
|
furniture.props[key] = value;
|
||||||
|
this.applyCustomColor(this.selectedObject);
|
||||||
|
this.applyCustomTexture(this.selectedObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部屋に家具を追加します
|
||||||
|
* @param type 家具の種類
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public addFurniture(type: string) {
|
||||||
|
const furniture = {
|
||||||
|
id: uuid(),
|
||||||
|
type: type,
|
||||||
|
position: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: 0,
|
||||||
|
},
|
||||||
|
rotation: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
this.furnitures.push(furniture);
|
||||||
|
|
||||||
|
this.loadFurniture(furniture).then(obj => {
|
||||||
|
this.scene.add(obj.scene);
|
||||||
|
this.objects.push(obj.scene);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 現在選択されている家具を部屋から削除します
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public removeFurniture() {
|
||||||
|
this.exitTransformMode();
|
||||||
|
const obj = this.selectedObject;
|
||||||
|
this.scene.remove(obj);
|
||||||
|
this.objects = this.objects.filter(object => object.name !== obj.name);
|
||||||
|
this.furnitures = this.furnitures.filter(furniture => furniture.id !== obj.name);
|
||||||
|
this.selectedObject = null;
|
||||||
|
this.onChangeSelect(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全ての家具を部屋から削除します
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public removeAllFurnitures() {
|
||||||
|
this.exitTransformMode();
|
||||||
|
for (const obj of this.objects) {
|
||||||
|
this.scene.remove(obj);
|
||||||
|
}
|
||||||
|
this.objects = [];
|
||||||
|
this.furnitures = [];
|
||||||
|
this.selectedObject = null;
|
||||||
|
this.onChangeSelect(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部屋の床の色を変更します
|
||||||
|
* @param color 色
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public updateCarpetColor(color: string) {
|
||||||
|
this.roomInfo.carpetColor = color;
|
||||||
|
this.applyCarpetColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部屋の種類を変更します
|
||||||
|
* @param type 種類
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public changeRoomType(type: string) {
|
||||||
|
this.roomInfo.roomType = type;
|
||||||
|
this.scene.remove(this.roomObj);
|
||||||
|
this.loadRoom();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部屋データを取得します
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public getRoomInfo() {
|
||||||
|
for (const obj of this.objects) {
|
||||||
|
const furniture = this.furnitures.find(f => f.id === obj.name);
|
||||||
|
furniture.position.x = obj.position.x;
|
||||||
|
furniture.position.y = obj.position.y;
|
||||||
|
furniture.position.z = obj.position.z;
|
||||||
|
furniture.rotation.x = obj.rotation.x;
|
||||||
|
furniture.rotation.y = obj.rotation.y;
|
||||||
|
furniture.rotation.z = obj.rotation.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.roomInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 選択されている家具を取得します
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public getSelectedObject() {
|
||||||
|
return this.selectedObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public findFurnitureById(id: string) {
|
||||||
|
return this.furnitures.find(furniture => furniture.id === id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* レンダリングを終了します
|
||||||
|
*/
|
||||||
|
@autobind
|
||||||
|
public destroy() {
|
||||||
|
// Stop render loop
|
||||||
|
window.cancelAnimationFrame(this.renderFrameRequestId);
|
||||||
|
|
||||||
|
this.controls.dispose();
|
||||||
|
this.scene.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -72,6 +72,9 @@ export default Vue.extend({
|
|||||||
columnWidth: '80%'
|
columnWidth: '80%'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
grid: {
|
grid: {
|
||||||
clipMarkers: false,
|
clipMarkers: false,
|
||||||
padding: {
|
padding: {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
</ol>
|
</ol>
|
||||||
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
||||||
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
||||||
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
||||||
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
||||||
@@ -28,9 +28,10 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as emojilib from 'emojilib';
|
import { emojilist } from '../../../../../misc/emojilist';
|
||||||
import contains from '../../../common/scripts/contains';
|
import contains from '../../../common/scripts/contains';
|
||||||
import { twemojiBase } from '../../../../../misc/twemoji-base';
|
import { twemojiSvgBase } from '../../../../../misc/twemoji-base';
|
||||||
|
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
||||||
|
|
||||||
type EmojiDef = {
|
type EmojiDef = {
|
||||||
emoji: string;
|
emoji: string;
|
||||||
@@ -40,9 +41,7 @@ type EmojiDef = {
|
|||||||
isCustomEmoji?: boolean;
|
isCustomEmoji?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
const lib = emojilist.filter(x => x.category !== 'flags');
|
||||||
return x[1].category != 'flags';
|
|
||||||
});
|
|
||||||
|
|
||||||
const char2file = (char: string) => {
|
const char2file = (char: string) => {
|
||||||
let codes = Array.from(char).map(x => x.codePointAt(0).toString(16));
|
let codes = Array.from(char).map(x => x.codePointAt(0).toString(16));
|
||||||
@@ -51,21 +50,21 @@ const char2file = (char: string) => {
|
|||||||
return codes.join('-');
|
return codes.join('-');
|
||||||
};
|
};
|
||||||
|
|
||||||
const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
const emjdb: EmojiDef[] = lib.map(x => ({
|
||||||
emoji: x[1].char,
|
emoji: x.char,
|
||||||
name: x[0],
|
name: x.name,
|
||||||
aliasOf: null,
|
aliasOf: null,
|
||||||
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
|
url: `${twemojiSvgBase}/${char2file(x.char)}.svg`
|
||||||
}));
|
}));
|
||||||
|
|
||||||
for (const x of lib as any) {
|
for (const x of lib) {
|
||||||
if (x[1].keywords) {
|
if (x.keywords) {
|
||||||
for (const k of x[1].keywords) {
|
for (const k of x.keywords) {
|
||||||
emjdb.push({
|
emjdb.push({
|
||||||
emoji: x[1].char,
|
emoji: x.char,
|
||||||
name: k,
|
name: k,
|
||||||
aliasOf: x[0],
|
aliasOf: x.name,
|
||||||
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
|
url: `${twemojiSvgBase}/${char2file(x.char)}.svg`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,12 +77,13 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
getStaticImageUrl,
|
||||||
fetching: true,
|
fetching: true,
|
||||||
users: [],
|
users: [],
|
||||||
hashtags: [],
|
hashtags: [],
|
||||||
emojis: [],
|
emojis: [],
|
||||||
select: -1,
|
select: -1,
|
||||||
emojilib,
|
emojilist,
|
||||||
emojiDb: [] as EmojiDef[]
|
emojiDb: [] as EmojiDef[]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<prism :inline="inline" :language="lang || 'js'">{{ code }}</prism>
|
<x-prism :inline="inline" :language="prismLang">{{ code }}</x-prism>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import 'prismjs';
|
import 'prismjs';
|
||||||
import 'prismjs/themes/prism-okaidia.css';
|
import 'prismjs/themes/prism-okaidia.css';
|
||||||
import Prism from 'vue-prism-component';
|
import XPrism from 'vue-prism-component';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
Prism
|
XPrism
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
code: {
|
code: {
|
||||||
@@ -25,6 +25,12 @@ export default Vue.extend({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false
|
required: false
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
prismLang() {
|
||||||
|
return Prism.languages[this.lang] ? this.lang : 'js';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-connect-failed">
|
<div class="mk-connect-failed">
|
||||||
<img src="https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg" alt=""/>
|
<img src="/assets/error.jpg" onerror="this.src='https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg';" alt=""/>
|
||||||
<h1>{{ $t('title') }}</h1>
|
<h1>{{ $t('title') }}</h1>
|
||||||
<p class="text">
|
<p class="text">
|
||||||
<span>{{ this.$t('description').substr(0, this.$t('description').indexOf('{')) }}</span>
|
<span>{{ this.$t('description').substr(0, this.$t('description').indexOf('{')) }}</span>
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash && (showOkButton || showCancelButton)">
|
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash && (showOkButton || showCancelButton)">
|
||||||
<ui-button @click="ok" v-if="showOkButton" primary :autofocus="!input && !select && !user">{{ (showCancelButton || input || select || user) ? $t('@.ok') : $t('@.got-it') }}</ui-button>
|
<ui-button @click="ok" v-if="showOkButton" primary :autofocus="!input && !select && !user" :disabled="!canOk">{{ (showCancelButton || input || select || user) ? $t('@.ok') : $t('@.got-it') }}</ui-button>
|
||||||
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">{{ $t('@.cancel') }}</ui-button>
|
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">{{ $t('@.cancel') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</template>
|
</template>
|
||||||
@@ -98,12 +98,27 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
inputValue: this.input && this.input.default ? this.input.default : null,
|
inputValue: this.input && this.input.default ? this.input.default : null,
|
||||||
userInputValue: null,
|
userInputValue: null,
|
||||||
selectedValue: this.select ? this.select.items ? this.select.items[0].value : this.select.groupedItems[0].items[0].value : null,
|
selectedValue: this.select ? this.select.default ? this.select.default : this.select.items ? this.select.items[0].value : this.select.groupedItems[0].items[0].value : null,
|
||||||
|
canOk: true,
|
||||||
faTimesCircle, faQuestionCircle
|
faTimesCircle, faQuestionCircle
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
userInputValue() {
|
||||||
|
if (this.user) {
|
||||||
|
this.$root.api('users/show', parseAcct(this.userInputValue)).then(u => {
|
||||||
|
this.canOk = u != null;
|
||||||
|
}).catch(() => {
|
||||||
|
this.canOk = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
if (this.user) this.canOk = false;
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
(this.$refs.bg as any).style.pointerEvents = 'auto';
|
(this.$refs.bg as any).style.pointerEvents = 'auto';
|
||||||
anime({
|
anime({
|
||||||
@@ -131,6 +146,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
async ok() {
|
async ok() {
|
||||||
|
if (!this.canOk) return;
|
||||||
if (!this.showOkButton) return;
|
if (!this.showOkButton) return;
|
||||||
|
|
||||||
if (this.user) {
|
if (this.user) {
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
fit: {
|
fit: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: false,
|
||||||
|
default: 'cover'
|
||||||
},
|
},
|
||||||
detail: {
|
detail: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
:title="category.text"
|
:title="category.text"
|
||||||
@click="go(category)"
|
@click="go(category)"
|
||||||
:class="{ active: category.isActive }"
|
:class="{ active: category.isActive }"
|
||||||
|
:key="category.text"
|
||||||
>
|
>
|
||||||
<fa :icon="category.icon" fixed-width/>
|
<fa :icon="category.icon" fixed-width/>
|
||||||
</button>
|
</button>
|
||||||
@@ -12,18 +13,19 @@
|
|||||||
<div class="emojis">
|
<div class="emojis">
|
||||||
<header><fa :icon="categories.find(x => x.isActive).icon" fixed-width/> {{ categories.find(x => x.isActive).text }}</header>
|
<header><fa :icon="categories.find(x => x.isActive).icon" fixed-width/> {{ categories.find(x => x.isActive).text }}</header>
|
||||||
<div v-if="categories.find(x => x.isActive).name">
|
<div v-if="categories.find(x => x.isActive).name">
|
||||||
<button v-for="emoji in Object.entries(lib).filter(([k, v]) => v.category === categories.find(x => x.isActive).name)"
|
<button v-for="emoji in emojilist.filter(e => e.category === categories.find(x => x.isActive).name)"
|
||||||
:title="emoji[0]"
|
:title="emoji.name"
|
||||||
@click="chosen(emoji[1].char)"
|
@click="chosen(emoji.char)"
|
||||||
:key="emoji[0]"
|
:key="emoji.name"
|
||||||
>
|
>
|
||||||
<mk-emoji :emoji="emoji[1].char"/>
|
<mk-emoji :emoji="emoji.char"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<button v-for="emoji in customEmojis"
|
<button v-for="emoji in customEmojis"
|
||||||
:title="emoji.name"
|
:title="emoji.name"
|
||||||
@click="chosen(`:${emoji.name}:`)"
|
@click="chosen(`:${emoji.name}:`)"
|
||||||
|
:key="emoji.name"
|
||||||
>
|
>
|
||||||
<img :src="emoji.url" :alt="emoji.name"/>
|
<img :src="emoji.url" :alt="emoji.name"/>
|
||||||
</button>
|
</button>
|
||||||
@@ -35,7 +37,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import { lib } from 'emojilib';
|
import { emojilist } from '../../../../../misc/emojilist';
|
||||||
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
|
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
|
import { faHeart, faFlag } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
@@ -44,7 +46,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
lib,
|
emojilist,
|
||||||
customEmojis: [],
|
customEmojis: [],
|
||||||
categories: [{
|
categories: [{
|
||||||
text: this.$t('custom-emoji'),
|
text: this.$t('custom-emoji'),
|
||||||
|
|||||||
@@ -7,10 +7,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
// スクリプトサイズがデカい
|
|
||||||
//import { lib } from 'emojilib';
|
|
||||||
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
|
||||||
import { twemojiBase } from '../../../../../misc/twemoji-base';
|
import { twemojiSvgBase } from '../../../../../misc/twemoji-base';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@@ -55,6 +53,20 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
customEmojis() {
|
||||||
|
if (this.name) {
|
||||||
|
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
||||||
|
if (customEmoji) {
|
||||||
|
this.customEmoji = customEmoji;
|
||||||
|
this.url = this.$store.state.device.disableShowingAnimatedImages
|
||||||
|
? getStaticImageUrl(customEmoji.url)
|
||||||
|
: customEmoji.url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
if (this.name) {
|
if (this.name) {
|
||||||
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
||||||
@@ -78,9 +90,9 @@ export default Vue.extend({
|
|||||||
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
|
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
|
||||||
codes = codes.filter(x => x && x.length);
|
codes = codes.filter(x => x && x.length);
|
||||||
|
|
||||||
this.url = `${twemojiBase}/2/svg/${codes.join('-')}.svg`;
|
this.url = `${twemojiSvgBase}/${codes.join('-')}.svg`;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,14 @@ export default Vue.extend({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (this.isFollowing) {
|
if (this.isFollowing) {
|
||||||
|
const { canceled } = await this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('@.unfollow-confirm', { name: this.user.name || this.user.username }),
|
||||||
|
showCancelButton: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (canceled) return;
|
||||||
|
|
||||||
await this.$root.api('following/delete', {
|
await this.$root.api('following/delete', {
|
||||||
userId: this.user.id
|
userId: this.user.id
|
||||||
});
|
});
|
||||||
|
|||||||
49
src/client/app/common/views/components/frac.vue
Normal file
49
src/client/app/common/views/components/frac.vue
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<template>
|
||||||
|
<span class="mk-frac"><span>{{ pad }}</span><span>{{ value }} / {{ total }}</span></span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n(),
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
total: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
pad(this: {
|
||||||
|
value: number;
|
||||||
|
total: number;
|
||||||
|
length(value: number): number;
|
||||||
|
}) {
|
||||||
|
return '0'.repeat(this.length(this.total) - this.length(this.value));
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
length(value: number) {
|
||||||
|
const string = value.toString();
|
||||||
|
|
||||||
|
return string.includes('e') ? -~string.substr(string.indexOf('e')) : string.length;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.mk-frac
|
||||||
|
-webkit-font-feature-settings 'tnum'
|
||||||
|
-moz-font-feature-settings 'tnum'
|
||||||
|
font-feature-settings 'tnum'
|
||||||
|
font-variant-numeric tabular-nums
|
||||||
|
|
||||||
|
> :first-child
|
||||||
|
visibility hidden
|
||||||
|
</style>
|
||||||
@@ -5,17 +5,17 @@
|
|||||||
|
|
||||||
<div style="overflow: hidden; line-height: 28px;">
|
<div style="overflow: hidden; line-height: 28px;">
|
||||||
<p class="turn" v-if="!iAmPlayer && !game.isEnded">
|
<p class="turn" v-if="!iAmPlayer && !game.isEnded">
|
||||||
<mfm :key="'turn:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.turn-of', { name: $options.filters.userName(turnUser) })" :should-break="false" :plain-text="true" :custom-emojis="turnUser.emojis"/>
|
<mfm :key="'turn:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.turn-of', { name: $options.filters.userName(turnUser) })" :plain="true" :custom-emojis="turnUser.emojis"/>
|
||||||
<mk-ellipsis/>
|
<mk-ellipsis/>
|
||||||
</p>
|
</p>
|
||||||
<p class="turn" v-if="logPos != logs.length">
|
<p class="turn" v-if="logPos != logs.length">
|
||||||
<mfm :key="'past-turn-of:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.past-turn-of', { name: $options.filters.userName(turnUser) })" :should-break="false" :plain-text="true" :custom-emojis="turnUser.emojis"/>
|
<mfm :key="'past-turn-of:' + $options.filters.userName(turnUser)" :text="$t('@.reversi.past-turn-of', { name: $options.filters.userName(turnUser) })" :plain="true" :custom-emojis="turnUser.emojis"/>
|
||||||
</p>
|
</p>
|
||||||
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">{{ $t('@.reversi.opponent-turn') }}<mk-ellipsis/></p>
|
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">{{ $t('@.reversi.opponent-turn') }}<mk-ellipsis/></p>
|
||||||
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">{{ $t('@.reversi.my-turn') }}</p>
|
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">{{ $t('@.reversi.my-turn') }}</p>
|
||||||
<p class="result" v-if="game.isEnded && logPos == logs.length">
|
<p class="result" v-if="game.isEnded && logPos == logs.length">
|
||||||
<template v-if="game.winner">
|
<template v-if="game.winner">
|
||||||
<mfm :key="'won'" :text="$t('@.reversi.won', { name: $options.filters.userName(game.winner) })" :should-break="false" :plain-text="true" :custom-emojis="game.winner.emojis"/>
|
<mfm :key="'won'" :text="$t('@.reversi.won', { name: $options.filters.userName(game.winner) })" :plain="true" :custom-emojis="game.winner.emojis"/>
|
||||||
<span v-if="game.surrendered != null"> ({{ $t('surrendered') }})</span>
|
<span v-if="game.surrendered != null"> ({{ $t('surrendered') }})</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>{{ $t('@.reversi.drawn') }}</template>
|
<template v-else>{{ $t('@.reversi.drawn') }}</template>
|
||||||
@@ -23,11 +23,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="board">
|
<div class="board">
|
||||||
<div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
<div class="labels-x" v-if="$store.state.settings.gamesReversiShowBoardLabels">
|
||||||
<span v-for="i in game.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
<span v-for="i in game.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
<div class="labels-y" v-if="$store.state.settings.gamesReversiShowBoardLabels">
|
||||||
<div v-for="i in game.map.length">{{ i }}</div>
|
<div v-for="i in game.map.length">{{ i }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cells" :style="cellsStyle">
|
<div class="cells" :style="cellsStyle">
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
|
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
|
||||||
@click="set(i)"
|
@click="set(i)"
|
||||||
:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
|
:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
|
||||||
<template v-if="$store.state.settings.games.reversi.useAvatarStones">
|
<template v-if="$store.state.settings.gamesReversiUseAvatarStones">
|
||||||
<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black">
|
<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black">
|
||||||
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white">
|
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white">
|
||||||
</template>
|
</template>
|
||||||
@@ -45,11 +45,11 @@
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
<div class="labels-y" v-if="this.$store.state.settings.gamesReversiShowBoardLabels">
|
||||||
<div v-for="i in game.map.length">{{ i }}</div>
|
<div v-for="i in game.map.length">{{ i }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
<div class="labels-x" v-if="this.$store.state.settings.gamesReversiShowBoardLabels">
|
||||||
<span v-for="i in game.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
<span v-for="i in game.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ export default Vue.extend({
|
|||||||
padding 10px
|
padding 10px
|
||||||
width 100%
|
width 100%
|
||||||
height 40px
|
height 40px
|
||||||
font-family sans-serif
|
|
||||||
font-size 16px
|
font-size 16px
|
||||||
color var(--googleSearchFg)
|
color var(--googleSearchFg)
|
||||||
background var(--googleSearchBg)
|
background var(--googleSearchBg)
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import fileTypeIcon from './file-type-icon.vue';
|
|||||||
import emoji from './emoji.vue';
|
import emoji from './emoji.vue';
|
||||||
import welcomeTimeline from './welcome-timeline.vue';
|
import welcomeTimeline from './welcome-timeline.vue';
|
||||||
import userList from './user-list.vue';
|
import userList from './user-list.vue';
|
||||||
|
import frac from './frac.vue';
|
||||||
import uiInput from './ui/input.vue';
|
import uiInput from './ui/input.vue';
|
||||||
import uiButton from './ui/button.vue';
|
import uiButton from './ui/button.vue';
|
||||||
import uiHorizonGroup from './ui/horizon-group.vue';
|
import uiHorizonGroup from './ui/horizon-group.vue';
|
||||||
@@ -82,6 +83,7 @@ Vue.component('mk-file-type-icon', fileTypeIcon);
|
|||||||
Vue.component('mk-emoji', emoji);
|
Vue.component('mk-emoji', emoji);
|
||||||
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
||||||
Vue.component('mk-user-list', userList);
|
Vue.component('mk-user-list', userList);
|
||||||
|
Vue.component('mk-frac', frac);
|
||||||
Vue.component('ui-input', uiInput);
|
Vue.component('ui-input', uiInput);
|
||||||
Vue.component('ui-button', uiButton);
|
Vue.component('ui-button', uiButton);
|
||||||
Vue.component('ui-horizon-group', uiHorizonGroup);
|
Vue.component('ui-horizon-group', uiHorizonGroup);
|
||||||
|
|||||||
@@ -59,9 +59,12 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onClick() {
|
onClick() {
|
||||||
this.$root.new(ImageViewer, {
|
const viewer = this.$root.new(ImageViewer, {
|
||||||
image: this.image
|
image: this.image
|
||||||
});
|
});
|
||||||
|
this.$once('hook:beforeDestroy', () => {
|
||||||
|
viewer.close();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ export default Vue.extend({
|
|||||||
mounted() {
|
mounted() {
|
||||||
//#region for Safari bug
|
//#region for Safari bug
|
||||||
if (this.$refs.grid) {
|
if (this.$refs.grid) {
|
||||||
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
|
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px`
|
||||||
|
: this.$store.state.device.inDeckMode ? '128px' : this.$root.isMobile ? '173px' : '287px';
|
||||||
}
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<router-link class="ldlomzub" :to="`/${ canonical }`" v-user-preview="canonical">
|
<router-link class="ldlomzub" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')">
|
||||||
<span class="me" v-if="isMe">{{ $t('@.you') }}</span>
|
<span class="me" v-if="isMe">{{ $t('@.you') }}</span>
|
||||||
<span class="main">
|
<span class="main">
|
||||||
<span class="username">@{{ username }}</span>
|
<span class="username">@{{ username }}</span>
|
||||||
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="(host != localHost) || $store.state.settings.showFullAcct">@{{ toUnicode(host) }}</span>
|
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="(host != localHost) || $store.state.settings.showFullAcct">@{{ toUnicode(host) }}</span>
|
||||||
</span>
|
</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
<a class="ldlomzub" :href="url" target="_blank" rel="noopener" v-else>
|
||||||
|
<span class="main">
|
||||||
|
<span class="username">@{{ username }}</span>
|
||||||
|
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }">@{{ toUnicode(host) }}</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@@ -32,6 +38,15 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
url(): string {
|
||||||
|
switch (this.host) {
|
||||||
|
case 'twitter.com':
|
||||||
|
case 'github.com':
|
||||||
|
return `https://${this.host}/${this.username}`;
|
||||||
|
default:
|
||||||
|
return `/${this.canonical}`;
|
||||||
|
}
|
||||||
|
},
|
||||||
canonical(): string {
|
canonical(): string {
|
||||||
return this.host === localHost ? `@${this.username}` : `@${this.username}@${toUnicode(this.host)}`;
|
return this.host === localHost ? `@${this.username}` : `@${this.username}@${toUnicode(this.host)}`;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv" :class="{ isMobile: $root.isMobile }">
|
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv" :class="{ isMobile: $root.isMobile }">
|
||||||
<div class="backdrop" ref="backdrop" @click="close"></div>
|
<div class="backdrop" ref="backdrop" @click="close"></div>
|
||||||
<div class="popover" :class="{ hukidasi }" ref="popover">
|
<div class="popover" :class="{ bubble }" ref="popover">
|
||||||
<template v-for="item, i in items">
|
<template v-for="item, i in items">
|
||||||
<div v-if="item === null"></div>
|
<div v-if="item === null"></div>
|
||||||
<button v-if="item" @click="clicked(item.action)" :tabindex="i">
|
<button v-if="item" @click="clicked(item.action)" :tabindex="i">
|
||||||
@@ -28,7 +28,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hukidasi: !this.$root.isMobile
|
bubble: !this.$root.isMobile
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -56,12 +56,12 @@ export default Vue.extend({
|
|||||||
|
|
||||||
if (left + width - window.pageXOffset > window.innerWidth) {
|
if (left + width - window.pageXOffset > window.innerWidth) {
|
||||||
left = window.innerWidth - width + window.pageXOffset;
|
left = window.innerWidth - width + window.pageXOffset;
|
||||||
this.hukidasi = false;
|
this.bubble = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (top + height - window.pageYOffset > window.innerHeight) {
|
if (top + height - window.pageYOffset > window.innerHeight) {
|
||||||
top = window.innerHeight - height + window.pageYOffset;
|
top = window.innerHeight - height + window.pageYOffset;
|
||||||
this.hukidasi = false;
|
this.bubble = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (top < 0) {
|
if (top < 0) {
|
||||||
@@ -150,7 +150,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
$balloon-size = 16px
|
$balloon-size = 16px
|
||||||
|
|
||||||
&.hukidasi
|
&.bubble
|
||||||
margin-top $balloon-size
|
margin-top $balloon-size
|
||||||
transform-origin center -($balloon-size)
|
transform-origin center -($balloon-size)
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import * as autosize from 'autosize';
|
import * as autosize from 'autosize';
|
||||||
|
import { formatTimeString } from '../../../../../misc/format-time-string';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('common/views/components/messaging-room.form.vue'),
|
i18n: i18n('common/views/components/messaging-room.form.vue'),
|
||||||
@@ -84,13 +85,26 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onPaste(e) {
|
async onPaste(e: ClipboardEvent) {
|
||||||
const data = e.clipboardData;
|
const data = e.clipboardData;
|
||||||
const items = data.items;
|
const items = data.items;
|
||||||
|
|
||||||
if (items.length == 1) {
|
if (items.length == 1) {
|
||||||
if (items[0].kind == 'file') {
|
if (items[0].kind == 'file') {
|
||||||
this.upload(items[0].getAsFile());
|
const file = items[0].getAsFile();
|
||||||
|
const lio = file.name.lastIndexOf('.');
|
||||||
|
const ext = lio >= 0 ? file.name.slice(lio) : '';
|
||||||
|
const formatted = `${formatTimeString(new Date(file.lastModified), this.$store.state.settings.pastedFileName).replace(/{{number}}/g, '1')}${ext}`;
|
||||||
|
const name = this.$store.state.settings.pasteDialog
|
||||||
|
? await this.$root.dialog({
|
||||||
|
title: this.$t('@.post-form.enter-file-name'),
|
||||||
|
input: {
|
||||||
|
default: formatted
|
||||||
|
},
|
||||||
|
allowEmpty: false
|
||||||
|
}).then(({ canceled, result }) => canceled ? false : result)
|
||||||
|
: formatted;
|
||||||
|
if (name) this.upload(file, name);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (items[0].kind == 'file') {
|
if (items[0].kind == 'file') {
|
||||||
@@ -157,8 +171,8 @@ export default Vue.extend({
|
|||||||
this.upload((this.$refs.file as any).files[0]);
|
this.upload((this.$refs.file as any).files[0]);
|
||||||
},
|
},
|
||||||
|
|
||||||
upload(file) {
|
upload(file: File, name?: string) {
|
||||||
(this.$refs.uploader as any).upload(file);
|
(this.$refs.uploader as any).upload(file, this.$store.state.settings.uploadFolder, name);
|
||||||
},
|
},
|
||||||
|
|
||||||
onUploaded(file) {
|
onUploaded(file) {
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ export default Vue.extend({
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
> .content
|
> .content
|
||||||
|
max-width 100%
|
||||||
|
|
||||||
> .is-deleted
|
> .is-deleted
|
||||||
display block
|
display block
|
||||||
@@ -155,6 +156,7 @@ export default Vue.extend({
|
|||||||
padding 8px 16px
|
padding 8px 16px
|
||||||
overflow hidden
|
overflow hidden
|
||||||
overflow-wrap break-word
|
overflow-wrap break-word
|
||||||
|
word-break break-word
|
||||||
font-size 1em
|
font-size 1em
|
||||||
color rgba(#000, 0.8)
|
color rgba(#000, 0.8)
|
||||||
|
|
||||||
|
|||||||
@@ -22,11 +22,11 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
shouldBreak: {
|
plain: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: false
|
||||||
},
|
},
|
||||||
plainText: {
|
nowrap: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
@@ -50,7 +50,7 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
render(createElement) {
|
render(createElement) {
|
||||||
if (this.text == null || this.text == '') return;
|
if (this.text == null || this.text == '') return;
|
||||||
|
|
||||||
const ast = (this.plainText ? parsePlain : parse)(this.text);
|
const ast = (this.plain ? parsePlain : parse)(this.text);
|
||||||
|
|
||||||
let bigCount = 0;
|
let bigCount = 0;
|
||||||
let motionCount = 0;
|
let motionCount = 0;
|
||||||
@@ -60,7 +60,7 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
case 'text': {
|
case 'text': {
|
||||||
const text = token.node.props.text.replace(/(\r\n|\n|\r)/g, '\n');
|
const text = token.node.props.text.replace(/(\r\n|\n|\r)/g, '\n');
|
||||||
|
|
||||||
if (this.shouldBreak) {
|
if (!this.plain) {
|
||||||
const x = text.split('\n')
|
const x = text.split('\n')
|
||||||
.map(t => t == '' ? [createElement('br')] : [createElement('span', t), createElement('br')]);
|
.map(t => t == '' ? [createElement('br')] : [createElement('span', t), createElement('br')]);
|
||||||
x[x.length - 1].pop();
|
x[x.length - 1].pop();
|
||||||
@@ -270,7 +270,7 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
customEmojis: this.customEmojis || customEmojis,
|
customEmojis: this.customEmojis || customEmojis,
|
||||||
normal: this.plainText
|
normal: this.plain
|
||||||
}
|
}
|
||||||
})];
|
})];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mfm-core v-bind="$attrs" class="havbbuyv" v-once/>
|
<mfm-core v-bind="$attrs" class="havbbuyv" :class="{ nowrap: $attrs['nowrap'] }" v-once/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@@ -15,6 +15,11 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.havbbuyv
|
.havbbuyv
|
||||||
|
white-space pre-wrap
|
||||||
|
|
||||||
|
&.nowrap
|
||||||
|
white-space pre
|
||||||
|
|
||||||
>>> .title
|
>>> .title
|
||||||
display block
|
display block
|
||||||
margin-bottom 4px
|
margin-bottom 4px
|
||||||
@@ -25,6 +30,7 @@ export default Vue.extend({
|
|||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
>>> .quote
|
>>> .quote
|
||||||
|
display block
|
||||||
margin 8px
|
margin 8px
|
||||||
padding 6px 0 6px 12px
|
padding 6px 0 6px 12px
|
||||||
color var(--mfmQuote)
|
color var(--mfmQuote)
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import Vue from 'vue';
|
|||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import { url } from '../../../config';
|
import { url } from '../../../config';
|
||||||
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
|
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
|
||||||
import { concat, intersperse } from '../../../../../prelude/array';
|
|
||||||
import { faCopy, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
import { faCopy, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
@@ -23,6 +22,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
items(): any[] {
|
items(): any[] {
|
||||||
|
if (this.$store.getters.isSignedIn) {
|
||||||
return [{
|
return [{
|
||||||
icon: 'at',
|
icon: 'at',
|
||||||
text: this.$t('mention'),
|
text: this.$t('mention'),
|
||||||
@@ -75,14 +75,42 @@ export default Vue.extend({
|
|||||||
action: () => this.togglePin(true)
|
action: () => this.togglePin(true)
|
||||||
} : undefined,
|
} : undefined,
|
||||||
...(this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? [
|
...(this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? [
|
||||||
null, {
|
null,
|
||||||
|
this.note.userId == this.$store.state.i.id ? {
|
||||||
|
icon: 'undo-alt',
|
||||||
|
text: this.$t('delete-and-edit'),
|
||||||
|
action: this.deleteAndEdit
|
||||||
|
} : undefined,
|
||||||
|
{
|
||||||
icon: ['far', 'trash-alt'],
|
icon: ['far', 'trash-alt'],
|
||||||
text: this.$t('delete'),
|
text: this.$t('delete'),
|
||||||
action: this.del
|
action: this.del
|
||||||
}]
|
}]
|
||||||
: []
|
: []
|
||||||
)]
|
)]
|
||||||
.filter(x => x !== undefined)
|
.filter(x => x !== undefined);
|
||||||
|
} else {
|
||||||
|
return [{
|
||||||
|
icon: 'info-circle',
|
||||||
|
text: this.$t('detail'),
|
||||||
|
action: this.detail
|
||||||
|
}, {
|
||||||
|
icon: faCopy,
|
||||||
|
text: this.$t('copy-content'),
|
||||||
|
action: this.copyContent
|
||||||
|
}, {
|
||||||
|
icon: 'link',
|
||||||
|
text: this.$t('copy-link'),
|
||||||
|
action: this.copyLink
|
||||||
|
}, this.note.uri ? {
|
||||||
|
icon: 'external-link-square-alt',
|
||||||
|
text: this.$t('remote'),
|
||||||
|
action: () => {
|
||||||
|
window.open(this.note.uri, '_blank');
|
||||||
|
}
|
||||||
|
} : undefined]
|
||||||
|
.filter(x => x !== undefined);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -129,6 +157,13 @@ export default Vue.extend({
|
|||||||
splash: true
|
splash: true
|
||||||
});
|
});
|
||||||
this.destroyDom();
|
this.destroyDom();
|
||||||
|
}).catch(e => {
|
||||||
|
if (e.id === '72dab508-c64d-498f-8740-a8eec1ba385a') {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('pin-limit-exceeded')
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -148,6 +183,25 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
deleteAndEdit() {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$t('delete-and-edit-confirm'),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(({ canceled }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
this.$root.api('notes/delete', {
|
||||||
|
noteId: this.note.id
|
||||||
|
}).then(() => {
|
||||||
|
this.destroyDom();
|
||||||
|
});
|
||||||
|
this.$post({
|
||||||
|
initialNote: this.note,
|
||||||
|
reply: this.note.reply,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
toggleFavorite(favorite: boolean) {
|
toggleFavorite(favorite: boolean) {
|
||||||
this.$root.api(favorite ? 'notes/favorites/create' : 'notes/favorites/delete', {
|
this.$root.api(favorite ? 'notes/favorites/create' : 'notes/favorites/delete', {
|
||||||
noteId: this.note.id
|
noteId: this.note.id
|
||||||
@@ -173,6 +227,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
closed() {
|
closed() {
|
||||||
|
this.$emit('closed');
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.destroyDom();
|
this.destroyDom();
|
||||||
});
|
});
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user