Compare commits
374 Commits
Author | SHA1 | Date | |
---|---|---|---|
d153d3b761 | |||
60561578d8 | |||
b8bc96c181 | |||
005d6b4ccf | |||
f972fb6920 | |||
77078f2ce2 | |||
dae6d60163 | |||
264d6afe5d | |||
52c1d87fa2 | |||
dccafca58d | |||
52c12f96d5 | |||
114a9fbdb2 | |||
20e67e7edd | |||
889b52e813 | |||
6c975275f8 | |||
1286dee1ab | |||
fee953b0df | |||
26e7454f0e | |||
edbaa07867 | |||
f7ebf14501 | |||
d00928cf3f | |||
b3a198cae6 | |||
8b87d56a5a | |||
62ac3400da | |||
d54f71774e | |||
a47358f590 | |||
8f2cf066b6 | |||
e3e5a4272b | |||
2dcb3af70f | |||
3a19e9f80e | |||
c6fe798092 | |||
e74a47916d | |||
761071e1ce | |||
9e3610d513 | |||
393ac6c203 | |||
b7a79d25b0 | |||
486f045751 | |||
d6e3ec3218 | |||
078b043cae | |||
296cbc2e5a | |||
a74beaac36 | |||
79f8eb910f | |||
c91eef0030 | |||
7bf9d726d0 | |||
1946ff8ed4 | |||
b4d85d4f69 | |||
a03702d2bd | |||
71d7de4989 | |||
35d9e13dbb | |||
b427842679 | |||
4ae172be57 | |||
e6705b1a65 | |||
bc22cabdb5 | |||
7128b9f16a | |||
8c0490fef1 | |||
882a81636d | |||
24b9be76ba | |||
e763c6e661 | |||
899e2c73d7 | |||
10cb15b000 | |||
873d4bd707 | |||
97dea72c94 | |||
7d49f260b8 | |||
3055e6d8c7 | |||
2c93246860 | |||
360c820b9d | |||
87847c6ed5 | |||
4874f54d4d | |||
ff73efcc08 | |||
4ee64cbd9e | |||
0c40a86fca | |||
f92eed0549 | |||
69ed8cc409 | |||
4fff1279db | |||
d80699e454 | |||
deee1dbf53 | |||
067588845b | |||
b177b0cafc | |||
5679777010 | |||
a70c24cd1e | |||
357f3dd258 | |||
d815838762 | |||
4ceef78599 | |||
d5811633ea | |||
32265da72c | |||
ef94236e7f | |||
2924f0e434 | |||
1e419a9e1f | |||
097ece9dc9 | |||
6b6483c9fc | |||
22049b10ff | |||
de86644cb6 | |||
657aac5bc5 | |||
7ae3640d1a | |||
6fb42857c6 | |||
abf21349cd | |||
ed17af8339 | |||
67f391f6d4 | |||
c6b25f317e | |||
d91fa1a37a | |||
6c3f052996 | |||
33b0c87fb1 | |||
5c490e7521 | |||
54961235a4 | |||
17eca2a18f | |||
137f3ee609 | |||
498f6e9be2 | |||
a5e841f59c | |||
9adab1e85e | |||
4288a843cb | |||
1669f5b265 | |||
1157298eb8 | |||
948a65bf39 | |||
20c076b369 | |||
b67ed64116 | |||
1da3777bfb | |||
ea6aa40b09 | |||
b002651194 | |||
1452512daf | |||
0e7778bebf | |||
698fbdf88b | |||
7b738deabf | |||
3c65e7b76e | |||
3fc427b699 | |||
03667e1fe6 | |||
5cfd000a7d | |||
fa66eac096 | |||
70eb75b7e6 | |||
2f6187a26a | |||
167da988da | |||
6935e647a6 | |||
743eca4a95 | |||
78598a92f9 | |||
94598ab555 | |||
c5bdee086d | |||
c6cfc3f908 | |||
84b488a912 | |||
ec4d5857d8 | |||
4576641105 | |||
572e475b39 | |||
882a30fabe | |||
feec35bf4f | |||
c9fea5a7a0 | |||
00f3a1e1ec | |||
5a8cc7851b | |||
9d81d06853 | |||
4fce5d8066 | |||
329e367bda | |||
ce056bf936 | |||
c6ab5faba6 | |||
6ce0804b43 | |||
a7a6563281 | |||
0a084a3363 | |||
beeb8de6da | |||
e73297f260 | |||
b408ef5ba5 | |||
50539099ab | |||
9a3a77cff0 | |||
cdc07945af | |||
9f9194ab5c | |||
136a087ae7 | |||
b9e91afa26 | |||
f943e39c89 | |||
75bdbff36d | |||
43930e6a84 | |||
57d0c19a98 | |||
66a11378d2 | |||
62b680cadd | |||
1e1ac13999 | |||
d27c454674 | |||
3263eaec32 | |||
de4e9a857c | |||
d838876ab1 | |||
03336f01b5 | |||
d212d693a4 | |||
d17fcd8e48 | |||
49b3ee36bd | |||
100d7adc3d | |||
68b1fea6bb | |||
4de6e1e28a | |||
84f8c34e90 | |||
77567cf114 | |||
3cf8e1917c | |||
84cbabec29 | |||
b88c65ab67 | |||
10782822de | |||
5457172aa5 | |||
d20a2c7080 | |||
c01098de16 | |||
0b14a57d55 | |||
405d104208 | |||
83e3316f06 | |||
2037d4c21d | |||
6cabf052b1 | |||
359e1b2e6e | |||
7b553b13ac | |||
79872ec3e8 | |||
e9df7265fa | |||
1ade89be35 | |||
3356f7113f | |||
e6495ea6e2 | |||
629991443a | |||
6848f05ea5 | |||
e58dd71829 | |||
1afa2f1202 | |||
f322cb444a | |||
69c3c4e3dc | |||
488e6feed9 | |||
40891aca48 | |||
cd0e557991 | |||
679f8ad614 | |||
00c647c736 | |||
1ac6af6ad1 | |||
a5d7099a3c | |||
e9c8a0f5d5 | |||
adcda0889e | |||
95cbcdd379 | |||
a5e8eb4b7b | |||
ed440f80f3 | |||
4e2ef94107 | |||
de690e0622 | |||
062e1a4940 | |||
cc3779b197 | |||
92dc34b51a | |||
f8ee615640 | |||
5dde8b4bdc | |||
2c70055a87 | |||
db8ab8b890 | |||
28da5c5a31 | |||
b345aad52c | |||
aa5af89dfc | |||
9a3a74db34 | |||
328619f1fc | |||
121e12785f | |||
cc3f0737a2 | |||
bc3714139f | |||
9200379997 | |||
0ee664db2b | |||
86487e6f66 | |||
adc2bcc59b | |||
21a54f559a | |||
145e16c266 | |||
68f4edd0ee | |||
7fd6a134d1 | |||
0db8d566e2 | |||
c6f6291fc0 | |||
c2d79450ea | |||
d58ae601f7 | |||
3ad73ad7d9 | |||
f0c4df1cc5 | |||
839784bc8c | |||
b758ec96ef | |||
2f8ceb9d22 | |||
e05ae5ebc2 | |||
ebc43be4b3 | |||
8543278ce3 | |||
9a98de7bd8 | |||
e1d69fb4ad | |||
946f9b4a2b | |||
9a270e59a4 | |||
2112fb3896 | |||
d1bd9fa552 | |||
393bd76959 | |||
97165fbaf5 | |||
feca9940bc | |||
fbbc7d005d | |||
af5b4749b0 | |||
b4e5fe7e71 | |||
1671aef0bd | |||
ffe5a12773 | |||
9ca01b65de | |||
f50ed905a8 | |||
d7156b8cdd | |||
14442ffa18 | |||
d454596c33 | |||
7d510cf780 | |||
8121cbf10c | |||
d34d20c393 | |||
e773c272be | |||
0c072249d8 | |||
d0b7b662b4 | |||
4b5aa286a0 | |||
2310c74d0b | |||
af251bf0c4 | |||
16204ac13b | |||
7c8645fe29 | |||
bd82173caa | |||
2e8a0b0fac | |||
38b7f4364c | |||
3a33e406c7 | |||
8d0c5268d1 | |||
08bec5abd9 | |||
cc4b6e5eea | |||
e6cb07bef4 | |||
249bfcc5f0 | |||
108c4b4342 | |||
38befa51ac | |||
6a76118710 | |||
f049694fa1 | |||
515a6b74a2 | |||
d1291b3b4c | |||
d2abc28a2b | |||
12142f8c5e | |||
41d7a8de66 | |||
c7a65c13aa | |||
fbf0baadba | |||
ea31e62795 | |||
910b145f42 | |||
952a793f80 | |||
46f2ffaa5c | |||
45ba7989c1 | |||
c4cf3331e9 | |||
6d75ca0bcb | |||
050fb55326 | |||
9d1d9c3540 | |||
fdde966808 | |||
c6ce7b1045 | |||
ce743054d6 | |||
99970b6864 | |||
42110bcd33 | |||
9677b0bfb1 | |||
a7762972fa | |||
dda3b4152e | |||
b7aa6d6c1f | |||
909a3b805f | |||
848d2e00e7 | |||
642662941f | |||
0028a529a8 | |||
62131e864b | |||
0c58b43831 | |||
5a3d6c4fba | |||
a031fa3875 | |||
721ed97a83 | |||
944927ac2d | |||
7705749d28 | |||
cf7f42ebc4 | |||
f195968b6d | |||
4d6bffdc8a | |||
f62c6a05a9 | |||
fa550a2a78 | |||
960c27375c | |||
e87b3e2933 | |||
133766bf8c | |||
aa6b25e9e7 | |||
abde13221f | |||
cb17be5e2b | |||
17d62b689d | |||
9bf5dc67f5 | |||
4eab9b4354 | |||
d39c153c57 | |||
e5992742d4 | |||
72ed803c2a | |||
9ec0e59431 | |||
5328ed64f3 | |||
33e8d61d65 | |||
3584786387 | |||
34f662ead5 | |||
2d53481cf5 | |||
10fb029609 | |||
0281961f15 | |||
fede4eeb89 | |||
ab50d5ef20 | |||
f4e02d4a4c | |||
167640df8d | |||
fe01437aa4 | |||
037fce4d6a | |||
db8b824b84 | |||
b71f62535d | |||
e9a1e281b9 | |||
0144408500 | |||
7660839e40 | |||
d1ca851ebe | |||
35a281d443 | |||
c2690fff47 |
@ -32,7 +32,7 @@ jobs:
|
|||||||
apk update && apk add jq
|
apk update && apk add jq
|
||||||
docker tag misskey/misskey misskey/misskey:$(cat package.json | jq -r .version)
|
docker tag misskey/misskey misskey/misskey:$(cat package.json | jq -r .version)
|
||||||
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
||||||
docker push misskey/misskey
|
docker push -a misskey/misskey
|
||||||
else
|
else
|
||||||
echo -e '\033[0;33mAborted deploying to Docker Hub\033[0;39m'
|
echo -e '\033[0;33mAborted deploying to Docker Hub\033[0;39m'
|
||||||
fi
|
fi
|
||||||
|
@ -1 +1 @@
|
|||||||
v14.15.0
|
v14.15.1
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM node:14.15.0-alpine AS base
|
FROM node:14.15.1-alpine AS base
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
[](http://makeapullrequest.com)
|
[](http://makeapullrequest.com)
|
||||||
[](https://github.com/humanetech-community/awesome-humane-tech)
|
[](https://github.com/humanetech-community/awesome-humane-tech)
|
||||||
|
|
||||||
**A forever evolving, professional microblogging platform.**
|
**A forever evolving, interplanetary microblogging platform.**
|
||||||
|
|
||||||
<p align="justify">
|
<p align="justify">
|
||||||
<a href="https://join.misskey.page/">Misskey</a> is a decentralized microblogging platform born on Earth.
|
<a href="https://join.misskey.page/">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||||
@ -62,6 +62,8 @@ Organize and store your files! Want to post a picture you have already uploaded?
|
|||||||
|
|
||||||
...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.
|
...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.
|
||||||
|
|
||||||
|
To recive updates of this repo, follow [@repo@misskey.io](https://misskey.io/@repo) on fediverse.
|
||||||
|
|
||||||
Screen shots
|
Screen shots
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
### Profile page
|
### Profile page
|
||||||
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 9.1 KiB |
@ -1,27 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg width="100%" height="100%" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
|
||||||
<g transform="matrix(0.413372,0,0,0.469741,64.564,40.5821)">
|
|
||||||
<rect x="-156.189" y="-86.393" width="619.297" height="544.981" style="fill:rgb(27,30,31);"/>
|
|
||||||
</g>
|
|
||||||
<g transform="matrix(0.898356,0,0,0.898356,-130.722,-120.968)">
|
|
||||||
<g transform="matrix(0.5,0.866025,-0.866025,0.5,288,-166.277)">
|
|
||||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
|
||||||
</g>
|
|
||||||
<g transform="matrix(1,0,0,1,-96,166.277)">
|
|
||||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
|
||||||
</g>
|
|
||||||
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-96,498.831)">
|
|
||||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
|
||||||
</g>
|
|
||||||
<g transform="matrix(1,0,0,1,-95.9902,55.4086)">
|
|
||||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
|
||||||
</g>
|
|
||||||
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-2.64322e-11,554.256)">
|
|
||||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
|
||||||
</g>
|
|
||||||
<g transform="matrix(0.5,0.866025,-0.866025,0.5,192,-110.851)">
|
|
||||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
BIN
assets/mi-white.afdesign
Normal file
BIN
assets/mi.afdesign
Normal file
@ -1,3 +1,7 @@
|
|||||||
files:
|
files:
|
||||||
- source: /locales/ja-JP.yml
|
- source: /locales/ja-JP.yml
|
||||||
translation: /locales/%locale%.yml
|
translation: /locales/%locale%.yml
|
||||||
|
update_option: update_as_unapproved
|
||||||
|
- source: /src/docs/ja-JP/*.md
|
||||||
|
translation: /src/docs/%locale%/%original_file_name%
|
||||||
|
update_option: update_as_unapproved
|
||||||
|
27
gulpfile.ts
@ -7,6 +7,9 @@ import * as gulp from 'gulp';
|
|||||||
import * as ts from 'gulp-typescript';
|
import * as ts from 'gulp-typescript';
|
||||||
import * as rimraf from 'rimraf';
|
import * as rimraf from 'rimraf';
|
||||||
import * as rename from 'gulp-rename';
|
import * as rename from 'gulp-rename';
|
||||||
|
import * as replace from 'gulp-replace';
|
||||||
|
const terser = require('gulp-terser');
|
||||||
|
const cssnano = require('gulp-cssnano');
|
||||||
|
|
||||||
const locales: { [x: string]: any } = require('./locales');
|
const locales: { [x: string]: any } = require('./locales');
|
||||||
const meta = require('./package.json');
|
const meta = require('./package.json');
|
||||||
@ -25,6 +28,10 @@ gulp.task('build:copy:views', () =>
|
|||||||
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task('build:copy:fonts', () =>
|
||||||
|
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
|
||||||
|
);
|
||||||
|
|
||||||
gulp.task('build:copy:locales', cb => {
|
gulp.task('build:copy:locales', cb => {
|
||||||
fs.mkdirSync('./built/client/assets/locales', { recursive: true });
|
fs.mkdirSync('./built/client/assets/locales', { recursive: true });
|
||||||
|
|
||||||
@ -37,11 +44,23 @@ gulp.task('build:copy:locales', cb => {
|
|||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('build:copy:fonts', () =>
|
gulp.task('build:client:script', () => {
|
||||||
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
|
return gulp.src(['./src/server/web/boot.js'])
|
||||||
);
|
.pipe(replace('VERSION', JSON.stringify(meta.version)))
|
||||||
|
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
||||||
|
.pipe(terser({
|
||||||
|
toplevel: true
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('./built/server/web/'));
|
||||||
|
});
|
||||||
|
|
||||||
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:locales', 'build:copy:fonts', () =>
|
gulp.task('build:client:style', () => {
|
||||||
|
return gulp.src(['./src/server/web/style.css'])
|
||||||
|
.pipe(cssnano())
|
||||||
|
.pipe(gulp.dest('./built/server/web/'));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('build:copy', gulp.parallel('build:copy:locales', 'build:copy:views', 'build:client:script', 'build:client:style', 'build:copy:fonts', () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./src/emojilist.json',
|
'./src/emojilist.json',
|
||||||
'./src/server/web/views/**/*',
|
'./src/server/web/views/**/*',
|
||||||
|
@ -45,6 +45,7 @@ copyUsername: "انسخ اسم المستخدم"
|
|||||||
searchUser: "ابحث عن مستخدمين"
|
searchUser: "ابحث عن مستخدمين"
|
||||||
reply: "رد"
|
reply: "رد"
|
||||||
loadMore: "عرض المزيد"
|
loadMore: "عرض المزيد"
|
||||||
|
showMore: "عرض المزيد"
|
||||||
youGotNewFollower: "يتابعك"
|
youGotNewFollower: "يتابعك"
|
||||||
receiveFollowRequest: "تلقيت طلب متابعة"
|
receiveFollowRequest: "تلقيت طلب متابعة"
|
||||||
followRequestAccepted: "قُبل طلب المتابعة"
|
followRequestAccepted: "قُبل طلب المتابعة"
|
||||||
@ -175,16 +176,23 @@ remove: "حذف"
|
|||||||
removed: "تم حذفه بنجاح"
|
removed: "تم حذفه بنجاح"
|
||||||
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
|
resetAreYouSure: "هل تريد إعادة التعيين؟"
|
||||||
saved: "تم حفظه"
|
saved: "تم حفظه"
|
||||||
messaging: "الدردشة"
|
messaging: "الدردشة"
|
||||||
upload: "تحميل"
|
upload: "تحميل"
|
||||||
fromDrive: "من المخزن"
|
fromDrive: "من المخزن"
|
||||||
fromUrl: "من عنوان URL"
|
fromUrl: "من عنوان URL"
|
||||||
uploadFromUrl: "التحميل عبر URL"
|
uploadFromUrl: "التحميل عبر URL"
|
||||||
|
uploadFromUrlDescription: "رابط الملف المراد تحميله "
|
||||||
|
uploadFromUrlRequested: "الرفع مطلوب"
|
||||||
|
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
|
||||||
explore: "استكشاف"
|
explore: "استكشاف"
|
||||||
games: "ألعاب Misskey"
|
games: "ألعاب Misskey"
|
||||||
messageRead: "مقروءة"
|
messageRead: "مقروءة"
|
||||||
|
noMoreHistory: "لا يوجد المزيد من التاريخ"
|
||||||
startMessaging: "ابدأ الدردشة"
|
startMessaging: "ابدأ الدردشة"
|
||||||
|
nUsersRead: "تمت القراءة من {n}"
|
||||||
|
agreeTo: "اوافق على {0}"
|
||||||
tos: "شروط الخدمة"
|
tos: "شروط الخدمة"
|
||||||
start: "البداية"
|
start: "البداية"
|
||||||
home: "الرئيسي"
|
home: "الرئيسي"
|
||||||
@ -201,6 +209,7 @@ light: "فاتح"
|
|||||||
dark: "داكن"
|
dark: "داكن"
|
||||||
lightThemes: "الحلة الفاتحة"
|
lightThemes: "الحلة الفاتحة"
|
||||||
darkThemes: "الحلة الداكنة"
|
darkThemes: "الحلة الداكنة"
|
||||||
|
syncDeviceDarkMode: "مطابقة الوضع المضلمومع اعدادات الجهاز"
|
||||||
drive: "قرص التخرين"
|
drive: "قرص التخرين"
|
||||||
fileName: "اسم الملف"
|
fileName: "اسم الملف"
|
||||||
selectFile: "اختر ملفًا"
|
selectFile: "اختر ملفًا"
|
||||||
@ -218,14 +227,17 @@ emptyFolder: "هذا المجلد فارغ"
|
|||||||
unableToDelete: "لا يمكن حذفه"
|
unableToDelete: "لا يمكن حذفه"
|
||||||
inputNewFileName: "ادخل الإسم الجديد للملف"
|
inputNewFileName: "ادخل الإسم الجديد للملف"
|
||||||
inputNewFolderName: "ادخل الإسم الجديد للمجلد"
|
inputNewFolderName: "ادخل الإسم الجديد للمجلد"
|
||||||
|
hasChildFilesOrFolders: "الان الملف غير فارغ. لا يمكن حذفه"
|
||||||
copyUrl: "انسخ عنوان URL"
|
copyUrl: "انسخ عنوان URL"
|
||||||
rename: "إعادة التسمية"
|
rename: "إعادة التسمية"
|
||||||
avatar: "الصورة الرمزية"
|
avatar: "الصورة الرمزية"
|
||||||
banner: "الصورة الرأسية"
|
banner: "الصورة الرأسية"
|
||||||
nsfw: "محتوى حساس"
|
nsfw: "محتوى حساس"
|
||||||
|
whenServerDisconnected: "عند فقدان الاتصال بالخادم"
|
||||||
disconnectedFromServer: "قُطِع الإتصال بالخادم"
|
disconnectedFromServer: "قُطِع الإتصال بالخادم"
|
||||||
reload: "انعش"
|
reload: "انعش"
|
||||||
doNothing: "تجاهل"
|
doNothing: "تجاهل"
|
||||||
|
reloadConfirm: "هل ترغب في تحديث الجدول الزمني؟"
|
||||||
watch: "راقب"
|
watch: "راقب"
|
||||||
unwatch: "إلغاء المراقبة"
|
unwatch: "إلغاء المراقبة"
|
||||||
accept: "السماح"
|
accept: "السماح"
|
||||||
@ -243,14 +255,17 @@ dayX: "{day}"
|
|||||||
monthX: "{month}"
|
monthX: "{month}"
|
||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "الصفحات"
|
pages: "الصفحات"
|
||||||
|
integration: "دمج"
|
||||||
connectSerice: "أوصل"
|
connectSerice: "أوصل"
|
||||||
disconnectSerice: "قطع الاتصال"
|
disconnectSerice: "قطع الاتصال"
|
||||||
enableLocalTimeline: "تفعيل الخيط المحلي"
|
enableLocalTimeline: "تفعيل الخيط المحلي"
|
||||||
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
||||||
|
disablingTimelinesInfo: "سيتمكن المسؤولون ومن تعديل دائمًا و من الوصول إلى جميع المخططات الزمنية ، حتى إذا لم يتم تمكينها."
|
||||||
registration: "إنشاء حساب"
|
registration: "إنشاء حساب"
|
||||||
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
||||||
invite: "دعوة"
|
invite: "دعوة"
|
||||||
basicInfo: "المعلومات الأساسية "
|
basicInfo: "المعلومات الأساسية "
|
||||||
|
pinnedNotes: "ملاحظة مدبسة"
|
||||||
hcaptchaSiteKey: "مفتاح الموقع"
|
hcaptchaSiteKey: "مفتاح الموقع"
|
||||||
hcaptchaSecretKey: "المفتاح السري"
|
hcaptchaSecretKey: "المفتاح السري"
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
@ -273,7 +288,6 @@ popularTags: "الوسوم الرائجة"
|
|||||||
userList: "القوائم"
|
userList: "القوائم"
|
||||||
about: "عن"
|
about: "عن"
|
||||||
aboutMisskey: "عن Misskey"
|
aboutMisskey: "عن Misskey"
|
||||||
patrons: "الداعمون"
|
|
||||||
administrator: "المدير"
|
administrator: "المدير"
|
||||||
token: "الرمز المميز"
|
token: "الرمز المميز"
|
||||||
twoStepAuthentication: "الإستيثاق بعاملَيْن"
|
twoStepAuthentication: "الإستيثاق بعاملَيْن"
|
||||||
@ -288,6 +302,8 @@ resetPassword: "أعد تعيين كلمتك السرية"
|
|||||||
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
||||||
share: "شارِك"
|
share: "شارِك"
|
||||||
notFound: "غير موجود"
|
notFound: "غير موجود"
|
||||||
|
cacheClear: "مسح ذاكرة التخزين المؤقت"
|
||||||
|
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
|
||||||
help: "المساعدة"
|
help: "المساعدة"
|
||||||
inputMessageHere: "اكتب رسالتك هنا"
|
inputMessageHere: "اكتب رسالتك هنا"
|
||||||
close: "اغلق"
|
close: "اغلق"
|
||||||
@ -328,6 +344,7 @@ aboutX: "عن {x}"
|
|||||||
useOsNativeEmojis: "استخدم الإيموجيات الخاصة بنظام التشغيل"
|
useOsNativeEmojis: "استخدم الإيموجيات الخاصة بنظام التشغيل"
|
||||||
youHaveNoGroups: "لا تمتلك أية فِرَق"
|
youHaveNoGroups: "لا تمتلك أية فِرَق"
|
||||||
noHistory: "السجل فارغ"
|
noHistory: "السجل فارغ"
|
||||||
|
signinHistory: "تاريخ تسجيل الدخول"
|
||||||
doing: "انتظر لحظة"
|
doing: "انتظر لحظة"
|
||||||
category: "الفئات"
|
category: "الفئات"
|
||||||
tags: "الوسوم"
|
tags: "الوسوم"
|
||||||
@ -336,6 +353,7 @@ createAccount: "أنشئ حسابًا"
|
|||||||
existingAcount: "الحسابات الموجودة"
|
existingAcount: "الحسابات الموجودة"
|
||||||
regenerate: "أعِد التوليد"
|
regenerate: "أعِد التوليد"
|
||||||
fontSize: "حجم الخط"
|
fontSize: "حجم الخط"
|
||||||
|
openImageInNewTab: "إفتح الصورة بصفحة جديدة"
|
||||||
dashboard: "لوحة التحكم"
|
dashboard: "لوحة التحكم"
|
||||||
local: "المحلي"
|
local: "المحلي"
|
||||||
remote: "بُعدي"
|
remote: "بُعدي"
|
||||||
@ -364,6 +382,9 @@ state: "الحالة"
|
|||||||
sort: "ترتيب حسب"
|
sort: "ترتيب حسب"
|
||||||
output: "الخارجة"
|
output: "الخارجة"
|
||||||
updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد"
|
updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد"
|
||||||
|
deleteAllFiles: "حذف كافة الملفات"
|
||||||
|
userSuspended: "تم تعليق هذا المستخدم."
|
||||||
|
userSilenced: "تم إسكات هذا المستخدم."
|
||||||
sidebar: "الشريط الجانبي"
|
sidebar: "الشريط الجانبي"
|
||||||
addItem: "إضافة عنصر"
|
addItem: "إضافة عنصر"
|
||||||
rooms: "الغرفة"
|
rooms: "الغرفة"
|
||||||
@ -373,13 +394,32 @@ addedRelays: "المرحلات التي تم إضافتها"
|
|||||||
deletedNote: "ملاحظة محذوفة"
|
deletedNote: "ملاحظة محذوفة"
|
||||||
invisibleNote: "ملاحظة مخفية"
|
invisibleNote: "ملاحظة مخفية"
|
||||||
poll: "استطلاع رأي"
|
poll: "استطلاع رأي"
|
||||||
|
useCw: "إخفاء المحتوى"
|
||||||
themeEditor: "مصمم القوالب"
|
themeEditor: "مصمم القوالب"
|
||||||
|
manage: "إدارة "
|
||||||
plugins: "الإضافات"
|
plugins: "الإضافات"
|
||||||
pluginInstallWarn: "يرجى تنصيب إضافات ذات مصدر موثوق منه فقط."
|
pluginInstallWarn: "يرجى تنصيب إضافات ذات مصدر موثوق منه فقط."
|
||||||
|
width: "العرض"
|
||||||
|
height: "الإرتفاع"
|
||||||
|
large: "كبير"
|
||||||
|
medium: "متوسط"
|
||||||
|
small: "صغير"
|
||||||
|
permission: "أذونات"
|
||||||
|
enableAll: "تشغيل الكل"
|
||||||
|
disableAll: "تعطيل الكل"
|
||||||
|
tokenRequested: "منح حق الوصول إلى الحساب"
|
||||||
|
notificationType: "أنواع الإشعارات"
|
||||||
|
edit: "التعديل"
|
||||||
|
email: "البريد الإلكتروني "
|
||||||
|
emailAddress: "عنوان البريد الالكتروني"
|
||||||
smtpHost: "المضيف"
|
smtpHost: "المضيف"
|
||||||
|
smtpPort: "المنفذ"
|
||||||
smtpUser: "اسم المستخدم"
|
smtpUser: "اسم المستخدم"
|
||||||
smtpPass: "الكلمة السرية"
|
smtpPass: "الكلمة السرية"
|
||||||
|
makeActive: "تفعيل"
|
||||||
display: "المظهر"
|
display: "المظهر"
|
||||||
|
copy: "نسخ"
|
||||||
|
metrics: "المقاييس"
|
||||||
public: "للعامة"
|
public: "للعامة"
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "أشر الى"
|
mention: "أشر الى"
|
||||||
@ -453,6 +493,7 @@ _widgets:
|
|||||||
activity: "النشاط"
|
activity: "النشاط"
|
||||||
photos: "الصور"
|
photos: "الصور"
|
||||||
federation: "الفديرالية"
|
federation: "الفديرالية"
|
||||||
|
jobQueue: "قائمة الانتظار"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "إخفاء"
|
hide: "إخفاء"
|
||||||
show: "عرض المزيد"
|
show: "عرض المزيد"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Deutsch"
|
_lang_: "Deutsch"
|
||||||
|
headlineMisskey: "Durch Notizen verbundenes Netzwerk"
|
||||||
introMisskey: "Willkommen! Misskey ist eine dezentralisierte Open-Source Microblogging-Platform.\nVerfasse \"Notizen\" um mitzuteilen, was gerade passiert oder um Ereignisse mit Anderen zu teilen. 📡\nMit \"Reaktionen\" kannst du außerdem schnell deine Gefühle über Notizen anderer Benutzer zum Ausdruck bringen. 👍\nLass uns eine neue Welt erforschen! 🚀"
|
introMisskey: "Willkommen! Misskey ist eine dezentralisierte Open-Source Microblogging-Platform.\nVerfasse \"Notizen\" um mitzuteilen, was gerade passiert oder um Ereignisse mit Anderen zu teilen. 📡\nMit \"Reaktionen\" kannst du außerdem schnell deine Gefühle über Notizen anderer Benutzer zum Ausdruck bringen. 👍\nLass uns eine neue Welt erforschen! 🚀"
|
||||||
monthAndDay: "{day}/{month}"
|
monthAndDay: "{day}/{month}"
|
||||||
search: "Suchen"
|
search: "Suchen"
|
||||||
@ -33,6 +34,9 @@ addUser: "Benutzer hinzufügen"
|
|||||||
favorite: "Zu Favoriten hinzufügen"
|
favorite: "Zu Favoriten hinzufügen"
|
||||||
favorites: "Favoriten"
|
favorites: "Favoriten"
|
||||||
unfavorite: "Aus Favoriten entfernen"
|
unfavorite: "Aus Favoriten entfernen"
|
||||||
|
favorited: "Zu Favoriten hinzugefügt."
|
||||||
|
alreadyFavorited: "Bereits zu den Favoriten hinzugefügt."
|
||||||
|
cantFavorite: "Hinzufügen zu Favoriten fehlgeschlagen."
|
||||||
pin: "Anheften"
|
pin: "Anheften"
|
||||||
unpin: "Lösen"
|
unpin: "Lösen"
|
||||||
copyContent: "Inhalt kopieren"
|
copyContent: "Inhalt kopieren"
|
||||||
@ -46,6 +50,7 @@ copyUsername: "Benutzernamen kopieren"
|
|||||||
searchUser: "Benutzersuche"
|
searchUser: "Benutzersuche"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
loadMore: "Mehr anzeigen"
|
loadMore: "Mehr anzeigen"
|
||||||
|
showMore: "Mehr anzeigen"
|
||||||
youGotNewFollower: "Du hast einen neuen Follower"
|
youGotNewFollower: "Du hast einen neuen Follower"
|
||||||
receiveFollowRequest: "Follow-Anfrage erhalten"
|
receiveFollowRequest: "Follow-Anfrage erhalten"
|
||||||
followRequestAccepted: "Follow-Anfrage akzeptiert"
|
followRequestAccepted: "Follow-Anfrage akzeptiert"
|
||||||
@ -87,6 +92,9 @@ followRequestPending: "Ausstehende Follow-Anfrage"
|
|||||||
enterEmoji: "Gib ein Emoji ein"
|
enterEmoji: "Gib ein Emoji ein"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Renote zurücknehmen"
|
unrenote: "Renote zurücknehmen"
|
||||||
|
renoted: "Renote getätigt."
|
||||||
|
cantRenote: "Renote dieses Beitrags nicht möglich."
|
||||||
|
cantReRenote: "Renote einer Renote nicht möglich."
|
||||||
quote: "Zitieren"
|
quote: "Zitieren"
|
||||||
pinnedNote: "Angepinnte Notiz"
|
pinnedNote: "Angepinnte Notiz"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
@ -95,7 +103,7 @@ sensitive: "NSFW"
|
|||||||
add: "Hinzufügen"
|
add: "Hinzufügen"
|
||||||
reaction: "Reaktionen"
|
reaction: "Reaktionen"
|
||||||
reactionSettingDescription: "Gib deine Lieblingsreaktionen ein, um sie der Reaktionsauswahl hinzuzufügen."
|
reactionSettingDescription: "Gib deine Lieblingsreaktionen ein, um sie der Reaktionsauswahl hinzuzufügen."
|
||||||
reactionSettingDescription2: "Ziehen zum Reorganisieren, Klicken zum Löschen."
|
reactionSettingDescription2: "Ziehe zum Anordnen, Klicke zum Löschen, Drücke \"+\" zum Hinzufügen"
|
||||||
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
||||||
attachCancel: "Anhang entfernen"
|
attachCancel: "Anhang entfernen"
|
||||||
markAsSensitive: "Als NSFW markieren"
|
markAsSensitive: "Als NSFW markieren"
|
||||||
@ -125,7 +133,9 @@ settingGuide: "Empfohlene Einstellung"
|
|||||||
cacheRemoteFiles: "Dateien von anderen Instanzen im Cache speichern"
|
cacheRemoteFiles: "Dateien von anderen Instanzen im Cache speichern"
|
||||||
cacheRemoteFilesDescription: "Wenn diese Einstellung deaktiviert ist, werden Dateien anderer Instanzen direkt von dort geladen. Hierdurch wird Speicherplatz gespart, aber mehr Bandbreite verbraucht, da keine Vorschaubilder generiert werden."
|
cacheRemoteFilesDescription: "Wenn diese Einstellung deaktiviert ist, werden Dateien anderer Instanzen direkt von dort geladen. Hierdurch wird Speicherplatz gespart, aber mehr Bandbreite verbraucht, da keine Vorschaubilder generiert werden."
|
||||||
flagAsBot: "Als Bot markieren"
|
flagAsBot: "Als Bot markieren"
|
||||||
|
flagAsBotDescription: "Wenn dieser Account durch ein Programm gesteuert wird, setze diesen Haken. Falls aktiviert, agiert es als Flag für andere Entwickler um endlose Kettenreaktionen mit anderen Bots zu verhindern und lässt Misskey's interne Systeme diesen Account als Bot behandeln."
|
||||||
flagAsCat: "Als Katze markieren"
|
flagAsCat: "Als Katze markieren"
|
||||||
|
flagAsCatDescription: "Setze diese Flag um dieses Benutzerkonto als Katze zu markieren."
|
||||||
autoAcceptFollowed: "Follow-Anfragen automatisch akzeptieren"
|
autoAcceptFollowed: "Follow-Anfragen automatisch akzeptieren"
|
||||||
addAcount: "Benutzerkonto hinzufügen"
|
addAcount: "Benutzerkonto hinzufügen"
|
||||||
loginFailed: "Login fehlgeschlagen"
|
loginFailed: "Login fehlgeschlagen"
|
||||||
@ -174,7 +184,7 @@ clearCachedFiles: "Cache leeren"
|
|||||||
clearCachedFilesConfirm: "Sollen alle im Cache gespeicherten Dateien von anderen Instanzen wirklich gelöscht werden?"
|
clearCachedFilesConfirm: "Sollen alle im Cache gespeicherten Dateien von anderen Instanzen wirklich gelöscht werden?"
|
||||||
blockedInstances: "Blockierte Instanzen"
|
blockedInstances: "Blockierte Instanzen"
|
||||||
blockedInstancesDescription: "Gib den Hostnamen der Instanz an, die blockiert werden soll. Blockierte Instanzen können nicht mehr mit dieser kommunizieren."
|
blockedInstancesDescription: "Gib den Hostnamen der Instanz an, die blockiert werden soll. Blockierte Instanzen können nicht mehr mit dieser kommunizieren."
|
||||||
muteAndBlock: "Stummgeschaltet / Blockiert"
|
muteAndBlock: "Stummschaltungen / Blockierungen"
|
||||||
mutedUsers: "Stummgeschaltete Benutzer"
|
mutedUsers: "Stummgeschaltete Benutzer"
|
||||||
blockedUsers: "Blockierte Benutzer"
|
blockedUsers: "Blockierte Benutzer"
|
||||||
noUsers: "Keine Benutzer"
|
noUsers: "Keine Benutzer"
|
||||||
@ -308,7 +318,7 @@ enableRegistration: "Registration neuer Benutzer erlauben"
|
|||||||
invite: "Einladen"
|
invite: "Einladen"
|
||||||
proxyRemoteFiles: "Dateien anderer Instanzen durch Proxy leiten"
|
proxyRemoteFiles: "Dateien anderer Instanzen durch Proxy leiten"
|
||||||
proxyRemoteFilesDescription: "Wenn diese Einstellung aktiviert ist, dann werden Dateien von anderen Instanzen, welche entweder nicht lokal gespeichert sind oder durch Überschreiten des Speicherlimits gelöscht wurden, durch einen Proxy geleitet. Hierbei wird auch ein Vorschaubild generiert. \n Dies hat keinen Effekt auf den Speicherplatz des Servers."
|
proxyRemoteFilesDescription: "Wenn diese Einstellung aktiviert ist, dann werden Dateien von anderen Instanzen, welche entweder nicht lokal gespeichert sind oder durch Überschreiten des Speicherlimits gelöscht wurden, durch einen Proxy geleitet. Hierbei wird auch ein Vorschaubild generiert. \n Dies hat keinen Effekt auf den Speicherplatz des Servers."
|
||||||
driveCapacityPerLocalAccount: "Drivekapazität pro lokales Benutzerkonto"
|
driveCapacityPerLocalAccount: "Drive-Kapazität pro lokales Benutzerkonto"
|
||||||
driveCapacityPerRemoteAccount: "Drive-Kapazität pro Benutzer anderer Instanzen"
|
driveCapacityPerRemoteAccount: "Drive-Kapazität pro Benutzer anderer Instanzen"
|
||||||
inMb: "In Megabytes"
|
inMb: "In Megabytes"
|
||||||
iconUrl: "Icon-URL"
|
iconUrl: "Icon-URL"
|
||||||
@ -318,6 +328,8 @@ pinnedUsers: "Angepinnte Benutzer"
|
|||||||
pinnedUsersDescription: "Gib einen Benutzernamen pro Zeile ein. Diese werden im \"Erkunden\" Tab angezeigt."
|
pinnedUsersDescription: "Gib einen Benutzernamen pro Zeile ein. Diese werden im \"Erkunden\" Tab angezeigt."
|
||||||
pinnedPages: "Angepinnte Seiten"
|
pinnedPages: "Angepinnte Seiten"
|
||||||
pinnedPagesDescription: "Gib hier die Pfäde zu den Seiten an, die du an die Spitze dieser Instanz anheften möchtest, getrennt durch neue Zeilen."
|
pinnedPagesDescription: "Gib hier die Pfäde zu den Seiten an, die du an die Spitze dieser Instanz anheften möchtest, getrennt durch neue Zeilen."
|
||||||
|
pinnedClipId: "ID des angehefteten Clips"
|
||||||
|
pinnedNotes: "Angepinnte Notizen"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptcha aktivieren"
|
enableHcaptcha: "hCaptcha aktivieren"
|
||||||
hcaptchaSiteKey: "Site key"
|
hcaptchaSiteKey: "Site key"
|
||||||
@ -358,13 +370,6 @@ popularTags: "Beliebte Schlagwörter"
|
|||||||
userList: "Listen"
|
userList: "Listen"
|
||||||
about: "Über"
|
about: "Über"
|
||||||
aboutMisskey: "Über Misskey"
|
aboutMisskey: "Über Misskey"
|
||||||
aboutMisskeyText: "Misskey ist Open-Source-Software die von syuilo seit 2014 entwickelt wird."
|
|
||||||
misskeyMembers: "Misskey wird momentan von den unten aufgelisteten Mitgliedern weiterentwickelt und instand gehalten:"
|
|
||||||
misskeySource: "Der Quelltext ist hier verfügbar:"
|
|
||||||
misskeyTranslation: "Hilf dabei, Misskey zu übersetzen:"
|
|
||||||
misskeyDonate: "Spende an Misskey, um die Weiterentwicklung zu unterstützen:"
|
|
||||||
morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter Personen sehr. Danke! 🥰"
|
|
||||||
patrons: "UnterstützerInnen"
|
|
||||||
administrator: "Administrator"
|
administrator: "Administrator"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
twoStepAuthentication: "Zwei-Faktor-Authentifizierung"
|
twoStepAuthentication: "Zwei-Faktor-Authentifizierung"
|
||||||
@ -439,6 +444,7 @@ useOsNativeEmojis: "Eingebaute Emojis des Betriebssystems benutzen"
|
|||||||
youHaveNoGroups: "Keine Gruppen vorhanden"
|
youHaveNoGroups: "Keine Gruppen vorhanden"
|
||||||
joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene."
|
joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene."
|
||||||
noHistory: "Kein Verlauf"
|
noHistory: "Kein Verlauf"
|
||||||
|
signinHistory: "Anmeldungsverlauf"
|
||||||
disableAnimatedMfm: "MFM, die Animationen enthalten, deaktivieren"
|
disableAnimatedMfm: "MFM, die Animationen enthalten, deaktivieren"
|
||||||
doing: "In Bearbeitung"
|
doing: "In Bearbeitung"
|
||||||
category: "Kategorie"
|
category: "Kategorie"
|
||||||
@ -487,10 +493,11 @@ showFixedPostForm: "Bereich zum Schreiben neuer Notizen am Anfang der Chronik an
|
|||||||
newNoteRecived: "Es gibt neue Notizen"
|
newNoteRecived: "Es gibt neue Notizen"
|
||||||
sounds: "Töne"
|
sounds: "Töne"
|
||||||
listen: "Anhören"
|
listen: "Anhören"
|
||||||
none: "Keine"
|
none: "Nichts"
|
||||||
showInPage: "In Seite anzeigen"
|
showInPage: "In Seite anzeigen"
|
||||||
popout: "Pop-Up"
|
popout: "Pop-Up"
|
||||||
volume: "Lautstärke"
|
volume: "Lautstärke"
|
||||||
|
masterVolume: "Gesamtlautstärke"
|
||||||
details: "Details"
|
details: "Details"
|
||||||
chooseEmoji: "Wähle ein Emoji"
|
chooseEmoji: "Wähle ein Emoji"
|
||||||
unableToProcess: "Der Vorgang konnte nicht abgeschlossen werden."
|
unableToProcess: "Der Vorgang konnte nicht abgeschlossen werden."
|
||||||
@ -531,7 +538,7 @@ invisibleNote: "Private Notiz"
|
|||||||
enableInfiniteScroll: "Automatisch mehr Notizen laden"
|
enableInfiniteScroll: "Automatisch mehr Notizen laden"
|
||||||
visibility: "Sichtbarkeit"
|
visibility: "Sichtbarkeit"
|
||||||
poll: "Umfrage"
|
poll: "Umfrage"
|
||||||
useCw: "Inhalt verstecken"
|
useCw: "Inhalt verdecken"
|
||||||
enablePlayer: "Video-Player öffnen"
|
enablePlayer: "Video-Player öffnen"
|
||||||
disablePlayer: "Video-Player schließen"
|
disablePlayer: "Video-Player schließen"
|
||||||
expandTweet: "Tweet ausklappen"
|
expandTweet: "Tweet ausklappen"
|
||||||
@ -548,19 +555,23 @@ useBlurEffectForModal: "Weichzeichnungseffekt für Modals verwenden"
|
|||||||
useFullReactionPicker: "Vollständige Reaktionsauswahl nutzen"
|
useFullReactionPicker: "Vollständige Reaktionsauswahl nutzen"
|
||||||
width: "Breite"
|
width: "Breite"
|
||||||
height: "Höhe"
|
height: "Höhe"
|
||||||
|
large: "Groß"
|
||||||
|
medium: "Mittel"
|
||||||
|
small: "Klein"
|
||||||
generateAccessToken: "Zugriffstoken generieren"
|
generateAccessToken: "Zugriffstoken generieren"
|
||||||
permission: "Berechtigungen"
|
permission: "Berechtigungen"
|
||||||
enableAll: "Alle aktivieren"
|
enableAll: "Alle aktivieren"
|
||||||
disableAll: "Alle deaktivieren"
|
disableAll: "Alle deaktivieren"
|
||||||
tokenRequested: "Benutzerkontozugriff gewähren"
|
tokenRequested: "Benutzerkontozugriff gewähren"
|
||||||
pluginTokenRequestedDescription: "Dieses Plugin wird die hier konfigurierten Berechtigungen verwenden können."
|
pluginTokenRequestedDescription: "Dieses Plugin wird die hier konfigurierten Berechtigungen verwenden können."
|
||||||
notificationType: "Benachrichtigungstyp"
|
notificationType: "Benachrichtigungsart"
|
||||||
edit: "Bearbeiten"
|
edit: "Bearbeiten"
|
||||||
useStarForReactionFallback: "Verwende ★ falls das Reaktions-Emoji unbekannt ist"
|
useStarForReactionFallback: "Verwende ★ falls das Reaktions-Emoji unbekannt ist"
|
||||||
emailConfig: "Email-Server Konfiguration"
|
emailConfig: "Email-Server Konfiguration"
|
||||||
enableEmail: "Email-Versand aktivieren"
|
enableEmail: "Email-Versand aktivieren"
|
||||||
emailConfigInfo: "Zur Email-Bestätigung bei Registrierung und zum Zurücksetzen des Passworts verwendet"
|
emailConfigInfo: "Zur Email-Bestätigung bei Registrierung und zum Zurücksetzen des Passworts verwendet"
|
||||||
email: "Email-Adresse"
|
email: "Email"
|
||||||
|
emailAddress: "Email-Adresse"
|
||||||
smtpConfig: "SMTP-Server Konfiguration"
|
smtpConfig: "SMTP-Server Konfiguration"
|
||||||
smtpHost: "Host"
|
smtpHost: "Host"
|
||||||
smtpPort: "Port"
|
smtpPort: "Port"
|
||||||
@ -592,6 +603,7 @@ regenerateLoginTokenDescription: "Den bei Logins intern verwendeten Token regene
|
|||||||
setMultipleBySeparatingWithSpace: "Trenne Elemente durch ein Leerzeichen um mehrere Einstellungen zu kofigurieren."
|
setMultipleBySeparatingWithSpace: "Trenne Elemente durch ein Leerzeichen um mehrere Einstellungen zu kofigurieren."
|
||||||
fileIdOrUrl: "Datei-ID oder URL"
|
fileIdOrUrl: "Datei-ID oder URL"
|
||||||
chatOpenBehavior: "Verhalten des Chatfensters bei Öffnung"
|
chatOpenBehavior: "Verhalten des Chatfensters bei Öffnung"
|
||||||
|
behavior: "Verhalten"
|
||||||
sample: "Beispiel"
|
sample: "Beispiel"
|
||||||
abuseReports: "Melden"
|
abuseReports: "Melden"
|
||||||
reportAbuse: "Melden"
|
reportAbuse: "Melden"
|
||||||
@ -615,6 +627,90 @@ createNew: "Neu erstellen"
|
|||||||
optional: "Optional"
|
optional: "Optional"
|
||||||
createNewClip: "Neuen Clip erstellen"
|
createNewClip: "Neuen Clip erstellen"
|
||||||
public: "Öffentlich"
|
public: "Öffentlich"
|
||||||
|
i18nInfo: "Misskey wird durch freiwillige Helfer in viele verschiedene Sprachen übersetzt. Auf {link} kannst du mithelfen."
|
||||||
|
manageAccessTokens: "Zugriffstoken verwalten"
|
||||||
|
accountInfo: "Benutzerkonto-Informationen"
|
||||||
|
notesCount: "Anzahl von Notizen"
|
||||||
|
repliesCount: "Anzahl gesendeter Antworten"
|
||||||
|
renotesCount: "Anzahl gesendeter Renotes"
|
||||||
|
repliedCount: "Anzahl erhaltener Antworten"
|
||||||
|
renotedCount: "Anzahl erhaltener Renotes"
|
||||||
|
followingCount: "Anzahl gefolgter Benutzer"
|
||||||
|
followersCount: "Anzahl an Followern"
|
||||||
|
sentReactionsCount: "Anzahl gesendeter Reaktionen"
|
||||||
|
receivedReactionsCount: "Anzahl erhaltener Reaktionen"
|
||||||
|
pollVotesCount: "Anzahl beantworteter Umfragen"
|
||||||
|
pollVotedCount: "Anzahl erhaltener Umfrageantworten"
|
||||||
|
yes: "Ja"
|
||||||
|
no: "Nein"
|
||||||
|
driveFilesCount: "Anzahl von Drive-Dateien"
|
||||||
|
driveUsage: "Drive-Auslastung"
|
||||||
|
noCrawle: "Crawler-Indexierung ablehnen"
|
||||||
|
noCrawleDescription: "Suchmaschinen bitten, die eigene Profilseite, Notizen, Seiten usw. nicht zu indexieren"
|
||||||
|
lockedAccountInfo: "Auch wenn du Follow-Anfragen auf manuelle Bestätigung setzt, wird jeder deine Notizen öffentlich sehen können, sofern du die Notizsichtbarkeit nicht auf \"Nur Follower\" setzt."
|
||||||
|
alwaysMarkSensitive: "Immer als NSFW markieren"
|
||||||
|
loadRawImages: "Anstatt Vorschaubild immer volles Bild laden"
|
||||||
|
disableShowingAnimatedImages: "Animierte Bilder nicht abspielen"
|
||||||
|
verificationEmailSent: "Eine Verifizierungsnachricht wurde versendet. Besuche den dort enthaltenen Link, um die Verifizierung abzuschließen."
|
||||||
|
notSet: "Nicht konfiguriert"
|
||||||
|
emailVerified: "Email-Adresse bestätigt"
|
||||||
|
noteFavoritesCount: "Anzahl favorisierter Notizen"
|
||||||
|
pageLikesCount: "Anzahl der Seiten, die mir gefallen"
|
||||||
|
pageLikedCount: "Anzahl erhaltener \"Gefällt mir\" auf Seiten"
|
||||||
|
reversiCount: "Anzahl von Reversi-Runden"
|
||||||
|
contact: "Kontakt"
|
||||||
|
useSystemFont: "Standardschriftart des Systems verwenden"
|
||||||
|
clips: "Clips"
|
||||||
|
experimentalFeatures: "Experimentelle Funktionalitäten"
|
||||||
|
developer: "Entwickler"
|
||||||
|
makeExplorable: "Benutzerkonto in \"Erkunden\" sichtbar machen"
|
||||||
|
makeExplorableDescription: "Wenn diese Option deaktiviert ist, ist dein Benutzerkonto nicht im \"Erkunden\"-Bereich sichtbar."
|
||||||
|
showGapBetweenNotesInTimeline: "Abstände zwischen Notizen auf der Chronik anzeigen"
|
||||||
|
duplicate: "Duplizieren"
|
||||||
|
left: "Links"
|
||||||
|
center: "Mitte"
|
||||||
|
wide: "Breit"
|
||||||
|
narrow: "Schmal"
|
||||||
|
reloadToApplySetting: "Diese Einstellung tritt nach einer Aktualisierung der Seite in Kraft. Jetzt aktualisieren?"
|
||||||
|
showTitlebar: "Titelleiste anzeigen"
|
||||||
|
clearCache: "Cache leeren"
|
||||||
|
onlineUsersCount: "{n} Benutzer sind online"
|
||||||
|
nUsers: "{n} Benutzer"
|
||||||
|
nNotes: "{n} Notizen"
|
||||||
|
sendErrorReports: "Fehlerberichte senden"
|
||||||
|
sendErrorReportsDescription: "Ist diese Option aktiviert, so werden beim Auftreten von Fehlern detaillierte Fehlerinformationen an Misskey weitergegeben, was zur Verbesserung der Qualität von Misskey beiträgt."
|
||||||
|
myTheme: "Mein Farbthema"
|
||||||
|
backgroundColor: "Hintergrund"
|
||||||
|
accentColor: "Akzentfarbe"
|
||||||
|
textColor: "Text"
|
||||||
|
saveAs: "Speichern als…"
|
||||||
|
advanced: "Fortgeschritten"
|
||||||
|
value: "Wert"
|
||||||
|
updatedAt: "Zuletzt geändert am"
|
||||||
|
saveConfirm: "Änderungen speichern?"
|
||||||
|
deleteConfirm: "Wirklich löschen?"
|
||||||
|
invalidValue: "Ungültiger Wert."
|
||||||
|
registry: "Registry"
|
||||||
|
closeAccount: "Benutzerkonto schließen"
|
||||||
|
_registry:
|
||||||
|
scope: "Scope"
|
||||||
|
key: "Schlüssel"
|
||||||
|
keys: "Schlüssel"
|
||||||
|
domain: "Domain"
|
||||||
|
createKey: "Schlüssel erstellen"
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey ist Open-Source-Software die von syuilo seit 2014 entwickelt wird."
|
||||||
|
contributors: "Hauptmitwirkende"
|
||||||
|
allContributors: "Alle Mitwirkenden"
|
||||||
|
source: "Quellcode"
|
||||||
|
translation: "Misskey übersetzen"
|
||||||
|
donate: "An Misskey spenden"
|
||||||
|
morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter Personen sehr. Danke! 🥰"
|
||||||
|
patrons: "UnterstützerInnen"
|
||||||
|
_nsfw:
|
||||||
|
respect: "Als NSFW markierte Bilder verdecken"
|
||||||
|
ignore: "Als NSFW markierte Bilder nicht verdecken"
|
||||||
|
force: "Alle Medien verdecken"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFM Spickzettel"
|
cheatSheet: "MFM Spickzettel"
|
||||||
intro: "MFM ist eine an vielen Stellen verwendbare und Misskey-exklusive Markup-Sprache. Hier kannst du eine Liste von verfügbarer MFM-Syntax anschauen."
|
intro: "MFM ist eine an vielen Stellen verwendbare und Misskey-exklusive Markup-Sprache. Hier kannst du eine Liste von verfügbarer MFM-Syntax anschauen."
|
||||||
@ -624,7 +720,7 @@ _mfm:
|
|||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden."
|
hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden."
|
||||||
url: "URL"
|
url: "URL"
|
||||||
urlDescription: "URLs können angezeigt werden."
|
urlDescription: "Zeigt URLs an."
|
||||||
link: "Link"
|
link: "Link"
|
||||||
linkDescription: "Ein spezifizierter Textabschnitt kann als URL angezeigt werden."
|
linkDescription: "Ein spezifizierter Textabschnitt kann als URL angezeigt werden."
|
||||||
bold: "Fett"
|
bold: "Fett"
|
||||||
@ -663,6 +759,16 @@ _mfm:
|
|||||||
twitchDescription: "Verleiht eine sehr stark zuckende Animation."
|
twitchDescription: "Verleiht eine sehr stark zuckende Animation."
|
||||||
spin: "Animation (Rotieren)"
|
spin: "Animation (Rotieren)"
|
||||||
spinDescription: "Verleiht eine rotierende Animation."
|
spinDescription: "Verleiht eine rotierende Animation."
|
||||||
|
x2: "Groß"
|
||||||
|
x2Description: "Lässt Inhalte größer angezeigt werden."
|
||||||
|
x3: "Sehr groß"
|
||||||
|
x3Description: "Lässt Inhalte noch größer angezeigt werden."
|
||||||
|
x4: "Am größten"
|
||||||
|
x4Description: "Lässt Inhalte noch größer als größer als groß angezeigt werden."
|
||||||
|
blur: "Weichzeichner"
|
||||||
|
blurDescription: "Inhalte durch Weihzeichnung verschwimmen lassen. Durch das Bewegen des Mauszeigers auf den Inhalt wird er klar angezeigt."
|
||||||
|
font: "Schriftart"
|
||||||
|
fontDescription: "Setzt die Schriftart des Inhaltes fest."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Spieleinstellungen"
|
gameSettings: "Spieleinstellungen"
|
||||||
@ -716,7 +822,7 @@ _channel:
|
|||||||
notesCount: "{n} Notizen"
|
notesCount: "{n} Notizen"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
full: "Voll"
|
full: "Voll"
|
||||||
icon: "Symbol"
|
icon: "Symbole"
|
||||||
hide: "Ausblenden"
|
hide: "Ausblenden"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Wort stummschalten"
|
muteWords: "Wort stummschalten"
|
||||||
@ -733,6 +839,8 @@ _theme:
|
|||||||
manage: "Themaverwaltung"
|
manage: "Themaverwaltung"
|
||||||
code: "Themen-Code"
|
code: "Themen-Code"
|
||||||
installed: "{name} wurde installiert"
|
installed: "{name} wurde installiert"
|
||||||
|
installedThemes: "Installierte Themen"
|
||||||
|
builtinThemes: "Eingebaute Themen"
|
||||||
alreadyInstalled: "Dieses Thema ist bereits installiert"
|
alreadyInstalled: "Dieses Thema ist bereits installiert"
|
||||||
invalid: "Themenformat ist ungültig"
|
invalid: "Themenformat ist ungültig"
|
||||||
make: "Farbthema erstellen"
|
make: "Farbthema erstellen"
|
||||||
@ -745,7 +853,7 @@ _theme:
|
|||||||
refConst: "Konstante referenzieren"
|
refConst: "Konstante referenzieren"
|
||||||
key: "Schlüssel"
|
key: "Schlüssel"
|
||||||
func: "Funktionen"
|
func: "Funktionen"
|
||||||
funcKind: "Funktionstyp"
|
funcKind: "Funktionsart"
|
||||||
argument: "Parameter"
|
argument: "Parameter"
|
||||||
basedProp: "Referenzierte Eigenschaft"
|
basedProp: "Referenzierte Eigenschaft"
|
||||||
alpha: "Transparenz"
|
alpha: "Transparenz"
|
||||||
@ -782,9 +890,9 @@ _theme:
|
|||||||
infoFg: "Text von Informationen"
|
infoFg: "Text von Informationen"
|
||||||
infoWarnBg: "Hintergrund von Warnungen"
|
infoWarnBg: "Hintergrund von Warnungen"
|
||||||
infoWarnFg: "Text von Informationen"
|
infoWarnFg: "Text von Informationen"
|
||||||
cwBg: "Hintergrund von versteckten Inhalten"
|
cwBg: "Hintergrund von verdeckten Inhalten"
|
||||||
cwFg: "Text von versteckten Inhalten"
|
cwFg: "Text von verdeckten Inhalten"
|
||||||
cwHoverBg: "Hintergrund von versteckten Inhalten (Mouseover)"
|
cwHoverBg: "Hintergrund von verdeckten Inhalten (Mouseover)"
|
||||||
toastBg: "Hintergrund von Benachrichtigungen"
|
toastBg: "Hintergrund von Benachrichtigungen"
|
||||||
toastFg: "Text von Benachrichtigungen"
|
toastFg: "Text von Benachrichtigungen"
|
||||||
buttonBg: "Hintergrund von Schaltflächen"
|
buttonBg: "Hintergrund von Schaltflächen"
|
||||||
@ -806,6 +914,8 @@ _sfx:
|
|||||||
chatBg: "Nachrichten (Hintergrund)"
|
chatBg: "Nachrichten (Hintergrund)"
|
||||||
antenna: "Antennen"
|
antenna: "Antennen"
|
||||||
channel: "Kanalbenachrichtigung"
|
channel: "Kanalbenachrichtigung"
|
||||||
|
reversiPutBlack: "Reversi: Schwarz macht einen Zug"
|
||||||
|
reversiPutWhite: "Reversi: Weiß macht einen Zug"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Unbekannt"
|
unknown: "Unbekannt"
|
||||||
future: "Zukunft"
|
future: "Zukunft"
|
||||||
@ -917,6 +1027,11 @@ _widgets:
|
|||||||
digitalClock: "Digitaluhr"
|
digitalClock: "Digitaluhr"
|
||||||
federation: "Föderation"
|
federation: "Föderation"
|
||||||
postForm: "Neue Notiz anfertigen"
|
postForm: "Neue Notiz anfertigen"
|
||||||
|
slideshow: "Diashow"
|
||||||
|
button: "Knopf"
|
||||||
|
onlineUsers: "Benutzer Online"
|
||||||
|
jobQueue: "Job-Warteschlange"
|
||||||
|
serverMetric: "Servermetriken"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Ausblenden"
|
hide: "Ausblenden"
|
||||||
show: "Mehr anzeigen"
|
show: "Mehr anzeigen"
|
||||||
@ -971,9 +1086,13 @@ _profile:
|
|||||||
username: "Benutzername"
|
username: "Benutzername"
|
||||||
description: "Über mich"
|
description: "Über mich"
|
||||||
youCanIncludeHashtags: "Du kannst auch Hashtags in deiner Beschreibung verwenden."
|
youCanIncludeHashtags: "Du kannst auch Hashtags in deiner Beschreibung verwenden."
|
||||||
metadata: "Andere Informationen"
|
metadata: "Zusätzliche Informationen"
|
||||||
|
metadataEdit: "Zusätzliche Informationen bearbeiten"
|
||||||
|
metadataDescription: "Du kannst auf deinem Profil vier zusätzliche Informationsblöcke anzeigen lassen."
|
||||||
metadataLabel: "Name"
|
metadataLabel: "Name"
|
||||||
metadataContent: "Inhalt"
|
metadataContent: "Inhalt"
|
||||||
|
changeAvatar: "Profilbild ändern"
|
||||||
|
changeBanner: "Banner ändern"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Alle Notizen"
|
allNotes: "Alle Notizen"
|
||||||
followingList: "Gefolgte Benutzer"
|
followingList: "Gefolgte Benutzer"
|
||||||
@ -1022,7 +1141,7 @@ _rooms:
|
|||||||
clearConfirm: "Möchtest du wirklich alle Möbel entfernen?"
|
clearConfirm: "Möchtest du wirklich alle Möbel entfernen?"
|
||||||
leaveConfirm: "Es gibt ungespeicherte Änderungen. Möchtest du wirklich gehen?"
|
leaveConfirm: "Es gibt ungespeicherte Änderungen. Möchtest du wirklich gehen?"
|
||||||
chooseImage: "Bild auswählen"
|
chooseImage: "Bild auswählen"
|
||||||
roomType: "Raumtyp"
|
roomType: "Raumart"
|
||||||
carpetColor: "Teppichfarbe"
|
carpetColor: "Teppichfarbe"
|
||||||
_roomType:
|
_roomType:
|
||||||
default: "Standard"
|
default: "Standard"
|
||||||
@ -1395,14 +1514,18 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Hauptspalte immer zeigen"
|
alwaysShowMainColumn: "Hauptspalte immer zeigen"
|
||||||
columnAlign: "Spalten ausrichten"
|
columnAlign: "Spalten ausrichten"
|
||||||
|
columnMargin: "Spaltenabstand"
|
||||||
|
columnHeaderHeight: "Spaltenkopfhöhe"
|
||||||
addColumn: "Spalte hinzufügen"
|
addColumn: "Spalte hinzufügen"
|
||||||
swapLeft: "Nach links verschieben"
|
swapLeft: "Nach links verschieben"
|
||||||
swapRight: "Nach rechts verschieben"
|
swapRight: "Nach rechts verschieben"
|
||||||
swapUp: "Nach oben verschieben"
|
swapUp: "Nach oben verschieben"
|
||||||
swapDown: "Nach unten verschieben"
|
swapDown: "Nach unten verschieben"
|
||||||
stackLeft: "Nach links stapeln"
|
stackLeft: "Auf linke Spalte stapeln"
|
||||||
popRight: "Nach rechts vom Stapel nehmen"
|
popRight: "Nach rechts vom Stapel nehmen"
|
||||||
|
profile: "Profil"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "Hauptspalte"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
notifications: "Benachrichtigungen"
|
notifications: "Benachrichtigungen"
|
||||||
tl: "Chronik"
|
tl: "Chronik"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
_lang_: "English"
|
_lang_: "English"
|
||||||
|
headlineMisskey: "Network connected by notes"
|
||||||
introMisskey: "Welcome! Misskey is an open source, and also a decentralized microblogging service.\nCreate \"notes\" to share what is happening now, or to share it with everyone around you 📡\nWith \"reactions\", you can also quickly express your feelings about everyone's notes 👍\nLet's explore a new world 🚀"
|
introMisskey: "Welcome! Misskey is an open source, and also a decentralized microblogging service.\nCreate \"notes\" to share what is happening now, or to share it with everyone around you 📡\nWith \"reactions\", you can also quickly express your feelings about everyone's notes 👍\nLet's explore a new world 🚀"
|
||||||
monthAndDay: "{month}/{day}"
|
monthAndDay: "{month}/{day}"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
@ -33,6 +34,9 @@ addUser: "Add a user"
|
|||||||
favorite: "Favorite"
|
favorite: "Favorite"
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
unfavorite: "Unfavorite"
|
unfavorite: "Unfavorite"
|
||||||
|
favorited: "Added to favorites."
|
||||||
|
alreadyFavorited: "Already added to favorites."
|
||||||
|
cantFavorite: "Couldn't add to favorites."
|
||||||
pin: "Pin to profile"
|
pin: "Pin to profile"
|
||||||
unpin: "Unpin from profile"
|
unpin: "Unpin from profile"
|
||||||
copyContent: "Copy contents"
|
copyContent: "Copy contents"
|
||||||
@ -46,6 +50,7 @@ copyUsername: "Copy username"
|
|||||||
searchUser: "User search"
|
searchUser: "User search"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
loadMore: "Load more"
|
loadMore: "Load more"
|
||||||
|
showMore: "Load more"
|
||||||
youGotNewFollower: "Followed you"
|
youGotNewFollower: "Followed you"
|
||||||
receiveFollowRequest: "Follow request received"
|
receiveFollowRequest: "Follow request received"
|
||||||
followRequestAccepted: "Follow request accepted"
|
followRequestAccepted: "Follow request accepted"
|
||||||
@ -63,7 +68,7 @@ exportRequested: "You have requested an export. This may take a while. After the
|
|||||||
importRequested: "You requested an import. This may take a while."
|
importRequested: "You requested an import. This may take a while."
|
||||||
lists: "Lists"
|
lists: "Lists"
|
||||||
noLists: "You don't have any lists"
|
noLists: "You don't have any lists"
|
||||||
note: "Notes"
|
note: "Note"
|
||||||
notes: "Notes"
|
notes: "Notes"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
@ -74,7 +79,7 @@ error: "Error"
|
|||||||
somethingHappened: "An error occurred"
|
somethingHappened: "An error occurred"
|
||||||
retry: "Retry"
|
retry: "Retry"
|
||||||
pageLoadError: "Failed to load page"
|
pageLoadError: "Failed to load page"
|
||||||
pageLoadErrorDescription: "This is normally caused by network errors or the browser's cache. Try clearung the cache and then try again after waiting a little while."
|
pageLoadErrorDescription: "This is normally caused by network errors or the browser's cache. Try clearing the cache and then try again after waiting a little while."
|
||||||
enterListName: "List name"
|
enterListName: "List name"
|
||||||
privacy: "Privacy"
|
privacy: "Privacy"
|
||||||
makeFollowManuallyApprove: "Follow requests require approval"
|
makeFollowManuallyApprove: "Follow requests require approval"
|
||||||
@ -87,6 +92,9 @@ followRequestPending: "Pending follow request"
|
|||||||
enterEmoji: "Enter an emoji"
|
enterEmoji: "Enter an emoji"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Unrenote"
|
unrenote: "Unrenote"
|
||||||
|
renoted: "Renoted."
|
||||||
|
cantRenote: "This post can't be renoted."
|
||||||
|
cantReRenote: "A renote can't be renoted."
|
||||||
quote: "Quote"
|
quote: "Quote"
|
||||||
pinnedNote: "Pinned note"
|
pinnedNote: "Pinned note"
|
||||||
you: "You"
|
you: "You"
|
||||||
@ -95,7 +103,7 @@ sensitive: "NSFW"
|
|||||||
add: "Add"
|
add: "Add"
|
||||||
reaction: "Reaction"
|
reaction: "Reaction"
|
||||||
reactionSettingDescription: "Assign your favorite reactions which want to pin in reaction picker."
|
reactionSettingDescription: "Assign your favorite reactions which want to pin in reaction picker."
|
||||||
reactionSettingDescription2: "Drag to reorganize, click to delete."
|
reactionSettingDescription2: "Drag to reorder, Click to delete, Press \"+\" to add"
|
||||||
rememberNoteVisibility: "Remember note visibility settings"
|
rememberNoteVisibility: "Remember note visibility settings"
|
||||||
attachCancel: "Remove attachment"
|
attachCancel: "Remove attachment"
|
||||||
markAsSensitive: "Mark as NSFW"
|
markAsSensitive: "Mark as NSFW"
|
||||||
@ -125,7 +133,9 @@ settingGuide: "Suggested Configuration"
|
|||||||
cacheRemoteFiles: "Cache remote files"
|
cacheRemoteFiles: "Cache remote files"
|
||||||
cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded directly from the remote instance. Disabling this will decrease storage usage, but will increase traffic, because thumbnails will not be generated."
|
cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded directly from the remote instance. Disabling this will decrease storage usage, but will increase traffic, because thumbnails will not be generated."
|
||||||
flagAsBot: "This account is a bot"
|
flagAsBot: "This account is a bot"
|
||||||
|
flagAsBotDescription: "If this account is controlled by a program, set this option. If enabled, it will act as flag for other developers to prevent endless interaction chains with other bots and adjust Misskey's internal systems to treat this account as a bot."
|
||||||
flagAsCat: "This account is a cat"
|
flagAsCat: "This account is a cat"
|
||||||
|
flagAsCatDescription: "Toggle this flag on for this account to be marked as a cat."
|
||||||
autoAcceptFollowed: "Automatically approve follow requests from users you're following"
|
autoAcceptFollowed: "Automatically approve follow requests from users you're following"
|
||||||
addAcount: "Add Account"
|
addAcount: "Add Account"
|
||||||
loginFailed: "Failed to sign in"
|
loginFailed: "Failed to sign in"
|
||||||
@ -243,7 +253,7 @@ birthday: "Birthday"
|
|||||||
yearsOld: "{age} years old"
|
yearsOld: "{age} years old"
|
||||||
registeredDate: "Joined on"
|
registeredDate: "Joined on"
|
||||||
location: "Location"
|
location: "Location"
|
||||||
theme: "Theme"
|
theme: "Themes"
|
||||||
themeForLightMode: "Theme to use in Light Mode"
|
themeForLightMode: "Theme to use in Light Mode"
|
||||||
themeForDarkMode: "Theme to use in Dark Mode"
|
themeForDarkMode: "Theme to use in Dark Mode"
|
||||||
light: "Light"
|
light: "Light"
|
||||||
@ -304,7 +314,7 @@ enableLocalTimeline: "Enable local timeline"
|
|||||||
enableGlobalTimeline: "Enable global timeline"
|
enableGlobalTimeline: "Enable global timeline"
|
||||||
disablingTimelinesInfo: "Admins and Mods will always have access to all timelines, even if they are not enabled."
|
disablingTimelinesInfo: "Admins and Mods will always have access to all timelines, even if they are not enabled."
|
||||||
registration: "Register"
|
registration: "Register"
|
||||||
enableRegistration: "Enable new user registeration"
|
enableRegistration: "Enable new user registration"
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
proxyRemoteFiles: "Proxy remote files"
|
proxyRemoteFiles: "Proxy remote files"
|
||||||
proxyRemoteFilesDescription: "If enabled, remote files that (1) are not stored locally or (2) got deleted from exceeding storage limit will be locally proxied (with thumbnails). This does not affect the server's storage."
|
proxyRemoteFilesDescription: "If enabled, remote files that (1) are not stored locally or (2) got deleted from exceeding storage limit will be locally proxied (with thumbnails). This does not affect the server's storage."
|
||||||
@ -318,6 +328,8 @@ pinnedUsers: "Pinned user"
|
|||||||
pinnedUsersDescription: "List one username per line. Users listed here will be pinned under \"Explore\" tab."
|
pinnedUsersDescription: "List one username per line. Users listed here will be pinned under \"Explore\" tab."
|
||||||
pinnedPages: "Pinned pages"
|
pinnedPages: "Pinned pages"
|
||||||
pinnedPagesDescription: "Enter the paths of the pages you want to pin to the top page of this instance, separated by new lines."
|
pinnedPagesDescription: "Enter the paths of the pages you want to pin to the top page of this instance, separated by new lines."
|
||||||
|
pinnedClipId: "ID of the pinned clip"
|
||||||
|
pinnedNotes: "Pinned notes"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Enable hCaptcha"
|
enableHcaptcha: "Enable hCaptcha"
|
||||||
hcaptchaSiteKey: "Site key"
|
hcaptchaSiteKey: "Site key"
|
||||||
@ -358,13 +370,6 @@ popularTags: "Trending Tags"
|
|||||||
userList: "Lists"
|
userList: "Lists"
|
||||||
about: "About"
|
about: "About"
|
||||||
aboutMisskey: "About Misskey"
|
aboutMisskey: "About Misskey"
|
||||||
aboutMisskeyText: "Misskey is an open-source software developed by syuilo since 2014."
|
|
||||||
misskeyMembers: "It is currently developed and maintained by the members listed below:"
|
|
||||||
misskeySource: "Source code is available here:"
|
|
||||||
misskeyTranslation: "Help us with your contribution to translate Misskey:"
|
|
||||||
misskeyDonate: "Help us to keep improving the software by donating here:"
|
|
||||||
morePatrons: "We really appreciate the support of many other helpers not listed here. Thank you! 🥰"
|
|
||||||
patrons: "Backers"
|
|
||||||
administrator: "Admin"
|
administrator: "Admin"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
twoStepAuthentication: "Two-factor authentication"
|
twoStepAuthentication: "Two-factor authentication"
|
||||||
@ -439,6 +444,7 @@ useOsNativeEmojis: "Use OS native Emojis"
|
|||||||
youHaveNoGroups: "You have no groups"
|
youHaveNoGroups: "You have no groups"
|
||||||
joinOrCreateGroup: "Get invited to join the groups or you can create your own group."
|
joinOrCreateGroup: "Get invited to join the groups or you can create your own group."
|
||||||
noHistory: "No history items"
|
noHistory: "No history items"
|
||||||
|
signinHistory: "Login history"
|
||||||
disableAnimatedMfm: "Disable MFM with animation"
|
disableAnimatedMfm: "Disable MFM with animation"
|
||||||
doing: "On my way"
|
doing: "On my way"
|
||||||
category: "Category"
|
category: "Category"
|
||||||
@ -491,6 +497,7 @@ none: "None"
|
|||||||
showInPage: "Show in page"
|
showInPage: "Show in page"
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
|
masterVolume: "Master volume"
|
||||||
details: "Details"
|
details: "Details"
|
||||||
chooseEmoji: "Choose an emoji"
|
chooseEmoji: "Choose an emoji"
|
||||||
unableToProcess: "The operation could not be completed."
|
unableToProcess: "The operation could not be completed."
|
||||||
@ -548,6 +555,9 @@ useBlurEffectForModal: "Use blur effect for modals"
|
|||||||
useFullReactionPicker: "Use full-size reaction picker"
|
useFullReactionPicker: "Use full-size reaction picker"
|
||||||
width: "Width"
|
width: "Width"
|
||||||
height: "Height"
|
height: "Height"
|
||||||
|
large: "Big"
|
||||||
|
medium: "Medium"
|
||||||
|
small: "Small"
|
||||||
generateAccessToken: "Generate access token"
|
generateAccessToken: "Generate access token"
|
||||||
permission: "Permissions"
|
permission: "Permissions"
|
||||||
enableAll: "Enable all"
|
enableAll: "Enable all"
|
||||||
@ -560,7 +570,8 @@ useStarForReactionFallback: "Use ★ as fallback if the reaction emoji is unknow
|
|||||||
emailConfig: "Email server configuration"
|
emailConfig: "Email server configuration"
|
||||||
enableEmail: "Enable email distribution"
|
enableEmail: "Enable email distribution"
|
||||||
emailConfigInfo: "Used to confirm your email during sign-up and if you forget your password"
|
emailConfigInfo: "Used to confirm your email during sign-up and if you forget your password"
|
||||||
email: "Email Address"
|
email: "Email"
|
||||||
|
emailAddress: "Email address"
|
||||||
smtpConfig: "SMTP Server configuration"
|
smtpConfig: "SMTP Server configuration"
|
||||||
smtpHost: "Host"
|
smtpHost: "Host"
|
||||||
smtpPort: "Port"
|
smtpPort: "Port"
|
||||||
@ -592,6 +603,7 @@ regenerateLoginTokenDescription: "Regenerate the token used internally during lo
|
|||||||
setMultipleBySeparatingWithSpace: "You can set multiple by separating them with spaces."
|
setMultipleBySeparatingWithSpace: "You can set multiple by separating them with spaces."
|
||||||
fileIdOrUrl: "File-ID or URL"
|
fileIdOrUrl: "File-ID or URL"
|
||||||
chatOpenBehavior: "Behavior of the chat window when opened"
|
chatOpenBehavior: "Behavior of the chat window when opened"
|
||||||
|
behavior: "Behavior"
|
||||||
sample: "Sample"
|
sample: "Sample"
|
||||||
abuseReports: "Reports"
|
abuseReports: "Reports"
|
||||||
reportAbuse: "Report"
|
reportAbuse: "Report"
|
||||||
@ -615,6 +627,90 @@ createNew: "Create new"
|
|||||||
optional: "Optional"
|
optional: "Optional"
|
||||||
createNewClip: "Create new clip"
|
createNewClip: "Create new clip"
|
||||||
public: "Public"
|
public: "Public"
|
||||||
|
i18nInfo: "Misskey is being translated into various languages by volunteers. You can help at {link}."
|
||||||
|
manageAccessTokens: "Manage access tokens"
|
||||||
|
accountInfo: "Account Info"
|
||||||
|
notesCount: "Amount of notes"
|
||||||
|
repliesCount: "Amount of replies sent"
|
||||||
|
renotesCount: "Amount of renotes sent"
|
||||||
|
repliedCount: "Amount of replies received"
|
||||||
|
renotedCount: "Amount of renotes received"
|
||||||
|
followingCount: "Amount of followed accounts"
|
||||||
|
followersCount: "Amount of followers"
|
||||||
|
sentReactionsCount: "Amount of sent reactions"
|
||||||
|
receivedReactionsCount: "Amount of received reactions"
|
||||||
|
pollVotesCount: "Amount of sent poll votes"
|
||||||
|
pollVotedCount: "Amount of received poll votes"
|
||||||
|
yes: "Yes"
|
||||||
|
no: "No"
|
||||||
|
driveFilesCount: "Amount of drive files"
|
||||||
|
driveUsage: "Drive space usage"
|
||||||
|
noCrawle: "Reject crawler indexing"
|
||||||
|
noCrawleDescription: "Ask search engines not to index your profile page, notes, Pages, etc"
|
||||||
|
lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", your notes are visible to anyone even if you require followers to be manually approved."
|
||||||
|
alwaysMarkSensitive: "Mark NSFW by default"
|
||||||
|
loadRawImages: "Display image attachments fully instead of thumbnails"
|
||||||
|
disableShowingAnimatedImages: "Don't play animated images"
|
||||||
|
verificationEmailSent: "A verification email has been sent. Please access the included link to complete verification."
|
||||||
|
notSet: "Not set"
|
||||||
|
emailVerified: "Email has been verified"
|
||||||
|
noteFavoritesCount: "Amount of favorite notes"
|
||||||
|
pageLikesCount: "Amount of received Page likes"
|
||||||
|
pageLikedCount: "Amount of liked Pages"
|
||||||
|
reversiCount: "Number of Reversi matches"
|
||||||
|
contact: "Contact"
|
||||||
|
useSystemFont: "Use the system's default font"
|
||||||
|
clips: "Clips"
|
||||||
|
experimentalFeatures: "Experimental features"
|
||||||
|
developer: "Developer"
|
||||||
|
makeExplorable: "Make account visible in \"Explore\""
|
||||||
|
makeExplorableDescription: "If you turn this off, your account will not show up in the \"Explore\" section."
|
||||||
|
showGapBetweenNotesInTimeline: "Show a gap between posts on the timeline"
|
||||||
|
duplicate: "Duplicate"
|
||||||
|
left: "Left"
|
||||||
|
center: "Center"
|
||||||
|
wide: "Wide"
|
||||||
|
narrow: "Narrow"
|
||||||
|
reloadToApplySetting: "This setting will be applied upon page reload. Reload now?"
|
||||||
|
showTitlebar: "Show title bar"
|
||||||
|
clearCache: "Clear cache"
|
||||||
|
onlineUsersCount: "{n} people are online"
|
||||||
|
nUsers: "{n} Users"
|
||||||
|
nNotes: "{n} Notes"
|
||||||
|
sendErrorReports: "Send error reports"
|
||||||
|
sendErrorReportsDescription: "When turned on, detailed error information will be shared with Misskey when a problem occurs, helping to improve the quality of Misskey."
|
||||||
|
myTheme: "My theme"
|
||||||
|
backgroundColor: "Background"
|
||||||
|
accentColor: "Accent"
|
||||||
|
textColor: "Text"
|
||||||
|
saveAs: "Save as..."
|
||||||
|
advanced: "Advanced"
|
||||||
|
value: "Value"
|
||||||
|
updatedAt: "Updated at"
|
||||||
|
saveConfirm: "Save changes?"
|
||||||
|
deleteConfirm: "Really delete?"
|
||||||
|
invalidValue: "Invalid value."
|
||||||
|
registry: "Registry"
|
||||||
|
closeAccount: "Close account"
|
||||||
|
_registry:
|
||||||
|
scope: "Scope"
|
||||||
|
key: "Key"
|
||||||
|
keys: "Keys"
|
||||||
|
domain: "Domain"
|
||||||
|
createKey: "Create key"
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey is open-source software being developed by syuilo since 2014."
|
||||||
|
contributors: "Main contributors"
|
||||||
|
allContributors: "All contributors"
|
||||||
|
source: "Source code"
|
||||||
|
translation: "Translate Misskey"
|
||||||
|
donate: "Donate to Misskey"
|
||||||
|
morePatrons: "We really appreciate the support of many other helpers not listed here. Thank you! 🥰"
|
||||||
|
patrons: "Backers"
|
||||||
|
_nsfw:
|
||||||
|
respect: "Hide NSFW media"
|
||||||
|
ignore: "Don't hide NSFW media"
|
||||||
|
force: "Hide all media"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFM Cheatsheet"
|
cheatSheet: "MFM Cheatsheet"
|
||||||
intro: "MFM is a Misskey-exclusive markup language that can be used in many places. Here you can view a list of all available MFM syntax."
|
intro: "MFM is a Misskey-exclusive markup language that can be used in many places. Here you can view a list of all available MFM syntax."
|
||||||
@ -663,6 +759,16 @@ _mfm:
|
|||||||
twitchDescription: "Infuses a strongly twitching animation."
|
twitchDescription: "Infuses a strongly twitching animation."
|
||||||
spin: "Animation (Spin)"
|
spin: "Animation (Spin)"
|
||||||
spinDescription: "Infuses a spinning animation."
|
spinDescription: "Infuses a spinning animation."
|
||||||
|
x2: "Big"
|
||||||
|
x2Description: "Displays content bigger."
|
||||||
|
x3: "Very big"
|
||||||
|
x3Description: "Displays content even bigger."
|
||||||
|
x4: "Extremely big"
|
||||||
|
x4Description: "Displays content even bigger than bigger than big."
|
||||||
|
blur: "Blur"
|
||||||
|
blurDescription: "Content can be blurred via this effect. It will be clearly displayed by hovering your cursor above it."
|
||||||
|
font: "Font"
|
||||||
|
fontDescription: "Sets the font to display contents in."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Game settings"
|
gameSettings: "Game settings"
|
||||||
@ -716,7 +822,7 @@ _channel:
|
|||||||
notesCount: "{n} Notes"
|
notesCount: "{n} Notes"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
full: "Full"
|
full: "Full"
|
||||||
icon: "Avatar"
|
icon: "Icons"
|
||||||
hide: "Hide"
|
hide: "Hide"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Word to mute"
|
muteWords: "Word to mute"
|
||||||
@ -733,6 +839,8 @@ _theme:
|
|||||||
manage: "Themes manager"
|
manage: "Themes manager"
|
||||||
code: "Theme code"
|
code: "Theme code"
|
||||||
installed: "{name} has been installed"
|
installed: "{name} has been installed"
|
||||||
|
installedThemes: "Installed themes"
|
||||||
|
builtinThemes: "Built-in themes"
|
||||||
alreadyInstalled: "The theme is already installed"
|
alreadyInstalled: "The theme is already installed"
|
||||||
invalid: "Theme format is invalid"
|
invalid: "Theme format is invalid"
|
||||||
make: "Make a theme"
|
make: "Make a theme"
|
||||||
@ -806,6 +914,8 @@ _sfx:
|
|||||||
chatBg: "Messaging (Background)"
|
chatBg: "Messaging (Background)"
|
||||||
antenna: "Antenna Reception"
|
antenna: "Antenna Reception"
|
||||||
channel: "Channel notifications"
|
channel: "Channel notifications"
|
||||||
|
reversiPutBlack: "Reversi: Black makes a move"
|
||||||
|
reversiPutWhite: "Reversi: White makes a move"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Unknown"
|
unknown: "Unknown"
|
||||||
future: "Future"
|
future: "Future"
|
||||||
@ -917,6 +1027,11 @@ _widgets:
|
|||||||
digitalClock: "Digital clock"
|
digitalClock: "Digital clock"
|
||||||
federation: "Federation"
|
federation: "Federation"
|
||||||
postForm: "Compose a note"
|
postForm: "Compose a note"
|
||||||
|
slideshow: "Slideshow"
|
||||||
|
button: "Button"
|
||||||
|
onlineUsers: "Online users"
|
||||||
|
jobQueue: "Job Queue"
|
||||||
|
serverMetric: "Server metrics"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Hide"
|
hide: "Hide"
|
||||||
show: "Load more"
|
show: "Load more"
|
||||||
@ -971,9 +1086,13 @@ _profile:
|
|||||||
username: "Username"
|
username: "Username"
|
||||||
description: "Bio"
|
description: "Bio"
|
||||||
youCanIncludeHashtags: "You can also include hashtags in your bio."
|
youCanIncludeHashtags: "You can also include hashtags in your bio."
|
||||||
metadata: "Other information"
|
metadata: "Additional Information"
|
||||||
|
metadataEdit: "Edit additional Information"
|
||||||
|
metadataDescription: "You can display up to four additional information sections in your profile."
|
||||||
metadataLabel: "Label"
|
metadataLabel: "Label"
|
||||||
metadataContent: "Content"
|
metadataContent: "Content"
|
||||||
|
changeAvatar: "Change avatar"
|
||||||
|
changeBanner: "Change banner"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "All notes"
|
allNotes: "All notes"
|
||||||
followingList: "Following"
|
followingList: "Following"
|
||||||
@ -1395,14 +1514,18 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Always show main column"
|
alwaysShowMainColumn: "Always show main column"
|
||||||
columnAlign: "Align columns"
|
columnAlign: "Align columns"
|
||||||
|
columnMargin: "Margin between columns"
|
||||||
|
columnHeaderHeight: " Column header height"
|
||||||
addColumn: "Add column"
|
addColumn: "Add column"
|
||||||
swapLeft: "Swap to left"
|
swapLeft: "Swap to left"
|
||||||
swapRight: "Swap to right"
|
swapRight: "Swap to right"
|
||||||
swapUp: "Swap with above"
|
swapUp: "Swap with above"
|
||||||
swapDown: "Swap with below"
|
swapDown: "Swap with below"
|
||||||
stackLeft: "Stack on the left"
|
stackLeft: "Stack on left column"
|
||||||
popRight: "Pop to the right"
|
popRight: "Pop to the right"
|
||||||
|
profile: "Profile"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "Main"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
tl: "Timeline"
|
tl: "Timeline"
|
||||||
|
@ -33,6 +33,9 @@ addUser: "Agregar usuario"
|
|||||||
favorite: "Favorito"
|
favorite: "Favorito"
|
||||||
favorites: "Favoritos"
|
favorites: "Favoritos"
|
||||||
unfavorite: "Quitar de favoritos"
|
unfavorite: "Quitar de favoritos"
|
||||||
|
favorited: "Añadido a favoritos"
|
||||||
|
alreadyFavorited: "Ya había sido añadido a favoritos"
|
||||||
|
cantFavorite: "No fue añadido a favoritos"
|
||||||
pin: "Fijar"
|
pin: "Fijar"
|
||||||
unpin: "Desfijar"
|
unpin: "Desfijar"
|
||||||
copyContent: "Copiar contenido"
|
copyContent: "Copiar contenido"
|
||||||
@ -46,6 +49,7 @@ copyUsername: "Copiar nombre de usuario"
|
|||||||
searchUser: "Búsqueda de usuarios"
|
searchUser: "Búsqueda de usuarios"
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
loadMore: "Ver más"
|
loadMore: "Ver más"
|
||||||
|
showMore: "Ver más"
|
||||||
youGotNewFollower: "te ha seguido"
|
youGotNewFollower: "te ha seguido"
|
||||||
receiveFollowRequest: "Recibiste una solicitud de seguimiento"
|
receiveFollowRequest: "Recibiste una solicitud de seguimiento"
|
||||||
followRequestAccepted: "La solicitud de seguimiento fue aceptada"
|
followRequestAccepted: "La solicitud de seguimiento fue aceptada"
|
||||||
@ -87,6 +91,9 @@ followRequestPending: "Solicitudes de seguimiento pendientes"
|
|||||||
enterEmoji: "Ingresar emojis"
|
enterEmoji: "Ingresar emojis"
|
||||||
renote: "Renotar"
|
renote: "Renotar"
|
||||||
unrenote: "Quitar renota"
|
unrenote: "Quitar renota"
|
||||||
|
renoted: "Renotado"
|
||||||
|
cantRenote: "No se puede renotar este post"
|
||||||
|
cantReRenote: "No se puede renotar una renota"
|
||||||
quote: "Citar"
|
quote: "Citar"
|
||||||
pinnedNote: "Nota fijada"
|
pinnedNote: "Nota fijada"
|
||||||
you: "Tú"
|
you: "Tú"
|
||||||
@ -95,6 +102,7 @@ sensitive: "Marcado como sensible"
|
|||||||
add: "Agregar"
|
add: "Agregar"
|
||||||
reaction: "Reacción"
|
reaction: "Reacción"
|
||||||
reactionSettingDescription: "Asigne sus reacción favoritas que desean anclar en el selector de reacciones."
|
reactionSettingDescription: "Asigne sus reacción favoritas que desean anclar en el selector de reacciones."
|
||||||
|
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
|
||||||
rememberNoteVisibility: "Recordar visibilidad"
|
rememberNoteVisibility: "Recordar visibilidad"
|
||||||
attachCancel: "Quitar adjunto"
|
attachCancel: "Quitar adjunto"
|
||||||
markAsSensitive: "Marcar como sensible"
|
markAsSensitive: "Marcar como sensible"
|
||||||
@ -124,7 +132,9 @@ settingGuide: "Configuración sugerida"
|
|||||||
cacheRemoteFiles: "Mantener en cache los archivos remotos"
|
cacheRemoteFiles: "Mantener en cache los archivos remotos"
|
||||||
cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas."
|
cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas."
|
||||||
flagAsBot: "Esta cuenta es un bot"
|
flagAsBot: "Esta cuenta es un bot"
|
||||||
|
flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar cadenas infinitas de reacciones, y ajustará los sistemas internos de Misskey para que trate a esta cuenta como un bot."
|
||||||
flagAsCat: "Esta cuenta es un gato"
|
flagAsCat: "Esta cuenta es un gato"
|
||||||
|
flagAsCatDescription: "En caso de que declare que esta cuenta es de un gato, active esta opción."
|
||||||
autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los usuarios que sigues"
|
autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los usuarios que sigues"
|
||||||
addAcount: "Agregar cuenta"
|
addAcount: "Agregar cuenta"
|
||||||
loginFailed: "Error al iniciar sesión."
|
loginFailed: "Error al iniciar sesión."
|
||||||
@ -215,6 +225,7 @@ remove: "Borrar"
|
|||||||
removed: "Borrado"
|
removed: "Borrado"
|
||||||
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||||
deleteAreYouSure: "¿Desea borrar \"{x}\"?"
|
deleteAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||||
|
resetAreYouSure: "¿Desea reestablecer?"
|
||||||
saved: "Guardado"
|
saved: "Guardado"
|
||||||
messaging: "Chat"
|
messaging: "Chat"
|
||||||
upload: "Subir"
|
upload: "Subir"
|
||||||
@ -314,6 +325,10 @@ bannerUrl: "URL de la imagen del banner"
|
|||||||
basicInfo: "Información básica"
|
basicInfo: "Información básica"
|
||||||
pinnedUsers: "Usuarios fijados"
|
pinnedUsers: "Usuarios fijados"
|
||||||
pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\" separados por una linea nueva"
|
pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\" separados por una linea nueva"
|
||||||
|
pinnedPages: "Páginas fijadas"
|
||||||
|
pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página principal de la instancia, separadas por lineas nuevas"
|
||||||
|
pinnedClipId: "Id del clip fijado"
|
||||||
|
pinnedNotes: "Nota fijada"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Habilitar hCaptcha"
|
enableHcaptcha: "Habilitar hCaptcha"
|
||||||
hcaptchaSiteKey: "Clave del sitio"
|
hcaptchaSiteKey: "Clave del sitio"
|
||||||
@ -354,13 +369,6 @@ popularTags: "Etiquetas populares"
|
|||||||
userList: "Lista"
|
userList: "Lista"
|
||||||
about: "Información"
|
about: "Información"
|
||||||
aboutMisskey: "Sobre Misskey"
|
aboutMisskey: "Sobre Misskey"
|
||||||
aboutMisskeyText: "Misskey es un software de código abierto, desarrollado por syuilo desde el 2014"
|
|
||||||
misskeyMembers: "Es creado y mantenido por los miembros aquí listados:"
|
|
||||||
misskeySource: "El código fuente está disponible aquí:"
|
|
||||||
misskeyTranslation: "Ayúdanos con tu contribución para traducir Misskey:"
|
|
||||||
misskeyDonate: "Puedes contribuir al desarrollo de Misskey donando aquí:"
|
|
||||||
morePatrons: "Muchas más personas nos apoyan. Muchas gracias🥰"
|
|
||||||
patrons: "Patrocinadores"
|
|
||||||
administrator: "Administrador"
|
administrator: "Administrador"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
twoStepAuthentication: "Autenticación de dos factores"
|
twoStepAuthentication: "Autenticación de dos factores"
|
||||||
@ -435,6 +443,7 @@ useOsNativeEmojis: "Usa los emojis nativos de la plataforma"
|
|||||||
youHaveNoGroups: "Sin grupos"
|
youHaveNoGroups: "Sin grupos"
|
||||||
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
|
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
|
||||||
noHistory: "No hay datos en el historial"
|
noHistory: "No hay datos en el historial"
|
||||||
|
signinHistory: "Historial de ingresos"
|
||||||
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
|
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
|
||||||
doing: "Voy en camino"
|
doing: "Voy en camino"
|
||||||
category: "Categoría"
|
category: "Categoría"
|
||||||
@ -487,6 +496,7 @@ none: "Ninguna"
|
|||||||
showInPage: "Mostrar en la página"
|
showInPage: "Mostrar en la página"
|
||||||
popout: "Popout"
|
popout: "Popout"
|
||||||
volume: "Volumen"
|
volume: "Volumen"
|
||||||
|
masterVolume: "Volumen principal"
|
||||||
details: "Detalles"
|
details: "Detalles"
|
||||||
chooseEmoji: "Elije un emoji"
|
chooseEmoji: "Elije un emoji"
|
||||||
unableToProcess: "La operación no se puede llevar a cabo"
|
unableToProcess: "La operación no se puede llevar a cabo"
|
||||||
@ -544,6 +554,9 @@ useBlurEffectForModal: "Usar efecto borroso en modales"
|
|||||||
useFullReactionPicker: "Reacción"
|
useFullReactionPicker: "Reacción"
|
||||||
width: "Ancho"
|
width: "Ancho"
|
||||||
height: "Altura"
|
height: "Altura"
|
||||||
|
large: "Grande"
|
||||||
|
medium: "Mediano"
|
||||||
|
small: "Pequeño"
|
||||||
generateAccessToken: "Generar token de acceso"
|
generateAccessToken: "Generar token de acceso"
|
||||||
permission: "Permisos"
|
permission: "Permisos"
|
||||||
enableAll: "Activar todo"
|
enableAll: "Activar todo"
|
||||||
@ -556,7 +569,8 @@ useStarForReactionFallback: "En caso de que los emojis de reacciones no sean cla
|
|||||||
emailConfig: "Configuración del servidor de correos"
|
emailConfig: "Configuración del servidor de correos"
|
||||||
enableEmail: "Activar el envío de correos electrónicos"
|
enableEmail: "Activar el envío de correos electrónicos"
|
||||||
emailConfigInfo: "Usar en caso de validación de correo electrónico y pedido de contraseña"
|
emailConfigInfo: "Usar en caso de validación de correo electrónico y pedido de contraseña"
|
||||||
email: "Correo electrónico"
|
email: "Correo"
|
||||||
|
emailAddress: "Correo electrónico"
|
||||||
smtpConfig: "Configuración del servidor SMTP"
|
smtpConfig: "Configuración del servidor SMTP"
|
||||||
smtpHost: "Host"
|
smtpHost: "Host"
|
||||||
smtpPort: "Puerto"
|
smtpPort: "Puerto"
|
||||||
@ -588,6 +602,7 @@ regenerateLoginTokenDescription: "Regenerar el token usado internamente durante
|
|||||||
setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios."
|
setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios."
|
||||||
fileIdOrUrl: "Id del archivo o URL"
|
fileIdOrUrl: "Id del archivo o URL"
|
||||||
chatOpenBehavior: "Comportamiento al abrir el chat"
|
chatOpenBehavior: "Comportamiento al abrir el chat"
|
||||||
|
behavior: "Comportamiento"
|
||||||
sample: "Muestra"
|
sample: "Muestra"
|
||||||
abuseReports: "Reportes"
|
abuseReports: "Reportes"
|
||||||
reportAbuse: "Reportar"
|
reportAbuse: "Reportar"
|
||||||
@ -606,7 +621,40 @@ random: "Aleatorio"
|
|||||||
system: "Sistema"
|
system: "Sistema"
|
||||||
switchUi: "Cambiar interfaz de usuario"
|
switchUi: "Cambiar interfaz de usuario"
|
||||||
desktop: "Escritorio"
|
desktop: "Escritorio"
|
||||||
|
clip: "Clip"
|
||||||
|
createNew: "Crear"
|
||||||
|
optional: "Opcional"
|
||||||
|
createNewClip: "Crear clip nuevo"
|
||||||
public: "Público"
|
public: "Público"
|
||||||
|
i18nInfo: "Misskey está siendo traducido a varios idiomas gracias a voluntarios. Se puede colaborar traduciendo en {link}"
|
||||||
|
manageAccessTokens: "Administrar tokens de acceso"
|
||||||
|
accountInfo: "Información de la Cuenta"
|
||||||
|
notesCount: "Cantidad de notas"
|
||||||
|
repliesCount: "Cantidad de respuestas hechas"
|
||||||
|
renotesCount: "Cantidad de renotas hechas"
|
||||||
|
repliedCount: "Cantidad de respuestas recibidas"
|
||||||
|
renotedCount: "Cantidad de renotas recibidas"
|
||||||
|
followingCount: "Cantidad de seguidos"
|
||||||
|
followersCount: "Cantidad de seguidores"
|
||||||
|
sentReactionsCount: "Cantidad de reacciones hechas"
|
||||||
|
receivedReactionsCount: "Cantidad de reacciones recibidas"
|
||||||
|
pollVotesCount: "Cantidad de votaciones hechas"
|
||||||
|
pollVotedCount: "Cantidad de votaciones recibidas"
|
||||||
|
yes: "Si"
|
||||||
|
no: "No"
|
||||||
|
driveFilesCount: "Cantidad de archivos en el drive"
|
||||||
|
driveUsage: "Uso del drive"
|
||||||
|
noCrawle: "Rechazar indexación del crawler"
|
||||||
|
noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, páginas, etc."
|
||||||
|
clips: "Clip"
|
||||||
|
clearCache: "Limpiar caché"
|
||||||
|
backgroundColor: "Fondo"
|
||||||
|
accentColor: "Acento"
|
||||||
|
textColor: "Texto"
|
||||||
|
value: "Valores"
|
||||||
|
_registry:
|
||||||
|
key: "Clave"
|
||||||
|
keys: "Clave"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "Hoja de referencia de MFM"
|
cheatSheet: "Hoja de referencia de MFM"
|
||||||
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares dentro de Misskey. Aquí puede ver una lista de sintaxis disponibles en MFM."
|
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares dentro de Misskey. Aquí puede ver una lista de sintaxis disponibles en MFM."
|
||||||
@ -624,6 +672,7 @@ _mfm:
|
|||||||
search: "Buscar"
|
search: "Buscar"
|
||||||
flip: "Echar de un capirotazo"
|
flip: "Echar de un capirotazo"
|
||||||
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
|
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
|
||||||
|
font: "Fuente"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Reversi"
|
reversi: "Reversi"
|
||||||
gameSettings: "Configuración del juego"
|
gameSettings: "Configuración del juego"
|
||||||
@ -878,6 +927,8 @@ _widgets:
|
|||||||
digitalClock: "Reloj digital"
|
digitalClock: "Reloj digital"
|
||||||
federation: "Federación"
|
federation: "Federación"
|
||||||
postForm: "Formulario"
|
postForm: "Formulario"
|
||||||
|
button: "Botón"
|
||||||
|
jobQueue: "Cola de trabajos"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Ocultar"
|
hide: "Ocultar"
|
||||||
show: "Ver más"
|
show: "Ver más"
|
||||||
@ -932,7 +983,6 @@ _profile:
|
|||||||
username: "Nombre de usuario"
|
username: "Nombre de usuario"
|
||||||
description: "Descripción"
|
description: "Descripción"
|
||||||
youCanIncludeHashtags: "Puedes añadir hashtags"
|
youCanIncludeHashtags: "Puedes añadir hashtags"
|
||||||
metadata: "Información adicional"
|
|
||||||
metadataLabel: "Etiqueta"
|
metadataLabel: "Etiqueta"
|
||||||
metadataContent: "Contenido"
|
metadataContent: "Contenido"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
|
@ -46,6 +46,7 @@ copyUsername: "Copier le nom d’utilisateur·rice"
|
|||||||
searchUser: "Chercher un·e utilisateur·rice"
|
searchUser: "Chercher un·e utilisateur·rice"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
loadMore: "Afficher plus …"
|
loadMore: "Afficher plus …"
|
||||||
|
showMore: "Afficher plus …"
|
||||||
youGotNewFollower: "Vous suit"
|
youGotNewFollower: "Vous suit"
|
||||||
receiveFollowRequest: "Demande d’abonnement reçue"
|
receiveFollowRequest: "Demande d’abonnement reçue"
|
||||||
followRequestAccepted: "La demande d’abonnement a été acceptée"
|
followRequestAccepted: "La demande d’abonnement a été acceptée"
|
||||||
@ -313,6 +314,7 @@ bannerUrl: "URL de l’image de la bannière"
|
|||||||
basicInfo: "Informations basiques"
|
basicInfo: "Informations basiques"
|
||||||
pinnedUsers: "Utilisateur·rice épinglé·e"
|
pinnedUsers: "Utilisateur·rice épinglé·e"
|
||||||
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
|
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
|
||||||
|
pinnedNotes: "Note épinglée"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Activer hCaptcha"
|
enableHcaptcha: "Activer hCaptcha"
|
||||||
hcaptchaSiteKey: "Clé du site"
|
hcaptchaSiteKey: "Clé du site"
|
||||||
@ -353,13 +355,6 @@ popularTags: "Mots-clés populaires"
|
|||||||
userList: "Listes"
|
userList: "Listes"
|
||||||
about: "Informations"
|
about: "Informations"
|
||||||
aboutMisskey: "À propos de Misskey"
|
aboutMisskey: "À propos de Misskey"
|
||||||
aboutMisskeyText: "Misskey est un logiciel libre et ouvert, développé par syuilo depuis 2014."
|
|
||||||
misskeyMembers: "Il est développé et maintenu par les membres listés ci-dessous :"
|
|
||||||
misskeySource: "Le code source est disponible ici:"
|
|
||||||
misskeyTranslation: "Aidez-nous en contribuant à traduire Misskey :"
|
|
||||||
misskeyDonate: "Vous pouvez contribuer au développement de Misskey en faisant un don ici:"
|
|
||||||
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes non mentionnées ici. Merci à toutes et à tous ! 🥰"
|
|
||||||
patrons: "Supporteurs"
|
|
||||||
administrator: "Administrateur"
|
administrator: "Administrateur"
|
||||||
token: "Jeton"
|
token: "Jeton"
|
||||||
twoStepAuthentication: "Authentification à deux facteurs"
|
twoStepAuthentication: "Authentification à deux facteurs"
|
||||||
@ -552,7 +547,6 @@ useStarForReactionFallback: "Utiliser ★ comme alternative si l’émoji de ré
|
|||||||
emailConfig: "Configuration du serveur email"
|
emailConfig: "Configuration du serveur email"
|
||||||
enableEmail: "Activer la distribution de courriel"
|
enableEmail: "Activer la distribution de courriel"
|
||||||
emailConfigInfo: "Utilisé pour confirmer votre adresse de courriel et la réinitialisation de votre mot de passe en cas d’oubli."
|
emailConfigInfo: "Utilisé pour confirmer votre adresse de courriel et la réinitialisation de votre mot de passe en cas d’oubli."
|
||||||
email: "Adresse de courrier électronique"
|
|
||||||
smtpConfig: "Paramètres du serveur SMTP"
|
smtpConfig: "Paramètres du serveur SMTP"
|
||||||
smtpHost: "Hôte"
|
smtpHost: "Hôte"
|
||||||
smtpPort: "Port"
|
smtpPort: "Port"
|
||||||
@ -584,6 +578,13 @@ fileIdOrUrl: "ID du fichier ou URL"
|
|||||||
chatOpenBehavior: "Comportement de la fenêtre de discussion lors de son ouverture"
|
chatOpenBehavior: "Comportement de la fenêtre de discussion lors de son ouverture"
|
||||||
random: "Aléatoire"
|
random: "Aléatoire"
|
||||||
public: "Public"
|
public: "Public"
|
||||||
|
clearCache: "Vider le cache"
|
||||||
|
backgroundColor: "Arrière-plan"
|
||||||
|
textColor: "Texte"
|
||||||
|
value: "Valeur"
|
||||||
|
_registry:
|
||||||
|
key: "Clé "
|
||||||
|
keys: "Clé "
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "Mentionner"
|
mention: "Mentionner"
|
||||||
hashtag: "Hashtags"
|
hashtag: "Hashtags"
|
||||||
@ -592,6 +593,7 @@ _mfm:
|
|||||||
quote: "Citer"
|
quote: "Citer"
|
||||||
emoji: "Émojis personnalisés"
|
emoji: "Émojis personnalisés"
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
|
font: "Police de caractères"
|
||||||
_reversi:
|
_reversi:
|
||||||
total: "Total"
|
total: "Total"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
@ -769,6 +771,8 @@ _widgets:
|
|||||||
digitalClock: "Horloge numérique"
|
digitalClock: "Horloge numérique"
|
||||||
federation: "Fédération"
|
federation: "Fédération"
|
||||||
postForm: "Formulaire à publier"
|
postForm: "Formulaire à publier"
|
||||||
|
button: "Bouton"
|
||||||
|
jobQueue: "File d’attente"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
show: "Afficher plus …"
|
show: "Afficher plus …"
|
||||||
@ -823,7 +827,6 @@ _profile:
|
|||||||
username: "Nom d’utilisateur·rice"
|
username: "Nom d’utilisateur·rice"
|
||||||
description: "À propos de moi"
|
description: "À propos de moi"
|
||||||
youCanIncludeHashtags: "Vous pouvez également inclure des hashtags."
|
youCanIncludeHashtags: "Vous pouvez également inclure des hashtags."
|
||||||
metadata: "Informations complémentaires"
|
|
||||||
metadataLabel: "Étiquette"
|
metadataLabel: "Étiquette"
|
||||||
metadataContent: "Contenu"
|
metadataContent: "Contenu"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
|
1
locales/ht-HT.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
---
|
219
locales/id-ID.yml
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
---
|
||||||
|
_lang_: "Bahasa Jepang"
|
||||||
|
monthAndDay: "{day} {month}"
|
||||||
|
search: "Pencarian"
|
||||||
|
notifications: "Notifikasi"
|
||||||
|
username: "Nama Pengguna"
|
||||||
|
password: "Kata sandi"
|
||||||
|
ok: "OK"
|
||||||
|
gotIt: "Saya mengerti"
|
||||||
|
cancel: "Batalkan"
|
||||||
|
enterUsername: "Masukkan nama pengguna"
|
||||||
|
renotedBy: "direnote oleh {user}"
|
||||||
|
noNotes: "Tidak ada notes"
|
||||||
|
noNotifications: "Tidak ada notifikasi"
|
||||||
|
settings: "Pengaturan"
|
||||||
|
basicSettings: "Pengaturan umum"
|
||||||
|
otherSettings: "Pengaturan lainnya"
|
||||||
|
openInWindow: "Buka di jendela"
|
||||||
|
profile: "Profil"
|
||||||
|
timeline: "Linimasa"
|
||||||
|
noAccountDescription: "Pengguna ini belum menulis bio"
|
||||||
|
login: "Masuk"
|
||||||
|
loggingIn: "Sedang masuk"
|
||||||
|
logout: "Keluar"
|
||||||
|
signup: "Daftar"
|
||||||
|
uploading: "Sedang mengunggah"
|
||||||
|
save: "Simpan"
|
||||||
|
users: "Pengguna"
|
||||||
|
addUser: "Tambah pengguna"
|
||||||
|
favorite: "Favorit"
|
||||||
|
favorites: "Favorit"
|
||||||
|
unfavorite: "Hapus favorit"
|
||||||
|
favorited: "Ditambahkan ke favorit"
|
||||||
|
alreadyFavorited: "Telah ditambahkan ke favorit"
|
||||||
|
cantFavorite: "Tidak dapat menambahkan ke favorit"
|
||||||
|
pin: "Sematkan ke profil"
|
||||||
|
unpin: "Lepas sematan dari profil"
|
||||||
|
copyContent: "Salin konten"
|
||||||
|
copyLink: "Salin tautan"
|
||||||
|
delete: "Hapus"
|
||||||
|
deleteAndEdit: "Hapus dan sunting"
|
||||||
|
addToList: "Tambahkan ke daftar"
|
||||||
|
sendMessage: "Kirim pesan"
|
||||||
|
copyUsername: "Salin nama pengguna"
|
||||||
|
searchUser: "Cari pengguna"
|
||||||
|
reply: "Balas"
|
||||||
|
cantReRenote: "Renote tidak dapat direnote"
|
||||||
|
quote: "Kutip"
|
||||||
|
pinnedNote: "Note yang disematkan"
|
||||||
|
you: "Anda"
|
||||||
|
clickToShow: "Klik untuk melihat"
|
||||||
|
sensitive: "Konten sensitif"
|
||||||
|
add: "Tambahkan"
|
||||||
|
reaction: "Reaksi"
|
||||||
|
reactionSettingDescription: "Masukkan reaksi favorit yang ingin anda sematkan pada bilah reaksi"
|
||||||
|
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||||
|
rememberNoteVisibility: "Ingat pengaturan visibilitas note"
|
||||||
|
attachCancel: "Hapus lampiran"
|
||||||
|
markAsSensitive: "Tandai sebagai konten sensitif"
|
||||||
|
unmarkAsSensitive: "Hapus tanda konten sensitif"
|
||||||
|
enterFileName: "Masukkan nama berkas"
|
||||||
|
mute: "Bisukan"
|
||||||
|
unmute: "Hapus bisukan"
|
||||||
|
block: "Blokir"
|
||||||
|
unblock: "Buka blokir"
|
||||||
|
suspend: "Bekukan"
|
||||||
|
unsuspend: "Buka pembekuan"
|
||||||
|
blockConfirm: "Apakah anda yakin ingin memblokir akun ini?"
|
||||||
|
unblockConfirm: "Apakah anda yakin ingin membuka blokir akun ini?"
|
||||||
|
suspendConfirm: "Apakah anda yakin ingin membekukan akun ini?"
|
||||||
|
unsuspendConfirm: "Apakah anda yakin ingin membuka pembekuan akun ini?"
|
||||||
|
selectList: "Pilih daftar"
|
||||||
|
selectAntenna: "Pilih Antena"
|
||||||
|
selectWidget: "Pilih gawit"
|
||||||
|
editWidgets: "Sunting gawit"
|
||||||
|
editWidgetsExit: "Selesai"
|
||||||
|
customEmojis: "Emoji kustom"
|
||||||
|
emoji: "Emoji"
|
||||||
|
emojiName: "Nama emoji"
|
||||||
|
emojiUrl: "URL Emoji"
|
||||||
|
addEmoji: "Tambahkan emoji"
|
||||||
|
settingGuide: "Pengaturan rekomendasi"
|
||||||
|
cacheRemoteFiles: "Tembolokkan berkas remote"
|
||||||
|
flagAsBot: "Atur akun ini sebagai Bot"
|
||||||
|
flagAsCat: "Atur akun ini sebagai kucing"
|
||||||
|
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang anda ikuti"
|
||||||
|
addAcount: "Tambahkan akun"
|
||||||
|
loginFailed: "Gagal untuk masuk"
|
||||||
|
showOnRemote: "Lihat profil asli"
|
||||||
|
general: "Umum"
|
||||||
|
wallpaper: "Wallpaper"
|
||||||
|
setWallpaper: "Atur wallpaper"
|
||||||
|
removeWallpaper: "Hapus wallpaper"
|
||||||
|
intro: "Instalasi Misskey telah selesai! Mohon untuk membuat pengguna admin."
|
||||||
|
done: "Selesai"
|
||||||
|
processing: "Memproses"
|
||||||
|
preview: "Pratinjau"
|
||||||
|
default: "Bawaan"
|
||||||
|
noCustomEmojis: "Tidak ada emoji kustom"
|
||||||
|
federating: "memfederasi"
|
||||||
|
blocked: "Diblokir"
|
||||||
|
all: "Semua"
|
||||||
|
subscribing: "Berlangganan"
|
||||||
|
publishing: "Sedang menyiarkan langsung"
|
||||||
|
notResponding: "Tidak ada respon"
|
||||||
|
instanceFollowing: "Mengikuti instance"
|
||||||
|
instanceFollowers: "Pengikut instance"
|
||||||
|
instanceUsers: "Pengguna pada instance ini"
|
||||||
|
changePassword: "Ubah kata sandi"
|
||||||
|
security: "Keamanan"
|
||||||
|
retypedNotMatch: "Input tidak sama"
|
||||||
|
currentPassword: "Kata sandi saat ini"
|
||||||
|
newPassword: "Kata sandi baru"
|
||||||
|
newPasswordRetype: "Ulangi kata sandi baru"
|
||||||
|
attachFile: "Lampirkan berkas"
|
||||||
|
more: "Lagi !"
|
||||||
|
featured: "Sorotan"
|
||||||
|
usernameOrUserId: "Nama pengguna atau User ID"
|
||||||
|
noSuchUser: "Pengguna tidak ditemukan"
|
||||||
|
lookup: "Mencari"
|
||||||
|
announcements: "Pengumuman"
|
||||||
|
imageUrl: "URL Gambar"
|
||||||
|
remove: "Hapus"
|
||||||
|
removed: "Telah dihapus"
|
||||||
|
removeAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?"
|
||||||
|
deleteAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?"
|
||||||
|
saved: "Telah disimpan"
|
||||||
|
messaging: "Pesan"
|
||||||
|
upload: "Unggah"
|
||||||
|
fromDrive: "Dari Drive"
|
||||||
|
fromUrl: "Dari URL"
|
||||||
|
uploadFromUrl: "Unggah dari URL"
|
||||||
|
uploadFromUrlDescription: "URL berkas yang ingin anda unggah"
|
||||||
|
uploadFromUrlRequested: "Pengunggahan telah diminta"
|
||||||
|
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
|
||||||
|
explore: "Jelajahi"
|
||||||
|
games: "Permainan Misskey"
|
||||||
|
messageRead: "Telah dibaca"
|
||||||
|
noMoreHistory: "Tidak ada sejarah lagi"
|
||||||
|
startMessaging: "Mulai mengirim pesan"
|
||||||
|
nUsersRead: "Dibaca oleh {n}"
|
||||||
|
nsfw: "Konten sensitif"
|
||||||
|
watch: "Tonton"
|
||||||
|
unwatch: "Batal tonton"
|
||||||
|
accept: "Terima"
|
||||||
|
reject: "Tolak"
|
||||||
|
normal: "Normal"
|
||||||
|
instanceName: "Nama instance"
|
||||||
|
instanceDescription: "Tentang instance"
|
||||||
|
maintainerName: "Pengelola"
|
||||||
|
maintainerEmail: "Surel pengelola"
|
||||||
|
tosUrl: "URL Syarat dan Ketentuan"
|
||||||
|
thisYear: "Tahun ini"
|
||||||
|
thisMonth: "Bulan ini"
|
||||||
|
today: "Hari ini"
|
||||||
|
dayX: "{day}"
|
||||||
|
monthX: "{month}"
|
||||||
|
yearX: "{year}"
|
||||||
|
pages: "Halaman"
|
||||||
|
integration: "Integrasi"
|
||||||
|
connectSerice: "Sambungkan"
|
||||||
|
disconnectSerice: "Putuskan"
|
||||||
|
enableLocalTimeline: "Nyalakan linimasa lokal"
|
||||||
|
enableGlobalTimeline: "Nyalakan linimasa global"
|
||||||
|
registration: "Pendaftaran"
|
||||||
|
enableRegistration: "Nyalakan pendaftaran pengguna baru"
|
||||||
|
invite: "Undang"
|
||||||
|
proxyRemoteFiles: "Proksi berkas remote"
|
||||||
|
driveCapacityPerLocalAccount: "Kapasitas drive per pengguna lokal"
|
||||||
|
driveCapacityPerRemoteAccount: "Kapasitas drive per pengguna remote"
|
||||||
|
inMb: "dalam Megabytes"
|
||||||
|
iconUrl: "URL Gambar ikon"
|
||||||
|
bannerUrl: "URL Banner"
|
||||||
|
basicInfo: "Informasi Umum"
|
||||||
|
pinnedUsers: "Pengguna yang disematkan"
|
||||||
|
pinnedPages: "Halaman yang disematkan"
|
||||||
|
pinnedNotes: "Note yang disematkan"
|
||||||
|
hcaptcha: "hCaptcha"
|
||||||
|
enableHcaptcha: "Nyalakan hCaptcha"
|
||||||
|
hcaptchaSiteKey: "Site Key"
|
||||||
|
hcaptchaSecretKey: "Secret Key"
|
||||||
|
recaptcha: "reCAPTCHA"
|
||||||
|
enableRecaptcha: "Nyalakan reCAPTCHA"
|
||||||
|
recaptchaSiteKey: "Site key"
|
||||||
|
recaptchaSecretKey: "Secret Key"
|
||||||
|
antennas: "Antena"
|
||||||
|
manageAntennas: "Pengelola Antena"
|
||||||
|
notFound: "Tidak dapat ditemukan"
|
||||||
|
invites: "Undang"
|
||||||
|
invitations: "Undang"
|
||||||
|
smtpUser: "Nama Pengguna"
|
||||||
|
smtpPass: "Kata sandi"
|
||||||
|
_mfm:
|
||||||
|
quote: "Kutip"
|
||||||
|
emoji: "Emoji kustom"
|
||||||
|
search: "Pencarian"
|
||||||
|
_sfx:
|
||||||
|
notification: "Notifikasi"
|
||||||
|
chat: "Pesan"
|
||||||
|
_widgets:
|
||||||
|
notifications: "Notifikasi"
|
||||||
|
timeline: "Linimasa"
|
||||||
|
_profile:
|
||||||
|
username: "Nama Pengguna"
|
||||||
|
_exportOrImport:
|
||||||
|
muteList: "Bisukan"
|
||||||
|
blockingList: "Blokir"
|
||||||
|
_rooms:
|
||||||
|
_roomType:
|
||||||
|
default: "Bawaan"
|
||||||
|
_notification:
|
||||||
|
_types:
|
||||||
|
quote: "Kutip"
|
||||||
|
reaction: "Reaksi"
|
||||||
|
_deck:
|
||||||
|
_columns:
|
||||||
|
notifications: "Notifikasi"
|
||||||
|
tl: "Linimasa"
|
||||||
|
antenna: "Antena"
|
1
locales/it-IT.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
---
|
@ -1,5 +1,6 @@
|
|||||||
_lang_: "日本語"
|
_lang_: "日本語"
|
||||||
|
|
||||||
|
headlineMisskey: "ノートでつながるネットワーク"
|
||||||
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスです。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスです。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
@ -33,6 +34,9 @@ addUser: "ユーザーを追加"
|
|||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
unfavorite: "お気に入り解除"
|
unfavorite: "お気に入り解除"
|
||||||
|
favorited: "お気に入りに登録しました。"
|
||||||
|
alreadyFavorited: "既にお気に入りに登録されています。"
|
||||||
|
cantFavorite: "お気に入りに登録できませんでした。"
|
||||||
pin: "ピン留め"
|
pin: "ピン留め"
|
||||||
unpin: "ピン留め解除"
|
unpin: "ピン留め解除"
|
||||||
copyContent: "内容をコピー"
|
copyContent: "内容をコピー"
|
||||||
@ -46,6 +50,7 @@ copyUsername: "ユーザー名をコピー"
|
|||||||
searchUser: "ユーザーを検索"
|
searchUser: "ユーザーを検索"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
loadMore: "もっと見る"
|
loadMore: "もっと見る"
|
||||||
|
showMore: "もっと見る"
|
||||||
youGotNewFollower: "フォローされました"
|
youGotNewFollower: "フォローされました"
|
||||||
receiveFollowRequest: "フォローリクエストされました"
|
receiveFollowRequest: "フォローリクエストされました"
|
||||||
followRequestAccepted: "フォローが承認されました"
|
followRequestAccepted: "フォローが承認されました"
|
||||||
@ -87,6 +92,9 @@ followRequestPending: "フォロー許可待ち"
|
|||||||
enterEmoji: "絵文字を入力"
|
enterEmoji: "絵文字を入力"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Renote解除"
|
unrenote: "Renote解除"
|
||||||
|
renoted: "Renoteしました。"
|
||||||
|
cantRenote: "この投稿はRenoteできません。"
|
||||||
|
cantReRenote: "RenoteをRenoteすることはできません。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "ピン留めされたノート"
|
pinnedNote: "ピン留めされたノート"
|
||||||
you: "あなた"
|
you: "あなた"
|
||||||
@ -95,7 +103,7 @@ sensitive: "閲覧注意"
|
|||||||
add: "追加"
|
add: "追加"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactionSettingDescription: "リアクションピッカーに表示するリアクションを設定します。"
|
reactionSettingDescription: "リアクションピッカーに表示するリアクションを設定します。"
|
||||||
reactionSettingDescription2: "ドラッグして並び替えます。クリックして削除します。"
|
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
|
||||||
rememberNoteVisibility: "公開範囲を記憶する"
|
rememberNoteVisibility: "公開範囲を記憶する"
|
||||||
attachCancel: "添付取り消し"
|
attachCancel: "添付取り消し"
|
||||||
markAsSensitive: "閲覧注意にする"
|
markAsSensitive: "閲覧注意にする"
|
||||||
@ -125,7 +133,9 @@ settingGuide: "おすすめ設定"
|
|||||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||||
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
||||||
flagAsBot: "Botとして設定"
|
flagAsBot: "Botとして設定"
|
||||||
|
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。"
|
||||||
flagAsCat: "Catとして設定"
|
flagAsCat: "Catとして設定"
|
||||||
|
flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにします。"
|
||||||
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
|
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
|
||||||
addAcount: "アカウント追加"
|
addAcount: "アカウント追加"
|
||||||
loginFailed: "ログインに失敗しました"
|
loginFailed: "ログインに失敗しました"
|
||||||
@ -318,6 +328,8 @@ pinnedUsers: "ピン留めユーザー"
|
|||||||
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
|
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
|
||||||
pinnedPages: "ピン留めページ"
|
pinnedPages: "ピン留めページ"
|
||||||
pinnedPagesDescription: "インスタンスのトップページにピン留めしたいページのパスを改行で区切って記述します。"
|
pinnedPagesDescription: "インスタンスのトップページにピン留めしたいページのパスを改行で区切って記述します。"
|
||||||
|
pinnedClipId: "ピン留めするクリップのID"
|
||||||
|
pinnedNotes: "ピン留めされたノート"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptchaを有効にする"
|
enableHcaptcha: "hCaptchaを有効にする"
|
||||||
hcaptchaSiteKey: "サイトキー"
|
hcaptchaSiteKey: "サイトキー"
|
||||||
@ -358,13 +370,6 @@ popularTags: "人気のタグ"
|
|||||||
userList: "リスト"
|
userList: "リスト"
|
||||||
about: "情報"
|
about: "情報"
|
||||||
aboutMisskey: "Misskeyについて"
|
aboutMisskey: "Misskeyについて"
|
||||||
aboutMisskeyText: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
|
|
||||||
misskeyMembers: "現在以下のメンバーによって開発・メンテナンスされています:"
|
|
||||||
misskeySource: "ソースコードはここで公開されています:"
|
|
||||||
misskeyTranslation: "Misskeyの翻訳にご協力をお願いします:"
|
|
||||||
misskeyDonate: "Misskeyに寄付をして開発をサポートできます:"
|
|
||||||
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
|
|
||||||
patrons: "支援者"
|
|
||||||
administrator: "管理者"
|
administrator: "管理者"
|
||||||
token: "トークン"
|
token: "トークン"
|
||||||
twoStepAuthentication: "二段階認証"
|
twoStepAuthentication: "二段階認証"
|
||||||
@ -439,6 +444,7 @@ useOsNativeEmojis: "OSネイティブの絵文字を使用"
|
|||||||
youHaveNoGroups: "グループがありません"
|
youHaveNoGroups: "グループがありません"
|
||||||
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
|
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
|
||||||
noHistory: "履歴はありません"
|
noHistory: "履歴はありません"
|
||||||
|
signinHistory: "ログイン履歴"
|
||||||
disableAnimatedMfm: "動きのあるMFMを無効にする"
|
disableAnimatedMfm: "動きのあるMFMを無効にする"
|
||||||
doing: "やっています"
|
doing: "やっています"
|
||||||
category: "カテゴリ"
|
category: "カテゴリ"
|
||||||
@ -491,6 +497,7 @@ none: "なし"
|
|||||||
showInPage: "ページで表示"
|
showInPage: "ページで表示"
|
||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
volume: "音量"
|
volume: "音量"
|
||||||
|
masterVolume: "マスター音量"
|
||||||
details: "詳細"
|
details: "詳細"
|
||||||
chooseEmoji: "絵文字を選択"
|
chooseEmoji: "絵文字を選択"
|
||||||
unableToProcess: "操作を完了できません"
|
unableToProcess: "操作を完了できません"
|
||||||
@ -563,7 +570,8 @@ useStarForReactionFallback: "リアクション絵文字が不明な場合、代
|
|||||||
emailConfig: "メールサーバー設定"
|
emailConfig: "メールサーバー設定"
|
||||||
enableEmail: "メール配信機能を有効化する"
|
enableEmail: "メール配信機能を有効化する"
|
||||||
emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います"
|
emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います"
|
||||||
email: "メールアドレス"
|
email: "メール"
|
||||||
|
emailAddress: "メールアドレス"
|
||||||
smtpConfig: "SMTP サーバーの設定"
|
smtpConfig: "SMTP サーバーの設定"
|
||||||
smtpHost: "ホスト"
|
smtpHost: "ホスト"
|
||||||
smtpPort: "ポート"
|
smtpPort: "ポート"
|
||||||
@ -595,6 +603,7 @@ regenerateLoginTokenDescription: "ログインに使用される内部トーク
|
|||||||
setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。"
|
setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。"
|
||||||
fileIdOrUrl: "ファイルIDまたはURL"
|
fileIdOrUrl: "ファイルIDまたはURL"
|
||||||
chatOpenBehavior: "チャットを開くときの動作"
|
chatOpenBehavior: "チャットを開くときの動作"
|
||||||
|
behavior: "動作"
|
||||||
sample: "サンプル"
|
sample: "サンプル"
|
||||||
abuseReports: "通報"
|
abuseReports: "通報"
|
||||||
reportAbuse: "通報"
|
reportAbuse: "通報"
|
||||||
@ -618,6 +627,93 @@ createNew: "新規作成"
|
|||||||
optional: "任意"
|
optional: "任意"
|
||||||
createNewClip: "新しいクリップを作成"
|
createNewClip: "新しいクリップを作成"
|
||||||
public: "パブリック"
|
public: "パブリック"
|
||||||
|
i18nInfo: "Misskeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。"
|
||||||
|
manageAccessTokens: "アクセストークンの管理"
|
||||||
|
accountInfo: "アカウント情報"
|
||||||
|
notesCount: "ノートの数"
|
||||||
|
repliesCount: "返信した数"
|
||||||
|
renotesCount: "Renoteした数"
|
||||||
|
repliedCount: "返信された数"
|
||||||
|
renotedCount: "Renoteされた数"
|
||||||
|
followingCount: "フォロー数"
|
||||||
|
followersCount: "フォロワー数"
|
||||||
|
sentReactionsCount: "リアクションした数"
|
||||||
|
receivedReactionsCount: "リアクションされた数"
|
||||||
|
pollVotesCount: "アンケートに投票した数"
|
||||||
|
pollVotedCount: "アンケートに投票された数"
|
||||||
|
yes: "はい"
|
||||||
|
no: "いいえ"
|
||||||
|
driveFilesCount: "ドライブのファイル数"
|
||||||
|
driveUsage: "ドライブ使用量"
|
||||||
|
noCrawle: "クローラーによるインデックスを拒否"
|
||||||
|
noCrawleDescription: "検索エンジンにあなたのユーザーページ、ノート、Pagesなどのコンテンツを登録(インデックス)しないよう要請します。"
|
||||||
|
lockedAccountInfo: "フォローを承認制にしても、ノートの公開範囲を「フォロワー」にしない限り、誰でもあなたのノートを見ることができます。"
|
||||||
|
alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にする"
|
||||||
|
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
|
||||||
|
disableShowingAnimatedImages: "アニメーション画像を再生しない"
|
||||||
|
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
|
||||||
|
notSet: "未設定"
|
||||||
|
emailVerified: "メールアドレスが確認されました"
|
||||||
|
noteFavoritesCount: "お気に入りノートの数"
|
||||||
|
pageLikesCount: "Pageにいいねした数"
|
||||||
|
pageLikedCount: "Pageにいいねされた数"
|
||||||
|
reversiCount: "リバーシの対局数"
|
||||||
|
contact: "連絡先"
|
||||||
|
useSystemFont: "システムのデフォルトのフォントを使う"
|
||||||
|
clips: "クリップ"
|
||||||
|
experimentalFeatures: "実験的機能"
|
||||||
|
developer: "開発者"
|
||||||
|
makeExplorable: "アカウントを見つけやすくする"
|
||||||
|
makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らなくなります。"
|
||||||
|
showGapBetweenNotesInTimeline: "タイムラインのノートを離して表示"
|
||||||
|
duplicate: "複製"
|
||||||
|
left: "左"
|
||||||
|
center: "中央"
|
||||||
|
wide: "広い"
|
||||||
|
narrow: "狭い"
|
||||||
|
reloadToApplySetting: "設定はページリロード後に反映されます。今すぐリロードしますか?"
|
||||||
|
showTitlebar: "タイトルバーを表示する"
|
||||||
|
clearCache: "キャッシュをクリア"
|
||||||
|
onlineUsersCount: "{n}人がオンライン"
|
||||||
|
nUsers: "{n}ユーザー"
|
||||||
|
nNotes: "{n}ノート"
|
||||||
|
sendErrorReports: "エラーリポートを送信"
|
||||||
|
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がMisskeyに共有され、ソフトウェアの品質向上に役立てることができます。"
|
||||||
|
myTheme: "マイテーマ"
|
||||||
|
backgroundColor: "背景"
|
||||||
|
accentColor: "アクセント"
|
||||||
|
textColor: "文字"
|
||||||
|
saveAs: "名前を付けて保存"
|
||||||
|
advanced: "高度"
|
||||||
|
value: "値"
|
||||||
|
updatedAt: "更新日時"
|
||||||
|
saveConfirm: "保存しますか?"
|
||||||
|
deleteConfirm: "削除しますか?"
|
||||||
|
invalidValue: "有効な値ではありません。"
|
||||||
|
registry: "レジストリ"
|
||||||
|
closeAccount: "アカウントを閉鎖する"
|
||||||
|
|
||||||
|
_registry:
|
||||||
|
scope: "スコープ"
|
||||||
|
key: "キー"
|
||||||
|
keys: "キー"
|
||||||
|
domain: "ドメイン"
|
||||||
|
createKey: "キーを作成"
|
||||||
|
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
|
||||||
|
contributors: "主なコントリビューター"
|
||||||
|
allContributors: "全てのコントリビューター"
|
||||||
|
source: "ソースコード"
|
||||||
|
translation: "Misskeyを翻訳"
|
||||||
|
donate: "Misskeyに寄付"
|
||||||
|
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
|
||||||
|
patrons: "支援者"
|
||||||
|
|
||||||
|
_nsfw:
|
||||||
|
respect: "閲覧注意のメディアは隠す"
|
||||||
|
ignore: "閲覧注意のメディアを隠さない"
|
||||||
|
force: "常にメディアを隠す"
|
||||||
|
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFMチートシート"
|
cheatSheet: "MFMチートシート"
|
||||||
@ -662,11 +758,21 @@ _mfm:
|
|||||||
bounce: "アニメーション(バウンド)"
|
bounce: "アニメーション(バウンド)"
|
||||||
bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。"
|
bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。"
|
||||||
shake: "アニメーション(ぶるぶる)"
|
shake: "アニメーション(ぶるぶる)"
|
||||||
shakeDescription: "ぶるぶるするアニメーションを与えます。"
|
shakeDescription: "ぶるぶる震えるアニメーションを与えます。"
|
||||||
twitch: "アニメーション(ブレ)"
|
twitch: "アニメーション(ブレ)"
|
||||||
twitchDescription: "激しくブレるアニメーションを与えます。"
|
twitchDescription: "激しくブレるアニメーションを与えます。"
|
||||||
spin: "アニメーション(回転)"
|
spin: "アニメーション(回転)"
|
||||||
spinDescription: "回転するアニメーションを与えます。"
|
spinDescription: "回転するアニメーションを与えます。"
|
||||||
|
x2: "大きく"
|
||||||
|
x2Description: "内容を大きく表示します。"
|
||||||
|
x3: "とても大きく"
|
||||||
|
x3Description: "内容をとても大きく表示します。"
|
||||||
|
x4: "究極に大きく"
|
||||||
|
x4Description: "内容を究極に大きく表示します。"
|
||||||
|
blur: "ぼかし"
|
||||||
|
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
||||||
|
font: "フォント"
|
||||||
|
fontDescription: "内容のフォントを指定することができます。"
|
||||||
|
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "リバーシ"
|
reversi: "リバーシ"
|
||||||
@ -744,6 +850,8 @@ _theme:
|
|||||||
manage: "テーマの管理"
|
manage: "テーマの管理"
|
||||||
code: "テーマコード"
|
code: "テーマコード"
|
||||||
installed: "{name}をインストールしました"
|
installed: "{name}をインストールしました"
|
||||||
|
installedThemes: "インストールされたテーマ"
|
||||||
|
builtinThemes: "標準のテーマ"
|
||||||
alreadyInstalled: "そのテーマは既にインストールされています"
|
alreadyInstalled: "そのテーマは既にインストールされています"
|
||||||
invalid: "テーマの形式が間違っています"
|
invalid: "テーマの形式が間違っています"
|
||||||
make: "テーマを作る"
|
make: "テーマを作る"
|
||||||
@ -819,6 +927,8 @@ _sfx:
|
|||||||
chatBg: "チャット(バックグラウンド)"
|
chatBg: "チャット(バックグラウンド)"
|
||||||
antenna: "アンテナ受信"
|
antenna: "アンテナ受信"
|
||||||
channel: "チャンネル通知"
|
channel: "チャンネル通知"
|
||||||
|
reversiPutBlack: "リバーシ: 黒が打ったとき"
|
||||||
|
reversiPutWhite: "リバーシ: 白が打ったとき"
|
||||||
|
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "謎"
|
unknown: "謎"
|
||||||
@ -939,6 +1049,11 @@ _widgets:
|
|||||||
digitalClock: "デジタル時計"
|
digitalClock: "デジタル時計"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
postForm: "投稿フォーム"
|
postForm: "投稿フォーム"
|
||||||
|
slideshow: "スライドショー"
|
||||||
|
button: "ボタン"
|
||||||
|
onlineUsers: "オンラインユーザー"
|
||||||
|
jobQueue: "ジョブキュー"
|
||||||
|
serverMetric: "サーバーメトリクス"
|
||||||
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
@ -998,9 +1113,13 @@ _profile:
|
|||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
description: "自己紹介"
|
description: "自己紹介"
|
||||||
youCanIncludeHashtags: "ハッシュタグを含めることができます。"
|
youCanIncludeHashtags: "ハッシュタグを含めることができます。"
|
||||||
metadata: "補足情報"
|
metadata: "追加情報"
|
||||||
|
metadataEdit: "追加情報を編集"
|
||||||
|
metadataDescription: "プロフィールに表として4つまでの追加情報を表示することができます。"
|
||||||
metadataLabel: "ラベル"
|
metadataLabel: "ラベル"
|
||||||
metadataContent: "内容"
|
metadataContent: "内容"
|
||||||
|
changeAvatar: "アバター画像を変更"
|
||||||
|
changeBanner: "バナー画像を変更"
|
||||||
|
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "全てのノート"
|
allNotes: "全てのノート"
|
||||||
@ -1444,6 +1563,8 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "常にメインカラムを表示"
|
alwaysShowMainColumn: "常にメインカラムを表示"
|
||||||
columnAlign: "カラムの寄せ"
|
columnAlign: "カラムの寄せ"
|
||||||
|
columnMargin: "カラム間のマージン"
|
||||||
|
columnHeaderHeight: "カラムのヘッダー幅"
|
||||||
addColumn: "カラムを追加"
|
addColumn: "カラムを追加"
|
||||||
swapLeft: "左に移動"
|
swapLeft: "左に移動"
|
||||||
swapRight: "右に移動"
|
swapRight: "右に移動"
|
||||||
@ -1451,8 +1572,10 @@ _deck:
|
|||||||
swapDown: "下に移動"
|
swapDown: "下に移動"
|
||||||
stackLeft: "左に重ねる"
|
stackLeft: "左に重ねる"
|
||||||
popRight: "右に出す"
|
popRight: "右に出す"
|
||||||
|
profile: "プロファイル"
|
||||||
|
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "メイン"
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
tl: "タイムライン"
|
tl: "タイムライン"
|
||||||
|
@ -33,6 +33,9 @@ addUser: "ユーザーを追加や"
|
|||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
unfavorite: "やっぱ気に入らん"
|
unfavorite: "やっぱ気に入らん"
|
||||||
|
favorited: "お気に入りに登録したで"
|
||||||
|
alreadyFavorited: "もうお気に入りに入れとるがな。"
|
||||||
|
cantFavorite: "アカン、お気に入り登録できへんかったで。"
|
||||||
pin: "ピン留めしとく"
|
pin: "ピン留めしとく"
|
||||||
unpin: "やっぱピン留めせん"
|
unpin: "やっぱピン留めせん"
|
||||||
copyContent: "内容をコピー"
|
copyContent: "内容をコピー"
|
||||||
@ -46,6 +49,7 @@ copyUsername: "ユーザー名をコピー"
|
|||||||
searchUser: "ユーザーを検索"
|
searchUser: "ユーザーを検索"
|
||||||
reply: "返す"
|
reply: "返す"
|
||||||
loadMore: "もっとあるやろ!"
|
loadMore: "もっとあるやろ!"
|
||||||
|
showMore: "もっとあるやろ!"
|
||||||
youGotNewFollower: "フォローされたで"
|
youGotNewFollower: "フォローされたで"
|
||||||
receiveFollowRequest: "フォローリクエストされたで"
|
receiveFollowRequest: "フォローリクエストされたで"
|
||||||
followRequestAccepted: "フォローが承認されたで"
|
followRequestAccepted: "フォローが承認されたで"
|
||||||
@ -87,6 +91,9 @@ followRequestPending: "フォロー許してくれるん待っとる"
|
|||||||
enterEmoji: "絵文字を入れてや"
|
enterEmoji: "絵文字を入れてや"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Renoteやめる"
|
unrenote: "Renoteやめる"
|
||||||
|
renoted: "Renoteしたで。"
|
||||||
|
cantRenote: "この投稿はRenoteできへんらしい。"
|
||||||
|
cantReRenote: "すまん、今このRenoteにRenoteはできへんのや。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "ピン留めされとるノート"
|
pinnedNote: "ピン留めされとるノート"
|
||||||
you: "あんた"
|
you: "あんた"
|
||||||
@ -95,6 +102,7 @@ sensitive: "ちょっとアカンやつやで"
|
|||||||
add: "増やす"
|
add: "増やす"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
|
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
|
||||||
|
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押すと追加できるで。"
|
||||||
rememberNoteVisibility: "公開範囲覚えといて"
|
rememberNoteVisibility: "公開範囲覚えといて"
|
||||||
attachCancel: "やっぱ添付やめてくれん?"
|
attachCancel: "やっぱ添付やめてくれん?"
|
||||||
markAsSensitive: "ちょっとこれはアカン"
|
markAsSensitive: "ちょっとこれはアカン"
|
||||||
@ -124,7 +132,9 @@ settingGuide: "ええ感じの設定"
|
|||||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||||
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになってしまうんやで? サーバーのストレージは節約できるんやけど、かわりにサムネイルが作られんくなるから通信量が増えるで?"
|
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになってしまうんやで? サーバーのストレージは節約できるんやけど、かわりにサムネイルが作られんくなるから通信量が増えるで?"
|
||||||
flagAsBot: "Botやで"
|
flagAsBot: "Botやで"
|
||||||
|
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。"
|
||||||
flagAsCat: "Catやで"
|
flagAsCat: "Catやで"
|
||||||
|
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
|
||||||
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストには勝手に許可しとくで。"
|
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストには勝手に許可しとくで。"
|
||||||
addAcount: "アカウント追加"
|
addAcount: "アカウント追加"
|
||||||
loginFailed: "ログインに失敗してしもうた…"
|
loginFailed: "ログインに失敗してしもうた…"
|
||||||
@ -215,6 +225,7 @@ remove: "ほかす"
|
|||||||
removed: "削除したで!"
|
removed: "削除したで!"
|
||||||
removeAreYouSure: "「{x}」はなおしてしもてええか?"
|
removeAreYouSure: "「{x}」はなおしてしもてええか?"
|
||||||
deleteAreYouSure: "「{x}」はなおしてしもてええか?"
|
deleteAreYouSure: "「{x}」はなおしてしもてええか?"
|
||||||
|
resetAreYouSure: "リセットしてええん?"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
messaging: "チャット"
|
messaging: "チャット"
|
||||||
upload: "アップロード"
|
upload: "アップロード"
|
||||||
@ -314,6 +325,8 @@ bannerUrl: "バナー画像のURL"
|
|||||||
basicInfo: "基本情報"
|
basicInfo: "基本情報"
|
||||||
pinnedUsers: "ピン留めしたユーザー"
|
pinnedUsers: "ピン留めしたユーザー"
|
||||||
pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。"
|
pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。"
|
||||||
|
pinnedPages: "ピン留めページ"
|
||||||
|
pinnedNotes: "ピン留めされとるノート"
|
||||||
hcaptcha: "hCaptcha(キャプチャ)"
|
hcaptcha: "hCaptcha(キャプチャ)"
|
||||||
enableHcaptcha: "hCaptcha(キャプチャ)をつけとく"
|
enableHcaptcha: "hCaptcha(キャプチャ)をつけとく"
|
||||||
hcaptchaSiteKey: "サイトキー"
|
hcaptchaSiteKey: "サイトキー"
|
||||||
@ -354,13 +367,6 @@ popularTags: "人気のタグ"
|
|||||||
userList: "リスト"
|
userList: "リスト"
|
||||||
about: "情報"
|
about: "情報"
|
||||||
aboutMisskey: "Misskeyってなんや?"
|
aboutMisskey: "Misskeyってなんや?"
|
||||||
aboutMisskeyText: "Misskeyはsyuiloいう人が2014年からずっと作ってはる、オープンソースなソフトウェアや。"
|
|
||||||
misskeyMembers: "今んとここんだけのメンバーが作って、メンテナンスしてはる:"
|
|
||||||
misskeySource: "ソースコードはこっから見てな:"
|
|
||||||
misskeyTranslation: "Misskeyの翻訳手伝うてくれへん?:"
|
|
||||||
misskeyDonate: "Misskeyにお金あげたら開発のサポートになるで:"
|
|
||||||
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
|
|
||||||
patrons: "支援者"
|
|
||||||
administrator: "管理者"
|
administrator: "管理者"
|
||||||
token: "トークン"
|
token: "トークン"
|
||||||
twoStepAuthentication: "二段階認証"
|
twoStepAuthentication: "二段階認証"
|
||||||
@ -410,12 +416,46 @@ quoteQuestion: "引用として添付してもええか?"
|
|||||||
noMessagesYet: "まだチャットはあらへんで"
|
noMessagesYet: "まだチャットはあらへんで"
|
||||||
newMessageExists: "新しいメッセージがきたで"
|
newMessageExists: "新しいメッセージがきたで"
|
||||||
onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。"
|
onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。"
|
||||||
|
signinRequired: "ログインしてくれへん?"
|
||||||
invitations: "来てや"
|
invitations: "来てや"
|
||||||
invitationCode: "招待コード"
|
invitationCode: "招待コード"
|
||||||
checking: "確認しとるで"
|
checking: "確認しとるで"
|
||||||
|
available: "利用できる\n"
|
||||||
|
unavailable: "利用できん"
|
||||||
|
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
|
||||||
|
tooShort: "短すぎやろ!"
|
||||||
|
tooLong: "長すぎやろ!"
|
||||||
|
weakPassword: "弱いパスワード"
|
||||||
|
normalPassword: "普通のパスワード"
|
||||||
|
strongPassword: "ええ感じのパスワード"
|
||||||
|
passwordMatched: "よし!一致や!"
|
||||||
|
passwordNotMatched: "一致しとらんで?"
|
||||||
|
signinWith: "{x}でログイン"
|
||||||
|
or: "それか"
|
||||||
|
uiLanguage: "UIの表示言語"
|
||||||
|
groupInvited: "グループに招待されとるで"
|
||||||
|
aboutX: "{x}について"
|
||||||
|
useOsNativeEmojis: "OSネイティブの絵文字を使う"
|
||||||
|
youHaveNoGroups: "グループがあらへんねぇ。"
|
||||||
|
noHistory: "履歴はあらへんねぇ。"
|
||||||
|
signinHistory: "ログイン履歴"
|
||||||
|
doing: "やっとるがな"
|
||||||
|
category: "カテゴリ"
|
||||||
|
tags: "タグ"
|
||||||
|
docSource: "このドキュメントのソース"
|
||||||
|
createAccount: "アカウントを作成"
|
||||||
|
existingAcount: "既存のアカウント"
|
||||||
|
regenerate: "再生成"
|
||||||
|
fontSize: "フォントサイズ"
|
||||||
|
noFollowRequests: "フォロー申請はあらへんで"
|
||||||
|
openImageInNewTab: "画像を新しいタブで開く"
|
||||||
|
dashboard: "ダッシュボード"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
smtpHost: "ホスト"
|
smtpHost: "ホスト"
|
||||||
smtpUser: "ユーザー名"
|
smtpUser: "ユーザー名"
|
||||||
smtpPass: "パスワード"
|
smtpPass: "パスワード"
|
||||||
|
clearCache: "キャッシュにさいなら"
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
@ -459,6 +499,7 @@ _widgets:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
|
jobQueue: "ジョブキュー"
|
||||||
_cw:
|
_cw:
|
||||||
show: "もっとあるやろ!"
|
show: "もっとあるやろ!"
|
||||||
_poll:
|
_poll:
|
||||||
@ -507,6 +548,7 @@ _pages:
|
|||||||
array: "リスト"
|
array: "リスト"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "フォローされたで"
|
youWereFollowed: "フォローされたで"
|
||||||
|
youWereInvitedToGroup: "グループに招待されとるで"
|
||||||
_types:
|
_types:
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
|
@ -13,6 +13,7 @@ delete: "Kkes"
|
|||||||
addToList: "Rnu ɣer tebdart"
|
addToList: "Rnu ɣer tebdart"
|
||||||
reply: "Err"
|
reply: "Err"
|
||||||
loadMore: "Wali ugar"
|
loadMore: "Wali ugar"
|
||||||
|
showMore: "Wali ugar"
|
||||||
youGotNewFollower: "Yeṭṭafaṛ-ik·em-id"
|
youGotNewFollower: "Yeṭṭafaṛ-ik·em-id"
|
||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
import: "Kter"
|
import: "Kter"
|
||||||
@ -38,6 +39,7 @@ smtpPass: "Awal uffir"
|
|||||||
_mfm:
|
_mfm:
|
||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
search: "Nadi"
|
search: "Nadi"
|
||||||
|
font: "Tasefsit"
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
|
@ -40,6 +40,7 @@ sendMessage: "ಸಂದೇಶ ಕಳುಹಿಸು"
|
|||||||
copyUsername: "ಬಳಕೆಹೆಸರು ನಕಲಿಸು"
|
copyUsername: "ಬಳಕೆಹೆಸರು ನಕಲಿಸು"
|
||||||
reply: "ಉತ್ತರಿಸು"
|
reply: "ಉತ್ತರಿಸು"
|
||||||
loadMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
loadMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||||
|
showMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||||
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||||
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
||||||
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
||||||
|
@ -16,6 +16,9 @@ noNotes: "노트가 없습니다"
|
|||||||
noNotifications: "표시할 알림이 없습니다"
|
noNotifications: "표시할 알림이 없습니다"
|
||||||
instance: "인스턴스"
|
instance: "인스턴스"
|
||||||
settings: "설정"
|
settings: "설정"
|
||||||
|
basicSettings: "기본 설정"
|
||||||
|
otherSettings: "기타 설정"
|
||||||
|
openInWindow: "창으로 열기"
|
||||||
profile: "프로필"
|
profile: "프로필"
|
||||||
timeline: "타임라인"
|
timeline: "타임라인"
|
||||||
noAccountDescription: "자기소개가 없습니다"
|
noAccountDescription: "자기소개가 없습니다"
|
||||||
@ -40,8 +43,10 @@ deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니
|
|||||||
addToList: "리스트에 추가"
|
addToList: "리스트에 추가"
|
||||||
sendMessage: "메시지 보내기"
|
sendMessage: "메시지 보내기"
|
||||||
copyUsername: "유저명 복사"
|
copyUsername: "유저명 복사"
|
||||||
|
searchUser: "사용자 검색"
|
||||||
reply: "답글"
|
reply: "답글"
|
||||||
loadMore: "더 보기"
|
loadMore: "더 보기"
|
||||||
|
showMore: "더 보기"
|
||||||
youGotNewFollower: "새로운 팔로워가 있습니다"
|
youGotNewFollower: "새로운 팔로워가 있습니다"
|
||||||
receiveFollowRequest: "새로운 팔로우 요청이 있습니다"
|
receiveFollowRequest: "새로운 팔로우 요청이 있습니다"
|
||||||
followRequestAccepted: "팔로우가 수락되었습니다"
|
followRequestAccepted: "팔로우가 수락되었습니다"
|
||||||
@ -66,7 +71,11 @@ followers: "팔로워"
|
|||||||
followsYou: "당신을 팔로우합니다"
|
followsYou: "당신을 팔로우합니다"
|
||||||
createList: "리스트 만들기"
|
createList: "리스트 만들기"
|
||||||
manageLists: "리스트 관리"
|
manageLists: "리스트 관리"
|
||||||
|
error: "오류"
|
||||||
|
somethingHappened: "오류가 발생했습니다"
|
||||||
retry: "다시 시도"
|
retry: "다시 시도"
|
||||||
|
pageLoadError: "페이지를 불러오지 못했습니다."
|
||||||
|
pageLoadErrorDescription: "네트워크 연결 또는 브라우저 캐시로 인해 발생했을 가능성이 높습니다. 캐시를 삭제하거나, 잠시 후 다시 시도해 주세요."
|
||||||
enterListName: "리스트 이름을 입력"
|
enterListName: "리스트 이름을 입력"
|
||||||
privacy: "프라이버시"
|
privacy: "프라이버시"
|
||||||
makeFollowManuallyApprove: "팔로우를 수동으로 승인"
|
makeFollowManuallyApprove: "팔로우를 수동으로 승인"
|
||||||
@ -105,6 +114,8 @@ unsuspendConfirm: "이 계정의 정지를 해제하시겠습니까?"
|
|||||||
selectList: "리스트 선택"
|
selectList: "리스트 선택"
|
||||||
selectAntenna: "안테나 선택"
|
selectAntenna: "안테나 선택"
|
||||||
selectWidget: "위젯 선택"
|
selectWidget: "위젯 선택"
|
||||||
|
editWidgets: "위젯 편집"
|
||||||
|
editWidgetsExit: "편집 종료"
|
||||||
customEmojis: "커스텀 이모지"
|
customEmojis: "커스텀 이모지"
|
||||||
emoji: "이모지"
|
emoji: "이모지"
|
||||||
emojiName: "이모지 이름"
|
emojiName: "이모지 이름"
|
||||||
@ -114,7 +125,9 @@ settingGuide: "추천 설정"
|
|||||||
cacheRemoteFiles: "리모트 파일을 캐시"
|
cacheRemoteFiles: "리모트 파일을 캐시"
|
||||||
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다."
|
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다."
|
||||||
flagAsBot: "나는 봇입니다"
|
flagAsBot: "나는 봇입니다"
|
||||||
|
flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 Bot 운영에 최적화되는 등의 변화가 생깁니다."
|
||||||
flagAsCat: "나는 고양이다냥"
|
flagAsCat: "나는 고양이다냥"
|
||||||
|
flagAsCatDescription: "이 계정이 고양이라면 활성화 해주세요."
|
||||||
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
|
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
|
||||||
addAcount: "계정 추가"
|
addAcount: "계정 추가"
|
||||||
loginFailed: "로그인에 실패했습니다"
|
loginFailed: "로그인에 실패했습니다"
|
||||||
@ -205,6 +218,7 @@ remove: "삭제"
|
|||||||
removed: "삭제하였습니다"
|
removed: "삭제하였습니다"
|
||||||
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
|
resetAreYouSure: "초기화 하시겠습니까?"
|
||||||
saved: "저장하였습니다"
|
saved: "저장하였습니다"
|
||||||
messaging: "대화"
|
messaging: "대화"
|
||||||
upload: "업로드"
|
upload: "업로드"
|
||||||
@ -263,6 +277,7 @@ rename: "이름 변경"
|
|||||||
avatar: "아바타"
|
avatar: "아바타"
|
||||||
banner: "배너"
|
banner: "배너"
|
||||||
nsfw: "열람주의"
|
nsfw: "열람주의"
|
||||||
|
whenServerDisconnected: "서버와의 접속이 끊겼을 때"
|
||||||
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
||||||
reload: "새로고침"
|
reload: "새로고침"
|
||||||
doNothing: "무시하기"
|
doNothing: "무시하기"
|
||||||
@ -303,6 +318,9 @@ bannerUrl: "배너 이미지 URL"
|
|||||||
basicInfo: "기본 정보"
|
basicInfo: "기본 정보"
|
||||||
pinnedUsers: "고정된 유저"
|
pinnedUsers: "고정된 유저"
|
||||||
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
||||||
|
pinnedPages: "고정한 페이지"
|
||||||
|
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
|
||||||
|
pinnedNotes: "고정해놓은 노트"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptcha 활성화"
|
enableHcaptcha: "hCaptcha 활성화"
|
||||||
hcaptchaSiteKey: "사이트 키"
|
hcaptchaSiteKey: "사이트 키"
|
||||||
@ -343,13 +361,6 @@ popularTags: "인기 태그"
|
|||||||
userList: "리스트"
|
userList: "리스트"
|
||||||
about: "정보"
|
about: "정보"
|
||||||
aboutMisskey: "Misskey에 대하여"
|
aboutMisskey: "Misskey에 대하여"
|
||||||
aboutMisskeyText: "Misskey는 syuilo에 의해서 2014년부터 개발되어 온 오픈소스 소프트웨어 입니다."
|
|
||||||
misskeyMembers: "현재는 아래 멤버들에 의해 개발 및 유지보수 되고 있습니다:"
|
|
||||||
misskeySource: "소스코드는 여기에 공개되어 있습니다:"
|
|
||||||
misskeyTranslation: "Misskey의 번역을 함께해 주시길 부탁드립니다:"
|
|
||||||
misskeyDonate: "Misskey에 기부하심으로써 개발에 도움을 주실 수 있습니다:"
|
|
||||||
morePatrons: "이 외에도 다른 많은 분들이 도움을 주시고 계십니다. 감사합니다🥰"
|
|
||||||
patrons: "후원자들"
|
|
||||||
administrator: "관리자"
|
administrator: "관리자"
|
||||||
token: "토큰"
|
token: "토큰"
|
||||||
twoStepAuthentication: "2단계 인증"
|
twoStepAuthentication: "2단계 인증"
|
||||||
@ -424,6 +435,7 @@ useOsNativeEmojis: "OS 기본 이모지를 사용"
|
|||||||
youHaveNoGroups: "그룹이 없습니다"
|
youHaveNoGroups: "그룹이 없습니다"
|
||||||
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
|
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
|
||||||
noHistory: "기록이 없습니다"
|
noHistory: "기록이 없습니다"
|
||||||
|
signinHistory: "로그인 기록"
|
||||||
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
|
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
|
||||||
doing: "잠시만요"
|
doing: "잠시만요"
|
||||||
category: "카테고리"
|
category: "카테고리"
|
||||||
@ -441,6 +453,7 @@ remote: "리모트"
|
|||||||
total: "합계"
|
total: "합계"
|
||||||
weekOverWeekChanges: "지난주보다"
|
weekOverWeekChanges: "지난주보다"
|
||||||
dayOverDayChanges: "어제보다"
|
dayOverDayChanges: "어제보다"
|
||||||
|
clientSettings: "클라이언트 설정"
|
||||||
accountSettings: "계정 설정"
|
accountSettings: "계정 설정"
|
||||||
promotion: "프로모션"
|
promotion: "프로모션"
|
||||||
promote: "프로모션하기"
|
promote: "프로모션하기"
|
||||||
@ -463,6 +476,7 @@ objectStorageUseSSL: "SSL 사용"
|
|||||||
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
||||||
objectStorageUseProxy: "연결에 프록시를 사용"
|
objectStorageUseProxy: "연결에 프록시를 사용"
|
||||||
objectStorageUseProxyDesc: "오브젝트 스토리지 API 호출시 프록시를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
objectStorageUseProxyDesc: "오브젝트 스토리지 API 호출시 프록시를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
||||||
|
objectStorageSetPublicRead: "업로드할 때 'public-read'를 설정하기"
|
||||||
serverLogs: "서버 로그"
|
serverLogs: "서버 로그"
|
||||||
deleteAll: "모두 삭제"
|
deleteAll: "모두 삭제"
|
||||||
showFixedPostForm: "타임라인 상단에 글 작성란을 표시"
|
showFixedPostForm: "타임라인 상단에 글 작성란을 표시"
|
||||||
@ -470,7 +484,10 @@ newNoteRecived: "새 노트가 있습니다"
|
|||||||
sounds: "소리"
|
sounds: "소리"
|
||||||
listen: "듣기"
|
listen: "듣기"
|
||||||
none: "없음"
|
none: "없음"
|
||||||
|
showInPage: "페이지로 보기"
|
||||||
|
popout: "새 창으로 열기"
|
||||||
volume: "음량"
|
volume: "음량"
|
||||||
|
masterVolume: "마스터 볼륨"
|
||||||
details: "자세히"
|
details: "자세히"
|
||||||
chooseEmoji: "이모지 선택"
|
chooseEmoji: "이모지 선택"
|
||||||
unableToProcess: "작업을 완료할 수 없습니다"
|
unableToProcess: "작업을 완료할 수 없습니다"
|
||||||
@ -526,16 +543,20 @@ deck: "덱"
|
|||||||
undeck: "덱 해제"
|
undeck: "덱 해제"
|
||||||
width: "폭"
|
width: "폭"
|
||||||
height: "높이"
|
height: "높이"
|
||||||
|
large: "크게"
|
||||||
|
medium: "보통"
|
||||||
|
small: "작게"
|
||||||
generateAccessToken: "액세스 토큰 생성"
|
generateAccessToken: "액세스 토큰 생성"
|
||||||
permission: "권한"
|
permission: "권한"
|
||||||
enableAll: "전체 선택"
|
enableAll: "전체 선택"
|
||||||
disableAll: "전체 해제"
|
disableAll: "전체 해제"
|
||||||
tokenRequested: "계정 접근 허용"
|
tokenRequested: "계정 접근 허용"
|
||||||
|
pluginTokenRequestedDescription: "이 플러그인은 여기서 설정한 권한을 사용할 수 있게 됩니다."
|
||||||
|
notificationType: "알림 유형"
|
||||||
edit: "편집"
|
edit: "편집"
|
||||||
useStarForReactionFallback: "알 수 없는 리액션 이모지 대신 ★ 사용"
|
useStarForReactionFallback: "알 수 없는 리액션 이모지 대신 ★ 사용"
|
||||||
emailConfig: "메일 서버 설정"
|
emailConfig: "메일 서버 설정"
|
||||||
emailConfigInfo: "가입 시 메일 주소 확인이나 비밀번호 초기화 시에 사용합니다."
|
emailConfigInfo: "가입 시 메일 주소 확인이나 비밀번호 초기화 시에 사용합니다."
|
||||||
email: "메일 주소"
|
|
||||||
smtpConfig: "SMTP 서버 설정"
|
smtpConfig: "SMTP 서버 설정"
|
||||||
smtpHost: "호스트"
|
smtpHost: "호스트"
|
||||||
smtpPort: "포트"
|
smtpPort: "포트"
|
||||||
@ -544,24 +565,124 @@ smtpPass: "비밀번호"
|
|||||||
emptyToDisableSmtpAuth: "SMTP 인증을 사용하지 않으려면 공란으로 비워둡니다."
|
emptyToDisableSmtpAuth: "SMTP 인증을 사용하지 않으려면 공란으로 비워둡니다."
|
||||||
smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용"
|
smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용"
|
||||||
smtpSecureInfo: "STARTTLS 사용 시에는 해제합니다."
|
smtpSecureInfo: "STARTTLS 사용 시에는 해제합니다."
|
||||||
|
testEmail: "이메일 전송 테스트"
|
||||||
wordMute: "단어 뮤트"
|
wordMute: "단어 뮤트"
|
||||||
makeActive: "활성화"
|
makeActive: "활성화"
|
||||||
|
display: "표시"
|
||||||
copy: "복사"
|
copy: "복사"
|
||||||
|
overview: "요약"
|
||||||
logs: "로그"
|
logs: "로그"
|
||||||
|
delayed: "지연"
|
||||||
database: "데이터베이스"
|
database: "데이터베이스"
|
||||||
channel: "채널"
|
channel: "채널"
|
||||||
|
create: "생성"
|
||||||
|
notificationSetting: "알림 설정"
|
||||||
|
notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요."
|
||||||
|
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용되니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
|
||||||
|
other: "기타"
|
||||||
|
regenerateLoginToken: "로그인 토큰을 재생성"
|
||||||
|
regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다."
|
||||||
|
setMultipleBySeparatingWithSpace: "공백으로 구분하여 여러 개 설정할 수 있습니다."
|
||||||
|
fileIdOrUrl: "파일 ID 또는 URL"
|
||||||
|
chatOpenBehavior: "대화를 열 때의 동작"
|
||||||
|
behavior: "동작"
|
||||||
|
sample: "예시"
|
||||||
|
abuseReports: "신고"
|
||||||
|
reportAbuse: "신고"
|
||||||
|
reportAbuseOf: "{name}을 신고하기"
|
||||||
|
fillAbuseReportDescription: "신고하려는 이유를 자세히 알려주세요. 특정 게시물을 신고할 때에는 게시물의 URL도 포함해 주세요."
|
||||||
|
abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
|
||||||
|
send: "전송"
|
||||||
|
openInNewTab: "새 탭에서 열기"
|
||||||
random: "랜덤"
|
random: "랜덤"
|
||||||
|
system: "시스템"
|
||||||
|
switchUi: "UI 전환"
|
||||||
|
desktop: "데스크탑"
|
||||||
|
clip: "클립"
|
||||||
|
createNew: "새로 만들기"
|
||||||
|
optional: "옵션"
|
||||||
|
createNewClip: "새 클립 만들기"
|
||||||
public: "공개"
|
public: "공개"
|
||||||
|
manageAccessTokens: "액세스 토큰 관리"
|
||||||
|
yes: "예"
|
||||||
|
no: "아니오"
|
||||||
|
driveUsage: "드라이브 사용량"
|
||||||
|
noCrawle: "검색엔진의 인덱싱 거부"
|
||||||
|
noCrawleDescription: "검색엔진에 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다."
|
||||||
|
lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공개 범위를 '팔로워'로 하지 않는 한 누구나 당신의 노트를 볼 수 있습니다."
|
||||||
|
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
|
||||||
|
emailVerified: "메일 주소가 확인되었습니다."
|
||||||
|
clips: "클립"
|
||||||
|
clearCache: "캐시 비우기"
|
||||||
|
value: "값"
|
||||||
|
_registry:
|
||||||
|
key: "키"
|
||||||
|
keys: "키"
|
||||||
|
_nsfw:
|
||||||
|
ignore: "열람 주의 미디어 항상 표시"
|
||||||
_mfm:
|
_mfm:
|
||||||
|
cheatSheet: "MFM 도움말"
|
||||||
|
intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
|
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
|
||||||
hashtag: "해시태그"
|
hashtag: "해시태그"
|
||||||
|
hashtagDescription: "샵 또는 우물정자(#)를 앞에 붙여서 해시태그를 나타낼 수 있습니다."
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "URL을 나타낼 수 있습니다."
|
||||||
link: "링크"
|
link: "링크"
|
||||||
|
boldDescription: "문자를 굵게 강조합니다."
|
||||||
|
smallDescription: "내용을 작고 연하게 보이게 합니다."
|
||||||
center: "가운데 정렬"
|
center: "가운데 정렬"
|
||||||
|
centerDescription: "내용을 가운데 정렬로 보이게 합니다."
|
||||||
|
inlineCode: "코드(인라인)"
|
||||||
|
blockCode: "코드(블록)"
|
||||||
|
inlineMath: "수식(인라인)"
|
||||||
|
inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다."
|
||||||
|
blockMath: "수식(블록)"
|
||||||
|
blockMathDescription: "여러 줄의 수식(KaTeX)를 블록으로 보이게 합니다."
|
||||||
quote: "인용"
|
quote: "인용"
|
||||||
emoji: "커스텀 이모지"
|
emoji: "커스텀 이모지"
|
||||||
|
emojiDescription: "커스텀 이모지의 이름을 쌍점(:)으로 감싸서 커스텀 이모지를 사용합니다."
|
||||||
search: "검색"
|
search: "검색"
|
||||||
|
searchDescription: "주어진 키워드가 입력된 검색창을 보이게 합니다."
|
||||||
|
flip: "플립"
|
||||||
|
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
|
||||||
|
jump: "애니메이션(점프)"
|
||||||
|
font: "폰트"
|
||||||
_reversi:
|
_reversi:
|
||||||
|
reversi: "리버시"
|
||||||
|
gameSettings: "대국 설정"
|
||||||
|
chooseBoard: "보드 선택"
|
||||||
|
blackOrWhite: "선공/후공"
|
||||||
|
blackIs: "{name}님이 흑(선공)"
|
||||||
|
rules: "규칙"
|
||||||
|
botSettings: "Bot 설정"
|
||||||
|
thisGameIsStartedSoon: "잠시 후에 대국이 시작됩니다"
|
||||||
|
waitingForOther: "상대의 준비가 완료될 때까지 기다리고 있습니다"
|
||||||
|
waitingForMe: "당신의 준비 완료를 기다리고 있습니다"
|
||||||
|
ready: "준비 완료"
|
||||||
|
myTurn: "당신의 차례입니다"
|
||||||
|
turnOf: "{name}님의 차례입니다"
|
||||||
|
pastTurnOf: "{name}님의 차례"
|
||||||
|
surrender: "기권"
|
||||||
|
surrendered: "기권에 의해"
|
||||||
|
drawn: "무승부"
|
||||||
|
won: "{name}님의 승리"
|
||||||
|
black: "흑"
|
||||||
|
white: "백"
|
||||||
total: "합계"
|
total: "합계"
|
||||||
|
turnCount: "{count}턴 째"
|
||||||
|
myGames: "내 대국"
|
||||||
|
allGames: "모두의 대국"
|
||||||
|
ended: "종료"
|
||||||
|
playing: "지금 대국 중"
|
||||||
|
isLlotheo: "돌이 적은 사람이 승리 (llotheo)"
|
||||||
|
loopedMap: "루프 지도"
|
||||||
|
canPutEverywhere: "어디에나 놓을 수 있음"
|
||||||
|
_instanceTicker:
|
||||||
|
none: "보이지 않음"
|
||||||
|
remote: "리모트 유저에게만 보이기"
|
||||||
|
always: "항상 보이기"
|
||||||
_channel:
|
_channel:
|
||||||
create: "채널 생성"
|
create: "채널 생성"
|
||||||
setBanner: "배너 설정"
|
setBanner: "배너 설정"
|
||||||
@ -571,10 +692,11 @@ _channel:
|
|||||||
usersCount: "{n}명 참여 중"
|
usersCount: "{n}명 참여 중"
|
||||||
notesCount: "{n}노트"
|
notesCount: "{n}노트"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
icon: "아바타"
|
icon: "아이콘"
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "뮤트할 단어"
|
muteWords: "뮤트할 단어"
|
||||||
|
muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다。"
|
||||||
mutedNotes: "뮤트된 노트"
|
mutedNotes: "뮤트된 노트"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "테마 찾아보기"
|
explore: "테마 찾아보기"
|
||||||
@ -719,6 +841,8 @@ _widgets:
|
|||||||
digitalClock: "디지털 시계"
|
digitalClock: "디지털 시계"
|
||||||
federation: "연합"
|
federation: "연합"
|
||||||
postForm: "글 입력란"
|
postForm: "글 입력란"
|
||||||
|
button: "버튼"
|
||||||
|
jobQueue: "작업 대기열"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
show: "더 보기"
|
show: "더 보기"
|
||||||
@ -772,7 +896,6 @@ _profile:
|
|||||||
username: "유저명"
|
username: "유저명"
|
||||||
description: "자기소개"
|
description: "자기소개"
|
||||||
youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다."
|
youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다."
|
||||||
metadata: "추가 정보"
|
|
||||||
metadataLabel: "라벨"
|
metadataLabel: "라벨"
|
||||||
metadataContent: "내용"
|
metadataContent: "내용"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
@ -946,6 +1069,8 @@ _pages:
|
|||||||
id: "캔버스 ID"
|
id: "캔버스 ID"
|
||||||
width: "폭"
|
width: "폭"
|
||||||
height: "높이"
|
height: "높이"
|
||||||
|
_note:
|
||||||
|
detailed: "세부 정보 보기"
|
||||||
switch: "스위치"
|
switch: "스위치"
|
||||||
_switch:
|
_switch:
|
||||||
name: "변수명"
|
name: "변수명"
|
||||||
|
1159
locales/pl-PL.yml
@ -1,2 +1,31 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Português"
|
_lang_: "Português"
|
||||||
|
monthAndDay: "{day}/{month}"
|
||||||
|
search: "Pesquisar"
|
||||||
|
notifications: "Notificações"
|
||||||
|
username: "Nome de usuário"
|
||||||
|
password: "Senha"
|
||||||
|
ok: "OK"
|
||||||
|
cancel: "Cancelar"
|
||||||
|
enterUsername: "Digite o nome de usuário"
|
||||||
|
renotedBy: "Repostado por {user}"
|
||||||
|
settings: "Configurações"
|
||||||
|
basicSettings: "Configurações básicas"
|
||||||
|
otherSettings: "Outras configurações"
|
||||||
|
profile: "Perfil"
|
||||||
|
timeline: "Timeline"
|
||||||
|
smtpUser: "Nome de usuário"
|
||||||
|
smtpPass: "Senha"
|
||||||
|
_mfm:
|
||||||
|
search: "Pesquisar"
|
||||||
|
_sfx:
|
||||||
|
notification: "Notificações"
|
||||||
|
_widgets:
|
||||||
|
notifications: "Notificações"
|
||||||
|
timeline: "Timeline"
|
||||||
|
_profile:
|
||||||
|
username: "Nome de usuário"
|
||||||
|
_deck:
|
||||||
|
_columns:
|
||||||
|
notifications: "Notificações"
|
||||||
|
tl: "Timeline"
|
||||||
|
@ -33,6 +33,9 @@ addUser: "Добавить пользователя"
|
|||||||
favorite: "В избранное"
|
favorite: "В избранное"
|
||||||
favorites: "Избранное"
|
favorites: "Избранное"
|
||||||
unfavorite: "Убрать из избранного"
|
unfavorite: "Убрать из избранного"
|
||||||
|
favorited: "Добавлено в избранное."
|
||||||
|
alreadyFavorited: "Уже есть в избранном."
|
||||||
|
cantFavorite: "Не удалось добавить в избранное."
|
||||||
pin: "Закрепить в профиле"
|
pin: "Закрепить в профиле"
|
||||||
unpin: "Открепить от профиля"
|
unpin: "Открепить от профиля"
|
||||||
copyContent: "Скопировать содержимое"
|
copyContent: "Скопировать содержимое"
|
||||||
@ -46,6 +49,7 @@ copyUsername: "Скопировать имя пользователя"
|
|||||||
searchUser: "Поиск людей"
|
searchUser: "Поиск людей"
|
||||||
reply: "Ответить"
|
reply: "Ответить"
|
||||||
loadMore: "Показать еще"
|
loadMore: "Показать еще"
|
||||||
|
showMore: "Показать еще"
|
||||||
youGotNewFollower: "Новый подписчик"
|
youGotNewFollower: "Новый подписчик"
|
||||||
receiveFollowRequest: "Получен запрос на подписку"
|
receiveFollowRequest: "Получен запрос на подписку"
|
||||||
followRequestAccepted: "Запрос на подписку принят"
|
followRequestAccepted: "Запрос на подписку принят"
|
||||||
@ -87,6 +91,9 @@ followRequestPending: "Нерассмотренный запрос на подп
|
|||||||
enterEmoji: "Введите эмодзи"
|
enterEmoji: "Введите эмодзи"
|
||||||
renote: "Репост"
|
renote: "Репост"
|
||||||
unrenote: "Отмена репоста"
|
unrenote: "Отмена репоста"
|
||||||
|
renoted: "Репост совершён."
|
||||||
|
cantRenote: "Это нельзя репостить."
|
||||||
|
cantReRenote: "Невозможно репостить репост."
|
||||||
quote: "Цитата"
|
quote: "Цитата"
|
||||||
pinnedNote: "Закреплённая заметка"
|
pinnedNote: "Закреплённая заметка"
|
||||||
you: "Вы"
|
you: "Вы"
|
||||||
@ -95,7 +102,7 @@ sensitive: "Содержимое не для всех"
|
|||||||
add: "Добавить"
|
add: "Добавить"
|
||||||
reaction: "Реакции"
|
reaction: "Реакции"
|
||||||
reactionSettingDescription: "Подберите, что будет у вас в палитре реакций"
|
reactionSettingDescription: "Подберите, что будет у вас в палитре реакций"
|
||||||
reactionSettingDescription2: "Меняйте порядок перетаскиванием. Удаляйте нажатием."
|
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
|
||||||
rememberNoteVisibility: "Запоминать видимость заметок"
|
rememberNoteVisibility: "Запоминать видимость заметок"
|
||||||
attachCancel: "Удалить вложение"
|
attachCancel: "Удалить вложение"
|
||||||
markAsSensitive: "Отметить как «не для всех»"
|
markAsSensitive: "Отметить как «не для всех»"
|
||||||
@ -125,7 +132,9 @@ settingGuide: "Рекомендуемые настройки"
|
|||||||
cacheRemoteFiles: "Кешировать внешние файлы"
|
cacheRemoteFiles: "Кешировать внешние файлы"
|
||||||
cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик, так как не будут создаваться эскизы."
|
cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик, так как не будут создаваться эскизы."
|
||||||
flagAsBot: "Аккаунт бота"
|
flagAsBot: "Аккаунт бота"
|
||||||
|
flagAsBotDescription: "Включите, если этот аккаунт управляется программой. Это позволит системе Misskey учитывать это, а также поможет разработчикам других ботов предотвратить бесконечные циклы взаимодействия."
|
||||||
flagAsCat: "Аккаунт кота"
|
flagAsCat: "Аккаунт кота"
|
||||||
|
flagAsCatDescription: "Включите, и этот аккаунт будет помечен как кошачий."
|
||||||
autoAcceptFollowed: "Принимать подписчиков автоматически"
|
autoAcceptFollowed: "Принимать подписчиков автоматически"
|
||||||
addAcount: "Добавить аккаунт"
|
addAcount: "Добавить аккаунт"
|
||||||
loginFailed: "Неудачная попытка входа"
|
loginFailed: "Неудачная попытка входа"
|
||||||
@ -206,7 +215,7 @@ newPassword: "Новый пароль"
|
|||||||
newPasswordRetype: "Новый пароль (ещё раз)"
|
newPasswordRetype: "Новый пароль (ещё раз)"
|
||||||
attachFile: "Прикрепить файлы"
|
attachFile: "Прикрепить файлы"
|
||||||
more: "Ещё!"
|
more: "Ещё!"
|
||||||
featured: "Подборка"
|
featured: "Горячее"
|
||||||
usernameOrUserId: "Имя или идентификатор пользователя"
|
usernameOrUserId: "Имя или идентификатор пользователя"
|
||||||
noSuchUser: "Таких пользователей не найдено"
|
noSuchUser: "Таких пользователей не найдено"
|
||||||
lookup: "Запрос"
|
lookup: "Запрос"
|
||||||
@ -318,6 +327,8 @@ pinnedUsers: "Прикреплённый пользователь"
|
|||||||
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"."
|
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"."
|
||||||
pinnedPages: "Закрепленные страницы"
|
pinnedPages: "Закрепленные страницы"
|
||||||
pinnedPagesDescription: "Если хотите закрепить страницы на главной сайта, сюда можно добавить пути к ним, каждый в отдельной строке."
|
pinnedPagesDescription: "Если хотите закрепить страницы на главной сайта, сюда можно добавить пути к ним, каждый в отдельной строке."
|
||||||
|
pinnedClipId: "Идентификатор закреплённой памятки"
|
||||||
|
pinnedNotes: "Закреплённая заметка"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Включить hCaptcha"
|
enableHcaptcha: "Включить hCaptcha"
|
||||||
hcaptchaSiteKey: "Ключ сайта"
|
hcaptchaSiteKey: "Ключ сайта"
|
||||||
@ -358,13 +369,6 @@ popularTags: "Популярные теги"
|
|||||||
userList: "Списки"
|
userList: "Списки"
|
||||||
about: "Описание"
|
about: "Описание"
|
||||||
aboutMisskey: "О Misskey"
|
aboutMisskey: "О Misskey"
|
||||||
aboutMisskeyText: "Misskey - это программное обеспечение с открытым исходным кодом, разрабатываемое syuilo с 2014 года."
|
|
||||||
misskeyMembers: "В настоящее время он разрабатывается и поддерживается следующими участниками:"
|
|
||||||
misskeySource: "Исходный код доступен здесь:"
|
|
||||||
misskeyTranslation: "Помогите нам перевести Misskey:"
|
|
||||||
misskeyDonate: "Вы можете поддержать развитие, пожертвовав Misskey:"
|
|
||||||
morePatrons: "Есть много других, кто поддержал нас. Спасибо 🥰."
|
|
||||||
patrons: "Поддержавшие"
|
|
||||||
administrator: "Администратор"
|
administrator: "Администратор"
|
||||||
token: "Токен"
|
token: "Токен"
|
||||||
twoStepAuthentication: "Двухфакторная аутентификация"
|
twoStepAuthentication: "Двухфакторная аутентификация"
|
||||||
@ -439,6 +443,7 @@ useOsNativeEmojis: "Использовать эмодзи операционно
|
|||||||
youHaveNoGroups: "У вас нет ни одной группы"
|
youHaveNoGroups: "У вас нет ни одной группы"
|
||||||
joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные"
|
joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные"
|
||||||
noHistory: "История пока пуста"
|
noHistory: "История пока пуста"
|
||||||
|
signinHistory: "Журнал посещений"
|
||||||
disableAnimatedMfm: "Отключение анимированной разметки MFM"
|
disableAnimatedMfm: "Отключение анимированной разметки MFM"
|
||||||
doing: "В процессе"
|
doing: "В процессе"
|
||||||
category: "Категория"
|
category: "Категория"
|
||||||
@ -491,6 +496,7 @@ none: "Ничего"
|
|||||||
showInPage: "Показать страницу"
|
showInPage: "Показать страницу"
|
||||||
popout: "Развернуть"
|
popout: "Развернуть"
|
||||||
volume: "Громкость"
|
volume: "Громкость"
|
||||||
|
masterVolume: "Основная регулировка громкости"
|
||||||
details: "Подробнее"
|
details: "Подробнее"
|
||||||
chooseEmoji: "Выберите эмодзи"
|
chooseEmoji: "Выберите эмодзи"
|
||||||
unableToProcess: "Не удаётся завершить операцию"
|
unableToProcess: "Не удаётся завершить операцию"
|
||||||
@ -548,6 +554,9 @@ useBlurEffectForModal: "Размывка под формой поверх все
|
|||||||
useFullReactionPicker: "Полнофункциональный выбор реакций"
|
useFullReactionPicker: "Полнофункциональный выбор реакций"
|
||||||
width: "Ширина"
|
width: "Ширина"
|
||||||
height: "Высота"
|
height: "Высота"
|
||||||
|
large: "Крупно"
|
||||||
|
medium: "Средне"
|
||||||
|
small: "Мелко"
|
||||||
generateAccessToken: "Создать токен доступа"
|
generateAccessToken: "Создать токен доступа"
|
||||||
permission: "Разрешения"
|
permission: "Разрешения"
|
||||||
enableAll: "Включить все"
|
enableAll: "Включить все"
|
||||||
@ -560,7 +569,8 @@ useStarForReactionFallback: "Ставить ★ в качестве реакци
|
|||||||
emailConfig: "Настройки почтового сервера"
|
emailConfig: "Настройки почтового сервера"
|
||||||
enableEmail: "Включить обмен электронной почтой"
|
enableEmail: "Включить обмен электронной почтой"
|
||||||
emailConfigInfo: "Используется для подтверждения адреса электронной почты и сброса пароля."
|
emailConfigInfo: "Используется для подтверждения адреса электронной почты и сброса пароля."
|
||||||
email: "Адрес электронной почты"
|
email: "Электронная почта"
|
||||||
|
emailAddress: "Адрес электронной почты"
|
||||||
smtpConfig: "Конфигурация SMTP-сервера"
|
smtpConfig: "Конфигурация SMTP-сервера"
|
||||||
smtpHost: "Хост"
|
smtpHost: "Хост"
|
||||||
smtpPort: "Порт"
|
smtpPort: "Порт"
|
||||||
@ -592,6 +602,7 @@ regenerateLoginTokenDescription: "Создаёт новый токен, испо
|
|||||||
setMultipleBySeparatingWithSpace: "Можно написать несколько через пробел"
|
setMultipleBySeparatingWithSpace: "Можно написать несколько через пробел"
|
||||||
fileIdOrUrl: "Идентификатор файла или ссылка"
|
fileIdOrUrl: "Идентификатор файла или ссылка"
|
||||||
chatOpenBehavior: "Поведение окна чата при открытии"
|
chatOpenBehavior: "Поведение окна чата при открытии"
|
||||||
|
behavior: "Поведение"
|
||||||
sample: "Пример"
|
sample: "Пример"
|
||||||
abuseReports: "Жалобы"
|
abuseReports: "Жалобы"
|
||||||
reportAbuse: "Жалоба"
|
reportAbuse: "Жалоба"
|
||||||
@ -615,6 +626,74 @@ createNew: "Новый документ"
|
|||||||
optional: "Необязательно"
|
optional: "Необязательно"
|
||||||
createNewClip: "Новая памятка"
|
createNewClip: "Новая памятка"
|
||||||
public: "Общедоступно"
|
public: "Общедоступно"
|
||||||
|
i18nInfo: "Misskey переводят на разные языки добровольцы со всего света. Ваша помощь тоже пригодится здесь: {link}."
|
||||||
|
manageAccessTokens: "Управление токенами доступа"
|
||||||
|
accountInfo: "Сведения об учётной записи"
|
||||||
|
notesCount: "Количество заметок"
|
||||||
|
repliesCount: "Сколько раз пользователь кому-то ответил"
|
||||||
|
renotesCount: "Сколько раз пользователь передал чужие заметки"
|
||||||
|
repliedCount: "Сколько раз ответили пользователю"
|
||||||
|
renotedCount: "Сколько раз передавали заметки пользователя"
|
||||||
|
followingCount: "Количество подписок"
|
||||||
|
followersCount: "Количество подписавшихся"
|
||||||
|
sentReactionsCount: "Сколько раз пользователь отреагировал"
|
||||||
|
receivedReactionsCount: "Сколько раз отреагировали на заметки пользователя"
|
||||||
|
pollVotesCount: "Сколько раз участвовал в опросах"
|
||||||
|
pollVotedCount: "Сколько раз участвовали в опросах пользователя"
|
||||||
|
yes: "Да"
|
||||||
|
no: "Нет"
|
||||||
|
driveFilesCount: "Количество файлов на диске"
|
||||||
|
driveUsage: "Сколько места занято на диске"
|
||||||
|
noCrawle: "Паукам вход воспрещён"
|
||||||
|
noCrawleDescription: "Просьба поисковым системам не ходить по вашему профилю, по заметкам, страницам и не индексировать их."
|
||||||
|
lockedAccountInfo: "Даже если вы вручную подтверждаете подписки, кто угодно может читать ваши заметки, если вы не отмечаете их «для подписчиков»."
|
||||||
|
alwaysMarkSensitive: "Отмечать файлы как «содержимое не для всех» по умолчанию"
|
||||||
|
loadRawImages: "Сразу показывать изображения в полном размере"
|
||||||
|
disableShowingAnimatedImages: "Не проигрывать анимацию"
|
||||||
|
verificationEmailSent: "Вам отправлено письмо для подтверждения. Пройдите, пожалуйста, по ссылке из письма, чтобы завершить проверку."
|
||||||
|
notSet: "Не настроено"
|
||||||
|
emailVerified: "Адрес электронной почты подтверждён."
|
||||||
|
noteFavoritesCount: "Количество добавленного в избранное"
|
||||||
|
pageLikesCount: "Количество понравившихся страниц"
|
||||||
|
pageLikedCount: "Количество страниц, понравившихся другим"
|
||||||
|
reversiCount: "Количество сыгранных игр в реверси"
|
||||||
|
contact: "Как связаться"
|
||||||
|
useSystemFont: "Использовать шрифт, предлагаемый системой"
|
||||||
|
clips: "Памятки"
|
||||||
|
experimentalFeatures: "Экспериментальные функции"
|
||||||
|
developer: "Разработчик"
|
||||||
|
makeExplorable: "Опубликовать профиль в «Обзоре»."
|
||||||
|
makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»."
|
||||||
|
showGapBetweenNotesInTimeline: "Показывать разделитель между заметками в ленте"
|
||||||
|
duplicate: "Дубликат"
|
||||||
|
left: "Влево"
|
||||||
|
center: "По центру"
|
||||||
|
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
|
||||||
|
showTitlebar: "Показать заголовок"
|
||||||
|
clearCache: "Очистить кэш"
|
||||||
|
onlineUsersCount: "Пользователей сейчас в сети: {n}"
|
||||||
|
nUsers: "Пользователей: {n}"
|
||||||
|
nNotes: "Заметок: {n}"
|
||||||
|
backgroundColor: "Фон"
|
||||||
|
accentColor: "Акцент"
|
||||||
|
textColor: "Текст"
|
||||||
|
value: "Значения"
|
||||||
|
_registry:
|
||||||
|
key: "Ключ"
|
||||||
|
keys: "Ключ"
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey — программа с открытым исходным кодом, которую разрабатывает syuilo с 2014 года."
|
||||||
|
contributors: "Основные соавторы"
|
||||||
|
allContributors: "Все соавторы"
|
||||||
|
source: "Исходный код"
|
||||||
|
translation: "Перевод Misskey"
|
||||||
|
donate: "Пожертвование на Misskey"
|
||||||
|
morePatrons: "Большое спасибо и многим другим, кто принял участие в этом проекте! 🥰"
|
||||||
|
patrons: "Материальная поддержка"
|
||||||
|
_nsfw:
|
||||||
|
respect: "Скрывать содержимое не для всех"
|
||||||
|
ignore: "Показывать содержимое не для всех"
|
||||||
|
force: "Скрывать вообще все файлы"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "Подсказка по разметке MFM"
|
cheatSheet: "Подсказка по разметке MFM"
|
||||||
intro: "MFM — язык оформления текста, придуманный специально для Misskey, который здесь можно много где использовать. На этой странице собраны и кратко изложены способы его применения."
|
intro: "MFM — язык оформления текста, придуманный специально для Misskey, который здесь можно много где использовать. На этой странице собраны и кратко изложены способы его применения."
|
||||||
@ -663,6 +742,7 @@ _mfm:
|
|||||||
twitchDescription: "Заставляет трястись как одержимого"
|
twitchDescription: "Заставляет трястись как одержимого"
|
||||||
spin: "Вращение"
|
spin: "Вращение"
|
||||||
spinDescription: "Так можно крутить содержимое в разных направлениях."
|
spinDescription: "Так можно крутить содержимое в разных направлениях."
|
||||||
|
font: "Шрифт"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Реверси"
|
reversi: "Реверси"
|
||||||
gameSettings: "Настройки игры"
|
gameSettings: "Настройки игры"
|
||||||
@ -709,9 +789,9 @@ _channel:
|
|||||||
edit: "Редактировать канал"
|
edit: "Редактировать канал"
|
||||||
setBanner: "Установить баннер"
|
setBanner: "Установить баннер"
|
||||||
removeBanner: "Удалить баннер"
|
removeBanner: "Удалить баннер"
|
||||||
featured: "Из подборки"
|
featured: "Актуальные"
|
||||||
owned: "Владелец"
|
owned: "Собственные"
|
||||||
following: "Читаю"
|
following: "Подписки"
|
||||||
usersCount: "Участников: {n}"
|
usersCount: "Участников: {n}"
|
||||||
notesCount: "Заметок: {n}"
|
notesCount: "Заметок: {n}"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
@ -733,6 +813,8 @@ _theme:
|
|||||||
manage: "Менеджер тем"
|
manage: "Менеджер тем"
|
||||||
code: "Код темы"
|
code: "Код темы"
|
||||||
installed: "Тема «{name}» установлена."
|
installed: "Тема «{name}» установлена."
|
||||||
|
installedThemes: "Установленные темы"
|
||||||
|
builtinThemes: "Встроенные темы"
|
||||||
alreadyInstalled: "Тема уже установлена."
|
alreadyInstalled: "Тема уже установлена."
|
||||||
invalid: "Формат темы некорректный."
|
invalid: "Формат темы некорректный."
|
||||||
make: "Создать тему"
|
make: "Создать тему"
|
||||||
@ -806,6 +888,8 @@ _sfx:
|
|||||||
chatBg: "Сообщения (фон)"
|
chatBg: "Сообщения (фон)"
|
||||||
antenna: "Антенна"
|
antenna: "Антенна"
|
||||||
channel: "Канал"
|
channel: "Канал"
|
||||||
|
reversiPutBlack: "Реверси — ход чёрных"
|
||||||
|
reversiPutWhite: "Реверси — ход белых"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Когда-то"
|
unknown: "Когда-то"
|
||||||
future: "Из будущего"
|
future: "Из будущего"
|
||||||
@ -917,6 +1001,10 @@ _widgets:
|
|||||||
digitalClock: "Цифровые часы"
|
digitalClock: "Цифровые часы"
|
||||||
federation: "Федерация"
|
federation: "Федерация"
|
||||||
postForm: "Форма отправки"
|
postForm: "Форма отправки"
|
||||||
|
slideshow: "Показ слайдов"
|
||||||
|
button: "Кнопка"
|
||||||
|
onlineUsers: "Пользователи сейчас с сети"
|
||||||
|
jobQueue: "Очередь заданий"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Спрятать"
|
hide: "Спрятать"
|
||||||
show: "Показать еще"
|
show: "Показать еще"
|
||||||
@ -948,13 +1036,13 @@ _visibility:
|
|||||||
public: "Общедоступно"
|
public: "Общедоступно"
|
||||||
publicDescription: "Открыто для всех"
|
publicDescription: "Открыто для всех"
|
||||||
home: "Домашняя"
|
home: "Домашняя"
|
||||||
homeDescription: "Не появится в общих лентах (локальной и глобальной)"
|
homeDescription: "Не для общих лент"
|
||||||
followers: "Для подписчиков"
|
followers: "Для подписчиков"
|
||||||
followersDescription: "Увидят только ваши подписчики"
|
followersDescription: "Только вашим подписчикам"
|
||||||
specified: "Личное"
|
specified: "Личное"
|
||||||
specifiedDescription: "Только для тех, кого укажете"
|
specifiedDescription: "Тем, кого укажете"
|
||||||
localOnly: "Локально"
|
localOnly: "Локально"
|
||||||
localOnlyDescription: "Увидят только пользователи этого сайта"
|
localOnlyDescription: "Только для этого сайта"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Ответ на заметку..."
|
replyPlaceholder: "Ответ на заметку..."
|
||||||
quotePlaceholder: "Пояснение к цитате..."
|
quotePlaceholder: "Пояснение к цитате..."
|
||||||
@ -971,9 +1059,13 @@ _profile:
|
|||||||
username: "Имя пользователя"
|
username: "Имя пользователя"
|
||||||
description: "О себе"
|
description: "О себе"
|
||||||
youCanIncludeHashtags: "Можете использовать здесь хэштеги"
|
youCanIncludeHashtags: "Можете использовать здесь хэштеги"
|
||||||
metadata: "Всякое"
|
metadata: "Дополнительные сведения"
|
||||||
|
metadataEdit: "Редактировать дополнительные сведения"
|
||||||
|
metadataDescription: "Можно добавить до четырёх дополнительных граф в профиль."
|
||||||
metadataLabel: "Метка"
|
metadataLabel: "Метка"
|
||||||
metadataContent: "Содержимое"
|
metadataContent: "Содержимое"
|
||||||
|
changeAvatar: "Поменять аватар"
|
||||||
|
changeBanner: "Поменять изображение в шапке"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Все записи\n"
|
allNotes: "Все записи\n"
|
||||||
followingList: "Подписки"
|
followingList: "Подписки"
|
||||||
@ -1395,6 +1487,8 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Всегда показывать главную колонку"
|
alwaysShowMainColumn: "Всегда показывать главную колонку"
|
||||||
columnAlign: "Выравнивание колонок"
|
columnAlign: "Выравнивание колонок"
|
||||||
|
columnMargin: "Расстояние между колонками"
|
||||||
|
columnHeaderHeight: "Высота заголовка колонки"
|
||||||
addColumn: "Добавить колонку"
|
addColumn: "Добавить колонку"
|
||||||
swapLeft: "Переставить левее"
|
swapLeft: "Переставить левее"
|
||||||
swapRight: "Переставить правее"
|
swapRight: "Переставить правее"
|
||||||
@ -1403,6 +1497,7 @@ _deck:
|
|||||||
stackLeft: "В столбик влево"
|
stackLeft: "В столбик влево"
|
||||||
popRight: "Из столбика вправо"
|
popRight: "Из столбика вправо"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "Основная"
|
||||||
widgets: "Виджеты"
|
widgets: "Виджеты"
|
||||||
notifications: "Уведомления"
|
notifications: "Уведомления"
|
||||||
tl: "Лента"
|
tl: "Лента"
|
||||||
|
1
locales/th-TH.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
---
|
1051
locales/uk-UA.yml
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
_lang_: "中文(简体)"
|
_lang_: "中文(简体)"
|
||||||
|
headlineMisskey: "通过帖子连接在一起的网络"
|
||||||
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀"
|
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "搜索"
|
search: "搜索"
|
||||||
@ -11,7 +12,7 @@ ok: "OK"
|
|||||||
gotIt: "我明白了"
|
gotIt: "我明白了"
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "输入用户名"
|
enterUsername: "输入用户名"
|
||||||
renotedBy: "{user} 转贴了"
|
renotedBy: "{user} 转发了"
|
||||||
noNotes: "没有帖文"
|
noNotes: "没有帖文"
|
||||||
noNotifications: "无通知"
|
noNotifications: "无通知"
|
||||||
instance: "实例"
|
instance: "实例"
|
||||||
@ -33,6 +34,9 @@ addUser: "添加用户"
|
|||||||
favorite: "收藏"
|
favorite: "收藏"
|
||||||
favorites: "收藏"
|
favorites: "收藏"
|
||||||
unfavorite: "取消收藏"
|
unfavorite: "取消收藏"
|
||||||
|
favorited: "已加入收藏夹。"
|
||||||
|
alreadyFavorited: "收藏夹中已存在。"
|
||||||
|
cantFavorite: "无法添加到收藏夹。"
|
||||||
pin: "置顶"
|
pin: "置顶"
|
||||||
unpin: "取消置顶"
|
unpin: "取消置顶"
|
||||||
copyContent: "复制内容"
|
copyContent: "复制内容"
|
||||||
@ -46,6 +50,7 @@ copyUsername: "复制用户名"
|
|||||||
searchUser: "搜索用户"
|
searchUser: "搜索用户"
|
||||||
reply: "回复"
|
reply: "回复"
|
||||||
loadMore: "查看更多"
|
loadMore: "查看更多"
|
||||||
|
showMore: "查看更多"
|
||||||
youGotNewFollower: "你有新的关注者"
|
youGotNewFollower: "你有新的关注者"
|
||||||
receiveFollowRequest: "您收到了关注请求"
|
receiveFollowRequest: "您收到了关注请求"
|
||||||
followRequestAccepted: "您的关注请求被通过了"
|
followRequestAccepted: "您的关注请求被通过了"
|
||||||
@ -87,6 +92,9 @@ followRequestPending: "发送关注申请"
|
|||||||
enterEmoji: "输入表情符号"
|
enterEmoji: "输入表情符号"
|
||||||
renote: "转发"
|
renote: "转发"
|
||||||
unrenote: "取消转发"
|
unrenote: "取消转发"
|
||||||
|
renoted: "已转发。"
|
||||||
|
cantRenote: "该帖子无法转发。"
|
||||||
|
cantReRenote: "转发无法被再次转发。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "已置顶的帖子"
|
pinnedNote: "已置顶的帖子"
|
||||||
you: "您"
|
you: "您"
|
||||||
@ -95,7 +103,7 @@ sensitive: "阅读注意"
|
|||||||
add: "添加"
|
add: "添加"
|
||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
reactionSettingDescription: "选择您想要置顶的回应。"
|
reactionSettingDescription: "选择您想要置顶的回应。"
|
||||||
reactionSettingDescription2: "通过拖动来重新排列。单击即可删除。"
|
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||||
rememberNoteVisibility: "记录公开范围"
|
rememberNoteVisibility: "记录公开范围"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
markAsSensitive: "阅读注意"
|
markAsSensitive: "阅读注意"
|
||||||
@ -103,12 +111,12 @@ unmarkAsSensitive: "取消标记为敏感内容"
|
|||||||
enterFileName: "请输入文件名"
|
enterFileName: "请输入文件名"
|
||||||
mute: "屏蔽"
|
mute: "屏蔽"
|
||||||
unmute: "解除屏蔽"
|
unmute: "解除屏蔽"
|
||||||
block: "屏蔽"
|
block: "拉黑"
|
||||||
unblock: "取消屏蔽"
|
unblock: "取消拉黑"
|
||||||
suspend: "冻结"
|
suspend: "冻结"
|
||||||
unsuspend: "解除冻结"
|
unsuspend: "解除冻结"
|
||||||
blockConfirm: "确定要屏蔽吗?"
|
blockConfirm: "确定要拉黑吗?"
|
||||||
unblockConfirm: "确定要解除屏蔽吗?"
|
unblockConfirm: "确定要解除拉黑吗?"
|
||||||
suspendConfirm: "要冻结吗?"
|
suspendConfirm: "要冻结吗?"
|
||||||
unsuspendConfirm: "要解除冻结吗?"
|
unsuspendConfirm: "要解除冻结吗?"
|
||||||
selectList: "选择列表"
|
selectList: "选择列表"
|
||||||
@ -116,7 +124,7 @@ selectAntenna: "天线选择"
|
|||||||
selectWidget: "选择小工具"
|
selectWidget: "选择小工具"
|
||||||
editWidgets: "编辑小工具"
|
editWidgets: "编辑小工具"
|
||||||
editWidgetsExit: "完成编辑"
|
editWidgetsExit: "完成编辑"
|
||||||
customEmojis: "自定义Emoji"
|
customEmojis: "自定义表情符号"
|
||||||
emoji: "表情符号"
|
emoji: "表情符号"
|
||||||
emojiName: "表情符号名称"
|
emojiName: "表情符号名称"
|
||||||
emojiUrl: "表情符号地址"
|
emojiUrl: "表情符号地址"
|
||||||
@ -125,7 +133,9 @@ settingGuide: "推荐配置"
|
|||||||
cacheRemoteFiles: "远程文件缓存"
|
cacheRemoteFiles: "远程文件缓存"
|
||||||
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
||||||
flagAsBot: "这个账户是Bot"
|
flagAsBot: "这个账户是Bot"
|
||||||
|
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
|
||||||
flagAsCat: "这个账户是Cat"
|
flagAsCat: "这个账户是Cat"
|
||||||
|
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。"
|
||||||
autoAcceptFollowed: "自动允许关注"
|
autoAcceptFollowed: "自动允许关注"
|
||||||
addAcount: "添加账户"
|
addAcount: "添加账户"
|
||||||
loginFailed: "登录失败"
|
loginFailed: "登录失败"
|
||||||
@ -175,8 +185,8 @@ clearCachedFilesConfirm: "确定要清除缓存文件?"
|
|||||||
blockedInstances: "被阻拦的实例"
|
blockedInstances: "被阻拦的实例"
|
||||||
blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。"
|
blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。"
|
||||||
muteAndBlock: "屏蔽/拉黑"
|
muteAndBlock: "屏蔽/拉黑"
|
||||||
mutedUsers: "禁言用户"
|
mutedUsers: "已屏蔽用户"
|
||||||
blockedUsers: "已屏蔽用户"
|
blockedUsers: "被拉黑的用户"
|
||||||
noUsers: "无用户"
|
noUsers: "无用户"
|
||||||
editProfile: "编辑资料"
|
editProfile: "编辑资料"
|
||||||
noteDeleteConfirm: "要删除该帖子吗?"
|
noteDeleteConfirm: "要删除该帖子吗?"
|
||||||
@ -189,7 +199,7 @@ default: "默认"
|
|||||||
noCustomEmojis: "没有自定义表情符号"
|
noCustomEmojis: "没有自定义表情符号"
|
||||||
noJobs: "没有任务"
|
noJobs: "没有任务"
|
||||||
federating: "联合中"
|
federating: "联合中"
|
||||||
blocked: "已拦截"
|
blocked: "已拉黑"
|
||||||
suspended: "停止推流"
|
suspended: "停止推流"
|
||||||
all: "全部"
|
all: "全部"
|
||||||
subscribing: "已订阅"
|
subscribing: "已订阅"
|
||||||
@ -318,6 +328,8 @@ pinnedUsers: "置顶用户"
|
|||||||
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
||||||
pinnedPages: "固定页面"
|
pinnedPages: "固定页面"
|
||||||
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
||||||
|
pinnedClipId: "置顶的片段ID"
|
||||||
|
pinnedNotes: "已置顶的帖子"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "启用 hCaptcha"
|
enableHcaptcha: "启用 hCaptcha"
|
||||||
hcaptchaSiteKey: "网站密钥"
|
hcaptchaSiteKey: "网站密钥"
|
||||||
@ -358,13 +370,6 @@ popularTags: "热门标签"
|
|||||||
userList: "列表"
|
userList: "列表"
|
||||||
about: "关于"
|
about: "关于"
|
||||||
aboutMisskey: "关于 Misskey"
|
aboutMisskey: "关于 Misskey"
|
||||||
aboutMisskeyText: "Misskey是由syuilo于2014年开发的开源软件。"
|
|
||||||
misskeyMembers: "现在由以下成员进行开发和维护:"
|
|
||||||
misskeySource: "源代码在这里公开:"
|
|
||||||
misskeyTranslation: "与我们一同进行Misskey的翻译工作:"
|
|
||||||
misskeyDonate: "可以向 Misskey 进行捐款以支持开发:"
|
|
||||||
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
|
|
||||||
patrons: "支持者"
|
|
||||||
administrator: "管理员"
|
administrator: "管理员"
|
||||||
token: "令牌"
|
token: "令牌"
|
||||||
twoStepAuthentication: "两步验证"
|
twoStepAuthentication: "两步验证"
|
||||||
@ -439,6 +444,7 @@ useOsNativeEmojis: "使用OS原生表情符号"
|
|||||||
youHaveNoGroups: "没有群组"
|
youHaveNoGroups: "没有群组"
|
||||||
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
||||||
noHistory: "没有历史记录"
|
noHistory: "没有历史记录"
|
||||||
|
signinHistory: "登录历史"
|
||||||
disableAnimatedMfm: "禁用MFM动画"
|
disableAnimatedMfm: "禁用MFM动画"
|
||||||
doing: "正在进行"
|
doing: "正在进行"
|
||||||
category: "类别"
|
category: "类别"
|
||||||
@ -491,6 +497,7 @@ none: "空"
|
|||||||
showInPage: "在页面中显示"
|
showInPage: "在页面中显示"
|
||||||
popout: "弹窗"
|
popout: "弹窗"
|
||||||
volume: "音量"
|
volume: "音量"
|
||||||
|
masterVolume: "主音量"
|
||||||
details: "详情"
|
details: "详情"
|
||||||
chooseEmoji: "选择表情符号"
|
chooseEmoji: "选择表情符号"
|
||||||
unableToProcess: "操作无法完成"
|
unableToProcess: "操作无法完成"
|
||||||
@ -534,7 +541,7 @@ poll: "调查问卷"
|
|||||||
useCw: "隐藏内容"
|
useCw: "隐藏内容"
|
||||||
enablePlayer: "打开播放器"
|
enablePlayer: "打开播放器"
|
||||||
disablePlayer: "关闭播放器"
|
disablePlayer: "关闭播放器"
|
||||||
expandTweet: "展开推文"
|
expandTweet: "展开贴文"
|
||||||
themeEditor: "主题编辑器"
|
themeEditor: "主题编辑器"
|
||||||
description: "描述"
|
description: "描述"
|
||||||
author: "作者"
|
author: "作者"
|
||||||
@ -548,6 +555,9 @@ useBlurEffectForModal: "模态框使用模糊效果"
|
|||||||
useFullReactionPicker: "使用全功能的回应工具栏"
|
useFullReactionPicker: "使用全功能的回应工具栏"
|
||||||
width: "宽度"
|
width: "宽度"
|
||||||
height: "高度"
|
height: "高度"
|
||||||
|
large: "大"
|
||||||
|
medium: "中"
|
||||||
|
small: "小"
|
||||||
generateAccessToken: "生成访问令牌"
|
generateAccessToken: "生成访问令牌"
|
||||||
permission: "权限"
|
permission: "权限"
|
||||||
enableAll: "启用全部"
|
enableAll: "启用全部"
|
||||||
@ -560,7 +570,8 @@ useStarForReactionFallback: "如果回应的是未知表情符号,则使用★
|
|||||||
emailConfig: "邮件服务器设置"
|
emailConfig: "邮件服务器设置"
|
||||||
enableEmail: "启用发送邮件功能"
|
enableEmail: "启用发送邮件功能"
|
||||||
emailConfigInfo: "用于确认电子邮件和密码重置"
|
emailConfigInfo: "用于确认电子邮件和密码重置"
|
||||||
email: "邮件地址"
|
email: "邮箱"
|
||||||
|
emailAddress: "电子邮件地址"
|
||||||
smtpConfig: "SMTP服务器设置"
|
smtpConfig: "SMTP服务器设置"
|
||||||
smtpHost: "主机名"
|
smtpHost: "主机名"
|
||||||
smtpPort: "端口"
|
smtpPort: "端口"
|
||||||
@ -592,6 +603,7 @@ regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通
|
|||||||
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
|
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
|
||||||
fileIdOrUrl: "文件ID或者URL"
|
fileIdOrUrl: "文件ID或者URL"
|
||||||
chatOpenBehavior: "聊天窗口打开时的行为"
|
chatOpenBehavior: "聊天窗口打开时的行为"
|
||||||
|
behavior: "行为"
|
||||||
sample: "示例"
|
sample: "示例"
|
||||||
abuseReports: "举报"
|
abuseReports: "举报"
|
||||||
reportAbuse: "举报"
|
reportAbuse: "举报"
|
||||||
@ -615,6 +627,90 @@ createNew: "新建"
|
|||||||
optional: "可选"
|
optional: "可选"
|
||||||
createNewClip: "新建片段"
|
createNewClip: "新建片段"
|
||||||
public: "公开"
|
public: "公开"
|
||||||
|
i18nInfo: "Misskey已经被志愿者们翻译到了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。"
|
||||||
|
manageAccessTokens: "管理 Access Tokens"
|
||||||
|
accountInfo: "帐户信息"
|
||||||
|
notesCount: "贴文数量"
|
||||||
|
repliesCount: "回复数量"
|
||||||
|
renotesCount: "转贴数量"
|
||||||
|
repliedCount: "回复数"
|
||||||
|
renotedCount: "转发数"
|
||||||
|
followingCount: "正在关注数量"
|
||||||
|
followersCount: "关注者数量"
|
||||||
|
sentReactionsCount: "发送反应数"
|
||||||
|
receivedReactionsCount: "收到反应数"
|
||||||
|
pollVotesCount: "发起投票数"
|
||||||
|
pollVotedCount: "已投票数"
|
||||||
|
yes: "是"
|
||||||
|
no: "否"
|
||||||
|
driveFilesCount: "磁盘文件数"
|
||||||
|
driveUsage: "磁盘空间用量"
|
||||||
|
noCrawle: "拒绝搜索器的索引"
|
||||||
|
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
||||||
|
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
||||||
|
alwaysMarkSensitive: "浏览默认媒体文件时请谨慎"
|
||||||
|
loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
|
||||||
|
disableShowingAnimatedImages: "不播放动画"
|
||||||
|
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。"
|
||||||
|
notSet: "未设置"
|
||||||
|
emailVerified: "电子邮件地址已验证"
|
||||||
|
noteFavoritesCount: "收藏的帖子数"
|
||||||
|
pageLikesCount: "页面点赞次数"
|
||||||
|
pageLikedCount: "页面被点赞次数"
|
||||||
|
reversiCount: "黑白棋对战次数"
|
||||||
|
contact: "联系人"
|
||||||
|
useSystemFont: "使用系统默认字体"
|
||||||
|
clips: "片段"
|
||||||
|
experimentalFeatures: "实验性功能"
|
||||||
|
developer: "开发者"
|
||||||
|
makeExplorable: "使账号可见。"
|
||||||
|
makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。"
|
||||||
|
showGapBetweenNotesInTimeline: "时间线上的帖子分开显示。"
|
||||||
|
duplicate: "复制"
|
||||||
|
left: "左"
|
||||||
|
center: "中央"
|
||||||
|
wide: "宽"
|
||||||
|
narrow: "窄"
|
||||||
|
reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?"
|
||||||
|
showTitlebar: "显示标题栏"
|
||||||
|
clearCache: "清除缓存"
|
||||||
|
onlineUsersCount: "{n}人在线"
|
||||||
|
nUsers: "{n}用户"
|
||||||
|
nNotes: "{n}帖子"
|
||||||
|
sendErrorReports: "发送错误报告"
|
||||||
|
sendErrorReportsDescription: "启用后,如果出现问题,可以与Misskey共享详细的错误信息,从而帮助提高软件的质量。"
|
||||||
|
myTheme: "我的主题"
|
||||||
|
backgroundColor: "背景"
|
||||||
|
accentColor: "强调色"
|
||||||
|
textColor: "文本"
|
||||||
|
saveAs: "另存为"
|
||||||
|
advanced: "高级"
|
||||||
|
value: "值"
|
||||||
|
updatedAt: "更新时间"
|
||||||
|
saveConfirm: "确定保存?"
|
||||||
|
deleteConfirm: "确定删除?"
|
||||||
|
invalidValue: "无效值。"
|
||||||
|
registry: "注册表"
|
||||||
|
closeAccount: "关闭账户"
|
||||||
|
_registry:
|
||||||
|
scope: "范围"
|
||||||
|
key: "主要"
|
||||||
|
keys: "主要"
|
||||||
|
domain: "域"
|
||||||
|
createKey: "创建键"
|
||||||
|
_aboutMisskey:
|
||||||
|
about: "Misskey是由syuilo于2014年开发的开源软件。"
|
||||||
|
contributors: "主要贡献者"
|
||||||
|
allContributors: "全体贡献者"
|
||||||
|
source: "源代码"
|
||||||
|
translation: "翻译Misskey"
|
||||||
|
donate: "赞助Misskey"
|
||||||
|
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
|
||||||
|
patrons: "支持者"
|
||||||
|
_nsfw:
|
||||||
|
respect: "隐藏NSFW内容"
|
||||||
|
ignore: "不隐藏NSFW内容"
|
||||||
|
force: "总是隐藏内容"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFM代码速查表"
|
cheatSheet: "MFM代码速查表"
|
||||||
intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
|
intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
|
||||||
@ -663,6 +759,16 @@ _mfm:
|
|||||||
twitchDescription: "显示强烈颤抖的动画效果。"
|
twitchDescription: "显示强烈颤抖的动画效果。"
|
||||||
spin: "动画(回转)"
|
spin: "动画(回转)"
|
||||||
spinDescription: "显示回转的动画效果。"
|
spinDescription: "显示回转的动画效果。"
|
||||||
|
x2: "大"
|
||||||
|
x2Description: "以大尺寸显示内容。"
|
||||||
|
x3: "非常大"
|
||||||
|
x3Description: "以更大尺寸显示内容。"
|
||||||
|
x4: "最大"
|
||||||
|
x4Description: "以最大尺寸显示内容。"
|
||||||
|
blur: "模糊"
|
||||||
|
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
||||||
|
font: "字体"
|
||||||
|
fontDescription: "可以设置内容所使用的字体。"
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "黑白棋"
|
reversi: "黑白棋"
|
||||||
gameSettings: "对局设置"
|
gameSettings: "对局设置"
|
||||||
@ -722,7 +828,7 @@ _wordMute:
|
|||||||
muteWords: "禁用词"
|
muteWords: "禁用词"
|
||||||
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
||||||
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
||||||
softDescription: "隐藏时间轴中指定条件的帖文。"
|
softDescription: "隐藏时间线中指定条件的帖文。"
|
||||||
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
||||||
soft: "软屏蔽"
|
soft: "软屏蔽"
|
||||||
hard: "硬屏蔽"
|
hard: "硬屏蔽"
|
||||||
@ -733,6 +839,8 @@ _theme:
|
|||||||
manage: "主题管理"
|
manage: "主题管理"
|
||||||
code: "主题代码"
|
code: "主题代码"
|
||||||
installed: "{name} 已安装"
|
installed: "{name} 已安装"
|
||||||
|
installedThemes: "已安装的主题"
|
||||||
|
builtinThemes: "标准主题"
|
||||||
alreadyInstalled: "此主题已经安装"
|
alreadyInstalled: "此主题已经安装"
|
||||||
invalid: "主题格式错误"
|
invalid: "主题格式错误"
|
||||||
make: "制作主题"
|
make: "制作主题"
|
||||||
@ -806,6 +914,8 @@ _sfx:
|
|||||||
chatBg: "聊天背景"
|
chatBg: "聊天背景"
|
||||||
antenna: "天线接收"
|
antenna: "天线接收"
|
||||||
channel: "频道通知"
|
channel: "频道通知"
|
||||||
|
reversiPutBlack: "黑白棋:黑方下子时"
|
||||||
|
reversiPutWhite: "黑白棋:白方下子时"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "未知"
|
unknown: "未知"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@ -917,6 +1027,11 @@ _widgets:
|
|||||||
digitalClock: "数字时钟"
|
digitalClock: "数字时钟"
|
||||||
federation: "联邦宇宙"
|
federation: "联邦宇宙"
|
||||||
postForm: "投稿窗口"
|
postForm: "投稿窗口"
|
||||||
|
slideshow: "幻灯片展示"
|
||||||
|
button: "按钮"
|
||||||
|
onlineUsers: "在线用户"
|
||||||
|
jobQueue: "作业队列"
|
||||||
|
serverMetric: "服务器指标"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
show: "查看更多"
|
show: "查看更多"
|
||||||
@ -971,14 +1086,18 @@ _profile:
|
|||||||
username: "用户名"
|
username: "用户名"
|
||||||
description: "个人简介"
|
description: "个人简介"
|
||||||
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
youCanIncludeHashtags: "您可以包含一个哈希标签。"
|
||||||
metadata: "额外信息"
|
metadata: "附加信息"
|
||||||
|
metadataEdit: "附加信息编辑"
|
||||||
|
metadataDescription: "最多可以在个人资料中以表格形式显示四条其他信息。"
|
||||||
metadataLabel: "标签"
|
metadataLabel: "标签"
|
||||||
metadataContent: "内容"
|
metadataContent: "内容"
|
||||||
|
changeAvatar: "修改头像"
|
||||||
|
changeBanner: "修改横幅"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "所有帖子"
|
allNotes: "所有帖子"
|
||||||
followingList: "关注中"
|
followingList: "关注中"
|
||||||
muteList: "屏蔽"
|
muteList: "屏蔽"
|
||||||
blockingList: "屏蔽"
|
blockingList: "拉黑"
|
||||||
userLists: "列表"
|
userLists: "列表"
|
||||||
_charts:
|
_charts:
|
||||||
federationInstancesIncDec: "联合:增加/减少"
|
federationInstancesIncDec: "联合:增加/减少"
|
||||||
@ -1395,6 +1514,8 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "总是显示主列"
|
alwaysShowMainColumn: "总是显示主列"
|
||||||
columnAlign: "列对齐"
|
columnAlign: "列对齐"
|
||||||
|
columnMargin: "列间距"
|
||||||
|
columnHeaderHeight: "列标题高度"
|
||||||
addColumn: "添加列"
|
addColumn: "添加列"
|
||||||
swapLeft: "向左移动"
|
swapLeft: "向左移动"
|
||||||
swapRight: "向右移动"
|
swapRight: "向右移动"
|
||||||
@ -1402,7 +1523,9 @@ _deck:
|
|||||||
swapDown: "向下移动"
|
swapDown: "向下移动"
|
||||||
stackLeft: "向左折叠"
|
stackLeft: "向左折叠"
|
||||||
popRight: "向右弹出"
|
popRight: "向右弹出"
|
||||||
|
profile: "个人资料"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "主列"
|
||||||
widgets: "小工具"
|
widgets: "小工具"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
tl: "时间线"
|
tl: "时间线"
|
||||||
|
@ -4,7 +4,7 @@ export class instancePinnedPages1605585339718 implements MigrationInterface {
|
|||||||
name = 'instancePinnedPages1605585339718'
|
name = 'instancePinnedPages1605585339718'
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{"/announcements", "/featured", "/channels", "/pages", "/explore", "/games/reversi", "/about-misskey"}'::varchar[]`);
|
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{"/featured", "/channels", "/explore", "/pages", "/about-misskey"}'::varchar[]`);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
16
migration/1605965516823-instance-images.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class instanceImages1605965516823 implements MigrationInterface {
|
||||||
|
name = 'instanceImages1605965516823'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "backgroundImageUrl" character varying(512)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "logoImageUrl" character varying(512)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "logoImageUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "backgroundImageUrl"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
migration/1606191203881-no-crawle.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class noCrawle1606191203881 implements MigrationInterface {
|
||||||
|
name = 'noCrawle1606191203881'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "noCrawle" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."noCrawle" IS 'Whether reject index by crawler.'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user_profile"."noCrawle" IS 'Whether reject index by crawler.'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "noCrawle"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
migration/1607151207216-instance-pinned-clip.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class instancePinnedClip1607151207216 implements MigrationInterface {
|
||||||
|
name = 'instancePinnedClip1607151207216'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedClipId" character varying(32)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedClipId"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
18
migration/1607353487793-isExplorable.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class isExplorable1607353487793 implements MigrationInterface {
|
||||||
|
name = 'isExplorable1607353487793'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" ADD "isExplorable" boolean NOT NULL DEFAULT true`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isExplorable" IS 'Whether the User is explorable.'`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_d5a1b83c7cab66f167e6888188" ON "user" ("isExplorable") `);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_d5a1b83c7cab66f167e6888188"`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "user"."isExplorable" IS 'Whether the User is explorable.'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isExplorable"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
22
migration/1610277136869-registry.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class registry1610277136869 implements MigrationInterface {
|
||||||
|
name = 'registry1610277136869'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "registry_item" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "key" character varying(1024) NOT NULL, "scope" character varying(1024) array NOT NULL DEFAULT '{}'::varchar[], "domain" character varying(512), CONSTRAINT "PK_64b3f7e6008b4d89b826cd3af95" PRIMARY KEY ("id")); COMMENT ON COLUMN "registry_item"."createdAt" IS 'The created date of the RegistryItem.'; COMMENT ON COLUMN "registry_item"."updatedAt" IS 'The updated date of the RegistryItem.'; COMMENT ON COLUMN "registry_item"."userId" IS 'The owner ID.'; COMMENT ON COLUMN "registry_item"."key" IS 'The key of the RegistryItem.'`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_fb9d21ba0abb83223263df6bcb" ON "registry_item" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_22baca135bb8a3ea1a83d13df3" ON "registry_item" ("scope") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_0a72bdfcdb97c0eca11fe7ecad" ON "registry_item" ("domain") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "registry_item" ADD CONSTRAINT "FK_fb9d21ba0abb83223263df6bcb3" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "registry_item" DROP CONSTRAINT "FK_fb9d21ba0abb83223263df6bcb3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_0a72bdfcdb97c0eca11fe7ecad"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_22baca135bb8a3ea1a83d13df3"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "IDX_fb9d21ba0abb83223263df6bcb"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "registry_item"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
migration/1610277585759-registry2.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class registry21610277585759 implements MigrationInterface {
|
||||||
|
name = 'registry21610277585759'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "registry_item" ADD "value" jsonb NOT NULL DEFAULT '{}'`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "registry_item"."value" IS 'The value of the RegistryItem.'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "registry_item"."value" IS 'The value of the RegistryItem.'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "registry_item" DROP COLUMN "value"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
migration/1610283021566-registry3.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||||
|
|
||||||
|
export class registry31610283021566 implements MigrationInterface {
|
||||||
|
name = 'registry31610283021566'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "value" DROP NOT NULL`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "value" SET NOT NULL`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
138
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.59.0",
|
"version": "12.67.1",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -35,20 +35,22 @@
|
|||||||
"lodash": "^4.17.20"
|
"lodash": "^4.17.20"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-transform-runtime": "7.11.0",
|
"@babel/plugin-transform-runtime": "7.12.1",
|
||||||
"@elastic/elasticsearch": "7.8.0",
|
"@elastic/elasticsearch": "7.10.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.32",
|
"@fortawesome/fontawesome-svg-core": "1.2.32",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.15.1",
|
"@fortawesome/free-brands-svg-icons": "5.15.1",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.15.1",
|
"@fortawesome/free-regular-svg-icons": "5.15.1",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.15.1",
|
"@fortawesome/free-solid-svg-icons": "5.15.1",
|
||||||
"@fortawesome/vue-fontawesome": "3.0.0-2",
|
"@fortawesome/vue-fontawesome": "3.0.0-3",
|
||||||
"@koa/cors": "3.1.0",
|
"@koa/cors": "3.1.0",
|
||||||
"@koa/multer": "3.0.0",
|
"@koa/multer": "3.0.0",
|
||||||
"@koa/router": "9.0.1",
|
"@koa/router": "9.0.1",
|
||||||
|
"@sentry/browser": "5.29.2",
|
||||||
|
"@sentry/tracing": "5.29.2",
|
||||||
"@sinonjs/fake-timers": "6.0.1",
|
"@sinonjs/fake-timers": "6.0.1",
|
||||||
"@syuilo/aiscript": "0.11.1",
|
"@syuilo/aiscript": "0.11.1",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.14.0",
|
"@types/bull": "3.14.4",
|
||||||
"@types/cbor": "5.0.1",
|
"@types/cbor": "5.0.1",
|
||||||
"@types/dateformat": "3.0.1",
|
"@types/dateformat": "3.0.1",
|
||||||
"@types/double-ended-queue": "2.1.1",
|
"@types/double-ended-queue": "2.1.1",
|
||||||
@ -59,10 +61,10 @@
|
|||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.12.5",
|
"@types/js-yaml": "3.12.5",
|
||||||
"@types/jsdom": "16.2.3",
|
"@types/jsdom": "16.2.5",
|
||||||
"@types/jsonld": "1.5.1",
|
"@types/jsonld": "1.5.1",
|
||||||
"@types/katex": "0.11.0",
|
"@types/katex": "0.11.0",
|
||||||
"@types/koa": "2.11.3",
|
"@types/koa": "2.11.6",
|
||||||
"@types/koa-bodyparser": "4.3.0",
|
"@types/koa-bodyparser": "4.3.0",
|
||||||
"@types/koa-cors": "0.0.0",
|
"@types/koa-cors": "0.0.0",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.19",
|
||||||
@ -70,79 +72,83 @@
|
|||||||
"@types/koa-mount": "4.0.0",
|
"@types/koa-mount": "4.0.0",
|
||||||
"@types/koa-send": "4.1.2",
|
"@types/koa-send": "4.1.2",
|
||||||
"@types/koa-views": "2.0.4",
|
"@types/koa-views": "2.0.4",
|
||||||
"@types/koa__cors": "3.0.1",
|
"@types/koa__cors": "3.0.2",
|
||||||
"@types/koa__multer": "2.0.1",
|
"@types/koa__multer": "2.0.2",
|
||||||
"@types/koa__router": "8.0.2",
|
"@types/koa__router": "8.0.2",
|
||||||
"@types/markdown-it": "10.0.1",
|
"@types/markdown-it": "10.0.3",
|
||||||
|
"@types/matter-js": "0.14.8",
|
||||||
"@types/mocha": "7.0.2",
|
"@types/mocha": "7.0.2",
|
||||||
"@types/node": "14.0.22",
|
"@types/node": "14.14.13",
|
||||||
"@types/node-fetch": "2.5.7",
|
"@types/node-fetch": "2.5.7",
|
||||||
"@types/nodemailer": "6.4.0",
|
"@types/nodemailer": "6.4.0",
|
||||||
"@types/nprogress": "0.2.0",
|
"@types/nprogress": "0.2.0",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parse5": "5.0.3",
|
"@types/parse5": "5.0.3",
|
||||||
"@types/parsimmon": "1.10.2",
|
"@types/parsimmon": "1.10.6",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.3.4",
|
"@types/qrcode": "1.3.5",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "3.4.1",
|
||||||
"@types/redis": "2.8.25",
|
"@types/redis": "2.8.28",
|
||||||
"@types/rename": "1.0.1",
|
"@types/rename": "1.0.2",
|
||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "3.0.0",
|
"@types/rimraf": "3.0.0",
|
||||||
"@types/seedrandom": "2.4.28",
|
"@types/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.26.0",
|
"@types/sharp": "0.26.1",
|
||||||
"@types/sinonjs__fake-timers": "6.0.1",
|
"@types/sinonjs__fake-timers": "6.0.1",
|
||||||
"@types/speakeasy": "2.0.5",
|
"@types/speakeasy": "2.0.5",
|
||||||
|
"@types/throttle-debounce": "2.1.0",
|
||||||
"@types/tinycolor2": "1.4.2",
|
"@types/tinycolor2": "1.4.2",
|
||||||
"@types/tmp": "0.2.0",
|
"@types/tmp": "0.2.0",
|
||||||
"@types/uuid": "8.3.0",
|
"@types/uuid": "8.3.0",
|
||||||
"@types/web-push": "3.3.0",
|
"@types/web-push": "3.3.0",
|
||||||
"@types/webpack": "4.41.24",
|
"@types/webpack": "4.41.25",
|
||||||
"@types/webpack-stream": "3.2.11",
|
"@types/webpack-stream": "3.2.11",
|
||||||
"@types/websocket": "1.0.1",
|
"@types/websocket": "1.0.1",
|
||||||
"@types/ws": "7.2.7",
|
"@types/ws": "7.4.0",
|
||||||
"@typescript-eslint/parser": "4.6.1",
|
"@typescript-eslint/parser": "4.10.0",
|
||||||
"@vue/compiler-sfc": "3.0.2",
|
"@vue/compiler-sfc": "3.0.5",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"apexcharts": "3.22.1",
|
"apexcharts": "3.23.1",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.787.0",
|
"aws-sdk": "2.809.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "1.1.3",
|
"blurhash": "1.1.3",
|
||||||
"bull": "3.18.1",
|
"bull": "3.20.0",
|
||||||
"cafy": "15.2.1",
|
"cafy": "15.2.1",
|
||||||
"cbor": "5.1.0",
|
"cbor": "5.1.0",
|
||||||
"chalk": "4.1.0",
|
"chalk": "4.1.0",
|
||||||
"chart.js": "2.9.4",
|
"chart.js": "2.9.4",
|
||||||
"cli-highlight": "2.1.4",
|
"cli-highlight": "2.1.9",
|
||||||
"commander": "4.1.1",
|
"commander": "4.1.1",
|
||||||
"content-disposition": "0.5.3",
|
"content-disposition": "0.5.3",
|
||||||
"core-js": "3.7.0",
|
"core-js": "3.8.1",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "5.0.1",
|
"css-loader": "5.0.1",
|
||||||
"cssnano": "4.1.10",
|
"cssnano": "4.1.10",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "4.3.1",
|
||||||
"deep-entries": "3.1.0",
|
"deep-entries": "3.1.0",
|
||||||
"diskusage": "1.1.3",
|
"diskusage": "1.1.3",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "7.12.1",
|
"eslint": "7.17.0",
|
||||||
"eslint-plugin-vue": "7.1.0",
|
"eslint-plugin-vue": "7.4.1",
|
||||||
"eventemitter3": "4.0.7",
|
"eventemitter3": "4.0.7",
|
||||||
"feed": "4.2.1",
|
"feed": "4.2.1",
|
||||||
"fibers": "5.0.0",
|
"fibers": "5.0.0",
|
||||||
"file-type": "16.0.1",
|
"file-type": "16.1.0",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"glob": "7.1.6",
|
"glob": "7.1.6",
|
||||||
"got": "11.8.0",
|
"got": "11.8.1",
|
||||||
"gulp": "4.0.2",
|
"gulp": "4.0.2",
|
||||||
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-rename": "2.0.0",
|
"gulp-rename": "2.0.0",
|
||||||
"gulp-replace": "1.0.0",
|
"gulp-replace": "1.0.0",
|
||||||
"gulp-sourcemaps": "2.6.5",
|
"gulp-sourcemaps": "2.6.5",
|
||||||
|
"gulp-terser": "2.0.1",
|
||||||
"gulp-tslint": "8.1.4",
|
"gulp-tslint": "8.1.4",
|
||||||
"gulp-typescript": "6.0.0-alpha.1",
|
"gulp-typescript": "6.0.0-alpha.1",
|
||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
@ -151,7 +157,6 @@
|
|||||||
"http-proxy-agent": "4.0.1",
|
"http-proxy-agent": "4.0.1",
|
||||||
"http-signature": "1.3.5",
|
"http-signature": "1.3.5",
|
||||||
"https-proxy-agent": "5.0.0",
|
"https-proxy-agent": "5.0.0",
|
||||||
"idb-keyval": "3.2.0",
|
|
||||||
"insert-text-at-cursor": "0.3.0",
|
"insert-text-at-cursor": "0.3.0",
|
||||||
"is-root": "2.1.0",
|
"is-root": "2.1.0",
|
||||||
"is-svg": "4.2.1",
|
"is-svg": "4.2.1",
|
||||||
@ -162,7 +167,7 @@
|
|||||||
"jsonld": "3.2.0",
|
"jsonld": "3.2.0",
|
||||||
"jsrsasign": "8.0.20",
|
"jsrsasign": "8.0.20",
|
||||||
"katex": "0.12.0",
|
"katex": "0.12.0",
|
||||||
"koa": "2.13.0",
|
"koa": "2.13.1",
|
||||||
"koa-bodyparser": "4.3.0",
|
"koa-bodyparser": "4.3.0",
|
||||||
"koa-favicon": "2.1.0",
|
"koa-favicon": "2.1.0",
|
||||||
"koa-json-body": "5.3.0",
|
"koa-json-body": "5.3.0",
|
||||||
@ -174,24 +179,25 @@
|
|||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"markdown-it": "11.0.1",
|
"markdown-it": "11.0.1",
|
||||||
"markdown-it-anchor": "6.0.0",
|
"markdown-it-anchor": "6.0.1",
|
||||||
|
"matter-js": "0.14.2",
|
||||||
"mocha": "8.2.1",
|
"mocha": "8.2.1",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"ms": "2.1.2",
|
"ms": "2.1.3",
|
||||||
"multer": "1.4.2",
|
"multer": "1.4.2",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "2.6.1",
|
"node-fetch": "2.6.1",
|
||||||
"nodemailer": "6.4.15",
|
"nodemailer": "6.4.17",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"p-cancelable": "2.0.0",
|
"p-cancelable": "2.0.0",
|
||||||
"parse5": "6.0.1",
|
"parse5": "6.0.1",
|
||||||
"parsimmon": "1.16.0",
|
"parsimmon": "1.16.0",
|
||||||
"pg": "8.4.2",
|
"pg": "8.5.1",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss": "8.1.6",
|
"postcss": "8.2.4",
|
||||||
"postcss-loader": "4.0.4",
|
"postcss-loader": "4.1.0",
|
||||||
"prismjs": "1.22.0",
|
"prismjs": "1.23.0",
|
||||||
"probe-image-size": "6.0.0",
|
"probe-image-size": "6.0.0",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
@ -201,7 +207,7 @@
|
|||||||
"qrcode": "1.4.4",
|
"qrcode": "1.4.4",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.4.1",
|
"ratelimiter": "3.4.1",
|
||||||
"re2": "1.15.8",
|
"re2": "1.15.9",
|
||||||
"recaptcha-promise": "1.0.0",
|
"recaptcha-promise": "1.0.0",
|
||||||
"reconnecting-websocket": "4.4.0",
|
"reconnecting-websocket": "4.4.0",
|
||||||
"redis": "3.0.2",
|
"redis": "3.0.2",
|
||||||
@ -214,54 +220,52 @@
|
|||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sass": "1.29.0",
|
"sass": "1.32.4",
|
||||||
"sass-loader": "10.0.5",
|
"sass-loader": "10.1.1",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.26.2",
|
"sharp": "0.27.0",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"style-loader": "2.0.0",
|
"style-loader": "2.0.0",
|
||||||
"summaly": "2.4.0",
|
"summaly": "2.4.0",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "4.28.1",
|
"systeminformation": "4.34.6",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.117.1",
|
"three": "0.117.1",
|
||||||
|
"throttle-debounce": "3.0.1",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "8.0.9",
|
"ts-loader": "8.0.14",
|
||||||
"ts-node": "9.0.0",
|
"ts-node": "9.1.1",
|
||||||
"tslint": "6.1.3",
|
"tslint": "6.1.3",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"typeorm": "0.2.29",
|
"typeorm": "0.2.30",
|
||||||
"typescript": "4.0.5",
|
"typescript": "4.1.3",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"url-loader": "4.1.1",
|
"url-loader": "4.1.1",
|
||||||
"uuid": "8.3.1",
|
"uuid": "8.3.2",
|
||||||
"v-debounce": "0.1.2",
|
"v-debounce": "0.1.2",
|
||||||
"vue": "3.0.2",
|
"vanilla-tilt": "1.7.0",
|
||||||
"vue-color": "2.7.1",
|
"vue": "3.0.5",
|
||||||
"vue-draggable-next": "1.0.8",
|
"vue-color": "2.8.1",
|
||||||
"vue-i18n": "9.0.0-beta.7",
|
|
||||||
"vue-json-pretty": "1.7.1",
|
"vue-json-pretty": "1.7.1",
|
||||||
"vue-loader": "16.0.0-beta.8",
|
"vue-loader": "16.0.0",
|
||||||
"vue-prism-editor": "1.2.2",
|
"vue-prism-editor": "2.0.0-alpha.2",
|
||||||
"vue-router": "4.0.0-rc.2",
|
"vue-router": "4.0.1",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-template-compiler": "2.6.12",
|
"vuedraggable": "4.0.1",
|
||||||
"vuex": "4.0.0-rc.1",
|
|
||||||
"vuex-persistedstate": "3.1.0",
|
|
||||||
"web-push": "3.4.4",
|
"web-push": "3.4.4",
|
||||||
"webpack": "5.5.0",
|
"webpack": "5.13.0",
|
||||||
"webpack-cli": "4.2.0",
|
"webpack-cli": "4.3.1",
|
||||||
"websocket": "1.0.32",
|
"websocket": "1.0.33",
|
||||||
"ws": "7.3.1",
|
"ws": "7.4.2",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "4.2.11",
|
"@types/chai": "4.2.14",
|
||||||
"@types/fluent-ffmpeg": "2.1.14",
|
"@types/fluent-ffmpeg": "2.1.16",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"cross-env": "7.0.2"
|
"cross-env": "7.0.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
src/client/@types/global.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
declare const _LANGS_: string[];
|
declare const _LANGS_: string[][];
|
||||||
declare const _VERSION_: string;
|
declare const _VERSION_: string;
|
||||||
declare const _ENV_: string;
|
declare const _ENV_: string;
|
||||||
declare const _DEV_: boolean;
|
declare const _DEV_: boolean;
|
||||||
|
5
src/client/@types/vue.d.ts
vendored
@ -1,4 +1,5 @@
|
|||||||
declare module '*.vue' {
|
declare module '*.vue' {
|
||||||
import Vue from 'vue';
|
import type { DefineComponent } from 'vue';
|
||||||
export default Vue;
|
const component: DefineComponent<{}, {}, any>;
|
||||||
|
export default component;
|
||||||
}
|
}
|
||||||
|
12
src/client/@types/vuex-shim.d.ts
vendored
@ -1,12 +0,0 @@
|
|||||||
import { ComponentCustomProperties } from 'vue';
|
|
||||||
import { Store } from 'vuex';
|
|
||||||
|
|
||||||
declare module '@vue/runtime-core' {
|
|
||||||
// tslint:disable-next-line:no-empty-interface
|
|
||||||
interface State {
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ComponentCustomProperties {
|
|
||||||
$store: Store<State>;
|
|
||||||
}
|
|
||||||
}
|
|
85
src/client/account.ts
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import { reactive } from 'vue';
|
||||||
|
import { apiUrl } from '@/config';
|
||||||
|
import { waiting } from '@/os';
|
||||||
|
|
||||||
|
// TODO: 他のタブと永続化されたstateを同期
|
||||||
|
|
||||||
|
type Account = {
|
||||||
|
id: string;
|
||||||
|
token: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const data = localStorage.getItem('account');
|
||||||
|
|
||||||
|
// TODO: 外部からはreadonlyに
|
||||||
|
export const $i = data ? reactive(JSON.parse(data) as Account) : null;
|
||||||
|
|
||||||
|
export function signout() {
|
||||||
|
localStorage.removeItem('account');
|
||||||
|
document.cookie = `igi=; path=/`;
|
||||||
|
location.href = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAccounts() {
|
||||||
|
const accountsData = localStorage.getItem('accounts');
|
||||||
|
const accounts: { id: Account['id'], token: Account['token'] }[] = accountsData ? JSON.parse(accountsData) : [];
|
||||||
|
return accounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addAccount(id: Account['id'], token: Account['token']) {
|
||||||
|
const accounts = getAccounts();
|
||||||
|
if (!accounts.some(x => x.id === id)) {
|
||||||
|
localStorage.setItem('accounts', JSON.stringify(accounts.concat([{ id, token }])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetchAccount(token): Promise<Account> {
|
||||||
|
return new Promise((done, fail) => {
|
||||||
|
// Fetch user
|
||||||
|
fetch(`${apiUrl}/i`, {
|
||||||
|
method: 'POST',
|
||||||
|
body: JSON.stringify({
|
||||||
|
i: token
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(res => {
|
||||||
|
// When failed to authenticate user
|
||||||
|
if (res.status !== 200 && res.status < 500) {
|
||||||
|
return signout();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse response
|
||||||
|
res.json().then(i => {
|
||||||
|
i.token = token;
|
||||||
|
done(i);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(fail);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateAccount(data) {
|
||||||
|
for (const [key, value] of Object.entries(data)) {
|
||||||
|
$i[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function refreshAccount() {
|
||||||
|
fetchAccount($i.token).then(updateAccount);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function login(token: Account['token']) {
|
||||||
|
waiting();
|
||||||
|
if (_DEV_) console.log('logging as token ', token);
|
||||||
|
const me = await fetchAccount(token);
|
||||||
|
localStorage.setItem('account', JSON.stringify(me));
|
||||||
|
addAccount(me.id, token);
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
// このファイルに書きたくないけどここに書かないと何故かVeturが認識しない
|
||||||
|
declare module '@vue/runtime-core' {
|
||||||
|
interface ComponentCustomProperties {
|
||||||
|
$i: typeof $i;
|
||||||
|
}
|
||||||
|
}
|
BIN
src/client/assets/about-icon.png
Normal file
After Width: | Height: | Size: 20 KiB |
7
src/client/assets/misskey.svg
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
src/client/assets/sounds/syuilo/kick.mp3
Normal file
BIN
src/client/assets/sounds/syuilo/snare.mp3
Normal file
@ -2,24 +2,24 @@
|
|||||||
<XWindow ref="window" :initial-width="400" :initial-height="500" :can-resize="true" @closed="$emit('closed')">
|
<XWindow ref="window" :initial-width="400" :initial-height="500" :can-resize="true" @closed="$emit('closed')">
|
||||||
<template #header>
|
<template #header>
|
||||||
<Fa :icon="faExclamationCircle" style="margin-right: 0.5em;"/>
|
<Fa :icon="faExclamationCircle" style="margin-right: 0.5em;"/>
|
||||||
<i18n-t keypath="reportAbuseOf" tag="span">
|
<I18n :src="$ts.reportAbuseOf" tag="span">
|
||||||
<template #name>
|
<template #name>
|
||||||
<b><MkAcct :user="user"/></b>
|
<b><MkAcct :user="user"/></b>
|
||||||
</template>
|
</template>
|
||||||
</i18n-t>
|
</I18n>
|
||||||
</template>
|
</template>
|
||||||
<div class="dpvffvvy">
|
<div class="dpvffvvy">
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<div class="_content">
|
<div class="_content">
|
||||||
<MkTextarea v-model:value="comment">
|
<MkTextarea v-model:value="comment">
|
||||||
<span>{{ $t('details') }}</span>
|
<span>{{ $ts.details }}</span>
|
||||||
<template #desc>{{ $t('fillAbuseReportDescription') }}</template>
|
<template #desc>{{ $ts.fillAbuseReportDescription }}</template>
|
||||||
</MkTextarea>
|
</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="_section">
|
<div class="_section">
|
||||||
<div class="_content">
|
<div class="_content">
|
||||||
<MkButton @click="send" primary full :disabled="comment.length === 0">{{ $t('send') }}</MkButton>
|
<MkButton @click="send" primary full :disabled="comment.length === 0">{{ $ts.send }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -69,7 +69,7 @@ export default defineComponent({
|
|||||||
}, undefined, res => {
|
}, undefined, res => {
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.$t('abuseReported')
|
text: this.$ts.abuseReported
|
||||||
});
|
});
|
||||||
this.$refs.window.close();
|
this.$refs.window.close();
|
||||||
});
|
});
|
||||||
|
@ -116,16 +116,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
update();
|
update();
|
||||||
|
|
||||||
this.$store.subscribe((mutation, state) => {
|
|
||||||
if (mutation.type !== 'device/set') return;
|
|
||||||
|
|
||||||
if (mutation?.payload?.key !== 'theme') return;
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
this.computedStyle = getComputedStyle(document.documentElement);
|
|
||||||
}, 250);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<span class="username">@{{ acct(user) }}</span>
|
<span class="username">@{{ acct(user) }}</span>
|
||||||
</li>
|
</li>
|
||||||
<li @click="chooseUser()" @keydown="onKeydown" tabindex="-1" class="choose">{{ $t('selectUser') }}</li>
|
<li @click="chooseUser()" @keydown="onKeydown" tabindex="-1" class="choose">{{ $ts.selectUser }}</li>
|
||||||
</ol>
|
</ol>
|
||||||
<ol class="hashtags" ref="suggests" v-if="hashtags.length > 0">
|
<ol class="hashtags" ref="suggests" v-if="hashtags.length > 0">
|
||||||
<li v-for="hashtag in hashtags" @click="complete(type, hashtag)" @keydown="onKeydown" tabindex="-1">
|
<li v-for="hashtag in hashtags" @click="complete(type, hashtag)" @keydown="onKeydown" tabindex="-1">
|
||||||
@ -17,8 +17,8 @@
|
|||||||
</ol>
|
</ol>
|
||||||
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
||||||
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
||||||
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="$store.state.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else-if="!useOsNativeEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-else-if="!$store.state.useOsNativeEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
||||||
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
||||||
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
|
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
|
||||||
@ -128,12 +128,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
|
||||||
useOsNativeEmojis(): boolean {
|
|
||||||
return this.$store.state.device.useOsNativeEmojis;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
showing() {
|
showing() {
|
||||||
if (!this.showing) {
|
if (!this.showing) {
|
||||||
@ -151,7 +145,7 @@ export default defineComponent({
|
|||||||
this.setPosition();
|
this.setPosition();
|
||||||
|
|
||||||
//#region Construct Emoji DB
|
//#region Construct Emoji DB
|
||||||
const customEmojis = this.$store.state.instance.meta.emojis;
|
const customEmojis = this.$instance.emojis;
|
||||||
const emojiDefinitions: EmojiDef[] = [];
|
const emojiDefinitions: EmojiDef[] = [];
|
||||||
|
|
||||||
for (const x of customEmojis) {
|
for (const x of customEmojis) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<span v-if="!available">{{ $t('waiting') }}<MkEllipsis/></span>
|
<span v-if="!available">{{ $ts.waiting }}<MkEllipsis/></span>
|
||||||
<div ref="captcha"></div>
|
<div ref="captcha"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -28,7 +28,6 @@ declare global {
|
|||||||
interface Window extends CaptchaContainer {
|
interface Window extends CaptchaContainer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
import * as os from '@/os';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@ -101,7 +100,7 @@ export default defineComponent({
|
|||||||
if (this.captcha.render && this.$refs.captcha instanceof Element) {
|
if (this.captcha.render && this.$refs.captcha instanceof Element) {
|
||||||
this.captcha.render(this.$refs.captcha, {
|
this.captcha.render(this.$refs.captcha, {
|
||||||
sitekey: this.sitekey,
|
sitekey: this.sitekey,
|
||||||
theme: this.$store.state.device.darkMode ? 'dark' : 'light',
|
theme: this.$store.state.darkMode ? 'dark' : 'light',
|
||||||
callback: this.callback,
|
callback: this.callback,
|
||||||
'expired-callback': this.callback,
|
'expired-callback': this.callback,
|
||||||
'error-callback': this.callback,
|
'error-callback': this.callback,
|
||||||
|
@ -6,14 +6,14 @@
|
|||||||
>
|
>
|
||||||
<template v-if="!wait">
|
<template v-if="!wait">
|
||||||
<template v-if="isFollowing">
|
<template v-if="isFollowing">
|
||||||
<span v-if="full">{{ $t('unfollow') }}</span><Fa :icon="faMinus"/>
|
<span v-if="full">{{ $ts.unfollow }}</span><Fa :icon="faMinus"/>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span v-if="full">{{ $t('follow') }}</span><Fa :icon="faPlus"/>
|
<span v-if="full">{{ $ts.follow }}</span><Fa :icon="faPlus"/>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
<span v-if="full">{{ $ts.processing }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
||||||
</template>
|
</template>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
@ -6,19 +6,19 @@
|
|||||||
<div class="status">
|
<div class="status">
|
||||||
<div>
|
<div>
|
||||||
<Fa :icon="faUsers" fixed-width/>
|
<Fa :icon="faUsers" fixed-width/>
|
||||||
<i18n-t keypath="_channel.usersCount" tag="span" style="margin-left: 4px;">
|
<I18n :src="$ts._channel.usersCount" tag="span" style="margin-left: 4px;">
|
||||||
<template #n>
|
<template #n>
|
||||||
<b>{{ channel.usersCount }}</b>
|
<b>{{ channel.usersCount }}</b>
|
||||||
</template>
|
</template>
|
||||||
</i18n-t>
|
</I18n>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<Fa :icon="faPencilAlt" fixed-width/>
|
<Fa :icon="faPencilAlt" fixed-width/>
|
||||||
<i18n-t keypath="_channel.notesCount" tag="span" style="margin-left: 4px;">
|
<I18n :src="$ts._channel.notesCount" tag="span" style="margin-left: 4px;">
|
||||||
<template #n>
|
<template #n>
|
||||||
<b>{{ channel.notesCount }}</b>
|
<b>{{ channel.notesCount }}</b>
|
||||||
</template>
|
</template>
|
||||||
</i18n-t>
|
</I18n>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -27,7 +27,7 @@
|
|||||||
</article>
|
</article>
|
||||||
<footer>
|
<footer>
|
||||||
<span v-if="channel.lastNotedAt">
|
<span v-if="channel.lastNotedAt">
|
||||||
{{ $t('updatedAt') }}: <MkTime :time="channel.lastNotedAt"/>
|
{{ $ts.updatedAt }}: <MkTime :time="channel.lastNotedAt"/>
|
||||||
</span>
|
</span>
|
||||||
</footer>
|
</footer>
|
||||||
</MkA>
|
</MkA>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<button class="nrvgflfu _button" @click="toggle">
|
<button class="nrvgflfu _button" @click="toggle">
|
||||||
<b>{{ value ? $t('_cw.hide') : $t('_cw.show') }}</b>
|
<b>{{ value ? $ts._cw.hide : $ts._cw.show }}</b>
|
||||||
<span v-if="!value">{{ label }}</span>
|
<span v-if="!value">{{ label }}</span>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
@ -27,7 +27,7 @@ export default defineComponent({
|
|||||||
return concat([
|
return concat([
|
||||||
this.note.text ? [this.$t('_cw.chars', { count: length(this.note.text) })] : [],
|
this.note.text ? [this.$t('_cw.chars', { count: length(this.note.text) })] : [],
|
||||||
this.note.files && this.note.files.length !== 0 ? [this.$t('_cw.files', { count: this.note.files.length }) ] : [],
|
this.note.files && this.note.files.length !== 0 ? [this.$t('_cw.files', { count: this.note.files.length }) ] : [],
|
||||||
this.note.poll != null ? [this.$t('poll')] : []
|
this.note.poll != null ? [this.$ts.poll] : []
|
||||||
] as string[][]).join(' / ');
|
] as string[][]).join(' / ');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1,20 +1,7 @@
|
|||||||
<template>
|
|
||||||
<transition-group class="sqadhkmv _list_" name="list" tag="div" :data-direction="direction" :data-reversed="reversed ? 'true' : 'false'">
|
|
||||||
<template v-for="(item, i) in items">
|
|
||||||
<slot :item="item"></slot>
|
|
||||||
<div class="separator" v-if="showDate(i, item)" :key="item.id + '_date'">
|
|
||||||
<p class="date">
|
|
||||||
<span><Fa class="icon" :icon="faAngleUp"/>{{ getDateText(item.createdAt) }}</span>
|
|
||||||
<span>{{ getDateText(items[i + 1].createdAt) }}<Fa class="icon" :icon="faAngleDown"/></span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</transition-group>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, h, TransitionGroup } from 'vue';
|
||||||
import { faAngleUp, faAngleDown } from '@fortawesome/free-solid-svg-icons';
|
import { faAngleUp, faAngleDown } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@ -34,36 +21,72 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
methods: {
|
||||||
return {
|
focus() {
|
||||||
faAngleUp, faAngleDown
|
this.$slots.default[0].elm.focus();
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
render() {
|
||||||
getDateText(time: string) {
|
const getDateText = (time: string) => {
|
||||||
const date = new Date(time).getDate();
|
const date = new Date(time).getDate();
|
||||||
const month = new Date(time).getMonth() + 1;
|
const month = new Date(time).getMonth() + 1;
|
||||||
return this.$t('monthAndDay', {
|
return this.$t('monthAndDay', {
|
||||||
month: month.toString(),
|
month: month.toString(),
|
||||||
day: date.toString()
|
day: date.toString()
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
|
|
||||||
showDate(i, item) {
|
return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? {
|
||||||
return (
|
class: 'sqadhkmv _list_',
|
||||||
|
name: 'list',
|
||||||
|
tag: 'div',
|
||||||
|
'data-direction': this.direction,
|
||||||
|
'data-reversed': this.reversed ? 'true' : 'false',
|
||||||
|
} : {
|
||||||
|
class: 'sqadhkmv _list_',
|
||||||
|
}, this.items.map((item, i) => {
|
||||||
|
const el = this.$slots.default({
|
||||||
|
item: item
|
||||||
|
})[0];
|
||||||
|
if (el.key == null && item.id) el.key = item.id;
|
||||||
|
|
||||||
|
if (
|
||||||
i != this.items.length - 1 &&
|
i != this.items.length - 1 &&
|
||||||
new Date(item.createdAt).getDate() != new Date(this.items[i + 1].createdAt).getDate() &&
|
new Date(item.createdAt).getDate() != new Date(this.items[i + 1].createdAt).getDate() &&
|
||||||
!item._prId_ &&
|
!item._prId_ &&
|
||||||
!this.items[i + 1]._prId_ &&
|
!this.items[i + 1]._prId_ &&
|
||||||
!item._featuredId_ &&
|
!item._featuredId_ &&
|
||||||
!this.items[i + 1]._featuredId_);
|
!this.items[i + 1]._featuredId_
|
||||||
},
|
) {
|
||||||
|
const separator = h('div', {
|
||||||
|
class: 'separator',
|
||||||
|
key: item.id + ':separator',
|
||||||
|
}, h('p', {
|
||||||
|
class: 'date'
|
||||||
|
}, [
|
||||||
|
h('span', [
|
||||||
|
h(FontAwesomeIcon, {
|
||||||
|
class: 'icon',
|
||||||
|
icon: faAngleUp,
|
||||||
|
}),
|
||||||
|
getDateText(item.createdAt)
|
||||||
|
]),
|
||||||
|
h('span', [
|
||||||
|
getDateText(this.items[i + 1].createdAt),
|
||||||
|
h(FontAwesomeIcon, {
|
||||||
|
class: 'icon',
|
||||||
|
icon: faAngleDown,
|
||||||
|
})
|
||||||
|
])
|
||||||
|
]));
|
||||||
|
|
||||||
focus() {
|
return [el, separator];
|
||||||
this.$slots.default[0].elm.focus();
|
} else {
|
||||||
}
|
return el;
|
||||||
}
|
}
|
||||||
|
}));
|
||||||
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -97,7 +120,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss">
|
||||||
.sqadhkmv {
|
.sqadhkmv {
|
||||||
> .separator {
|
> .separator {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
</template>
|
</template>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<div class="buttons" v-if="(showOkButton || showCancelButton) && !actions">
|
<div class="buttons" v-if="(showOkButton || showCancelButton) && !actions">
|
||||||
<MkButton inline @click="ok" v-if="showOkButton" primary :autofocus="!input && !select">{{ (showCancelButton || input || select) ? $t('ok') : $t('gotIt') }}</MkButton>
|
<MkButton inline @click="ok" v-if="showOkButton" primary :autofocus="!input && !select">{{ (showCancelButton || input || select) ? $ts.ok : $ts.gotIt }}</MkButton>
|
||||||
<MkButton inline @click="cancel" v-if="showCancelButton || input || select">{{ $t('cancel') }}</MkButton>
|
<MkButton inline @click="cancel" v-if="showCancelButton || input || select">{{ $ts.cancel }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
<div class="buttons" v-if="actions">
|
<div class="buttons" v-if="actions">
|
||||||
<MkButton v-for="action in actions" inline @click="() => { action.callback(); close(); }" :primary="action.primary" :key="action.text">{{ action.text }}</MkButton>
|
<MkButton v-for="action in actions" inline @click="() => { action.callback(); close(); }" :primary="action.primary" :key="action.text">{{ action.text }}</MkButton>
|
||||||
|
@ -27,6 +27,7 @@ import {
|
|||||||
faFilm
|
faFilm
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
import ImgWithBlurhash from './img-with-blurhash.vue';
|
import ImgWithBlurhash from './img-with-blurhash.vue';
|
||||||
|
import { ColdDeviceStorage } from '@/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -89,12 +90,12 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
||||||
if (audioTag) audioTag.volume = this.$store.state.device.mediaVolume;
|
if (audioTag) audioTag.volume = ColdDeviceStorage.get('mediaVolume');
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
volumechange() {
|
volumechange() {
|
||||||
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
||||||
this.$store.commit('device/set', { key: 'mediaVolume', value: audioTag.volume });
|
ColdDeviceStorage.set('mediaVolume', audioTag.volume);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
@closed="$emit('closed')"
|
@closed="$emit('closed')"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
{{ multiple ? ((type === 'file') ? $t('selectFiles') : $t('selectFolders')) : ((type === 'file') ? $t('selectFile') : $t('selectFolder')) }}
|
{{ multiple ? ((type === 'file') ? $ts.selectFiles : $ts.selectFolders) : ((type === 'file') ? $ts.selectFile : $ts.selectFolder) }}
|
||||||
<span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ number(selected.length) }})</span>
|
<span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ number(selected.length) }})</span>
|
||||||
</template>
|
</template>
|
||||||
<XDrive :multiple="multiple" @changeSelection="onChangeSelection" @selected="ok()" :select="type"/>
|
<XDrive :multiple="multiple" @changeSelection="onChangeSelection" @selected="ok()" :select="type"/>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
@closed="$emit('closed')"
|
@closed="$emit('closed')"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
{{ $t('drive') }}
|
{{ $ts.drive }}
|
||||||
</template>
|
</template>
|
||||||
<XDrive :initial-folder="initialFolder"/>
|
<XDrive :initial-folder="initialFolder"/>
|
||||||
</XWindow>
|
</XWindow>
|
||||||
|
@ -8,17 +8,17 @@
|
|||||||
@dragend="onDragend"
|
@dragend="onDragend"
|
||||||
:title="title"
|
:title="title"
|
||||||
>
|
>
|
||||||
<div class="label" v-if="$store.state.i.avatarId == file.id">
|
<div class="label" v-if="$i.avatarId == file.id">
|
||||||
<img src="/assets/label.svg"/>
|
<img src="/assets/label.svg"/>
|
||||||
<p>{{ $t('avatar') }}</p>
|
<p>{{ $ts.avatar }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="label" v-if="$store.state.i.bannerId == file.id">
|
<div class="label" v-if="$i.bannerId == file.id">
|
||||||
<img src="/assets/label.svg"/>
|
<img src="/assets/label.svg"/>
|
||||||
<p>{{ $t('banner') }}</p>
|
<p>{{ $ts.banner }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="label red" v-if="file.isSensitive">
|
<div class="label red" v-if="file.isSensitive">
|
||||||
<img src="/assets/label-red.svg"/>
|
<img src="/assets/label-red.svg"/>
|
||||||
<p>{{ $t('nsfw') }}</p>
|
<p>{{ $ts.nsfw }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
|
<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
|
||||||
@ -36,7 +36,7 @@ import { faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
|||||||
import { faDownload, faLink, faICursor, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
|
import { faDownload, faLink, faICursor, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
|
||||||
import copyToClipboard from '@/scripts/copy-to-clipboard';
|
import copyToClipboard from '@/scripts/copy-to-clipboard';
|
||||||
import MkDriveFileThumbnail from './drive-file-thumbnail.vue';
|
import MkDriveFileThumbnail from './drive-file-thumbnail.vue';
|
||||||
import bytes from '../filters/bytes';
|
import bytes from '@/filters/bytes';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -82,26 +82,26 @@ export default defineComponent({
|
|||||||
methods: {
|
methods: {
|
||||||
getMenu() {
|
getMenu() {
|
||||||
return [{
|
return [{
|
||||||
text: this.$t('rename'),
|
text: this.$ts.rename,
|
||||||
icon: faICursor,
|
icon: faICursor,
|
||||||
action: this.rename
|
action: this.rename
|
||||||
}, {
|
}, {
|
||||||
text: this.file.isSensitive ? this.$t('unmarkAsSensitive') : this.$t('markAsSensitive'),
|
text: this.file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive,
|
||||||
icon: this.file.isSensitive ? faEye : faEyeSlash,
|
icon: this.file.isSensitive ? faEye : faEyeSlash,
|
||||||
action: this.toggleSensitive
|
action: this.toggleSensitive
|
||||||
}, null, {
|
}, null, {
|
||||||
text: this.$t('copyUrl'),
|
text: this.$ts.copyUrl,
|
||||||
icon: faLink,
|
icon: faLink,
|
||||||
action: this.copyUrl
|
action: this.copyUrl
|
||||||
}, {
|
}, {
|
||||||
type: 'a',
|
type: 'a',
|
||||||
href: this.file.url,
|
href: this.file.url,
|
||||||
target: '_blank',
|
target: '_blank',
|
||||||
text: this.$t('download'),
|
text: this.$ts.download,
|
||||||
icon: faDownload,
|
icon: faDownload,
|
||||||
download: this.file.name
|
download: this.file.name
|
||||||
}, null, {
|
}, null, {
|
||||||
text: this.$t('delete'),
|
text: this.$ts.delete,
|
||||||
icon: faTrashAlt,
|
icon: faTrashAlt,
|
||||||
danger: true,
|
danger: true,
|
||||||
action: this.deleteFile
|
action: this.deleteFile
|
||||||
@ -137,9 +137,9 @@ export default defineComponent({
|
|||||||
|
|
||||||
rename() {
|
rename() {
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('renameFile'),
|
title: this.$ts.renameFile,
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('inputNewFileName'),
|
placeholder: this.$ts.inputNewFileName,
|
||||||
default: this.file.name,
|
default: this.file.name,
|
||||||
allowEmpty: false
|
allowEmpty: false
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,8 @@
|
|||||||
<template v-if="!hover"><Fa :icon="faFolder" fixed-width/></template>
|
<template v-if="!hover"><Fa :icon="faFolder" fixed-width/></template>
|
||||||
{{ folder.name }}
|
{{ folder.name }}
|
||||||
</p>
|
</p>
|
||||||
<p class="upload" v-if="$store.state.settings.uploadFolder == folder.id">
|
<p class="upload" v-if="$store.state.uploadFolder == folder.id">
|
||||||
{{ $t('uploadFolder') }}
|
{{ $ts.uploadFolder }}
|
||||||
</p>
|
</p>
|
||||||
<button v-if="selectMode" class="checkbox _button" :class="{ checked: isSelected }" @click.prevent.stop="checkboxClicked"></button>
|
<button v-if="selectMode" class="checkbox _button" :class="{ checked: isSelected }" @click.prevent.stop="checkboxClicked"></button>
|
||||||
</div>
|
</div>
|
||||||
@ -155,14 +155,14 @@ export default defineComponent({
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case 'detected-circular-definition':
|
case 'detected-circular-definition':
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('unableToProcess'),
|
title: this.$ts.unableToProcess,
|
||||||
text: this.$t('circularReferenceFolder')
|
text: this.$ts.circularReferenceFolder
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('somethingHappened')
|
text: this.$ts.somethingHappened
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -195,9 +195,9 @@ export default defineComponent({
|
|||||||
|
|
||||||
rename() {
|
rename() {
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('renameFolder'),
|
title: this.$ts.renameFolder,
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('inputNewFolderName'),
|
placeholder: this.$ts.inputNewFolderName,
|
||||||
default: this.folder.name
|
default: this.folder.name
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: name }) => {
|
}).then(({ canceled, result: name }) => {
|
||||||
@ -213,40 +213,34 @@ export default defineComponent({
|
|||||||
os.api('drive/folders/delete', {
|
os.api('drive/folders/delete', {
|
||||||
folderId: this.folder.id
|
folderId: this.folder.id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
if (this.$store.state.settings.uploadFolder === this.folder.id) {
|
if (this.$store.state.uploadFolder === this.folder.id) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.set('uploadFolder', null);
|
||||||
key: 'uploadFolder',
|
|
||||||
value: null
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
switch(err.id) {
|
switch(err.id) {
|
||||||
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
title: this.$t('unableToDelete'),
|
title: this.$ts.unableToDelete,
|
||||||
text: this.$t('hasChildFilesOrFolders')
|
text: this.$ts.hasChildFilesOrFolders
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('unableToDelete')
|
text: this.$ts.unableToDelete
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
setAsUploadFolder() {
|
setAsUploadFolder() {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.set('uploadFolder', this.folder.id);
|
||||||
key: 'uploadFolder',
|
|
||||||
value: this.folder.id
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
onContextmenu(e) {
|
onContextmenu(e) {
|
||||||
os.contextMenu([{
|
os.contextMenu([{
|
||||||
text: this.$t('openInWindow'),
|
text: this.$ts.openInWindow,
|
||||||
icon: faWindowRestore,
|
icon: faWindowRestore,
|
||||||
action: () => {
|
action: () => {
|
||||||
os.popup(import('./drive-window.vue'), {
|
os.popup(import('./drive-window.vue'), {
|
||||||
@ -255,11 +249,11 @@ export default defineComponent({
|
|||||||
}, 'closed');
|
}, 'closed');
|
||||||
}
|
}
|
||||||
}, null, {
|
}, null, {
|
||||||
text: this.$t('rename'),
|
text: this.$ts.rename,
|
||||||
icon: faICursor,
|
icon: faICursor,
|
||||||
action: this.rename
|
action: this.rename
|
||||||
}, null, {
|
}, null, {
|
||||||
text: this.$t('delete'),
|
text: this.$ts.delete,
|
||||||
icon: faTrashAlt,
|
icon: faTrashAlt,
|
||||||
danger: true,
|
danger: true,
|
||||||
action: this.deleteFolder
|
action: this.deleteFolder
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
@drop.stop="onDrop"
|
@drop.stop="onDrop"
|
||||||
>
|
>
|
||||||
<i v-if="folder == null"><Fa :icon="faCloud"/></i>
|
<i v-if="folder == null"><Fa :icon="faCloud"/></i>
|
||||||
<span>{{ folder == null ? $t('drive') : folder.name }}</span>
|
<span>{{ folder == null ? $ts.drive : folder.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -17,25 +17,25 @@
|
|||||||
@dragenter="onDragenter"
|
@dragenter="onDragenter"
|
||||||
@dragleave="onDragleave"
|
@dragleave="onDragleave"
|
||||||
@drop.prevent.stop="onDrop"
|
@drop.prevent.stop="onDrop"
|
||||||
@contextmenu="onContextmenu"
|
@contextmenu.stop="onContextmenu"
|
||||||
>
|
>
|
||||||
<div class="contents" ref="contents">
|
<div class="contents" ref="contents">
|
||||||
<div class="folders" ref="foldersContainer" v-show="folders.length > 0">
|
<div class="folders" ref="foldersContainer" v-show="folders.length > 0">
|
||||||
<XFolder v-for="f in folders" :key="f.id" class="folder" :folder="f" :select-mode="select === 'folder'" :is-selected="selectedFolders.some(x => x.id === f.id)" @chosen="chooseFolder"/>
|
<XFolder v-for="f in folders" :key="f.id" class="folder" :folder="f" :select-mode="select === 'folder'" :is-selected="selectedFolders.some(x => x.id === f.id)" @chosen="chooseFolder"/>
|
||||||
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
|
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
|
||||||
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
||||||
<MkButton ref="moreFolders" v-if="moreFolders">{{ $t('loadMore') }}</MkButton>
|
<MkButton ref="moreFolders" v-if="moreFolders">{{ $ts.loadMore }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
<div class="files" ref="filesContainer" v-show="files.length > 0">
|
<div class="files" ref="filesContainer" v-show="files.length > 0">
|
||||||
<XFile v-for="file in files" :key="file.id" class="file" :file="file" :select-mode="select === 'file'" :is-selected="selectedFiles.some(x => x.id === file.id)" @chosen="chooseFile"/>
|
<XFile v-for="file in files" :key="file.id" class="file" :file="file" :select-mode="select === 'file'" :is-selected="selectedFiles.some(x => x.id === file.id)" @chosen="chooseFile"/>
|
||||||
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
|
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
|
||||||
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
||||||
<MkButton ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $t('loadMore') }}</MkButton>
|
<MkButton ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $ts.loadMore }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
|
<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
|
||||||
<p v-if="draghover">{{ $t('empty-draghover') }}</p>
|
<p v-if="draghover">{{ $t('empty-draghover') }}</p>
|
||||||
<p v-if="!draghover && folder == null"><strong>{{ $t('emptyDrive') }}</strong><br/>{{ $t('empty-drive-description') }}</p>
|
<p v-if="!draghover && folder == null"><strong>{{ $ts.emptyDrive }}</strong><br/>{{ $t('empty-drive-description') }}</p>
|
||||||
<p v-if="!draghover && folder != null">{{ $t('emptyFolder') }}</p>
|
<p v-if="!draghover && folder != null">{{ $ts.emptyFolder }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<MkLoading v-if="fetching"/>
|
<MkLoading v-if="fetching"/>
|
||||||
@ -136,7 +136,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.$store.state.device.enableInfiniteScroll && this.$refs.loadMoreFiles) {
|
if (this.$store.state.enableInfiniteScroll && this.$refs.loadMoreFiles) {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
|
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
|
||||||
});
|
});
|
||||||
@ -159,7 +159,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
activated() {
|
activated() {
|
||||||
if (this.$store.state.device.enableInfiniteScroll) {
|
if (this.$store.state.enableInfiniteScroll) {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
|
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
|
||||||
});
|
});
|
||||||
@ -277,14 +277,14 @@ export default defineComponent({
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case 'detected-circular-definition':
|
case 'detected-circular-definition':
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('unableToProcess'),
|
title: this.$ts.unableToProcess,
|
||||||
text: this.$t('circularReferenceFolder')
|
text: this.$ts.circularReferenceFolder
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('somethingHappened')
|
text: this.$ts.somethingHappened
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -298,9 +298,9 @@ export default defineComponent({
|
|||||||
|
|
||||||
urlUpload() {
|
urlUpload() {
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('uploadFromUrl'),
|
title: this.$ts.uploadFromUrl,
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('uploadFromUrlDescription')
|
placeholder: this.$ts.uploadFromUrlDescription
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: url }) => {
|
}).then(({ canceled, result: url }) => {
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
@ -310,17 +310,17 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
|
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('uploadFromUrlRequested'),
|
title: this.$ts.uploadFromUrlRequested,
|
||||||
text: this.$t('uploadFromUrlMayTakeTime')
|
text: this.$ts.uploadFromUrlMayTakeTime
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
createFolder() {
|
createFolder() {
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('createFolder'),
|
title: this.$ts.createFolder,
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('folderName')
|
placeholder: this.$ts.folderName
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: name }) => {
|
}).then(({ canceled, result: name }) => {
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
@ -335,9 +335,9 @@ export default defineComponent({
|
|||||||
|
|
||||||
renameFolder(folder) {
|
renameFolder(folder) {
|
||||||
os.dialog({
|
os.dialog({
|
||||||
title: this.$t('renameFolder'),
|
title: this.$ts.renameFolder,
|
||||||
input: {
|
input: {
|
||||||
placeholder: this.$t('inputNewFolderName'),
|
placeholder: this.$ts.inputNewFolderName,
|
||||||
default: folder.name
|
default: folder.name
|
||||||
}
|
}
|
||||||
}).then(({ canceled, result: name }) => {
|
}).then(({ canceled, result: name }) => {
|
||||||
@ -363,14 +363,14 @@ export default defineComponent({
|
|||||||
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
title: this.$t('unableToDelete'),
|
title: this.$ts.unableToDelete,
|
||||||
text: this.$t('hasChildFilesOrFolders')
|
text: this.$ts.hasChildFilesOrFolders
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('unableToDelete')
|
text: this.$ts.unableToDelete
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -602,29 +602,29 @@ export default defineComponent({
|
|||||||
|
|
||||||
getMenu() {
|
getMenu() {
|
||||||
return [{
|
return [{
|
||||||
text: this.$t('addFile'),
|
text: this.$ts.addFile,
|
||||||
type: 'label'
|
type: 'label'
|
||||||
}, {
|
}, {
|
||||||
text: this.$t('upload'),
|
text: this.$ts.upload,
|
||||||
icon: faUpload,
|
icon: faUpload,
|
||||||
action: () => { this.selectLocalFile(); }
|
action: () => { this.selectLocalFile(); }
|
||||||
}, {
|
}, {
|
||||||
text: this.$t('fromUrl'),
|
text: this.$ts.fromUrl,
|
||||||
icon: faLink,
|
icon: faLink,
|
||||||
action: () => { this.urlUpload(); }
|
action: () => { this.urlUpload(); }
|
||||||
}, null, {
|
}, null, {
|
||||||
text: this.folder ? this.folder.name : this.$t('drive'),
|
text: this.folder ? this.folder.name : this.$ts.drive,
|
||||||
type: 'label'
|
type: 'label'
|
||||||
}, this.folder ? {
|
}, this.folder ? {
|
||||||
text: this.$t('renameFolder'),
|
text: this.$ts.renameFolder,
|
||||||
icon: faICursor,
|
icon: faICursor,
|
||||||
action: () => { this.renameFolder(this.folder); }
|
action: () => { this.renameFolder(this.folder); }
|
||||||
} : undefined, this.folder ? {
|
} : undefined, this.folder ? {
|
||||||
text: this.$t('deleteFolder'),
|
text: this.$ts.deleteFolder,
|
||||||
icon: faTrashAlt,
|
icon: faTrashAlt,
|
||||||
action: () => { this.deleteFolder(this.folder); }
|
action: () => { this.deleteFolder(this.folder); }
|
||||||
} : undefined, {
|
} : undefined, {
|
||||||
text: this.$t('createFolder'),
|
text: this.$ts.createFolder,
|
||||||
icon: faFolderPlus,
|
icon: faFolderPlus,
|
||||||
action: () => { this.createFolder(); }
|
action: () => { this.createFolder(); }
|
||||||
}];
|
}];
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')">
|
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')">
|
||||||
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
|
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
|
||||||
<input ref="search" class="search" :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$t('search')" @paste.stop="paste" @keyup.enter="done()">
|
<input ref="search" class="search" :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
|
||||||
<div class="emojis">
|
<div class="emojis" ref="emojis">
|
||||||
<section class="result">
|
<section class="result">
|
||||||
<div v-if="searchResultCustom.length > 0">
|
<div v-if="searchResultCustom.length > 0">
|
||||||
<button v-for="emoji in searchResultCustom"
|
<button v-for="emoji in searchResultCustom"
|
||||||
@ -13,7 +13,7 @@
|
|||||||
tabindex="0"
|
tabindex="0"
|
||||||
>
|
>
|
||||||
<MkEmoji v-if="emoji.char != null" :emoji="emoji.char"/>
|
<MkEmoji v-if="emoji.char != null" :emoji="emoji.char"/>
|
||||||
<img v-else :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
<img v-else :src="$store.state.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="searchResultUnicode.length > 0">
|
<div v-if="searchResultUnicode.length > 0">
|
||||||
@ -43,9 +43,9 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<header class="_acrylic"><Fa :icon="faClock" fixed-width/> {{ $t('recentUsed') }}</header>
|
<header class="_acrylic"><Fa :icon="faClock" fixed-width/> {{ $ts.recentUsed }}</header>
|
||||||
<div>
|
<div>
|
||||||
<button v-for="emoji in $store.state.device.recentlyUsedEmojis"
|
<button v-for="emoji in $store.state.recentlyUsedEmojis"
|
||||||
class="_button"
|
class="_button"
|
||||||
@click="chosen(emoji, $event)"
|
@click="chosen(emoji, $event)"
|
||||||
:key="emoji"
|
:key="emoji"
|
||||||
@ -59,7 +59,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section v-for="category in customEmojiCategories" :key="'custom:' + category" class="custom">
|
<section v-for="category in customEmojiCategories" :key="'custom:' + category" class="custom">
|
||||||
<header class="_acrylic" v-appear="() => visibleCategories[category] = true">{{ category || $t('other') }}</header>
|
<header class="_acrylic" v-appear="() => visibleCategories[category] = true">{{ category || $ts.other }}</header>
|
||||||
<div v-if="visibleCategories[category]">
|
<div v-if="visibleCategories[category]">
|
||||||
<button v-for="emoji in customEmojis.filter(e => e.category === category)"
|
<button v-for="emoji in customEmojis.filter(e => e.category === category)"
|
||||||
class="_button"
|
class="_button"
|
||||||
@ -67,7 +67,7 @@
|
|||||||
@click="chosen(emoji, $event)"
|
@click="chosen(emoji, $event)"
|
||||||
:key="emoji.name"
|
:key="emoji.name"
|
||||||
>
|
>
|
||||||
<img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
<img :src="$store.state.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@ -100,6 +100,7 @@ import MkModal from '@/components/ui/modal.vue';
|
|||||||
import Particle from '@/components/particle.vue';
|
import Particle from '@/components/particle.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import { isDeviceTouch } from '../scripts/is-device-touch';
|
import { isDeviceTouch } from '../scripts/is-device-touch';
|
||||||
|
import { emojiCategories } from '@/instance';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -125,12 +126,12 @@ export default defineComponent({
|
|||||||
return {
|
return {
|
||||||
emojilist: markRaw(emojilist),
|
emojilist: markRaw(emojilist),
|
||||||
getStaticImageUrl,
|
getStaticImageUrl,
|
||||||
pinned: this.$store.state.settings.reactions,
|
pinned: this.$store.state.reactions,
|
||||||
width: this.asReactionPicker ? this.$store.state.device.reactionPickerWidth : 3,
|
width: this.asReactionPicker ? this.$store.state.reactionPickerWidth : 3,
|
||||||
height: this.asReactionPicker ? this.$store.state.device.reactionPickerHeight : 2,
|
height: this.asReactionPicker ? this.$store.state.reactionPickerHeight : 2,
|
||||||
big: this.asReactionPicker ? isDeviceTouch : false,
|
big: this.asReactionPicker ? isDeviceTouch : false,
|
||||||
customEmojiCategories: this.$store.getters['instance/emojiCategories'],
|
customEmojiCategories: emojiCategories,
|
||||||
customEmojis: this.$store.state.instance.meta.emojis,
|
customEmojis: this.$instance.emojis,
|
||||||
visibleCategories: {},
|
visibleCategories: {},
|
||||||
q: null,
|
q: null,
|
||||||
searchResultCustom: [],
|
searchResultCustom: [],
|
||||||
@ -179,6 +180,8 @@ export default defineComponent({
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
q() {
|
q() {
|
||||||
|
this.$refs.emojis.scrollTop = 0;
|
||||||
|
|
||||||
if (this.q == null || this.q === '') {
|
if (this.q == null || this.q === '') {
|
||||||
this.searchResultCustom = [];
|
this.searchResultCustom = [];
|
||||||
this.searchResultUnicode = [];
|
this.searchResultUnicode = [];
|
||||||
@ -346,10 +349,10 @@ export default defineComponent({
|
|||||||
|
|
||||||
// 最近使った絵文字更新
|
// 最近使った絵文字更新
|
||||||
if (!this.pinned.includes(key)) {
|
if (!this.pinned.includes(key)) {
|
||||||
let recents = this.$store.state.device.recentlyUsedEmojis;
|
let recents = this.$store.state.recentlyUsedEmojis;
|
||||||
recents = recents.filter((e: any) => e !== key);
|
recents = recents.filter((e: any) => e !== key);
|
||||||
recents.unshift(key);
|
recents.unshift(key);
|
||||||
this.$store.commit('device/set', { key: 'recentlyUsedEmojis', value: recents.splice(0, 16) });
|
this.$store.set('recentlyUsedEmojis', recents.splice(0, 16));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
34
src/client/components/featured-photos.vue
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div class="xfbouadm" v-if="meta" :style="{ backgroundImage: `url(${ meta.backgroundImageUrl })` }">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import * as os from '@/os';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
meta: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
os.api('meta', { detail: true }).then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.xfbouadm {
|
||||||
|
background-position: center;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,29 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<button class="kpoogebi _button"
|
<button class="kpoogebi _button"
|
||||||
:class="{ wait, active: isFollowing || hasPendingFollowRequestFromYou, full }"
|
:class="{ wait, active: isFollowing || hasPendingFollowRequestFromYou, full, large }"
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
:disabled="wait"
|
:disabled="wait"
|
||||||
v-if="isFollowing != null"
|
|
||||||
>
|
>
|
||||||
<template v-if="!wait">
|
<template v-if="!wait">
|
||||||
<template v-if="hasPendingFollowRequestFromYou && user.isLocked">
|
<template v-if="hasPendingFollowRequestFromYou && user.isLocked">
|
||||||
<span v-if="full">{{ $t('followRequestPending') }}</span><Fa :icon="faHourglassHalf"/>
|
<span v-if="full">{{ $ts.followRequestPending }}</span><Fa :icon="faHourglassHalf"/>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked"> <!-- つまりリモートフォローの場合。 -->
|
<template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked"> <!-- つまりリモートフォローの場合。 -->
|
||||||
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse/>
|
<span v-if="full">{{ $ts.processing }}</span><Fa :icon="faSpinner" pulse/>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="isFollowing">
|
<template v-else-if="isFollowing">
|
||||||
<span v-if="full">{{ $t('unfollow') }}</span><Fa :icon="faMinus"/>
|
<span v-if="full">{{ $ts.unfollow }}</span><Fa :icon="faMinus"/>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="!isFollowing && user.isLocked">
|
<template v-else-if="!isFollowing && user.isLocked">
|
||||||
<span v-if="full">{{ $t('followRequest') }}</span><Fa :icon="faPlus"/>
|
<span v-if="full">{{ $ts.followRequest }}</span><Fa :icon="faPlus"/>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="!isFollowing && !user.isLocked">
|
<template v-else-if="!isFollowing && !user.isLocked">
|
||||||
<span v-if="full">{{ $t('follow') }}</span><Fa :icon="faPlus"/>
|
<span v-if="full">{{ $ts.follow }}</span><Fa :icon="faPlus"/>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
<span v-if="full">{{ $ts.processing }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
||||||
</template>
|
</template>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
@ -44,6 +43,11 @@ export default defineComponent({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
large: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
@ -149,6 +153,12 @@ export default defineComponent({
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.large {
|
||||||
|
font-size: 16px;
|
||||||
|
height: 38px;
|
||||||
|
padding: 0 12px 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
&:not(.full) {
|
&:not(.full) {
|
||||||
width: 31px;
|
width: 31px;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<XModalWindow ref="dialog"
|
<XModalWindow ref="dialog"
|
||||||
:width="400"
|
:width="450"
|
||||||
:can-close="false"
|
:can-close="false"
|
||||||
:with-ok-button="true"
|
:with-ok-button="true"
|
||||||
:ok-button-disabled="false"
|
:ok-button-disabled="false"
|
||||||
@ -12,42 +12,61 @@
|
|||||||
<template #header>
|
<template #header>
|
||||||
{{ title }}
|
{{ title }}
|
||||||
</template>
|
</template>
|
||||||
<div class="xkpnjxcv _section">
|
<FormBase class="xkpnjxcv">
|
||||||
<label v-for="item in Object.keys(form).filter(item => !form[item].hidden)" :key="item">
|
<template v-for="item in Object.keys(form).filter(item => !form[item].hidden)">
|
||||||
<MkInput v-if="form[item].type === 'number'" v-model:value="values[item]" type="number" :step="form[item].step || 1">
|
<FormInput v-if="form[item].type === 'number'" v-model:value="values[item]" type="number" :step="form[item].step || 1">
|
||||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span>
|
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span>
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
</MkInput>
|
</FormInput>
|
||||||
<MkInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model:value="values[item]" type="text">
|
<FormInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model:value="values[item]" type="text">
|
||||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span>
|
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span>
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
</MkInput>
|
</FormInput>
|
||||||
<MkTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model:value="values[item]">
|
<FormTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model:value="values[item]">
|
||||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span>
|
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span>
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
</MkTextarea>
|
</FormTextarea>
|
||||||
<MkSwitch v-else-if="form[item].type === 'boolean'" v-model:value="values[item]">
|
<FormSwitch v-else-if="form[item].type === 'boolean'" v-model:value="values[item]">
|
||||||
<span v-text="form[item].label || item"></span>
|
<span v-text="form[item].label || item"></span>
|
||||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
</MkSwitch>
|
</FormSwitch>
|
||||||
</label>
|
<FormSelect v-else-if="form[item].type === 'enum'" v-model:value="values[item]">
|
||||||
</div>
|
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
|
<option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option>
|
||||||
|
</FormSelect>
|
||||||
|
<FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step">
|
||||||
|
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||||
|
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||||
|
</FormRange>
|
||||||
|
<FormButton v-else-if="form[item].type === 'button'" @click="form[item].action($event, values)">
|
||||||
|
<span v-text="form[item].content || item"></span>
|
||||||
|
</FormButton>
|
||||||
|
</template>
|
||||||
|
</FormBase>
|
||||||
</XModalWindow>
|
</XModalWindow>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import XModalWindow from '@/components/ui/modal-window.vue';
|
import XModalWindow from '@/components/ui/modal-window.vue';
|
||||||
import MkInput from './ui/input.vue';
|
import FormBase from './form/base.vue';
|
||||||
import MkTextarea from './ui/textarea.vue';
|
import FormInput from './form/input.vue';
|
||||||
import MkSwitch from './ui/switch.vue';
|
import FormTextarea from './form/textarea.vue';
|
||||||
|
import FormSwitch from './form/switch.vue';
|
||||||
|
import FormSelect from './form/select.vue';
|
||||||
|
import FormRange from './form/range.vue';
|
||||||
|
import FormButton from './form/button.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XModalWindow,
|
XModalWindow,
|
||||||
MkInput,
|
FormBase,
|
||||||
MkTextarea,
|
FormInput,
|
||||||
MkSwitch,
|
FormTextarea,
|
||||||
|
FormSwitch,
|
||||||
|
FormSelect,
|
||||||
|
FormRange,
|
||||||
|
FormButton,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
@ -95,12 +114,6 @@ export default defineComponent({
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.xkpnjxcv {
|
.xkpnjxcv {
|
||||||
> label {
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
margin-bottom: 32px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
56
src/client/components/form/base.vue
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<template>
|
||||||
|
<div class="rbusrurv" :class="{ wide: forceWide }" v-size="{ max: [400] }">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
forceWide: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.rbusrurv {
|
||||||
|
line-height: 1.4em;
|
||||||
|
background: var(--bg);
|
||||||
|
padding: 32px;
|
||||||
|
|
||||||
|
&:not(.wide).max-width_400px {
|
||||||
|
padding: 32px 0;
|
||||||
|
|
||||||
|
> ::v-deep(*) {
|
||||||
|
._formPanel {
|
||||||
|
border: solid 0.5px var(--divider);
|
||||||
|
border-radius: 0;
|
||||||
|
border-left: none;
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
._form_group {
|
||||||
|
> * {
|
||||||
|
&:not(:first-child) {
|
||||||
|
&._formPanel, ._formPanel {
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
&._formPanel, ._formPanel {
|
||||||
|
border-bottom: solid 0.5px var(--divider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
81
src/client/components/form/button.vue
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
<template>
|
||||||
|
<div class="yzpgjkxe _formItem">
|
||||||
|
<div class="_formLabel"><slot name="label"></slot></div>
|
||||||
|
<button class="main _button _formPanel _formClickable" :class="{ center, primary, danger }">
|
||||||
|
<slot></slot>
|
||||||
|
<div class="suffix">
|
||||||
|
<slot name="suffix"></slot>
|
||||||
|
<div class="icon">
|
||||||
|
<slot name="suffixIcon"></slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div class="_formCaption"><slot name="desc"></slot></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
primary: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
danger: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
center: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.yzpgjkxe {
|
||||||
|
> .main {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 14px 16px;
|
||||||
|
text-align: left;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&.center {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
color: var(--accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.danger {
|
||||||
|
color: #ff2a2a;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .suffix {
|
||||||
|
display: inline-flex;
|
||||||
|
margin-left: auto;
|
||||||
|
opacity: 0.7;
|
||||||
|
|
||||||
|
> .icon {
|
||||||
|
margin-left: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
36
src/client/components/form/form.scss
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
._formPanel {
|
||||||
|
background: var(--panel);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
|
||||||
|
&._formClickable {
|
||||||
|
&:hover {
|
||||||
|
//background: var(--panelHighlight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
._formLabel {
|
||||||
|
font-size: 80%;
|
||||||
|
padding: 0 16px 8px 16px;
|
||||||
|
opacity: 0.8;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
._formCaption {
|
||||||
|
font-size: 80%;
|
||||||
|
padding: 8px 16px 0 16px;
|
||||||
|
opacity: 0.8;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
._formItem {
|
||||||
|
& + ._formItem {
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
}
|
42
src/client/components/form/group.vue
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<template>
|
||||||
|
<div class="vrtktovg _formItem" v-size="{ max: [500] }">
|
||||||
|
<div class="_formLabel"><slot name="label"></slot></div>
|
||||||
|
<div class="main _form_group">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
<div class="_formCaption"><slot name="caption"></slot></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.vrtktovg {
|
||||||
|
> .main {
|
||||||
|
> ::v-deep(*) {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
&:not(:first-child) {
|
||||||
|
&._formPanel, ._formPanel {
|
||||||
|
border-top: none;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
&._formPanel, ._formPanel {
|
||||||
|
border-bottom: solid 0.5px var(--divider);
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
306
src/client/components/form/input.vue
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
<template>
|
||||||
|
<div class="ztzhwixg _formItem" :class="{ inline, disabled }">
|
||||||
|
<div class="_formLabel"><slot></slot></div>
|
||||||
|
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
||||||
|
<div class="input _formPanel">
|
||||||
|
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
||||||
|
<input v-if="debounce" ref="inputEl"
|
||||||
|
v-debounce="500"
|
||||||
|
:type="type"
|
||||||
|
v-model.lazy="v"
|
||||||
|
:disabled="disabled"
|
||||||
|
:required="required"
|
||||||
|
:readonly="readonly"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
:pattern="pattern"
|
||||||
|
:autocomplete="autocomplete"
|
||||||
|
:spellcheck="spellcheck"
|
||||||
|
:step="step"
|
||||||
|
@focus="focused = true"
|
||||||
|
@blur="focused = false"
|
||||||
|
@keydown="onKeydown($event)"
|
||||||
|
@input="onInput"
|
||||||
|
:list="id"
|
||||||
|
>
|
||||||
|
<input v-else ref="inputEl"
|
||||||
|
:type="type"
|
||||||
|
v-model="v"
|
||||||
|
:disabled="disabled"
|
||||||
|
:required="required"
|
||||||
|
:readonly="readonly"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
:pattern="pattern"
|
||||||
|
:autocomplete="autocomplete"
|
||||||
|
:spellcheck="spellcheck"
|
||||||
|
:step="step"
|
||||||
|
@focus="focused = true"
|
||||||
|
@blur="focused = false"
|
||||||
|
@keydown="onKeydown($event)"
|
||||||
|
@input="onInput"
|
||||||
|
:list="id"
|
||||||
|
>
|
||||||
|
<datalist :id="id" v-if="datalist">
|
||||||
|
<option v-for="data in datalist" :value="data"/>
|
||||||
|
</datalist>
|
||||||
|
<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
|
||||||
|
</div>
|
||||||
|
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $ts.save }}</button>
|
||||||
|
<div class="_formCaption"><slot name="desc"></slot></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
||||||
|
import debounce from 'v-debounce';
|
||||||
|
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
directives: {
|
||||||
|
debounce
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
readonly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
pattern: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
autofocus: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
autocomplete: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
spellcheck: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
step: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
debounce: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
datalist: {
|
||||||
|
type: Array,
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
save: {
|
||||||
|
type: Function,
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
emits: ['change', 'keydown', 'enter'],
|
||||||
|
setup(props, context) {
|
||||||
|
const { value, type, autofocus } = toRefs(props);
|
||||||
|
const v = ref(value.value);
|
||||||
|
const id = Math.random().toString(); // TODO: uuid?
|
||||||
|
const focused = ref(false);
|
||||||
|
const changed = ref(false);
|
||||||
|
const invalid = ref(false);
|
||||||
|
const filled = computed(() => v.value !== '' && v.value != null);
|
||||||
|
const inputEl = ref(null);
|
||||||
|
const prefixEl = ref(null);
|
||||||
|
const suffixEl = ref(null);
|
||||||
|
|
||||||
|
const focus = () => inputEl.value.focus();
|
||||||
|
const onInput = (ev) => {
|
||||||
|
changed.value = true;
|
||||||
|
context.emit('change', ev);
|
||||||
|
};
|
||||||
|
const onKeydown = (ev: KeyboardEvent) => {
|
||||||
|
context.emit('keydown', ev);
|
||||||
|
|
||||||
|
if (ev.code === 'Enter') {
|
||||||
|
context.emit('enter');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
watch(value, newValue => {
|
||||||
|
v.value = newValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(v, newValue => {
|
||||||
|
if (type?.value === 'number') {
|
||||||
|
context.emit('update:value', parseFloat(newValue));
|
||||||
|
} else {
|
||||||
|
context.emit('update:value', newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
invalid.value = inputEl.value.validity.badInput;
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
if (autofocus.value) {
|
||||||
|
focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// このコンポーネントが作成された時、非表示状態である場合がある
|
||||||
|
// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
|
||||||
|
const clock = setInterval(() => {
|
||||||
|
if (prefixEl.value) {
|
||||||
|
if (prefixEl.value.offsetWidth) {
|
||||||
|
inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (suffixEl.value) {
|
||||||
|
if (suffixEl.value.offsetWidth) {
|
||||||
|
inputEl.value.style.paddingRight = suffixEl.value.offsetWidth + 'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 100);
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
clearInterval(clock);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
v,
|
||||||
|
focused,
|
||||||
|
invalid,
|
||||||
|
changed,
|
||||||
|
filled,
|
||||||
|
inputEl,
|
||||||
|
prefixEl,
|
||||||
|
suffixEl,
|
||||||
|
focus,
|
||||||
|
onInput,
|
||||||
|
onKeydown,
|
||||||
|
faExclamationCircle,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.ztzhwixg {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> .icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 24px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 32px;
|
||||||
|
|
||||||
|
&:not(:empty) + .input {
|
||||||
|
margin-left: 28px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .input {
|
||||||
|
$height: 52px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> input {
|
||||||
|
display: block;
|
||||||
|
height: $height;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 16px;
|
||||||
|
font: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: $height;
|
||||||
|
color: var(--inputText);
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
outline: none;
|
||||||
|
box-shadow: none;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
&[type='file'] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .prefix,
|
||||||
|
> .suffix {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
top: 0;
|
||||||
|
padding: 0 16px;
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: $height;
|
||||||
|
color: var(--inputLabel);
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
> * {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 16px;
|
||||||
|
max-width: 150px;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .prefix {
|
||||||
|
left: 0;
|
||||||
|
padding-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .suffix {
|
||||||
|
right: 0;
|
||||||
|
padding-left: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .save {
|
||||||
|
margin: 6px 0 0 0;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.inline {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
opacity: 0.7;
|
||||||
|
|
||||||
|
&, * {
|
||||||
|
cursor: not-allowed !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
30
src/client/components/form/key-value-view.vue
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<template>
|
||||||
|
<div class="_formItem">
|
||||||
|
<div class="_formPanel anocepby">
|
||||||
|
<span class="key"><slot name="key"></slot></span>
|
||||||
|
<span class="value"><slot name="value"></slot></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.anocepby {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 14px 16px;
|
||||||
|
|
||||||
|
> .value {
|
||||||
|
margin-left: auto;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
100
src/client/components/form/link.vue
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<template>
|
||||||
|
<div class="qmfkfnzi _formItem">
|
||||||
|
<a class="main _button _formPanel _formClickable" :href="to" target="_blank" v-if="external">
|
||||||
|
<span class="icon"><slot name="icon"></slot></span>
|
||||||
|
<span class="text"><slot></slot></span>
|
||||||
|
<span class="right">
|
||||||
|
<span class="text"><slot name="suffix"></slot></span>
|
||||||
|
<Fa :icon="faExternalLinkAlt" class="icon"/>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
<MkA class="main _button _formPanel _formClickable" :class="{ active }" :to="to" v-else>
|
||||||
|
<span class="icon"><slot name="icon"></slot></span>
|
||||||
|
<span class="text"><slot></slot></span>
|
||||||
|
<span class="right">
|
||||||
|
<span class="text"><slot name="suffix"></slot></span>
|
||||||
|
<Fa :icon="faChevronRight" class="icon"/>
|
||||||
|
</span>
|
||||||
|
</MkA>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { faChevronRight, faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
to: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
active: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
external: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
faChevronRight, faExternalLinkAlt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.qmfkfnzi {
|
||||||
|
> .main {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 14px 16px 14px 14px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
color: var(--accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
> .icon {
|
||||||
|
width: 32px;
|
||||||
|
margin-right: 2px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
text-align: center;
|
||||||
|
opacity: 0.8;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
& + .text {
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .text {
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
padding-right: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .right {
|
||||||
|
margin-left: auto;
|
||||||
|
opacity: 0.7;
|
||||||
|
|
||||||
|
> .text:not(:empty) {
|
||||||
|
margin-right: 0.75em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
42
src/client/components/form/pagination.vue
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<template>
|
||||||
|
<FormGroup class="uljviswt _formItem">
|
||||||
|
<template #label><slot name="label"></slot></template>
|
||||||
|
<slot :items="items"></slot>
|
||||||
|
<div class="empty" v-if="empty" key="_empty_">
|
||||||
|
<slot name="empty"></slot>
|
||||||
|
</div>
|
||||||
|
<FormButton v-show="more" class="button" @click="fetchMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary>
|
||||||
|
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
||||||
|
<template v-if="moreFetching"><MkLoading inline/></template>
|
||||||
|
</FormButton>
|
||||||
|
</FormGroup>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import FormButton from './button.vue';
|
||||||
|
import FormGroup from './group.vue';
|
||||||
|
import paging from '@/scripts/paging';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
FormButton,
|
||||||
|
FormGroup,
|
||||||
|
},
|
||||||
|
|
||||||
|
mixins: [
|
||||||
|
paging({}),
|
||||||
|
],
|
||||||
|
|
||||||
|
props: {
|
||||||
|
pagination: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.uljviswt {
|
||||||
|
}
|
||||||
|
</style>
|
106
src/client/components/form/radios.vue
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, h } from 'vue';
|
||||||
|
import MkRadio from '@/components/ui/radio.vue';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MkRadio
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
modelValue: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
value: this.modelValue,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value() {
|
||||||
|
this.$emit('update:modelValue', this.value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
render() {
|
||||||
|
const label = this.$slots.desc();
|
||||||
|
const options = this.$slots.default();
|
||||||
|
|
||||||
|
return h('div', {
|
||||||
|
class: 'cnklmpwm _formItem'
|
||||||
|
}, [
|
||||||
|
h('div', {
|
||||||
|
class: '_formLabel',
|
||||||
|
}, label),
|
||||||
|
...options.map(option => h('button', {
|
||||||
|
class: '_button _formPanel _formClickable',
|
||||||
|
key: option.props.value,
|
||||||
|
onClick: () => this.value = option.props.value,
|
||||||
|
}, [h('span', {
|
||||||
|
class: ['check', { checked: this.value === option.props.value }],
|
||||||
|
}), option.children]))
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.cnklmpwm {
|
||||||
|
> button {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 14px 18px;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
&:not(:first-of-type) {
|
||||||
|
border-top: none !important;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(:last-of-type) {
|
||||||
|
border-bottom: solid 0.5px var(--divider);
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .check {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: bottom;
|
||||||
|
position: relative;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
margin-right: 8px;
|
||||||
|
background: none;
|
||||||
|
border: 2px solid var(--inputBorder);
|
||||||
|
border-radius: 100%;
|
||||||
|
transition: inherit;
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 3px;
|
||||||
|
right: 3px;
|
||||||
|
bottom: 3px;
|
||||||
|
left: 3px;
|
||||||
|
border-radius: 100%;
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0);
|
||||||
|
transition: .4s cubic-bezier(.25,.8,.25,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.checked {
|
||||||
|
border-color: var(--accent);
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
background-color: var(--accent);
|
||||||
|
transform: scale(1);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
122
src/client/components/form/range.vue
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<template>
|
||||||
|
<div class="ifitouly _formItem" :class="{ focused, disabled }">
|
||||||
|
<div class="_formLabel"><slot name="label"></slot></div>
|
||||||
|
<div class="_formPanel main">
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
ref="input"
|
||||||
|
v-model="v"
|
||||||
|
:disabled="disabled"
|
||||||
|
:min="min"
|
||||||
|
:max="max"
|
||||||
|
:step="step"
|
||||||
|
@focus="focused = true"
|
||||||
|
@blur="focused = false"
|
||||||
|
@input="$emit('update:value', $event.target.value)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="_formCaption"><slot name="caption"></slot></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
min: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
max: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 100
|
||||||
|
},
|
||||||
|
step: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 1
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
v: this.value,
|
||||||
|
focused: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value(v) {
|
||||||
|
this.v = parseFloat(v);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.ifitouly {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> .main {
|
||||||
|
padding: 24px 16px;
|
||||||
|
|
||||||
|
> input {
|
||||||
|
display: block;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
background: var(--X10);
|
||||||
|
height: 4px;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
outline: 0;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 7px;
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-slider-thumb {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: block;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: none;
|
||||||
|
background: var(--accent);
|
||||||
|
box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-moz-range-thumb {
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: block;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: none;
|
||||||
|
background: var(--accent);
|
||||||
|
box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
147
src/client/components/form/select.vue
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
<template>
|
||||||
|
<div class="yrtfrpux _formItem" :class="{ disabled, inline }">
|
||||||
|
<div class="_formLabel"><slot name="label"></slot></div>
|
||||||
|
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
||||||
|
<div class="input _formPanel _formClickable" @click="focus">
|
||||||
|
<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
|
||||||
|
<select ref="input"
|
||||||
|
v-model="v"
|
||||||
|
:required="required"
|
||||||
|
:disabled="disabled"
|
||||||
|
@focus="focused = true"
|
||||||
|
@blur="focused = false"
|
||||||
|
>
|
||||||
|
<slot></slot>
|
||||||
|
</select>
|
||||||
|
<div class="suffix">
|
||||||
|
<Fa :icon="faChevronDown"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="_formCaption"><slot name="caption"></slot></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { faChevronDown } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
faChevronDown,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
v: {
|
||||||
|
get() {
|
||||||
|
return this.value;
|
||||||
|
},
|
||||||
|
set(v) {
|
||||||
|
this.$emit('update:value', v);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
focus() {
|
||||||
|
this.$refs.input.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.yrtfrpux {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> .icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 24px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 32px;
|
||||||
|
|
||||||
|
&:not(:empty) + .input {
|
||||||
|
margin-left: 28px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .input {
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> select {
|
||||||
|
display: block;
|
||||||
|
flex: 1;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 16px;
|
||||||
|
font: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 1em;
|
||||||
|
height: 52px;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
outline: none;
|
||||||
|
box-shadow: none;
|
||||||
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
color: var(--fg);
|
||||||
|
|
||||||
|
option,
|
||||||
|
optgroup {
|
||||||
|
color: var(--fg);
|
||||||
|
background: var(--bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .prefix,
|
||||||
|
> .suffix {
|
||||||
|
display: block;
|
||||||
|
align-self: center;
|
||||||
|
justify-self: center;
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 32px;
|
||||||
|
color: var(--inputLabel);
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
> * {
|
||||||
|
display: block;
|
||||||
|
min-width: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .prefix {
|
||||||
|
padding-right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .suffix {
|
||||||
|
padding: 0 16px 0 0;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
132
src/client/components/form/switch.vue
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
<template>
|
||||||
|
<div class="ijnpvmgr _formItem">
|
||||||
|
<div class="main _formPanel _formClickable"
|
||||||
|
:class="{ disabled, checked }"
|
||||||
|
:aria-checked="checked"
|
||||||
|
:aria-disabled="disabled"
|
||||||
|
@click.prevent="toggle"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
ref="input"
|
||||||
|
:disabled="disabled"
|
||||||
|
@keydown.enter="toggle"
|
||||||
|
>
|
||||||
|
<span class="button">
|
||||||
|
<span></span>
|
||||||
|
</span>
|
||||||
|
<span class="label">
|
||||||
|
<span><slot></slot></span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="_formCaption"><slot name="desc"></slot></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
checked(): boolean {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
toggle() {
|
||||||
|
if (this.disabled) return;
|
||||||
|
this.$emit('update:value', !this.checked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.ijnpvmgr {
|
||||||
|
> .main {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
padding: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.checked {
|
||||||
|
> .button {
|
||||||
|
background-color: var(--X10);
|
||||||
|
border-color: var(--X10);
|
||||||
|
|
||||||
|
> * {
|
||||||
|
background-color: var(--accent);
|
||||||
|
transform: translateX(14px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> input {
|
||||||
|
position: absolute;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
opacity: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .button {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin: 3px 0 0 0;
|
||||||
|
width: 34px;
|
||||||
|
height: 14px;
|
||||||
|
background: var(--X6);
|
||||||
|
outline: none;
|
||||||
|
border-radius: 14px;
|
||||||
|
transition: all 0.3s;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
position: absolute;
|
||||||
|
top: -3px;
|
||||||
|
left: 0;
|
||||||
|
border-radius: 100%;
|
||||||
|
transition: background-color 0.3s, transform 0.3s;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-color: #fff;
|
||||||
|
box-shadow: 0 2px 1px -1px rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), 0 1px 3px 0 rgba(#000, 0.12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .label {
|
||||||
|
margin-left: 12px;
|
||||||
|
display: block;
|
||||||
|
transition: inherit;
|
||||||
|
color: var(--fg);
|
||||||
|
|
||||||
|
> span {
|
||||||
|
display: block;
|
||||||
|
line-height: 20px;
|
||||||
|
transition: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
136
src/client/components/form/textarea.vue
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
<template>
|
||||||
|
<div class="rivhosbp _formItem" :class="{ tall, pre }">
|
||||||
|
<div class="_formLabel"><slot></slot></div>
|
||||||
|
<div class="input _formPanel">
|
||||||
|
<textarea ref="input" :class="{ code, _monospace: code }"
|
||||||
|
:value="value"
|
||||||
|
:required="required"
|
||||||
|
:readonly="readonly"
|
||||||
|
:pattern="pattern"
|
||||||
|
:autocomplete="autocomplete"
|
||||||
|
:spellcheck="!code"
|
||||||
|
@input="onInput"
|
||||||
|
@focus="focused = true"
|
||||||
|
@blur="focused = false"
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $ts.save }}</button>
|
||||||
|
<div class="_formCaption"><slot name="desc"></slot></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import './form.scss';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
readonly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
pattern: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
autocomplete: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
tall: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
pre: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
save: {
|
||||||
|
type: Function,
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
changed: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
focus() {
|
||||||
|
this.$refs.input.focus();
|
||||||
|
},
|
||||||
|
onInput(ev) {
|
||||||
|
this.changed = true;
|
||||||
|
this.$emit('update:value', ev.target.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.rivhosbp {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> .input {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> textarea {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
min-width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
min-height: 130px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 1em;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
outline: none;
|
||||||
|
box-shadow: none;
|
||||||
|
color: var(--fg);
|
||||||
|
|
||||||
|
&.code {
|
||||||
|
tab-size: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .save {
|
||||||
|
margin: 6px 0 0 0;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.tall {
|
||||||
|
> .input {
|
||||||
|
> textarea {
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.pre {
|
||||||
|
> .input {
|
||||||
|
> textarea {
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
36
src/client/components/form/tuple.vue
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<div class="wthhikgt _formItem" v-size="{ max: [500] }">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.wthhikgt {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
> ::v-deep(*) {
|
||||||
|
flex: 1;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
margin-right: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.max-width_500px {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
> ::v-deep(*) {
|
||||||
|
margin: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -10,8 +10,9 @@ import { faExpandAlt, faColumns, faExternalLinkAlt, faLink, faWindowMaximize } f
|
|||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import copyToClipboard from '@/scripts/copy-to-clipboard';
|
import copyToClipboard from '@/scripts/copy-to-clipboard';
|
||||||
import { router } from '@/router';
|
import { router } from '@/router';
|
||||||
import { ui, url } from '@/config';
|
import { url } from '@/config';
|
||||||
import { popout } from '@/scripts/popout';
|
import { popout } from '@/scripts/popout';
|
||||||
|
import { ColdDeviceStorage } from '@/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
inject: {
|
inject: {
|
||||||
@ -57,31 +58,31 @@ export default defineComponent({
|
|||||||
text: this.to,
|
text: this.to,
|
||||||
}, {
|
}, {
|
||||||
icon: faWindowMaximize,
|
icon: faWindowMaximize,
|
||||||
text: this.$t('openInWindow'),
|
text: this.$ts.openInWindow,
|
||||||
action: () => {
|
action: () => {
|
||||||
os.pageWindow(this.to);
|
os.pageWindow(this.to);
|
||||||
}
|
}
|
||||||
}, this.sideViewHook ? {
|
}, this.sideViewHook ? {
|
||||||
icon: faColumns,
|
icon: faColumns,
|
||||||
text: this.$t('openInSideView'),
|
text: this.$ts.openInSideView,
|
||||||
action: () => {
|
action: () => {
|
||||||
this.sideViewHook(this.to);
|
this.sideViewHook(this.to);
|
||||||
}
|
}
|
||||||
} : undefined, {
|
} : undefined, {
|
||||||
icon: faExpandAlt,
|
icon: faExpandAlt,
|
||||||
text: this.$t('showInPage'),
|
text: this.$ts.showInPage,
|
||||||
action: () => {
|
action: () => {
|
||||||
this.$router.push(this.to);
|
this.$router.push(this.to);
|
||||||
}
|
}
|
||||||
}, null, {
|
}, null, {
|
||||||
icon: faExternalLinkAlt,
|
icon: faExternalLinkAlt,
|
||||||
text: this.$t('openInNewTab'),
|
text: this.$ts.openInNewTab,
|
||||||
action: () => {
|
action: () => {
|
||||||
window.open(this.to, '_blank');
|
window.open(this.to, '_blank');
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
icon: faLink,
|
icon: faLink,
|
||||||
text: this.$t('copyLink'),
|
text: this.$ts.copyLink,
|
||||||
action: () => {
|
action: () => {
|
||||||
copyToClipboard(`${url}${this.to}`);
|
copyToClipboard(`${url}${this.to}`);
|
||||||
}
|
}
|
||||||
@ -98,8 +99,8 @@ export default defineComponent({
|
|||||||
|
|
||||||
nav() {
|
nav() {
|
||||||
if (this.to.startsWith('/my/messaging')) {
|
if (this.to.startsWith('/my/messaging')) {
|
||||||
if (this.$store.state.device.chatOpenBehavior === 'window') return this.window();
|
if (ColdDeviceStorage.get('chatOpenBehavior') === 'window') return this.window();
|
||||||
if (this.$store.state.device.chatOpenBehavior === 'popout') return this.popout();
|
if (ColdDeviceStorage.get('chatOpenBehavior') === 'popout') return this.popout();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.behavior) {
|
if (this.behavior) {
|
||||||
@ -111,15 +112,9 @@ export default defineComponent({
|
|||||||
if (this.navHook) {
|
if (this.navHook) {
|
||||||
this.navHook(this.to);
|
this.navHook(this.to);
|
||||||
} else {
|
} else {
|
||||||
if (this.$store.state.device.defaultSideView && this.sideViewHook && this.to !== '/') {
|
if (this.$store.state.defaultSideView && this.sideViewHook && this.to !== '/') {
|
||||||
return this.sideViewHook(this.to);
|
return this.sideViewHook(this.to);
|
||||||
}
|
}
|
||||||
if (this.$store.state.device.deckNavWindow && (ui === 'deck') && this.to !== '/') {
|
|
||||||
return this.window();
|
|
||||||
}
|
|
||||||
if (ui === 'desktop') {
|
|
||||||
return this.window();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.$router.currentRoute.value.path === this.to) {
|
if (this.$router.currentRoute.value.path === this.to) {
|
||||||
window.scroll({ top: 0, behavior: 'smooth' });
|
window.scroll({ top: 0, behavior: 'smooth' });
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="mk-acct" v-once>
|
<span class="mk-acct" v-once>
|
||||||
<span class="name">@{{ user.username }}</span>
|
<span class="name">@{{ user.username }}</span>
|
||||||
<span class="host" v-if="user.host || detail || $store.state.settings.showFullAcct">@{{ user.host || host }}</span>
|
<span class="host" v-if="user.host || detail || $store.state.showFullAcct">@{{ user.host || host }}</span>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="eiwwqkts" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
<span class="eiwwqkts" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
||||||
<img class="inner" :src="url"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
</span>
|
</span>
|
||||||
<MkA class="eiwwqkts" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
<MkA class="eiwwqkts" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
||||||
<img class="inner" :src="url"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
</MkA>
|
</MkA>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -11,7 +11,7 @@
|
|||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
||||||
import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash';
|
import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash';
|
||||||
import { acct, userPage } from '../filters/user';
|
import { acct, userPage } from '@/filters/user';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@ -38,7 +38,7 @@ export default defineComponent({
|
|||||||
return this.user.isCat;
|
return this.user.isCat;
|
||||||
},
|
},
|
||||||
url(): string {
|
url(): string {
|
||||||
return this.$store.state.device.disableShowingAnimatedImages
|
return this.$store.state.disableShowingAnimatedImages
|
||||||
? getStaticImageUrl(this.user.avatarUrl)
|
? getStaticImageUrl(this.user.avatarUrl)
|
||||||
: this.user.avatarUrl;
|
: this.user.avatarUrl;
|
||||||
},
|
},
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<img v-if="customEmoji" class="mk-emoji custom" :class="{ normal, noStyle }" :src="url" :alt="alt" :title="alt"/>
|
<img v-if="customEmoji" class="mk-emoji custom" :class="{ normal, noStyle }" :src="url" :alt="alt" :title="alt" decoding="async"/>
|
||||||
<img v-else-if="char && !useOsNativeEmojis" class="mk-emoji" :src="url" :alt="alt" :title="alt"/>
|
<img v-else-if="char && !useOsNativeEmojis" class="mk-emoji" :src="url" :alt="alt" :title="alt" decoding="async"/>
|
||||||
<span v-else-if="char && useOsNativeEmojis">{{ char }}</span>
|
<span v-else-if="char && useOsNativeEmojis">{{ char }}</span>
|
||||||
<span v-else>{{ emoji }}</span>
|
<span v-else>{{ emoji }}</span>
|
||||||
</template>
|
</template>
|
||||||
@ -8,7 +8,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
||||||
import { twemojiSvgBase } from '../../misc/twemoji-base';
|
import { twemojiSvgBase } from '@/../misc/twemoji-base';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@ -54,13 +54,13 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
useOsNativeEmojis(): boolean {
|
useOsNativeEmojis(): boolean {
|
||||||
return this.$store.state.device.useOsNativeEmojis && !this.isReaction;
|
return this.$store.state.useOsNativeEmojis && !this.isReaction;
|
||||||
},
|
},
|
||||||
|
|
||||||
ce() {
|
ce() {
|
||||||
let ce = [];
|
let ce = [];
|
||||||
if (this.customEmojis) ce = ce.concat(this.customEmojis);
|
if (this.customEmojis) ce = ce.concat(this.customEmojis);
|
||||||
if (this.$store.state.instance.meta && this.$store.state.instance.meta.emojis) ce = ce.concat(this.$store.state.instance.meta.emojis);
|
if (this.$instance && this.$instance.emojis) ce = ce.concat(this.$instance.emojis);
|
||||||
return ce;
|
return ce;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -72,7 +72,7 @@ export default defineComponent({
|
|||||||
const customEmoji = this.ce.find(x => x.name === this.emoji.substr(1, this.emoji.length - 2));
|
const customEmoji = this.ce.find(x => x.name === this.emoji.substr(1, this.emoji.length - 2));
|
||||||
if (customEmoji) {
|
if (customEmoji) {
|
||||||
this.customEmoji = customEmoji;
|
this.customEmoji = customEmoji;
|
||||||
this.url = this.$store.state.device.disableShowingAnimatedImages
|
this.url = this.$store.state.disableShowingAnimatedImages
|
||||||
? getStaticImageUrl(customEmoji.url)
|
? getStaticImageUrl(customEmoji.url)
|
||||||
: customEmoji.url;
|
: customEmoji.url;
|
||||||
}
|
}
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<transition :name="$store.state.device.animation ? 'zoom' : ''" appear>
|
<transition :name="$store.state.animation ? 'zoom' : ''" appear>
|
||||||
<div class="mjndxjcg">
|
<div class="mjndxjcg">
|
||||||
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
|
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
|
||||||
<p><Fa :icon="faExclamationTriangle"/> {{ $t('somethingHappened') }}</p>
|
<p><Fa :icon="faExclamationTriangle"/> {{ $ts.somethingHappened }}</p>
|
||||||
<MkButton @click="() => $emit('retry')" class="button">{{ $t('retry') }}</MkButton>
|
<MkButton @click="() => $emit('retry')" class="button">{{ $ts.retry }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
</template>
|
</template>
|
||||||
@ -11,7 +11,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
|
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
|
||||||
import MkButton from './ui/button.vue';
|
import MkButton from '@/components/ui/button.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
42
src/client/components/global/i18n.ts
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import { h, defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
src: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
tag: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: 'span',
|
||||||
|
},
|
||||||
|
textTag: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
render() {
|
||||||
|
let str = this.src;
|
||||||
|
const parsed = [] as (string | { arg: string; })[];
|
||||||
|
while (true) {
|
||||||
|
const nextBracketOpen = str.indexOf('{');
|
||||||
|
const nextBracketClose = str.indexOf('}');
|
||||||
|
|
||||||
|
if (nextBracketOpen === -1) {
|
||||||
|
parsed.push(str);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if (nextBracketOpen > 0) parsed.push(str.substr(0, nextBracketOpen));
|
||||||
|
parsed.push({
|
||||||
|
arg: str.substring(nextBracketOpen + 1, nextBracketClose)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
str = str.substr(nextBracketClose + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return h(this.tag, parsed.map(x => typeof x === 'string' ? (this.textTag ? h(this.textTag, x) : x) : this.$slots[x.arg]()));
|
||||||
|
}
|
||||||
|
});
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import MfmCore from './mfm';
|
import MfmCore from '@/components/mfm';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -14,6 +14,15 @@ export default defineComponent({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
._mfm_blur_ {
|
||||||
|
filter: blur(6px);
|
||||||
|
transition: filter 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
filter: blur(0px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes mfm-spin {
|
@keyframes mfm-spin {
|
||||||
0% { transform: rotate(0deg); }
|
0% { transform: rotate(0deg); }
|
||||||
100% { transform: rotate(360deg); }
|
100% { transform: rotate(360deg); }
|
@ -44,9 +44,9 @@ export default defineComponent({
|
|||||||
ago >= 3600 ? this.$t('_ago.hoursAgo', { n: (~~(ago / 3600)).toString() }) :
|
ago >= 3600 ? this.$t('_ago.hoursAgo', { n: (~~(ago / 3600)).toString() }) :
|
||||||
ago >= 60 ? this.$t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) :
|
ago >= 60 ? this.$t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) :
|
||||||
ago >= 10 ? this.$t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) :
|
ago >= 10 ? this.$t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) :
|
||||||
ago >= -1 ? this.$t('_ago.justNow') :
|
ago >= -1 ? this.$ts._ago.justNow :
|
||||||
ago < -1 ? this.$t('_ago.future') :
|
ago < -1 ? this.$ts._ago.future :
|
||||||
this.$t('_ago.unknown'));
|
this.$ts._ago.unknown);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-google">
|
<div class="mk-google">
|
||||||
<input type="search" v-model="query" :placeholder="q">
|
<input type="search" v-model="query" :placeholder="q">
|
||||||
<button @click="search"><Fa :icon="faSearch"/> {{ $t('search') }}</button>
|
<button @click="search"><Fa :icon="faSearch"/> {{ $ts.search }}</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
search() {
|
search() {
|
||||||
const engine = this.$store.state.settings.webSearchEngine ||
|
const engine = this.$store.state.webSearchEngine ||
|
||||||
'https://www.google.com/search?q={{query}}';
|
'https://www.google.com/search?q={{query}}';
|
||||||
const url = engine.replace('{{query}}', this.query)
|
const url = engine.replace('{{query}}', this.query)
|
||||||
window.open(url, '_blank');
|
window.open(url, '_blank');
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
import { App } from 'vue';
|
import { App } from 'vue';
|
||||||
|
|
||||||
import mfm from './misskey-flavored-markdown.vue';
|
import mfm from './global/misskey-flavored-markdown.vue';
|
||||||
import a from './ui/a.vue';
|
import a from './global/a.vue';
|
||||||
import acct from './acct.vue';
|
import acct from './global/acct.vue';
|
||||||
import avatar from './avatar.vue';
|
import avatar from './global/avatar.vue';
|
||||||
import emoji from './emoji.vue';
|
import emoji from './global/emoji.vue';
|
||||||
import userName from './user-name.vue';
|
import userName from './global/user-name.vue';
|
||||||
import ellipsis from './ellipsis.vue';
|
import ellipsis from './global/ellipsis.vue';
|
||||||
import time from './time.vue';
|
import time from './global/time.vue';
|
||||||
import url from './url.vue';
|
import url from './global/url.vue';
|
||||||
import loading from './loading.vue';
|
import i18n from './global/i18n';
|
||||||
import error from './error.vue';
|
import loading from './global/loading.vue';
|
||||||
|
import error from './global/error.vue';
|
||||||
|
|
||||||
export default function(app: App) {
|
export default function(app: App) {
|
||||||
app.component('Mfm', mfm);
|
app.component('Mfm', mfm);
|
||||||
@ -24,4 +25,5 @@ export default function(app: App) {
|
|||||||
app.component('MkUrl', url);
|
app.component('MkUrl', url);
|
||||||
app.component('MkLoading', loading);
|
app.component('MkLoading', loading);
|
||||||
app.component('MkError', error);
|
app.component('MkError', error);
|
||||||
|
app.component('I18n', i18n);
|
||||||
}
|
}
|
||||||
|
@ -3,80 +3,80 @@
|
|||||||
<div class="stats" v-if="info">
|
<div class="stats" v-if="info">
|
||||||
<div class="_panel">
|
<div class="_panel">
|
||||||
<div>
|
<div>
|
||||||
<b><Fa :icon="faUser"/>{{ $t('users') }}</b>
|
<b><Fa :icon="faUser"/>{{ $ts.users }}</b>
|
||||||
<small>{{ $t('local') }}</small>
|
<small>{{ $ts.local }}</small>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<dl class="total">
|
<dl class="total">
|
||||||
<dt>{{ $t('total') }}</dt>
|
<dt>{{ $ts.total }}</dt>
|
||||||
<dd>{{ number(info.originalUsersCount) }}</dd>
|
<dd>{{ number(info.originalUsersCount) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: usersLocalDoD > 0 }">
|
<dl class="diff" :class="{ inc: usersLocalDoD > 0 }">
|
||||||
<dt>{{ $t('dayOverDayChanges') }}</dt>
|
<dt>{{ $ts.dayOverDayChanges }}</dt>
|
||||||
<dd>{{ number(usersLocalDoD) }}</dd>
|
<dd>{{ number(usersLocalDoD) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: usersLocalWoW > 0 }">
|
<dl class="diff" :class="{ inc: usersLocalWoW > 0 }">
|
||||||
<dt>{{ $t('weekOverWeekChanges') }}</dt>
|
<dt>{{ $ts.weekOverWeekChanges }}</dt>
|
||||||
<dd>{{ number(usersLocalWoW) }}</dd>
|
<dd>{{ number(usersLocalWoW) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="_panel">
|
<div class="_panel">
|
||||||
<div>
|
<div>
|
||||||
<b><Fa :icon="faUser"/>{{ $t('users') }}</b>
|
<b><Fa :icon="faUser"/>{{ $ts.users }}</b>
|
||||||
<small>{{ $t('remote') }}</small>
|
<small>{{ $ts.remote }}</small>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<dl class="total">
|
<dl class="total">
|
||||||
<dt>{{ $t('total') }}</dt>
|
<dt>{{ $ts.total }}</dt>
|
||||||
<dd>{{ number((info.usersCount - info.originalUsersCount)) }}</dd>
|
<dd>{{ number((info.usersCount - info.originalUsersCount)) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: usersRemoteDoD > 0 }">
|
<dl class="diff" :class="{ inc: usersRemoteDoD > 0 }">
|
||||||
<dt>{{ $t('dayOverDayChanges') }}</dt>
|
<dt>{{ $ts.dayOverDayChanges }}</dt>
|
||||||
<dd>{{ number(usersRemoteDoD) }}</dd>
|
<dd>{{ number(usersRemoteDoD) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: usersRemoteWoW > 0 }">
|
<dl class="diff" :class="{ inc: usersRemoteWoW > 0 }">
|
||||||
<dt>{{ $t('weekOverWeekChanges') }}</dt>
|
<dt>{{ $ts.weekOverWeekChanges }}</dt>
|
||||||
<dd>{{ number(usersRemoteWoW) }}</dd>
|
<dd>{{ number(usersRemoteWoW) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="_panel">
|
<div class="_panel">
|
||||||
<div>
|
<div>
|
||||||
<b><Fa :icon="faPencilAlt"/>{{ $t('notes') }}</b>
|
<b><Fa :icon="faPencilAlt"/>{{ $ts.notes }}</b>
|
||||||
<small>{{ $t('local') }}</small>
|
<small>{{ $ts.local }}</small>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<dl class="total">
|
<dl class="total">
|
||||||
<dt>{{ $t('total') }}</dt>
|
<dt>{{ $ts.total }}</dt>
|
||||||
<dd>{{ number(info.originalNotesCount) }}</dd>
|
<dd>{{ number(info.originalNotesCount) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: notesLocalDoD > 0 }">
|
<dl class="diff" :class="{ inc: notesLocalDoD > 0 }">
|
||||||
<dt>{{ $t('dayOverDayChanges') }}</dt>
|
<dt>{{ $ts.dayOverDayChanges }}</dt>
|
||||||
<dd>{{ number(notesLocalDoD) }}</dd>
|
<dd>{{ number(notesLocalDoD) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: notesLocalWoW > 0 }">
|
<dl class="diff" :class="{ inc: notesLocalWoW > 0 }">
|
||||||
<dt>{{ $t('weekOverWeekChanges') }}</dt>
|
<dt>{{ $ts.weekOverWeekChanges }}</dt>
|
||||||
<dd>{{ number(notesLocalWoW) }}</dd>
|
<dd>{{ number(notesLocalWoW) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="_panel">
|
<div class="_panel">
|
||||||
<div>
|
<div>
|
||||||
<b><Fa :icon="faPencilAlt"/>{{ $t('notes') }}</b>
|
<b><Fa :icon="faPencilAlt"/>{{ $ts.notes }}</b>
|
||||||
<small>{{ $t('remote') }}</small>
|
<small>{{ $ts.remote }}</small>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<dl class="total">
|
<dl class="total">
|
||||||
<dt>{{ $t('total') }}</dt>
|
<dt>{{ $ts.total }}</dt>
|
||||||
<dd>{{ number((info.notesCount - info.originalNotesCount)) }}</dd>
|
<dd>{{ number((info.notesCount - info.originalNotesCount)) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: notesRemoteDoD > 0 }">
|
<dl class="diff" :class="{ inc: notesRemoteDoD > 0 }">
|
||||||
<dt>{{ $t('dayOverDayChanges') }}</dt>
|
<dt>{{ $ts.dayOverDayChanges }}</dt>
|
||||||
<dd>{{ number(notesRemoteDoD) }}</dd>
|
<dd>{{ number(notesRemoteDoD) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="diff" :class="{ inc: notesRemoteWoW > 0 }">
|
<dl class="diff" :class="{ inc: notesRemoteWoW > 0 }">
|
||||||
<dt>{{ $t('weekOverWeekChanges') }}</dt>
|
<dt>{{ $ts.weekOverWeekChanges }}</dt>
|
||||||
<dd>{{ number(notesRemoteWoW) }}</dd>
|
<dd>{{ number(notesRemoteWoW) }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
@ -84,35 +84,35 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section class="_card">
|
<section class="_card">
|
||||||
<div class="_title" style="position: relative;"><Fa :icon="faChartBar"/> {{ $t('statistics') }}<button @click="fetchChart" class="_button" style="position: absolute; right: 0; bottom: 0; top: 0; padding: inherit;"><Fa :icon="faSync"/></button></div>
|
<div class="_title" style="position: relative;"><Fa :icon="faChartBar"/> {{ $ts.statistics }}<button @click="fetchChart" class="_button" style="position: absolute; right: 0; bottom: 0; top: 0; padding: inherit;"><Fa :icon="faSync"/></button></div>
|
||||||
<div class="_content" style="margin-top: -8px;">
|
<div class="_content" style="margin-top: -8px;">
|
||||||
<div class="selects" style="display: flex;">
|
<div class="selects" style="display: flex;">
|
||||||
<MkSelect v-model:value="chartSrc" style="margin: 0; flex: 1;">
|
<MkSelect v-model:value="chartSrc" style="margin: 0; flex: 1;">
|
||||||
<optgroup :label="$t('federation')">
|
<optgroup :label="$ts.federation">
|
||||||
<option value="federation-instances">{{ $t('_charts.federationInstancesIncDec') }}</option>
|
<option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
|
||||||
<option value="federation-instances-total">{{ $t('_charts.federationInstancesTotal') }}</option>
|
<option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
<optgroup :label="$t('users')">
|
<optgroup :label="$ts.users">
|
||||||
<option value="users">{{ $t('_charts.usersIncDec') }}</option>
|
<option value="users">{{ $ts._charts.usersIncDec }}</option>
|
||||||
<option value="users-total">{{ $t('_charts.usersTotal') }}</option>
|
<option value="users-total">{{ $ts._charts.usersTotal }}</option>
|
||||||
<option value="active-users">{{ $t('_charts.activeUsers') }}</option>
|
<option value="active-users">{{ $ts._charts.activeUsers }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
<optgroup :label="$t('notes')">
|
<optgroup :label="$ts.notes">
|
||||||
<option value="notes">{{ $t('_charts.notesIncDec') }}</option>
|
<option value="notes">{{ $ts._charts.notesIncDec }}</option>
|
||||||
<option value="local-notes">{{ $t('_charts.localNotesIncDec') }}</option>
|
<option value="local-notes">{{ $ts._charts.localNotesIncDec }}</option>
|
||||||
<option value="remote-notes">{{ $t('_charts.remoteNotesIncDec') }}</option>
|
<option value="remote-notes">{{ $ts._charts.remoteNotesIncDec }}</option>
|
||||||
<option value="notes-total">{{ $t('_charts.notesTotal') }}</option>
|
<option value="notes-total">{{ $ts._charts.notesTotal }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
<optgroup :label="$t('drive')">
|
<optgroup :label="$ts.drive">
|
||||||
<option value="drive-files">{{ $t('_charts.filesIncDec') }}</option>
|
<option value="drive-files">{{ $ts._charts.filesIncDec }}</option>
|
||||||
<option value="drive-files-total">{{ $t('_charts.filesTotal') }}</option>
|
<option value="drive-files-total">{{ $ts._charts.filesTotal }}</option>
|
||||||
<option value="drive">{{ $t('_charts.storageUsageIncDec') }}</option>
|
<option value="drive">{{ $ts._charts.storageUsageIncDec }}</option>
|
||||||
<option value="drive-total">{{ $t('_charts.storageUsageTotal') }}</option>
|
<option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
<MkSelect v-model:value="chartSpan" style="margin: 0;">
|
<MkSelect v-model:value="chartSpan" style="margin: 0;">
|
||||||
<option value="hour">{{ $t('perHour') }}</option>
|
<option value="hour">{{ $ts.perHour }}</option>
|
||||||
<option value="day">{{ $t('perDay') }}</option>
|
<option value="day">{{ $ts.perDay }}</option>
|
||||||
</MkSelect>
|
</MkSelect>
|
||||||
</div>
|
</div>
|
||||||
<canvas ref="chart"></canvas>
|
<canvas ref="chart"></canvas>
|
||||||
@ -278,7 +278,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: var(--panel)の色が暗いか明るいかで判定する
|
// TODO: var(--panel)の色が暗いか明るいかで判定する
|
||||||
const gridColor = this.$store.state.device.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
|
const gridColor = this.$store.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
|
||||||
|
|
||||||
Chart.defaults.global.defaultFontColor = getComputedStyle(document.documentElement).getPropertyValue('--fg');
|
Chart.defaults.global.defaultFontColor = getComputedStyle(document.documentElement).getPropertyValue('--fg');
|
||||||
this.chartInstance = markRaw(new Chart(this.$refs.chart, {
|
this.chartInstance = markRaw(new Chart(this.$refs.chart, {
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<div class="sub">
|
<div class="sub">
|
||||||
<MkA to="/docs" @click.passive="close()">
|
<MkA to="/docs" @click.passive="close()">
|
||||||
<Fa :icon="faQuestionCircle" class="icon"/>
|
<Fa :icon="faQuestionCircle" class="icon"/>
|
||||||
<div class="text">{{ $t('help') }}</div>
|
<div class="text">{{ $ts.help }}</div>
|
||||||
</MkA>
|
</MkA>
|
||||||
<MkA to="/about" @click.passive="close()">
|
<MkA to="/about" @click.passive="close()">
|
||||||
<Fa :icon="faInfoCircle" class="icon"/>
|
<Fa :icon="faInfoCircle" class="icon"/>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
</MkA>
|
</MkA>
|
||||||
<MkA to="/about-misskey" @click.passive="close()">
|
<MkA to="/about-misskey" @click.passive="close()">
|
||||||
<Fa :icon="faInfoCircle" class="icon"/>
|
<Fa :icon="faInfoCircle" class="icon"/>
|
||||||
<div class="text">{{ $t('aboutMisskey') }}</div>
|
<div class="text">{{ $ts.aboutMisskey }}</div>
|
||||||
</MkA>
|
</MkA>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -58,14 +58,14 @@ export default defineComponent({
|
|||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
menu(): string[] {
|
menu(): string[] {
|
||||||
return this.$store.state.deviceUser.menu;
|
return this.$store.state.menu;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.items = Object.keys(this.menuDef).filter(k => !this.menu.includes(k)).map(k => this.menuDef[k]).filter(def => def.show == null ? true : def.show).map(def => ({
|
this.items = Object.keys(this.menuDef).filter(k => !this.menu.includes(k)).map(k => this.menuDef[k]).filter(def => def.show == null ? true : def.show).map(def => ({
|
||||||
type: def.to ? 'link' : 'button',
|
type: def.to ? 'link' : 'button',
|
||||||
text: this.$t(def.title),
|
text: this.$ts[def.title],
|
||||||
icon: def.icon,
|
icon: def.icon,
|
||||||
to: def.to,
|
to: def.to,
|
||||||
action: def.action,
|
action: def.action,
|
||||||
|