Compare commits
399 Commits
Author | SHA1 | Date | |
---|---|---|---|
611e4f34dc | |||
faf017f333 | |||
5eec896615 | |||
17f35174ea | |||
bf71b31123 | |||
9399a44c82 | |||
c96418806f | |||
7945eddef6 | |||
0ede390fef | |||
85959a3b9b | |||
946c3a25b9 | |||
f9d697128a | |||
532ef744f4 | |||
27a961814b | |||
5a5b65e9bf | |||
96673ad610 | |||
a9025aea0d | |||
f38ab0b973 | |||
150dac00cf | |||
bcb1a9c5d3 | |||
2e55aea584 | |||
4f5a3f0df5 | |||
e265b538cc | |||
b186504718 | |||
fc27890f13 | |||
a583939767 | |||
52e3bcfd29 | |||
85d29a3f9d | |||
18944d389d | |||
e90ac5d6a4 | |||
cb9a6ae774 | |||
3ef09aa6b2 | |||
4db22e45a2 | |||
f966d0b32c | |||
ba3879a95a | |||
c6cef0162d | |||
6d09aa86e9 | |||
b711f0f9c6 | |||
8fefb3a4c9 | |||
400cdf0f26 | |||
bce8c5a315 | |||
f44dc2dd05 | |||
df950d2fc5 | |||
5e1f804dd1 | |||
15de89f2f9 | |||
df647a415c | |||
fc66231f8e | |||
71df3e1566 | |||
168c22fc98 | |||
792ec23d7a | |||
ff625253ce | |||
8c872c6b22 | |||
541f5bc0a6 | |||
77ff7b9df0 | |||
203cc5075e | |||
7abfcd06da | |||
724f81c7f3 | |||
4d2e98af7b | |||
08221fdda7 | |||
c0f72970b9 | |||
18bc4a49e8 | |||
f90b6dbed4 | |||
d2d991ff34 | |||
190a5e175b | |||
a05f5a91b8 | |||
4d02ff27be | |||
df92b41d25 | |||
075af96338 | |||
64bbc55336 | |||
06c621acc1 | |||
d040dc19bc | |||
a38ae4a402 | |||
772063aade | |||
31c26354c5 | |||
64b331c5b2 | |||
94f8a145ec | |||
b357afa30a | |||
fee0437493 | |||
663b8864c1 | |||
c6eafdde30 | |||
f32ff95256 | |||
0452b75c3e | |||
97efd23ec8 | |||
ea3e311528 | |||
0565454419 | |||
35c79c2f29 | |||
e6089aec48 | |||
dd3f7834c3 | |||
f8cf18d880 | |||
2ac7e242b6 | |||
d8b604a94f | |||
a1f7b00981 | |||
b7ee42198c | |||
d66e4b7ff9 | |||
7f9789cf65 | |||
b41c18e033 | |||
3c73a7ec6d | |||
182c09d952 | |||
9fb86aed04 | |||
b8f7b13b05 | |||
1ee1d5b6d1 | |||
154c38c314 | |||
3c0626752a | |||
511ef77fb7 | |||
4df3ede500 | |||
e83c080af8 | |||
054220db70 | |||
97bff010a8 | |||
487a3079cd | |||
2d5158c680 | |||
837be06b72 | |||
7e0d8dd4d7 | |||
146fb23d7d | |||
61455ffe29 | |||
c267baafdc | |||
42248a306a | |||
694ec7ebe1 | |||
e3b3f8fac1 | |||
b390363b25 | |||
f6f8cdbcf2 | |||
f46f53b8a3 | |||
a2fcae4383 | |||
483f043768 | |||
f8e0f4f21f | |||
9c3613e96d | |||
d9cacdc86d | |||
aa3d2deeaa | |||
e64912545a | |||
b247be80cc | |||
343f2f1f33 | |||
2d590df900 | |||
ba56b2b9fd | |||
bf472b0c5e | |||
f7961f34c5 | |||
e369031a28 | |||
186d7bbfd9 | |||
60a11f8da5 | |||
1181fcdceb | |||
8cb9852058 | |||
53d46d1cbe | |||
275e1c8de9 | |||
d46eca4c87 | |||
2927fb1597 | |||
8c72e011d2 | |||
69662e24c3 | |||
96099ffe98 | |||
ae16b45c11 | |||
cfee87d3ef | |||
5fcf5bc635 | |||
14bcb813cc | |||
6af19794b6 | |||
8316186695 | |||
85d3023cd5 | |||
78414dee29 | |||
084135141f | |||
467a21f028 | |||
6e284c44d6 | |||
daf9a449e8 | |||
960268fd33 | |||
8c331da315 | |||
b0d626d862 | |||
a51fbd7316 | |||
063f372f3c | |||
987168b863 | |||
4ee40c3345 | |||
654daff7ce | |||
64e10e9619 | |||
b89cffe98d | |||
bd76ba702f | |||
5d52e9ce6b | |||
3c29027ca3 | |||
2ff3069d23 | |||
4198246351 | |||
2b6389b4dc | |||
d7df75ae6c | |||
11c30eccb3 | |||
ab8c6515b8 | |||
d4ad36fa41 | |||
4d688be3df | |||
d2b75f3501 | |||
46b78cb4ff | |||
5d6e0d0f37 | |||
e19d0a37bb | |||
dea3e2132e | |||
91c1ceefbd | |||
5c50989970 | |||
2a7e3b9c51 | |||
ab302df0ae | |||
21e5809993 | |||
c58afc67e8 | |||
8e344f2deb | |||
c28f4ffb3f | |||
2a40240310 | |||
0e9fba9287 | |||
2e3dd2a30a | |||
dda5f6559d | |||
4152e59638 | |||
9d5a92bce6 | |||
30172b92e6 | |||
8468a9d4c7 | |||
626cfb61ac | |||
9603f3fa4f | |||
619a1b9e53 | |||
62e76ad588 | |||
236d72685d | |||
72a5f7b1e2 | |||
d1c16a90b4 | |||
33a9783ae5 | |||
4d64fd665e | |||
96443384fe | |||
69939f1edb | |||
e3c0058942 | |||
3dc2361654 | |||
ec2f709018 | |||
ea06665c51 | |||
83b7010d6a | |||
71654cbe47 | |||
e8f96e848a | |||
251abf21d4 | |||
d103427932 | |||
74a4bd704c | |||
c62f3e0e45 | |||
a56a969433 | |||
1016f94bbb | |||
e98cce9aee | |||
d4bdb5d327 | |||
db4378415e | |||
9b594880c8 | |||
d44fc3db2f | |||
5133b0a0c0 | |||
815469304f | |||
c651921c79 | |||
d18c835221 | |||
e38335077e | |||
34c150cf73 | |||
24cb3ba091 | |||
c07eaef2d1 | |||
5df708ac9f | |||
38ffbe95e9 | |||
8bec4042fc | |||
ee7ef89dfb | |||
54a5246061 | |||
fa6eae2937 | |||
795be20ee1 | |||
87d3a06dcd | |||
8b5c917195 | |||
c7da0e59ff | |||
eb14acbe0c | |||
56860a6bef | |||
735687be21 | |||
592cdfa910 | |||
f2ad1a0406 | |||
fab0cc51b3 | |||
3a26acbdb2 | |||
8d0c31bcda | |||
0b99293d4c | |||
802153ff9b | |||
ec73e2d237 | |||
c32b020535 | |||
c4441804e2 | |||
6c9d80d4e8 | |||
a231f8d26c | |||
82af9320c0 | |||
fceebf7388 | |||
08da258b63 | |||
5994926440 | |||
30f2da4215 | |||
1a2229f886 | |||
1e166490d9 | |||
1c57e6f80a | |||
a6537a8748 | |||
842b75977b | |||
9b3dccf60c | |||
2d533e0cd8 | |||
9e1925c808 | |||
142d59be85 | |||
d9a5e06b5b | |||
b6889e9ac6 | |||
dc82203e9b | |||
6a30d32e7d | |||
d9780606b3 | |||
fffa32df48 | |||
cad49892d3 | |||
f0a29721c9 | |||
13caf37991 | |||
b71a602107 | |||
e6ce0dd43a | |||
094a5214f1 | |||
0932fcd114 | |||
f26643cea3 | |||
63b1689155 | |||
59dc929431 | |||
deaadc33db | |||
0ba92a4f29 | |||
7dc5009ec7 | |||
0ee827afd3 | |||
551d1b7f86 | |||
7ed1b695f5 | |||
7ad31b9b33 | |||
edd8992f7f | |||
96fe42cfcb | |||
c3872b4a38 | |||
762945113d | |||
037e9230fc | |||
3f59ebf986 | |||
e51e1d2b09 | |||
26cc49eb69 | |||
7987bb491c | |||
16b7ac5a87 | |||
5932cb8609 | |||
dfe694d39f | |||
278624f2c8 | |||
899f42c070 | |||
8ce1d4d6a3 | |||
52225d703b | |||
81739af7cb | |||
25473222cc | |||
0b7be70935 | |||
818b71abd6 | |||
25575e8510 | |||
6c85adcf23 | |||
5dc92d7a40 | |||
4e2b966b80 | |||
d34f8c3cb9 | |||
9049ecb1cf | |||
7bebea087c | |||
1c79e30436 | |||
1d7933349b | |||
d002f67140 | |||
da3447765b | |||
cbf5663179 | |||
b217fba235 | |||
7f7e6d5aba | |||
87c5a9d9a6 | |||
8ca1fe3f0a | |||
763ae8f1a6 | |||
c65256d02b | |||
bd2ac515d1 | |||
681f372889 | |||
c2eec272e6 | |||
bd720491a9 | |||
a408226509 | |||
c015e99e6e | |||
de47a17be7 | |||
d38fc490ad | |||
662167e792 | |||
36c91f03d9 | |||
33ccee26b5 | |||
ed5cb991e3 | |||
bea84ec2bf | |||
08c176e549 | |||
810ed50976 | |||
2684541693 | |||
a5b12bac54 | |||
fea1b06e43 | |||
182ca5d434 | |||
facde9a75d | |||
41385640b9 | |||
7bad9db32e | |||
af66f0a497 | |||
95e1b80f41 | |||
556e2eba95 | |||
efe530cb17 | |||
34e7c99283 | |||
4157ea8bc3 | |||
550517bbf3 | |||
eb910cd8a1 | |||
75131c4e8a | |||
ee29ab95be | |||
e97951fc51 | |||
dfabdef60f | |||
5a87763193 | |||
6bb90f56fa | |||
c883ae1350 | |||
09e25e6a02 | |||
bf5d43054b | |||
63b3c65691 | |||
f193da7f67 | |||
40f38c2c0a | |||
db439ef804 | |||
56eb896a03 | |||
68d43e43b6 | |||
c60517e49a | |||
3f59d261f2 | |||
4068d220e5 | |||
18968e7208 | |||
38656103c0 | |||
0f65b1bcc5 | |||
a628821834 | |||
6ceff60c1e | |||
d762a6ce58 | |||
75a8037a46 | |||
1179920790 | |||
b323a160e3 | |||
b157e9535e | |||
7668475bd6 | |||
8bda2a1fb7 | |||
b092086b5b | |||
69a0d9034f |
@ -5,12 +5,6 @@ executors:
|
|||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
docker:
|
docker:
|
||||||
- image: misskey/ci:latest
|
- image: misskey/ci:latest
|
||||||
- image: circleci/mongo:latest
|
|
||||||
with-redis:
|
|
||||||
working_directory: /tmp/workspace
|
|
||||||
docker:
|
|
||||||
- image: misskey/ci:latest
|
|
||||||
- image: circleci/mongo:latest
|
|
||||||
- image: circleci/redis:latest
|
- image: circleci/redis:latest
|
||||||
docker:
|
docker:
|
||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
@ -62,22 +56,10 @@ jobs:
|
|||||||
executor:
|
executor:
|
||||||
type: string
|
type: string
|
||||||
default: "default"
|
default: "default"
|
||||||
without_redis:
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
executor: <<parameters.executor>>
|
executor: <<parameters.executor>>
|
||||||
steps:
|
steps:
|
||||||
- attach_workspace:
|
- attach_workspace:
|
||||||
at: /tmp/workspace
|
at: /tmp/workspace
|
||||||
- when:
|
|
||||||
condition: <<parameters.without_redis>>
|
|
||||||
steps:
|
|
||||||
- run:
|
|
||||||
name: Configure
|
|
||||||
command: |
|
|
||||||
mv .config/test.yml .config/test_redis.yml
|
|
||||||
touch .config/test.yml
|
|
||||||
cat .config/test_redis.yml | while IFS= read line; do if [[ "$line" = '# __REDIS__' ]]; then break; else echo "$line" >> .config/test.yml; fi; done
|
|
||||||
- run:
|
- run:
|
||||||
name: Test
|
name: Test
|
||||||
command: |
|
command: |
|
||||||
@ -140,32 +122,14 @@ workflows:
|
|||||||
branches:
|
branches:
|
||||||
only: master
|
only: master
|
||||||
- test:
|
- test:
|
||||||
name: manual-test-with-redis
|
name: manual-test
|
||||||
executor: with-redis
|
|
||||||
requires:
|
requires:
|
||||||
- manual-build
|
- manual-build
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
ignore: master
|
ignore: master
|
||||||
- test:
|
- test:
|
||||||
name: auto-test-without-redis
|
name: auto-test
|
||||||
executor: with-redis
|
|
||||||
requires:
|
|
||||||
- auto-build
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
only: master
|
|
||||||
- test:
|
|
||||||
name: manual-test-with-redis
|
|
||||||
without_redis: true
|
|
||||||
requires:
|
|
||||||
- manual-build
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
ignore: master
|
|
||||||
- test:
|
|
||||||
name: auto-test-without-redis
|
|
||||||
without_redis: true
|
|
||||||
requires:
|
requires:
|
||||||
- auto-build
|
- auto-build
|
||||||
filters:
|
filters:
|
||||||
|
5
.config/docker_example.env
Normal file
5
.config/docker_example.env
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# db settings
|
||||||
|
POSTGRES_PASSWORD="example-misskey-pass"
|
||||||
|
POSTGRES_USER="example-misskey-user"
|
||||||
|
POSTGRES_DB="misskey"
|
||||||
|
|
@ -1,8 +1,16 @@
|
|||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# Misskey configuration
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
# ┌─────┐
|
||||||
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
# Final accessible URL seen by a user.
|
||||||
url: https://example.tld/
|
url: https://example.tld/
|
||||||
|
|
||||||
|
# ┌───────────────────────┐
|
||||||
|
#───┘ Port and TLS settings └───────────────────────────────────
|
||||||
|
|
||||||
### Port and TLS settings ######################################
|
|
||||||
#
|
#
|
||||||
# Misskey supports two deployment options for public.
|
# Misskey supports two deployment options for public.
|
||||||
#
|
#
|
||||||
@ -30,28 +38,51 @@ url: https://example.tld/
|
|||||||
# You need to set Certificate in 'https' section.
|
# You need to set Certificate in 'https' section.
|
||||||
|
|
||||||
# To use option 1, uncomment below line.
|
# To use option 1, uncomment below line.
|
||||||
# port: 3000 # A port that your Misskey server should listen.
|
#port: 3000 # A port that your Misskey server should listen.
|
||||||
|
|
||||||
# To use option 2, uncomment below lines.
|
# To use option 2, uncomment below lines.
|
||||||
# port: 443
|
#port: 443
|
||||||
#
|
|
||||||
# https:
|
#https:
|
||||||
# # path for certification
|
# # path for certification
|
||||||
# key: /etc/letsencrypt/live/example.tld/privkey.pem
|
# key: /etc/letsencrypt/live/example.tld/privkey.pem
|
||||||
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
|
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
|
||||||
|
|
||||||
################################################################
|
# ┌──────────────────────────┐
|
||||||
|
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||||
|
|
||||||
|
db:
|
||||||
mongodb:
|
|
||||||
host: localhost
|
host: localhost
|
||||||
port: 27017
|
port: 5432
|
||||||
|
|
||||||
|
# Database name
|
||||||
db: misskey
|
db: misskey
|
||||||
|
|
||||||
|
# Auth
|
||||||
user: example-misskey-user
|
user: example-misskey-user
|
||||||
pass: example-misskey-pass
|
pass: example-misskey-pass
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host: localhost
|
||||||
|
port: 6379
|
||||||
|
#pass: example-pass
|
||||||
|
|
||||||
|
# ┌─────────────────────────────┐
|
||||||
|
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||||
|
|
||||||
|
#elasticsearch:
|
||||||
|
# host: localhost
|
||||||
|
# port: 9200
|
||||||
|
# pass: null
|
||||||
|
|
||||||
|
# ┌────────────────────────────────────┐
|
||||||
|
#───┘ File storage (Drive) configuration └──────────────────────
|
||||||
|
|
||||||
drive:
|
drive:
|
||||||
storage: 'db'
|
storage: 'fs'
|
||||||
|
|
||||||
# OR
|
# OR
|
||||||
|
|
||||||
@ -88,26 +119,28 @@ drive:
|
|||||||
# accessKey: XXX
|
# accessKey: XXX
|
||||||
# secretKey: YYY
|
# secretKey: YYY
|
||||||
|
|
||||||
|
# ┌───────────────┐
|
||||||
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|
||||||
|
# You can select the ID generation method.
|
||||||
|
# You don't usually need to change this setting, but you can
|
||||||
|
# change it according to your preferences.
|
||||||
|
|
||||||
|
# Available methods:
|
||||||
|
# aid ... Short, Millisecond accuracy
|
||||||
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
|
# ulid ... Millisecond accuracy
|
||||||
|
# objectid ... This is left for backward compatibility
|
||||||
|
|
||||||
|
id: 'aid'
|
||||||
|
|
||||||
|
# ┌─────────────────────┐
|
||||||
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
# If enabled:
|
# If enabled:
|
||||||
# The first account created is automatically marked as Admin.
|
# The first account created is automatically marked as Admin.
|
||||||
autoAdmin: true
|
autoAdmin: true
|
||||||
|
|
||||||
#
|
|
||||||
# Below settings are optional
|
|
||||||
#
|
|
||||||
|
|
||||||
# Redis
|
|
||||||
#redis:
|
|
||||||
# host: localhost
|
|
||||||
# port: 6379
|
|
||||||
# pass: example-pass
|
|
||||||
|
|
||||||
# Elasticsearch
|
|
||||||
#elasticsearch:
|
|
||||||
# host: localhost
|
|
||||||
# port: 9200
|
|
||||||
# pass: null
|
|
||||||
|
|
||||||
# Whether disable HSTS
|
# Whether disable HSTS
|
||||||
#disableHsts: true
|
#disableHsts: true
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
var user = {
|
|
||||||
user: 'example-misskey-user',
|
|
||||||
pwd: 'example-misskey-pass',
|
|
||||||
roles: [
|
|
||||||
{
|
|
||||||
role: 'readWrite',
|
|
||||||
db: 'misskey'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
db.createUser(user);
|
|
||||||
|
|
6
.dockerignore
Executable file → Normal file
6
.dockerignore
Executable file → Normal file
@ -5,8 +5,8 @@
|
|||||||
.vscode
|
.vscode
|
||||||
Dockerfile
|
Dockerfile
|
||||||
build/
|
build/
|
||||||
|
db/
|
||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
node_modules/
|
|
||||||
mongo/
|
|
||||||
redis/
|
|
||||||
elasticsearch/
|
elasticsearch/
|
||||||
|
node_modules/
|
||||||
|
redis/
|
||||||
|
10
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
10
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
@ -7,24 +7,24 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Summary
|
## 💡 Summary
|
||||||
|
|
||||||
<!-- Tell us what the bug is -->
|
<!-- Tell us what the bug is -->
|
||||||
|
|
||||||
## Expected Behavior
|
## 🙂 Expected Behavior
|
||||||
|
|
||||||
<!--- Tell us what should happen -->
|
<!--- Tell us what should happen -->
|
||||||
|
|
||||||
## Actual Behavior
|
## ☹️ Actual Behavior
|
||||||
|
|
||||||
<!--- Tell us what happens instead of the expected behavior -->
|
<!--- Tell us what happens instead of the expected behavior -->
|
||||||
|
|
||||||
## Steps to Reproduce
|
## 📝 Steps to Reproduce
|
||||||
|
|
||||||
1.
|
1.
|
||||||
2.
|
2.
|
||||||
3.
|
3.
|
||||||
|
|
||||||
## Environment
|
## 📌 Environment
|
||||||
|
|
||||||
<!-- Tell us where on the platform it happens -->
|
<!-- Tell us where on the platform it happens -->
|
||||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -8,14 +8,15 @@
|
|||||||
built
|
built
|
||||||
/data
|
/data
|
||||||
/.cache-loader
|
/.cache-loader
|
||||||
|
/db
|
||||||
|
/elasticsearch
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
*.pem
|
*.pem
|
||||||
run.bat
|
run.bat
|
||||||
api-docs.json
|
api-docs.json
|
||||||
*.log
|
*.log
|
||||||
/redis
|
/redis
|
||||||
/mongo
|
|
||||||
/elasticsearch
|
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
yarn.lock
|
yarn.lock
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
/files
|
||||||
|
190
CHANGELOG.md
190
CHANGELOG.md
@ -5,6 +5,196 @@ If you encounter any problems with updating, please try the following:
|
|||||||
1. `npm run clean` or `npm run cleanall`
|
1. `npm run clean` or `npm run cleanall`
|
||||||
2. Retry update (Don't forget `npm i`)
|
2. Retry update (Don't forget `npm i`)
|
||||||
|
|
||||||
|
11.1.5 (2019/04/17)
|
||||||
|
-------------------
|
||||||
|
### Fixes
|
||||||
|
* ユーザー名に含まれているカスタム絵文字が表示されないことがある問題を修正
|
||||||
|
* 壁紙の設定ができない問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
11.1.4 (2019/04/17)
|
||||||
|
-------------------
|
||||||
|
### Fixes
|
||||||
|
* タイムライン取得時に削除されたファイルを添付している投稿が含まれているとサーバーでエラーになる問題を修正
|
||||||
|
* 管理画面のインスタンスメニューで変更前の設定が読み込まれないことがある問題を修正
|
||||||
|
* 猫ではないのに猫のままで表示される問題を修正
|
||||||
|
* admin/driveのアイコンがずれてる問題を修正
|
||||||
|
* チャートで大きな数値を扱えない問題を修正
|
||||||
|
* UIの修正
|
||||||
|
|
||||||
|
11.1.3 (2019/04/16)
|
||||||
|
-------------------
|
||||||
|
### Fixes
|
||||||
|
* アプリからAPIにリクエストするときにランダムなユーザーがリクエストしたことになる問題を修正
|
||||||
|
|
||||||
|
11.1.2 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### Fixes
|
||||||
|
* 画像描画の依存関係を変更
|
||||||
|
* リモートユーザーのファイルを削除するときに古い方からではなく新しい方から削除されるのを修正
|
||||||
|
* リアクションしてないのにリアクションしたことになる問題を修正
|
||||||
|
* APIドキュメントの修正
|
||||||
|
|
||||||
|
11.1.1 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### Fixes
|
||||||
|
* Metaタグの application-name を Misskey で固定するように修正
|
||||||
|
* トークメッセージが既読にならない問題を修正
|
||||||
|
* デフォルトでHTLを表示するように
|
||||||
|
|
||||||
|
11.1.0 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### Improvements
|
||||||
|
* アイコン未設定時にランダムな画像を表示するように
|
||||||
|
* 管理者やモデレーターはレートリミット無効に
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* メンションの「あなた」インジケーターが表示されない問題を修正
|
||||||
|
* ブロックAPIでエラーが発生する問題を修正
|
||||||
|
* プッシュ通知の購読に失敗する問題を修正
|
||||||
|
|
||||||
|
11.0.3 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### Fixes
|
||||||
|
* ハッシュタグ検索APIが動作しない問題を修正
|
||||||
|
* モデレーターなのにアカウントメニューに「管理」が表示されない問題を修正
|
||||||
|
* プッシュ通知の購読に失敗する問題を修正
|
||||||
|
* ユーザー取得APIでユーザーを指定しない場合エラーになる問題を修正
|
||||||
|
|
||||||
|
11.0.2 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### Fixes
|
||||||
|
* アプリが作成できない問題を修正
|
||||||
|
* 「ハイライト」が表示されない問題を修正
|
||||||
|
* リモートの投稿に添付されている画像が小さい問題を修正
|
||||||
|
* モバイル版でリストの名前が表示されない問題を修正
|
||||||
|
* APIドキュメントにパーミッション一覧を追加
|
||||||
|
|
||||||
|
11.0.1 (2019/04/15)
|
||||||
|
-------------------
|
||||||
|
### Improvements
|
||||||
|
* 不要な依存関係を削除
|
||||||
|
|
||||||
|
11.0.0 daybreak (2019/04/14)
|
||||||
|
----------------------------
|
||||||
|
### Improvements
|
||||||
|
* **データベースがMongoDBからPostgreSQLに変更されました**
|
||||||
|
* **Redisが必須に**
|
||||||
|
* アカウントを完全に削除できるように
|
||||||
|
* 投稿フォームで添付ファイルの閲覧注意を確認/設定できるように
|
||||||
|
* ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* フォロー申請数が実際より1すくなくなる問題を修正
|
||||||
|
* リストからアカウント削除したユーザーを削除できない問題を修正
|
||||||
|
* リストTLでフォローしていないユーザーの非公開投稿が流れる問題を修正
|
||||||
|
* リストTLでダイレクト投稿が流れない問題を修正
|
||||||
|
* ミュートしているユーザーの投稿がタイムラインに流れてくることがある問題を修正
|
||||||
|
|
||||||
|
### APIの破壊的変更
|
||||||
|
* v10時点で deprecated だったパラメータなどを削除
|
||||||
|
* ユーザーリストの title が name に
|
||||||
|
* リバーシの対局の`settings`プロパティがなくなり、その中にあったプロパティがすべて上の階層に
|
||||||
|
* 例えば`game.settings.map`は`game.map`になる
|
||||||
|
|
||||||
|
### 既知の問題
|
||||||
|
* ユーザー認証無しでのアプリが作成できない
|
||||||
|
* 依存ライブラリの問題と思わるため、対応が難しい
|
||||||
|
|
||||||
|
### Migration
|
||||||
|
coming soon...
|
||||||
|
|
||||||
|
10.100.0
|
||||||
|
----------
|
||||||
|
* ユーザーリストでフォローボタンを表示するように
|
||||||
|
* ドライブのファイルのサムネイルを修正
|
||||||
|
* 投稿ウィジットでローカルのみの公開範囲で投稿できない問題を修正
|
||||||
|
* TLを遡った時に抜けがある時がある問題を修正
|
||||||
|
* ユーザータイムラインが投稿日時順ではなくなっているのを修正
|
||||||
|
* 10.99.0 でチャートのレンダリングがおかしい問題を修正
|
||||||
|
|
||||||
|
10.99.0
|
||||||
|
----------
|
||||||
|
* manifest.json にインスタンス名を反映させるように
|
||||||
|
* Metaに投稿やユーザーのIDを設定するように
|
||||||
|
* 設定でポートが指定されていない場合、環境変数を参照するように
|
||||||
|
* フォローインポートで途中にエラーになるユーザーがいると途中で終了してしまう問題を修正
|
||||||
|
* フォローインポートで自分が含まれていた場合自分をフォローしてしまう問題を修正
|
||||||
|
* ServiceWorkerの設定がUIで有効にならない問題を修正
|
||||||
|
* ユーザー一覧でのユーザーの自己紹介が複数行になることがある問題を修正
|
||||||
|
* フォローインポートでAPI limitに達していても正常にリクエストされたように表示されてしまう問題を修正
|
||||||
|
* DBに保存されたrepository urlを変更する方法がない問題を修正
|
||||||
|
* デスクトップDeckだとviaが投稿内に2箇所表示される問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
* 依存関係の更新
|
||||||
|
* ローカリゼーション
|
||||||
|
|
||||||
|
10.98.3
|
||||||
|
----------
|
||||||
|
* リアクションのカスタム絵文字の情報がNoteに添付されない問題を修正
|
||||||
|
* フォルダーの移動をするとき親フォルダーに自分自身を指定できてしまう問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.98.2
|
||||||
|
----------
|
||||||
|
* 他のインスタンスから添付画像が見れない問題を修正
|
||||||
|
|
||||||
|
10.98.1
|
||||||
|
----------
|
||||||
|
* ドライブのファイルのサムネイルが表示されない問題を修正
|
||||||
|
* APでカスタム絵文字を送る時に常にimage/pngで送っている問題を修正
|
||||||
|
* いくらいじってもページリロードするとmisskeyのテーマがdark(future)になっちゃう問題を修正
|
||||||
|
|
||||||
|
10.98.0
|
||||||
|
----------
|
||||||
|
* ドライブのファイルダウンロード時に元のファイル名を尊重するように
|
||||||
|
* ドライブで画像以外のファイルを分かりやすく表示するように
|
||||||
|
* TwemojiのCDNを変更
|
||||||
|
* モバイルで通知の設定がない問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.97.2
|
||||||
|
----------
|
||||||
|
* ビルド時に警告が出ないように修正
|
||||||
|
|
||||||
|
10.97.1
|
||||||
|
----------
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.97.0
|
||||||
|
----------
|
||||||
|
* リアクションに絵文字やカスタム絵文字を使えるように
|
||||||
|
* 不明なリアクションのフォールバックに star を使えるように
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.96.0
|
||||||
|
----------
|
||||||
|
* 連合ユーザーの投稿に対してActivityPubオブジェクトを要求されたら元のインスタンスにリダイレクトするように
|
||||||
|
* updatePersonを試行した時点でもlastFetchedAtを更新するように
|
||||||
|
* 管理画面でリモートインスタンスの登録日時を表示
|
||||||
|
* ユーザーサジェストが機能しなくなっていた問題を修正
|
||||||
|
* 最近使ったハッシュタグ表示が機能していない問題を修正
|
||||||
|
* バグ修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.95.0
|
||||||
|
----------
|
||||||
|
* ジョブを一覧できるように
|
||||||
|
* MFMでURLを明示する構文の追加
|
||||||
|
* Articleタイプのアクティビティを受け入れるように
|
||||||
|
* 凍結されたユーザーをサジェストしないように
|
||||||
|
* ファビコンが保存されないのを修正
|
||||||
|
* キューのジョブクリアの動作を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
10.94.0
|
||||||
|
----------
|
||||||
|
* Faviconを設定できるように
|
||||||
|
* アカウントを凍結したときすべてのフォローを解除するように
|
||||||
|
* シェアページが機能していない問題を修正
|
||||||
|
* インスタンスブロックをしていてもRenote等すると取得されてしまう問題を修正
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
10.93.1
|
10.93.1
|
||||||
----------
|
----------
|
||||||
* データのエクスポートとインポートの動作を修正
|
* データのエクスポートとインポートの動作を修正
|
||||||
|
127
CONTRIBUTING.md
127
CONTRIBUTING.md
@ -46,7 +46,40 @@ Convert な(na) to にゃ(nya)
|
|||||||
Revert Nyaize
|
Revert Nyaize
|
||||||
|
|
||||||
## Code style
|
## Code style
|
||||||
### Don't use `export default`
|
### セミコロンを省略しない
|
||||||
|
ASI Hazardを避けるためでもある
|
||||||
|
|
||||||
|
### 中括弧を省略しない
|
||||||
|
Bad:
|
||||||
|
``` ts
|
||||||
|
if (foo)
|
||||||
|
bar;
|
||||||
|
else
|
||||||
|
baz;
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
``` ts
|
||||||
|
if (foo) {
|
||||||
|
bar;
|
||||||
|
} else {
|
||||||
|
baz;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
ただし**`if`が一行**の時だけは省略しても良い
|
||||||
|
Good:
|
||||||
|
``` ts
|
||||||
|
if (foo) bar;
|
||||||
|
```
|
||||||
|
|
||||||
|
### `export default`を使わない
|
||||||
|
インテリセンスと相性が悪かったりするため
|
||||||
|
|
||||||
|
参考:
|
||||||
|
* https://gfx.hatenablog.com/entry/2017/11/24/135343
|
||||||
|
* https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
|
||||||
|
|
||||||
Bad:
|
Bad:
|
||||||
``` ts
|
``` ts
|
||||||
export default function(foo: string): string {
|
export default function(foo: string): string {
|
||||||
@ -72,3 +105,95 @@ src ... Source code
|
|||||||
test ... Test code
|
test ... Test code
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
### placeholder
|
||||||
|
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
query.andWhere(new Brackets(qb => {
|
||||||
|
for (const type of ps.fileType) {
|
||||||
|
qb.orWhere(`:type = ANY(note.attachedFileTypes)`, { type: type });
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
と書くと、ループ中で`type`というプレースホルダが複数回使われてしまいおかしくなる
|
||||||
|
だから次のようにする必要がある
|
||||||
|
```ts
|
||||||
|
query.andWhere(new Brackets(qb => {
|
||||||
|
for (const type of ps.fileType) {
|
||||||
|
const i = ps.fileType.indexOf(type);
|
||||||
|
qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
|
||||||
|
### `null` in SQL
|
||||||
|
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||||
|
```
|
||||||
|
という処理で、`ps.folderId`が`null`だと結果的に`file.folderId = null`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||||
|
だから次のようにする必要がある
|
||||||
|
``` ts
|
||||||
|
if (ps.folderId) {
|
||||||
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||||
|
} else {
|
||||||
|
query.where('file.folderId IS NULL');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `[]` in SQL
|
||||||
|
SQLを発行する際、`IN`のパラメータが`[]`(空の配列)になる可能性のある場合はSQL文を出し分けなければならない
|
||||||
|
例えば
|
||||||
|
``` ts
|
||||||
|
const users = await Users.find({
|
||||||
|
id: In(userIds)
|
||||||
|
});
|
||||||
|
```
|
||||||
|
という処理で、`userIds`が`[]`だと結果的に`user.id IN ()`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||||
|
だから次のようにする必要がある
|
||||||
|
``` ts
|
||||||
|
const users = userIds.length > 0 ? await Users.find({
|
||||||
|
id: In(userIds)
|
||||||
|
}) : [];
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配列のインデックス in SQL
|
||||||
|
SQLでは配列のインデックスは**1始まり**。
|
||||||
|
`[a, b, c]`の `a`にアクセスしたいなら`[0]`ではなく`[1]`と書く
|
||||||
|
|
||||||
|
### `undefined`にご用心
|
||||||
|
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||||
|
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
||||||
|
|
||||||
|
### 簡素な`undefined`チェック
|
||||||
|
データベースからレコードを取得するときに、プログラムの流れ的に(ほぼ)絶対`undefined`にはならない場合でも、`undefined`チェックしないとTypeScriptに怒られます。
|
||||||
|
でもいちいち複数行を費やして、発生するはずのない`undefined`をチェックするのも面倒なので、`ensure`というユーティリティ関数を用意しています。
|
||||||
|
例えば、
|
||||||
|
``` ts
|
||||||
|
const user = await Users.findOne(userId);
|
||||||
|
// この時点で user の型は User | undefined
|
||||||
|
if (user == null) {
|
||||||
|
throw 'missing user';
|
||||||
|
}
|
||||||
|
// この時点で user の型は User
|
||||||
|
```
|
||||||
|
という処理を`ensure`を使うと
|
||||||
|
``` ts
|
||||||
|
const user = await Users.findOne(userId).then(ensure);
|
||||||
|
// この時点で user の型は User
|
||||||
|
```
|
||||||
|
という風に書けます。
|
||||||
|
もちろん`ensure`内部でエラーを握りつぶすようなことはしておらず、万が一`undefined`だった場合はPromiseがRejectされ後続の処理は実行されません。
|
||||||
|
``` ts
|
||||||
|
const user = await Users.findOne(userId).then(ensure);
|
||||||
|
// 万が一 Users.findOne の結果が undefined だったら、ensure でエラーが発生するので
|
||||||
|
// この行に到達することは無い
|
||||||
|
// なので、.then(ensure) は
|
||||||
|
// if (user == null) {
|
||||||
|
// throw 'missing user';
|
||||||
|
// }
|
||||||
|
// の糖衣構文のような扱いです
|
||||||
|
```
|
||||||
|
@ -23,8 +23,9 @@ RUN apk add --no-cache \
|
|||||||
zlib-dev
|
zlib-dev
|
||||||
RUN npm i -g yarn
|
RUN npm i -g yarn
|
||||||
|
|
||||||
COPY . ./
|
COPY package.json ./
|
||||||
RUN yarn install
|
RUN yarn install
|
||||||
|
COPY . ./
|
||||||
RUN yarn build
|
RUN yarn build
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
|
61
README.md
61
README.md
@ -1,4 +1,4 @@
|
|||||||
<a href="https://ai.misskey.xyz/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
|
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
|
||||||
|
|
||||||
[](https://misskey.xyz/)
|
[](https://misskey.xyz/)
|
||||||
================================================================
|
================================================================
|
||||||
@ -59,7 +59,7 @@ Organize and store your files! Want to post a picture you have already uploaded?
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
...and more! Experience Misskey with your own eyes at [misskey.io](https://misskey.io/) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
||||||
|
|
||||||
Screen shots
|
Screen shots
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@ -101,50 +101,56 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/12059069" alt="naga_rus" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weep" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4?token-time=2145916800&token-hash=vZdDTTF-ahiKBjjgppS2ev4rkD8H7TTKkXXoxsucs6Y%3D" alt="Melilot" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1.jpe?token-time=2145916800&token-hash=bqwLTk0Wo0hUJJ8J5y7ii05bLzz-_CDA7Bo0Mp4RFU0%3D" alt="ne_moni" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4.jpe?token-time=2145916800&token-hash=zEyJqVM7u9d8Ri-65fJYSJcWF1jBH1nJ5a3taRzrTmw%3D" alt="Melilot" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
|
||||||
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
|
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||||
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=0xgcpqvFDqRcV_YIEhcPNVH7gs9sLg_BBnTJXCkN4ao%3D" alt="mydarkstar" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1.png?token-time=2145916800&token-hash=FMV7cPKBD1TU2WTbl1jg6AcdKSvTb2BSFcDhgc-EO8w%3D" alt="gutfuckllc" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/18833336" alt="itiradi" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1?token-time=2145916800&token-hash=95p8VdGX45E8BitZR_eOcDlqCjumjzNLBPQJrJdeCpI%3D" alt="takimura" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/17195955/be45e5e14c3e48b2bee0456c84e19df4/4?token-time=2145916800&token-hash=SbdZeN5SmsuT9stD6v0jN1z0hftg0FmRiCTxysU0Ihw%3D" alt="Damillora" 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/16900731/935a10339daa4ede8e555903a0707060/1?token-time=2145916800&token-hash=3CrpqH-XtKs_NoIlSsTyVs8wCzP1WFCsG2xwps1IJq0%3D" alt="Atsuko Tominaga" width="100"></td>
|
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=18833336">itiradi</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
|
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
|
||||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
|
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
||||||
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3?token-time=2145916800&token-hash=-iJszBqgYBhsM5qMdA1knf9wvprhEfESzKfR2oh7mIA%3D" alt="natalie" 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/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/18072312/98e894d960314fa7bc236a72a39488fe/1?token-time=2145916800&token-hash=D6QK3fPyqiYKJfOzc-QqaSSairUrWdjld-ewp2waj6s%3D" alt="Hekovic" 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/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=xhR1n6NAAyEb-IUXLD6_dshkFa3mefU5ZZuk1L8qKTs%3D" alt="Nokotaro Takeda" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/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/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=uR-48MQ0A4j0irQSrCAQZJ-sJUSs_Fkihlg3-l59b7c%3D" alt="Takashi Shibuya" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
||||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
||||||
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
||||||
@ -153,8 +159,11 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
</tr><tr>
|
||||||
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Tue, 12 Mar 2019 00:50:06 UTC
|
**Last updated:** Mon, 15 Apr 2019 12:07:08 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
'targets': [
|
|
||||||
{
|
|
||||||
'target_name': 'crypto_key',
|
|
||||||
'sources': ['src/crypto_key.cc'],
|
|
||||||
'include_dirs': ['<!(node -e "require(\'nan\')")']
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
const mongo = require('mongodb');
|
|
||||||
const User = require('../built/models/user').default;
|
|
||||||
|
|
||||||
const args = process.argv.slice(2);
|
|
||||||
|
|
||||||
const user = args[0];
|
|
||||||
|
|
||||||
const q = user.startsWith('@') ? {
|
|
||||||
username: user.split('@')[1],
|
|
||||||
host: user.split('@')[2] || null
|
|
||||||
} : { _id: new mongo.ObjectID(user) };
|
|
||||||
|
|
||||||
console.log(`Mark as admin ${user}...`);
|
|
||||||
|
|
||||||
User.update(q, {
|
|
||||||
$set: {
|
|
||||||
isAdmin: true
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
console.log(`Done ${user}`);
|
|
||||||
}, e => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
@ -1,57 +0,0 @@
|
|||||||
// for Node.js interpret
|
|
||||||
|
|
||||||
const chalk = require('chalk');
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await DriveFile.count({});
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const file = await DriveFile.findOne(prev ? {
|
|
||||||
_id: { $gt: prev._id }
|
|
||||||
} : {}, {
|
|
||||||
sort: {
|
|
||||||
_id: 1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = file;
|
|
||||||
|
|
||||||
const user = await User.findOne({ _id: file.metadata.userId });
|
|
||||||
|
|
||||||
DriveFile.update({
|
|
||||||
_id: file._id
|
|
||||||
}, {
|
|
||||||
$set: {
|
|
||||||
'metadata._user': {
|
|
||||||
host: user.host
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
res([i, file]);
|
|
||||||
}).catch(rej);
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, file]) => {
|
|
||||||
console.log(chalk`{gray ${i}} {green done: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('ALL DONE');
|
|
||||||
}).catch(console.error);
|
|
@ -1,71 +0,0 @@
|
|||||||
// for Node.js interpret
|
|
||||||
|
|
||||||
const chalk = require('chalk');
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await User.count({});
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const user = await User.findOne(prev ? {
|
|
||||||
_id: { $gt: prev._id }
|
|
||||||
} : {}, {
|
|
||||||
sort: {
|
|
||||||
_id: 1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = user;
|
|
||||||
|
|
||||||
const set = {};
|
|
||||||
|
|
||||||
if (user.avatarId != null) {
|
|
||||||
const file = await DriveFile.findOne({ _id: user.avatarId });
|
|
||||||
|
|
||||||
if (file && file.metadata.properties.avgColor) {
|
|
||||||
set.avatarColor = file.metadata.properties.avgColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user.bannerId != null) {
|
|
||||||
const file = await DriveFile.findOne({ _id: user.bannerId });
|
|
||||||
|
|
||||||
if (file && file.metadata.properties.avgColor) {
|
|
||||||
set.bannerColor = file.metadata.properties.avgColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Object.keys(set).length === 0) return res([i, user]);
|
|
||||||
|
|
||||||
User.update({
|
|
||||||
_id: user._id
|
|
||||||
}, {
|
|
||||||
$set: set
|
|
||||||
}).then(() => {
|
|
||||||
res([i, user]);
|
|
||||||
}).catch(rej);
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, user]) => {
|
|
||||||
console.log(chalk`{gray ${i}} {green done: {bold ${user._id}} @${user.username}}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('ALL DONE');
|
|
||||||
}).catch(console.error);
|
|
@ -1,9 +0,0 @@
|
|||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
DriveFile.update({}, {
|
|
||||||
$rename: {
|
|
||||||
'metadata.isMetaOnly': 'metadata.withoutChunks'
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
multi: true
|
|
||||||
});
|
|
@ -1,134 +0,0 @@
|
|||||||
const { default: Stats } = require('../../built/models/stats');
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: Note } = require('../../built/models/note');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
const now = new Date();
|
|
||||||
const y = now.getFullYear();
|
|
||||||
const m = now.getMonth();
|
|
||||||
const d = now.getDate();
|
|
||||||
const today = new Date(y, m, d);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const localUsersCount = await User.count({
|
|
||||||
host: null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteUsersCount = await User.count({
|
|
||||||
host: { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localNotesCount = await Note.count({
|
|
||||||
'_user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteNotesCount = await Note.count({
|
|
||||||
'_user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': null,
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': { $ne: null },
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
await Stats.insert({
|
|
||||||
date: today,
|
|
||||||
users: {
|
|
||||||
local: {
|
|
||||||
total: localUsersCount,
|
|
||||||
diff: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteUsersCount,
|
|
||||||
diff: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
notes: {
|
|
||||||
local: {
|
|
||||||
total: localNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
drive: {
|
|
||||||
local: {
|
|
||||||
totalCount: localDriveFilesCount,
|
|
||||||
totalSize: localDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
totalCount: remoteDriveFilesCount,
|
|
||||||
totalSize: remoteDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('done');
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
@ -1,144 +0,0 @@
|
|||||||
const { default: Stats } = require('../../built/models/stats');
|
|
||||||
const { default: User } = require('../../built/models/user');
|
|
||||||
const { default: Note } = require('../../built/models/note');
|
|
||||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
|
||||||
|
|
||||||
const now = new Date();
|
|
||||||
const y = now.getFullYear();
|
|
||||||
const m = now.getMonth();
|
|
||||||
const d = now.getDate();
|
|
||||||
const h = now.getHours();
|
|
||||||
const date = new Date(y, m, d, h);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
await Stats.update({}, {
|
|
||||||
$set: {
|
|
||||||
span: 'day'
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
multi: true
|
|
||||||
});
|
|
||||||
|
|
||||||
const localUsersCount = await User.count({
|
|
||||||
host: null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteUsersCount = await User.count({
|
|
||||||
host: { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localNotesCount = await Note.count({
|
|
||||||
'_user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteNotesCount = await Note.count({
|
|
||||||
'_user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': null
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesCount = await DriveFile.count({
|
|
||||||
'metadata._user.host': { $ne: null }
|
|
||||||
});
|
|
||||||
|
|
||||||
const localDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': null,
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
const remoteDriveFilesSize = await DriveFile
|
|
||||||
.aggregate([{
|
|
||||||
$match: {
|
|
||||||
'metadata._user.host': { $ne: null },
|
|
||||||
'metadata.deletedAt': { $exists: false }
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$project: {
|
|
||||||
length: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
$group: {
|
|
||||||
_id: null,
|
|
||||||
usage: { $sum: '$length' }
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(aggregates => {
|
|
||||||
if (aggregates.length > 0) {
|
|
||||||
return aggregates[0].usage;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
await Stats.insert({
|
|
||||||
date: date,
|
|
||||||
span: 'hour',
|
|
||||||
users: {
|
|
||||||
local: {
|
|
||||||
total: localUsersCount,
|
|
||||||
diff: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteUsersCount,
|
|
||||||
diff: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
notes: {
|
|
||||||
local: {
|
|
||||||
total: localNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
total: remoteNotesCount,
|
|
||||||
diff: 0,
|
|
||||||
diffs: {
|
|
||||||
normal: 0,
|
|
||||||
reply: 0,
|
|
||||||
renote: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
drive: {
|
|
||||||
local: {
|
|
||||||
totalCount: localDriveFilesCount,
|
|
||||||
totalSize: localDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
totalCount: remoteDriveFilesCount,
|
|
||||||
totalSize: remoteDriveFilesSize,
|
|
||||||
diffCount: 0,
|
|
||||||
diffSize: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('done');
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
@ -5,8 +5,8 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
restart: always
|
restart: always
|
||||||
links:
|
links:
|
||||||
- mongo
|
- db
|
||||||
# - redis
|
- redis
|
||||||
# - es
|
# - es
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:3000:3000"
|
- "127.0.0.1:3000:3000"
|
||||||
@ -14,26 +14,23 @@ services:
|
|||||||
- internal_network
|
- internal_network
|
||||||
- external_network
|
- external_network
|
||||||
|
|
||||||
# redis:
|
redis:
|
||||||
# restart: always
|
|
||||||
# image: redis:4.0-alpine
|
|
||||||
# networks:
|
|
||||||
# - internal_network
|
|
||||||
### Uncomment to enable Redis persistance
|
|
||||||
## volumes:
|
|
||||||
## - ./redis:/data
|
|
||||||
|
|
||||||
mongo:
|
|
||||||
restart: always
|
restart: always
|
||||||
image: mongo:4.1
|
image: redis:4.0-alpine
|
||||||
networks:
|
networks:
|
||||||
- internal_network
|
- internal_network
|
||||||
environment:
|
|
||||||
MONGO_INITDB_DATABASE: "misskey"
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./.config/mongo_initdb.js:/docker-entrypoint-initdb.d/mongo_initdb.js:ro
|
- ./redis:/data
|
||||||
### Uncomment to enable MongoDB persistance
|
|
||||||
# - ./mongo:/data
|
db:
|
||||||
|
restart: always
|
||||||
|
image: postgres:11.2-alpine
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
env_file:
|
||||||
|
- .config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ./db:/var/lib/postgresql/data
|
||||||
|
|
||||||
# es:
|
# es:
|
||||||
# restart: always
|
# restart: always
|
||||||
@ -42,9 +39,8 @@ services:
|
|||||||
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||||
# networks:
|
# networks:
|
||||||
# - internal_network
|
# - internal_network
|
||||||
#### Uncomment to enable ES persistence
|
# volumes:
|
||||||
## volumes:
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
## - ./elasticsearch:/usr/share/elasticsearch/data
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
internal_network:
|
internal_network:
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
Comment faire une sauvegarde de votre Misskey ?
|
|
||||||
==========================
|
|
||||||
|
|
||||||
Assurez-vous d'avoir installé **mongodb-tools**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Dans votre terminal :
|
|
||||||
``` shell
|
|
||||||
$ mongodump --archive=db-backup -u <VotreNomdUtilisateur> -p <VotreMotDePasse>
|
|
||||||
```
|
|
||||||
|
|
||||||
Pour plus de détails, merci de consulter [la documentation de mongodump](https://docs.mongodb.com/manual/reference/program/mongodump/).
|
|
||||||
|
|
||||||
Restauration
|
|
||||||
-------
|
|
||||||
|
|
||||||
``` shell
|
|
||||||
$ mongorestore --archive=db-backup
|
|
||||||
```
|
|
||||||
|
|
||||||
Pour plus de détails, merci de consulter [la documentation de mongorestore](https://docs.mongodb.com/manual/reference/program/mongorestore/).
|
|
@ -1,22 +0,0 @@
|
|||||||
How to backup your Misskey
|
|
||||||
==========================
|
|
||||||
|
|
||||||
Make sure **mongodb-tools** installed.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
In your shell:
|
|
||||||
``` shell
|
|
||||||
$ mongodump --archive=db-backup -u <YourUserName> -p <YourPassword>
|
|
||||||
```
|
|
||||||
|
|
||||||
For details, please see [mongodump docs](https://docs.mongodb.com/manual/reference/program/mongodump/).
|
|
||||||
|
|
||||||
Restore
|
|
||||||
-------
|
|
||||||
|
|
||||||
``` shell
|
|
||||||
$ mongorestore --archive=db-backup
|
|
||||||
```
|
|
||||||
|
|
||||||
For details, please see [mongorestore docs](https://docs.mongodb.com/manual/reference/program/mongorestore/).
|
|
@ -9,15 +9,51 @@ This guide describes how to install and setup Misskey with Docker.
|
|||||||
|
|
||||||
*1.* Download Misskey
|
*1.* Download Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch.
|
1. Clone Misskey repository's master branch.
|
||||||
2. `cd misskey` Move to misskey directory.
|
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
|
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||||
|
|
||||||
|
2. Move to misskey directory.
|
||||||
|
|
||||||
|
`cd misskey`
|
||||||
|
|
||||||
|
3. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
|
||||||
|
|
||||||
|
`git checkout master`
|
||||||
|
|
||||||
*2.* Configure Misskey
|
*2.* Configure Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
|
||||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` Copy the `.config/mongo_initdb_example.js` and rename it to `mongo_initdb.js`.
|
Create configuration files with following:
|
||||||
3. Edit `default.yml` and `mongo_initdb.js`.
|
|
||||||
|
```bash
|
||||||
|
cd .config
|
||||||
|
cp example.yml default.yml
|
||||||
|
cp docker_example.env docker.env
|
||||||
|
```
|
||||||
|
|
||||||
|
### `default.yml`
|
||||||
|
|
||||||
|
Edit this file the same as non-Docker environment.
|
||||||
|
However hostname of Postgresql, Redis and Elasticsearch are not `localhost`, they are set in `docker-compose.yml`.
|
||||||
|
The following is default hostname:
|
||||||
|
|
||||||
|
| Service | Hostname |
|
||||||
|
|---------------|----------|
|
||||||
|
| Postgresql | `db` |
|
||||||
|
| Redis | `redis` |
|
||||||
|
| Elasticsearch | `es` |
|
||||||
|
|
||||||
|
### `docker.env`
|
||||||
|
|
||||||
|
Configure Postgresql in this file.
|
||||||
|
The minimum required settings are:
|
||||||
|
|
||||||
|
| name | Description |
|
||||||
|
|---------------------|---------------|
|
||||||
|
| `POSTGRES_PASSWORD` | Password |
|
||||||
|
| `POSTGRES_USER` | Username |
|
||||||
|
| `POSTGRES_DB` | Database name |
|
||||||
|
|
||||||
*3.* Configure Docker
|
*3.* Configure Docker
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@ -29,7 +65,13 @@ Build misskey with the following:
|
|||||||
|
|
||||||
`docker-compose build`
|
`docker-compose build`
|
||||||
|
|
||||||
*5.* That is it.
|
*5.* Init DB
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
docker-compose run --rm web npm run init
|
||||||
|
```
|
||||||
|
|
||||||
|
*6.* That is it.
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Well done! Now you have an environment to run Misskey.
|
Well done! Now you have an environment to run Misskey.
|
||||||
|
|
||||||
@ -37,9 +79,9 @@ Well done! Now you have an environment to run Misskey.
|
|||||||
Just `docker-compose up -d`. GLHF!
|
Just `docker-compose up -d`. GLHF!
|
||||||
|
|
||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git fetch`
|
1. `git stash`
|
||||||
2. `git stash`
|
2. `git checkout master`
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git stash pop`
|
||||||
5. `docker-compose build`
|
5. `docker-compose build`
|
||||||
6. Check [ChangeLog](../CHANGELOG.md) for migration information
|
6. Check [ChangeLog](../CHANGELOG.md) for migration information
|
||||||
|
@ -10,9 +10,17 @@ Ce guide explique comment installer et configurer Misskey avec Docker.
|
|||||||
|
|
||||||
*1.* Télécharger Misskey
|
*1.* Télécharger Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone le dépôt de Misskey sur la branche master.
|
1. Clone le dépôt de Misskey sur la branche master.
|
||||||
2. `cd misskey` Naviguez dans le dossier du dépôt.
|
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
|
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||||
|
|
||||||
|
2. Naviguez dans le dossier du dépôt.
|
||||||
|
|
||||||
|
`cd misskey`
|
||||||
|
|
||||||
|
3. Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
|
||||||
|
|
||||||
|
`git checkout master`
|
||||||
|
|
||||||
*2.* Configuration de Misskey
|
*2.* Configuration de Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@ -38,9 +46,9 @@ Parfait, Vous avez un environnement prêt pour démarrer Misskey.
|
|||||||
Utilisez la commande `docker-compose up -d`. GLHF!
|
Utilisez la commande `docker-compose up -d`. GLHF!
|
||||||
|
|
||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git fetch`
|
1. `git stash`
|
||||||
2. `git stash`
|
2. `git checkout master`
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git stash pop`
|
||||||
5. `docker-compose build`
|
5. `docker-compose build`
|
||||||
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
|
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
|
||||||
@ -52,14 +60,28 @@ Utilisez la commande `docker-compose up -d`. GLHF!
|
|||||||
### Configuration d'ElasticSearch (pour la fonction de recherche)
|
### Configuration d'ElasticSearch (pour la fonction de recherche)
|
||||||
*1.* Préparation de l'environnement
|
*1.* Préparation de l'environnement
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `mkdir elasticsearch && chown 1000:1000 elasticsearch` Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
|
1. Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
|
||||||
2. `sysctl -w vm.max_map_count=262144` Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
|
|
||||||
|
`mkdir elasticsearch && chown 1000:1000 elasticsearch`
|
||||||
|
|
||||||
|
2. Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
|
||||||
|
|
||||||
|
`sysctl -w vm.max_map_count=262144`
|
||||||
|
|
||||||
*2.* Après lancement du docker-compose, initialisation de la base ElasticSearch
|
*2.* Après lancement du docker-compose, initialisation de la base ElasticSearch
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `docker-compose -it web /bin/sh` Connexion dans le conteneur web
|
1. Connexion dans le conteneur web
|
||||||
2. `apk add curl` Ajout du paquet curl
|
|
||||||
3. `curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'` Création de la base ES
|
`docker-compose -it web /bin/sh`
|
||||||
|
|
||||||
|
2. Ajout du paquet curl
|
||||||
|
|
||||||
|
`apk add curl`
|
||||||
|
|
||||||
|
3. Création de la base ES
|
||||||
|
|
||||||
|
`curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'`
|
||||||
|
|
||||||
4. `exit`
|
4. `exit`
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
@ -9,15 +9,51 @@ Dockerを使ったMisskey構築方法
|
|||||||
|
|
||||||
*1.* Misskeyのダウンロード
|
*1.* Misskeyのダウンロード
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
|
1. masterブランチからMisskeyレポジトリをクローン
|
||||||
2. `cd misskey` misskeyディレクトリに移動
|
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
|
||||||
|
|
||||||
*2.* 設定ファイルを作成する
|
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||||
|
|
||||||
|
2. misskeyディレクトリに移動
|
||||||
|
|
||||||
|
`cd misskey`
|
||||||
|
|
||||||
|
3. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||||
|
|
||||||
|
`git checkout master`
|
||||||
|
|
||||||
|
*2.* 設定ファイルの作成と編集
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする
|
|
||||||
2. `cp .config/mongo_initdb_example.js .config/mongo_initdb.js` `.config/mongo_initdb_example.js`をコピーし名前を`mongo_initdb.js`にする
|
下記コマンドで設定ファイルを作成してください。
|
||||||
3. `default.yml`と`mongo_initdb.js`を編集する
|
|
||||||
|
```bash
|
||||||
|
cd .config
|
||||||
|
cp example.yml default.yml
|
||||||
|
cp docker_example.env docker.env
|
||||||
|
```
|
||||||
|
|
||||||
|
### `default.yml`の編集
|
||||||
|
|
||||||
|
非Docker環境と同じ様に編集してください。
|
||||||
|
ただし、Postgresql、RedisとElasticsearchのホストは`localhost`ではなく、`docker-compose.yml`で設定されたサービス名になっています。
|
||||||
|
標準設定では次の通りです。
|
||||||
|
|
||||||
|
| サービス | ホスト名 |
|
||||||
|
|---------------|---------|
|
||||||
|
| Postgresql |`db` |
|
||||||
|
| Redis |`redis` |
|
||||||
|
| Elasticsearch |`es` |
|
||||||
|
|
||||||
|
### `docker.env`の編集
|
||||||
|
|
||||||
|
このファイルはPostgresqlの設定を記述します。
|
||||||
|
最低限記述する必要がある設定は次の通りです。
|
||||||
|
|
||||||
|
| 設定 | 内容 |
|
||||||
|
|---------------------|--------------|
|
||||||
|
| `POSTGRES_PASSWORD` | パスワード |
|
||||||
|
| `POSTGRES_USER` | ユーザー名 |
|
||||||
|
| `POSTGRES_DB` | データベース名 |
|
||||||
|
|
||||||
*3.* Dockerの設定
|
*3.* Dockerの設定
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@ -29,7 +65,13 @@ Dockerを使ったMisskey構築方法
|
|||||||
|
|
||||||
`docker-compose build`
|
`docker-compose build`
|
||||||
|
|
||||||
*5.* 以上です!
|
*5.* データベースを初期化
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
docker-compose run --rm web npm run init
|
||||||
|
```
|
||||||
|
|
||||||
|
*6.* 以上です!
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
|
|
||||||
@ -37,9 +79,9 @@ Dockerを使ったMisskey構築方法
|
|||||||
`docker-compose up -d`するだけです。GLHF!
|
`docker-compose up -d`するだけです。GLHF!
|
||||||
|
|
||||||
### Misskeyを最新バージョンにアップデートする方法:
|
### Misskeyを最新バージョンにアップデートする方法:
|
||||||
1. `git fetch`
|
1. `git stash`
|
||||||
2. `git stash`
|
2. `git checkout master`
|
||||||
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
3. `git pull`
|
||||||
4. `git stash pop`
|
4. `git stash pop`
|
||||||
5. `docker-compose build`
|
5. `docker-compose build`
|
||||||
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||||
|
106
docs/setup.en.md
106
docs/setup.en.md
@ -22,37 +22,45 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Please install and setup these softwares:
|
Please install and setup these softwares:
|
||||||
|
|
||||||
#### Dependencies :package:
|
#### Dependencies :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||||
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optional
|
##### Optional
|
||||||
* [Redis](https://redis.io/)
|
|
||||||
* Redis is optional, but we strongly recommended to install it
|
|
||||||
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
|
* [Elasticsearch](https://www.elastic.co/) - required to enable the search feature
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
|
|
||||||
*3.* Setup MongoDB
|
*3.* Install Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
As root:
|
1. Connect to misskey user.
|
||||||
1. `mongo` Go to the mongo shell
|
|
||||||
2. `use misskey` Use the misskey database
|
|
||||||
3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Create the misskey user.
|
|
||||||
4. `exit` You're done!
|
|
||||||
|
|
||||||
*4.* Install Misskey
|
`su - misskey`
|
||||||
----------------------------------------------------------------
|
|
||||||
1. `su - misskey` Connect to misskey user.
|
|
||||||
2. `git clone -b master git://github.com/syuilo/misskey.git` Clone the misskey repo from master branch.
|
|
||||||
3. `cd misskey` Navigate to misskey directory
|
|
||||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
|
|
||||||
5. `npm install` Install misskey dependencies.
|
|
||||||
|
|
||||||
*5.* Configure Misskey
|
2. Clone the misskey repo from master branch.
|
||||||
|
|
||||||
|
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||||
|
|
||||||
|
3. Navigate to misskey directory
|
||||||
|
|
||||||
|
`cd misskey`
|
||||||
|
|
||||||
|
4. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
|
||||||
|
|
||||||
|
`git checkout master`
|
||||||
|
|
||||||
|
5. Install misskey dependencies.
|
||||||
|
|
||||||
|
`npm install`
|
||||||
|
|
||||||
|
*4.* Configure Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
1. Copy the `.config/example.yml` and rename it to `default.yml`.
|
||||||
|
|
||||||
|
`cp .config/example.yml .config/default.yml`
|
||||||
|
|
||||||
2. Edit `default.yml`
|
2. Edit `default.yml`
|
||||||
|
|
||||||
*6.* Build Misskey
|
*5.* Build Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
Build misskey with the following:
|
Build misskey with the following:
|
||||||
@ -68,6 +76,12 @@ If you're still encountering errors about some modules, use node-gyp:
|
|||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
|
|
||||||
|
*6.* Init DB
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
npm run init
|
||||||
|
```
|
||||||
|
|
||||||
*7.* That is it.
|
*7.* That is it.
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Well done! Now, you have an environment that run to Misskey.
|
Well done! Now, you have an environment that run to Misskey.
|
||||||
@ -77,37 +91,45 @@ Just `NODE_ENV=production npm start`. GLHF!
|
|||||||
|
|
||||||
### Launch with systemd
|
### Launch with systemd
|
||||||
|
|
||||||
1. Create a systemd service here: `/etc/systemd/system/misskey.service`
|
1. Create a systemd service here
|
||||||
|
|
||||||
|
`/etc/systemd/system/misskey.service`
|
||||||
|
|
||||||
2. Edit it, and paste this and save:
|
2. Edit it, and paste this and save:
|
||||||
|
|
||||||
```
|
```
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Misskey daemon
|
Description=Misskey daemon
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=misskey
|
User=misskey
|
||||||
ExecStart=/usr/bin/npm start
|
ExecStart=/usr/bin/npm start
|
||||||
WorkingDirectory=/home/misskey/misskey
|
WorkingDirectory=/home/misskey/misskey
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
TimeoutSec=60
|
TimeoutSec=60
|
||||||
StandardOutput=syslog
|
StandardOutput=syslog
|
||||||
StandardError=syslog
|
StandardError=syslog
|
||||||
SyslogIdentifier=misskey
|
SyslogIdentifier=misskey
|
||||||
Restart=always
|
Restart=always
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
|
||||||
3. `systemctl daemon-reload ; systemctl enable misskey` Reload systemd and enable the misskey service.
|
3. Reload systemd and enable the misskey service.
|
||||||
4. `systemctl start misskey` Start the misskey service.
|
|
||||||
|
`systemctl daemon-reload ; systemctl enable misskey`
|
||||||
|
|
||||||
|
4. Start the misskey service.
|
||||||
|
|
||||||
|
`systemctl start misskey`
|
||||||
|
|
||||||
You can check if the service is running with `systemctl status misskey`.
|
You can check if the service is running with `systemctl status misskey`.
|
||||||
|
|
||||||
### How to update your Misskey server to the latest version
|
### How to update your Misskey server to the latest version
|
||||||
1. `git fetch`
|
1. `git checkout master`
|
||||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `npm install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
5. Check [ChangeLog](../CHANGELOG.md) for migration information
|
||||||
|
102
docs/setup.fr.md
102
docs/setup.fr.md
@ -22,37 +22,45 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Installez les paquets suivants :
|
Installez les paquets suivants :
|
||||||
|
|
||||||
#### Dépendences :package:
|
#### Dépendences :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||||
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### Optionnels
|
##### Optionnels
|
||||||
* [Redis](https://redis.io/)
|
|
||||||
* Redis est optionnel mais nous vous recommandons vivement de l'installer
|
|
||||||
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
|
* [Elasticsearch](https://www.elastic.co/) - requis pour pouvoir activer la fonctionnalité de recherche
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
|
|
||||||
*3.* Paramètrage de MongoDB
|
*3.* Installation de Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
En root :
|
1. Basculez vers l'utilisateur misskey.
|
||||||
1. `mongo` Ouvrez le shell mongo
|
|
||||||
2. `use misskey` Utilisez la base de données misskey
|
|
||||||
3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Créez l'utilisateur misskey.
|
|
||||||
4. `exit` Vous avez terminé !
|
|
||||||
|
|
||||||
*4.* Installation de Misskey
|
`su - misskey`
|
||||||
----------------------------------------------------------------
|
|
||||||
1. `su - misskey` Basculez vers l'utilisateur misskey.
|
|
||||||
2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey.
|
|
||||||
3. `cd misskey` Accédez au dossier misskey.
|
|
||||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
|
|
||||||
5. `npm install` Installez les dépendances de misskey.
|
|
||||||
|
|
||||||
*5.* Création du fichier de configuration
|
2. Clonez la branche master du dépôt misskey.
|
||||||
|
|
||||||
|
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||||
|
|
||||||
|
3. Accédez au dossier misskey.
|
||||||
|
|
||||||
|
`cd misskey`
|
||||||
|
|
||||||
|
4. Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
|
||||||
|
|
||||||
|
`git checkout master`
|
||||||
|
|
||||||
|
5. Installez les dépendances de misskey.
|
||||||
|
|
||||||
|
`npm install`
|
||||||
|
|
||||||
|
*4.* Création du fichier de configuration
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le`default.yml`.
|
1. Copiez le fichier `.config/example.yml` et renommez-le`default.yml`.
|
||||||
|
|
||||||
|
`cp .config/example.yml .config/default.yml`
|
||||||
|
|
||||||
2. Editez le fichier `default.yml`
|
2. Editez le fichier `default.yml`
|
||||||
|
|
||||||
*6.* Construction de Misskey
|
*5.* Construction de Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
Construisez Misskey comme ceci :
|
Construisez Misskey comme ceci :
|
||||||
@ -68,7 +76,7 @@ Si vous rencontrez des erreurs concernant certains modules, utilisez node-gyp:
|
|||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
|
|
||||||
*7.* C'est tout.
|
*6.* C'est tout.
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
Excellent ! Maintenant, vous avez un environnement prêt pour lancer Misskey
|
||||||
|
|
||||||
@ -77,37 +85,45 @@ Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-v
|
|||||||
|
|
||||||
### Démarrage avec systemd
|
### Démarrage avec systemd
|
||||||
|
|
||||||
1. Créez un service systemd sur : `/etc/systemd/system/misskey.service`
|
1. Créez un service systemd sur
|
||||||
|
|
||||||
|
`/etc/systemd/system/misskey.service`
|
||||||
|
|
||||||
2. Editez-le puis copiez et coller ceci dans le fichier :
|
2. Editez-le puis copiez et coller ceci dans le fichier :
|
||||||
|
|
||||||
```
|
```
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Misskey daemon
|
Description=Misskey daemon
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=misskey
|
User=misskey
|
||||||
ExecStart=/usr/bin/npm start
|
ExecStart=/usr/bin/npm start
|
||||||
WorkingDirectory=/home/misskey/misskey
|
WorkingDirectory=/home/misskey/misskey
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
TimeoutSec=60
|
TimeoutSec=60
|
||||||
StandardOutput=syslog
|
StandardOutput=syslog
|
||||||
StandardError=syslog
|
StandardError=syslog
|
||||||
SyslogIdentifier=misskey
|
SyslogIdentifier=misskey
|
||||||
Restart=always
|
Restart=always
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
|
||||||
3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey.
|
3. Redémarre systemd et active le service misskey.
|
||||||
4. `systemctl start misskey` Démarre le service misskey.
|
|
||||||
|
`systemctl daemon-reload ; systemctl enable misskey`
|
||||||
|
|
||||||
|
4. Démarre le service misskey.
|
||||||
|
|
||||||
|
`systemctl start misskey`
|
||||||
|
|
||||||
Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`.
|
Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`.
|
||||||
|
|
||||||
### Méthode de mise à jour vers la plus récente version de Misskey
|
### Méthode de mise à jour vers la plus récente version de Misskey
|
||||||
1. `git fetch`
|
1. `git checkout master`
|
||||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `npm install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.
|
||||||
|
115
docs/setup.ja.md
115
docs/setup.ja.md
@ -22,44 +22,46 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
これらのソフトウェアをインストール・設定してください:
|
これらのソフトウェアをインストール・設定してください:
|
||||||
|
|
||||||
#### 依存関係 :package:
|
#### 依存関係 :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)** (10.0.0以上)
|
* **[Node.js](https://nodejs.org/en/)** (11.7.0以上)
|
||||||
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
* **[PostgreSQL](https://www.postgresql.org/)** (10以上)
|
||||||
|
* **[Redis](https://redis.io/)**
|
||||||
|
|
||||||
##### オプション
|
##### オプション
|
||||||
* [Redis](https://redis.io/)
|
|
||||||
* Redisはオプションですが、インストールすることを強く推奨します。
|
|
||||||
* インストールしなくていいのは、あなたのインスタンスが自分専用のときだけとお考えください。
|
|
||||||
* 具体的には、Redisをインストールしないと、次の事が出来なくなります:
|
|
||||||
* Misskeyプロセスを複数起動しての負荷分散
|
|
||||||
* レートリミット
|
|
||||||
* ジョブキュー
|
|
||||||
* Twitter連携
|
|
||||||
* [Elasticsearch](https://www.elastic.co/)
|
* [Elasticsearch](https://www.elastic.co/)
|
||||||
* 検索機能を有効にするためにはインストールが必要です。
|
* 検索機能を有効にするためにはインストールが必要です。
|
||||||
* [FFmpeg](https://www.ffmpeg.org/)
|
* [FFmpeg](https://www.ffmpeg.org/)
|
||||||
|
|
||||||
*3.* MongoDBの設定
|
*3.* Misskeyのインストール
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
ルートで:
|
1. misskeyユーザーを使用
|
||||||
1. `mongo` mongoシェルを起動
|
|
||||||
2. `use misskey` misskeyデータベースを使用
|
|
||||||
3. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` misskeyユーザーを作成
|
|
||||||
4. `exit` mongoシェルを終了
|
|
||||||
|
|
||||||
*4.* Misskeyのインストール
|
`su - misskey`
|
||||||
----------------------------------------------------------------
|
|
||||||
1. `su - misskey` misskeyユーザーを使用
|
|
||||||
2. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
|
|
||||||
3. `cd misskey` misskeyディレクトリに移動
|
|
||||||
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
|
||||||
5. `npm install` Misskeyの依存パッケージをインストール
|
|
||||||
|
|
||||||
*5.* 設定ファイルを作成する
|
2. masterブランチからMisskeyレポジトリをクローン
|
||||||
|
|
||||||
|
`git clone -b master git://github.com/syuilo/misskey.git`
|
||||||
|
|
||||||
|
3. misskeyディレクトリに移動
|
||||||
|
|
||||||
|
`cd misskey`
|
||||||
|
|
||||||
|
4. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
|
||||||
|
|
||||||
|
`git checkout master`
|
||||||
|
|
||||||
|
5. Misskeyの依存パッケージをインストール
|
||||||
|
|
||||||
|
`npm install`
|
||||||
|
|
||||||
|
*4.* 設定ファイルを作成する
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。
|
1. `.config/example.yml`をコピーし名前を`default.yml`にする。
|
||||||
|
|
||||||
|
`cp .config/example.yml .config/default.yml`
|
||||||
|
|
||||||
2. `default.yml` を編集する。
|
2. `default.yml` を編集する。
|
||||||
|
|
||||||
*6.* Misskeyのビルド
|
*5.* Misskeyのビルド
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
次のコマンドでMisskeyをビルドしてください:
|
次のコマンドでMisskeyをビルドしてください:
|
||||||
@ -74,6 +76,12 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
|||||||
3. `node-gyp build`
|
3. `node-gyp build`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
|
|
||||||
|
*6.* データベースを初期化
|
||||||
|
----------------------------------------------------------------
|
||||||
|
``` shell
|
||||||
|
npm run init
|
||||||
|
```
|
||||||
|
|
||||||
*7.* 以上です!
|
*7.* 以上です!
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
お疲れ様でした。これでMisskeyを動かす準備は整いました。
|
||||||
@ -82,38 +90,47 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
|
|||||||
`NODE_ENV=production npm start`するだけです。GLHF!
|
`NODE_ENV=production npm start`するだけです。GLHF!
|
||||||
|
|
||||||
### systemdを用いた起動
|
### systemdを用いた起動
|
||||||
1. systemdサービスのファイルを作成: `/etc/systemd/system/misskey.service`
|
1. systemdサービスのファイルを作成
|
||||||
|
|
||||||
|
`/etc/systemd/system/misskey.service`
|
||||||
|
|
||||||
2. エディタで開き、以下のコードを貼り付けて保存:
|
2. エディタで開き、以下のコードを貼り付けて保存:
|
||||||
|
|
||||||
```
|
```
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Misskey daemon
|
Description=Misskey daemon
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=misskey
|
User=misskey
|
||||||
ExecStart=/usr/bin/npm start
|
ExecStart=/usr/bin/npm start
|
||||||
WorkingDirectory=/home/misskey/misskey
|
WorkingDirectory=/home/misskey/misskey
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
TimeoutSec=60
|
TimeoutSec=60
|
||||||
StandardOutput=syslog
|
StandardOutput=syslog
|
||||||
StandardError=syslog
|
StandardError=syslog
|
||||||
SyslogIdentifier=misskey
|
SyslogIdentifier=misskey
|
||||||
Restart=always
|
Restart=always
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
|
||||||
|
|
||||||
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
|
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
||||||
4. `systemctl start misskey` misskeyサービスの起動
|
|
||||||
|
3. systemdを再読み込みしmisskeyサービスを有効化
|
||||||
|
|
||||||
|
`systemctl daemon-reload ; systemctl enable misskey`
|
||||||
|
|
||||||
|
4. misskeyサービスの起動
|
||||||
|
|
||||||
|
`systemctl start misskey`
|
||||||
|
|
||||||
`systemctl status misskey`と入力すると、サービスの状態を調べることができます。
|
`systemctl status misskey`と入力すると、サービスの状態を調べることができます。
|
||||||
|
|
||||||
### Misskeyを最新バージョンにアップデートする方法:
|
### Misskeyを最新バージョンにアップデートする方法:
|
||||||
1. `git fetch`
|
1. `git checkout master`
|
||||||
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
|
2. `git pull`
|
||||||
3. `npm install`
|
3. `npm install`
|
||||||
4. `NODE_ENV=production npm run build`
|
4. `NODE_ENV=production npm run build`
|
||||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||||
|
@ -49,7 +49,6 @@ gulp.task('build:copy:views', () =>
|
|||||||
|
|
||||||
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
gulp.task('build:copy', gulp.parallel('build:copy:views', () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./build/Release/crypto_key.node',
|
|
||||||
'./src/const.json',
|
'./src/const.json',
|
||||||
'./src/server/web/views/**/*',
|
'./src/server/web/views/**/*',
|
||||||
'./src/**/assets/**/*',
|
'./src/**/assets/**/*',
|
||||||
@ -120,7 +119,7 @@ gulp.task('copy:client', () =>
|
|||||||
])
|
])
|
||||||
.pipe(isProduction ? (imagemin as any)() : gutil.noop())
|
.pipe(isProduction ? (imagemin as any)() : gutil.noop())
|
||||||
.pipe(rename(path => {
|
.pipe(rename(path => {
|
||||||
path.dirname = path.dirname.replace('assets', '.');
|
path.dirname = path.dirname!.replace('assets', '.');
|
||||||
}))
|
}))
|
||||||
.pipe(gulp.dest('./built/client/assets/'))
|
.pipe(gulp.dest('./built/client/assets/'))
|
||||||
);
|
);
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
meta:
|
meta:
|
||||||
lang: "Čeština"
|
lang: "Čeština"
|
||||||
common:
|
common:
|
||||||
misskey: "⭐ ve fediverse"
|
misskey: "⭐ ve fedivesmíru"
|
||||||
about-title: "⭐ ve fediverse."
|
about-title: "⭐ ve fedivesmíru."
|
||||||
about: "Děkujeme, že jste našli Misskey. Misskey je <b>decentralizovaná mikroblogovací platforma</b> zrozená na Zemi. Neboť existuje ve Fediverse (vesmíru, kde jsou organizovány různé sociální sítě), je vzájemně propojena s jinými sociálními sítěmi. Co takhle si chvilku odpočinout od ruchu a shonu města a ponořit se do nového internetu?"
|
about: "Děkujeme, že jste našli Misskey. Misskey je <b>decentralizovaná mikroblogovací platforma</b> zrozená na Zemi. Neboť existuje ve fedivesmíru (vesmíru, kde jsou organizovány různé sociální sítě), je vzájemně propojena s jinými sociálními sítěmi. Co takhle si chvilku odpočinout od ruchu a shonu města a ponořit se do nového internetu?"
|
||||||
intro:
|
intro:
|
||||||
title: "Co je Misskey?"
|
title: "Co je Misskey?"
|
||||||
about: "Misskey je open-source <b>decentralizovaný mikroblogovací software</b>. Má sofistikované, zcela přizpůsobitelné uživatelské rozhraní, různé způsoby reagování na příspěvky, bezplatné úložiště souborů nabízející integrovaný management system, a další pokročilé vlastnosti. Misskey je navíc připojeno k systému sítí zvanému „fediverse“, který nám dovoluje komunikovat s uživateli na jiných sociálních sítí. Pokud například něco napíšete, nebude to posláno pouze uživatelů Misskey, ale také lidem na sítích Mastodon a Pleroma. Jen si představte, že planeta posílá jiné planetě rádiový signál, aby s ní komunikovala."
|
about: "Misskey je open-source <b>decentralizovaný mikroblogovací software</b>. Má sofistikované, zcela přizpůsobitelné uživatelské rozhraní, různé způsoby reagování na příspěvky, bezplatné úložiště souborů nabízející integrovaný management system, a další pokročilé vlastnosti. Misskey je navíc připojeno k systému sítí zvanému „fedivesmír“ nebo „fediverse“, který nám dovoluje komunikovat s uživateli na jiných sociálních sítí. Pokud například něco napíšete, nebude to posláno pouze uživatelů Misskey, ale také lidem na sítích Mastodon a Pleroma. Jen si představte, že planeta posílá jiné planetě rádiový signál, aby s ní komunikovala."
|
||||||
features: "Vlastnosti"
|
features: "Vlastnosti"
|
||||||
rich-contents: "Příspěvky"
|
rich-contents: "Příspěvky"
|
||||||
rich-contents-desc: "Pouze napište svoje nápady, žhavá témata a cokoliv, co chcete sdílet. Můžete ozdobit svá slova, připojit vaše oblíbené obrázky, posílat soubory včetně videí či vytvořit hlasování – to je jen několik věcí, co můžete dělat s Misskey!"
|
rich-contents-desc: "Pouze napište svoje nápady, žhavá témata a cokoliv, co chcete sdílet. Můžete ozdobit svá slova, připojit vaše oblíbené obrázky, posílat soubory včetně videí či vytvořit hlasování – to je jen několik věcí, co můžete dělat s Misskey!"
|
||||||
@ -20,7 +20,7 @@ common:
|
|||||||
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:
|
adblock:
|
||||||
detected: "Prosím vypněte svůj blokovač reklam"
|
detected: "Prosím vypněte svůj blokovač reklam"
|
||||||
warning: "<strong>Misskey nepoužívá reklamy</strong>, některé vlastnosti však mohou být nedostupné nebo mohou způsobovat chyby, pokud máte povolený 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."
|
||||||
@ -69,6 +69,9 @@ common:
|
|||||||
following: "Sledovaní"
|
following: "Sledovaní"
|
||||||
followers: "Sledující"
|
followers: "Sledující"
|
||||||
favorites: "Oblíbené"
|
favorites: "Oblíbené"
|
||||||
|
permissions:
|
||||||
|
'read:drive': "Prohlížet Disk"
|
||||||
|
'write:drive': "Pracovat s Diskem"
|
||||||
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"
|
||||||
@ -131,7 +134,7 @@ common:
|
|||||||
other: "Ostatní"
|
other: "Ostatní"
|
||||||
appearance: "Vzhled"
|
appearance: "Vzhled"
|
||||||
behavior: "Chování"
|
behavior: "Chování"
|
||||||
fetch-on-scroll: "Nekonečné rolování"
|
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"
|
||||||
default-note-visibility: "Výchozí viditelnost příspěvku"
|
default-note-visibility: "Výchozí viditelnost příspěvku"
|
||||||
@ -227,6 +230,7 @@ common:
|
|||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
update-available-title: "Aktualizace k dispozici"
|
update-available-title: "Aktualizace k dispozici"
|
||||||
update-available: "Je k dispozici nová verze Misskey ({newer},vaše verze je {current}). Pro aplikování nové verze znovunačtěte stránku."
|
update-available: "Je k dispozici nová verze Misskey ({newer},vaše verze je {current}). Pro aplikování nové verze znovunačtěte stránku."
|
||||||
|
my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a."
|
||||||
verified-user: "Ověřené účty"
|
verified-user: "Ověřené účty"
|
||||||
hide-password: "Skrýt heslo"
|
hide-password: "Skrýt heslo"
|
||||||
show-password: "Zobrazit heslo"
|
show-password: "Zobrazit heslo"
|
||||||
@ -281,12 +285,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Chcete dovolit aplikaci <i>{name}</i> přístup k vašemu účtu?"
|
share-access: "Chcete dovolit aplikaci <i>{name}</i> přístup k vašemu účtu?"
|
||||||
permission-ask: "Tato aplikace vyžaduje následující oprávnění:"
|
permission-ask: "Tato aplikace vyžaduje následující oprávnění:"
|
||||||
account-read: "Zobrazit informace účtu"
|
|
||||||
note-write: "Odeslat."
|
|
||||||
following-write: "Sledovat a přestat sledovat"
|
|
||||||
drive-read: "Přečíst váš Disk"
|
|
||||||
notification-read: "Sledovat oznámení."
|
|
||||||
notification-write: "Zpravovat notifikace."
|
|
||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
accept: "Povolit přístup"
|
accept: "Povolit přístup"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -300,10 +298,12 @@ common/views/pages/explore.vue:
|
|||||||
recently-updated-users: "Nedávno aktívni uživatelé"
|
recently-updated-users: "Nedávno aktívni uživatelé"
|
||||||
recently-registered-users: "Nedávno registrovaní uživatelé"
|
recently-registered-users: "Nedávno registrovaní uživatelé"
|
||||||
popular-tags: "Populární tagy"
|
popular-tags: "Populární tagy"
|
||||||
federated: "Z fediverse"
|
federated: "Z fedivesmíru"
|
||||||
explore: "Prozkoumat {host}"
|
explore: "Prozkoumat {host}"
|
||||||
|
users-info: "Aktuálně je zde registrováno {users} uživatelů"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "Otevřít v přehrávači"
|
enable-player: "Otevřít v přehrávači"
|
||||||
|
disable-player: "Zavřít přehrávač"
|
||||||
common/views/components/user-list.vue:
|
common/views/components/user-list.vue:
|
||||||
no-users: "Žádní uživatelé"
|
no-users: "Žádní uživatelé"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
@ -353,19 +353,23 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
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"
|
||||||
common/views/components/media-banner.vue:
|
common/views/components/media-banner.vue:
|
||||||
click-to-show: "Klikněte pro zobrazení"
|
click-to-show: "Klikněte pro zobrazení"
|
||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
light-theme: "Šablona pro použití ve světlém vzhledu"
|
light-theme: "Motiv pro použití ve světlém vzhledu"
|
||||||
dark-theme: "Šablona 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"
|
||||||
dark-themes: "Tmavý vzhled"
|
dark-themes: "Tmavý vzhled"
|
||||||
install-a-theme: "Nainstalovat šablonu"
|
install-a-theme: "Nainstalovat motiv"
|
||||||
theme-code: "Kód šablony"
|
theme-code: "Kód motivu"
|
||||||
install: "Nainstalovat"
|
install: "Nainstalovat"
|
||||||
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"
|
||||||
base-theme: "Základní vzhled"
|
base-theme: "Základní vzhled"
|
||||||
|
base-theme-light: "Světlý"
|
||||||
|
base-theme-dark: "Tmavý"
|
||||||
find-more-theme: "Najít další vzhledy"
|
find-more-theme: "Najít další vzhledy"
|
||||||
theme-name: "Jméno vzhledu"
|
theme-name: "Jméno vzhledu"
|
||||||
preview-created-theme: "Náhled"
|
preview-created-theme: "Náhled"
|
||||||
@ -434,18 +438,25 @@ common/views/components/user-menu.vue:
|
|||||||
unblock: "Odblokovat"
|
unblock: "Odblokovat"
|
||||||
push-to-list: "Přidat do seznamu"
|
push-to-list: "Přidat do seznamu"
|
||||||
select-list: "Vyberte seznam"
|
select-list: "Vyberte seznam"
|
||||||
|
report-abuse: "Nahlásit spam"
|
||||||
report-abuse-reported: "Problém byl nahlášen administrátorovi. Děkujeme za Vaší kooperaci."
|
report-abuse-reported: "Problém byl nahlášen administrátorovi. Děkujeme za Vaší kooperaci."
|
||||||
|
silence: "Ztlumit"
|
||||||
|
suspend: "Zmrazit"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-count: "{} hlasů"
|
vote-count: "{} hlasů"
|
||||||
vote: "Hlasovat"
|
vote: "Hlasovat"
|
||||||
show-result: "Podívat se na výsledky"
|
show-result: "Podívat se na výsledky"
|
||||||
voted: "Už jste hlasovaly"
|
voted: "Už jste hlasovaly"
|
||||||
|
closed: "Ukončeno"
|
||||||
remaining-days: "zbývá {d} dnů, {h} hodin"
|
remaining-days: "zbývá {d} dnů, {h} hodin"
|
||||||
remaining-hours: "zbývá {h} hodin, a {m} minut"
|
remaining-hours: "zbývá {h} hodin, a {m} minut"
|
||||||
remaining-minutes: "zbývá {m} minut, a {s} sekund"
|
remaining-minutes: "zbývá {m} minut, a {s} sekund"
|
||||||
remaining-seconds: "zbývá {s} sekund"
|
remaining-seconds: "zbývá {s} sekund"
|
||||||
common/views/components/poll-editor.vue:
|
common/views/components/poll-editor.vue:
|
||||||
no-only-one-choice: "Musíte vybrat alespoň dvě možnosti"
|
no-only-one-choice: "Musíte vybrat alespoň dvě možnosti"
|
||||||
|
destroy: "Zahodit dotazník"
|
||||||
|
infinite: "Nekonečne"
|
||||||
|
at: "Výběr data a času"
|
||||||
day: "Ne"
|
day: "Ne"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "Emoji"
|
custom-emoji: "Emoji"
|
||||||
@ -602,6 +613,8 @@ 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/pages/not-found.vue:
|
||||||
|
page-not-found: "Stránka nenalezena"
|
||||||
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"
|
||||||
@ -686,10 +699,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Zprávy:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Zprávy"
|
|
||||||
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"
|
||||||
@ -788,14 +797,11 @@ desktop/views/components/settings.tags.vue:
|
|||||||
title: "Tagy"
|
title: "Tagy"
|
||||||
add: "Přidat"
|
add: "Přidat"
|
||||||
save: "Uložit"
|
save: "Uložit"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Správce úloh"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Domů"
|
home: "Domů"
|
||||||
local: "Lokální"
|
local: "Lokální"
|
||||||
global: "Globální"
|
global: "Globální"
|
||||||
mentions: "Zmínění"
|
mentions: "Zmínění"
|
||||||
messages: "Zprávy"
|
|
||||||
list: "Seznamy"
|
list: "Seznamy"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
add-list: "Přidat do seznamu"
|
add-list: "Přidat do seznamu"
|
||||||
@ -835,7 +841,7 @@ admin/views/index.vue:
|
|||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
moderators: "Moderátoři"
|
moderators: "Moderátoři"
|
||||||
users: "Uživatelé"
|
users: "Uživatelé"
|
||||||
federation: "Z fediversu"
|
federation: "Z fedivesmíru"
|
||||||
announcements: "Oznámení"
|
announcements: "Oznámení"
|
||||||
hashtags: "Hashtagy"
|
hashtags: "Hashtagy"
|
||||||
queue: "Fronta úloh"
|
queue: "Fronta úloh"
|
||||||
@ -847,9 +853,7 @@ admin/views/dashboard.vue:
|
|||||||
drive: "Disk"
|
drive: "Disk"
|
||||||
instances: "Instance"
|
instances: "Instance"
|
||||||
this-instance: "Tato instance"
|
this-instance: "Tato instance"
|
||||||
federated: "Z fediversu"
|
federated: "Z fedivesmíru"
|
||||||
admin/views/queue.vue:
|
|
||||||
operation: "Akce"
|
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "Popis"
|
details: "Popis"
|
||||||
remove-report: "Odstranit"
|
remove-report: "Odstranit"
|
||||||
@ -996,14 +1000,15 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Skryté tagy"
|
hided-tags: "Skryté tagy"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "Z fediversu"
|
instance: "Instance"
|
||||||
host: "Hostitel"
|
host: "Hostitel"
|
||||||
notes: "Poznámky"
|
notes: "Poznámky"
|
||||||
users: "Uživatelé"
|
users: "Uživatelé"
|
||||||
|
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"
|
||||||
block: "Blokován"
|
block: "Blokován"
|
||||||
instances: "Instance"
|
instances: "Z fedivesmíru"
|
||||||
states:
|
states:
|
||||||
all: "Všechny"
|
all: "Všechny"
|
||||||
blocked: "Blokován"
|
blocked: "Blokován"
|
||||||
@ -1057,8 +1062,6 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
posts: "Poznámky"
|
posts: "Poznámky"
|
||||||
month: "Po"
|
month: "Po"
|
||||||
day: "Ne"
|
day: "Ne"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Zprávy"
|
|
||||||
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:
|
||||||
@ -1139,7 +1142,6 @@ mobile/views/pages/home.vue:
|
|||||||
local: "Lokální"
|
local: "Lokální"
|
||||||
global: "Globální"
|
global: "Globální"
|
||||||
mentions: "Zmínění"
|
mentions: "Zmínění"
|
||||||
messages: "Zprávy"
|
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "Nebyly nalezeny žádné příspěvky s \"{q}\"."
|
no-posts-found: "Nebyly nalezeny žádné příspěvky s \"{q}\"."
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@ -1184,10 +1186,3 @@ 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"
|
||||||
app-desc: "Stručný popis nebo představení vaší aplikace."
|
app-desc: "Stručný popis nebo představení vaší aplikace."
|
||||||
account-read: "Zobrazit informace účtu"
|
|
||||||
note-write: "Odeslat."
|
|
||||||
reaction-write: "Přidat nebo odebrat reakce."
|
|
||||||
following-write: "Sledovat a přestat sledovat"
|
|
||||||
drive-read: "Přečíst váš Disk"
|
|
||||||
notification-read: "Sledovat oznámení."
|
|
||||||
notification-write: "Zpravovat notifikace."
|
|
||||||
|
@ -7,6 +7,7 @@ common:
|
|||||||
about: "Danke, dass Du Misskey gefunden hast. Misskey ist eine <b>dezentralisierte Microblogging-Plattform</b>, welche auf der ganzen Welt verteilt ist. Da es innerhalb es Fediversums existiert (ein Universum, in dem verschiedene Soziale Netzwerke organisiert sind), ist es unmittelbar mit anderen sozialen Netzwerken verbunden. Warum nimmst du dir nicht einmal eine Auszeit von dem Trubel der Stadt und tauchst in das neue Internet hinein?"
|
about: "Danke, dass Du Misskey gefunden hast. Misskey ist eine <b>dezentralisierte Microblogging-Plattform</b>, welche auf der ganzen Welt verteilt ist. Da es innerhalb es Fediversums existiert (ein Universum, in dem verschiedene Soziale Netzwerke organisiert sind), ist es unmittelbar mit anderen sozialen Netzwerken verbunden. Warum nimmst du dir nicht einmal eine Auszeit von dem Trubel der Stadt und tauchst in das neue Internet hinein?"
|
||||||
intro:
|
intro:
|
||||||
title: "Was ist Misskey?"
|
title: "Was ist Misskey?"
|
||||||
|
about: "Misskey ist eine Quelloffene, <b>dezentralisierte microblogging Software</b>. Es bietet eine erweiterbare Benutzeroberfläche, verschiedenste Möglichkeiten auf Beiträge zu reagieren, kostenlosen Datenspeicher, und andere fortschrittliche Funktionen. Zusätzlich ist Misskey dazu in der Lage, sich mittels des Fediverse mit beliebig vielen anderen ActivityPub-kompatiblen Diensten zu verbinden. Wenn du zum Beispiel einen Betrag mit Misskey abschickst, wird dieser auch für Nutzer von Mastodon oder Pleroma sichtbar sein. So ähnlich wie eine Radioübertragung zwischen Planeten."
|
||||||
features: "Funktionen"
|
features: "Funktionen"
|
||||||
rich-contents: "Notizen"
|
rich-contents: "Notizen"
|
||||||
reaction: "Reaktionen"
|
reaction: "Reaktionen"
|
||||||
@ -19,6 +20,13 @@ common:
|
|||||||
load-more: "Mehr laden"
|
load-more: "Mehr laden"
|
||||||
enter-password: "Bitte Passwort eingeben"
|
enter-password: "Bitte Passwort eingeben"
|
||||||
2fa: "Zwei-Faktor-Authentifizierung"
|
2fa: "Zwei-Faktor-Authentifizierung"
|
||||||
|
customize-home: "Layout Anpassen"
|
||||||
|
featured-notes: "Hervorgehobene Beiträge"
|
||||||
|
dark-mode: "Dunkler Modus"
|
||||||
|
signin: "Einloggen"
|
||||||
|
signup: "Registrieren"
|
||||||
|
signout: "Ausloggen"
|
||||||
|
reload-to-apply-the-setting: "Die Seite muss zum Übernehmen dieser Einstellung aktualisiert werden. Soll die Seite jetzt neu geladen werden?"
|
||||||
got-it: "Verstanden!"
|
got-it: "Verstanden!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Anpassung-Tipps"
|
title: "Anpassung-Tipps"
|
||||||
@ -26,6 +34,7 @@ common:
|
|||||||
notification:
|
notification:
|
||||||
file-uploaded: "Datei hochgeladen!"
|
file-uploaded: "Datei hochgeladen!"
|
||||||
message-from: "Nachricht von {}:"
|
message-from: "Nachricht von {}:"
|
||||||
|
reversi-invited: "Zu einem Spiel eingeladen"
|
||||||
reversi-invited-by: "Eingeladen von {}:"
|
reversi-invited-by: "Eingeladen von {}:"
|
||||||
notified-by: "Benachrichtigt von {}:"
|
notified-by: "Benachrichtigt von {}:"
|
||||||
reply-from: "Antwort von {}:"
|
reply-from: "Antwort von {}:"
|
||||||
@ -46,7 +55,20 @@ common:
|
|||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
messaging: "Unterhaltungen"
|
messaging: "Unterhaltungen"
|
||||||
home: "Home"
|
home: "Home"
|
||||||
favorites: "Diese Notiz favorisieren"
|
deck: "Stapel"
|
||||||
|
timeline: "Zeitleiste"
|
||||||
|
explore: "Entdecken"
|
||||||
|
following: "Folgt"
|
||||||
|
followers: "Folgende"
|
||||||
|
favorites: "Diesen Beitrag favorisieren"
|
||||||
|
permissions:
|
||||||
|
'read:account': "Accountinformationen anzeigen."
|
||||||
|
'write:account': "Accountinformationen bearbeiten."
|
||||||
|
'read:drive': "Dateien anzeigen"
|
||||||
|
'write:drive': "Dateien bearbeiten"
|
||||||
|
empty-timeline-info:
|
||||||
|
follow-users-to-make-your-timeline: "Beiträge von Benutzern, denen du folgst, werden in der Zeitleiste angezeigt."
|
||||||
|
explore: "Benutzer finden"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "So"
|
sunday: "So"
|
||||||
monday: "Mo"
|
monday: "Mo"
|
||||||
@ -77,11 +99,11 @@ common:
|
|||||||
note-visibility:
|
note-visibility:
|
||||||
public: "Öffentlich"
|
public: "Öffentlich"
|
||||||
home: "Startseite"
|
home: "Startseite"
|
||||||
home-desc: "Nur auf die Startseite posten"
|
home-desc: "Auf die Startseite posten"
|
||||||
followers: "Abonnenten"
|
followers: "Abonnenten"
|
||||||
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
||||||
specified: "Direkt"
|
specified: "Direkt"
|
||||||
specified-desc: "Nur für bestimmte Benutzer posten"
|
specified-desc: "Nur für bestimmte Benutzer sichtbar"
|
||||||
local-public: "Öffentlich (nur lokal)"
|
local-public: "Öffentlich (nur lokal)"
|
||||||
local-home: "Home (nur lokal)"
|
local-home: "Home (nur lokal)"
|
||||||
local-followers: "Follower (nur lokal)"
|
local-followers: "Follower (nur lokal)"
|
||||||
@ -91,11 +113,34 @@ common:
|
|||||||
c: "Was geht dir durch den Kopf?"
|
c: "Was geht dir durch den Kopf?"
|
||||||
d: "Willst du etwas sagen?"
|
d: "Willst du etwas sagen?"
|
||||||
e: "Schreib hier etwas!"
|
e: "Schreib hier etwas!"
|
||||||
f: "Warte darauf, das du schreibst."
|
f: "Warte darauf, das du schreibst..."
|
||||||
|
settings: "Einstellungen"
|
||||||
_settings:
|
_settings:
|
||||||
profile: "Dein Profil"
|
profile: "Dein Profil"
|
||||||
notification: "Benachrichtigungen"
|
notification: "Benachrichtigungen"
|
||||||
|
apps: "Anwendungen"
|
||||||
|
tags: "Hashtags"
|
||||||
|
mute-and-block: "Stummschalten/Blocken"
|
||||||
|
blocking: "Blocken"
|
||||||
|
security: "Sicherheit"
|
||||||
|
signin: "Login-Verlauf"
|
||||||
password: "Passwort"
|
password: "Passwort"
|
||||||
|
other: "Mehr"
|
||||||
|
appearance: "Designs"
|
||||||
|
behavior: "Verhalten"
|
||||||
|
fetch-on-scroll: "Unendliches laden beim scrollen"
|
||||||
|
fetch-on-scroll-desc: "Wenn beim scrollen das Ende erreicht wird, lädt die Anwendung automatisch neue Inhalte nach."
|
||||||
|
note-visibility: "Sichtbarkeit von Beiträgen"
|
||||||
|
default-note-visibility: "Die Standardsichtbarkeit"
|
||||||
|
remember-note-visibility: "Erinnerung an Sichtbarkeit von Beiträgen"
|
||||||
|
web-search-engine: "Web-Suchmaschine"
|
||||||
|
web-search-engine-desc: "Beispiel: https://www.google.de/search?q={{query}}"
|
||||||
|
keep-cw: "Inhaltswarnung beibehalten"
|
||||||
|
keep-cw-desc: "Wenn auf einen Beitrag geantwortet wird, wird die Inhaltswarnung des Originalbeitrags übernommen."
|
||||||
|
i-like-sushi: "Ich bevorzuge Sushi anstelle von Pudding"
|
||||||
|
show-reversi-board-labels: "Zeige Reihen- und Spaltenbeschreibungen in Reversi an"
|
||||||
|
use-avatar-reversi-stones: "Avatar als Stein in Reversi anzeigen"
|
||||||
|
disable-animated-mfm: "Animierten Text in Beiträgen deaktivieren"
|
||||||
search: "Suche"
|
search: "Suche"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
loading: "Laden"
|
loading: "Laden"
|
||||||
@ -103,7 +148,7 @@ common:
|
|||||||
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
||||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||||
verified-user: "Verifizierter Benutzer"
|
verified-user: "Verifizierter Benutzer"
|
||||||
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktionsumgebung verwenden."
|
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktivumgebung verwenden."
|
||||||
error:
|
error:
|
||||||
retry: "Erneut versuchen"
|
retry: "Erneut versuchen"
|
||||||
reversi:
|
reversi:
|
||||||
@ -117,7 +162,7 @@ common:
|
|||||||
analog-clock: "Analoge Uhr"
|
analog-clock: "Analoge Uhr"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
calendar: "Kalender"
|
calendar: "Kalender"
|
||||||
timemachine: "Kalender (Zeitmaschiene)"
|
timemachine: "Kalender (Zeitmaschine)"
|
||||||
activity: "Aktivitäten"
|
activity: "Aktivitäten"
|
||||||
rss: "RSS Leser"
|
rss: "RSS Leser"
|
||||||
memo: "Notizen"
|
memo: "Notizen"
|
||||||
@ -128,7 +173,7 @@ common:
|
|||||||
notifications: "Benachrichtigungen"
|
notifications: "Benachrichtigungen"
|
||||||
users: "Empfohlene Benutzer"
|
users: "Empfohlene Benutzer"
|
||||||
polls: "Umfrage"
|
polls: "Umfrage"
|
||||||
post-form: "Beitragsform"
|
post-form: "\"Neuer Beitrag\"-Formular"
|
||||||
server: "Server-Info"
|
server: "Server-Info"
|
||||||
nav: "Navigation"
|
nav: "Navigation"
|
||||||
tips: "Tipps"
|
tips: "Tipps"
|
||||||
@ -138,13 +183,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Erlaubst Du <i>{name}</i> auf deinen Account zuzugreifen?"
|
share-access: "Erlaubst Du <i>{name}</i> auf deinen Account zuzugreifen?"
|
||||||
permission-ask: "Diese Applikation benötigt folgende Berechtigungen:"
|
permission-ask: "Diese Applikation benötigt folgende Berechtigungen:"
|
||||||
account-read: "Accountinformationen anzeigen."
|
|
||||||
account-write: "Accountinformationen bearbeiten."
|
|
||||||
note-write: "Senden."
|
|
||||||
like-write: "Auf Beiträge reagieren."
|
|
||||||
following-write: "Folgen oder entfolgen."
|
|
||||||
notification-read: "Siehe deine Benachrichtigungen."
|
|
||||||
notification-write: "Benachrichtigungen verwalten."
|
|
||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
accept: "Zugriff erlauben."
|
accept: "Zugriff erlauben."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -185,7 +223,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
ready: "Bereit"
|
ready: "Bereit"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "Verbindung zum Server ist fehlgeschlagen"
|
title: "Verbindung zum Server ist fehlgeschlagen"
|
||||||
description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal."
|
description: "Entweder gibt es ein Problem mit deiner Internetverbindung oder der Server ist zur Zeit nicht erreichbar oder wird gewartet. Bitte versuche es später noch einmal."
|
||||||
thanks: "Vielen Dank für das nutzen von Misskey."
|
thanks: "Vielen Dank für das nutzen von Misskey."
|
||||||
troubleshoot: "Problembehandlung"
|
troubleshoot: "Problembehandlung"
|
||||||
common/views/components/connect-failed.troubleshooter.vue:
|
common/views/components/connect-failed.troubleshooter.vue:
|
||||||
@ -202,8 +240,8 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
no-internet: "Keine Internetverbindung"
|
no-internet: "Keine Internetverbindung"
|
||||||
no-internet-desc: "Bitte vergewissere dich, dass du mit dem Internet verbunden bist."
|
no-internet-desc: "Bitte vergewissere dich, dass du mit dem Internet verbunden bist."
|
||||||
no-server: "Verbindung mit dem Server nicht möglich"
|
no-server: "Verbindung mit dem Server nicht möglich"
|
||||||
no-server-desc: "Die Internetverbindung scheint in Ordnung zu sein, aber eine Verbindung mit dem Misskey Server konnte nicht hergestellt werden. Möglicherweise ist dieser zur Zeit offline oder in der Wartung, bitte versuche es später noch einmal."
|
no-server-desc: "Die Internetverbindung scheint in Ordnung zu sein, aber eine Verbindung mit dem Misskey-Server konnte nicht hergestellt werden. Möglicherweise ist dieser zur Zeit offline oder wird gewartet. Bitte versuche es später noch einmal."
|
||||||
success: "Erfolgreich mit dem Misskey Server verbunden"
|
success: "Erfolgreich mit dem Misskey-Server verbunden"
|
||||||
success-desc: "Die Verbindung scheint zu funktionieren. Bitte lade die Seite neu."
|
success-desc: "Die Verbindung scheint zu funktionieren. Bitte lade die Seite neu."
|
||||||
flush: "Cache leeren"
|
flush: "Cache leeren"
|
||||||
set-version: "Version angeben"
|
set-version: "Version angeben"
|
||||||
@ -230,6 +268,7 @@ common/views/components/theme.vue:
|
|||||||
invalid-theme: "Thema ist ungültig"
|
invalid-theme: "Thema ist ungültig"
|
||||||
already-installed: "Thema ist bereits installiert"
|
already-installed: "Thema ist bereits installiert"
|
||||||
author: "Autor"
|
author: "Autor"
|
||||||
|
desc: "Beschreibung"
|
||||||
export: "Exportieren"
|
export: "Exportieren"
|
||||||
import: "Importieren"
|
import: "Importieren"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
@ -257,15 +296,15 @@ common/views/components/nav.vue:
|
|||||||
status: "Status"
|
status: "Status"
|
||||||
wiki: "Wiki"
|
wiki: "Wiki"
|
||||||
donors: "Spender"
|
donors: "Spender"
|
||||||
repository: "Projektarchiv"
|
repository: "Quellcode"
|
||||||
develop: "Entwickler"
|
develop: "Entwickler"
|
||||||
feedback: "Feedback"
|
feedback: "Feedback"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
favorite: "Diese Notiz favorisieren"
|
favorite: "Diesen Beitrag favorisieren"
|
||||||
unfavorite: "Aus Favoriten entfernen"
|
unfavorite: "Aus Favoriten entfernen"
|
||||||
pin: "An die Profilseite pinnen"
|
pin: "An die Profilseite pinnen"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
delete-confirm: "Diesen Post löschen?"
|
delete-confirm: "Diesen Beitrag löschen?"
|
||||||
remote: "Auf Quelle anzeigen"
|
remote: "Auf Quelle anzeigen"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Stimme für '{}'"
|
vote-to: "Stimme für '{}'"
|
||||||
@ -302,8 +341,8 @@ common/views/components/signup.vue:
|
|||||||
password: "Passwort"
|
password: "Passwort"
|
||||||
password-placeholder: "Wir empfehlen mindestens 8 Zeichen"
|
password-placeholder: "Wir empfehlen mindestens 8 Zeichen"
|
||||||
weak-password: "Schwaches Passwort"
|
weak-password: "Schwaches Passwort"
|
||||||
normal-password: "Faires Passwort"
|
normal-password: "Normales Passwort"
|
||||||
strong-password: "Schwaches Passwort"
|
strong-password: "Starkes Passwort"
|
||||||
retype: "Wiederholen"
|
retype: "Wiederholen"
|
||||||
retype-placeholder: "Bitte das Passwort erneut eingeben"
|
retype-placeholder: "Bitte das Passwort erneut eingeben"
|
||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
@ -325,16 +364,17 @@ common/views/components/uploader.vue:
|
|||||||
common/views/components/visibility-chooser.vue:
|
common/views/components/visibility-chooser.vue:
|
||||||
public: "Öffentlich"
|
public: "Öffentlich"
|
||||||
home: "Home"
|
home: "Home"
|
||||||
home-desc: "Nur auf die Startseite posten"
|
home-desc: "Auf die Startseite posten"
|
||||||
followers: "Folgende"
|
followers: "Folgende"
|
||||||
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
||||||
specified: "Direkt"
|
specified: "Direkt"
|
||||||
specified-desc: "Poste nur für bestimmte Benutzer"
|
specified-desc: "Nur für bestimmte Benutzer sichtbar"
|
||||||
local-public: "Öffentlich (nur lokal)"
|
local-public: "Öffentlich (nur lokal)"
|
||||||
local-home: "Home (nur lokal)"
|
local-home: "Home (nur lokal)"
|
||||||
local-followers: "Follower (nur lokal)"
|
local-followers: "Follower (nur lokal)"
|
||||||
common/views/components/profile-editor.vue:
|
common/views/components/profile-editor.vue:
|
||||||
title: "Dein Profil"
|
title: "Dein Profil"
|
||||||
|
name: "Name"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
@ -406,8 +446,8 @@ desktop/views/components/drive.file.vue:
|
|||||||
copied: "Kopieren erfolgreich"
|
copied: "Kopieren erfolgreich"
|
||||||
copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
|
copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
unable-to-process: "Der Vorgang konnte nicht beendet werden"
|
unable-to-process: "Der Vorgang konnte nicht abgeschlossen werden"
|
||||||
circular-reference-detected: "Das Zielverzeichnis ist ein Unterverzeichnis des Verzeichnisses welches du verschieben möchtest"
|
circular-reference-detected: "Das Zielverzeichnis ist innerhalb des Verzeichnisses, dass du verschieben möchtest"
|
||||||
unhandled-error: "Unbekannter Fehler"
|
unhandled-error: "Unbekannter Fehler"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "Verschiebe in diesen Ordner"
|
move-to-this-folder: "Verschiebe in diesen Ordner"
|
||||||
@ -422,7 +462,7 @@ desktop/views/components/drive.vue:
|
|||||||
empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen."
|
empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen."
|
||||||
empty-folder: "Dieser Ordner ist leer"
|
empty-folder: "Dieser Ordner ist leer"
|
||||||
unable-to-process: "Der Vorgang konnte nicht beendet werden"
|
unable-to-process: "Der Vorgang konnte nicht beendet werden"
|
||||||
circular-reference-detected: "Das Zielverzeichnis ist ein Unterverzeichnis des Verzeichnisses welches du verschieben möchtest"
|
circular-reference-detected: "Das Zielverzeichnis ist innerhalb des Verzeichnisses, dass du verschieben möchtest"
|
||||||
unhandled-error: "Unbekannter Fehler"
|
unhandled-error: "Unbekannter Fehler"
|
||||||
url-upload: "Von einer URL hochladen"
|
url-upload: "Von einer URL hochladen"
|
||||||
url-of-file: "URL der Datei, welche du hochladen möchtest"
|
url-of-file: "URL der Datei, welche du hochladen möchtest"
|
||||||
@ -445,20 +485,16 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Nachrichten:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Nachrichten"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "Dieser Post ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
location: "Ort"
|
location: "Ort"
|
||||||
renote: "Anmerkung"
|
renote: "Anmerkung"
|
||||||
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: "Anmerkung"
|
renote: "Anmerken"
|
||||||
private: "Dieser Post ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "Laden fehlgeschlagen."
|
error: "Laden fehlgeschlagen."
|
||||||
@ -470,9 +506,9 @@ desktop/views/components/post-form.vue:
|
|||||||
hide-contents: "Inhalt verstecken"
|
hide-contents: "Inhalt verstecken"
|
||||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
reply-placeholder: "Antworte auf diese Anmerkung..."
|
||||||
quote-placeholder: "Zitiere diese Anmerkung..."
|
quote-placeholder: "Zitiere diese Anmerkung..."
|
||||||
submit: "Beitragsform"
|
submit: "Abschicken"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
renote: "Anmerkung"
|
renote: "Anmerken"
|
||||||
posted: "Gepostet!"
|
posted: "Gepostet!"
|
||||||
replied: "Geantwortet!"
|
replied: "Geantwortet!"
|
||||||
reposted: "Weitergesagt!"
|
reposted: "Weitergesagt!"
|
||||||
@ -482,14 +518,13 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "Posting"
|
posting: "Posting"
|
||||||
attach-media-from-local: "Medien von deinem PC hinzufügen"
|
attach-media-from-local: "Medien von deinem PC hinzufügen"
|
||||||
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
|
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
|
||||||
attach-cancel: "Hinzufügen abbrechen"
|
|
||||||
create-poll: "Eine Abstimmung erstellen"
|
create-poll: "Eine Abstimmung erstellen"
|
||||||
text-remain: "{} Zeichen verbleibend"
|
text-remain: "{} Zeichen verbleibend"
|
||||||
visibility: "Sichtbarkeit"
|
visibility: "Sichtbarkeit"
|
||||||
error: "Fehler"
|
error: "Fehler"
|
||||||
enter-username: "Bitte gib einen Benutzernamen ein..."
|
enter-username: "Bitte gib einen Benutzernamen ein..."
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "Neue Notiz"
|
note: "Neuer Beitrag"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
attaches: "{} Medien hinzugefügt"
|
attaches: "{} Medien hinzugefügt"
|
||||||
uploading-media: "Lade {} Medien hoch"
|
uploading-media: "Lade {} Medien hoch"
|
||||||
@ -503,7 +538,7 @@ desktop/views/components/renote-form.vue:
|
|||||||
success: "Weitergesagt!"
|
success: "Weitergesagt!"
|
||||||
failure: "Weitersagen fehlgeschlagen"
|
failure: "Weitersagen fehlgeschlagen"
|
||||||
desktop/views/components/renote-form-window.vue:
|
desktop/views/components/renote-form-window.vue:
|
||||||
title: "Bist du dir sicher, dass du das reposten willst?"
|
title: "Bist du dir sicher, dass du das weitersagen willst?"
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
url: "https://www.google.de/intl/de/landing/2step/"
|
url: "https://www.google.de/intl/de/landing/2step/"
|
||||||
register: "Ein Gerät registrieren"
|
register: "Ein Gerät registrieren"
|
||||||
@ -515,6 +550,7 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
enter-password: "Bitte Passwort eingeben"
|
enter-password: "Bitte Passwort eingeben"
|
||||||
console:
|
console:
|
||||||
|
parameter: "Parameter"
|
||||||
send: "Senden"
|
send: "Senden"
|
||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
in-use: "benutzt"
|
in-use: "benutzt"
|
||||||
@ -522,19 +558,16 @@ common/views/components/drive-settings.vue:
|
|||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "Dieser Post ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
poll: "Umfrage"
|
poll: "Umfrage"
|
||||||
desktop/views/components/settings.tags.vue:
|
desktop/views/components/settings.tags.vue:
|
||||||
add: "Hinzufügen"
|
add: "Hinzufügen"
|
||||||
save: "Speichern"
|
save: "Speichern"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Taskmanager"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Home"
|
home: "Home"
|
||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
messages: "Nachrichten"
|
|
||||||
list: "Listen"
|
list: "Listen"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Dein Profil"
|
profile: "Dein Profil"
|
||||||
@ -600,8 +633,6 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
month: "Mo"
|
month: "Mo"
|
||||||
day: "So"
|
day: "So"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Nachrichten"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Benachrichtigungen"
|
title: "Benachrichtigungen"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -617,22 +648,22 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
download: "Download"
|
download: "Download"
|
||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
private: "Dieser Post ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
location: "Ort"
|
location: "Ort"
|
||||||
mobile/views/components/note-detail.vue:
|
mobile/views/components/note-detail.vue:
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
private: "Dieser Post ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
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:
|
mobile/views/components/post-form.vue:
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
renote: "Anmerkung"
|
renote: "Anmerken"
|
||||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
reply-placeholder: "Antworte auf diese Anmerkung..."
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "Dieser Post ist privat"
|
private: "Dieser Beitrag ist privat"
|
||||||
deleted: "Dieser Beitrag wurde entfernt"
|
deleted: "Dieser Beitrag wurde entfernt"
|
||||||
poll: "Umfrage"
|
poll: "Umfrage"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
@ -647,10 +678,9 @@ mobile/views/pages/home.vue:
|
|||||||
home: "Home"
|
home: "Home"
|
||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
messages: "Nachrichten"
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
add-widget: "Hinzufügen"
|
add-widget: "Hinzufügen"
|
||||||
customization-tips: "Anpassung-Tipps"
|
customization-tips: "Anpassungs-Tipps"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
activity: "Aktivität"
|
activity: "Aktivität"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
@ -671,11 +701,50 @@ deck:
|
|||||||
list: "Listen"
|
list: "Listen"
|
||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
following: "Folgen"
|
||||||
|
followers: "Folgende"
|
||||||
|
images: "Bilder"
|
||||||
activity: "Aktivität"
|
activity: "Aktivität"
|
||||||
|
timeline: "Zeitleiste"
|
||||||
|
pinned-notes: "Angeheftete Beiträge"
|
||||||
|
docs:
|
||||||
|
edit-this-page-on-github: "Hast Du einen Fehler gefunden oder Lust, diese Dokumentation zu verbessern?"
|
||||||
|
edit-this-page-on-github-link: "Seite auf GitHub bearbeiten!"
|
||||||
|
api:
|
||||||
|
entities:
|
||||||
|
properties: "Eigenschaften"
|
||||||
|
endpoints:
|
||||||
|
params: "Parameter"
|
||||||
|
no-params: "Keine Parameter."
|
||||||
|
res: "Antwort"
|
||||||
|
require-credential: "Dieser Endpunkt erfordert eine Authentifizierung."
|
||||||
|
require-permission: "Dieser Endpunkt erfordert die {permission} Berechtigung."
|
||||||
|
has-limit: "Es gibt eine Ratenbegrenzung."
|
||||||
|
duration-limit: "Es sind maximal {max} Anfragen pro {duration} Millisekunden möglich."
|
||||||
|
min-interval-limit: "Es ist nur eine Anfrage alle {interval} Millisekunden möglich."
|
||||||
|
show-src: "Quellcode anzeigen."
|
||||||
|
show-src-link: "Quellcode auf GitHub anzeigen"
|
||||||
|
generated: "Dieses Dokument wird automatisch anhand der API-Definition generiert."
|
||||||
|
props:
|
||||||
|
name: "Name"
|
||||||
|
type: "Typ"
|
||||||
|
description: "Beschreibung"
|
||||||
|
dev/views/index.vue:
|
||||||
|
manage-apps: "Anwendungen verwalten"
|
||||||
|
dev/views/apps.vue:
|
||||||
|
manage-apps: "Anwendungen verwalten"
|
||||||
|
create-app: "Anwendung erstellen"
|
||||||
|
app-missing: "Keine Anwendungen"
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
account-read: "Accountinformationen anzeigen."
|
create-app: "Erstelle Anwendung"
|
||||||
account-write: "Accountinformationen bearbeiten."
|
app-name: "Name der Anwendung"
|
||||||
note-write: "Senden."
|
app-name-desc: "Der Name der Anwendung"
|
||||||
following-write: "Folgen oder entfolgen."
|
app-name-ex: "z.B. Misskey für iOS"
|
||||||
notification-read: "Siehe deine Benachrichtigungen."
|
app-overview: "Beschreibung der Anwendung"
|
||||||
notification-write: "Benachrichtigungen verwalten."
|
app-desc: "Eine kurze Beschreibung oder Einführung der Anwendung."
|
||||||
|
app-desc-ex: "z.B. Ein iOS-Client für Misskey."
|
||||||
|
callback-url: "Callback-URL (optional)"
|
||||||
|
callback-url-desc: "Die URL, auf die nach erfolgreicher Authentifizierung umgeleitet werden soll."
|
||||||
|
authority: "Berechtigungen"
|
||||||
|
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."
|
||||||
|
@ -69,6 +69,11 @@ common:
|
|||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
|
permissions:
|
||||||
|
'read:account': "View account information"
|
||||||
|
'write:account': "Update your account information"
|
||||||
|
'read:drive': "Browse the Drive"
|
||||||
|
'write:drive': "Work with the Drive"
|
||||||
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"
|
||||||
@ -169,9 +174,9 @@ common:
|
|||||||
deck-column-align-flexible: "Flexible"
|
deck-column-align-flexible: "Flexible"
|
||||||
deck-column-width: "Deck column width"
|
deck-column-width: "Deck column width"
|
||||||
deck-column-width-narrow: "Narrow"
|
deck-column-width-narrow: "Narrow"
|
||||||
deck-column-width-narrower: "Somewhat narrow"
|
deck-column-width-narrower: "Narrower"
|
||||||
deck-column-width-normal: "Regular"
|
deck-column-width-normal: "Regular"
|
||||||
deck-column-width-wider: "Somewhat wide"
|
deck-column-width-wider: "Slightly wide"
|
||||||
deck-column-width-wide: "Wide"
|
deck-column-width-wide: "Wide"
|
||||||
use-shadow: "Use shadows in the UI"
|
use-shadow: "Use shadows in the UI"
|
||||||
rounded-corners: "Round the corners of the UI"
|
rounded-corners: "Round the corners of the UI"
|
||||||
@ -224,7 +229,7 @@ common:
|
|||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
ok: "Confirm"
|
ok: "Confirm"
|
||||||
cancel: "Exit"
|
cancel: "Cancel"
|
||||||
update-available-title: "Update available"
|
update-available-title: "Update available"
|
||||||
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
|
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
|
||||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||||
@ -282,15 +287,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Would you allow <i>{name}</i> to access your account?"
|
share-access: "Would you allow <i>{name}</i> to access your account?"
|
||||||
permission-ask: "This application requires the following permissions:"
|
permission-ask: "This application requires the following permissions:"
|
||||||
account-read: "View account information."
|
|
||||||
account-write: "Modify account information."
|
|
||||||
note-write: "Post."
|
|
||||||
like-write: "Express yourself about this post."
|
|
||||||
following-write: "Follow and unfollow."
|
|
||||||
drive-read: "Read your drive."
|
|
||||||
drive-write: "Upload/delete files in your drive."
|
|
||||||
notification-read: "Read your notifications."
|
|
||||||
notification-write: "Manage your notifications."
|
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
accept: "Allow access."
|
accept: "Allow access."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -483,8 +479,8 @@ common/views/components/user-menu.vue:
|
|||||||
report-abuse: "Report abuse"
|
report-abuse: "Report abuse"
|
||||||
report-abuse-detail: "What kind of nuisance did you encounter?"
|
report-abuse-detail: "What kind of nuisance did you encounter?"
|
||||||
report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
|
report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
|
||||||
silence: "Mute"
|
silence: "Silence"
|
||||||
unsilence: "Unmute"
|
unsilence: "Unsilence"
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
@ -839,10 +835,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Messages:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Messaging"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "Post is private"
|
private: "Post is private"
|
||||||
deleted: "Post has been removed"
|
deleted: "Post has been removed"
|
||||||
@ -881,7 +873,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "Posting"
|
posting: "Posting"
|
||||||
attach-media-from-local: "Attach media from your device"
|
attach-media-from-local: "Attach media from your device"
|
||||||
attach-media-from-drive: "Attach media from your Drive"
|
attach-media-from-drive: "Attach media from your Drive"
|
||||||
attach-cancel: "Cancel attachment"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "Create a poll"
|
create-poll: "Create a poll"
|
||||||
text-remain: "{} characters remaining"
|
text-remain: "{} characters remaining"
|
||||||
@ -974,6 +965,10 @@ common/views/components/password-settings.vue:
|
|||||||
not-match: "The new passwords do not match"
|
not-match: "The new passwords do not match"
|
||||||
changed: "Password changed"
|
changed: "Password changed"
|
||||||
failed: "Failed to change password"
|
failed: "Failed to change password"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
attach-cancel: "Remove Attachment"
|
||||||
|
mark-as-sensitive: "Mark as 'sensitive'"
|
||||||
|
unmark-as-sensitive: "Unmark as 'sensitive'"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "This post is private"
|
private: "This post is private"
|
||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
@ -984,15 +979,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "Query (optional)"
|
query: "Query (optional)"
|
||||||
add: "Add"
|
add: "Add"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Task Manager"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Home"
|
home: "Home"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Direct posts"
|
||||||
list: "Lists"
|
list: "Lists"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
add-tag-timeline: "Add hashtag cloud"
|
add-tag-timeline: "Add hashtag cloud"
|
||||||
@ -1057,7 +1050,7 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "This instance"
|
this-instance: "This instance"
|
||||||
federated: "Federated"
|
federated: "Federated"
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "Action(s)"
|
title: "Queue"
|
||||||
remove-all-jobs: "Clear all queued jobs"
|
remove-all-jobs: "Clear all queued jobs"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abuse"
|
title: "Abuse"
|
||||||
@ -1113,15 +1106,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "Disable the Local Timeline"
|
disable-local-timeline: "Disable the Local Timeline"
|
||||||
disable-global-timeline: "Disable global timeline"
|
disable-global-timeline: "Disable global timeline"
|
||||||
disabling-timelines-info: "Even if you disable these timelines, the administrator as well as moderators can use them continually."
|
disabling-timelines-info: "Even if you disable these timelines, the administrator as well as moderators can use them continually."
|
||||||
|
enable-emoji-reaction: "Enable pictograms for reactions"
|
||||||
|
use-star-for-reaction-fallback: "Use the star as fallback for unknown reaction"
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
save: "Save"
|
save: "Save"
|
||||||
saved: "Saved"
|
saved: "Saved"
|
||||||
user-recommendation-config: "Recommended users"
|
user-recommendation-config: "Recommended users"
|
||||||
enable-external-user-recommendation: "Enable external user recommendations"
|
|
||||||
external-user-recommendation-engine: "Engine"
|
|
||||||
external-user-recommendation-engine-desc: "Example : https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "Timeout"
|
|
||||||
external-user-recommendation-timeout-desc: "Number of milliseconds (ex. 300,000)"
|
|
||||||
email-config: "Email server settings"
|
email-config: "Email server settings"
|
||||||
email-config-info: "Used to confirm email and password reset etc."
|
email-config-info: "Used to confirm email and password reset etc."
|
||||||
enable-email: "Enable email delivery"
|
enable-email: "Enable email delivery"
|
||||||
@ -1201,8 +1191,8 @@ admin/views/users.vue:
|
|||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
unsuspend-confirm: "Are you sure you want to unsuspend this account?"
|
unsuspend-confirm: "Are you sure you want to unsuspend this account?"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
make-silence: "Mute"
|
make-silence: "Silence"
|
||||||
unmake-silence: "Unmute"
|
unmake-silence: "Unsilence"
|
||||||
verify: "Verify account"
|
verify: "Verify account"
|
||||||
verify-confirm: "Do you want this to be a verified account?"
|
verify-confirm: "Do you want this to be a verified account?"
|
||||||
verified: "The account is now being verified"
|
verified: "The account is now being verified"
|
||||||
@ -1275,12 +1265,13 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "Federation"
|
instance: "Instance"
|
||||||
host: "Host"
|
host: "Host"
|
||||||
notes: "Notes"
|
notes: "Notes"
|
||||||
users: "Users"
|
users: "Users"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
|
caught-at: "Created at"
|
||||||
status: "Statuses"
|
status: "Statuses"
|
||||||
latest-request-sent-at: "Time of last request sent"
|
latest-request-sent-at: "Time of last request sent"
|
||||||
latest-request-received-at: "Last request received at"
|
latest-request-received-at: "Last request received at"
|
||||||
@ -1289,7 +1280,7 @@ admin/views/federation.vue:
|
|||||||
block: "Block"
|
block: "Block"
|
||||||
marked-as-closed: "Marked as closed"
|
marked-as-closed: "Marked as closed"
|
||||||
lookup: "Look up"
|
lookup: "Look up"
|
||||||
instances: "Instances"
|
instances: "Federated"
|
||||||
instance-not-registered: "The instance has not been discovered"
|
instance-not-registered: "The instance has not been discovered"
|
||||||
sort: "Sort by"
|
sort: "Sort by"
|
||||||
sorts:
|
sorts:
|
||||||
@ -1386,8 +1377,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-replies: "Posts and replies"
|
with-replies: "Posts and replies"
|
||||||
with-media: "Media"
|
with-media: "Media"
|
||||||
my-posts: "My posts"
|
my-posts: "My posts"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Messaging"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Notifications"
|
title: "Notifications"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -1509,7 +1498,7 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Direct posts"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "No posts contains \"{q}\" found."
|
no-posts-found: "No posts contains \"{q}\" found."
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@ -1635,12 +1624,3 @@ dev/views/new-app.vue:
|
|||||||
authority: "Permissions"
|
authority: "Permissions"
|
||||||
authority-desc: "Only the functions requested here can be accessed via the API."
|
authority-desc: "Only the functions requested here can be accessed via the API."
|
||||||
authority-warning: "You can change it even after creating the application, but if you give different permissions, all user keys associated at that time will be invalidated."
|
authority-warning: "You can change it even after creating the application, but if you give different permissions, all user keys associated at that time will be invalidated."
|
||||||
account-read: "View account information."
|
|
||||||
account-write: "Modify account information."
|
|
||||||
note-write: "Post."
|
|
||||||
reaction-write: "Add or remove reactions."
|
|
||||||
following-write: "Follow and unfollow."
|
|
||||||
drive-read: "Read the drive."
|
|
||||||
drive-write: "Upload/delete files in the drive."
|
|
||||||
notification-read: "Read your notifications."
|
|
||||||
notification-write: "Manage your notifications."
|
|
||||||
|
@ -169,15 +169,6 @@ common:
|
|||||||
you: "Tú"
|
you: "Tú"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
permission-ask: "La aplicación requiere los siguientes permisos:"
|
permission-ask: "La aplicación requiere los siguientes permisos:"
|
||||||
account-read: "Viendo información de la cuenta:"
|
|
||||||
account-write: "Modificar información de la cuenta:"
|
|
||||||
note-write: "Publicación."
|
|
||||||
like-write: "Para reaccionar a las publicaciones."
|
|
||||||
following-write: "Seguir o dejar de seguir"
|
|
||||||
drive-read: "Leer tu unidad."
|
|
||||||
drive-write: "Cargar o borrar archivos de tu unidad."
|
|
||||||
notification-read: "Leer tus notificaciones."
|
|
||||||
notification-write: "Administrar tus notificaciones."
|
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
accept: "Garantizar acceso."
|
accept: "Garantizar acceso."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -595,10 +586,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Mensajes:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Mensajes"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.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"
|
||||||
@ -635,7 +622,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "Publicando"
|
posting: "Publicando"
|
||||||
attach-media-from-local: "Agregar medios de tu dispositivo"
|
attach-media-from-local: "Agregar medios de tu dispositivo"
|
||||||
attach-media-from-drive: "Adjunta multimedia desde tu Disco"
|
attach-media-from-drive: "Adjunta multimedia desde tu Disco"
|
||||||
attach-cancel: "Quitar el archivo adjunto"
|
|
||||||
create-poll: "Crea una encuesta"
|
create-poll: "Crea una encuesta"
|
||||||
text-remain: "quedan {} caracteres"
|
text-remain: "quedan {} caracteres"
|
||||||
recent-tags: "Reciente"
|
recent-tags: "Reciente"
|
||||||
@ -701,6 +687,9 @@ common/views/components/mute-and-block.vue:
|
|||||||
mute: "Silenciar"
|
mute: "Silenciar"
|
||||||
block: "Bloquear"
|
block: "Bloquear"
|
||||||
save: "Guardar"
|
save: "Guardar"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
mark-as-sensitive: "Marcar como 'sensible'"
|
||||||
|
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/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"
|
||||||
@ -712,9 +701,7 @@ desktop/views/components/settings.tags.vue:
|
|||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
|
||||||
global: "Global"
|
global: "Global"
|
||||||
messages: "Mensajes"
|
|
||||||
list: "Listas"
|
list: "Listas"
|
||||||
hashtag: "Hashtags"
|
hashtag: "Hashtags"
|
||||||
list-name: "Nombre de lista"
|
list-name: "Nombre de lista"
|
||||||
@ -773,7 +760,6 @@ admin/views/instance.vue:
|
|||||||
recaptcha-secret-key: "clave secreta reCAPTCHA"
|
recaptcha-secret-key: "clave secreta reCAPTCHA"
|
||||||
invite: "Invitar"
|
invite: "Invitar"
|
||||||
save: "Guardar"
|
save: "Guardar"
|
||||||
external-user-recommendation-timeout: "Tiempo de espera"
|
|
||||||
email: "Correo electrónico"
|
email: "Correo electrónico"
|
||||||
smtp-host: "Host SMTP"
|
smtp-host: "Host SMTP"
|
||||||
smtp-port: "Puerto SMTP"
|
smtp-port: "Puerto SMTP"
|
||||||
@ -815,11 +801,11 @@ admin/views/announcements.vue:
|
|||||||
remove: "eliminar"
|
remove: "eliminar"
|
||||||
add: "Agregar"
|
add: "Agregar"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
|
instance: "Instancia"
|
||||||
host: "Host"
|
host: "Host"
|
||||||
following: "Siguiendo"
|
following: "Siguiendo"
|
||||||
status: "Estado"
|
status: "Estado"
|
||||||
block: "Bloquear"
|
block: "Bloquear"
|
||||||
instances: "Instancia"
|
|
||||||
states:
|
states:
|
||||||
all: "Todo"
|
all: "Todo"
|
||||||
blocked: "Bloquear"
|
blocked: "Bloquear"
|
||||||
@ -841,8 +827,6 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
month: "lunes"
|
month: "lunes"
|
||||||
day: "domingo"
|
day: "domingo"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Mensajes"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Notificaciones"
|
title: "Notificaciones"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -905,9 +889,7 @@ mobile/views/pages/user-lists.vue:
|
|||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
|
||||||
global: "Global"
|
global: "Global"
|
||||||
messages: "Mensajes"
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
dashboard: "Panel de control"
|
dashboard: "Panel de control"
|
||||||
add-widget: "Agregar"
|
add-widget: "Agregar"
|
||||||
@ -929,7 +911,6 @@ mobile/views/pages/user/home.photos.vue:
|
|||||||
deck:
|
deck:
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
|
||||||
hashtag: "Etiquetas"
|
hashtag: "Etiquetas"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
notifications: "Notificaciones"
|
notifications: "Notificaciones"
|
||||||
@ -937,12 +918,3 @@ deck:
|
|||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
activity: "Actividad"
|
activity: "Actividad"
|
||||||
dev/views/new-app.vue:
|
|
||||||
account-read: "Viendo información de la cuenta:"
|
|
||||||
account-write: "Modificar información de la cuenta:"
|
|
||||||
note-write: "Publicación."
|
|
||||||
following-write: "Seguir o dejar de seguir"
|
|
||||||
drive-read: "Leer tu unidad."
|
|
||||||
drive-write: "Cargar o borrar archivos de tu unidad."
|
|
||||||
notification-read: "Leer tus notificaciones."
|
|
||||||
notification-write: "Administrar tus notificaciones."
|
|
||||||
|
@ -29,6 +29,10 @@ common:
|
|||||||
2fa: "Authentification à deux facteurs"
|
2fa: "Authentification à deux facteurs"
|
||||||
customize-home: "Personnaliser la disposition de votre accueil"
|
customize-home: "Personnaliser la disposition de votre accueil"
|
||||||
featured-notes: "Les notes mises en avant"
|
featured-notes: "Les notes mises en avant"
|
||||||
|
dark-mode: "Mode nuit"
|
||||||
|
signin: "Se connecter"
|
||||||
|
signup: "S'enregistrer"
|
||||||
|
signout: "Se déconnecter"
|
||||||
got-it: "J’ai compris !"
|
got-it: "J’ai compris !"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
@ -63,6 +67,11 @@ common:
|
|||||||
following: "Suit"
|
following: "Suit"
|
||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
favorites: "Mettre cette note en favoris"
|
favorites: "Mettre cette note en favoris"
|
||||||
|
permissions:
|
||||||
|
'read:account': "Afficher les informations du compte"
|
||||||
|
'write:account': "Mettre à jour les informations de votre compte"
|
||||||
|
'read:drive': "Parcourir le Drive"
|
||||||
|
'write:drive': "Écrire sur le Drive"
|
||||||
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 utilisateurs suivants afficheront leurs publications sur votre fil."
|
||||||
explore: "Trouver des utilisateurs"
|
explore: "Trouver des utilisateurs"
|
||||||
@ -111,17 +120,109 @@ common:
|
|||||||
d: "Désirez-vous publier quelques mots ?"
|
d: "Désirez-vous publier quelques mots ?"
|
||||||
e: "Écrivez ici"
|
e: "Écrivez ici"
|
||||||
f: "En attente de vos écrits"
|
f: "En attente de vos écrits"
|
||||||
|
settings: "Paramètres"
|
||||||
_settings:
|
_settings:
|
||||||
profile: "Votre profil"
|
profile: "Votre profil"
|
||||||
notification: "Notifications"
|
notification: "Notifications"
|
||||||
|
apps: "Applications"
|
||||||
tags: "Hashtags"
|
tags: "Hashtags"
|
||||||
|
mute-and-block: "Silencer / Bloquer"
|
||||||
blocking: "En cours blocage"
|
blocking: "En cours blocage"
|
||||||
|
security: "Sécurité"
|
||||||
|
signin: "Historique des connexions"
|
||||||
password: "Mot de passe"
|
password: "Mot de passe"
|
||||||
other: "Avancé"
|
other: "Avancé"
|
||||||
|
appearance: "Apparence"
|
||||||
|
behavior: "Comportement"
|
||||||
|
fetch-on-scroll: "Chargement automatique lors du défilement"
|
||||||
|
note-visibility: "Visibilité de la publication"
|
||||||
|
default-note-visibility: "Visibilité par défaut"
|
||||||
|
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
||||||
|
web-search-engine: "Moteur de recherche Web"
|
||||||
|
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
||||||
|
keep-cw: "Maintenir l'avertissement de contenu"
|
||||||
|
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"
|
||||||
|
use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi"
|
||||||
|
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||||
|
disable-showing-animated-images: "Désactiver l'animation des images"
|
||||||
|
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
|
||||||
|
always-show-nsfw: "Toujours afficher les contenus sensibles"
|
||||||
|
always-mark-nsfw: "Toujours marquer les notes ayant des médias comme sensibles"
|
||||||
|
show-full-acct: "Afficher l’adresse complète de l’utilisateur"
|
||||||
|
show-via: "Afficher via"
|
||||||
|
reduce-motion: "Réduire les animations dans l’interface utilisateur"
|
||||||
|
this-setting-is-this-device-only: "Uniquement sur cet appareil"
|
||||||
|
use-os-default-emojis: "Utiliser les émojis standards du système"
|
||||||
|
line-width: "Epaisseur du trait"
|
||||||
|
line-width-thin: "Fine"
|
||||||
|
line-width-normal: "Normale"
|
||||||
|
line-width-thick: "Épaisse"
|
||||||
|
font-size: "Taille du texte"
|
||||||
|
font-size-x-small: "Très petit"
|
||||||
|
font-size-small: "Petite"
|
||||||
|
font-size-medium: "Normale"
|
||||||
|
font-size-large: "Grande"
|
||||||
|
font-size-x-large: "Large"
|
||||||
|
deck-column-align: "Alignement des colonnes du Deck"
|
||||||
|
deck-column-align-center: "Centrer"
|
||||||
|
deck-column-align-left: "À gauche"
|
||||||
|
deck-column-align-flexible: "Flexible"
|
||||||
|
deck-column-width: "Largeur des colonnes du Deck"
|
||||||
|
deck-column-width-narrow: "Étroite"
|
||||||
|
deck-column-width-narrower: "Légèrement étroite"
|
||||||
|
deck-column-width-normal: "Normale"
|
||||||
|
deck-column-width-wider: "Légèrement large"
|
||||||
|
deck-column-width-wide: "Large"
|
||||||
|
use-shadow: "Utiliser les ombres dans l'interface utilisateur"
|
||||||
|
rounded-corners: "Coins arrondis de l'interface utilisateur"
|
||||||
|
circle-icons: "Utiliser des icônes circulaires"
|
||||||
|
contrasted-acct: "Ajouter du contraste au nom de l’utilisateur"
|
||||||
|
wallpaper: "Image du fond d'écran"
|
||||||
|
choose-wallpaper: "Sélectionner un fond d'écran"
|
||||||
|
delete-wallpaper: "Supprimer le fond d'écran"
|
||||||
|
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"
|
||||||
timeline: "Fil d’actualité"
|
timeline: "Fil d’actualité"
|
||||||
|
show-my-renotes: "Afficher mes republications dans le fil"
|
||||||
|
remain-deleted-note: "Continuer à afficher les notes supprimées"
|
||||||
|
sound: "Son"
|
||||||
|
enable-sounds: "Activer les sons"
|
||||||
|
enable-sounds-desc: "Jouer un son lorsque vous recevez un message/publication. Ce paramètre est sauvegardé dans le navigateur."
|
||||||
|
volume: "Volume"
|
||||||
|
test: "Test"
|
||||||
|
update: "Mise à jour de Misskey"
|
||||||
|
version: "Version actuelle :"
|
||||||
|
latest-version: "Dernière version :"
|
||||||
|
update-checking: "Recherche de mises à jour"
|
||||||
|
do-update: "Rechercher des mises à jour"
|
||||||
|
update-settings: "Paramètres avancés"
|
||||||
|
no-updates: "Aucune mise à jour disponible"
|
||||||
|
no-updates-desc: "Votre Misskey est à jour."
|
||||||
|
update-available: "Nouvelle version disponible !"
|
||||||
|
update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée."
|
||||||
|
advanced-settings: "Paramètres avancés"
|
||||||
|
debug-mode: "Activer le mode débogage"
|
||||||
|
debug-mode-desc: "Ce paramètre est stocké dans le navigateur."
|
||||||
|
navbar-position: "Position de la barre de navigation"
|
||||||
|
navbar-position-top: "en haut"
|
||||||
|
navbar-position-left: "À gauche"
|
||||||
|
navbar-position-right: "à droite"
|
||||||
|
i-am-under-limited-internet: "J'ai un accès Internet limité"
|
||||||
|
post-style: "Style d'affichage des notes"
|
||||||
|
post-style-standard: "Standard"
|
||||||
|
post-style-smart: "Intelligent"
|
||||||
|
notification-position: "Afficher les notifications"
|
||||||
|
notification-position-bottom: "en bas"
|
||||||
|
notification-position-top: "en haut"
|
||||||
|
disable-via-mobile: "Enlever la mention publié via 'mobile'"
|
||||||
|
load-raw-images: "Afficher les photos jointes dans leur qualité originale"
|
||||||
|
load-remote-media: "Afficher les médias depuis le serveur distant"
|
||||||
search: "Recherche"
|
search: "Recherche"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
loading: "Chargement en cours …"
|
loading: "Chargement en cours …"
|
||||||
|
ok: "Confirmer"
|
||||||
|
cancel: "Quitter"
|
||||||
update-available-title: "Mise à jour disponible"
|
update-available-title: "Mise à jour disponible"
|
||||||
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
||||||
my-token-regenerated: "Votre jeton vient d’être généré, vous allez maintenant être déconnecté."
|
my-token-regenerated: "Votre jeton vient d’être généré, vous allez maintenant être déconnecté."
|
||||||
@ -135,7 +236,7 @@ common:
|
|||||||
view-on-remote: " Consulter le profil complet"
|
view-on-remote: " Consulter le profil complet"
|
||||||
renoted-by: "Renoté par {user}"
|
renoted-by: "Renoté par {user}"
|
||||||
no-notes: "Sans aucune note"
|
no-notes: "Sans aucune note"
|
||||||
turn-on-darkmode: "Basculer vers le mode nuit"
|
turn-on-darkmode: "Mode nuit"
|
||||||
turn-off-darkmode: "Mode jour"
|
turn-off-darkmode: "Mode jour"
|
||||||
error:
|
error:
|
||||||
title: "Une erreur est survenue"
|
title: "Une erreur est survenue"
|
||||||
@ -179,15 +280,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Désirez-vous autoriser <i>{name}</i> à avoir accès à votre compte ?"
|
share-access: "Désirez-vous autoriser <i>{name}</i> à avoir accès à votre compte ?"
|
||||||
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
||||||
account-read: "Afficher les informations du compte."
|
|
||||||
account-write: "Modifications des informations du compte."
|
|
||||||
note-write: "Publier."
|
|
||||||
like-write: "Réagir aux publications."
|
|
||||||
following-write: "Suivre des comptes et se désabonner."
|
|
||||||
drive-read: "Lire votre Drive"
|
|
||||||
drive-write: "Téléverser/supprimer des fichiers dans votre Drive."
|
|
||||||
notification-read: "Lire vos notifications."
|
|
||||||
notification-write: "Gérer vos notifications."
|
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
accept: "Autoriser l’accès"
|
accept: "Autoriser l’accès"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -209,6 +301,8 @@ common/views/pages/explore.vue:
|
|||||||
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} utilisateurs se sont inscrit ici"
|
||||||
|
common/views/components/url-preview.vue:
|
||||||
|
disable-player: "Fermer le lecteur"
|
||||||
common/views/components/user-list.vue:
|
common/views/components/user-list.vue:
|
||||||
no-users: "Il n'y a aucun utilisateur"
|
no-users: "Il n'y a aucun utilisateur"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
@ -383,15 +477,32 @@ common/views/components/user-menu.vue:
|
|||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Voter pour '{}'"
|
vote-to: "Voter pour '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
|
total-votes: "{} Total des votes"
|
||||||
vote: "Vote"
|
vote: "Vote"
|
||||||
show-result: "Montrer les résultats"
|
show-result: "Montrer les résultats"
|
||||||
voted: "Voté"
|
voted: "Voté"
|
||||||
|
closed: "Terminé"
|
||||||
|
remaining-days: "{d} jours, {h} heures restantes"
|
||||||
|
remaining-hours: "{h} heures et {m} minutes restantes"
|
||||||
|
remaining-minutes: "{m} minutes et {s} secondes restantes"
|
||||||
|
remaining-seconds: "{s} secondes restantes"
|
||||||
common/views/components/poll-editor.vue:
|
common/views/components/poll-editor.vue:
|
||||||
no-only-one-choice: "Vous devez saisir au moins deux choix."
|
no-only-one-choice: "Vous devez saisir au moins deux choix."
|
||||||
choice-n: "Choix {}"
|
choice-n: "Choix {}"
|
||||||
remove: "Supprimer ce choix"
|
remove: "Supprimer ce choix"
|
||||||
add: "+ Ajouter un choix"
|
add: "+ Ajouter un choix"
|
||||||
destroy: "Annuler ce sondage"
|
destroy: "Annuler ce sondage"
|
||||||
|
expiration: "Valide jusqu'à"
|
||||||
|
infinite: "Illimité"
|
||||||
|
at: "Choisir une date et une durée"
|
||||||
|
no-more: "Vous ne pouvez pas en ajouter davantage"
|
||||||
|
deadline-date: "Date d’échéance"
|
||||||
|
deadline-time: "Durée"
|
||||||
|
interval: "Durée"
|
||||||
|
unit: "Unité"
|
||||||
|
second: "secondes"
|
||||||
|
minute: "Minutes"
|
||||||
|
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: "Choisissez votre réaction"
|
||||||
@ -523,6 +634,7 @@ common/views/components/profile-editor.vue:
|
|||||||
email-not-verified: "Adresse de courriel n’est pas confirmée. Veuillez vérifier votre boite de réception."
|
email-not-verified: "Adresse de courriel n’est pas confirmée. Veuillez vérifier votre boite de réception."
|
||||||
export: "Exporter"
|
export: "Exporter"
|
||||||
import: "Importer"
|
import: "Importer"
|
||||||
|
export-and-import: "Exportation et importation"
|
||||||
export-targets:
|
export-targets:
|
||||||
all-notes: "Toutes les notes publiées"
|
all-notes: "Toutes les notes publiées"
|
||||||
following-list: "Liste des abonnements"
|
following-list: "Liste des abonnements"
|
||||||
@ -710,10 +822,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Messages :"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Messagerie"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.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"
|
||||||
@ -752,7 +860,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "Publication …"
|
posting: "Publication …"
|
||||||
attach-media-from-local: "Joindre un média depuis votre appareil"
|
attach-media-from-local: "Joindre un média depuis votre appareil"
|
||||||
attach-media-from-drive: "Joindre un média depuis votre Drive"
|
attach-media-from-drive: "Joindre un média depuis votre Drive"
|
||||||
attach-cancel: "Annuler le fichier attaché"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "Créer un sondage"
|
create-poll: "Créer un sondage"
|
||||||
text-remain: "{} caractères restants"
|
text-remain: "{} caractères restants"
|
||||||
@ -845,6 +952,9 @@ common/views/components/password-settings.vue:
|
|||||||
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
||||||
changed: "Mot de passe modifié avec succès"
|
changed: "Mot de passe modifié avec succès"
|
||||||
failed: "Échec lors de la modification du mot de passe"
|
failed: "Échec lors de la modification du mot de passe"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
mark-as-sensitive: "Marquer comme sensible"
|
||||||
|
unmark-as-sensitive: "Ne pas marquer comme sensible"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
@ -855,15 +965,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "Requête (optionnelle)"
|
query: "Requête (optionnelle)"
|
||||||
add: "Ajouter"
|
add: "Ajouter"
|
||||||
save: "Enregistrer"
|
save: "Enregistrer"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Gestionnaire de tâches"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Accueil"
|
home: "Accueil"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Messages directs"
|
||||||
list: "Listes"
|
list: "Listes"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
add-tag-timeline: "Ajouter un fil de hashtags"
|
add-tag-timeline: "Ajouter un fil de hashtags"
|
||||||
@ -917,6 +1025,7 @@ admin/views/index.vue:
|
|||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
abuse: "Abus"
|
abuse: "Abus"
|
||||||
queue: "File d’attente"
|
queue: "File d’attente"
|
||||||
|
logs: "Journaux"
|
||||||
back-to-misskey: "Retour vers Misskey"
|
back-to-misskey: "Retour vers Misskey"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
@ -927,7 +1036,7 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "Cette instance"
|
this-instance: "Cette instance"
|
||||||
federated: "Fédérées"
|
federated: "Fédérées"
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "Action(s)"
|
title: "File d'attente"
|
||||||
remove-all-jobs: "Enlever toutes les tâches en attente"
|
remove-all-jobs: "Enlever toutes les tâches en attente"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "Abus"
|
title: "Abus"
|
||||||
@ -985,11 +1094,6 @@ admin/views/instance.vue:
|
|||||||
save: "Sauvegarder"
|
save: "Sauvegarder"
|
||||||
saved: "Enregistré"
|
saved: "Enregistré"
|
||||||
user-recommendation-config: "Utilisateurs"
|
user-recommendation-config: "Utilisateurs"
|
||||||
enable-external-user-recommendation: "Activer la recommandation des utilisateurs distants"
|
|
||||||
external-user-recommendation-engine: "Moteur"
|
|
||||||
external-user-recommendation-engine-desc: "Exemple : https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "Délai d’expiration"
|
|
||||||
external-user-recommendation-timeout-desc: "En millisecondes (par exemple : 300000)"
|
|
||||||
email-config: "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"
|
||||||
@ -1143,12 +1247,13 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Tags cachés"
|
hided-tags: "Tags cachés"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "Fédération"
|
instance: "Instance"
|
||||||
host: "Hôte"
|
host: "Hôte"
|
||||||
notes: "Notes"
|
notes: "Notes"
|
||||||
users: "Utilisateur·rice·s"
|
users: "Utilisateur·rice·s"
|
||||||
following: "Abonnements"
|
following: "Abonnements"
|
||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
|
caught-at: "Créé le"
|
||||||
status: "Statuts"
|
status: "Statuts"
|
||||||
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"
|
||||||
@ -1156,7 +1261,8 @@ admin/views/federation.vue:
|
|||||||
block: "Bloquer"
|
block: "Bloquer"
|
||||||
marked-as-closed: "Marquées comme fermées"
|
marked-as-closed: "Marquées comme fermées"
|
||||||
lookup: "Recherche"
|
lookup: "Recherche"
|
||||||
instances: "Instances"
|
instances: "Fédérées"
|
||||||
|
instance-not-registered: "L’instance n’a pas encore été découverte"
|
||||||
sort: "Trier par"
|
sort: "Trier par"
|
||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "Date d’inscription (Ascendant)"
|
caughtAtAsc: "Date d’inscription (Ascendant)"
|
||||||
@ -1164,6 +1270,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"
|
||||||
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"
|
||||||
@ -1243,8 +1350,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-replies: "Publications et réponses"
|
with-replies: "Publications et réponses"
|
||||||
with-media: "Média"
|
with-media: "Média"
|
||||||
my-posts: "Mes Messages"
|
my-posts: "Mes Messages"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Messagerie"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Notifications"
|
title: "Notifications"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -1365,7 +1470,7 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "Messages"
|
messages: "Messages directs"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "Aucune publication ayant pour hashtag « {q} » n’a été trouvée."
|
no-posts-found: "Aucune publication ayant pour hashtag « {q} » n’a été trouvée."
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@ -1490,12 +1595,3 @@ dev/views/new-app.vue:
|
|||||||
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."
|
||||||
account-read: "Afficher les informations du compte"
|
|
||||||
account-write: "Modifications des informations du compte"
|
|
||||||
note-write: "Publications."
|
|
||||||
reaction-write: "Ajout et suppression de réactions."
|
|
||||||
following-write: "S’abonner et se désabonner."
|
|
||||||
drive-read: "Lecture du Drive."
|
|
||||||
drive-write: "Téléversement/suppression des fichiers de votre Lecteur."
|
|
||||||
notification-read: "Lire vos notifications."
|
|
||||||
notification-write: "Gestion de vos notifications."
|
|
||||||
|
@ -14,6 +14,7 @@ const merge = (...args) => args.reduce((a, c) => ({
|
|||||||
}), {});
|
}), {});
|
||||||
|
|
||||||
const languages = [
|
const languages = [
|
||||||
|
'cs-CZ',
|
||||||
'de-DE',
|
'de-DE',
|
||||||
'en-US',
|
'en-US',
|
||||||
'es-ES',
|
'es-ES',
|
||||||
@ -24,9 +25,11 @@ const languages = [
|
|||||||
'nl-NL',
|
'nl-NL',
|
||||||
'pl-PL',
|
'pl-PL',
|
||||||
'zh-CN',
|
'zh-CN',
|
||||||
|
'zh-TW',
|
||||||
];
|
];
|
||||||
|
|
||||||
const primaries = {
|
const primaries = {
|
||||||
|
'en': 'US',
|
||||||
'ja': 'JP',
|
'ja': 'JP',
|
||||||
'zh': 'CN',
|
'zh': 'CN',
|
||||||
};
|
};
|
||||||
|
@ -73,6 +73,28 @@ common:
|
|||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
"read:account": "アカウントの情報を見る"
|
||||||
|
"write:account": "アカウントの情報を変更する"
|
||||||
|
"read:blocks": "ブロックを見る"
|
||||||
|
"write:blocks": "ブロックを操作する"
|
||||||
|
"read:drive": "ドライブを見る"
|
||||||
|
"write:drive": "ドライブを操作する"
|
||||||
|
"read:favorites": "お気に入りを見る"
|
||||||
|
"write:favorites": "お気に入りを操作する"
|
||||||
|
"read:following": "フォローの情報を見る"
|
||||||
|
"write:following": "フォロー・フォロー解除する"
|
||||||
|
"read:messaging": "トークを見る"
|
||||||
|
"write:messaging": "トークを操作する"
|
||||||
|
"read:mutes": "ミュートを見る"
|
||||||
|
"write:mutes": "ミュートを操作する"
|
||||||
|
"write:notes": "投稿を作成・削除する"
|
||||||
|
"read:notifications": "通知を見る"
|
||||||
|
"write:notifications": "通知を操作する"
|
||||||
|
"read:reactions": "リアクションを見る"
|
||||||
|
"write:reactions": "リアクションを操作する"
|
||||||
|
"write:votes": "投票する"
|
||||||
|
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||||
explore: "ユーザーを探索する"
|
explore: "ユーザーを探索する"
|
||||||
@ -291,6 +313,7 @@ common:
|
|||||||
nav: "ナビゲーション"
|
nav: "ナビゲーション"
|
||||||
tips: "ヒント"
|
tips: "ヒント"
|
||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
|
queue: "キュー"
|
||||||
|
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
@ -299,15 +322,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
account-read: "アカウントの情報を見る。"
|
|
||||||
account-write: "アカウントの情報を操作する。"
|
|
||||||
note-write: "投稿する。"
|
|
||||||
like-write: "いいねしたりいいね解除する。"
|
|
||||||
following-write: "フォローしたりフォロー解除する。"
|
|
||||||
drive-read: "ドライブを見る。"
|
|
||||||
drive-write: "ドライブを操作する。"
|
|
||||||
notification-read: "通知を見る。"
|
|
||||||
notification-write: "通知を操作する。"
|
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
accept: "アクセスを許可"
|
accept: "アクセスを許可"
|
||||||
|
|
||||||
@ -925,12 +939,6 @@ desktop/views/input-dialog.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
ok: "決定"
|
ok: "決定"
|
||||||
|
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "メッセージ:"
|
|
||||||
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@ -973,7 +981,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "投稿中"
|
posting: "投稿中"
|
||||||
attach-media-from-local: "PCからメディアを添付"
|
attach-media-from-local: "PCからメディアを添付"
|
||||||
attach-media-from-drive: "ドライブからメディアを添付"
|
attach-media-from-drive: "ドライブからメディアを添付"
|
||||||
attach-cancel: "添付取り消し"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "アンケートを作成"
|
create-poll: "アンケートを作成"
|
||||||
text-remain: "残り{}文字"
|
text-remain: "残り{}文字"
|
||||||
@ -1079,6 +1086,11 @@ common/views/components/password-settings.vue:
|
|||||||
changed: "パスワードを変更しました"
|
changed: "パスワードを変更しました"
|
||||||
failed: "パスワード変更に失敗しました"
|
failed: "パスワード変更に失敗しました"
|
||||||
|
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
attach-cancel: "添付取り消し"
|
||||||
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
|
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
@ -1091,16 +1103,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
add: "追加"
|
add: "追加"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
|
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "タスクマネージャ"
|
|
||||||
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あなた宛て"
|
mentions: "あなた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
add-tag-timeline: "ハッシュタグを追加"
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
@ -1238,15 +1247,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "ローカルタイムラインを無効にする"
|
disable-local-timeline: "ローカルタイムラインを無効にする"
|
||||||
disable-global-timeline: "グローバルタイムラインを無効にする"
|
disable-global-timeline: "グローバルタイムラインを無効にする"
|
||||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
||||||
|
enable-emoji-reaction: "リアクションに絵文字を使えるようにする"
|
||||||
|
use-star-for-reaction-fallback: "不明なリアクションのフォールバックに star を使う"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存しました"
|
saved: "保存しました"
|
||||||
user-recommendation-config: "おすすめユーザー"
|
user-recommendation-config: "おすすめユーザー"
|
||||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
|
||||||
external-user-recommendation-engine: "エンジン"
|
|
||||||
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "タイムアウト"
|
|
||||||
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
|
||||||
email-config: "メールサーバーの設定"
|
email-config: "メールサーバーの設定"
|
||||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
|
||||||
enable-email: "メール配信を有効にする"
|
enable-email: "メール配信を有効にする"
|
||||||
@ -1408,12 +1414,13 @@ admin/views/hashtags.vue:
|
|||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
|
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "連合"
|
instance: "インスタンス"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
caught-at: "登録日時"
|
||||||
status: "ステータス"
|
status: "ステータス"
|
||||||
latest-request-sent-at: "直近のリクエスト送信"
|
latest-request-sent-at: "直近のリクエスト送信"
|
||||||
latest-request-received-at: "直近のリクエスト受信"
|
latest-request-received-at: "直近のリクエスト受信"
|
||||||
@ -1422,7 +1429,7 @@ admin/views/federation.vue:
|
|||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
marked-as-closed: "閉鎖されているとマーク"
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "連合"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
sort: "ソート"
|
sort: "ソート"
|
||||||
sorts:
|
sorts:
|
||||||
@ -1532,9 +1539,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-media: "メディア"
|
with-media: "メディア"
|
||||||
my-posts: "私の投稿"
|
my-posts: "私の投稿"
|
||||||
|
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
|
|
||||||
@ -1546,6 +1550,7 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
|
something-happened: "何らかの事情で投稿できませんでした。"
|
||||||
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
@ -1638,7 +1643,7 @@ mobile/views/components/post-form.vue:
|
|||||||
quote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
username-prompt: "ユーザー名を入力してください"
|
username-prompt: "ユーザー名を入力してください"
|
||||||
|
|
||||||
@ -1682,7 +1687,7 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あなた宛て"
|
mentions: "あなた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
|
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
||||||
@ -1817,24 +1822,18 @@ dev/views/apps.vue:
|
|||||||
app-missing: "アプリなし"
|
app-missing: "アプリなし"
|
||||||
|
|
||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
|
new-app: "新しいアプリケーション"
|
||||||
|
new-app-info: "アプリケーションはAPIからでも作成できます。 (app/create)"
|
||||||
create-app: "アプリケーションの作成"
|
create-app: "アプリケーションの作成"
|
||||||
app-name: "アプリケーション名"
|
app-name: "アプリケーション名"
|
||||||
|
app-name-placeholder: "ex) Misskey for iOS"
|
||||||
app-name-desc: "あなたのアプリの名称。"
|
app-name-desc: "あなたのアプリの名称。"
|
||||||
app-name-ex: "ex) Misskey for iOS"
|
|
||||||
app-overview: "アプリの概要"
|
app-overview: "アプリの概要"
|
||||||
app-desc: "あなたのアプリの簡単な説明や紹介。"
|
app-overview-placeholder: " ex) Misskey iOSクライアント。"
|
||||||
app-desc-ex: "ex) Misskey iOSクライアント。"
|
app-overview-desc: "あなたのアプリの簡単な説明や紹介。"
|
||||||
callback-url: "コールバックURL (オプション)"
|
callback-url: "コールバックURL (オプション)"
|
||||||
|
callback-url-placeholder: "ex) https://your.app.example.com/callback.php"
|
||||||
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||||
authority: "権限"
|
authority: "権限"
|
||||||
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||||
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||||
account-read: "アカウントの情報を見る。"
|
|
||||||
account-write: "アカウントの情報を操作する。"
|
|
||||||
note-write: "投稿する。"
|
|
||||||
reaction-write: "リアクションしたりリアクションをキャンセルする。"
|
|
||||||
following-write: "フォローしたりフォロー解除する。"
|
|
||||||
drive-read: "ドライブを見る。"
|
|
||||||
drive-write: "ドライブを操作する。"
|
|
||||||
notification-read: "通知を見る。"
|
|
||||||
notification-write: "通知を操作する。"
|
|
||||||
|
@ -166,15 +166,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
|
share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
|
||||||
permission-ask: "このアプリは次の権限を要求してんで:"
|
permission-ask: "このアプリは次の権限を要求してんで:"
|
||||||
account-read: "アカウントの情報を見させてもらうで。"
|
|
||||||
account-write: "アカウントの情報を操作させてもらうで。"
|
|
||||||
note-write: "投稿させてもらうで。"
|
|
||||||
like-write: "いいねしたりいいね解除させてもらうで。"
|
|
||||||
following-write: "フォローしたりフォロー解除させてもらうで。"
|
|
||||||
drive-read: "ドライブを見させてもらうで。"
|
|
||||||
drive-write: "ドライブを操作させてもらうで。"
|
|
||||||
notification-read: "通知を見させてもらうで。"
|
|
||||||
notification-write: "通知を操作させてもらうで。"
|
|
||||||
cancel: "やめとくわ"
|
cancel: "やめとくわ"
|
||||||
accept: "アクセスを許可や!"
|
accept: "アクセスを許可や!"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -652,10 +643,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "やめとくわ"
|
cancel: "やめとくわ"
|
||||||
ok: "これや!"
|
ok: "これや!"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "メッセージ:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
@ -692,7 +679,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "投稿中"
|
posting: "投稿中"
|
||||||
attach-media-from-local: "PCからメディア持ってくる"
|
attach-media-from-local: "PCからメディア持ってくる"
|
||||||
attach-media-from-drive: "ドライブからメディア持ってくる"
|
attach-media-from-drive: "ドライブからメディア持ってくる"
|
||||||
attach-cancel: "くっつけるのやめよか"
|
|
||||||
create-poll: "アンケートを作成"
|
create-poll: "アンケートを作成"
|
||||||
text-remain: "残り{}文字"
|
text-remain: "残り{}文字"
|
||||||
recent-tags: "最近のタグ"
|
recent-tags: "最近のタグ"
|
||||||
@ -783,6 +769,9 @@ common/views/components/password-settings.vue:
|
|||||||
enter-new-password-again: "もっぺん入れてや"
|
enter-new-password-again: "もっぺん入れてや"
|
||||||
not-match: "パスワードがおうとらん"
|
not-match: "パスワードがおうとらん"
|
||||||
changed: "パスワード変えたわ"
|
changed: "パスワード変えたわ"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
mark-as-sensitive: "見たらあかん感じにしとく"
|
||||||
|
unmark-as-sensitive: "やっぱ見せたるわ"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は見せられへんわ"
|
private: "この投稿は見せられへんわ"
|
||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
@ -791,15 +780,12 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
desktop/views/components/settings.tags.vue:
|
desktop/views/components/settings.tags.vue:
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "タスクマネージャ"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
add-tag-timeline: "ハッシュタグ増やす"
|
add-tag-timeline: "ハッシュタグ増やす"
|
||||||
@ -860,8 +846,6 @@ admin/views/dashboard.vue:
|
|||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
this-instance: "ワイのインスタンス"
|
this-instance: "ワイのインスタンス"
|
||||||
federated: "連合"
|
federated: "連合"
|
||||||
admin/views/queue.vue:
|
|
||||||
operation: "操作"
|
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
details: "もっと"
|
details: "もっと"
|
||||||
remove-report: "削除"
|
remove-report: "削除"
|
||||||
@ -914,11 +898,6 @@ admin/views/instance.vue:
|
|||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
user-recommendation-config: "このユーザーええで"
|
user-recommendation-config: "このユーザーええで"
|
||||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを使えるようにする"
|
|
||||||
external-user-recommendation-engine: "エンジン"
|
|
||||||
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "タイムアウト"
|
|
||||||
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
|
||||||
email-config: "メールサーバーの設定"
|
email-config: "メールサーバーの設定"
|
||||||
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
|
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
|
||||||
enable-email: "メール配信を有効にする"
|
enable-email: "メール配信を有効にする"
|
||||||
@ -990,7 +969,7 @@ admin/views/announcements.vue:
|
|||||||
add: "増やす"
|
add: "増やす"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "連合"
|
instance: "インスタンス"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
@ -999,7 +978,7 @@ admin/views/federation.vue:
|
|||||||
status: "ステータス"
|
status: "ステータス"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "連合"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
@ -1063,8 +1042,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
default: "投稿"
|
default: "投稿"
|
||||||
with-replies: "投稿と返信"
|
with-replies: "投稿と返信"
|
||||||
with-media: "メディア"
|
with-media: "メディア"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "メッセージ"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -1182,10 +1159,9 @@ mobile/views/pages/following.vue:
|
|||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
messages: "メッセージ"
|
messages: "ダイレクト投稿"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。"
|
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@ -1237,7 +1213,6 @@ deck:
|
|||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
mentions: "あんた宛て"
|
mentions: "あんた宛て"
|
||||||
@ -1306,12 +1281,3 @@ dev/views/new-app.vue:
|
|||||||
authority: "権限"
|
authority: "権限"
|
||||||
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
authority-desc: "ここにチェックした機能しかAPIからアクセスできひんから気ぃつけてな"
|
||||||
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
authority-warning: "アプリ作った後でも変えれるけど、新しいやつ追加したらそん時関連付いてるユーザーキーは全部ほかされるで。"
|
||||||
account-read: "アカウントの情報見せて"
|
|
||||||
account-write: "アカウントの情報いじらせて"
|
|
||||||
note-write: "投稿させて"
|
|
||||||
reaction-write: "リアクションしたりそれをキャンセルさせて"
|
|
||||||
following-write: "フォローとかフォロー解除させて"
|
|
||||||
drive-read: "ドライブ見せて"
|
|
||||||
drive-write: "ドライブいじらせて"
|
|
||||||
notification-read: "通知見せて"
|
|
||||||
notification-write: "通知いじらせて"
|
|
||||||
|
@ -7,7 +7,7 @@ common:
|
|||||||
about: "Misskey를 찾아주셔서 감사합니다. Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse(다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
|
about: "Misskey를 찾아주셔서 감사합니다. Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse(다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
|
||||||
intro:
|
intro:
|
||||||
title: "Misskey란?"
|
title: "Misskey란?"
|
||||||
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 반응, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
|
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 리액션, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
|
||||||
features: "특징"
|
features: "특징"
|
||||||
rich-contents: "글"
|
rich-contents: "글"
|
||||||
rich-contents-desc: "자신의 생각, 화제의 사건, 모두와 공유하고 싶은 것을 올려주세요. 필요한 경우 다양한 스타일을 사용하여 글을 장식하거나 마음에 드는 이미지, 영상 등의 파일이나 투표를 올리는 것도 가능합니다."
|
rich-contents-desc: "자신의 생각, 화제의 사건, 모두와 공유하고 싶은 것을 올려주세요. 필요한 경우 다양한 스타일을 사용하여 글을 장식하거나 마음에 드는 이미지, 영상 등의 파일이나 투표를 올리는 것도 가능합니다."
|
||||||
@ -69,6 +69,11 @@ common:
|
|||||||
following: "팔로우 중"
|
following: "팔로우 중"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
favorites: "즐겨찾기"
|
favorites: "즐겨찾기"
|
||||||
|
permissions:
|
||||||
|
'read:account': "계정 정보 보기"
|
||||||
|
'write:account': "계정 정보 변경"
|
||||||
|
'read:drive': "드라이브 보기"
|
||||||
|
'write:drive': "드라이브 수정"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다."
|
||||||
explore: "사용자 탐색"
|
explore: "사용자 탐색"
|
||||||
@ -282,15 +287,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>가 당신의 계정에 엑세스하도록 허용하시겠습니까?"
|
share-access: "<i>{name}</i>가 당신의 계정에 엑세스하도록 허용하시겠습니까?"
|
||||||
permission-ask: "이 앱은 다음의 권한을 요청합니다:"
|
permission-ask: "이 앱은 다음의 권한을 요청합니다:"
|
||||||
account-read: "계정 정보 보기."
|
|
||||||
account-write: "계정 정보의 수정."
|
|
||||||
note-write: "게시하기."
|
|
||||||
like-write: "좋아요 하거나 좋아요 해제하기."
|
|
||||||
following-write: "팔로우하거나 팔로우를 취소하기."
|
|
||||||
drive-read: "드라이브 보기."
|
|
||||||
drive-write: "드라이브의 수정."
|
|
||||||
notification-read: "알림 읽기."
|
|
||||||
notification-write: "알림 수정하기."
|
|
||||||
cancel: "취소"
|
cancel: "취소"
|
||||||
accept: "접근 권한 허용"
|
accept: "접근 권한 허용"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -314,6 +310,7 @@ common/views/pages/explore.vue:
|
|||||||
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
users-info: "현재 {users} 사용자가 등록되어 있습니다"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "플레이어 열기"
|
enable-player: "플레이어 열기"
|
||||||
|
disable-player: "플레이어 닫기"
|
||||||
common/views/components/user-list.vue:
|
common/views/components/user-list.vue:
|
||||||
no-users: "사용자가 없습니다"
|
no-users: "사용자가 없습니다"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
@ -519,7 +516,7 @@ common/views/components/poll-editor.vue:
|
|||||||
hour: "시간"
|
hour: "시간"
|
||||||
day: "일"
|
day: "일"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "반응 선택"
|
choose-reaction: "리액션 선택"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "커스텀 이모지"
|
custom-emoji: "커스텀 이모지"
|
||||||
people: "사람들"
|
people: "사람들"
|
||||||
@ -838,10 +835,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "취소"
|
cancel: "취소"
|
||||||
ok: "확인"
|
ok: "확인"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "메시지:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "메시지"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "이 글은 비공개입니다"
|
private: "이 글은 비공개입니다"
|
||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
@ -880,7 +873,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "게시중"
|
posting: "게시중"
|
||||||
attach-media-from-local: "PC에서 미디어 첨부"
|
attach-media-from-local: "PC에서 미디어 첨부"
|
||||||
attach-media-from-drive: "드라이브에서 미디어 첨부"
|
attach-media-from-drive: "드라이브에서 미디어 첨부"
|
||||||
attach-cancel: "첨부 취소"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "투표 만들기"
|
create-poll: "투표 만들기"
|
||||||
text-remain: "{}문자 남음"
|
text-remain: "{}문자 남음"
|
||||||
@ -973,6 +965,10 @@ common/views/components/password-settings.vue:
|
|||||||
not-match: "새 비밀번호가 일치하지 않습니다"
|
not-match: "새 비밀번호가 일치하지 않습니다"
|
||||||
changed: "비밀번호를 변경하였습니다"
|
changed: "비밀번호를 변경하였습니다"
|
||||||
failed: "비밀번호 변경을 실패하였습니다."
|
failed: "비밀번호 변경을 실패하였습니다."
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
attach-cancel: "첨부 취소"
|
||||||
|
mark-as-sensitive: "열람주의로 설정"
|
||||||
|
unmark-as-sensitive: "열람주의 해제"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "이 글은 비공개입니다"
|
private: "이 글은 비공개입니다"
|
||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
@ -983,15 +979,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "쿼리 (생략 가능)"
|
query: "쿼리 (생략 가능)"
|
||||||
add: "추가"
|
add: "추가"
|
||||||
save: "저장"
|
save: "저장"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "작업 관리자"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "홈"
|
home: "홈"
|
||||||
local: "로컬"
|
local: "로컬"
|
||||||
hybrid: "소셜"
|
hybrid: "소셜"
|
||||||
global: "글로벌"
|
global: "글로벌"
|
||||||
mentions: "받은 멘션"
|
mentions: "받은 멘션"
|
||||||
messages: "메시지"
|
messages: "다이렉트 게시글"
|
||||||
list: "리스트"
|
list: "리스트"
|
||||||
hashtag: "해시태그"
|
hashtag: "해시태그"
|
||||||
add-tag-timeline: "해시태그 추가"
|
add-tag-timeline: "해시태그 추가"
|
||||||
@ -1056,7 +1050,7 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "이 인스턴스"
|
this-instance: "이 인스턴스"
|
||||||
federated: "연합"
|
federated: "연합"
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "동작"
|
title: "큐"
|
||||||
remove-all-jobs: "모든 작업 제거"
|
remove-all-jobs: "모든 작업 제거"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "스팸 신고"
|
title: "스팸 신고"
|
||||||
@ -1112,15 +1106,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "로컬 타임라인 비활성화"
|
disable-local-timeline: "로컬 타임라인 비활성화"
|
||||||
disable-global-timeline: "글로벌 타임라인 비활성화"
|
disable-global-timeline: "글로벌 타임라인 비활성화"
|
||||||
disabling-timelines-info: "이 타임라인들을 비활성화해도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
|
disabling-timelines-info: "이 타임라인들을 비활성화해도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
|
||||||
|
enable-emoji-reaction: "리액션에 이모지를 사용할 수 있게 함"
|
||||||
|
use-star-for-reaction-fallback: "알 수 없는 리액션을 star로 대체하여 사용"
|
||||||
invite: "초대"
|
invite: "초대"
|
||||||
save: "저장"
|
save: "저장"
|
||||||
saved: "저장하였습니다"
|
saved: "저장하였습니다"
|
||||||
user-recommendation-config: "추천 사용자"
|
user-recommendation-config: "추천 사용자"
|
||||||
enable-external-user-recommendation: "외부 사용자 추천 활성화"
|
|
||||||
external-user-recommendation-engine: "엔진"
|
|
||||||
external-user-recommendation-engine-desc: "예: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "타임 아웃"
|
|
||||||
external-user-recommendation-timeout-desc: "밀리초 (예: 300000)"
|
|
||||||
email-config: "메일 서버 설정"
|
email-config: "메일 서버 설정"
|
||||||
email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다."
|
email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다."
|
||||||
enable-email: "메일 발신 활성화"
|
enable-email: "메일 발신 활성화"
|
||||||
@ -1274,12 +1265,13 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "연합"
|
instance: "인스턴스"
|
||||||
host: "호스트"
|
host: "호스트"
|
||||||
notes: "글"
|
notes: "글"
|
||||||
users: "사용자"
|
users: "사용자"
|
||||||
following: "팔로우 중"
|
following: "팔로우 중"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
|
caught-at: "등록 날짜"
|
||||||
status: "상태"
|
status: "상태"
|
||||||
latest-request-sent-at: "마지막으로 요청을 전송한 시간"
|
latest-request-sent-at: "마지막으로 요청을 전송한 시간"
|
||||||
latest-request-received-at: "마지막으로 요청을 받은 시간"
|
latest-request-received-at: "마지막으로 요청을 받은 시간"
|
||||||
@ -1288,7 +1280,7 @@ admin/views/federation.vue:
|
|||||||
block: "차단"
|
block: "차단"
|
||||||
marked-as-closed: "폐쇄된 것으로 표시"
|
marked-as-closed: "폐쇄된 것으로 표시"
|
||||||
lookup: "조회"
|
lookup: "조회"
|
||||||
instances: "인스턴스"
|
instances: "연합"
|
||||||
instance-not-registered: "해당 인스턴스가 등록되어 있지 않습니다"
|
instance-not-registered: "해당 인스턴스가 등록되어 있지 않습니다"
|
||||||
sort: "정렬"
|
sort: "정렬"
|
||||||
sorts:
|
sorts:
|
||||||
@ -1385,8 +1377,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-replies: "글과 답글"
|
with-replies: "글과 답글"
|
||||||
with-media: "미디어"
|
with-media: "미디어"
|
||||||
my-posts: "내 글"
|
my-posts: "내 글"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "메시지"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "알림"
|
title: "알림"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -1508,7 +1498,7 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "소셜"
|
hybrid: "소셜"
|
||||||
global: "글로벌"
|
global: "글로벌"
|
||||||
mentions: "받은 멘션"
|
mentions: "받은 멘션"
|
||||||
messages: "메시지"
|
messages: "다이렉트 게시글"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
|
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@ -1634,12 +1624,3 @@ dev/views/new-app.vue:
|
|||||||
authority: "권한"
|
authority: "권한"
|
||||||
authority-desc: "이곳에서 요청한 권한에 한정하여 API로 액세스할 수 있습니다."
|
authority-desc: "이곳에서 요청한 권한에 한정하여 API로 액세스할 수 있습니다."
|
||||||
authority-warning: "앱을 생성한 뒤에도 변경할 수 있지만, 새로운 권한을 설정하는 경우 그 시점부터 예전에 발급받았던 유저 키는 모두 무효화됩니다."
|
authority-warning: "앱을 생성한 뒤에도 변경할 수 있지만, 새로운 권한을 설정하는 경우 그 시점부터 예전에 발급받았던 유저 키는 모두 무효화됩니다."
|
||||||
account-read: "계정 정보 보기."
|
|
||||||
account-write: "계정 정보 편집."
|
|
||||||
note-write: "글 쓰기."
|
|
||||||
reaction-write: "리액션을 하거나 리액션을 취소할 수 있음."
|
|
||||||
following-write: "팔로우하거나 팔로우 해제하기."
|
|
||||||
drive-read: "드라이브 보기."
|
|
||||||
drive-write: "드라이브를 조작."
|
|
||||||
notification-read: "알림 보기."
|
|
||||||
notification-write: "알림 조작."
|
|
||||||
|
@ -307,10 +307,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Annuleren"
|
cancel: "Annuleren"
|
||||||
ok: "Oké"
|
ok: "Oké"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Berichten:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Gesprekken"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "(dit bericht is privé)"
|
private: "(dit bericht is privé)"
|
||||||
location: "Locatie"
|
location: "Locatie"
|
||||||
@ -338,7 +334,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "Bezig met plaatsen"
|
posting: "Bezig met plaatsen"
|
||||||
attach-media-from-local: "Media bijvoegen van je computer"
|
attach-media-from-local: "Media bijvoegen van je computer"
|
||||||
attach-media-from-drive: "Media bijvoegen uit je Drive"
|
attach-media-from-drive: "Media bijvoegen uit je Drive"
|
||||||
attach-cancel: "Bijlage annuleren"
|
|
||||||
create-poll: "Peiling creëren"
|
create-poll: "Peiling creëren"
|
||||||
text-remain: "{} resterende tekens"
|
text-remain: "{} resterende tekens"
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
@ -388,13 +383,10 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
poll: "Peilingen"
|
poll: "Peilingen"
|
||||||
desktop/views/components/settings.tags.vue:
|
desktop/views/components/settings.tags.vue:
|
||||||
add: "Toevoegen"
|
add: "Toevoegen"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Taakbeheer"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Startpagina"
|
home: "Startpagina"
|
||||||
local: "Lokaal"
|
local: "Lokaal"
|
||||||
global: "Algemeen"
|
global: "Algemeen"
|
||||||
messages: "Gesprekken"
|
|
||||||
list: "Lijsten"
|
list: "Lijsten"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Je profiel"
|
profile: "Je profiel"
|
||||||
@ -497,8 +489,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
default: "Berichten"
|
default: "Berichten"
|
||||||
with-replies: "Berichten en antwoorden"
|
with-replies: "Berichten en antwoorden"
|
||||||
with-media: "Media"
|
with-media: "Media"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Gesprekken"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Meldingen"
|
title: "Meldingen"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -571,7 +561,6 @@ mobile/views/pages/home.vue:
|
|||||||
home: "Startpagina"
|
home: "Startpagina"
|
||||||
local: "Lokaal"
|
local: "Lokaal"
|
||||||
global: "Algemeen"
|
global: "Algemeen"
|
||||||
messages: "Gesprekken"
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
add-widget: "Toevoegen"
|
add-widget: "Toevoegen"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
|
@ -244,8 +244,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Avbryt"
|
cancel: "Avbryt"
|
||||||
ok: "Ok"
|
ok: "Ok"
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Samtaler"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
location: "Lokasjon"
|
location: "Lokasjon"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
@ -290,7 +288,6 @@ desktop/views/components/timeline.vue:
|
|||||||
home: "Hjem"
|
home: "Hjem"
|
||||||
local: "Lokalt"
|
local: "Lokalt"
|
||||||
global: "Globalt"
|
global: "Globalt"
|
||||||
messages: "Samtaler"
|
|
||||||
list: "Lister"
|
list: "Lister"
|
||||||
list-name: "Liste navn"
|
list-name: "Liste navn"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
@ -394,8 +391,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
default: "Innlegg"
|
default: "Innlegg"
|
||||||
with-replies: "Innlegg og svar"
|
with-replies: "Innlegg og svar"
|
||||||
with-media: "Media"
|
with-media: "Media"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Melding"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Notifikasjon"
|
title: "Notifikasjon"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -456,7 +451,6 @@ mobile/views/pages/home.vue:
|
|||||||
home: "Hjem"
|
home: "Hjem"
|
||||||
local: "Lokalt"
|
local: "Lokalt"
|
||||||
global: "Globalt"
|
global: "Globalt"
|
||||||
messages: "Samtaler"
|
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
add-widget: "Legg til"
|
add-widget: "Legg til"
|
||||||
mobile/views/pages/received-follow-requests.vue:
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
@ -23,6 +23,7 @@ common:
|
|||||||
enter-password: "Wprowadź Hasło"
|
enter-password: "Wprowadź Hasło"
|
||||||
2fa: "Uwierzytelnienie dwuetapowe"
|
2fa: "Uwierzytelnienie dwuetapowe"
|
||||||
customize-home: "Dostosuj stronę główną"
|
customize-home: "Dostosuj stronę główną"
|
||||||
|
featured-notes: "Wyróżnienia"
|
||||||
dark-mode: "Tryb ciemny"
|
dark-mode: "Tryb ciemny"
|
||||||
signin: "Zaloguj się"
|
signin: "Zaloguj się"
|
||||||
signup: "Rejestracja"
|
signup: "Rejestracja"
|
||||||
@ -61,6 +62,8 @@ common:
|
|||||||
following: "Śledzisz"
|
following: "Śledzisz"
|
||||||
followers: "Śledzący"
|
followers: "Śledzący"
|
||||||
favorites: "Moje ulubione"
|
favorites: "Moje ulubione"
|
||||||
|
permissions:
|
||||||
|
'read:drive': "Wyświetl dysk"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
explore: "Poznaj"
|
explore: "Poznaj"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
@ -121,12 +124,17 @@ common:
|
|||||||
other: "Inne"
|
other: "Inne"
|
||||||
appearance: "Wygląd"
|
appearance: "Wygląd"
|
||||||
behavior: "Zachowanie"
|
behavior: "Zachowanie"
|
||||||
|
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||||
note-visibility: "Widoczność wpisów"
|
note-visibility: "Widoczność wpisów"
|
||||||
|
web-search-engine: "Wyszukiwarka internetowa"
|
||||||
|
line-width: "Szerokości linii"
|
||||||
line-width-thin: "Cienka"
|
line-width-thin: "Cienka"
|
||||||
line-width-normal: "Normalna"
|
line-width-normal: "Normalna"
|
||||||
line-width-thick: "Gruba"
|
line-width-thick: "Gruba"
|
||||||
font-size: "Rozmiar tekstu"
|
font-size: "Rozmiar tekstu"
|
||||||
|
font-size-x-small: "Małe"
|
||||||
font-size-medium: "Normalna"
|
font-size-medium: "Normalna"
|
||||||
|
font-size-large: "Trochę duży"
|
||||||
font-size-x-large: "Duży"
|
font-size-x-large: "Duży"
|
||||||
deck-column-align-center: "Po środku"
|
deck-column-align-center: "Po środku"
|
||||||
deck-column-align-left: "Z lewej"
|
deck-column-align-left: "Z lewej"
|
||||||
@ -137,7 +145,15 @@ common:
|
|||||||
deck-column-width-normal: "Normalna"
|
deck-column-width-normal: "Normalna"
|
||||||
deck-column-width-wider: "Trochę szerokie"
|
deck-column-width-wider: "Trochę szerokie"
|
||||||
deck-column-width-wide: "Szeroka"
|
deck-column-width-wide: "Szeroka"
|
||||||
|
wallpaper: "Tapeta"
|
||||||
|
choose-wallpaper: "Wybierz tapetę"
|
||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
|
sound: "Dźwięk"
|
||||||
|
volume: "Głośność"
|
||||||
|
test: "Test"
|
||||||
|
update: "Aktualizacja Misskey"
|
||||||
|
version: "Wersja:"
|
||||||
|
do-update: "Sprawdź dostępność nowych aktualizacji"
|
||||||
navbar-position-left: "Z lewej"
|
navbar-position-left: "Z lewej"
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
delete: "Usuń"
|
delete: "Usuń"
|
||||||
@ -188,15 +204,6 @@ common:
|
|||||||
you: "Ty"
|
you: "Ty"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
||||||
account-read: "Wyświetlanie informacji o koncie:"
|
|
||||||
account-write: "Modyfikowanie informacji o koncie:"
|
|
||||||
note-write: "Publikacja."
|
|
||||||
like-write: "Reagowanie na wpisy."
|
|
||||||
following-write: "Śledzenie i cofanie śledzenia."
|
|
||||||
drive-read: "Odczytywanie Twojego dysku."
|
|
||||||
drive-write: "Wysyłanie i usuwanie plików na Twoim dysku."
|
|
||||||
notification-read: "Odczytywanie Twoich powiadomień."
|
|
||||||
notification-write: "Zarządzanie Twoimi powiadomieniami."
|
|
||||||
cancel: "Anuluj"
|
cancel: "Anuluj"
|
||||||
accept: "Przyznaj dostęp."
|
accept: "Przyznaj dostęp."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -666,10 +673,6 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "Anuluj"
|
cancel: "Anuluj"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "Wiadomości:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "Wiadomości"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "ten wpis jest prywatny"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "ten wpis został usunięty"
|
deleted: "ten wpis został usunięty"
|
||||||
@ -706,7 +709,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "Wysyłanie"
|
posting: "Wysyłanie"
|
||||||
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
|
||||||
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
|
||||||
attach-cancel: "Usuń załącznik"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "Utwórz ankietę"
|
create-poll: "Utwórz ankietę"
|
||||||
text-remain: "pozostałe znaki: {}"
|
text-remain: "pozostałe znaki: {}"
|
||||||
@ -786,6 +788,9 @@ common/views/components/password-settings.vue:
|
|||||||
enter-current-password: "Wprowadź obecne hasło"
|
enter-current-password: "Wprowadź obecne hasło"
|
||||||
enter-new-password: "Wprowadź nowe hasło"
|
enter-new-password: "Wprowadź nowe hasło"
|
||||||
enter-new-password-again: "Wprowadź ponownie nowe hasło"
|
enter-new-password-again: "Wprowadź ponownie nowe hasło"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
||||||
|
unmark-as-sensitive: "Cofnij oznaczenie jako zawartość wrażliwą"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "ten wpis jest prywatny"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "ten wpis został usunięty"
|
deleted: "ten wpis został usunięty"
|
||||||
@ -796,15 +801,12 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "Zapytanie (opcjonalne)"
|
query: "Zapytanie (opcjonalne)"
|
||||||
add: "Dodaj"
|
add: "Dodaj"
|
||||||
save: "Zapisz"
|
save: "Zapisz"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "Menedżer zadań"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "Strona główna"
|
home: "Strona główna"
|
||||||
local: "Lokalne"
|
local: "Lokalne"
|
||||||
hybrid: "Społeczność"
|
|
||||||
global: "Globalne"
|
global: "Globalne"
|
||||||
mentions: "Wspomnienia"
|
mentions: "Wspomnienia"
|
||||||
messages: "Wiadomości"
|
messages: "Bezpośrednie wpisy"
|
||||||
list: "Listy"
|
list: "Listy"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
add-tag-timeline: "Dodaj hashtag"
|
add-tag-timeline: "Dodaj hashtag"
|
||||||
@ -873,8 +875,6 @@ admin/views/instance.vue:
|
|||||||
save: "Zapisz"
|
save: "Zapisz"
|
||||||
saved: "Zapisano"
|
saved: "Zapisano"
|
||||||
user-recommendation-config: "Polecani użytkownicy"
|
user-recommendation-config: "Polecani użytkownicy"
|
||||||
external-user-recommendation-engine: "Silnik"
|
|
||||||
external-user-recommendation-engine-desc: "Np: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
email: "Adres e-mail"
|
email: "Adres e-mail"
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
notes: "Wpisy"
|
notes: "Wpisy"
|
||||||
@ -936,13 +936,14 @@ admin/views/announcements.vue:
|
|||||||
are-you-sure: "Usunąć \"$1\"?"
|
are-you-sure: "Usunąć \"$1\"?"
|
||||||
removed: "Usunięto"
|
removed: "Usunięto"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
|
instance: "Instancja"
|
||||||
notes: "Wpis"
|
notes: "Wpis"
|
||||||
users: "Użytkownicy"
|
users: "Użytkownicy"
|
||||||
following: "Śledzisz"
|
following: "Śledzisz"
|
||||||
followers: "Śledzący"
|
followers: "Śledzący"
|
||||||
|
caught-at: "Utworzono"
|
||||||
status: "Stan"
|
status: "Stan"
|
||||||
block: "Zablokuj"
|
block: "Zablokuj"
|
||||||
instances: "Instancja"
|
|
||||||
sort: "Sortuj"
|
sort: "Sortuj"
|
||||||
states:
|
states:
|
||||||
all: "Wszyscy"
|
all: "Wszyscy"
|
||||||
@ -997,8 +998,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-replies: "Wpisy i odpowiedzi"
|
with-replies: "Wpisy i odpowiedzi"
|
||||||
with-media: "Multimedia"
|
with-media: "Multimedia"
|
||||||
my-posts: "Moje wpisy"
|
my-posts: "Moje wpisy"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "Wiadomości"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "Powiadomienia"
|
title: "Powiadomienia"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -1111,10 +1110,9 @@ mobile/views/pages/signup.vue:
|
|||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "Strona główna"
|
home: "Strona główna"
|
||||||
local: "Lokalne"
|
local: "Lokalne"
|
||||||
hybrid: "Społeczność"
|
|
||||||
global: "Globalne"
|
global: "Globalne"
|
||||||
mentions: "Wspomnienia"
|
mentions: "Wspomnienia"
|
||||||
messages: "Wiadomości"
|
messages: "Bezpośrednie wpisy"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
dashboard: "Kokpit"
|
dashboard: "Kokpit"
|
||||||
add-widget: "Dodaj"
|
add-widget: "Dodaj"
|
||||||
@ -1161,7 +1159,6 @@ deck:
|
|||||||
widgets: "Widżety"
|
widgets: "Widżety"
|
||||||
home: "Strona główna"
|
home: "Strona główna"
|
||||||
local: "Lokalne"
|
local: "Lokalne"
|
||||||
hybrid: "Społeczność"
|
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
global: "Globalne"
|
global: "Globalne"
|
||||||
mentions: "Wspomnienia"
|
mentions: "Wspomnienia"
|
||||||
@ -1216,11 +1213,3 @@ dev/views/apps.vue:
|
|||||||
dev/views/new-app.vue:
|
dev/views/new-app.vue:
|
||||||
app-name: "Nazwa Aplikacji"
|
app-name: "Nazwa Aplikacji"
|
||||||
authority: "Uprawnienia"
|
authority: "Uprawnienia"
|
||||||
account-read: "Wyświetlanie informacji o koncie:"
|
|
||||||
account-write: "Modyfikowanie informacji o koncie:"
|
|
||||||
note-write: "Publikacja."
|
|
||||||
following-write: "Śledzenie i cofanie śledzenia."
|
|
||||||
drive-read: "Odczytywanie Twojego dysku."
|
|
||||||
drive-write: "Wysyłanie i usuwanie plików na Twoim dysku."
|
|
||||||
notification-read: "Odczytywanie Twoich powiadomień."
|
|
||||||
notification-write: "Zarządzanie Twoimi powiadomieniami."
|
|
||||||
|
@ -119,9 +119,6 @@ common:
|
|||||||
you: "Você"
|
you: "Você"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
||||||
account-read: "Ver informações da conta."
|
|
||||||
account-write: "Modificar informações da conta."
|
|
||||||
note-write: "Publicar"
|
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
accept: "Permitir acesso"
|
accept: "Permitir acesso"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -292,7 +289,3 @@ docs:
|
|||||||
description: "Descrição"
|
description: "Descrição"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "Gerenciar aplicativos"
|
manage-apps: "Gerenciar aplicativos"
|
||||||
dev/views/new-app.vue:
|
|
||||||
account-read: "Ver informações da conta."
|
|
||||||
account-write: "Modificar informações da conta."
|
|
||||||
note-write: "Publicar"
|
|
||||||
|
@ -69,6 +69,11 @@ common:
|
|||||||
following: "正在关注"
|
following: "正在关注"
|
||||||
followers: "关注者"
|
followers: "关注者"
|
||||||
favorites: "最爱"
|
favorites: "最爱"
|
||||||
|
permissions:
|
||||||
|
'read:account': "查看账户信息"
|
||||||
|
'write:account': "更改我的帐户信息"
|
||||||
|
'read:drive': "查看网盘"
|
||||||
|
'write:drive': "管理网盘文件"
|
||||||
empty-timeline-info:
|
empty-timeline-info:
|
||||||
follow-users-to-make-your-timeline: "关注其他用户时,帖子将显示在时间线中。"
|
follow-users-to-make-your-timeline: "关注其他用户时,帖子将显示在时间线中。"
|
||||||
explore: "查找用户"
|
explore: "查找用户"
|
||||||
@ -282,15 +287,6 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
|
share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
|
||||||
permission-ask: "这个应用程序需要以下权限:"
|
permission-ask: "这个应用程序需要以下权限:"
|
||||||
account-read: "查看账户信息"
|
|
||||||
account-write: "修改账户信息"
|
|
||||||
note-write: "投稿。"
|
|
||||||
like-write: "点赞或取消赞。"
|
|
||||||
following-write: "关注或取消关注。"
|
|
||||||
drive-read: "查看您的网盘"
|
|
||||||
drive-write: "管理网盘文件。"
|
|
||||||
notification-read: "查看通知。"
|
|
||||||
notification-write: "管理通知。"
|
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
accept: "允许访问。"
|
accept: "允许访问。"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
@ -314,6 +310,7 @@ common/views/pages/explore.vue:
|
|||||||
users-info: "当前有{users}个注册用户"
|
users-info: "当前有{users}个注册用户"
|
||||||
common/views/components/url-preview.vue:
|
common/views/components/url-preview.vue:
|
||||||
enable-player: "打开播放器"
|
enable-player: "打开播放器"
|
||||||
|
disable-player: "关闭播放器"
|
||||||
common/views/components/user-list.vue:
|
common/views/components/user-list.vue:
|
||||||
no-users: "无用户"
|
no-users: "无用户"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
@ -576,7 +573,7 @@ common/views/components/notification-settings.vue:
|
|||||||
mark-as-read-all-unread-notes: "将所有帖子标为已读"
|
mark-as-read-all-unread-notes: "将所有帖子标为已读"
|
||||||
mark-as-read-all-talk-messages: "将所有对话标为已读"
|
mark-as-read-all-talk-messages: "将所有对话标为已读"
|
||||||
auto-watch: "自动查看帖子"
|
auto-watch: "自动查看帖子"
|
||||||
auto-watch-desc: "自动接收有关您做出反应或回复的帖子的通知。"
|
auto-watch-desc: "自动接收有关您做出回应或回复的帖子的通知。"
|
||||||
common/views/components/integration-settings.vue:
|
common/views/components/integration-settings.vue:
|
||||||
title: "服务合作"
|
title: "服务合作"
|
||||||
connect: "连接"
|
connect: "连接"
|
||||||
@ -838,22 +835,18 @@ desktop/views/components/home.vue:
|
|||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
ok: "确定"
|
ok: "确定"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
|
||||||
title: "信息:"
|
|
||||||
desktop/views/components/messaging-window.vue:
|
|
||||||
title: "正在聊天"
|
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
private: "私密投稿"
|
private: "私密投稿"
|
||||||
deleted: "投稿已删除"
|
deleted: "投稿已删除"
|
||||||
location: "位置信息"
|
location: "位置信息"
|
||||||
renote: "转发"
|
renote: "转发"
|
||||||
add-reaction: "添加一个反应"
|
add-reaction: "回应"
|
||||||
undo-reaction: "取消反应"
|
undo-reaction: "取消回应"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "回复"
|
reply: "回复"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "添加一个反应"
|
add-reaction: "回应"
|
||||||
undo-reaction: "取消反应"
|
undo-reaction: "取消回应"
|
||||||
detail: "详细信息"
|
detail: "详细信息"
|
||||||
private: "这个投稿是私密的"
|
private: "这个投稿是私密的"
|
||||||
deleted: "投稿已删除"
|
deleted: "投稿已删除"
|
||||||
@ -880,7 +873,6 @@ desktop/views/components/post-form.vue:
|
|||||||
posting: "发送中"
|
posting: "发送中"
|
||||||
attach-media-from-local: "从设备中添加媒体文件"
|
attach-media-from-local: "从设备中添加媒体文件"
|
||||||
attach-media-from-drive: "从网盘中添加媒体文件"
|
attach-media-from-drive: "从网盘中添加媒体文件"
|
||||||
attach-cancel: "删除附件"
|
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "创建一个投票"
|
create-poll: "创建一个投票"
|
||||||
text-remain: "还剩{}字"
|
text-remain: "还剩{}字"
|
||||||
@ -973,6 +965,9 @@ common/views/components/password-settings.vue:
|
|||||||
not-match: "新密码不匹配"
|
not-match: "新密码不匹配"
|
||||||
changed: "密码已更改"
|
changed: "密码已更改"
|
||||||
failed: "更改密码失败"
|
failed: "更改密码失败"
|
||||||
|
common/views/components/post-form-attaches.vue:
|
||||||
|
mark-as-sensitive: "标记为“敏感”"
|
||||||
|
unmark-as-sensitive: "取消标记为“敏感”"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "这个帖子是私密的"
|
private: "这个帖子是私密的"
|
||||||
deleted: "帖子已删除"
|
deleted: "帖子已删除"
|
||||||
@ -983,15 +978,13 @@ desktop/views/components/settings.tags.vue:
|
|||||||
query: "查询 (可选)"
|
query: "查询 (可选)"
|
||||||
add: "添加"
|
add: "添加"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
|
||||||
title: "任务管理器"
|
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
home: "首页"
|
home: "首页"
|
||||||
local: "本地"
|
local: "本地"
|
||||||
hybrid: "社交"
|
hybrid: "社交"
|
||||||
global: "全球"
|
global: "全球"
|
||||||
mentions: "提到的"
|
mentions: "提到的"
|
||||||
messages: "信息"
|
messages: "直接发布"
|
||||||
list: "列表"
|
list: "列表"
|
||||||
hashtag: "标签"
|
hashtag: "标签"
|
||||||
add-tag-timeline: "添加标签"
|
add-tag-timeline: "添加标签"
|
||||||
@ -1056,7 +1049,7 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "此实例"
|
this-instance: "此实例"
|
||||||
federated: "联合"
|
federated: "联合"
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "操作"
|
title: "队列"
|
||||||
remove-all-jobs: "清除所有作业"
|
remove-all-jobs: "清除所有作业"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "举报垃圾信息"
|
title: "举报垃圾信息"
|
||||||
@ -1112,15 +1105,12 @@ admin/views/instance.vue:
|
|||||||
disable-local-timeline: "停用本地时间线功能"
|
disable-local-timeline: "停用本地时间线功能"
|
||||||
disable-global-timeline: "禁用全局时间线"
|
disable-global-timeline: "禁用全局时间线"
|
||||||
disabling-timelines-info: "即使禁用时间线,管理员和版主仍然可用。"
|
disabling-timelines-info: "即使禁用时间线,管理员和版主仍然可用。"
|
||||||
|
enable-emoji-reaction: "在回应上使用表情符号"
|
||||||
|
use-star-for-reaction-fallback: "使用默认的star来表示未知的回应"
|
||||||
invite: "邀请"
|
invite: "邀请"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
saved: "保存完毕"
|
saved: "保存完毕"
|
||||||
user-recommendation-config: "推荐用户"
|
user-recommendation-config: "推荐用户"
|
||||||
enable-external-user-recommendation: "启用外部用户推荐"
|
|
||||||
external-user-recommendation-engine: "引擎"
|
|
||||||
external-user-recommendation-engine-desc: "例如: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
|
||||||
external-user-recommendation-timeout: "超时"
|
|
||||||
external-user-recommendation-timeout-desc: "单位为毫秒 (例如:300000)"
|
|
||||||
email-config: "电子邮件服务器设置"
|
email-config: "电子邮件服务器设置"
|
||||||
email-config-info: "用于确认电子邮件和密码重置等。"
|
email-config-info: "用于确认电子邮件和密码重置等。"
|
||||||
enable-email: "启用电子邮件送递"
|
enable-email: "启用电子邮件送递"
|
||||||
@ -1274,12 +1264,13 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "隐藏标签"
|
hided-tags: "隐藏标签"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "联合"
|
instance: "例"
|
||||||
host: "主机名"
|
host: "主机名"
|
||||||
notes: "帖子"
|
notes: "帖子"
|
||||||
users: "用户"
|
users: "用户"
|
||||||
following: "正在关注"
|
following: "正在关注"
|
||||||
followers: "关注者"
|
followers: "关注者"
|
||||||
|
caught-at: "注册日期"
|
||||||
status: "状态"
|
status: "状态"
|
||||||
latest-request-sent-at: "上次发送的请求"
|
latest-request-sent-at: "上次发送的请求"
|
||||||
latest-request-received-at: "上次收到的请求"
|
latest-request-received-at: "上次收到的请求"
|
||||||
@ -1288,7 +1279,7 @@ admin/views/federation.vue:
|
|||||||
block: "拉黑"
|
block: "拉黑"
|
||||||
marked-as-closed: "标记为已关闭"
|
marked-as-closed: "标记为已关闭"
|
||||||
lookup: "查询"
|
lookup: "查询"
|
||||||
instances: "实例"
|
instances: "联合"
|
||||||
instance-not-registered: "实例未注册"
|
instance-not-registered: "实例未注册"
|
||||||
sort: "排序"
|
sort: "排序"
|
||||||
sorts:
|
sorts:
|
||||||
@ -1385,8 +1376,6 @@ desktop/views/pages/user/user.timeline.vue:
|
|||||||
with-replies: "帖子与回复"
|
with-replies: "帖子与回复"
|
||||||
with-media: "媒体"
|
with-media: "媒体"
|
||||||
my-posts: "我的帖子"
|
my-posts: "我的帖子"
|
||||||
desktop/views/widgets/messaging.vue:
|
|
||||||
title: "信息"
|
|
||||||
desktop/views/widgets/notifications.vue:
|
desktop/views/widgets/notifications.vue:
|
||||||
title: "通知"
|
title: "通知"
|
||||||
desktop/views/widgets/polls.vue:
|
desktop/views/widgets/polls.vue:
|
||||||
@ -1450,7 +1439,7 @@ mobile/views/components/note.vue:
|
|||||||
location: "位置信息"
|
location: "位置信息"
|
||||||
mobile/views/components/note-detail.vue:
|
mobile/views/components/note-detail.vue:
|
||||||
reply: "回复"
|
reply: "回复"
|
||||||
reaction: "反应"
|
reaction: "回应"
|
||||||
private: "这个帖子是私密的"
|
private: "这个帖子是私密的"
|
||||||
deleted: "帖子已删除"
|
deleted: "帖子已删除"
|
||||||
location: "位置信息"
|
location: "位置信息"
|
||||||
@ -1505,10 +1494,10 @@ mobile/views/pages/following.vue:
|
|||||||
mobile/views/pages/home.vue:
|
mobile/views/pages/home.vue:
|
||||||
home: "首页"
|
home: "首页"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "社交"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
messages: "信息"
|
messages: "直接发布"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "没有找到带有主题标签“{q}”的帖子"
|
no-posts-found: "没有找到带有主题标签“{q}”的帖子"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@ -1561,7 +1550,7 @@ deck:
|
|||||||
widgets: "小部件"
|
widgets: "小部件"
|
||||||
home: "首页"
|
home: "首页"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "社交"
|
||||||
hashtag: "标签"
|
hashtag: "标签"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
@ -1634,12 +1623,3 @@ dev/views/new-app.vue:
|
|||||||
authority: "权限"
|
authority: "权限"
|
||||||
authority-desc: "只能通过API访问此处请求的功能。"
|
authority-desc: "只能通过API访问此处请求的功能。"
|
||||||
authority-warning: "您可以在创建应用程序后对其进行更改,但如果您授予不同的权限,则当时关联的所有用户密钥都将失效。"
|
authority-warning: "您可以在创建应用程序后对其进行更改,但如果您授予不同的权限,则当时关联的所有用户密钥都将失效。"
|
||||||
account-read: "查看账户信息"
|
|
||||||
account-write: "修改账户信息"
|
|
||||||
note-write: "投稿。"
|
|
||||||
reaction-write: "添加或删除反应。"
|
|
||||||
following-write: "关注和不关注"
|
|
||||||
drive-read: "查看网盘"
|
|
||||||
drive-write: "管理网盘文件。"
|
|
||||||
notification-read: "阅读您的通知"
|
|
||||||
notification-write: "管理通知"
|
|
||||||
|
126
package.json
126
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.93.1",
|
"version": "11.1.5",
|
||||||
"codename": "nighthike",
|
"codename": "daybreak",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/syuilo/misskey.git"
|
"url": "https://github.com/syuilo/misskey.git"
|
||||||
@ -11,7 +11,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./index.js",
|
"start": "node ./index.js",
|
||||||
"debug": "DEBUG=misskey:* node ./index.js",
|
"init": "node ./built/init.js",
|
||||||
"build": "webpack && gulp build",
|
"build": "webpack && gulp build",
|
||||||
"webpack": "webpack",
|
"webpack": "webpack",
|
||||||
"watch": "webpack --watch",
|
"watch": "webpack --watch",
|
||||||
@ -32,14 +32,13 @@
|
|||||||
"@prezzemolo/rap": "0.1.2",
|
"@prezzemolo/rap": "0.1.2",
|
||||||
"@prezzemolo/zip": "0.0.3",
|
"@prezzemolo/zip": "0.0.3",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.5.8",
|
"@types/bull": "3.5.11",
|
||||||
"@types/chai-http": "3.0.5",
|
|
||||||
"@types/dateformat": "3.0.0",
|
"@types/dateformat": "3.0.0",
|
||||||
"@types/deep-equal": "1.0.1",
|
"@types/deep-equal": "1.0.1",
|
||||||
"@types/double-ended-queue": "2.1.0",
|
"@types/double-ended-queue": "2.1.0",
|
||||||
"@types/elasticsearch": "5.0.30",
|
"@types/elasticsearch": "5.0.32",
|
||||||
"@types/file-type": "10.6.0",
|
"@types/file-type": "10.9.1",
|
||||||
"@types/gulp": "4.0.5",
|
"@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",
|
||||||
@ -47,82 +46,81 @@
|
|||||||
"@types/gulp-util": "3.0.34",
|
"@types/gulp-util": "3.0.34",
|
||||||
"@types/is-root": "1.0.0",
|
"@types/is-root": "1.0.0",
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.12.0",
|
"@types/js-yaml": "3.12.1",
|
||||||
"@types/jsdom": "12.2.3",
|
"@types/jsdom": "12.2.3",
|
||||||
"@types/katex": "0.10.1",
|
"@types/katex": "0.10.1",
|
||||||
"@types/koa": "2.0.48",
|
"@types/koa": "2.0.48",
|
||||||
"@types/koa-bodyparser": "5.0.2",
|
"@types/koa-bodyparser": "5.0.2",
|
||||||
"@types/koa-compress": "2.0.8",
|
"@types/koa-compress": "2.0.9",
|
||||||
"@types/koa-cors": "0.0.0",
|
"@types/koa-cors": "0.0.0",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.19",
|
||||||
"@types/koa-logger": "3.1.1",
|
"@types/koa-logger": "3.1.1",
|
||||||
"@types/koa-mount": "3.0.1",
|
"@types/koa-mount": "3.0.1",
|
||||||
"@types/koa-multer": "1.0.0",
|
"@types/koa-multer": "1.0.0",
|
||||||
"@types/koa-router": "7.0.40",
|
"@types/koa-router": "7.0.40",
|
||||||
"@types/koa-send": "4.1.1",
|
"@types/koa-send": "4.1.2",
|
||||||
"@types/koa-views": "2.0.3",
|
"@types/koa-views": "2.0.3",
|
||||||
"@types/koa__cors": "2.2.3",
|
"@types/koa__cors": "2.2.3",
|
||||||
|
"@types/lolex": "3.1.1",
|
||||||
"@types/minio": "7.0.1",
|
"@types/minio": "7.0.1",
|
||||||
"@types/mkdirp": "0.5.2",
|
"@types/mocha": "5.2.6",
|
||||||
"@types/mocha": "5.2.5",
|
"@types/node": "11.13.4",
|
||||||
"@types/mongodb": "3.1.20",
|
"@types/nodemailer": "4.6.7",
|
||||||
"@types/node": "11.10.4",
|
|
||||||
"@types/nodemailer": "4.6.6",
|
|
||||||
"@types/nprogress": "0.0.29",
|
"@types/nprogress": "0.0.29",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parse5": "5.0.0",
|
"@types/parse5": "5.0.0",
|
||||||
"@types/parsimmon": "1.10.0",
|
"@types/parsimmon": "1.10.0",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.3.0",
|
"@types/qrcode": "1.3.2",
|
||||||
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.10",
|
"@types/redis": "2.8.12",
|
||||||
|
"@types/rename": "1.0.1",
|
||||||
"@types/request": "2.48.1",
|
"@types/request": "2.48.1",
|
||||||
"@types/request-promise-native": "1.0.15",
|
"@types/request-promise-native": "1.0.15",
|
||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "2.0.2",
|
"@types/rimraf": "2.0.2",
|
||||||
"@types/seedrandom": "2.4.27",
|
"@types/sharp": "0.22.1",
|
||||||
"@types/sharp": "0.21.2",
|
|
||||||
"@types/showdown": "1.9.2",
|
"@types/showdown": "1.9.2",
|
||||||
"@types/speakeasy": "2.0.4",
|
"@types/speakeasy": "2.0.4",
|
||||||
"@types/systeminformation": "3.23.1",
|
"@types/systeminformation": "3.23.1",
|
||||||
"@types/tinycolor2": "1.4.1",
|
"@types/tinycolor2": "1.4.1",
|
||||||
"@types/tmp": "0.0.33",
|
"@types/tmp": "0.1.0",
|
||||||
"@types/uuid": "3.4.4",
|
"@types/uuid": "3.4.4",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.0",
|
||||||
"@types/webpack": "4.4.24",
|
"@types/webpack": "4.4.27",
|
||||||
"@types/webpack-stream": "3.2.10",
|
"@types/webpack-stream": "3.2.10",
|
||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.1",
|
||||||
"animejs": "3.0.1",
|
"animejs": "3.0.1",
|
||||||
"apexcharts": "3.6.2",
|
"apexcharts": "3.6.7",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bootstrap-vue": "2.0.0-rc.13",
|
"bootstrap-vue": "2.0.0-rc.13",
|
||||||
"bull": "3.7.0",
|
"bull": "3.7.0",
|
||||||
"cafy": "15.1.0",
|
"cafy": "15.1.1",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chai-http": "4.2.1",
|
|
||||||
"chalk": "2.4.2",
|
"chalk": "2.4.2",
|
||||||
"commander": "2.19.0",
|
"cli-highlight": "2.1.0",
|
||||||
|
"commander": "2.20.0",
|
||||||
|
"content-disposition": "0.5.3",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "2.1.1",
|
"css-loader": "2.1.1",
|
||||||
"cssnano": "4.1.10",
|
"cssnano": "4.1.10",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "3.0.3",
|
||||||
"deep-equal": "1.0.1",
|
"deep-equal": "1.0.1",
|
||||||
"deepcopy": "0.6.3",
|
|
||||||
"diskusage": "1.0.0",
|
"diskusage": "1.0.0",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"elasticsearch": "15.4.1",
|
"elasticsearch": "15.4.1",
|
||||||
"emojilib": "2.4.0",
|
"emojilib": "2.4.0",
|
||||||
"escape-regexp": "0.0.1",
|
"eslint": "5.16.0",
|
||||||
"eslint": "5.15.1",
|
|
||||||
"eslint-plugin-vue": "5.2.2",
|
"eslint-plugin-vue": "5.2.2",
|
||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "3.1.0",
|
||||||
"feed": "2.0.4",
|
"feed": "2.0.4",
|
||||||
"file-type": "10.9.0",
|
"file-type": "10.11.0",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "4.0.0",
|
"gulp": "4.0.0",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
@ -133,19 +131,19 @@
|
|||||||
"gulp-sourcemaps": "2.6.5",
|
"gulp-sourcemaps": "2.6.5",
|
||||||
"gulp-stylus": "2.7.0",
|
"gulp-stylus": "2.7.0",
|
||||||
"gulp-tslint": "8.1.4",
|
"gulp-tslint": "8.1.4",
|
||||||
"gulp-typescript": "5.0.0",
|
"gulp-typescript": "5.0.1",
|
||||||
"gulp-uglify": "3.0.2",
|
"gulp-uglify": "3.0.2",
|
||||||
"gulp-util": "3.0.8",
|
"gulp-util": "3.0.8",
|
||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
"html-minifier": "3.5.21",
|
"html-minifier": "4.0.0",
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.1.2",
|
"insert-text-at-cursor": "0.2.0",
|
||||||
"is-root": "2.0.0",
|
"is-root": "2.0.0",
|
||||||
"is-svg": "4.0.0",
|
"is-svg": "4.1.0",
|
||||||
"js-yaml": "3.12.2",
|
"js-yaml": "3.13.1",
|
||||||
"jsdom": "14.0.0",
|
"jsdom": "14.0.0",
|
||||||
"json5": "2.1.0",
|
"json5": "2.1.0",
|
||||||
"json5-loader": "1.0.1",
|
"json5-loader": "2.0.0",
|
||||||
"katex": "0.10.1",
|
"katex": "0.10.1",
|
||||||
"koa": "2.7.0",
|
"koa": "2.7.0",
|
||||||
"koa-bodyparser": "4.2.1",
|
"koa-bodyparser": "4.2.1",
|
||||||
@ -158,49 +156,52 @@
|
|||||||
"koa-router": "7.4.0",
|
"koa-router": "7.4.0",
|
||||||
"koa-send": "5.0.0",
|
"koa-send": "5.0.0",
|
||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "6.1.5",
|
"koa-views": "6.2.0",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"loader-utils": "1.2.3",
|
"loader-utils": "1.2.3",
|
||||||
|
"lolex": "3.1.0",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"minio": "7.0.5",
|
"minio": "7.0.5",
|
||||||
"mkdirp": "0.5.1",
|
"mocha": "6.1.3",
|
||||||
"mocha": "5.2.0",
|
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"moment": "2.24.0",
|
"moment": "2.24.0",
|
||||||
"mongodb": "3.1.13",
|
|
||||||
"monk": "6.0.6",
|
|
||||||
"ms": "2.1.1",
|
"ms": "2.1.1",
|
||||||
"nan": "2.12.1",
|
|
||||||
"nested-property": "0.0.7",
|
"nested-property": "0.0.7",
|
||||||
"nodemailer": "5.1.1",
|
"node-fetch": "2.3.0",
|
||||||
|
"nodemailer": "6.1.0",
|
||||||
"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.12.0",
|
||||||
|
"pg": "7.9.0",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "3.0.0",
|
||||||
"prismjs": "1.15.0",
|
"prismjs": "1.16.0",
|
||||||
"progress-bar-webpack-plugin": "1.12.1",
|
"progress-bar-webpack-plugin": "1.12.1",
|
||||||
"promise-any": "0.2.0",
|
"promise-any": "0.2.0",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
"pug": "2.0.3",
|
"pug": "2.0.3",
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
|
"pureimage": "0.1.6",
|
||||||
"qrcode": "1.3.3",
|
"qrcode": "1.3.3",
|
||||||
|
"random-seed": "0.3.0",
|
||||||
"randomcolor": "0.5.4",
|
"randomcolor": "0.5.4",
|
||||||
"ratelimiter": "3.3.0",
|
"ratelimiter": "3.3.0",
|
||||||
"recaptcha-promise": "0.1.3",
|
"recaptcha-promise": "0.1.3",
|
||||||
"reconnecting-websocket": "4.1.10",
|
"reconnecting-websocket": "4.1.10",
|
||||||
"redis": "2.8.0",
|
"redis": "2.8.0",
|
||||||
|
"reflect-metadata": "0.1.13",
|
||||||
|
"rename": "1.0.4",
|
||||||
"request": "2.88.0",
|
"request": "2.88.0",
|
||||||
"request-promise-native": "1.0.7",
|
"request-promise-native": "1.0.7",
|
||||||
"request-stats": "3.0.0",
|
"request-stats": "3.0.0",
|
||||||
|
"require-all": "3.0.0",
|
||||||
"rimraf": "2.6.3",
|
"rimraf": "2.6.3",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"seedrandom": "2.4.4",
|
"sharp": "0.22.0",
|
||||||
"sharp": "0.21.3",
|
|
||||||
"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",
|
||||||
@ -209,49 +210,50 @@
|
|||||||
"stylus": "0.54.5",
|
"stylus": "0.54.5",
|
||||||
"stylus-loader": "3.0.2",
|
"stylus-loader": "3.0.2",
|
||||||
"summaly": "2.2.0",
|
"summaly": "2.2.0",
|
||||||
"systeminformation": "4.0.16",
|
"systeminformation": "4.1.4",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"terser-webpack-plugin": "1.2.3",
|
"terser-webpack-plugin": "1.2.3",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"tinycolor2": "1.4.1",
|
"tinycolor2": "1.4.1",
|
||||||
"tmp": "0.0.33",
|
"tmp": "0.1.0",
|
||||||
"ts-loader": "5.3.3",
|
"ts-loader": "5.3.3",
|
||||||
"ts-node": "8.0.3",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.13.1",
|
"tslint": "5.15.0",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
|
"typeorm": "0.2.16-rc.1",
|
||||||
"typescript": "3.3.3333",
|
"typescript": "3.3.3333",
|
||||||
"typescript-eslint-parser": "22.0.0",
|
"typescript-eslint-parser": "22.0.0",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
|
"ulid": "2.3.0",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "1.1.2",
|
||||||
"uuid": "3.3.2",
|
"uuid": "3.3.2",
|
||||||
"v-animate-css": "0.0.3",
|
"v-animate-css": "0.0.3",
|
||||||
"v-debounce": "0.1.2",
|
"v-debounce": "0.1.2",
|
||||||
"video-thumbnail-generator": "1.1.3",
|
"video-thumbnail-generator": "1.1.3",
|
||||||
"vue": "2.6.8",
|
"vue": "2.6.10",
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.0",
|
||||||
"vue-content-loading": "1.5.3",
|
"vue-content-loading": "1.6.0",
|
||||||
"vue-cropperjs": "3.0.0",
|
"vue-cropperjs": "3.0.0",
|
||||||
"vue-i18n": "8.9.0",
|
"vue-i18n": "8.10.0",
|
||||||
"vue-js-modal": "1.3.28",
|
"vue-js-modal": "1.3.28",
|
||||||
"vue-json-pretty": "1.4.1",
|
"vue-json-pretty": "1.6.0",
|
||||||
"vue-loader": "15.7.0",
|
"vue-loader": "15.7.0",
|
||||||
"vue-marquee-text-component": "1.1.1",
|
"vue-marquee-text-component": "1.1.1",
|
||||||
"vue-prism-component": "1.1.1",
|
"vue-prism-component": "1.1.1",
|
||||||
"vue-router": "3.0.2",
|
"vue-router": "3.0.4",
|
||||||
"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.13",
|
"vue-svg-inline-loader": "1.2.15",
|
||||||
"vue-template-compiler": "2.6.8",
|
"vue-template-compiler": "2.6.10",
|
||||||
"vuedraggable": "2.19.2",
|
"vuedraggable": "2.20.0",
|
||||||
"vuewordcloud": "18.7.11",
|
"vuewordcloud": "18.7.11",
|
||||||
"vuex": "3.1.0",
|
"vuex": "3.1.0",
|
||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.3",
|
"web-push": "3.3.3",
|
||||||
"webfinger.js": "2.7.0",
|
"webpack": "4.30.0",
|
||||||
"webpack": "4.28.4",
|
"webpack-cli": "3.3.0",
|
||||||
"webpack-cli": "3.2.3",
|
|
||||||
"websocket": "1.0.28",
|
"websocket": "1.0.28",
|
||||||
"ws": "6.2.0",
|
"ws": "6.2.1",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
src/@types/deepcopy.d.ts
vendored
17
src/@types/deepcopy.d.ts
vendored
@ -1,17 +0,0 @@
|
|||||||
declare module 'deepcopy';
|
|
||||||
|
|
||||||
declare namespace deepcopy {
|
|
||||||
type DeepcopyCustomizerValueType = 'Object';
|
|
||||||
|
|
||||||
type DeepcopyCustomizer<T> = (
|
|
||||||
value: T,
|
|
||||||
valueType: DeepcopyCustomizerValueType) => T;
|
|
||||||
|
|
||||||
interface DeepcopyOptions<T> {
|
|
||||||
customizer: DeepcopyCustomizer<T>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function deepcopy<T>(
|
|
||||||
value: T,
|
|
||||||
options?: DeepcopyOptions<T> | DeepcopyCustomizer<T>): T;
|
|
||||||
}
|
|
7
src/@types/escape-regexp.d.ts
vendored
7
src/@types/escape-regexp.d.ts
vendored
@ -1,7 +0,0 @@
|
|||||||
declare module 'escape-regexp' {
|
|
||||||
function escapeRegExp(str: string): string;
|
|
||||||
|
|
||||||
namespace escapeRegExp {} // Hack
|
|
||||||
|
|
||||||
export = escapeRegExp;
|
|
||||||
}
|
|
2
src/@types/koa-slow.d.ts
vendored
2
src/@types/koa-slow.d.ts
vendored
@ -8,7 +8,7 @@ declare module 'koa-slow' {
|
|||||||
|
|
||||||
function slow(options?: ISlowOptions): Middleware;
|
function slow(options?: ISlowOptions): Middleware;
|
||||||
|
|
||||||
namespace slow { } // Hack
|
namespace slow {} // Hack
|
||||||
|
|
||||||
export = slow;
|
export = slow;
|
||||||
}
|
}
|
||||||
|
65
src/@types/webfinger.js.d.ts
vendored
65
src/@types/webfinger.js.d.ts
vendored
@ -1,65 +0,0 @@
|
|||||||
declare module 'webfinger.js' {
|
|
||||||
interface IWebFingerConstructorConfig {
|
|
||||||
tls_only?: boolean;
|
|
||||||
webfist_fallback?: boolean;
|
|
||||||
uri_fallback?: boolean;
|
|
||||||
request_timeout?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
type JRDProperties = { [type: string]: string };
|
|
||||||
|
|
||||||
interface IJRDLink {
|
|
||||||
rel: string;
|
|
||||||
type?: string;
|
|
||||||
href?: string;
|
|
||||||
template?: string;
|
|
||||||
titles?: { [lang: string]: string };
|
|
||||||
properties?: JRDProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IJRD {
|
|
||||||
subject?: string;
|
|
||||||
expires?: Date;
|
|
||||||
aliases?: string[];
|
|
||||||
properties?: JRDProperties;
|
|
||||||
links?: IJRDLink[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IIDXLinks {
|
|
||||||
'avatar': IJRDLink[];
|
|
||||||
'remotestorage': IJRDLink[];
|
|
||||||
'blog': IJRDLink[];
|
|
||||||
'vcard': IJRDLink[];
|
|
||||||
'updates': IJRDLink[];
|
|
||||||
'share': IJRDLink[];
|
|
||||||
'profile': IJRDLink[];
|
|
||||||
'webfist': IJRDLink[];
|
|
||||||
'camlistore': IJRDLink[];
|
|
||||||
[type: string]: IJRDLink[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IIDXProperties {
|
|
||||||
'name': string;
|
|
||||||
[type: string]: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IIDX {
|
|
||||||
links: IIDXLinks;
|
|
||||||
properties: IIDXProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ILookupCallbackResult {
|
|
||||||
object: IJRD;
|
|
||||||
json: string;
|
|
||||||
idx: IIDX;
|
|
||||||
}
|
|
||||||
|
|
||||||
type LookupCallback = (err: Error | string, result?: ILookupCallbackResult) => void;
|
|
||||||
|
|
||||||
export class WebFinger {
|
|
||||||
constructor(config?: IWebFingerConstructorConfig);
|
|
||||||
|
|
||||||
public lookup(address: string, cb: LookupCallback): NodeJS.Timeout;
|
|
||||||
public lookupLink(address: string, rel: string, cb: IJRDLink): void;
|
|
||||||
}
|
|
||||||
}
|
|
@ -15,5 +15,8 @@ program
|
|||||||
.parse(process.argv);
|
.parse(process.argv);
|
||||||
|
|
||||||
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
||||||
|
if (process.env.NODE_ENV === 'test') program.disableClustering = true;
|
||||||
|
if (process.env.NODE_ENV === 'test') program.quiet = true;
|
||||||
|
if (process.env.NODE_ENV === 'test') program.noDaemons = true;
|
||||||
|
|
||||||
export { program };
|
export { program };
|
||||||
|
77
src/boot/index.ts
Normal file
77
src/boot/index.ts
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import * as cluster from 'cluster';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
import Xev from 'xev';
|
||||||
|
|
||||||
|
import Logger from '../services/logger';
|
||||||
|
import { program } from '../argv';
|
||||||
|
|
||||||
|
// for typeorm
|
||||||
|
import 'reflect-metadata';
|
||||||
|
import { masterMain } from './master';
|
||||||
|
import { workerMain } from './worker';
|
||||||
|
|
||||||
|
const logger = new Logger('core', 'cyan');
|
||||||
|
const clusterLogger = logger.createSubLogger('cluster', 'orange', false);
|
||||||
|
const ev = new Xev();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init process
|
||||||
|
*/
|
||||||
|
export default async function() {
|
||||||
|
process.title = `Misskey (${cluster.isMaster ? 'master' : 'worker'})`;
|
||||||
|
|
||||||
|
if (cluster.isMaster || program.disableClustering) {
|
||||||
|
await masterMain();
|
||||||
|
|
||||||
|
if (cluster.isMaster) {
|
||||||
|
ev.mount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cluster.isWorker || program.disableClustering) {
|
||||||
|
await workerMain();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ユニットテスト時にMisskeyが子プロセスで起動された時のため
|
||||||
|
// それ以外のときは process.send は使えないので弾く
|
||||||
|
if (process.send) {
|
||||||
|
process.send('ok');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region Events
|
||||||
|
|
||||||
|
// Listen new workers
|
||||||
|
cluster.on('fork', worker => {
|
||||||
|
clusterLogger.debug(`Process forked: [${worker.id}]`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Listen online workers
|
||||||
|
cluster.on('online', worker => {
|
||||||
|
clusterLogger.debug(`Process is now online: [${worker.id}]`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Listen for dying workers
|
||||||
|
cluster.on('exit', worker => {
|
||||||
|
// Replace the dead worker,
|
||||||
|
// we're not sentimental
|
||||||
|
clusterLogger.error(chalk.red(`[${worker.id}] died :(`));
|
||||||
|
cluster.fork();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Display detail of unhandled promise rejection
|
||||||
|
if (!program.quiet) {
|
||||||
|
process.on('unhandledRejection', console.dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display detail of uncaught exception
|
||||||
|
process.on('uncaughtException', err => {
|
||||||
|
logger.error(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Dying away...
|
||||||
|
process.on('exit', code => {
|
||||||
|
logger.info(`The process is going to exit with code ${code}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
//#endregion
|
176
src/boot/master.ts
Normal file
176
src/boot/master.ts
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
import * as os from 'os';
|
||||||
|
import * as cluster from 'cluster';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
import * as portscanner from 'portscanner';
|
||||||
|
import * as isRoot from 'is-root';
|
||||||
|
|
||||||
|
import Logger from '../services/logger';
|
||||||
|
import loadConfig from '../config/load';
|
||||||
|
import { Config } from '../config/types';
|
||||||
|
import { lessThan } from '../prelude/array';
|
||||||
|
import * as pkg from '../../package.json';
|
||||||
|
import { program } from '../argv';
|
||||||
|
import { showMachineInfo } from '../misc/show-machine-info';
|
||||||
|
import { initDb } from '../db/postgre';
|
||||||
|
|
||||||
|
const logger = new Logger('core', 'cyan');
|
||||||
|
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
|
||||||
|
|
||||||
|
function greet() {
|
||||||
|
if (!program.quiet) {
|
||||||
|
//#region Misskey logo
|
||||||
|
const v = `v${pkg.version}`;
|
||||||
|
console.log(' _____ _ _ ');
|
||||||
|
console.log(' | |_|___ ___| |_ ___ _ _ ');
|
||||||
|
console.log(' | | | | |_ -|_ -| \'_| -_| | |');
|
||||||
|
console.log(' |_|_|_|_|___|___|_,_|___|_ |');
|
||||||
|
console.log(' ' + chalk.gray(v) + (' |___|\n'.substr(v.length)));
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
console.log(' Misskey is maintained by @syuilo, @AyaMorisawa, @mei23, and @acid-chicken.');
|
||||||
|
console.log(chalk.keyword('orange')(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
|
||||||
|
|
||||||
|
console.log('');
|
||||||
|
console.log(chalk`< ${os.hostname()} {gray (PID: ${process.pid.toString()})} >`);
|
||||||
|
}
|
||||||
|
|
||||||
|
bootLogger.info('Welcome to Misskey!');
|
||||||
|
bootLogger.info(`Misskey v${pkg.version}`, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init master process
|
||||||
|
*/
|
||||||
|
export async function masterMain() {
|
||||||
|
greet();
|
||||||
|
|
||||||
|
let config!: Config;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// initialize app
|
||||||
|
config = await init();
|
||||||
|
|
||||||
|
if (config.port == null) {
|
||||||
|
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === 'linux' && isWellKnownPort(config.port) && !isRoot()) {
|
||||||
|
bootLogger.error('You need root privileges to listen on well-known port on Linux', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!await isPortAvailable(config.port)) {
|
||||||
|
bootLogger.error(`Port ${config.port} is already in use`, null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
bootLogger.error('Fatal error occurred during initialization', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bootLogger.succ('Misskey initialized');
|
||||||
|
|
||||||
|
if (!program.disableClustering) {
|
||||||
|
await spawnWorkers(config.clusterLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!program.noDaemons) {
|
||||||
|
require('../daemons/server-stats').default();
|
||||||
|
require('../daemons/notes-stats').default();
|
||||||
|
require('../daemons/queue-stats').default();
|
||||||
|
}
|
||||||
|
|
||||||
|
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
const runningNodejsVersion = process.version.slice(1).split('.').map(x => parseInt(x, 10));
|
||||||
|
const requiredNodejsVersion = [11, 7, 0];
|
||||||
|
const satisfyNodejsVersion = !lessThan(runningNodejsVersion, requiredNodejsVersion);
|
||||||
|
|
||||||
|
function isWellKnownPort(port: number): boolean {
|
||||||
|
return port < 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function isPortAvailable(port: number): Promise<boolean> {
|
||||||
|
return await portscanner.checkPortStatus(port, '127.0.0.1') === 'closed';
|
||||||
|
}
|
||||||
|
|
||||||
|
function showEnvironment(): void {
|
||||||
|
const env = process.env.NODE_ENV;
|
||||||
|
const logger = bootLogger.createSubLogger('env');
|
||||||
|
logger.info(typeof env == 'undefined' ? 'NODE_ENV is not set' : `NODE_ENV: ${env}`);
|
||||||
|
|
||||||
|
if (env !== 'production') {
|
||||||
|
logger.warn('The environment is not in production mode.');
|
||||||
|
logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!', null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(`You ${isRoot() ? '' : 'do not '}have root privileges`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init app
|
||||||
|
*/
|
||||||
|
async function init(): Promise<Config> {
|
||||||
|
showEnvironment();
|
||||||
|
|
||||||
|
const nodejsLogger = bootLogger.createSubLogger('nodejs');
|
||||||
|
|
||||||
|
nodejsLogger.info(`Version ${runningNodejsVersion.join('.')}`);
|
||||||
|
|
||||||
|
if (!satisfyNodejsVersion) {
|
||||||
|
nodejsLogger.error(`Node.js version is less than ${requiredNodejsVersion.join('.')}. Please upgrade it.`, null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
await showMachineInfo(bootLogger);
|
||||||
|
|
||||||
|
const configLogger = bootLogger.createSubLogger('config');
|
||||||
|
let config;
|
||||||
|
|
||||||
|
try {
|
||||||
|
config = loadConfig();
|
||||||
|
} catch (exception) {
|
||||||
|
if (typeof exception === 'string') {
|
||||||
|
configLogger.error(exception);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
if (exception.code === 'ENOENT') {
|
||||||
|
configLogger.error('Configuration file not found', null, true);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
configLogger.succ('Loaded');
|
||||||
|
|
||||||
|
// Try to connect to DB
|
||||||
|
try {
|
||||||
|
bootLogger.info('Connecting database...');
|
||||||
|
await initDb();
|
||||||
|
} catch (e) {
|
||||||
|
bootLogger.error('Cannot connect to database', null, true);
|
||||||
|
bootLogger.error(e);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function spawnWorkers(limit: number = Infinity) {
|
||||||
|
const workers = Math.min(limit, os.cpus().length);
|
||||||
|
bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`);
|
||||||
|
await Promise.all([...Array(workers)].map(spawnWorker));
|
||||||
|
bootLogger.succ('All workers started');
|
||||||
|
}
|
||||||
|
|
||||||
|
function spawnWorker(): Promise<void> {
|
||||||
|
return new Promise(res => {
|
||||||
|
const worker = cluster.fork();
|
||||||
|
worker.on('message', message => {
|
||||||
|
if (message !== 'ready') return;
|
||||||
|
res();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
20
src/boot/worker.ts
Normal file
20
src/boot/worker.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import * as cluster from 'cluster';
|
||||||
|
import { initDb } from '../db/postgre';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init worker process
|
||||||
|
*/
|
||||||
|
export async function workerMain() {
|
||||||
|
await initDb();
|
||||||
|
|
||||||
|
// start server
|
||||||
|
await require('../server').default();
|
||||||
|
|
||||||
|
// start job queue
|
||||||
|
require('../queue').default();
|
||||||
|
|
||||||
|
if (cluster.isWorker) {
|
||||||
|
// Send a 'ready' message to parent process
|
||||||
|
process.send!('ready');
|
||||||
|
}
|
||||||
|
}
|
@ -181,7 +181,12 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
grid: {
|
grid: {
|
||||||
clipMarkers: false,
|
clipMarkers: false,
|
||||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||||
|
xaxis: {
|
||||||
|
lines: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
stroke: {
|
stroke: {
|
||||||
curve: 'straight',
|
curve: 'straight',
|
||||||
@ -240,6 +245,7 @@ export default Vue.extend({
|
|||||||
federationInstancesChart(total: boolean): any {
|
federationInstancesChart(total: boolean): any {
|
||||||
return {
|
return {
|
||||||
series: [{
|
series: [{
|
||||||
|
name: 'Instances',
|
||||||
data: this.format(total
|
data: this.format(total
|
||||||
? this.stats.federation.instance.total
|
? this.stats.federation.instance.total
|
||||||
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
@ -23,6 +23,8 @@ import { faInbox } from '@fortawesome/free-solid-svg-icons';
|
|||||||
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||||
import ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
|
const limit = 150;
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -124,7 +126,7 @@ export default Vue.extend({
|
|||||||
connection.on('statsLog', this.onStatsLog);
|
connection.on('statsLog', this.onStatsLog);
|
||||||
connection.send('requestLog', {
|
connection.send('requestLog', {
|
||||||
id: Math.random().toString().substr(2, 8),
|
id: Math.random().toString().substr(2, 8),
|
||||||
length: 100
|
length: limit
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$once('hook:beforeDestroy', () => {
|
this.$once('hook:beforeDestroy', () => {
|
||||||
@ -137,7 +139,7 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
onStats(stats) {
|
onStats(stats) {
|
||||||
this.stats.push(stats);
|
this.stats.push(stats);
|
||||||
if (this.stats.length > 100) this.stats.shift();
|
if (this.stats.length > limit) this.stats.shift();
|
||||||
},
|
},
|
||||||
|
|
||||||
onStatsLog(statsLog) {
|
onStatsLog(statsLog) {
|
||||||
|
@ -92,8 +92,8 @@ import Vue from 'vue';
|
|||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import XCpuMemory from "./dashboard.cpu-memory.vue";
|
import XCpuMemory from "./dashboard.cpu-memory.vue";
|
||||||
import XQueue from "./dashboard.queue-charts.vue";
|
import XQueue from "./dashboard.queue-charts.vue";
|
||||||
import XCharts from "./charts.vue";
|
import XCharts from "./dashboard.charts.vue";
|
||||||
import XApLog from "./ap-log.vue";
|
import XApLog from "./dashboard.ap-log.vue";
|
||||||
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||||
import MarqueeText from 'vue-marquee-text-component';
|
import MarqueeText from 'vue-marquee-text-component';
|
||||||
import randomColor from 'randomcolor';
|
import randomColor from 'randomcolor';
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
<div class="kidvdlkg" v-for="file in files">
|
<div class="kidvdlkg" v-for="file in files">
|
||||||
<div @click="file._open = !file._open">
|
<div @click="file._open = !file._open">
|
||||||
<div>
|
<div>
|
||||||
<div class="thumbnail" :style="thumbnail(file)"></div>
|
<x-file-thumbnail class="thumbnail" :file="file" fit="contain" @click="showFileMenu(file)"/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<header>
|
<header>
|
||||||
@ -48,7 +48,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<span style="margin-right:16px;">{{ file.type }}</span>
|
<span style="margin-right:16px;">{{ file.type }}</span>
|
||||||
<span>{{ file.datasize | bytes }}</span>
|
<span>{{ file.size | bytes }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div><mk-time :time="file.createdAt" mode="detail"/></div>
|
<div><mk-time :time="file.createdAt" mode="detail"/></div>
|
||||||
</div>
|
</div>
|
||||||
@ -75,10 +75,15 @@ import Vue from 'vue';
|
|||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { faCloud, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
|
import { faCloud, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faTrashAlt, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
import { faTrashAlt, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
import XFileThumbnail from '../../common/views/components/drive-file-thumbnail.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/drive.vue'),
|
i18n: i18n('admin/views/drive.vue'),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XFileThumbnail
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
file: null,
|
file: null,
|
||||||
@ -151,13 +156,6 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
thumbnail(file: any): any {
|
|
||||||
return {
|
|
||||||
'background-color': file.properties.avgColor && file.properties.avgColor.length == 3 ? `rgb(${file.properties.avgColor.join(',')})` : 'transparent',
|
|
||||||
'background-image': `url(${file.thumbnailUrl})`
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async del(file: any) {
|
async del(file: any) {
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('drive/files/delete', { fileId: file.id });
|
await this.$root.api('drive/files/delete', { fileId: file.id });
|
||||||
@ -179,9 +177,9 @@ export default Vue.extend({
|
|||||||
this.$root.api('drive/files/update', {
|
this.$root.api('drive/files/update', {
|
||||||
fileId: file.id,
|
fileId: file.id,
|
||||||
isSensitive: !file.isSensitive
|
isSensitive: !file.isSensitive
|
||||||
});
|
}).then(() => {
|
||||||
|
|
||||||
file.isSensitive = !file.isSensitive;
|
file.isSensitive = !file.isSensitive;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
async show() {
|
async show() {
|
||||||
@ -244,7 +242,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> div:nth-child(1)
|
> div:nth-child(1)
|
||||||
> .thumbnail
|
> .thumbnail
|
||||||
display block
|
display flex
|
||||||
width 64px
|
width 64px
|
||||||
height 64px
|
height 64px
|
||||||
background-size cover
|
background-size cover
|
||||||
|
@ -1,43 +1,58 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="faTerminal"/> {{ $t('federation') }}</template>
|
<template #title><fa :icon="faTerminal"/> {{ $t('instance') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input class="target" v-model="target" type="text" @enter="showInstance()">
|
<ui-input class="target" v-model="target" type="text" @enter="showInstance()">
|
||||||
<span>{{ $t('host') }}</span>
|
<span>{{ $t('host') }}</span>
|
||||||
|
<template #prefix><fa :icon="faServer"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-button @click="showInstance()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button @click="showInstance()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
|
|
||||||
<div class="instance" v-if="instance">
|
<div class="instance" v-if="instance">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
<ui-input :value="instance.host" type="text" readonly>
|
<ui-input :value="instance.host" type="text" readonly>
|
||||||
<span>{{ $t('host') }}</span>
|
<span>{{ $t('host') }}</span>
|
||||||
|
<template #prefix><fa :icon="faServer"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
<ui-input :value="instance.caughtAt | date" type="text" readonly>
|
||||||
|
<span>{{ $t('caught-at') }}</span>
|
||||||
|
<template #prefix><fa :icon="faCrosshairs"/></template>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input :value="instance.notesCount | number" type="text" readonly>
|
<ui-input :value="instance.notesCount | number" type="text" readonly>
|
||||||
<span>{{ $t('notes') }}</span>
|
<span>{{ $t('notes') }}</span>
|
||||||
|
<template #prefix><fa :icon="faEnvelopeOpenText"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="instance.usersCount | number" type="text" readonly>
|
<ui-input :value="instance.usersCount | number" type="text" readonly>
|
||||||
<span>{{ $t('users') }}</span>
|
<span>{{ $t('users') }}</span>
|
||||||
|
<template #prefix><fa :icon="faUsers"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input :value="instance.followingCount | number" type="text" readonly>
|
<ui-input :value="instance.followingCount | number" type="text" readonly>
|
||||||
<span>{{ $t('following') }}</span>
|
<span>{{ $t('following') }}</span>
|
||||||
|
<template #prefix><fa :icon="faCaretDown"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="instance.followersCount | number" type="text" readonly>
|
<ui-input :value="instance.followersCount | number" type="text" readonly>
|
||||||
<span>{{ $t('followers') }}</span>
|
<span>{{ $t('followers') }}</span>
|
||||||
|
<template #prefix><fa :icon="faCaretUp"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input :value="instance.latestRequestSentAt" type="text" readonly>
|
<ui-input :value="instance.latestRequestSentAt | date" type="text" readonly>
|
||||||
<span>{{ $t('latest-request-sent-at') }}</span>
|
<span>{{ $t('latest-request-sent-at') }}</span>
|
||||||
|
<template #prefix><fa :icon="faPaperPlane"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="instance.latestStatus" type="text" readonly>
|
<ui-input :value="instance.latestStatus" type="text" readonly>
|
||||||
<span>{{ $t('status') }}</span>
|
<span>{{ $t('status') }}</span>
|
||||||
|
<template #prefix><fa :icon="faTrafficLight"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-input :value="instance.latestRequestReceivedAt" type="text" readonly>
|
<ui-input :value="instance.latestRequestReceivedAt | date" type="text" readonly>
|
||||||
<span>{{ $t('latest-request-received-at') }}</span>
|
<span>{{ $t('latest-request-received-at') }}</span>
|
||||||
|
<template #prefix><fa :icon="faInbox"/></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-switch v-model="instance.isBlocked" @change="updateInstance()">{{ $t('block') }}</ui-switch>
|
<ui-switch v-model="instance.isBlocked" @change="updateInstance()">{{ $t('block') }}</ui-switch>
|
||||||
<ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()">{{ $t('marked-as-closed') }}</ui-switch>
|
<ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()">{{ $t('marked-as-closed') }}</ui-switch>
|
||||||
@ -133,7 +148,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import { faGlobe, faTerminal, faSearch, faMinusCircle, faServer } from '@fortawesome/free-solid-svg-icons';
|
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
import { faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faTrafficLight, faInbox } from '@fortawesome/free-solid-svg-icons';
|
||||||
import ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
import * as tinycolor from 'tinycolor2';
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
|
||||||
@ -144,19 +160,23 @@ const negate = arr => arr.map(x => -x);
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('admin/views/federation.vue'),
|
i18n: i18n('admin/views/federation.vue'),
|
||||||
|
|
||||||
|
filters: {
|
||||||
|
date: v => v ? new Date(v).toLocaleString() : 'N/A'
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
instance: null,
|
instance: null,
|
||||||
target: null,
|
target: null,
|
||||||
sort: '+lastCommunicatedAt',
|
sort: '+lastCommunicatedAt',
|
||||||
state: 'all',
|
state: 'all',
|
||||||
limit: 50,
|
limit: 100,
|
||||||
instances: [],
|
instances: [],
|
||||||
chart: null,
|
chart: null,
|
||||||
chartSrc: 'requests',
|
chartSrc: 'requests',
|
||||||
chartSpan: 'hour',
|
chartSpan: 'hour',
|
||||||
chartInstance: null,
|
chartInstance: null,
|
||||||
faGlobe, faTerminal, faSearch, faMinusCircle, faServer
|
faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title>{{ $t('hided-tags') }}</template>
|
<template #title>{{ $t('hided-tags') }}</template>
|
||||||
<section>
|
<section>
|
||||||
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea>
|
<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hiddenTags"></textarea>
|
||||||
<ui-button @click="save">{{ $t('save') }}</ui-button>
|
<ui-button @click="save">{{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@ -18,18 +18,18 @@ export default Vue.extend({
|
|||||||
i18n: i18n('admin/views/hashtags.vue'),
|
i18n: i18n('admin/views/hashtags.vue'),
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hidedTags: '',
|
hiddenTags: '',
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta().then(meta => {
|
||||||
this.hidedTags = meta.hidedTags.join('\n');
|
this.hiddenTags = meta.hiddenTags.join('\n');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
save() {
|
save() {
|
||||||
this.$root.api('admin/update-meta', {
|
this.$root.api('admin/update-meta', {
|
||||||
hidedTags: this.hidedTags.split('\n')
|
hiddenTags: this.hiddenTags.split('\n')
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
//this.$root.os.apis.dialog({ text: `Saved` });
|
//this.$root.os.apis.dialog({ text: `Saved` });
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
|
<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
|
||||||
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
||||||
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
||||||
|
<ui-input v-model="iconUrl"><template #icon><fa icon="link"/></template>{{ $t('icon-url') }}</ui-input>
|
||||||
<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
|
<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
|
||||||
<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
|
<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
|
||||||
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
|
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
|
||||||
@ -24,6 +25,8 @@
|
|||||||
<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
|
<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
|
||||||
<ui-switch v-model="disableGlobalTimeline">{{ $t('disable-global-timeline') }}</ui-switch>
|
<ui-switch v-model="disableGlobalTimeline">{{ $t('disable-global-timeline') }}</ui-switch>
|
||||||
<ui-info>{{ $t('disabling-timelines-info') }}</ui-info>
|
<ui-info>{{ $t('disabling-timelines-info') }}</ui-info>
|
||||||
|
<ui-switch v-model="enableEmojiReaction">{{ $t('enable-emoji-reaction') }}</ui-switch>
|
||||||
|
<ui-switch v-model="useStarForReactionFallback">{{ $t('use-star-for-reaction-fallback') }}</ui-switch>
|
||||||
</section>
|
</section>
|
||||||
<section class="fit-bottom">
|
<section class="fit-bottom">
|
||||||
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
|
||||||
@ -74,12 +77,6 @@
|
|||||||
<header>summaly Proxy</header>
|
<header>summaly Proxy</header>
|
||||||
<ui-input v-model="summalyProxy">URL</ui-input>
|
<ui-input v-model="summalyProxy">URL</ui-input>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
|
||||||
<header><fa :icon="faUserPlus"/> {{ $t('user-recommendation-config') }}</header>
|
|
||||||
<ui-switch v-model="enableExternalUserRecommendation">{{ $t('enable-external-user-recommendation') }}</ui-switch>
|
|
||||||
<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<template #desc>{{ $t('external-user-recommendation-engine-desc') }}</template></ui-input>
|
|
||||||
<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<template #suffix>ms</template><template #desc>{{ $t('external-user-recommendation-timeout-desc') }}</template></ui-input>
|
|
||||||
</section>
|
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
@ -154,9 +151,12 @@ export default Vue.extend({
|
|||||||
disableRegistration: false,
|
disableRegistration: false,
|
||||||
disableLocalTimeline: false,
|
disableLocalTimeline: false,
|
||||||
disableGlobalTimeline: false,
|
disableGlobalTimeline: false,
|
||||||
|
enableEmojiReaction: true,
|
||||||
|
useStarForReactionFallback: false,
|
||||||
mascotImageUrl: null,
|
mascotImageUrl: null,
|
||||||
bannerUrl: null,
|
bannerUrl: null,
|
||||||
errorImageUrl: null,
|
errorImageUrl: null,
|
||||||
|
iconUrl: null,
|
||||||
name: null,
|
name: null,
|
||||||
description: null,
|
description: null,
|
||||||
languages: null,
|
languages: null,
|
||||||
@ -178,9 +178,6 @@ export default Vue.extend({
|
|||||||
discordClientSecret: null,
|
discordClientSecret: null,
|
||||||
proxyAccount: null,
|
proxyAccount: null,
|
||||||
inviteCode: null,
|
inviteCode: null,
|
||||||
enableExternalUserRecommendation: false,
|
|
||||||
externalUserRecommendationEngine: null,
|
|
||||||
externalUserRecommendationTimeout: null,
|
|
||||||
summalyProxy: null,
|
summalyProxy: null,
|
||||||
enableEmail: false,
|
enableEmail: false,
|
||||||
email: null,
|
email: null,
|
||||||
@ -198,15 +195,18 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta(true).then(meta => {
|
||||||
this.maintainerName = meta.maintainer.name;
|
this.maintainerName = meta.maintainerName;
|
||||||
this.maintainerEmail = meta.maintainer.email;
|
this.maintainerEmail = meta.maintainerEmail;
|
||||||
this.disableRegistration = meta.disableRegistration;
|
this.disableRegistration = meta.disableRegistration;
|
||||||
this.disableLocalTimeline = meta.disableLocalTimeline;
|
this.disableLocalTimeline = meta.disableLocalTimeline;
|
||||||
this.disableGlobalTimeline = meta.disableGlobalTimeline;
|
this.disableGlobalTimeline = meta.disableGlobalTimeline;
|
||||||
|
this.enableEmojiReaction = meta.enableEmojiReaction;
|
||||||
|
this.useStarForReactionFallback = meta.useStarForReactionFallback;
|
||||||
this.mascotImageUrl = meta.mascotImageUrl;
|
this.mascotImageUrl = meta.mascotImageUrl;
|
||||||
this.bannerUrl = meta.bannerUrl;
|
this.bannerUrl = meta.bannerUrl;
|
||||||
this.errorImageUrl = meta.errorImageUrl;
|
this.errorImageUrl = meta.errorImageUrl;
|
||||||
|
this.iconUrl = meta.iconUrl;
|
||||||
this.name = meta.name;
|
this.name = meta.name;
|
||||||
this.description = meta.description;
|
this.description = meta.description;
|
||||||
this.languages = meta.langs.join(' ');
|
this.languages = meta.langs.join(' ');
|
||||||
@ -227,9 +227,6 @@ export default Vue.extend({
|
|||||||
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
||||||
this.discordClientId = meta.discordClientId;
|
this.discordClientId = meta.discordClientId;
|
||||||
this.discordClientSecret = meta.discordClientSecret;
|
this.discordClientSecret = meta.discordClientSecret;
|
||||||
this.enableExternalUserRecommendation = meta.enableExternalUserRecommendation;
|
|
||||||
this.externalUserRecommendationEngine = meta.externalUserRecommendationEngine;
|
|
||||||
this.externalUserRecommendationTimeout = meta.externalUserRecommendationTimeout;
|
|
||||||
this.summalyProxy = meta.summalyProxy;
|
this.summalyProxy = meta.summalyProxy;
|
||||||
this.enableEmail = meta.enableEmail;
|
this.enableEmail = meta.enableEmail;
|
||||||
this.email = meta.email;
|
this.email = meta.email;
|
||||||
@ -264,9 +261,12 @@ export default Vue.extend({
|
|||||||
disableRegistration: this.disableRegistration,
|
disableRegistration: this.disableRegistration,
|
||||||
disableLocalTimeline: this.disableLocalTimeline,
|
disableLocalTimeline: this.disableLocalTimeline,
|
||||||
disableGlobalTimeline: this.disableGlobalTimeline,
|
disableGlobalTimeline: this.disableGlobalTimeline,
|
||||||
|
enableEmojiReaction: this.enableEmojiReaction,
|
||||||
|
useStarForReactionFallback: this.useStarForReactionFallback,
|
||||||
mascotImageUrl: this.mascotImageUrl,
|
mascotImageUrl: this.mascotImageUrl,
|
||||||
bannerUrl: this.bannerUrl,
|
bannerUrl: this.bannerUrl,
|
||||||
errorImageUrl: this.errorImageUrl,
|
errorImageUrl: this.errorImageUrl,
|
||||||
|
iconUrl: this.iconUrl,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
description: this.description,
|
description: this.description,
|
||||||
langs: this.languages.split(' '),
|
langs: this.languages.split(' '),
|
||||||
@ -287,9 +287,6 @@ export default Vue.extend({
|
|||||||
enableDiscordIntegration: this.enableDiscordIntegration,
|
enableDiscordIntegration: this.enableDiscordIntegration,
|
||||||
discordClientId: this.discordClientId,
|
discordClientId: this.discordClientId,
|
||||||
discordClientSecret: this.discordClientSecret,
|
discordClientSecret: this.discordClientSecret,
|
||||||
enableExternalUserRecommendation: this.enableExternalUserRecommendation,
|
|
||||||
externalUserRecommendationEngine: this.externalUserRecommendationEngine,
|
|
||||||
externalUserRecommendationTimeout: parseInt(this.externalUserRecommendationTimeout, 10),
|
|
||||||
summalyProxy: this.summalyProxy,
|
summalyProxy: this.summalyProxy,
|
||||||
enableEmail: this.enableEmail,
|
enableEmail: this.enableEmail,
|
||||||
email: this.email,
|
email: this.email,
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<template #title><fa :icon="faStream"/> {{ $t('logs') }}</template>
|
<template #title><fa :icon="faStream"/> {{ $t('logs') }}</template>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="domain" debounce>
|
<ui-input v-model="domain" :debounce="true">
|
||||||
<span>{{ $t('domain') }}</span>
|
<span>{{ $t('domain') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-select v-model="level">
|
<ui-select v-model="level">
|
||||||
@ -19,7 +19,7 @@
|
|||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
|
||||||
<div class="nqjzuvev">
|
<div class="nqjzuvev">
|
||||||
<code v-for="log in logs" :key="log._id" :class="log.level">
|
<code v-for="log in logs" :key="log.id" :class="log.level">
|
||||||
<details>
|
<details>
|
||||||
<summary><mk-time :time="log.createdAt"/> [{{ log.domain.join('.') }}] {{ log.message }}</summary>
|
<summary><mk-time :time="log.createdAt"/> [{{ log.domain.join('.') }}] {{ log.message }}</summary>
|
||||||
<vue-json-pretty v-if="log.data" :data="log.data"></vue-json-pretty>
|
<vue-json-pretty v-if="log.data" :data="log.data"></vue-json-pretty>
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="faTasks"/> {{ $t('title') }}</template>
|
<template #title><fa :icon="faChartBar"/> {{ $t('title') }}</template>
|
||||||
<section class="wptihjuy">
|
<section class="wptihjuy">
|
||||||
<header><fa :icon="faPaperPlane"/> Deliver</header>
|
<header><fa :icon="faPaperPlane"/> Deliver</header>
|
||||||
|
<ui-info warn v-if="latestStats && latestStats.deliver.waiting > 0">The queue is jammed.</ui-info>
|
||||||
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
||||||
<ui-input :value="latestStats.deliver.activeSincePrevTick | number" type="text" readonly>
|
<ui-input :value="latestStats.deliver.activeSincePrevTick | number" type="text" readonly>
|
||||||
<span>Process</span>
|
<span>Process</span>
|
||||||
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
||||||
<template #suffix>jobs/s</template>
|
<template #suffix>jobs/tick</template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="latestStats.deliver.active | number" type="text" readonly>
|
<ui-input :value="latestStats.deliver.active | number" type="text" readonly>
|
||||||
<span>Active</span>
|
<span>Active</span>
|
||||||
@ -30,11 +31,12 @@
|
|||||||
</section>
|
</section>
|
||||||
<section class="wptihjuy">
|
<section class="wptihjuy">
|
||||||
<header><fa :icon="faInbox"/> Inbox</header>
|
<header><fa :icon="faInbox"/> Inbox</header>
|
||||||
|
<ui-info warn v-if="latestStats && latestStats.inbox.waiting > 0">The queue is jammed.</ui-info>
|
||||||
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
<ui-horizon-group inputs v-if="latestStats" class="fit-bottom">
|
||||||
<ui-input :value="latestStats.inbox.activeSincePrevTick | number" type="text" readonly>
|
<ui-input :value="latestStats.inbox.activeSincePrevTick | number" type="text" readonly>
|
||||||
<span>Process</span>
|
<span>Process</span>
|
||||||
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
<template #prefix><fa :icon="fasPlayCircle"/></template>
|
||||||
<template #suffix>jobs/s</template>
|
<template #suffix>jobs/tick</template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input :value="latestStats.inbox.active | number" type="text" readonly>
|
<ui-input :value="latestStats.inbox.active | number" type="text" readonly>
|
||||||
<span>Active</span>
|
<span>Active</span>
|
||||||
@ -58,6 +60,35 @@
|
|||||||
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
|
<ui-card>
|
||||||
|
<template #title><fa :icon="faTasks"/> {{ $t('jobs') }}</template>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-select v-model="domain">
|
||||||
|
<template #label>{{ $t('queue') }}</template>
|
||||||
|
<option value="deliver">{{ $t('domains.deliver') }}</option>
|
||||||
|
<option value="inbox">{{ $t('domains.inbox') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
<ui-select v-model="state">
|
||||||
|
<template #label>{{ $t('state') }}</template>
|
||||||
|
<option value="delayed">{{ $t('states.delayed') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
|
<div class="xvvuvgsv" v-for="job in jobs">
|
||||||
|
<b>{{ job.id }}</b>
|
||||||
|
<template v-if="domain === 'deliver'">
|
||||||
|
<span>{{ job.data.to }}</span>
|
||||||
|
</template>
|
||||||
|
<template v-if="domain === 'inbox'">
|
||||||
|
<span>{{ job.activity.id }}</span>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</sequential-entrance>
|
||||||
|
<ui-info v-if="jobs.length == jobsLimit">{{ $t('result-is-truncated', { n: jobsLimit }) }}</ui-info>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -67,7 +98,9 @@ import i18n from '../../i18n';
|
|||||||
import ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
import * as tinycolor from 'tinycolor2';
|
import * as tinycolor from 'tinycolor2';
|
||||||
import { faTasks, faInbox, faStopwatch, faPlayCircle as fasPlayCircle } from '@fortawesome/free-solid-svg-icons';
|
import { faTasks, faInbox, faStopwatch, faPlayCircle as fasPlayCircle } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faPaperPlane, faStopCircle, faPlayCircle as farPlayCircle } from '@fortawesome/free-regular-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'),
|
||||||
@ -77,7 +110,11 @@ export default Vue.extend({
|
|||||||
stats: [],
|
stats: [],
|
||||||
deliverChart: null,
|
deliverChart: null,
|
||||||
inboxChart: null,
|
inboxChart: null,
|
||||||
faTasks, faPaperPlane, faInbox, faStopwatch, faStopCircle, farPlayCircle, fasPlayCircle
|
jobs: [],
|
||||||
|
jobsLimit: 50,
|
||||||
|
domain: 'deliver',
|
||||||
|
state: 'delayed',
|
||||||
|
faTasks, faPaperPlane, faInbox, faStopwatch, faStopCircle, farPlayCircle, fasPlayCircle, faChartBar
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -91,36 +128,58 @@ export default Vue.extend({
|
|||||||
stats(stats) {
|
stats(stats) {
|
||||||
this.inboxChart.updateSeries([{
|
this.inboxChart.updateSeries([{
|
||||||
name: 'Process',
|
name: 'Process',
|
||||||
|
type: 'area',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.activeSincePrevTick }))
|
data: stats.map((x, i) => ({ x: i, y: x.inbox.activeSincePrevTick }))
|
||||||
}, {
|
}, {
|
||||||
name: 'Active',
|
name: 'Active',
|
||||||
|
type: 'area',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.active }))
|
data: stats.map((x, i) => ({ x: i, y: x.inbox.active }))
|
||||||
}, {
|
}, {
|
||||||
name: 'Waiting',
|
name: 'Waiting',
|
||||||
|
type: 'line',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.waiting }))
|
data: stats.map((x, i) => ({ x: i, y: x.inbox.waiting }))
|
||||||
}, {
|
}, {
|
||||||
name: 'Delayed',
|
name: 'Delayed',
|
||||||
|
type: 'line',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.delayed }))
|
data: stats.map((x, i) => ({ x: i, y: x.inbox.delayed }))
|
||||||
}]);
|
}]);
|
||||||
this.deliverChart.updateSeries([{
|
this.deliverChart.updateSeries([{
|
||||||
name: 'Process',
|
name: 'Process',
|
||||||
|
type: 'area',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.activeSincePrevTick }))
|
data: stats.map((x, i) => ({ x: i, y: x.deliver.activeSincePrevTick }))
|
||||||
}, {
|
}, {
|
||||||
name: 'Active',
|
name: 'Active',
|
||||||
|
type: 'area',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.active }))
|
data: stats.map((x, i) => ({ x: i, y: x.deliver.active }))
|
||||||
}, {
|
}, {
|
||||||
name: 'Waiting',
|
name: 'Waiting',
|
||||||
|
type: 'line',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.waiting }))
|
data: stats.map((x, i) => ({ x: i, y: x.deliver.waiting }))
|
||||||
}, {
|
}, {
|
||||||
name: 'Delayed',
|
name: 'Delayed',
|
||||||
|
type: 'line',
|
||||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.delayed }))
|
data: stats.map((x, i) => ({ x: i, y: x.deliver.delayed }))
|
||||||
}]);
|
}]);
|
||||||
}
|
},
|
||||||
|
|
||||||
|
domain() {
|
||||||
|
this.jobs = [];
|
||||||
|
this.fetchJobs();
|
||||||
|
},
|
||||||
|
|
||||||
|
state() {
|
||||||
|
this.jobs = [];
|
||||||
|
this.fetchJobs();
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
const chartOpts = {
|
this.fetchJobs();
|
||||||
|
|
||||||
|
const chartOpts = id => ({
|
||||||
chart: {
|
chart: {
|
||||||
|
id,
|
||||||
|
group: 'queue',
|
||||||
type: 'area',
|
type: 'area',
|
||||||
height: 200,
|
height: 200,
|
||||||
animations: {
|
animations: {
|
||||||
@ -140,7 +199,12 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
grid: {
|
grid: {
|
||||||
clipMarkers: false,
|
clipMarkers: false,
|
||||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||||
|
xaxis: {
|
||||||
|
lines: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
stroke: {
|
stroke: {
|
||||||
curve: 'straight',
|
curve: 'straight',
|
||||||
@ -169,10 +233,10 @@ export default Vue.extend({
|
|||||||
show: false,
|
show: false,
|
||||||
min: 0,
|
min: 0,
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
this.inboxChart = new ApexCharts(this.$refs.inboxChart, chartOpts);
|
this.inboxChart = new ApexCharts(this.$refs.inboxChart, chartOpts('a'));
|
||||||
this.deliverChart = new ApexCharts(this.$refs.deliverChart, chartOpts);
|
this.deliverChart = new ApexCharts(this.$refs.deliverChart, chartOpts('b'));
|
||||||
|
|
||||||
this.inboxChart.render();
|
this.inboxChart.render();
|
||||||
this.deliverChart.render();
|
this.deliverChart.render();
|
||||||
@ -182,7 +246,7 @@ export default Vue.extend({
|
|||||||
connection.on('statsLog', this.onStatsLog);
|
connection.on('statsLog', this.onStatsLog);
|
||||||
connection.send('requestLog', {
|
connection.send('requestLog', {
|
||||||
id: Math.random().toString().substr(2, 8),
|
id: Math.random().toString().substr(2, 8),
|
||||||
length: 100
|
length: limit
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$once('hook:beforeDestroy', () => {
|
this.$once('hook:beforeDestroy', () => {
|
||||||
@ -212,14 +276,24 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onStats(stats) {
|
onStats(stats) {
|
||||||
this.stats.push(stats);
|
this.stats.push(stats);
|
||||||
if (this.stats.length > 100) this.stats.shift();
|
if (this.stats.length > limit) this.stats.shift();
|
||||||
},
|
},
|
||||||
|
|
||||||
onStatsLog(statsLog) {
|
onStatsLog(statsLog) {
|
||||||
for (const stats of statsLog.reverse()) {
|
for (const stats of statsLog.reverse()) {
|
||||||
this.onStats(stats);
|
this.onStats(stats);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
|
fetchJobs() {
|
||||||
|
this.$root.api('admin/queue/jobs', {
|
||||||
|
domain: this.domain,
|
||||||
|
state: this.state,
|
||||||
|
limit: this.jobsLimit
|
||||||
|
}).then(jobs => {
|
||||||
|
this.jobs = jobs;
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@ -228,5 +302,10 @@ export default Vue.extend({
|
|||||||
.wptihjuy
|
.wptihjuy
|
||||||
> .chart
|
> .chart
|
||||||
min-height 200px !important
|
min-height 200px !important
|
||||||
|
margin 0 -8px
|
||||||
|
|
||||||
|
.xvvuvgsv
|
||||||
|
> b
|
||||||
|
margin-right 16px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -165,7 +165,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
/** 処理対象ユーザーの情報を更新する */
|
/** 処理対象ユーザーの情報を更新する */
|
||||||
async refreshUser() {
|
async refreshUser() {
|
||||||
this.$root.api('admin/show-user', { userId: this.user._id }).then(info => {
|
this.$root.api('admin/show-user', { userId: this.user.id }).then(info => {
|
||||||
this.user = info;
|
this.user = info;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -173,7 +173,7 @@ export default Vue.extend({
|
|||||||
async resetPassword() {
|
async resetPassword() {
|
||||||
if (!await this.getConfirmed(this.$t('reset-password-confirm'))) return;
|
if (!await this.getConfirmed(this.$t('reset-password-confirm'))) return;
|
||||||
|
|
||||||
this.$root.api('admin/reset-password', { userId: this.user._id }).then(res => {
|
this.$root.api('admin/reset-password', { userId: this.user.id }).then(res => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('password-updated', { password: res.password })
|
text: this.$t('password-updated', { password: res.password })
|
||||||
@ -187,7 +187,7 @@ export default Vue.extend({
|
|||||||
this.verifying = true;
|
this.verifying = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/verify-user', { userId: this.user._id });
|
await this.$root.api('admin/verify-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('verified')
|
text: this.$t('verified')
|
||||||
@ -212,7 +212,7 @@ export default Vue.extend({
|
|||||||
this.unverifying = true;
|
this.unverifying = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/unverify-user', { userId: this.user._id });
|
await this.$root.api('admin/unverify-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('unverified')
|
text: this.$t('unverified')
|
||||||
@ -233,7 +233,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
async silenceUser() {
|
async silenceUser() {
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/silence-user', { userId: this.user._id });
|
await this.$root.api('admin/silence-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
splash: true
|
splash: true
|
||||||
@ -252,7 +252,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
async unsilenceUser() {
|
async unsilenceUser() {
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/unsilence-user', { userId: this.user._id });
|
await this.$root.api('admin/unsilence-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
splash: true
|
splash: true
|
||||||
@ -275,7 +275,7 @@ export default Vue.extend({
|
|||||||
this.suspending = true;
|
this.suspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/suspend-user', { userId: this.user._id });
|
await this.$root.api('admin/suspend-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('suspended')
|
text: this.$t('suspended')
|
||||||
@ -300,7 +300,7 @@ export default Vue.extend({
|
|||||||
this.unsuspending = true;
|
this.unsuspending = true;
|
||||||
|
|
||||||
const process = async () => {
|
const process = async () => {
|
||||||
await this.$root.api('admin/unsuspend-user', { userId: this.user._id });
|
await this.$root.api('admin/unsuspend-user', { userId: this.user.id });
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('unsuspended')
|
text: this.$t('unsuspended')
|
||||||
@ -320,7 +320,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async updateRemoteUser() {
|
async updateRemoteUser() {
|
||||||
this.$root.api('admin/update-remote-user', { userId: this.user._id }).then(res => {
|
this.$root.api('admin/update-remote-user', { userId: this.user.id }).then(res => {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('remote-user-updated')
|
text: this.$t('remote-user-updated')
|
||||||
|
@ -14,15 +14,7 @@
|
|||||||
<h2>{{ $t('permission-ask') }}</h2>
|
<h2>{{ $t('permission-ask') }}</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<template v-for="p in app.permission">
|
<template v-for="p in app.permission">
|
||||||
<li v-if="p == 'account-read'">{{ $t('account-read') }}</li>
|
<li :key="p">{{ $t(`@.permissions.${p}`) }}</li>
|
||||||
<li v-if="p == 'account-write'">{{ $t('account-write') }}</li>
|
|
||||||
<li v-if="p == 'note-write'">{{ $t('note-write') }}</li>
|
|
||||||
<li v-if="p == 'like-write'">{{ $t('like-write') }}</li>
|
|
||||||
<li v-if="p == 'following-write'">{{ $t('following-write') }}</li>
|
|
||||||
<li v-if="p == 'drive-read'">{{ $t('drive-read') }}</li>
|
|
||||||
<li v-if="p == 'drive-write'">{{ $t('drive-write') }}</li>
|
|
||||||
<li v-if="p == 'notification-read'">{{ $t('notification-read') }}</li>
|
|
||||||
<li v-if="p == 'notification-write'">{{ $t('notification-write') }}</li>
|
|
||||||
</template>
|
</template>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
@ -45,15 +45,9 @@ export default function <T extends object>(data: {
|
|||||||
this.$watch('props', () => {
|
this.$watch('props', () => {
|
||||||
this.mergeProps();
|
this.mergeProps();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.bakeProps();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
bakeProps() {
|
|
||||||
this.bakedOldProps = JSON.stringify(this.props);
|
|
||||||
},
|
|
||||||
|
|
||||||
mergeProps() {
|
mergeProps() {
|
||||||
if (data.props) {
|
if (data.props) {
|
||||||
const defaultProps = data.props();
|
const defaultProps = data.props();
|
||||||
@ -65,17 +59,10 @@ export default function <T extends object>(data: {
|
|||||||
},
|
},
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
if (this.bakedOldProps == JSON.stringify(this.props)) return;
|
|
||||||
|
|
||||||
this.bakeProps();
|
|
||||||
|
|
||||||
if (this.platform == 'deck') {
|
if (this.platform == 'deck') {
|
||||||
this.$store.commit('device/updateDeckColumn', this.column);
|
this.$store.commit('device/updateDeckColumn', this.column);
|
||||||
} else {
|
} else {
|
||||||
this.$root.api('i/update_widget', {
|
this.$store.commit('device/updateWidget', this.widget);
|
||||||
id: this.id,
|
|
||||||
data: this.props
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,8 +70,8 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
reactionsCount(): number {
|
reactionsCount(): number {
|
||||||
return this.appearNote.reactionCounts
|
return this.appearNote.reactions
|
||||||
? sum(Object.values(this.appearNote.reactionCounts))
|
? sum(Object.values(this.appearNote.reactions))
|
||||||
: 0;
|
: 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ export default (opts: Opts = {}) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
reactDirectly(reaction) {
|
reactDirectly(reaction) {
|
||||||
(this.$root.api('notes/reactions/create', {
|
this.$root.api('notes/reactions/create', {
|
||||||
noteId: this.appearNote.id,
|
noteId: this.appearNote.id,
|
||||||
reaction: reaction
|
reaction: reaction
|
||||||
});
|
});
|
||||||
|
@ -87,16 +87,16 @@ export default prop => ({
|
|||||||
case 'reacted': {
|
case 'reacted': {
|
||||||
const reaction = body.reaction;
|
const reaction = body.reaction;
|
||||||
|
|
||||||
if (this.$_ns_target.reactionCounts == null) {
|
if (this.$_ns_target.reactions == null) {
|
||||||
Vue.set(this.$_ns_target, 'reactionCounts', {});
|
Vue.set(this.$_ns_target, 'reactions', {});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.$_ns_target.reactionCounts[reaction] == null) {
|
if (this.$_ns_target.reactions[reaction] == null) {
|
||||||
Vue.set(this.$_ns_target.reactionCounts, reaction, 0);
|
Vue.set(this.$_ns_target.reactions, reaction, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increment the count
|
// Increment the count
|
||||||
this.$_ns_target.reactionCounts[reaction]++;
|
this.$_ns_target.reactions[reaction]++;
|
||||||
|
|
||||||
if (body.userId == this.$store.state.i.id) {
|
if (body.userId == this.$store.state.i.id) {
|
||||||
Vue.set(this.$_ns_target, 'myReaction', reaction);
|
Vue.set(this.$_ns_target, 'myReaction', reaction);
|
||||||
@ -107,16 +107,16 @@ export default prop => ({
|
|||||||
case 'unreacted': {
|
case 'unreacted': {
|
||||||
const reaction = body.reaction;
|
const reaction = body.reaction;
|
||||||
|
|
||||||
if (this.$_ns_target.reactionCounts == null) {
|
if (this.$_ns_target.reactions == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.$_ns_target.reactionCounts[reaction] == null) {
|
if (this.$_ns_target.reactions[reaction] == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decrement the count
|
// Decrement the count
|
||||||
if (this.$_ns_target.reactionCounts[reaction] > 0) this.$_ns_target.reactionCounts[reaction]--;
|
if (this.$_ns_target.reactions[reaction] > 0) this.$_ns_target.reactions[reaction]--;
|
||||||
|
|
||||||
if (body.userId == this.$store.state.i.id) {
|
if (body.userId == this.$store.state.i.id) {
|
||||||
Vue.set(this.$_ns_target, 'myReaction', null);
|
Vue.set(this.$_ns_target, 'myReaction', null);
|
||||||
@ -125,9 +125,11 @@ export default prop => ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'pollVoted': {
|
case 'pollVoted': {
|
||||||
if (body.userId == this.$store.state.i.id) return;
|
|
||||||
const choice = body.choice;
|
const choice = body.choice;
|
||||||
this.$_ns_target.poll.choices.find(c => c.id === choice).votes++;
|
this.$_ns_target.poll.choices[choice].votes++;
|
||||||
|
if (body.userId == this.$store.state.i.id) {
|
||||||
|
Vue.set(this.$_ns_target.poll.choices[choice], 'isVoted', true);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +137,6 @@ export default prop => ({
|
|||||||
Vue.set(this.$_ns_target, 'deletedAt', body.deletedAt);
|
Vue.set(this.$_ns_target, 'deletedAt', body.deletedAt);
|
||||||
Vue.set(this.$_ns_target, 'renote', null);
|
Vue.set(this.$_ns_target, 'renote', null);
|
||||||
this.$_ns_target.text = null;
|
this.$_ns_target.text = null;
|
||||||
this.$_ns_target.tags = [];
|
|
||||||
this.$_ns_target.fileIds = [];
|
this.$_ns_target.fileIds = [];
|
||||||
this.$_ns_target.poll = null;
|
this.$_ns_target.poll = null;
|
||||||
this.$_ns_target.geo = null;
|
this.$_ns_target.geo = null;
|
||||||
|
@ -69,7 +69,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
plotOptions: {
|
plotOptions: {
|
||||||
bar: {
|
bar: {
|
||||||
columnWidth: '90%'
|
columnWidth: '80%'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
grid: {
|
grid: {
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as emojilib from 'emojilib';
|
import * as emojilib from 'emojilib';
|
||||||
import contains from '../../../common/scripts/contains';
|
import contains from '../../../common/scripts/contains';
|
||||||
|
import { twemojiBase } from '../../../../../misc/twemoji-base';
|
||||||
|
|
||||||
type EmojiDef = {
|
type EmojiDef = {
|
||||||
emoji: string;
|
emoji: string;
|
||||||
@ -54,7 +55,7 @@ const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
|||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: x[0],
|
name: x[0],
|
||||||
aliasOf: null,
|
aliasOf: null,
|
||||||
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
|
||||||
}));
|
}));
|
||||||
|
|
||||||
for (const x of lib as any) {
|
for (const x of lib as any) {
|
||||||
@ -64,7 +65,7 @@ for (const x of lib as any) {
|
|||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: k,
|
name: k,
|
||||||
aliasOf: x[0],
|
aliasOf: x[0],
|
||||||
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
icon(): any {
|
icon(): any {
|
||||||
return {
|
return {
|
||||||
backgroundColor: this.lightmode
|
backgroundColor: this.user.avatarColor,
|
||||||
? `rgb(${this.user.avatarColor.slice(0, 3).join(',')})`
|
|
||||||
: this.user.avatarColor && this.user.avatarColor.length == 3
|
|
||||||
? `rgb(${this.user.avatarColor.join(',')})`
|
|
||||||
: null,
|
|
||||||
backgroundImage: this.lightmode ? null : `url(${this.url})`,
|
backgroundImage: this.lightmode ? null : `url(${this.url})`,
|
||||||
borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
|
borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
|
||||||
};
|
};
|
||||||
@ -67,7 +63,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.user.avatarColor) {
|
if (this.user.avatarColor) {
|
||||||
this.$el.style.color = `rgb(${this.user.avatarColor.slice(0, 3).join(',')})`;
|
this.$el.style.color = this.user.avatarColor;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
183
src/client/app/common/views/components/drive-file-thumbnail.vue
Normal file
183
src/client/app/common/views/components/drive-file-thumbnail.vue
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<template>
|
||||||
|
<div class="zdjebgpv" :class="{ detail }" ref="thumbnail" :style="`background-color: ${ background }`">
|
||||||
|
<img
|
||||||
|
:src="file.url"
|
||||||
|
:alt="file.name"
|
||||||
|
:title="file.name"
|
||||||
|
@load="onThumbnailLoaded"
|
||||||
|
v-if="detail && is === 'image'"/>
|
||||||
|
<video
|
||||||
|
:src="file.url"
|
||||||
|
ref="volumectrl"
|
||||||
|
preload="metadata"
|
||||||
|
controls
|
||||||
|
v-else-if="detail && is === 'video'"/>
|
||||||
|
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded" :style="`object-fit: ${ fit }`" v-else-if="isThumbnailAvailable"/>
|
||||||
|
<fa :icon="faFileImage" class="icon" v-else-if="is === 'image'"/>
|
||||||
|
<fa :icon="faFileVideo" class="icon" v-else-if="is === 'video'"/>
|
||||||
|
|
||||||
|
<audio
|
||||||
|
:src="file.url"
|
||||||
|
ref="volumectrl"
|
||||||
|
preload="metadata"
|
||||||
|
controls
|
||||||
|
v-else-if="detail && is === 'audio'"/>
|
||||||
|
<fa :icon="faMusic" class="icon" v-else-if="is === 'audio' || is === 'midi'"/>
|
||||||
|
|
||||||
|
<fa :icon="faFileCsv" class="icon" v-else-if="is === 'csv'"/>
|
||||||
|
<fa :icon="faFilePdf" class="icon" v-else-if="is === 'pdf'"/>
|
||||||
|
<fa :icon="faFileAlt" class="icon" v-else-if="is === 'textfile'"/>
|
||||||
|
<fa :icon="faFileArchive" class="icon" v-else-if="is === 'archive'"/>
|
||||||
|
<fa :icon="faFile" class="icon" v-else/>
|
||||||
|
|
||||||
|
<fa :icon="faFilm" class="icon-sub" v-if="!detail && isThumbnailAvailable && is === 'video'"/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import anime from 'animejs';
|
||||||
|
import {
|
||||||
|
faFile,
|
||||||
|
faFileAlt,
|
||||||
|
faFileImage,
|
||||||
|
faMusic,
|
||||||
|
faFileVideo,
|
||||||
|
faFileCsv,
|
||||||
|
faFilePdf,
|
||||||
|
faFileArchive,
|
||||||
|
faFilm
|
||||||
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
file: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
fit: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
detail: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isContextmenuShowing: false,
|
||||||
|
isDragging: false,
|
||||||
|
|
||||||
|
faFile,
|
||||||
|
faFileAlt,
|
||||||
|
faFileImage,
|
||||||
|
faMusic,
|
||||||
|
faFileVideo,
|
||||||
|
faFileCsv,
|
||||||
|
faFilePdf,
|
||||||
|
faFileArchive,
|
||||||
|
faFilm
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
is(): 'image' | 'video' | 'midi' | 'audio' | 'csv' | 'pdf' | 'textfile' | 'archive' | 'unknown' {
|
||||||
|
if (this.file.type.startsWith('image/')) return 'image';
|
||||||
|
if (this.file.type.startsWith('video/')) return 'video';
|
||||||
|
if (this.file.type === 'audio/midi') return 'midi';
|
||||||
|
if (this.file.type.startsWith('audio/')) return 'audio';
|
||||||
|
if (this.file.type.endsWith('/csv')) return 'csv';
|
||||||
|
if (this.file.type.endsWith('/pdf')) return 'pdf';
|
||||||
|
if (this.file.type.startsWith('text/')) return 'textfile';
|
||||||
|
if ([
|
||||||
|
"application/zip",
|
||||||
|
"application/x-cpio",
|
||||||
|
"application/x-bzip",
|
||||||
|
"application/x-bzip2",
|
||||||
|
"application/java-archive",
|
||||||
|
"application/x-rar-compressed",
|
||||||
|
"application/x-tar",
|
||||||
|
"application/gzip",
|
||||||
|
"application/x-7z-compressed"
|
||||||
|
].some(e => e === this.file.type)) return 'archive';
|
||||||
|
return 'unknown';
|
||||||
|
},
|
||||||
|
isThumbnailAvailable(): boolean {
|
||||||
|
return this.file.thumbnailUrl
|
||||||
|
? (this.is === 'image' || this.is === 'video')
|
||||||
|
: false;
|
||||||
|
},
|
||||||
|
background(): string {
|
||||||
|
return this.file.properties.avgColor || 'transparent';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
||||||
|
if (audioTag) audioTag.volume = this.$store.state.device.mediaVolume;
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onThumbnailLoaded() {
|
||||||
|
if (this.file.properties.avgColor) {
|
||||||
|
anime({
|
||||||
|
targets: this.$refs.thumbnail,
|
||||||
|
backgroundColor: 'transparent', // TODO fade
|
||||||
|
duration: 100,
|
||||||
|
easing: 'linear'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
volumechange() {
|
||||||
|
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
||||||
|
this.$store.commit('device/set', { key: 'mediaVolume', value: audioTag.volume });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.zdjebgpv
|
||||||
|
display flex
|
||||||
|
|
||||||
|
> img,
|
||||||
|
> .icon
|
||||||
|
pointer-events none
|
||||||
|
|
||||||
|
> .icon-sub
|
||||||
|
position absolute
|
||||||
|
width 30%
|
||||||
|
height auto
|
||||||
|
margin 0
|
||||||
|
right 4%
|
||||||
|
bottom 4%
|
||||||
|
|
||||||
|
> *
|
||||||
|
margin auto
|
||||||
|
|
||||||
|
&:not(.detail)
|
||||||
|
> img
|
||||||
|
height 100%
|
||||||
|
width 100%
|
||||||
|
object-fit cover
|
||||||
|
|
||||||
|
> .icon
|
||||||
|
height 65%
|
||||||
|
width 65%
|
||||||
|
|
||||||
|
> video,
|
||||||
|
> audio
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
&.detail
|
||||||
|
> .icon
|
||||||
|
height 100px
|
||||||
|
width 100px
|
||||||
|
margin 16px
|
||||||
|
|
||||||
|
> *:not(.icon)
|
||||||
|
max-height 300px
|
||||||
|
max-width 100%
|
||||||
|
height 100%
|
||||||
|
object-fit contain
|
||||||
|
|
||||||
|
</style>
|
@ -10,6 +10,7 @@ import Vue from 'vue';
|
|||||||
// スクリプトサイズがデカい
|
// スクリプトサイズがデカい
|
||||||
//import { lib } from 'emojilib';
|
//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';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@ -29,7 +30,11 @@ export default Vue.extend({
|
|||||||
customEmojis: {
|
customEmojis: {
|
||||||
required: false,
|
required: false,
|
||||||
default: () => []
|
default: () => []
|
||||||
}
|
},
|
||||||
|
isReaction: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
@ -46,7 +51,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
useOsDefaultEmojis(): boolean {
|
useOsDefaultEmojis(): boolean {
|
||||||
return this.$store.state.device.useOsDefaultEmojis;
|
return this.$store.state.device.useOsDefaultEmojis && !this.isReaction;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -73,7 +78,7 @@ 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 = `https://twemoji.maxcdn.com/2/svg/${codes.join('-')}.svg`;
|
this.url = `${twemojiBase}/2/svg/${codes.join('-')}.svg`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a class="a" :href="repo" target="_blank" title="View source on GitHub">
|
<a class="a" :href="repositoryUrl" target="_blank" title="View source on GitHub">
|
||||||
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
|
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
|
||||||
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
||||||
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>
|
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>
|
||||||
@ -15,12 +15,6 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
repositoryUrl: 'https://github.com/syuilo/misskey'
|
repositoryUrl: 'https://github.com/syuilo/misskey'
|
||||||
};
|
};
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
if (meta.maintainer)
|
|
||||||
this.repositoryUrl = meta.maintainer.repository_url;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -24,11 +24,11 @@
|
|||||||
|
|
||||||
<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="this.$store.state.settings.games.reversi.showBoardLabels">
|
||||||
<span v-for="i in game.settings.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="this.$store.state.settings.games.reversi.showBoardLabels">
|
||||||
<div v-for="i in game.settings.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">
|
||||||
<div v-for="(stone, i) in o.board"
|
<div v-for="(stone, i) in o.board"
|
||||||
@ -46,11 +46,11 @@
|
|||||||
</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.games.reversi.showBoardLabels">
|
||||||
<div v-for="i in game.settings.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.games.reversi.showBoardLabels">
|
||||||
<span v-for="i in game.settings.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>
|
||||||
|
|
||||||
@ -71,9 +71,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<p v-if="game.settings.isLlotheo">{{ $t('is-llotheo') }}</p>
|
<p v-if="game.isLlotheo">{{ $t('is-llotheo') }}</p>
|
||||||
<p v-if="game.settings.loopedBoard">{{ $t('looped-map') }}</p>
|
<p v-if="game.loopedBoard">{{ $t('looped-map') }}</p>
|
||||||
<p v-if="game.settings.canPutEverywhere">{{ $t('can-put-everywhere') }}</p>
|
<p v-if="game.canPutEverywhere">{{ $t('can-put-everywhere') }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -160,8 +160,8 @@ export default Vue.extend({
|
|||||||
|
|
||||||
cellsStyle(): any {
|
cellsStyle(): any {
|
||||||
return {
|
return {
|
||||||
'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`,
|
'grid-template-rows': `repeat(${this.game.map.length}, 1fr)`,
|
||||||
'grid-template-columns': `repeat(${this.game.settings.map[0].length}, 1fr)`
|
'grid-template-columns': `repeat(${this.game.map[0].length}, 1fr)`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -169,10 +169,10 @@ export default Vue.extend({
|
|||||||
watch: {
|
watch: {
|
||||||
logPos(v) {
|
logPos(v) {
|
||||||
if (!this.game.isEnded) return;
|
if (!this.game.isEnded) return;
|
||||||
this.o = new Reversi(this.game.settings.map, {
|
this.o = new Reversi(this.game.map, {
|
||||||
isLlotheo: this.game.settings.isLlotheo,
|
isLlotheo: this.game.isLlotheo,
|
||||||
canPutEverywhere: this.game.settings.canPutEverywhere,
|
canPutEverywhere: this.game.canPutEverywhere,
|
||||||
loopedBoard: this.game.settings.loopedBoard
|
loopedBoard: this.game.loopedBoard
|
||||||
});
|
});
|
||||||
for (const log of this.logs.slice(0, v)) {
|
for (const log of this.logs.slice(0, v)) {
|
||||||
this.o.put(log.color, log.pos);
|
this.o.put(log.color, log.pos);
|
||||||
@ -184,10 +184,10 @@ export default Vue.extend({
|
|||||||
created() {
|
created() {
|
||||||
this.game = this.initGame;
|
this.game = this.initGame;
|
||||||
|
|
||||||
this.o = new Reversi(this.game.settings.map, {
|
this.o = new Reversi(this.game.map, {
|
||||||
isLlotheo: this.game.settings.isLlotheo,
|
isLlotheo: this.game.isLlotheo,
|
||||||
canPutEverywhere: this.game.settings.canPutEverywhere,
|
canPutEverywhere: this.game.canPutEverywhere,
|
||||||
loopedBoard: this.game.settings.loopedBoard
|
loopedBoard: this.game.loopedBoard
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const log of this.game.logs) {
|
for (const log of this.game.logs) {
|
||||||
@ -286,10 +286,10 @@ export default Vue.extend({
|
|||||||
onRescue(game) {
|
onRescue(game) {
|
||||||
this.game = game;
|
this.game = game;
|
||||||
|
|
||||||
this.o = new Reversi(this.game.settings.map, {
|
this.o = new Reversi(this.game.map, {
|
||||||
isLlotheo: this.game.settings.isLlotheo,
|
isLlotheo: this.game.isLlotheo,
|
||||||
canPutEverywhere: this.game.settings.canPutEverywhere,
|
canPutEverywhere: this.game.canPutEverywhere,
|
||||||
loopedBoard: this.game.settings.loopedBoard
|
loopedBoard: this.game.loopedBoard
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const log of this.game.logs) {
|
for (const log of this.game.logs) {
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="random" v-if="game.settings.map == null"><fa icon="dice"/></div>
|
<div class="random" v-if="game.map == null"><fa icon="dice"/></div>
|
||||||
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
|
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.map[0].length }, 1fr)` }">
|
||||||
<div v-for="(x, i) in game.settings.map.join('')"
|
<div v-for="(x, i) in game.map.join('')"
|
||||||
:data-none="x == ' '"
|
:data-none="x == ' '"
|
||||||
@click="onPixelClick(i, x)">
|
@click="onPixelClick(i, x)">
|
||||||
<fa v-if="x == 'b'" :icon="fasCircle"/>
|
<fa v-if="x == 'b'" :icon="fasCircle"/>
|
||||||
@ -35,9 +35,9 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<form-radio v-model="game.settings.bw" value="random" @change="updateSettings">{{ $t('random') }}</form-radio>
|
<form-radio v-model="game.bw" value="random" @change="updateSettings('bw')">{{ $t('random') }}</form-radio>
|
||||||
<form-radio v-model="game.settings.bw" :value="1" @change="updateSettings">{{ this.$t('black-is').split('{}')[0] }}<b><mk-user-name :user="game.user1"/></b>{{ this.$t('black-is').split('{}')[1] }}</form-radio>
|
<form-radio v-model="game.bw" :value="1" @change="updateSettings('bw')">{{ this.$t('black-is').split('{}')[0] }}<b><mk-user-name :user="game.user1"/></b>{{ this.$t('black-is').split('{}')[1] }}</form-radio>
|
||||||
<form-radio v-model="game.settings.bw" :value="2" @change="updateSettings">{{ this.$t('black-is').split('{}')[0] }}<b><mk-user-name :user="game.user2"/></b>{{ this.$t('black-is').split('{}')[1] }}</form-radio>
|
<form-radio v-model="game.bw" :value="2" @change="updateSettings('bw')">{{ this.$t('black-is').split('{}')[0] }}<b><mk-user-name :user="game.user2"/></b>{{ this.$t('black-is').split('{}')[1] }}</form-radio>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -47,9 +47,9 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<ui-switch v-model="game.settings.isLlotheo" @change="updateSettings">{{ $t('is-llotheo') }}</ui-switch>
|
<ui-switch v-model="game.isLlotheo" @change="updateSettings('isLlotheo')">{{ $t('is-llotheo') }}</ui-switch>
|
||||||
<ui-switch v-model="game.settings.loopedBoard" @change="updateSettings">{{ $t('looped-map') }}</ui-switch>
|
<ui-switch v-model="game.loopedBoard" @change="updateSettings('loopedBoard')">{{ $t('looped-map') }}</ui-switch>
|
||||||
<ui-switch v-model="game.settings.canPutEverywhere" @change="updateSettings">{{ $t('can-put-everywhere') }}</ui-switch>
|
<ui-switch v-model="game.canPutEverywhere" @change="updateSettings('canPutEverywhere')">{{ $t('can-put-everywhere') }}</ui-switch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -159,8 +159,8 @@ export default Vue.extend({
|
|||||||
this.connection.on('initForm', this.onInitForm);
|
this.connection.on('initForm', this.onInitForm);
|
||||||
this.connection.on('message', this.onMessage);
|
this.connection.on('message', this.onMessage);
|
||||||
|
|
||||||
if (this.game.user1Id != this.$store.state.i.id && this.game.settings.form1) this.form = this.game.settings.form1;
|
if (this.game.user1Id != this.$store.state.i.id && this.game.form1) this.form = this.game.form1;
|
||||||
if (this.game.user2Id != this.$store.state.i.id && this.game.settings.form2) this.form = this.game.settings.form2;
|
if (this.game.user2Id != this.$store.state.i.id && this.game.form2) this.form = this.game.form2;
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
@ -189,18 +189,19 @@ export default Vue.extend({
|
|||||||
this.$forceUpdate();
|
this.$forceUpdate();
|
||||||
},
|
},
|
||||||
|
|
||||||
updateSettings() {
|
updateSettings(key: string) {
|
||||||
this.connection.send('updateSettings', {
|
this.connection.send('updateSettings', {
|
||||||
settings: this.game.settings
|
key: key,
|
||||||
|
value: this.game[key]
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onUpdateSettings(settings) {
|
onUpdateSettings({ key, value }) {
|
||||||
this.game.settings = settings;
|
this.game[key] = value;
|
||||||
if (this.game.settings.map == null) {
|
if (this.game.map == null) {
|
||||||
this.mapName = null;
|
this.mapName = null;
|
||||||
} else {
|
} else {
|
||||||
const found = Object.values(maps).find(x => x.data.join('') == this.game.settings.map.join(''));
|
const found = Object.values(maps).find(x => x.data.join('') == this.game.map.join(''));
|
||||||
this.mapName = found ? found.name : '-Custom-';
|
this.mapName = found ? found.name : '-Custom-';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -224,27 +225,27 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onMapChange() {
|
onMapChange() {
|
||||||
if (this.mapName == null) {
|
if (this.mapName == null) {
|
||||||
this.game.settings.map = null;
|
this.game.map = null;
|
||||||
} else {
|
} else {
|
||||||
this.game.settings.map = Object.values(maps).find(x => x.name == this.mapName).data;
|
this.game.map = Object.values(maps).find(x => x.name == this.mapName).data;
|
||||||
}
|
}
|
||||||
this.$forceUpdate();
|
this.$forceUpdate();
|
||||||
this.updateSettings();
|
this.updateSettings();
|
||||||
},
|
},
|
||||||
|
|
||||||
onPixelClick(pos, pixel) {
|
onPixelClick(pos, pixel) {
|
||||||
const x = pos % this.game.settings.map[0].length;
|
const x = pos % this.game.map[0].length;
|
||||||
const y = Math.floor(pos / this.game.settings.map[0].length);
|
const y = Math.floor(pos / this.game.map[0].length);
|
||||||
const newPixel =
|
const newPixel =
|
||||||
pixel == ' ' ? '-' :
|
pixel == ' ' ? '-' :
|
||||||
pixel == '-' ? 'b' :
|
pixel == '-' ? 'b' :
|
||||||
pixel == 'b' ? 'w' :
|
pixel == 'b' ? 'w' :
|
||||||
' ';
|
' ';
|
||||||
const line = this.game.settings.map[y].split('');
|
const line = this.game.map[y].split('');
|
||||||
line[x] = newPixel;
|
line[x] = newPixel;
|
||||||
this.$set(this.game.settings.map, y, line.join(''));
|
this.$set(this.game.map, y, line.join(''));
|
||||||
this.$forceUpdate();
|
this.$forceUpdate();
|
||||||
this.updateSettings();
|
this.updateSettings('map');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -106,7 +106,7 @@ export default Vue.extend({
|
|||||||
async nav(game, actualNav = true) {
|
async nav(game, actualNav = true) {
|
||||||
if (this.selfNav) {
|
if (this.selfNav) {
|
||||||
// 受け取ったゲーム情報が省略されたものなら完全な情報を取得する
|
// 受け取ったゲーム情報が省略されたものなら完全な情報を取得する
|
||||||
if (game != null && (game.settings == null || game.settings.map == null)) {
|
if (game != null && game.map == null) {
|
||||||
game = await this.$root.api('games/reversi/games/show', {
|
game = await this.$root.api('games/reversi/games/show', {
|
||||||
gameId: game.id
|
gameId: game.id
|
||||||
});
|
});
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="nhasjydimbopojusarffqjyktglcuxjy" v-if="meta">
|
<div class="nhasjydimbopojusarffqjyktglcuxjy" v-if="meta">
|
||||||
<div class="banner" :style="{ backgroundImage: meta.bannerUrl ? `url(${meta.bannerUrl})` : null }"></div>
|
<div class="banner" :style="{ backgroundImage: meta.bannerUrl ? `url(${meta.bannerUrl})` : null }"></div>
|
||||||
|
|
||||||
<h1>{{ meta.name }}</h1>
|
<h1>{{ meta.name || 'Misskey' }}</h1>
|
||||||
<p v-html="meta.description || this.$t('@.about')"></p>
|
<p v-html="meta.description || this.$t('@.about')"></p>
|
||||||
<router-link to="/">{{ $t('start') }}</router-link>
|
<router-link to="/">{{ $t('start') }}</router-link>
|
||||||
</div>
|
</div>
|
||||||
|
@ -52,7 +52,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
|
'background-color': this.image.properties.avgColor || 'transparent',
|
||||||
'background-image': url
|
'background-image': url
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -33,10 +33,12 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
canonical(): string {
|
canonical(): string {
|
||||||
return `@${this.username}@${toUnicode(this.host)}`;
|
return this.host === localHost ? `@${this.username}` : `@${this.username}@${toUnicode(this.host)}`;
|
||||||
},
|
},
|
||||||
isMe(): boolean {
|
isMe(): boolean {
|
||||||
return this.$store.getters.isSignedIn && this.canonical.toLowerCase() === `@${this.$store.state.i.username}@${toUnicode(localHost)}`.toLowerCase();
|
return this.$store.getters.isSignedIn && (
|
||||||
|
`@${this.username}@${toUnicode(this.host)}` === `@${this.$store.state.i.username}@${toUnicode(localHost)}`.toLowerCase()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -85,7 +85,10 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (items[0].kind == 'file') {
|
if (items[0].kind == 'file') {
|
||||||
alert(this.$t('only-one-file-attached'));
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('only-one-file-attached')
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -107,7 +110,10 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
} else if (e.dataTransfer.files.length > 1) {
|
} else if (e.dataTransfer.files.length > 1) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
alert(this.$t('only-one-file-attached'));
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('only-one-file-attached')
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<div class="file" v-if="message.file">
|
<div class="file" v-if="message.file">
|
||||||
<a :href="message.file.url" target="_blank" :title="message.file.name">
|
<a :href="message.file.url" target="_blank" :title="message.file.name">
|
||||||
<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"
|
<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"
|
||||||
:style="{ backgroundColor: message.file.properties.avgColor && message.file.properties.avgColor.length == 3 ? `rgb(${message.file.properties.avgColor.join(',')})` : 'transparent' }"/>
|
:style="{ backgroundColor: message.file.properties.avgColor || 'transparent' }"/>
|
||||||
<p v-else>{{ message.file.name }}</p>
|
<p v-else>{{ message.file.name }}</p>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -125,7 +125,10 @@ export default Vue.extend({
|
|||||||
this.form.upload(e.dataTransfer.files[0]);
|
this.form.upload(e.dataTransfer.files[0]);
|
||||||
return;
|
return;
|
||||||
} else if (e.dataTransfer.files.length > 1) {
|
} else if (e.dataTransfer.files.length > 1) {
|
||||||
alert(this.$t('only-one-file-attached'));
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('only-one-file-attached')
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,12 +23,6 @@ export default Vue.extend({
|
|||||||
repositoryUrl: 'https://github.com/syuilo/misskey',
|
repositoryUrl: 'https://github.com/syuilo/misskey',
|
||||||
feedbackUrl: 'https://github.com/syuilo/misskey/issues/new'
|
feedbackUrl: 'https://github.com/syuilo/misskey/issues/new'
|
||||||
}
|
}
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
if (meta.maintainer.repository_url) this.repositoryUrl = meta.maintainer.repository_url;
|
|
||||||
if (meta.maintainer.feedback_url) this.feedbackUrl = meta.maintainer.feedback_url;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-poll" :data-done="closed || isVoted">
|
<div class="mk-poll" :data-done="closed || isVoted">
|
||||||
<ul>
|
<ul>
|
||||||
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!closed && !isVoted ? $t('vote-to').replace('{}', choice.text) : ''">
|
<li v-for="(choice, i) in poll.choices" :key="i" @click="vote(i)" :class="{ voted: choice.voted }" :title="!closed && !isVoted ? $t('vote-to').replace('{}', choice.text) : ''">
|
||||||
<div class="backdrop" :style="{ 'width': `${showResult ? (choice.votes / total * 100) : 0}%` }"></div>
|
<div class="backdrop" :style="{ 'width': `${showResult ? (choice.votes / total * 100) : 0}%` }"></div>
|
||||||
<span>
|
<span>
|
||||||
<template v-if="choice.isVoted"><fa icon="check"/></template>
|
<template v-if="choice.isVoted"><fa icon="check"/></template>
|
||||||
@ -82,12 +82,6 @@ export default Vue.extend({
|
|||||||
noteId: this.note.id,
|
noteId: this.note.id,
|
||||||
choice: id
|
choice: id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
for (const c of this.poll.choices) {
|
|
||||||
if (c.id == id) {
|
|
||||||
c.votes++;
|
|
||||||
Vue.set(c, 'isVoted', true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!this.showResult) this.showResult = !this.poll.multiple;
|
if (!this.showResult) this.showResult = !this.poll.multiple;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
139
src/client/app/common/views/components/post-form-attaches.vue
Normal file
139
src/client/app/common/views/components/post-form-attaches.vue
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
<template>
|
||||||
|
<div class="skeikyzd" v-show="files.length != 0">
|
||||||
|
<x-draggable class="files" :list="files" animation="150">
|
||||||
|
<div v-for="file in files" :key="file.id" @click="showFileMenu(file, $event)" @contextmenu.prevent="showFileMenu(file, $event)">
|
||||||
|
<x-file-thumbnail :data-id="file.id" class="thumbnail" :file="file" fit="cover"/>
|
||||||
|
<img class="remove" @click.stop="detachMedia(file.id)" src="/assets/desktop/remove.png" :title="$t('attach-cancel')" alt=""/>
|
||||||
|
<div class="sensitive" v-if="file.isSensitive">
|
||||||
|
<fa class="icon" :icon="faExclamationTriangle"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</x-draggable>
|
||||||
|
<p class="remain">{{ 4 - files.length }}/4</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
import * as XDraggable from 'vuedraggable';
|
||||||
|
import XMenu from '../../../common/views/components/menu.vue';
|
||||||
|
import { faTimesCircle, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import XFileThumbnail from './drive-file-thumbnail.vue'
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('common/views/components/post-form-attaches.vue'),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XDraggable,
|
||||||
|
XFileThumbnail
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
files: {
|
||||||
|
type: Array,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
detachMediaFn: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
faExclamationTriangle
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
detachMedia(id) {
|
||||||
|
if (this.detachMediaFn) this.detachMediaFn(id)
|
||||||
|
else if (this.$parent.detachMedia) this.$parent.detachMedia(id)
|
||||||
|
},
|
||||||
|
toggleSensitive(file) {
|
||||||
|
this.$root.api('drive/files/update', {
|
||||||
|
fileId: file.id,
|
||||||
|
isSensitive: !file.isSensitive
|
||||||
|
}).then(() => {
|
||||||
|
file.isSensitive = !file.isSensitive;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
showFileMenu(file, ev: MouseEvent) {
|
||||||
|
this.$root.new(XMenu, {
|
||||||
|
items: [{
|
||||||
|
type: 'item',
|
||||||
|
text: file.isSensitive ? this.$t('unmark-as-sensitive') : this.$t('mark-as-sensitive'),
|
||||||
|
icon: file.isSensitive ? faEyeSlash : faEye,
|
||||||
|
action: () => { this.toggleSensitive(file) }
|
||||||
|
}, {
|
||||||
|
type: 'item',
|
||||||
|
text: this.$t('attach-cancel'),
|
||||||
|
icon: faTimesCircle,
|
||||||
|
action: () => { this.detachMedia(file.id) }
|
||||||
|
}],
|
||||||
|
source: ev.currentTarget || ev.target
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.skeikyzd
|
||||||
|
padding 4px
|
||||||
|
|
||||||
|
> .files
|
||||||
|
display flex
|
||||||
|
flex-wrap wrap
|
||||||
|
|
||||||
|
> div
|
||||||
|
width 64px
|
||||||
|
height 64px
|
||||||
|
margin 4px
|
||||||
|
cursor move
|
||||||
|
|
||||||
|
&:hover > .remove
|
||||||
|
display block
|
||||||
|
|
||||||
|
> .thumbnail
|
||||||
|
width 100%
|
||||||
|
height 100%
|
||||||
|
z-index 1
|
||||||
|
color var(--text)
|
||||||
|
|
||||||
|
> .remove
|
||||||
|
display none
|
||||||
|
position absolute
|
||||||
|
top -6px
|
||||||
|
right -6px
|
||||||
|
width 16px
|
||||||
|
height 16px
|
||||||
|
cursor pointer
|
||||||
|
z-index 1000
|
||||||
|
|
||||||
|
> .sensitive
|
||||||
|
display flex
|
||||||
|
position absolute
|
||||||
|
width 64px
|
||||||
|
height 64px
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
z-index 2
|
||||||
|
background rgba(17, 17, 17, .7)
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> .icon
|
||||||
|
margin auto
|
||||||
|
|
||||||
|
> .remain
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
top 8px
|
||||||
|
right 8px
|
||||||
|
margin 0
|
||||||
|
padding 0
|
||||||
|
color var(--primaryAlpha04)
|
||||||
|
|
||||||
|
</style>
|
@ -1,19 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="mk-reaction-icon">
|
<mk-emoji :emoji="str.startsWith(':') ? null : str" :name="str.startsWith(':') ? str.substr(1, str.length - 2) : null" :is-reaction="true" :custom-emojis="customEmojis" :normal="true"/>
|
||||||
<img v-if="reaction == 'like'" src="https://twemoji.maxcdn.com/2/svg/1f44d.svg" :alt="$t('@.reactions.like')">
|
|
||||||
<img v-if="reaction == 'love'" src="https://twemoji.maxcdn.com/2/svg/2764.svg" :alt="$t('@.reactions.love')">
|
|
||||||
<img v-if="reaction == 'laugh'" src="https://twemoji.maxcdn.com/2/svg/1f606.svg" :alt="$t('@.reactions.laugh')">
|
|
||||||
<img v-if="reaction == 'hmm'" src="https://twemoji.maxcdn.com/2/svg/1f914.svg" :alt="$t('@.reactions.hmm')">
|
|
||||||
<img v-if="reaction == 'surprise'" src="https://twemoji.maxcdn.com/2/svg/1f62e.svg" :alt="$t('@.reactions.surprise')">
|
|
||||||
<img v-if="reaction == 'congrats'" src="https://twemoji.maxcdn.com/2/svg/1f389.svg" :alt="$t('@.reactions.congrats')">
|
|
||||||
<img v-if="reaction == 'angry'" src="https://twemoji.maxcdn.com/2/svg/1f4a2.svg" :alt="$t('@.reactions.angry')">
|
|
||||||
<img v-if="reaction == 'confused'" src="https://twemoji.maxcdn.com/2/svg/1f625.svg" :alt="$t('@.reactions.confused')">
|
|
||||||
<img v-if="reaction == 'rip'" src="https://twemoji.maxcdn.com/2/svg/1f607.svg" :alt="$t('@.reactions.rip')">
|
|
||||||
<template v-if="reaction == 'pudding'">
|
|
||||||
<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="https://twemoji.maxcdn.com/2/svg/1f363.svg" :alt="$t('@.reactions.pudding')">
|
|
||||||
<img v-else src="https://twemoji.maxcdn.com/2/svg/1f36e.svg" :alt="$t('@.reactions.pudding')">
|
|
||||||
</template>
|
|
||||||
</span>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -21,7 +7,35 @@ import Vue from 'vue';
|
|||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n(),
|
i18n: i18n(),
|
||||||
props: ['reaction']
|
props: {
|
||||||
|
reaction: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
customEmojis: (this.$root.getMetaSync() || { emojis: [] }).emojis || []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
str(): any {
|
||||||
|
switch (this.reaction) {
|
||||||
|
case 'like': return '👍';
|
||||||
|
case 'love': return '❤';
|
||||||
|
case 'laugh': return '😆';
|
||||||
|
case 'hmm': return '🤔';
|
||||||
|
case 'surprise': return '😮';
|
||||||
|
case 'congrats': return '🎉';
|
||||||
|
case 'angry': return '💢';
|
||||||
|
case 'confused': return '😥';
|
||||||
|
case 'rip': return '😇';
|
||||||
|
case 'pudding': return (this.$store.getters.isSignedIn && this.$store.state.settings.iLikeSushi) ? '🍣' : '🍮';
|
||||||
|
case 'star': return '⭐';
|
||||||
|
default: return this.reaction;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<div class="backdrop" ref="backdrop" @click="close"></div>
|
<div class="backdrop" ref="backdrop" @click="close"></div>
|
||||||
<div class="popover" :class="{ isMobile: $root.isMobile }" ref="popover">
|
<div class="popover" :class="{ isMobile: $root.isMobile }" ref="popover">
|
||||||
<p v-if="!$root.isMobile">{{ title }}</p>
|
<p v-if="!$root.isMobile">{{ title }}</p>
|
||||||
<div ref="buttons" :class="{ showFocus }">
|
<div class="buttons" ref="buttons" :class="{ showFocus }">
|
||||||
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" :title="$t('@.reactions.like')" v-particle><mk-reaction-icon reaction="like"/></button>
|
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" :title="$t('@.reactions.like')" v-particle><mk-reaction-icon reaction="like"/></button>
|
||||||
<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" :title="$t('@.reactions.love')" v-particle><mk-reaction-icon reaction="love"/></button>
|
<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" :title="$t('@.reactions.love')" v-particle><mk-reaction-icon reaction="love"/></button>
|
||||||
<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" :title="$t('@.reactions.laugh')" v-particle><mk-reaction-icon reaction="laugh"/></button>
|
<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" :title="$t('@.reactions.laugh')" v-particle><mk-reaction-icon reaction="laugh"/></button>
|
||||||
@ -15,6 +15,9 @@
|
|||||||
<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" :title="$t('@.reactions.rip')" v-particle><mk-reaction-icon reaction="rip"/></button>
|
<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" :title="$t('@.reactions.rip')" v-particle><mk-reaction-icon reaction="rip"/></button>
|
||||||
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" :title="$t('@.reactions.pudding')" v-particle><mk-reaction-icon reaction="pudding"/></button>
|
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" :title="$t('@.reactions.pudding')" v-particle><mk-reaction-icon reaction="pudding"/></button>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="enableEmojiReaction" class="text">
|
||||||
|
<input v-model="text" placeholder="または絵文字を入力" @keyup.enter="reactText" @input="tryReactText" v-autocomplete="{ model: 'text' }">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -23,6 +26,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import anime from 'animejs';
|
import anime from 'animejs';
|
||||||
|
import { emojiRegex } from '../../../../../misc/emoji-regex';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('common/views/components/reaction-picker.vue'),
|
i18n: i18n('common/views/components/reaction-picker.vue'),
|
||||||
@ -56,6 +60,8 @@ export default Vue.extend({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
title: this.$t('choose-reaction'),
|
title: this.$t('choose-reaction'),
|
||||||
|
text: null,
|
||||||
|
enableEmojiReaction: false,
|
||||||
focus: null
|
focus: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -94,6 +100,10 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
this.$root.getMeta().then(meta => {
|
||||||
|
this.enableEmojiReaction = meta.enableEmojiReaction;
|
||||||
|
});
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.focus = 0;
|
this.focus = 0;
|
||||||
|
|
||||||
@ -143,6 +153,17 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
reactText() {
|
||||||
|
if (!this.text) return;
|
||||||
|
this.react(this.text);
|
||||||
|
},
|
||||||
|
|
||||||
|
tryReactText() {
|
||||||
|
if (!this.text) return;
|
||||||
|
if (!this.text.match(emojiRegex)) return;
|
||||||
|
this.reactText();
|
||||||
|
},
|
||||||
|
|
||||||
onMouseover(e) {
|
onMouseover(e) {
|
||||||
this.title = e.target.title;
|
this.title = e.target.title;
|
||||||
},
|
},
|
||||||
@ -256,9 +277,9 @@ export default Vue.extend({
|
|||||||
color var(--popupFg)
|
color var(--popupFg)
|
||||||
border-bottom solid var(--lineWidth) var(--faceDivider)
|
border-bottom solid var(--lineWidth) var(--faceDivider)
|
||||||
|
|
||||||
> div
|
> .buttons
|
||||||
padding 4px
|
padding 4px 4px 8px 4px
|
||||||
width 240px
|
width 216px
|
||||||
text-align center
|
text-align center
|
||||||
|
|
||||||
&.showFocus
|
&.showFocus
|
||||||
@ -283,6 +304,9 @@ export default Vue.extend({
|
|||||||
font-size 24px
|
font-size 24px
|
||||||
border-radius 2px
|
border-radius 2px
|
||||||
|
|
||||||
|
> *
|
||||||
|
height 1em
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
background var(--reactionPickerButtonHoverBg)
|
background var(--reactionPickerButtonHoverBg)
|
||||||
|
|
||||||
@ -290,4 +314,29 @@ export default Vue.extend({
|
|||||||
background var(--primary)
|
background var(--primary)
|
||||||
box-shadow inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15)
|
box-shadow inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15)
|
||||||
|
|
||||||
|
> .text
|
||||||
|
width 216px
|
||||||
|
padding 0 8px 8px 8px
|
||||||
|
|
||||||
|
> input
|
||||||
|
width 100%
|
||||||
|
padding 10px
|
||||||
|
margin 0
|
||||||
|
text-align center
|
||||||
|
font-size 16px
|
||||||
|
color var(--desktopPostFormTextareaFg)
|
||||||
|
background var(--desktopPostFormTextareaBg)
|
||||||
|
outline none
|
||||||
|
border solid 1px var(--primaryAlpha01)
|
||||||
|
border-radius 4px
|
||||||
|
transition border-color .2s ease
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
border-color var(--primaryAlpha02)
|
||||||
|
transition border-color .1s ease
|
||||||
|
|
||||||
|
&:focus
|
||||||
|
border-color var(--primaryAlpha05)
|
||||||
|
transition border-color 0s ease
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -136,12 +136,8 @@ export default Vue.extend({
|
|||||||
&:hover
|
&:hover
|
||||||
background var(--reactionViewerButtonHoverBg)
|
background var(--reactionViewerButtonHoverBg)
|
||||||
|
|
||||||
> .mk-reaction-icon
|
|
||||||
font-size 1.4em
|
|
||||||
|
|
||||||
> span
|
> span
|
||||||
font-size 1.1em
|
font-size 1.1em
|
||||||
line-height 32px
|
line-height 32px
|
||||||
vertical-align middle
|
|
||||||
color var(--text)
|
color var(--text)
|
||||||
</style>
|
</style>
|
||||||
|
@ -20,7 +20,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
reactions(): any {
|
reactions(): any {
|
||||||
return this.note.reactionCounts;
|
return this.note.reactions;
|
||||||
},
|
},
|
||||||
isMe(): boolean {
|
isMe(): boolean {
|
||||||
return this.$store.getters.isSignedIn && this.$store.state.i.id === this.note.userId;
|
return this.$store.getters.isSignedIn && this.$store.state.i.id === this.note.userId;
|
||||||
|
@ -93,12 +93,17 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
plotOptions: {
|
plotOptions: {
|
||||||
bar: {
|
bar: {
|
||||||
columnWidth: '90%'
|
columnWidth: '80%'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
grid: {
|
grid: {
|
||||||
clipMarkers: false,
|
clipMarkers: false,
|
||||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||||
|
xaxis: {
|
||||||
|
lines: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
tooltip: {
|
tooltip: {
|
||||||
shared: true,
|
shared: true,
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="['far', 'bell']"/> {{ $t('title') }}</template>
|
<template #title><fa :icon="['far', 'bell']"/> {{ $t('title') }}</template>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch">
|
<ui-switch v-model="$store.state.i.autoWatch" @change="onChangeAutoWatch">
|
||||||
{{ $t('auto-watch') }}<template #desc>{{ $t('auto-watch-desc') }}</template>
|
{{ $t('auto-watch') }}<template #desc>{{ $t('auto-watch-desc') }}</template>
|
||||||
</ui-switch>
|
</ui-switch>
|
||||||
<section>
|
<section>
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
<ui-info v-else warn>{{ $t('email-not-verified') }}</ui-info>
|
<ui-info v-else warn>{{ $t('email-not-verified') }}</ui-info>
|
||||||
</template>
|
</template>
|
||||||
<ui-input v-model="email" type="email"><span>{{ $t('email-address') }}</span></ui-input>
|
<ui-input v-model="email" type="email"><span>{{ $t('email-address') }}</span></ui-input>
|
||||||
<ui-button @click="updateEmail()"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
<ui-button @click="updateEmail()" :disabled="email === $store.state.i.email"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@ -158,14 +158,14 @@ export default Vue.extend({
|
|||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
alwaysMarkNsfw: {
|
alwaysMarkNsfw: {
|
||||||
get() { return this.$store.state.i.settings.alwaysMarkNsfw; },
|
get() { return this.$store.state.i.alwaysMarkNsfw; },
|
||||||
set(value) { this.$root.api('i/update', { alwaysMarkNsfw: value }); }
|
set(value) { this.$root.api('i/update', { alwaysMarkNsfw: value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
bannerStyle(): any {
|
bannerStyle(): any {
|
||||||
if (this.$store.state.i.bannerUrl == null) return {};
|
if (this.$store.state.i.bannerUrl == null) return {};
|
||||||
return {
|
return {
|
||||||
backgroundColor: this.$store.state.i.bannerColor && this.$store.state.i.bannerColor.length == 3 ? `rgb(${ this.$store.state.i.bannerColor.join(',') })` : null,
|
backgroundColor: this.$store.state.i.bannerColor,
|
||||||
backgroundImage: `url(${ this.$store.state.i.bannerUrl })`
|
backgroundImage: `url(${ this.$store.state.i.bannerUrl })`
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -178,10 +178,10 @@ export default Vue.extend({
|
|||||||
this.email = this.$store.state.i.email;
|
this.email = this.$store.state.i.email;
|
||||||
this.name = this.$store.state.i.name;
|
this.name = this.$store.state.i.name;
|
||||||
this.username = this.$store.state.i.username;
|
this.username = this.$store.state.i.username;
|
||||||
this.location = this.$store.state.i.profile.location;
|
this.location = this.$store.state.i.location;
|
||||||
this.description = this.$store.state.i.description;
|
this.description = this.$store.state.i.description;
|
||||||
this.lang = this.$store.state.i.lang;
|
this.lang = this.$store.state.i.lang;
|
||||||
this.birthday = this.$store.state.i.profile.birthday;
|
this.birthday = this.$store.state.i.birthday;
|
||||||
this.avatarId = this.$store.state.i.avatarId;
|
this.avatarId = this.$store.state.i.avatarId;
|
||||||
this.bannerId = this.$store.state.i.bannerId;
|
this.bannerId = this.$store.state.i.bannerId;
|
||||||
this.isCat = this.$store.state.i.isCat;
|
this.isCat = this.$store.state.i.isCat;
|
||||||
@ -305,12 +305,17 @@ export default Vue.extend({
|
|||||||
this.exportTarget == 'user-lists' ? 'i/import-user-lists' :
|
this.exportTarget == 'user-lists' ? 'i/import-user-lists' :
|
||||||
null, {
|
null, {
|
||||||
fileId: file.id
|
fileId: file.id
|
||||||
});
|
}).then(() => {
|
||||||
|
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'info',
|
type: 'info',
|
||||||
text: this.$t('import-requested')
|
text: this.$t('import-requested')
|
||||||
});
|
});
|
||||||
|
}).catch((e: any) => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e.message
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="page == null || page == 'notification'">
|
<template v-if="page == null || page == 'notification'">
|
||||||
<x-notification v-show="page == 'notification'"/>
|
<x-notification/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="page == null || page == 'drive'">
|
<template v-if="page == null || page == 'drive'">
|
||||||
@ -525,15 +525,11 @@ export default Vue.extend({
|
|||||||
this.$chooseDriveFile({
|
this.$chooseDriveFile({
|
||||||
multiple: false
|
multiple: false
|
||||||
}).then(file => {
|
}).then(file => {
|
||||||
this.$root.api('i/update', {
|
this.$store.dispatch('settings/set', { key: 'wallpaper', value: file.url });
|
||||||
wallpaperId: file.id
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
deleteWallpaper() {
|
deleteWallpaper() {
|
||||||
this.$root.api('i/update', {
|
this.$store.dispatch('settings/set', { key: 'wallpaper', value: null });
|
||||||
wallpaperId: null
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
checkForUpdate() {
|
checkForUpdate() {
|
||||||
this.checkingForUpdate = true;
|
this.checkingForUpdate = true;
|
||||||
@ -542,8 +538,8 @@ export default Vue.extend({
|
|||||||
this.latestVersion = newer;
|
this.latestVersion = newer;
|
||||||
if (newer == null) {
|
if (newer == null) {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('no-updates'),
|
title: this.$t('@._settings.no-updates'),
|
||||||
text: this.$t('no-updates-desc')
|
text: this.$t('@._settings.no-updates-desc')
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
|
@ -130,20 +130,6 @@ import * as tinycolor from 'tinycolor2';
|
|||||||
import * as JSON5 from 'json5';
|
import * as JSON5 from 'json5';
|
||||||
import { faMoon, faSun } from '@fortawesome/free-regular-svg-icons';
|
import { faMoon, faSun } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
// 後方互換性のため
|
|
||||||
function convertOldThemedefinition(t) {
|
|
||||||
const t2 = {
|
|
||||||
id: t.meta.id,
|
|
||||||
name: t.meta.name,
|
|
||||||
author: t.meta.author,
|
|
||||||
base: t.meta.base,
|
|
||||||
vars: t.meta.vars,
|
|
||||||
props: t
|
|
||||||
};
|
|
||||||
delete t2.props.meta;
|
|
||||||
return t2;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('common/views/components/theme.vue'),
|
i18n: i18n('common/views/components/theme.vue'),
|
||||||
components: {
|
components: {
|
||||||
@ -231,20 +217,6 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeCreate() {
|
|
||||||
// migrate old theme definitions
|
|
||||||
// 後方互換性のため
|
|
||||||
this.$store.commit('device/set', {
|
|
||||||
key: 'themes', value: this.$store.state.device.themes.map(t => {
|
|
||||||
if (t.id == null) {
|
|
||||||
return convertOldThemedefinition(t);
|
|
||||||
} else {
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
install(code) {
|
install(code) {
|
||||||
let theme;
|
let theme;
|
||||||
@ -259,11 +231,6 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 後方互換性のため
|
|
||||||
if (theme.id == null && theme.meta != null) {
|
|
||||||
theme = convertOldThemedefinition(theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (theme.id == null) {
|
if (theme.id == null) {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
|
@ -79,7 +79,10 @@ export default Vue.extend({
|
|||||||
localStorage.setItem('i', res.i);
|
localStorage.setItem('i', res.i);
|
||||||
location.reload();
|
location.reload();
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert(this.$t('login-failed'));
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('login-failed')
|
||||||
|
});
|
||||||
this.signing = false;
|
this.signing = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
||||||
<span>{{ $t('invitation-code') }}</span>
|
<span>{{ $t('invitation-code') }}</span>
|
||||||
<template #prefix><fa icon="id-card-alt"/></template>
|
<template #prefix><fa icon="id-card-alt"/></template>
|
||||||
<template #desc v-html="this.$t('invitation-info').replace('{}', 'mailto:' + meta.maintainer.email)"></template>
|
<template #desc v-html="this.$t('invitation-info').replace('{}', 'mailto:' + meta.maintainerEmail)"></template>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
||||||
<span>{{ $t('username') }}</span>
|
<span>{{ $t('username') }}</span>
|
||||||
@ -153,7 +153,10 @@ export default Vue.extend({
|
|||||||
location.href = '/';
|
location.href = '/';
|
||||||
});
|
});
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert(this.$t('some-error'));
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: this.$t('some-error')
|
||||||
|
});
|
||||||
|
|
||||||
if (this.meta.enableRecaptcha) {
|
if (this.meta.enableRecaptcha) {
|
||||||
(window as any).grecaptcha.reset();
|
(window as any).grecaptcha.reset();
|
||||||
|
@ -366,9 +366,6 @@ root(fill)
|
|||||||
&[type='file']
|
&[type='file']
|
||||||
display none
|
display none
|
||||||
|
|
||||||
&[type='number']
|
|
||||||
text-align right
|
|
||||||
|
|
||||||
> .prefix
|
> .prefix
|
||||||
> .suffix
|
> .suffix
|
||||||
display block
|
display block
|
||||||
|
@ -3,12 +3,14 @@
|
|||||||
<ol v-if="uploads.length > 0">
|
<ol v-if="uploads.length > 0">
|
||||||
<li v-for="ctx in uploads" :key="ctx.id">
|
<li v-for="ctx in uploads" :key="ctx.id">
|
||||||
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
||||||
|
<div class="top">
|
||||||
<p class="name"><fa icon="spinner" pulse/>{{ ctx.name }}</p>
|
<p class="name"><fa icon="spinner" pulse/>{{ ctx.name }}</p>
|
||||||
<p class="status">
|
<p class="status">
|
||||||
<span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span>
|
<span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span>
|
||||||
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
|
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
|
||||||
<span class="percentage" v-if="ctx.progress != undefined">{{ Math.floor((ctx.progress.value / ctx.progress.max) * 100) }}</span>
|
<span class="percentage" v-if="ctx.progress != undefined">{{ Math.floor((ctx.progress.value / ctx.progress.max) * 100) }}</span>
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
<progress v-if="ctx.progress != undefined && ctx.progress.value != ctx.progress.max" :value="ctx.progress.value" :max="ctx.progress.max"></progress>
|
<progress v-if="ctx.progress != undefined && ctx.progress.value != ctx.progress.max" :value="ctx.progress.value" :max="ctx.progress.max"></progress>
|
||||||
<div class="progress initing" v-if="ctx.progress == undefined"></div>
|
<div class="progress initing" v-if="ctx.progress == undefined"></div>
|
||||||
<div class="progress waiting" v-if="ctx.progress != undefined && ctx.progress.value == ctx.progress.max"></div>
|
<div class="progress waiting" v-if="ctx.progress != undefined && ctx.progress.value == ctx.progress.max"></div>
|
||||||
@ -116,12 +118,17 @@ export default Vue.extend({
|
|||||||
list-style none
|
list-style none
|
||||||
|
|
||||||
> li
|
> li
|
||||||
display block
|
display grid
|
||||||
margin 8px 0 0 0
|
margin 8px 0 0 0
|
||||||
padding 0
|
padding 0
|
||||||
height 36px
|
height 36px
|
||||||
|
width: 100%
|
||||||
box-shadow 0 -1px 0 var(--primaryAlpha01)
|
box-shadow 0 -1px 0 var(--primaryAlpha01)
|
||||||
border-top solid 8px transparent
|
border-top solid 8px transparent
|
||||||
|
grid-template-columns 36px calc(100% - 44px)
|
||||||
|
grid-template-rows 1fr 8px
|
||||||
|
column-gap 8px
|
||||||
|
box-sizing content-box
|
||||||
|
|
||||||
&:first-child
|
&:first-child
|
||||||
margin 0
|
margin 0
|
||||||
@ -130,39 +137,36 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> .img
|
> .img
|
||||||
display block
|
display block
|
||||||
position absolute
|
|
||||||
top 0
|
|
||||||
left 0
|
|
||||||
width 36px
|
|
||||||
height 36px
|
|
||||||
background-size cover
|
background-size cover
|
||||||
background-position center center
|
background-position center center
|
||||||
|
grid-column 1 / 2
|
||||||
|
grid-row 1 / 3
|
||||||
|
|
||||||
|
> .top
|
||||||
|
display flex
|
||||||
|
grid-column 2 / 3
|
||||||
|
grid-row 1 / 2
|
||||||
|
|
||||||
> .name
|
> .name
|
||||||
display block
|
display block
|
||||||
position absolute
|
padding 0 8px 0 0
|
||||||
top 0
|
|
||||||
left 44px
|
|
||||||
margin 0
|
margin 0
|
||||||
padding 0
|
|
||||||
max-width 256px
|
|
||||||
font-size 0.8em
|
font-size 0.8em
|
||||||
color var(--primaryAlpha07)
|
color var(--primaryAlpha07)
|
||||||
white-space nowrap
|
white-space nowrap
|
||||||
text-overflow ellipsis
|
text-overflow ellipsis
|
||||||
overflow hidden
|
overflow hidden
|
||||||
|
flex-shrink 1
|
||||||
|
|
||||||
> [data-icon]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .status
|
> .status
|
||||||
display block
|
display block
|
||||||
position absolute
|
margin 0 0 0 auto
|
||||||
top 0
|
|
||||||
right 0
|
|
||||||
margin 0
|
|
||||||
padding 0
|
padding 0
|
||||||
font-size 0.8em
|
font-size 0.8em
|
||||||
|
flex-shrink 0
|
||||||
|
|
||||||
> .initing
|
> .initing
|
||||||
color var(--primaryAlpha05)
|
color var(--primaryAlpha05)
|
||||||
@ -182,16 +186,13 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> progress
|
> progress
|
||||||
display block
|
display block
|
||||||
position absolute
|
|
||||||
bottom 0
|
|
||||||
right 0
|
|
||||||
margin 0
|
|
||||||
width calc(100% - 44px)
|
|
||||||
height 8px
|
|
||||||
background transparent
|
background transparent
|
||||||
border none
|
border none
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
overflow hidden
|
overflow hidden
|
||||||
|
grid-column 2 / 3
|
||||||
|
grid-row 2 / 3
|
||||||
|
z-index 2
|
||||||
|
|
||||||
&::-webkit-progress-value
|
&::-webkit-progress-value
|
||||||
background var(--primary)
|
background var(--primary)
|
||||||
@ -201,12 +202,6 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> .progress
|
> .progress
|
||||||
display block
|
display block
|
||||||
position absolute
|
|
||||||
bottom 0
|
|
||||||
right 0
|
|
||||||
margin 0
|
|
||||||
width calc(100% - 44px)
|
|
||||||
height 8px
|
|
||||||
border none
|
border none
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
background linear-gradient(
|
background linear-gradient(
|
||||||
@ -221,6 +216,9 @@ export default Vue.extend({
|
|||||||
)
|
)
|
||||||
background-size 32px 32px
|
background-size 32px 32px
|
||||||
animation bg 1.5s linear infinite
|
animation bg 1.5s linear infinite
|
||||||
|
grid-column 2 / 3
|
||||||
|
grid-row 2 / 3
|
||||||
|
z-index 1
|
||||||
|
|
||||||
&.initing
|
&.initing
|
||||||
opacity 0.3
|
opacity 0.3
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="cudqjmnl">
|
<div class="cudqjmnl">
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<template #title><fa :icon="faList"/> {{ list.title }}</template>
|
<template #title><fa :icon="faList"/> {{ list.name }}</template>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="rename"><fa :icon="faICursor"/> {{ $t('rename') }}</ui-button>
|
<ui-button @click="rename"><fa :icon="faICursor"/> {{ $t('rename') }}</ui-button>
|
||||||
@ -75,7 +75,7 @@ export default Vue.extend({
|
|||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
title: this.$t('rename'),
|
title: this.$t('rename'),
|
||||||
input: {
|
input: {
|
||||||
default: this.list.title
|
default: this.list.name
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: title }) => {
|
}).then(({ canceled, result: title }) => {
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
@ -89,7 +89,7 @@ export default Vue.extend({
|
|||||||
del() {
|
del() {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
text: this.$t('delete-are-you-sure').replace('$1', this.list.title),
|
text: this.$t('delete-are-you-sure').replace('$1', this.list.name),
|
||||||
showCancelButton: true
|
showCancelButton: true
|
||||||
}).then(({ canceled }) => {
|
}).then(({ canceled }) => {
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user